Skip to content

Commit ea1460d

Browse files
authored
Merge pull request cmliu#1455 from cmliu/alpha2.1
Alpha2.1
2 parents 702ff26 + 7022865 commit ea1460d

2 files changed

Lines changed: 112 additions & 3 deletions

File tree

CHANGELOG

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## [2.1.20260811144522] - 2026-08-11 14:45:22
2+
3+
### Change
4+
5+
- 优化 **XHTTP** 上行传输:新增数据合包机制,小块数据合并后再统一发送,减少小包频繁写入,降低资源开销,大文件上传更流畅。
6+
17
## [2.1.20260810030901] - 2026-08-10 03:09:01
28

39
### ADD

_worker.js

Lines changed: 106 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const Version = '2026-08-10 03:09:01';
1+
const Version = '2026-08-11 14:45:22';
22
let config_JSON, 缓存SOCKS5白名单 = null, 调试日志打印 = false;
33
let SOCKS5白名单 = ['*tapecontent.net', '*cloudatacdn.com', '*loadshare.org', '*cdn-centaurus.com', 'scholar.google.com'];
44
const Pages静态页面 = 'https://edt-pages.github.io';
@@ -641,7 +641,7 @@ async function 处理叉HTTP请求(request, yourUUID, 反代上下文 = {}) {
641641
if (已清理) return;
642642
已清理 = true;
643643
try { abortController.abort(reason) } catch (e) { }
644-
失效TCP连接世代(remoteConnWrapper); // 关闭 socket + 世代 +1
644+
失效TCP连接世代(remoteConnWrapper);
645645
};
646646

647647
const 占位WS = { readyState: WebSocket.OPEN };
@@ -660,7 +660,29 @@ async function 处理叉HTTP请求(request, yourUUID, 反代上下文 = {}) {
660660
}
661661

662662
const 上行Promise = (async () => {
663-
await request.body.pipeTo(socket.writable, { signal: abortController.signal });
663+
const 上行合包器 = 创建上行Grain合包流();
664+
const 搬运Promise = 上行合包器.readable.pipeTo(socket.writable, { signal: abortController.signal });
665+
void 搬运Promise.catch(清理);
666+
const 上行reader = request.body.getReader();
667+
const 取消上行reader = () => {
668+
try { 上行reader.cancel(abortController.signal.reason).catch(() => { }); } catch (e) { }
669+
};
670+
abortController.signal.addEventListener('abort', 取消上行reader, { once: true });
671+
try {
672+
try {
673+
while (true) {
674+
const { done, value } = await 上行reader.read();
675+
if (done) break;
676+
if (value?.byteLength) await 上行合包器.写入(value);
677+
}
678+
} finally {
679+
abortController.signal.removeEventListener('abort', 取消上行reader);
680+
try { 上行reader.releaseLock() } catch (e) { }
681+
}
682+
} finally {
683+
try { await 上行合包器.结束() } catch (e) { }
684+
}
685+
await 搬运Promise;
664686
})();
665687

666688
const 响应流 = typeof IdentityTransformStream !== 'undefined'
@@ -2576,6 +2598,87 @@ function 创建Grain收纳器(容量, 复制合包结果 = false) {
25762598
};
25772599
}
25782600

2601+
function 创建上行Grain合包流(目标字节 = 上行合包目标字节) {
2602+
const identity = typeof IdentityTransformStream !== 'undefined'
2603+
? new IdentityTransformStream()
2604+
: new TransformStream();
2605+
const writer = identity.writable.getWriter();
2606+
const 缓冲 = new Uint8Array(目标字节);
2607+
let 缓冲长度 = 0;
2608+
let 定时器 = null;
2609+
let 在途写 = null;
2610+
let 冲刷链 = Promise.resolve();
2611+
2612+
const 清理定时器 = () => {
2613+
if (定时器) {
2614+
clearTimeout(定时器);
2615+
定时器 = null;
2616+
}
2617+
};
2618+
2619+
const 串行写 = async (chunk) => {
2620+
if (在途写) await 在途写;
2621+
在途写 = writer.write(chunk);
2622+
try { await 在途写 } finally { 在途写 = null; }
2623+
};
2624+
2625+
const 冲刷 = async () => {
2626+
if (缓冲长度) {
2627+
const chunk = 缓冲.slice(0, 缓冲长度);
2628+
缓冲长度 = 0;
2629+
await 串行写(chunk);
2630+
}
2631+
};
2632+
2633+
const 排队冲刷 = () => {
2634+
冲刷链 = 冲刷链.then(() => 冲刷()).catch(() => { });
2635+
};
2636+
2637+
const 启动定时器 = () => {
2638+
if (定时器) return;
2639+
定时器 = setTimeout(() => {
2640+
定时器 = null;
2641+
排队冲刷();
2642+
}, 1);
2643+
};
2644+
2645+
return {
2646+
readable: identity.readable,
2647+
写入: async (chunk) => {
2648+
const data = 数据转Uint8Array(chunk);
2649+
if (!data.byteLength) return;
2650+
if (data.byteLength >= 目标字节) {
2651+
清理定时器();
2652+
if (缓冲长度) await 冲刷();
2653+
await 串行写(data);
2654+
return;
2655+
}
2656+
if (缓冲长度 + data.byteLength >= 目标字节) {
2657+
const output = new Uint8Array(缓冲长度 + data.byteLength);
2658+
output.set(缓冲.subarray(0, 缓冲长度), 0);
2659+
output.set(data, 缓冲长度);
2660+
缓冲长度 = 0;
2661+
清理定时器();
2662+
await 串行写(output);
2663+
} else {
2664+
缓冲.set(data, 缓冲长度);
2665+
缓冲长度 += data.byteLength;
2666+
启动定时器();
2667+
}
2668+
},
2669+
结束: async () => {
2670+
清理定时器();
2671+
try {
2672+
await 冲刷链;
2673+
await 冲刷();
2674+
await writer.close();
2675+
} finally {
2676+
try { writer.releaseLock() } catch (e) { }
2677+
}
2678+
}
2679+
};
2680+
}
2681+
25792682
function 创建上行写入队列({ 获取写入器, 获取连接任务 = null, 释放写入器, 重试连接, 关闭连接, 名称 = '上行队列' }) {
25802683
const grain = 创建Grain收纳器(上行合包目标字节);
25812684
let draining = false;

0 commit comments

Comments
 (0)