cloudflare / cloudflare/workerd
WebSocket Serialization Error in Durable Objects RPC
- Dominant language
- C++
- Stars
- 8.7k
- Forks
- 739
- Avg merge
- 2d 20h
- Merged PRs (30d)
- 174
Description
When attempting to use `DurableObjects RPC` with a WebSocket, an error is encountered during serialization. The error message indicates that objects of type `WebSocket` cannot be serialized. This issue is blocking the use of WebSockets in Durable Objects, which is critical for real-time applications.
### Error Message
```
DOMException {
code: 25,
name: 'DataCloneError',
message: 'Could not serialize object of type "WebSocket". This type does not support serialization.',
stack: 'DataCloneError: Could not serialize object of type "WebSocket". This type does not support serialization.\n' +
' at null. (async file:///home/user/project/.wrangler/tmp/dev-xyz/index.js:5827:15)\n' +
' at async dispatch (file:///home/user/project/node_modules/hono/dist/compose.js:29:17)\n' +
' at async dispatch (file:///home/user/project/node_modules/hono/dist/compose.js:29:17)\n' +
' at null. (async file:///home/user/project/.wrangler/tmp/dev-xyz/index.js:1099:25)\n' +
' at async jsonError (file:///home/user/project/node_modules/wrangler/templates/middleware/middleware-miniflare3-json-error.ts:22:10)\n' +
' at async drainBody (file:///home/user/project/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts:5:10)'
}
```
### Reproduction Steps
1. Set up a Cloudflare Worker with `DurableObjects`.
2. Implement a Durable Object that utilizes WebSocket.
3. Attempt to serialize and return the WebSocket as part of a response.
### Sample Code
Here is a simplified version of the code that reproduces the issue:
```ts
export class ShareEventService extends DurableObject {
async create() {
const pair = new WebSocketPair();
const client = pair[0];
const server = pair[1];
this.ctx.acceptWebSocket(server);
return new Response(null, { webSocket: client, status: 101 });
}
}
```
### Expected Behavior
WebSocket objects should be serializable, or there should be a documented alternative method for handling WebSockets within Durable Objects RPC.
### Actual Behavior
Serialization fails with a `DataCloneError`, making it impossible to use WebSockets within Durable Objects RPC.
### Additional Information
- wrangler version: `3.61.0`
- Durable Objects used for real-time applications
### Relevant Code Reference
The issue seems to be related to the following code in `workerd`:
https://github.com/cloudflare/workerd/blob/bd09e5b12988b76277835b6f75100833f7f88158/src/workerd/jsg/ser.c%2B%2B#L54-L63
### Suggested Fix
Please provide support for WebSocket serialization or offer a workaround for handling WebSockets in Durable Objects.
Thank you for your attention to this issue.
Contributor guide
Assessment
This issue has not been assessed yet.