Skip to content

Fix unhandled websocket error - #738

Merged
rkistner merged 2 commits into
mainfrom
fix-ws-crash
Jul 29, 2026
Merged

Fix unhandled websocket error#738
rkistner merged 2 commits into
mainfrom
fix-ws-crash

Conversation

@rkistner

@rkistner rkistner commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

We previously fixed some unhandled websocket errors in #11. This covers an additional case: If an invalid frame is sent before the first data, we crash with an error like below:

node:events:496
      throw er; // Unhandled 'error' event
      ^

RangeError: Invalid WebSocket frame: RSV2 and RSV3 must be clear
    at Receiver.getInfo (/home/ralf/src/powersync-service/node_modules/.pnpm/ws@8.18.0/node_modules/ws/lib/receiver.js:194:26)
    at Receiver.startLoop (/home/ralf/src/powersync-service/node_modules/.pnpm/ws@8.18.0/node_modules/ws/lib/receiver.js:155:16)
    at Receiver._write (/home/ralf/src/powersync-service/node_modules/.pnpm/ws@8.18.0/node_modules/ws/lib/receiver.js:94:10)
    at writeOrBuffer (node:internal/streams/writable:572:12)
    at _write (node:internal/streams/writable:501:10)
    at Writable.write (node:internal/streams/writable:510:10)
    at Socket.socketOnData (/home/ralf/src/powersync-service/node_modules/.pnpm/ws@8.18.0/node_modules/ws/lib/websocket.js:1355:35)
    at Socket.emit (node:events:518:28)
    at addChunk (node:internal/streams/readable:561:12)
    at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)
Emitted 'error' event on Duplex instance at:
    at Duplex.duplexOnError (/home/ralf/src/powersync-service/node_modules/.pnpm/ws@8.18.0/node_modules/ws/lib/stream.js:37:10)
    at Duplex.emit (node:events:518:28)
    at emitErrorNT (node:internal/streams/destroy:170:8)
    at emitErrorCloseNT (node:internal/streams/destroy:129:3)
    at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
  code: 'WS_ERR_UNEXPECTED_RSV_2_3',
  [Symbol(status-code)]: 1002
}

This adds a temporary error handler right when the websocket is first opened, then deregisters it once the WebsocketDuplexConnection takes over.

Originally reported on Discord.

AI Usage

Used Codex gpt-5.6 to reproduce and fix the issue.

Manually reviewed and tested, in addition to the new automated test that confirms the issue.

@changeset-bot

changeset-bot Bot commented Jul 29, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: b857f0c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 13 packages
Name Type
@powersync/service-rsocket-router Patch
@powersync/service-core Patch
@powersync/service-module-core Patch
@powersync/service-image Patch
@powersync/service-module-convex Patch
@powersync/service-module-mongodb-storage Patch
@powersync/service-module-mongodb Patch
@powersync/service-module-mssql Patch
@powersync/service-module-mysql Patch
@powersync/service-module-postgres-storage Patch
@powersync/service-module-postgres Patch
test-client Patch
@powersync/service-schema Patch

Not sure what this means? Click here to learn what changesets are.

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

@rkistner
rkistner requested a review from stevensJourney July 29, 2026 10:20
@rkistner
rkistner merged commit df5663b into main Jul 29, 2026
46 checks passed
@rkistner
rkistner deleted the fix-ws-crash branch July 29, 2026 11:38
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.

2 participants