@@ -33,6 +33,7 @@ const useMicrotask = true
33
33
// Client to relay socket data
34
34
export type C2RSocketData = {
35
35
connId : number // 连接 ID,连接建立时随机分配,用于日志
36
+ hasPendingMacroTask : boolean , // 是否有未完成的宏任务
36
37
sendBuffer : ArrayBufferSink // 发送缓冲区
37
38
ppStream : ProxyProtocolPacketStream // Proxy Protocol v2 解包流
38
39
C2RStream : MinecraftPacketStream // 用于解包握手和登录包
@@ -53,6 +54,7 @@ export type C2RSocketData = {
53
54
// Relay to server socket data
54
55
type R2SSocketData = {
55
56
client : Bun . Socket < C2RSocketData > | null // 客户端连接
57
+ hasPendingMacroTask : boolean , // 是否有未完成的宏任务
56
58
sendBuffer : ArrayBufferSink // 发送缓冲区
57
59
timeouts : NodeJS . Timer [ ] // 存储所有的 timeout
58
60
}
@@ -62,20 +64,28 @@ const writeToBuffer = (
62
64
buffer : Buffer ,
63
65
) => {
64
66
socket . data . sendBuffer . write ( buffer )
65
- if ( useMicrotask ) queueMicrotask ( ( ) => sendBuffer ( socket ) )
66
- else sendBuffer ( socket )
67
+ if ( useMicrotask ) {
68
+ if ( ! socket . data . hasPendingMacroTask ) {
69
+ socket . data . hasPendingMacroTask = true
70
+ queueMicrotask ( ( ) => sendBuffer ( socket ) )
71
+ }
72
+ } else sendBuffer ( socket )
67
73
}
68
74
69
75
const sendBuffer = (
70
76
socket : Bun . Socket < C2RSocketData > | Bun . Socket < R2SSocketData > ,
71
77
) => {
72
78
if ( socket . data . sendBuffer ) {
73
79
const data = socket . data . sendBuffer . flush ( ) as Uint8Array
74
- if ( ! data ) return
80
+ if ( ! data ) {
81
+ socket . data . hasPendingMacroTask = false
82
+ return
83
+ }
75
84
const written = socket . write ( data )
76
85
if ( written < data . byteLength ) {
77
86
socket . data . sendBuffer . write ( data . subarray ( written ) )
78
87
}
88
+ socket . data . hasPendingMacroTask = false
79
89
}
80
90
}
81
91
@@ -147,6 +157,7 @@ export class MinecraftProxy {
147
157
open : async remoteSocket => {
148
158
remoteSocket . data = {
149
159
client : clientSocket ,
160
+ hasPendingMacroTask : false ,
150
161
sendBuffer : new ArrayBufferSink ( ) ,
151
162
timeouts : [ ] ,
152
163
}
@@ -223,6 +234,7 @@ export class MinecraftProxy {
223
234
open : clientSocket => {
224
235
clientSocket . data = {
225
236
connId : Math . floor ( Math . random ( ) * 100000 ) ,
237
+ hasPendingMacroTask : false ,
226
238
sendBuffer : new ArrayBufferSink ( ) ,
227
239
ppStream : new ProxyProtocolPacketStream ( ) ,
228
240
C2RStream : new MinecraftPacketStream ( ) ,
0 commit comments