Skip to content

perf(hot): avoid idle work on the SSE stream - #2376

Open
bjohansebas wants to merge 1 commit into
hot-e2e-testsfrom
hot-perf
Open

perf(hot): avoid idle work on the SSE stream#2376
bjohansebas wants to merge 1 commit into
hot-e2e-testsfrom
hot-perf

Conversation

@bjohansebas

@bjohansebas bjohansebas commented Jul 29, 2026

Copy link
Copy Markdown
Member
  • skip payload serialization in publish() when no client is connected, and cut the ProgressPlugin callback early via eventStream.hasClients()
  • start the heartbeat interval with the first client and stop it with the last one, instead of ticking forever
  • pair bundles against the previous build through a name-grouped Map, replacing the per-bundle filter (O(n²) → O(n))

Summary

What kind of change does this PR introduce?

Did you add tests for your changes?

Does this PR introduce a breaking change?

If relevant, what needs to be documented once your changes are merged or what have you already documented?

Use of AI


Note

Low Risk
Performance-only changes in dev-middleware HMR; no auth or production build paths, with behavior unchanged when clients are connected.

Overview
Reduces CPU and timer work when no browser is connected to the HMR SSE endpoint, while keeping behavior the same once clients are attached.

The event stream starts the heartbeat on the first client and stops it on the last disconnect (instead of running setInterval continuously), exposes hasClients(), and publish() returns early without JSON.stringify when clients.size === 0. With progress enabled, the ProgressPlugin callback bails out when there are no clients before publishing percent updates.

publishBundles now indexes previous bundles by name once and pairs by occurrence from that map, replacing a per-bundle filter over the full previous list (O(n²) → O(n) for many child compilers).

Reviewed by Cursor Bugbot for commit 8d375f2. Bugbot is set up for automated code reviews on this repo. Configure here.

- skip payload serialization in publish() when no client is connected,
  and cut the ProgressPlugin callback early via eventStream.hasClients()
- start the heartbeat interval with the first client and stop it with
  the last one, instead of ticking forever
- pair bundles against the previous build through a name-grouped Map,
  replacing the per-bundle filter (O(n²) → O(n))

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Jul 29, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 8d375f2

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant