grpc-libp2p-client 0.0.8 → 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/dist/grpc.js CHANGED
@@ -3316,30 +3316,77 @@
3316
3316
  });
3317
3317
  });
3318
3318
  };
3319
- Libp2pGrpcClient.prototype.Call = function (method, requestData, timeout, mode, onDataCallback, dataSourceCallback, onEndCallback, onErrorCallback) {
3319
+ /**
3320
+ * 执行GRPC调用,支持通过context和返回的取消函数控制终止
3321
+ * @param method GRPC方法名
3322
+ * @param requestData 请求数据
3323
+ * @param timeout 超时时间(毫秒)
3324
+ * @param mode 调用模式: 'unary'|'server-streaming'|'client-streaming'|'bidirectional'
3325
+ * @param onDataCallback 数据回调函数
3326
+ * @param dataSourceCallback 客户端流数据源回调
3327
+ * @param onEndCallback 结束回调函数
3328
+ * @param onErrorCallback 错误回调函数
3329
+ * @param context 操作上下文,包含AbortSignal用于取消操作
3330
+ * @returns 取消函数,可随时调用终止操作
3331
+ */
3332
+ Libp2pGrpcClient.prototype.Call = function (method, requestData, timeout, mode, onDataCallback, dataSourceCallback, onEndCallback, onErrorCallback, context) {
3320
3333
  return __awaiter(this, void 0, void 0, function () {
3321
- var timeoutHandle, timeoutPromise, hpack, operationPromise;
3334
+ var internalController, timeoutHandle, stream, cancelOperation, timeoutPromise, operationPromise;
3322
3335
  var _this = this;
3323
3336
  return __generator(this, function (_a) {
3337
+ internalController = new AbortController();
3338
+ stream = null;
3339
+ cancelOperation = function () {
3340
+ internalController.abort();
3341
+ if (timeoutHandle) {
3342
+ clearTimeout(timeoutHandle);
3343
+ }
3344
+ if (stream) {
3345
+ try {
3346
+ stream.abort(new Error('Operation cancelled'));
3347
+ }
3348
+ catch (err) {
3349
+ console.error('Error closing stream on cancel:', err);
3350
+ }
3351
+ }
3352
+ };
3353
+ // 如果提供了外部信号,监听它
3354
+ if (context === null || context === void 0 ? void 0 : context.signal) {
3355
+ // 如果外部信号已经触发中止,立即返回
3356
+ if (context.signal.aborted) {
3357
+ if (onErrorCallback) {
3358
+ onErrorCallback(new Error('Operation aborted by context'));
3359
+ }
3360
+ cancelOperation();
3361
+ }
3362
+ // 监听外部的abort事件
3363
+ context.signal.addEventListener('abort', function () {
3364
+ cancelOperation();
3365
+ });
3366
+ }
3324
3367
  timeoutPromise = new Promise(function (_, reject) {
3325
- return timeoutHandle = setTimeout(function () { return reject(new Error('Operation timed out')); }, timeout);
3368
+ timeoutHandle = setTimeout(function () {
3369
+ reject(new Error('Operation timed out'));
3370
+ cancelOperation();
3371
+ }, timeout);
3326
3372
  });
3327
- hpack = new HPACK();
3328
3373
  operationPromise = (function () { return __awaiter(_this, void 0, void 0, function () {
3329
- var stream, messageBuffer, expectedMessageLength, connection, streamId, writer_2, parser, preface, settingFrame, ackSettingFrame, headerFrame, dataFrames, _i, dataFrames_2, dataFrame, dataFrames, _a, dataFrames_3, dataFrame, _b, _c, _d, chunk, dataFrames, _e, dataFrames_4, dataFrame, e_1_1, finalFrame, err_2;
3374
+ var messageBuffer, expectedMessageLength, hpack, connection, streamId, writer_2, parser, preface, settingFrame, ackSettingFrame, headerFrame, dataFrames, _i, dataFrames_2, dataFrame, dataFrames, _a, dataFrames_3, dataFrame, _b, _c, _d, chunk, dataFrames, _e, dataFrames_4, dataFrame, e_1_1, finalFrame, err_2, err_3;
3330
3375
  var _this = this;
3331
3376
  var _f, e_1, _g, _h;
3332
3377
  return __generator(this, function (_j) {
3333
3378
  switch (_j.label) {
3334
3379
  case 0:
3335
- stream = null;
3336
- messageBuffer = new Uint8Array(0) // 用于累积跨帧的消息数据
3337
- ;
3338
- expectedMessageLength = -1 // 当前消息的期望长度
3339
- ;
3380
+ messageBuffer = new Uint8Array(0);
3381
+ expectedMessageLength = -1;
3382
+ hpack = new HPACK();
3340
3383
  _j.label = 1;
3341
3384
  case 1:
3342
- _j.trys.push([1, 37, 38, 41]);
3385
+ _j.trys.push([1, 37, 38, 43]);
3386
+ // 检查是否已经中止
3387
+ if (internalController.signal.aborted) {
3388
+ throw new Error('Operation aborted');
3389
+ }
3343
3390
  return [4 /*yield*/, this.node.dial(this.peerAddr)];
3344
3391
  case 2:
3345
3392
  connection = _j.sent();
@@ -3350,10 +3397,14 @@
3350
3397
  writer_2 = new StreamWriter(stream.sink);
3351
3398
  parser = new HTTP2Parser(writer_2);
3352
3399
  clearTimeout(timeoutHandle);
3353
- // Define the onData method to utilize the provided callback
3400
+ // 在各个回调中检查是否已中止
3354
3401
  parser.onData = function (payload, frameHeader) { return __awaiter(_this, void 0, void 0, function () {
3355
3402
  var newBuffer, compressionFlag, lengthBytes, completeMessage;
3356
3403
  return __generator(this, function (_a) {
3404
+ // 检查是否已中止
3405
+ if (internalController.signal.aborted) {
3406
+ return [2 /*return*/];
3407
+ }
3357
3408
  try {
3358
3409
  newBuffer = new Uint8Array(messageBuffer.length + payload.length);
3359
3410
  newBuffer.set(messageBuffer);
@@ -3361,6 +3412,10 @@
3361
3412
  messageBuffer = newBuffer;
3362
3413
  // 处理缓冲区中的完整消息
3363
3414
  while (messageBuffer.length > 0) {
3415
+ // 如果已经中止,停止处理
3416
+ if (internalController.signal.aborted) {
3417
+ return [2 /*return*/];
3418
+ }
3364
3419
  // 如果还没有读取消息长度,且缓冲区有足够数据
3365
3420
  if (expectedMessageLength === -1 && messageBuffer.length >= 5) {
3366
3421
  compressionFlag = messageBuffer[0];
@@ -3394,10 +3449,16 @@
3394
3449
  });
3395
3450
  }); };
3396
3451
  parser.onSettings = function () {
3452
+ // 检查是否已中止
3453
+ if (internalController.signal.aborted)
3454
+ return;
3397
3455
  var ackSettingFrame = Http2Frame.createSettingsAckFrame();
3398
3456
  writer_2.write(ackSettingFrame);
3399
3457
  };
3400
3458
  parser.onHeaders = function (headers, header) {
3459
+ // 检查是否已中止
3460
+ if (internalController.signal.aborted)
3461
+ return;
3401
3462
  var plainHeaders = hpack.decodeHeaderFields(headers);
3402
3463
  if (plainHeaders.get('grpc-status') === '0') ;
3403
3464
  else if (plainHeaders.get('grpc-status') !== undefined) {
@@ -3412,34 +3473,62 @@
3412
3473
  }
3413
3474
  };
3414
3475
  parser.processStream(stream);
3476
+ // 检查是否已中止
3477
+ if (internalController.signal.aborted) {
3478
+ throw new Error('Operation aborted');
3479
+ }
3415
3480
  preface = Http2Frame.createPreface();
3416
3481
  return [4 /*yield*/, writer_2.write(preface)];
3417
3482
  case 4:
3418
3483
  _j.sent();
3484
+ // 检查是否已中止
3485
+ if (internalController.signal.aborted) {
3486
+ throw new Error('Operation aborted');
3487
+ }
3419
3488
  settingFrame = Http2Frame.createSettingsFrame();
3420
3489
  return [4 /*yield*/, writer_2.write(settingFrame)];
3421
3490
  case 5:
3422
3491
  _j.sent();
3492
+ // 检查是否已中止
3493
+ if (internalController.signal.aborted) {
3494
+ throw new Error('Operation aborted');
3495
+ }
3423
3496
  // Wait for the acknowledgement of SETTINGS
3424
3497
  return [4 /*yield*/, parser.waitForSettingsAck()];
3425
3498
  case 6:
3426
3499
  // Wait for the acknowledgement of SETTINGS
3427
3500
  _j.sent();
3501
+ // 检查是否已中止
3502
+ if (internalController.signal.aborted) {
3503
+ throw new Error('Operation aborted');
3504
+ }
3428
3505
  ackSettingFrame = Http2Frame.createSettingsAckFrame();
3429
3506
  return [4 /*yield*/, writer_2.write(ackSettingFrame)];
3430
3507
  case 7:
3431
3508
  _j.sent();
3509
+ // 检查是否已中止
3510
+ if (internalController.signal.aborted) {
3511
+ throw new Error('Operation aborted');
3512
+ }
3432
3513
  headerFrame = Http2Frame.createHeadersFrame(streamId, method, true, this.token);
3433
3514
  if (!(mode === 'unary' || mode === 'server-streaming')) return [3 /*break*/, 13];
3434
3515
  dataFrames = Http2Frame.createDataFrames(streamId, requestData, true);
3435
3516
  return [4 /*yield*/, writer_2.write(new Uint8Array(__spreadArray([], headerFrame, true)))];
3436
3517
  case 8:
3437
3518
  _j.sent();
3519
+ // 检查是否已中止
3520
+ if (internalController.signal.aborted) {
3521
+ throw new Error('Operation aborted');
3522
+ }
3438
3523
  _i = 0, dataFrames_2 = dataFrames;
3439
3524
  _j.label = 9;
3440
3525
  case 9:
3441
3526
  if (!(_i < dataFrames_2.length)) return [3 /*break*/, 12];
3442
3527
  dataFrame = dataFrames_2[_i];
3528
+ // 检查是否已中止
3529
+ if (internalController.signal.aborted) {
3530
+ throw new Error('Operation aborted');
3531
+ }
3443
3532
  return [4 /*yield*/, writer_2.write(dataFrame)];
3444
3533
  case 10:
3445
3534
  _j.sent();
@@ -3453,6 +3542,10 @@
3453
3542
  return [4 /*yield*/, writer_2.write(headerFrame)];
3454
3543
  case 14:
3455
3544
  _j.sent();
3545
+ // 检查是否已中止
3546
+ if (internalController.signal.aborted) {
3547
+ throw new Error('Operation aborted');
3548
+ }
3456
3549
  if (!(requestData.length > 0)) return [3 /*break*/, 18];
3457
3550
  dataFrames = Http2Frame.createDataFrames(streamId, requestData, false);
3458
3551
  _a = 0, dataFrames_3 = dataFrames;
@@ -3460,6 +3553,10 @@
3460
3553
  case 15:
3461
3554
  if (!(_a < dataFrames_3.length)) return [3 /*break*/, 18];
3462
3555
  dataFrame = dataFrames_3[_a];
3556
+ // 检查是否已中止
3557
+ if (internalController.signal.aborted) {
3558
+ throw new Error('Operation aborted');
3559
+ }
3463
3560
  return [4 /*yield*/, writer_2.write(dataFrame)];
3464
3561
  case 16:
3465
3562
  _j.sent();
@@ -3477,12 +3574,20 @@
3477
3574
  _h = _d.value;
3478
3575
  _b = false;
3479
3576
  chunk = _h;
3577
+ // 检查是否已中止
3578
+ if (internalController.signal.aborted) {
3579
+ throw new Error('Operation aborted');
3580
+ }
3480
3581
  dataFrames = Http2Frame.createDataFrames(streamId, chunk, false);
3481
3582
  _e = 0, dataFrames_4 = dataFrames;
3482
3583
  _j.label = 21;
3483
3584
  case 21:
3484
3585
  if (!(_e < dataFrames_4.length)) return [3 /*break*/, 24];
3485
3586
  dataFrame = dataFrames_4[_e];
3587
+ // 检查是否已中止
3588
+ if (internalController.signal.aborted) {
3589
+ throw new Error('Operation aborted');
3590
+ }
3486
3591
  return [4 /*yield*/, writer_2.write(dataFrame)];
3487
3592
  case 22:
3488
3593
  _j.sent();
@@ -3511,6 +3616,10 @@
3511
3616
  return [7 /*endfinally*/];
3512
3617
  case 31: return [7 /*endfinally*/];
3513
3618
  case 32:
3619
+ // 检查是否已中止
3620
+ if (internalController.signal.aborted) {
3621
+ throw new Error('Operation aborted');
3622
+ }
3514
3623
  finalFrame = Http2Frame.createDataFrame(streamId, new Uint8Array(), true);
3515
3624
  return [4 /*yield*/, writer_2.write(finalFrame)];
3516
3625
  case 33:
@@ -3519,16 +3628,27 @@
3519
3628
  case 34:
3520
3629
  _j.sent();
3521
3630
  _j.label = 35;
3522
- case 35: return [4 /*yield*/, parser.waitForEndOfStream(0)];
3631
+ case 35:
3632
+ // 检查是否已中止
3633
+ if (internalController.signal.aborted) {
3634
+ throw new Error('Operation aborted');
3635
+ }
3636
+ return [4 /*yield*/, parser.waitForEndOfStream(0)];
3523
3637
  case 36:
3524
3638
  _j.sent();
3525
3639
  if (onEndCallback) {
3526
3640
  onEndCallback();
3527
3641
  }
3528
- return [3 /*break*/, 41];
3642
+ return [3 /*break*/, 43];
3529
3643
  case 37:
3530
3644
  err_2 = _j.sent();
3531
- if (onErrorCallback) {
3645
+ // 如果是由于取消导致的错误,使用特定的错误消息
3646
+ if (internalController.signal.aborted && err_2 instanceof Error && err_2.message === 'Operation aborted') {
3647
+ if (onErrorCallback) {
3648
+ onErrorCallback(new Error('Operation cancelled by user'));
3649
+ }
3650
+ }
3651
+ else if (onErrorCallback) {
3532
3652
  onErrorCallback(err_2);
3533
3653
  }
3534
3654
  else {
@@ -3539,18 +3659,26 @@
3539
3659
  console.error('asyncCall error:', err_2);
3540
3660
  }
3541
3661
  }
3542
- return [3 /*break*/, 41];
3662
+ return [3 /*break*/, 43];
3543
3663
  case 38:
3544
- if (!stream) return [3 /*break*/, 40];
3545
- return [4 /*yield*/, stream.close()];
3664
+ if (!stream) return [3 /*break*/, 42];
3665
+ _j.label = 39;
3546
3666
  case 39:
3667
+ _j.trys.push([39, 41, , 42]);
3668
+ return [4 /*yield*/, stream.close()];
3669
+ case 40:
3547
3670
  _j.sent();
3548
- _j.label = 40;
3549
- case 40: return [7 /*endfinally*/];
3550
- case 41: return [2 /*return*/];
3671
+ return [3 /*break*/, 42];
3672
+ case 41:
3673
+ err_3 = _j.sent();
3674
+ console.error('Error closing stream:', err_3);
3675
+ return [3 /*break*/, 42];
3676
+ case 42: return [7 /*endfinally*/];
3677
+ case 43: return [2 /*return*/];
3551
3678
  }
3552
3679
  });
3553
3680
  }); })();
3681
+ // 执行操作并返回取消函数
3554
3682
  return [2 /*return*/, Promise.race([operationPromise, timeoutPromise])];
3555
3683
  });
3556
3684
  });