1- const Version = '2026-08-10 03:09:01 ' ;
1+ const Version = '2026-08-11 14:45:22 ' ;
22let config_JSON , 缓存SOCKS5白名单 = null , 调试日志打印 = false ;
33let SOCKS5白名单 = [ '*tapecontent.net' , '*cloudatacdn.com' , '*loadshare.org' , '*cdn-centaurus.com' , 'scholar.google.com' ] ;
44const 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+
25792682function 创建上行写入队列 ( { 获取写入器, 获取连接任务 = null , 释放写入器, 重试连接, 关闭连接, 名称 = '上行队列' } ) {
25802683 const grain = 创建Grain收纳器 ( 上行合包目标字节 ) ;
25812684 let draining = false ;
0 commit comments