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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "grpc-libp2p-client",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
4
4
  "type": "module",
5
5
  "description": "grpc-libp2p-client",
6
6
  "main": "./dist/index.cjs.js",
@@ -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("PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n");
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
- const id = settingsPayload[i];
123
+ // 正确解析:2字节ID + 4字节值
124
+ const id = (settingsPayload[i] << 8) | settingsPayload[i + 1];
122
125
  const value =
123
- (settingsPayload[i + 1] << 16) |
124
- (settingsPayload[i + 2] << 8) |
125
- settingsPayload[i + 3];
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
- try {
143
- // 更新流级别的窗口
144
- if (frameHeader.streamId !== 0) {
150
+ // 更新流窗口和连接窗口
151
+ try {
152
+ // 更新流级别的窗口
153
+ if (frameHeader.streamId !== 0) {
145
154
  const streamWindowUpdate = Http2Frame.createWindowUpdateFrame(
146
- frameHeader.streamId,
147
- frameHeader.length
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
- // const buffer = new Uint8Array(frameBuffer);
304
- const buffer = new Uint8Array(frameBuffer.slice(9));
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;