* Creates a readable stream from a WebSocket server, allowing for data to be read from the WebSocket. * @param {import("@cloudflare/workers-types").WebSocket} webSocketServer The WebSocket server to create the readable stream from. * @param {string} earlyDataHeader The header containing early da
(webSocketServer, earlyDataHeader, log)
| 395 | * @returns {ReadableStream} A readable stream that can be used to read data from the WebSocket. |
| 396 | */ |
| 397 | function makeReadableWebSocketStream(webSocketServer, earlyDataHeader, log) { |
| 398 | let readableStreamCancel = false; |
| 399 | const stream = new ReadableStream({ |
| 400 | start(controller) { |
| 401 | webSocketServer.addEventListener('message', (event) => { |
| 402 | const message = event.data; |
| 403 | controller.enqueue(message); |
| 404 | }); |
| 405 | |
| 406 | webSocketServer.addEventListener('close', () => { |
| 407 | safeCloseWebSocket(webSocketServer); |
| 408 | controller.close(); |
| 409 | }); |
| 410 | |
| 411 | webSocketServer.addEventListener('error', (err) => { |
| 412 | log('webSocketServer has error'); |
| 413 | controller.error(err); |
| 414 | }); |
| 415 | const { earlyData, error } = base64ToArrayBuffer(earlyDataHeader); |
| 416 | if (error) { |
| 417 | controller.error(error); |
| 418 | } else if (earlyData) { |
| 419 | controller.enqueue(earlyData); |
| 420 | } |
| 421 | }, |
| 422 | |
| 423 | pull(controller) { |
| 424 | // if ws can stop read if stream is full, we can implement backpressure |
| 425 | // https://streams.spec.whatwg.org/#example-rs-push-backpressure |
| 426 | }, |
| 427 | |
| 428 | cancel(reason) { |
| 429 | log(`ReadableStream was canceled, due to ${reason}`) |
| 430 | readableStreamCancel = true; |
| 431 | safeCloseWebSocket(webSocketServer); |
| 432 | } |
| 433 | }); |
| 434 | |
| 435 | return stream; |
| 436 | } |
| 437 | |
| 438 | // https://xtls.github.io/development/protocols/vless.html |
| 439 | // https://github.com/zizifn/excalidraw-backup/blob/main/v2ray-protocol.excalidraw |
no outgoing calls
no test coverage detected