Skip to content

Improve stream pointer responsiveness under load.#354

Merged
Jayian1890 merged 4 commits intodevfrom
improve-stream-pointer-responsiveness
Apr 25, 2026
Merged

Improve stream pointer responsiveness under load.#354
Jayian1890 merged 4 commits intodevfrom
improve-stream-pointer-responsiveness

Conversation

@Jayian1890
Copy link
Copy Markdown
Collaborator

@Jayian1890 Jayian1890 commented Apr 24, 2026

Reduce mouse input hot-path overhead with residual delta accumulation, adaptive flush scheduling, cached scale conversion, and tuned raw-input filtering while adding diagnostics and targeted tests.


Note

Medium Risk
Touches the mouse input hot-path and DataChannel send semantics, which could impact pointer feel or input reliability under different browsers/servers. Changes are localized but timing-sensitive (adaptive scheduling, quantization, scaling), so regressions may be subtle without broad device testing.

Overview
Improves stream mouse responsiveness under load by switching mouse movement accumulation to float + residual quantization, preventing small deltas from being lost after scaling/rounding and reducing per-event work.

Adds adaptive mouse flush scheduling (replacing the fixed setInterval with a self-adjusting setTimeout loop) that tightens or relaxes the flush cadence based on reliable-channel backpressure and scheduling delay, plus cached pointer scaling to avoid repeated DOM/resolution recomputation.

Extends stream diagnostics/UI overlay to surface mouse flush interval, packet rate, residual magnitude, and whether adaptive mode is active, and adds targeted unit tests for the new quantization/adaptive-interval logic; updates package.json test script to run the new test file.

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

Reduce mouse input hot-path overhead with residual delta accumulation, adaptive flush scheduling, cached scale conversion, and tuned raw-input filtering while adding diagnostics and targeted tests.

Made-with: Cursor
Comment thread opennow-stable/src/renderer/src/gfn/webrtcClient.ts
Copy link
Copy Markdown
Contributor

@capy-ai capy-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added 1 comment

this.mousePacketsSentInWindow = 0;
this.mousePacketRateWindowStartedAtMs = now;
}
scheduleNextFlush();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[🟡 Medium] [🔵 Bug]

The scheduleNextFlush callback unconditionally calls itself at line 2665 without checking whether the client has been torn down. If clearTimers() executes after the timer fires but before the callback runs (a valid event-loop interleaving — e.g. a WebSocket close handler triggers cleanupPeerConnection in the same tick that the flush timer fires), clearTimeout has no effect on an already-fired timer, and this.mouseFlushTimer is set to null. The callback then calls scheduleNextFlush(), which sets a new timer, creating a zombie loop that re-fires every 2–20 ms indefinitely. Each iteration calls flushMouse() (which early-returns because inputReady is false), but the loop never terminates, wasting CPU and preventing GC of the client instance.

The old setInterval approach didn't have this issue because clearInterval prevents future ticks. Adding a guard inside the callback stops the zombie:

// opennow-stable/src/renderer/src/gfn/webrtcClient.ts
this.mouseFlushTimer = window.setTimeout(() => {
  flushMouse();
  // clearTimers() nulls mouseFlushTimer — stop if cleanup happened
  if (this.mouseFlushTimer === null) return;
  // ... adaptive calc ...
  scheduleNextFlush();
}, this.mouseFlushIntervalMs);

…deltas until a non-zero packet is sent. This change prevents loss of quantized integer deltas during server scaling, improving responsiveness and accuracy of mouse movements.
…ng of the mouse flush timer during teardown. This change ensures that the timer does not continue to operate after it has been cleared, improving resource management and stability.
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 9ac7553. Configure here.

Comment thread opennow-stable/src/renderer/src/gfn/webrtcClient.ts
@Kief5555 Kief5555 self-requested a review April 25, 2026 06:14
…icator functionality. This includes the removal of related state management, CSS styles, and UI elements, streamlining the codebase and improving maintainability.
@cursor
Copy link
Copy Markdown

cursor Bot commented Apr 25, 2026

You have used all of your free Bugbot PR reviews.

To receive reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@Jayian1890 Jayian1890 merged commit 5c7b15d into dev Apr 25, 2026
9 checks passed
Kief5555 added a commit that referenced this pull request Apr 25, 2026
* Fix Epic ownership guard and owned store glow (#334)

* Add Windows ARM64 release builds to pipeline (#340)

* Restore Windows ARM64 build artifacts in release pipeline

* fix(ci): match linux x64 artifact upload names

* Add 'Hide Server Selector' setting to skip free-tier queue modal

* Add Discord activity clearing functionality to rich presence (#349)

* Remove Game Hub media handling and refactor ControllerLibraryPage (#350)

* Remove Game Hub media handling from ControllerLibraryPage

* Refactor initial category index logic in ControllerLibraryPage for clarity

* Replace useEffect with useLayoutEffect for improved layout handling in ControllerLibraryPage

* Merge branch 'dev' into Jayian1890/controller-mode-patch-042226

* Add flake.nix again (#343)

* Fix Nix npm packaging

* Update

* Add nix instruction in README.md

* Delete symbolic Link

* change requested changes and add desktop items

* Update README.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update flake.nix

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update README.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Zortos <zortosdev@proton.me>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Kiefer <67562560+Kief5555@users.noreply.github.com>
Co-authored-by: Kiefer <kieferlin1001@gmail.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: DINEXXL <dinexxl@noreply.codeberg.org>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Switch macOS jobs to Blacksmith runners (#352)

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* feat: implement DiscordStatusMonitor to periodically sync RPC activity with active cloud gaming sessions

* feat: add initial sync handling in DiscordStatusMonitor to clear stale status on startup

* Fix Settings search to show relevant sections only (scope-aware filtering + sidebar UX polish) (#353)

* settings

* Update opennow-stable/src/renderer/src/components/SettingsPage.tsx

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* do capy's suggestion

Co-authored-by: Copilot <copilot@github.com>

* Auto-recover active sessions after signaling disconnects (#321)

* Implement bounded auto-recovery for active sessions after signaling disconnects

* Enhance signaling recovery mechanism by introducing generation tracking. Added generation state to manage recovery attempts and prevent stale session applications. Updated relevant functions to utilize generation checks for improved session handling.

* Refactor claimed session handling to improve recovery logic. Introduced a helper function to determine if a claimed reconnect can proceed based on recovery generation and explicit shutdown status, enhancing session management and logging clarity.

* Enhance signaling recovery logic by adding checks for explicit shutdown and non-recoverable stream statuses. This prevents unnecessary error handling and improves logging clarity during disconnect scenarios.

* Remove explicit shutdown check from signaling connection logic to streamline recovery process. This change simplifies the connection flow during recovery attempts.

---------

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: Jared <jared@interlacedpixel.com>

* Add multi-account auth support with quick account switcher UI (#355)

* chore(release): prepare v0.3.3

* chore(release): prepare v0.3.4

* chore(release): prepare v1.3.5

* chore(release): prepare v0.3.5

* Update README.md to include TestFlight badge and iOS packaging target

* update AGENTS.md

* chore(release): prepare v0.3.6

* Add multi-account auth support with quick account switcher UI

* Add confirmation modal for account removal

* Fix account switch session validation during refresh (#4)

* Fix account switch session validation during refresh

* Fail switch-account refresh when user identity cannot be verified

* Update opennow-stable/src/main/gfn/auth.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: PriyanshAg-1 <204138848+PriyanshAg-1@users.noreply.github.com>
Co-authored-by: priyanshrv1-oss <priyanshrv1@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix async session state in handleSwitchAccount - pass fresh session to refreshNavbarActiveSession to avoid stale auth token

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* Fix all remaining Copilot review issues: auth session null returns, error recovery state sync, ARIA semantics, SavedAccount type usage

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix: use menu ARIA roles in account dropdown and return getSession() after logout

Agent-Logs-Url: https://github.com/priyanshrv1-oss/OpenNOW1/sessions/bc9cb33e-8e97-4cf8-8986-2a9a584abddc

Co-authored-by: PriyanshAg-1 <204138848+PriyanshAg-1@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix: add role=none to structural wrappers in menu and fix embedded line numbers in TS files

Agent-Logs-Url: https://github.com/priyanshrv1-oss/OpenNOW1/sessions/f707cd73-f431-41cf-96a8-c5e0c34ab939

Co-authored-by: PriyanshAg-1 <204138848+PriyanshAg-1@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Change logoutAll to logout in auth service

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Update opennow-stable/src/main/gfn/auth.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fixed errors and improved session auth flows

* fix: improve session handling and error recovery in AuthService and App components; update Navbar accessibility roles

* Update opennow-stable/src/main/gfn/auth.ts

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* Resolve styling issues

* Resolve startup issues

---------

Co-authored-by: Zortos <zortosdev@proton.me>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: PriyanshAg-1 <204138848+PriyanshAg-1@users.noreply.github.com>
Co-authored-by: priyanshrv1-oss <priyanshrv1@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Priyansh Agarwal <2k22.cse.32203@gmail.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>

* Improve stream pointer responsiveness under load. (#354)

* Improve stream pointer responsiveness under load.

Reduce mouse input hot-path overhead with residual delta accumulation, adaptive flush scheduling, cached scale conversion, and tuned raw-input filtering while adding diagnostics and targeted tests.

Made-with: Cursor

* Refactor mouse input handling in GfnWebRtcClient to maintain pending deltas until a non-zero packet is sent. This change prevents loss of quantized integer deltas during server scaling, improving responsiveness and accuracy of mouse movements.

* Enhance mouse input handling in GfnWebRtcClient by preventing re-arming of the mouse flush timer during teardown. This change ensures that the timer does not continue to operate after it has been cleared, improving resource management and stability.

* Refactor App and StreamView components to remove Esc hold release indicator functionality. This includes the removal of related state management, CSS styles, and UI elements, streamlining the codebase and improving maintainability.

* Refactor setActivity function in discordRpc.ts to update lastActivity only after successful RPC call, improving state management.

* Update flake.nix to reference the correct path for opennow-logo.png and enhance Discord RPC state management by introducing pendingActivity for improved activity handling.

* Enhance Discord RPC state management by consuming pendingActivity after processing, preventing reprocessing of failed attempts. Simplify activity title and start time assignment in DiscordStatusMonitor for improved clarity.

* Reset pendingActivity to null on setActivity failure in discordRpc.ts to ensure proper state management during error handling.

---------

Co-authored-by: Zortos <zortosdev@proton.me>
Co-authored-by: Jared Terrance <jared@interlacedpixel.com>
Co-authored-by: DINEXXL <105819287+DINEXXL@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: DINEXXL <dinexxl@noreply.codeberg.org>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: zaloguj12 <patrik.ostafin@gmail.com>
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: PriyanshAg-1 <204138848+PriyanshAg-1@users.noreply.github.com>
Co-authored-by: priyanshrv1-oss <priyanshrv1@gmail.com>
Co-authored-by: Priyansh Agarwal <2k22.cse.32203@gmail.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
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