MCPcopy Create free account
hub / github.com/Ridter/cf_workers_proxy / remoteSocketToWS

Function remoteSocketToWS

js/worker.js:400–461  ·  view source on GitHub ↗

* * @param {import("@cloudflare/workers-types").Socket} remoteSocket * @param {import("@cloudflare/workers-types").WebSocket} webSocket * @param {ArrayBuffer} vlessResponseHeader * @param {(() => Promise ) | null} retry * @param {*} log

(remoteSocket, webSocket, vlessResponseHeader, retry, log)

Source from the content-addressed store, hash-verified

398 * @param {*} log
399 */
400async function remoteSocketToWS(remoteSocket, webSocket, vlessResponseHeader, retry, log) {
401 // remote--> ws
402 let remoteChunkCount = 0;
403 let chunks = [];
404 /** @type {ArrayBuffer | null} */
405 let vlessHeader = vlessResponseHeader;
406 let hasIncomingData = false; // check if remoteSocket has incoming data
407 await remoteSocket.readable
408 .pipeTo(
409 new WritableStream({
410 start() {
411 },
412 /**
413 *
414 * @param {Uint8Array} chunk
415 * @param {*} controller
416 */
417 async write(chunk, controller) {
418 hasIncomingData = true;
419 // remoteChunkCount++;
420 if (webSocket.readyState !== WS_READY_STATE_OPEN) {
421 controller.error(
422 'webSocket.readyState is not open, maybe close'
423 );
424 }
425 if (vlessHeader) {
426 webSocket.send(await new Blob([vlessHeader, chunk]).arrayBuffer());
427 vlessHeader = null;
428 } else {
429 // seems no need rate limit this, CF seems fix this??..
430 // if (remoteChunkCount > 20000) {
431 // // cf one package is 4096 byte(4kb), 4096 * 20000 = 80M
432 // await delay(1);
433 // }
434 webSocket.send(chunk);
435 }
436 },
437 close() {
438 log(`remoteConnection!.readable is close with hasIncomingData is ${hasIncomingData}`);
439 // safeCloseWebSocket(webSocket); // no need server close websocket frist for some case will casue HTTP ERR_CONTENT_LENGTH_MISMATCH issue, client will send close event anyway.
440 },
441 abort(reason) {
442 console.error(`remoteConnection!.readable abort`, reason);
443 },
444 })
445 )
446 .catch((error) => {
447 console.error(
448 `remoteSocketToWS has exception `,
449 error.stack || error
450 );
451 safeCloseWebSocket(webSocket);
452 });
453
454 // seems is cf connect socket have error,
455 // 1. Socket.closed will have error
456 // 2. Socket.readable will be close without any data coming
457 if (hasIncomingData === false && retry) {

Callers 2

retryFunction · 0.85
handleTCPOutBoundFunction · 0.85

Calls 3

safeCloseWebSocketFunction · 0.85
logFunction · 0.85
retryFunction · 0.85

Tested by

no test coverage detected