grpc-libp2p-client 0.0.9 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/dc-http2/parser.ts +39 -23
package/package.json
CHANGED
package/src/dc-http2/parser.ts
CHANGED
|
@@ -21,11 +21,11 @@ export class HTTP2Parser {
|
|
|
21
21
|
this.buffer = new Uint8Array(0);
|
|
22
22
|
this.settingsAckReceived = false;
|
|
23
23
|
// 初始化连接级别的流控制窗口大小(默认值:65,535)
|
|
24
|
-
this.connectionWindowSize = 4<<20;
|
|
24
|
+
this.connectionWindowSize = 4 << 20;
|
|
25
25
|
// 存储流的Map
|
|
26
26
|
this.streams = new Map();
|
|
27
27
|
// 默认的流级别初始窗口大小
|
|
28
|
-
this.defaultStreamWindowSize = 4<<20;
|
|
28
|
+
this.defaultStreamWindowSize = 4 << 20;
|
|
29
29
|
// 结束标志
|
|
30
30
|
this.endFlag = false;
|
|
31
31
|
|
|
@@ -77,7 +77,9 @@ export class HTTP2Parser {
|
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
private isHttp2Preface(buffer: Uint8Array): boolean {
|
|
80
|
-
const PREFACE = new TextEncoder().encode(
|
|
80
|
+
const PREFACE = new TextEncoder().encode(
|
|
81
|
+
"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
|
|
82
|
+
);
|
|
81
83
|
if (buffer.length < PREFACE.length) return false;
|
|
82
84
|
for (let i = 0; i < PREFACE.length; i++) {
|
|
83
85
|
if (buffer[i] !== PREFACE[i]) return false;
|
|
@@ -118,12 +120,19 @@ export class HTTP2Parser {
|
|
|
118
120
|
const settingsPayload = frameData.slice(9);
|
|
119
121
|
const settings = {};
|
|
120
122
|
for (let i = 0; i < settingsPayload.length; i += 6) {
|
|
121
|
-
|
|
123
|
+
// 正确解析:2字节ID + 4字节值
|
|
124
|
+
const id = (settingsPayload[i] << 8) | settingsPayload[i + 1];
|
|
122
125
|
const value =
|
|
123
|
-
(settingsPayload[i +
|
|
124
|
-
(settingsPayload[i +
|
|
125
|
-
settingsPayload[i +
|
|
126
|
+
(settingsPayload[i + 2] << 24) |
|
|
127
|
+
(settingsPayload[i + 3] << 16) |
|
|
128
|
+
(settingsPayload[i + 4] << 8) |
|
|
129
|
+
settingsPayload[i + 5];
|
|
130
|
+
|
|
126
131
|
settings[id] = value;
|
|
132
|
+
if (id === 4) {
|
|
133
|
+
// SETTINGS_INITIAL_WINDOW_SIZE
|
|
134
|
+
this.defaultStreamWindowSize = value;
|
|
135
|
+
}
|
|
127
136
|
}
|
|
128
137
|
|
|
129
138
|
//发送ACK
|
|
@@ -138,23 +147,26 @@ export class HTTP2Parser {
|
|
|
138
147
|
if (this.onData) {
|
|
139
148
|
this.onData(frameData.slice(9), frameHeader); // 跳过帧头
|
|
140
149
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
150
|
+
// 更新流窗口和连接窗口
|
|
151
|
+
try {
|
|
152
|
+
// 更新流级别的窗口
|
|
153
|
+
if (frameHeader.streamId !== 0) {
|
|
145
154
|
const streamWindowUpdate = Http2Frame.createWindowUpdateFrame(
|
|
146
|
-
|
|
147
|
-
|
|
155
|
+
frameHeader.streamId,
|
|
156
|
+
frameHeader.length
|
|
148
157
|
);
|
|
149
158
|
this.writer.write(streamWindowUpdate);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// 更新连接级别的窗口
|
|
162
|
+
const connWindowUpdate = Http2Frame.createWindowUpdateFrame(
|
|
163
|
+
0,
|
|
164
|
+
frameHeader.length
|
|
165
|
+
);
|
|
166
|
+
this.writer.write(connWindowUpdate);
|
|
167
|
+
} catch (err) {
|
|
168
|
+
console.error("[HTTP2] Error sending window update:", err);
|
|
150
169
|
}
|
|
151
|
-
|
|
152
|
-
// 更新连接级别的窗口
|
|
153
|
-
const connWindowUpdate = Http2Frame.createWindowUpdateFrame(0, frameHeader.length);
|
|
154
|
-
this.writer.write(connWindowUpdate);
|
|
155
|
-
} catch (err) {
|
|
156
|
-
console.error("[HTTP2] Error sending window update:", err);
|
|
157
|
-
}
|
|
158
170
|
//判断是否是最后一个帧
|
|
159
171
|
if (
|
|
160
172
|
(frameHeader.flags & FRAME_FLAGS.END_STREAM) ===
|
|
@@ -233,6 +245,10 @@ export class HTTP2Parser {
|
|
|
233
245
|
if (frameHeader.length !== 8) {
|
|
234
246
|
throw new Error("PING frame must have a length of 8 bytes");
|
|
235
247
|
}
|
|
248
|
+
if (frameHeader.flags & FRAME_FLAGS.ACK) {
|
|
249
|
+
// 是ACK,不需要回应
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
236
252
|
// 反馈PONG帧
|
|
237
253
|
const pongFrame = Http2Frame.createPongFrame(frameData.slice(9));
|
|
238
254
|
try {
|
|
@@ -300,8 +316,8 @@ export class HTTP2Parser {
|
|
|
300
316
|
}
|
|
301
317
|
|
|
302
318
|
// 确保frameBuffer是Uint8Array类型
|
|
303
|
-
|
|
304
|
-
|
|
319
|
+
// const buffer = new Uint8Array(frameBuffer);
|
|
320
|
+
const buffer = new Uint8Array(frameBuffer.slice(9));
|
|
305
321
|
|
|
306
322
|
// 读取window size increment (4字节,大端序)
|
|
307
323
|
// 手动计算32位无符号整数,确保最高位为0
|
|
@@ -329,7 +345,7 @@ export class HTTP2Parser {
|
|
|
329
345
|
) {
|
|
330
346
|
try {
|
|
331
347
|
const windowUpdate = this.parseWindowUpdateFrame(payload, frameHeader);
|
|
332
|
-
|
|
348
|
+
|
|
333
349
|
this.connectionWindowSize += windowUpdate.windowSizeIncrement;
|
|
334
350
|
|
|
335
351
|
return windowUpdate;
|