@peerbit/rpc 6.1.31 → 6.2.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"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"}
@@ -34,9 +34,10 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
34
34
  };
35
35
  import { BorshError, deserialize, serialize, variant, } from "@dao-xyz/borsh";
36
36
  import { AccessError, DecryptedThing, MaybeEncrypted, PublicSignKey, X25519Keypair, X25519PublicKey, randomBytes, toBase64, } from "@peerbit/crypto";
37
+ import { createDiagnosticTrace } from "@peerbit/diagnostics";
37
38
  import { Program } from "@peerbit/program";
38
39
  import { DataEvent, } from "@peerbit/pubsub-interface";
39
- import { createRequestTransportContext, DataMessage, SilentDelivery, } from "@peerbit/stream-interface";
40
+ import { DataMessage, SilentDelivery, createRequestTransportContext, } from "@peerbit/stream-interface";
40
41
  import { AbortError, TimeoutError } from "@peerbit/time";
41
42
  import pDefer, {} from "p-defer";
42
43
  import { RPCMessage, RequestV0, ResponseV0 } from "./encoding.js";
@@ -288,10 +289,7 @@ let RPC = (() => {
288
289
  // (de)serialize — e.g. a response embedding entries that
289
290
  // cannot be re-serialized. Swallowing it silently makes the
290
291
  // requester time out with no trace, so surface it.
291
- logger.error("RPC serialization failed at stage " +
292
- stage +
293
- ": " +
294
- error.message);
292
+ logger.error("RPC serialization failed at stage " + stage + ": " + error.message);
295
293
  this.events.dispatchEvent(new CustomEvent("codecError", {
296
294
  detail: { error, stage, message },
297
295
  }));
@@ -349,7 +347,7 @@ let RPC = (() => {
349
347
  async send(message, options) {
350
348
  await this.node.services.pubsub.publish(serialize(await this.seal(message, undefined, options)), this.getPublishOptions(undefined, options, options?.signal));
351
349
  }
352
- handleDecodedResponse(response, promise, allResults, responders, expectedResponders, options) {
350
+ handleDecodedResponse(response, promise, allResults, responders, expectedResponders, options, profile) {
353
351
  const expectedResponseHash = expectedResponders && response.from
354
352
  ? response.from.hashcode()
355
353
  : undefined;
@@ -367,6 +365,16 @@ let RPC = (() => {
367
365
  options?.onResponse(response.response, response.from);
368
366
  allResults.push(response);
369
367
  responders.add(response.from.hashcode());
368
+ profile?.emit({
369
+ name: "rpc.request.response",
370
+ peer: allResults.length <= 16 ? expectedResponseHash : undefined,
371
+ details: {
372
+ peerSampleOmitted: allResults.length > 16,
373
+ expectedResponders: expectedResponders.size,
374
+ receivedResponses: allResults.length,
375
+ unresolvedResponders: expectedResponders.size - responders.size,
376
+ },
377
+ });
370
378
  if (responders.size === expectedResponders.size) {
371
379
  promise.resolve();
372
380
  }
@@ -376,13 +384,17 @@ let RPC = (() => {
376
384
  options?.onResponse &&
377
385
  options?.onResponse(response.response, response.from);
378
386
  allResults.push(response);
387
+ profile?.emit({
388
+ name: "rpc.request.response",
389
+ details: { receivedResponses: allResults.length },
390
+ });
379
391
  if (options?.amount != null &&
380
392
  allResults.length >= options?.amount) {
381
393
  promise.resolve();
382
394
  }
383
395
  }
384
396
  }
385
- createResponseHandler(promise, keypair, allResults, responders, expectedResponders, options) {
397
+ createResponseHandler(promise, keypair, allResults, responders, expectedResponders, options, profile) {
386
398
  return async (properties) => {
387
399
  let decoded = false;
388
400
  try {
@@ -399,7 +411,7 @@ let RPC = (() => {
399
411
  response: resultData,
400
412
  message: message,
401
413
  from: from,
402
- }, promise, allResults, responders, expectedResponders, options);
414
+ }, promise, allResults, responders, expectedResponders, options, profile);
403
415
  }
404
416
  catch (error) {
405
417
  if (error instanceof AccessError) {
@@ -439,134 +451,247 @@ let RPC = (() => {
439
451
  * @returns
440
452
  */
441
453
  async request(request, options) {
442
- const requestSignal = options?.signal;
443
- const getAbortReason = (signal) => signal?.reason === undefined ? new AbortError() : signal.reason;
444
- if (requestSignal?.aborted) {
445
- throw getAbortReason(requestSignal);
446
- }
447
- let rejectSetupForAbort;
448
- const setupAbortPromise = new Promise((_resolve, reject) => {
449
- rejectSetupForAbort = reject;
450
- });
451
- const setupAbortListener = () => {
452
- rejectSetupForAbort(getAbortReason(requestSignal));
454
+ const profile = createDiagnosticTrace(options?.profile, "rpc", "rpc");
455
+ let resultsForProfile;
456
+ let respondersForProfile;
457
+ let expectedCount;
458
+ let effectiveTimeoutMs;
459
+ let deadlineFired = false;
460
+ let abortCause;
461
+ let abortKind;
462
+ const recordAbort = (cause, kind) => {
463
+ // The request promise keeps its first rejection even if another
464
+ // lifecycle callback runs before the awaiting continuation resumes.
465
+ if (abortKind === undefined) {
466
+ abortCause = cause;
467
+ abortKind = kind;
468
+ }
469
+ return cause;
453
470
  };
454
- requestSignal?.addEventListener("abort", setupAbortListener, { once: true });
455
- const setupPromise = (async () => {
456
- // We are generatinga new encryption keypair for each send, so we now that when we get the responses, they are encrypted specifcally for me, and for this request
457
- // this allows us to easily disregard a bunch of message just beacuse they are for a different receiver!
458
- const keypair = await X25519Keypair.create();
471
+ let outcome = "failed";
472
+ let reason = "error";
473
+ try {
474
+ const requestSignal = options?.signal;
475
+ const getAbortReason = (signal) => signal?.reason === undefined ? new AbortError() : signal.reason;
459
476
  if (requestSignal?.aborted) {
460
- throw getAbortReason(requestSignal);
477
+ throw recordAbort(getAbortReason(requestSignal), "signal");
461
478
  }
462
- const requestMessage = await this.seal(request, keypair.publicKey, options);
463
- return { keypair, requestBytes: serialize(requestMessage) };
464
- })();
465
- let setup;
466
- try {
467
- setup = await Promise.race([setupPromise, setupAbortPromise]);
468
- }
469
- finally {
470
- requestSignal?.removeEventListener("abort", setupAbortListener);
471
- }
472
- const { keypair, requestBytes } = setup;
473
- if (requestSignal?.aborted) {
474
- throw getAbortReason(requestSignal);
475
- }
476
- const allResults = [];
477
- const deferredPromise = pDefer();
478
- const publishAbortController = new AbortController();
479
- const abortPublish = (reason) => {
480
- if (!publishAbortController.signal.aborted) {
481
- publishAbortController.abort(reason);
479
+ let rejectSetupForAbort;
480
+ const setupAbortPromise = new Promise((_resolve, reject) => {
481
+ rejectSetupForAbort = reject;
482
+ });
483
+ const setupAbortListener = () => {
484
+ rejectSetupForAbort(recordAbort(getAbortReason(requestSignal), "signal"));
485
+ };
486
+ requestSignal?.addEventListener("abort", setupAbortListener, {
487
+ once: true,
488
+ });
489
+ const setupStartedAt = profile?.now();
490
+ profile?.emit({ name: "rpc.request.setup", details: { edge: "start" } });
491
+ const setupPromise = (async () => {
492
+ try {
493
+ // We are generatinga new encryption keypair for each send, so we now that when we get the responses, they are encrypted specifcally for me, and for this request
494
+ // this allows us to easily disregard a bunch of message just beacuse they are for a different receiver!
495
+ const keypair = await X25519Keypair.create();
496
+ if (requestSignal?.aborted) {
497
+ throw recordAbort(getAbortReason(requestSignal), "signal");
498
+ }
499
+ const requestMessage = await this.seal(request, keypair.publicKey, options);
500
+ const result = { keypair, requestBytes: serialize(requestMessage) };
501
+ profile?.emit({
502
+ name: "rpc.request.setup",
503
+ durationMs: profile.now() - setupStartedAt,
504
+ details: { edge: "end", outcome: "fulfilled" },
505
+ });
506
+ return result;
507
+ }
508
+ catch (error) {
509
+ profile?.emit({
510
+ name: "rpc.request.setup",
511
+ durationMs: profile.now() - setupStartedAt,
512
+ details: { edge: "end", outcome: "rejected" },
513
+ });
514
+ throw error;
515
+ }
516
+ })();
517
+ let setup;
518
+ try {
519
+ setup = await Promise.race([setupPromise, setupAbortPromise]);
482
520
  }
483
- };
484
- if (this.closed) {
485
- throw new AbortError("Closed");
486
- }
487
- const timeoutFn = setTimeout(() => {
488
- abortPublish(new AbortError("RPC request timeout"));
489
- deferredPromise.resolve();
490
- }, options?.timeout || 10 * 1000);
491
- const rejectForAbort = (signal) => {
492
- const reason = getAbortReason(signal);
493
- abortPublish(reason);
494
- deferredPromise.reject(reason);
495
- };
496
- const abortListener = (event) => {
497
- rejectForAbort(event.target);
498
- };
499
- requestSignal?.addEventListener("abort", abortListener);
500
- // Cover the narrow handoff between the setup listener and the active request
501
- // listener before registering any resolver or transport side effects.
502
- if (requestSignal?.aborted) {
503
- const reason = getAbortReason(requestSignal);
504
- abortPublish(reason);
505
- clearTimeout(timeoutFn);
506
- requestSignal.removeEventListener("abort", abortListener);
507
- throw reason;
508
- }
509
- const closeListener = () => {
510
- const reason = new AbortError("Closed");
511
- abortPublish(reason);
512
- deferredPromise.reject(reason);
513
- };
514
- const dropListener = () => {
515
- const reason = new AbortError("Dropped");
516
- abortPublish(reason);
517
- deferredPromise.reject(reason);
518
- };
519
- this.events.addEventListener("close", closeListener);
520
- this.events.addEventListener("drop", dropListener);
521
- const expectedResponders = getExpectedResponders(options?.mode);
522
- const responders = new Set();
523
- const messageId = randomBytes(32);
524
- const id = toBase64(messageId);
525
- const responseHandler = this.createResponseHandler(deferredPromise, keypair, allResults, responders, expectedResponders, options);
526
- this._responseResolver.set(id, responseHandler);
527
- void deferredPromise.promise
528
- .finally(() => {
529
- abortPublish(new AbortError("Resolved early"));
530
- })
531
- .catch(() => { });
532
- try {
521
+ finally {
522
+ requestSignal?.removeEventListener("abort", setupAbortListener);
523
+ }
524
+ const { keypair, requestBytes } = setup;
533
525
  if (requestSignal?.aborted) {
534
- throw getAbortReason(requestSignal);
526
+ throw recordAbort(getAbortReason(requestSignal), "signal");
535
527
  }
536
- if (options?.responseInterceptor) {
537
- options.responseInterceptor((response) => {
538
- return this.handleDecodedResponse(response, deferredPromise, allResults, responders, expectedResponders, options);
539
- });
528
+ const allResults = [];
529
+ if (profile)
530
+ resultsForProfile = allResults;
531
+ const deferredPromise = pDefer();
532
+ const publishAbortController = new AbortController();
533
+ const abortPublish = (reason) => {
534
+ if (!publishAbortController.signal.aborted) {
535
+ publishAbortController.abort(reason);
536
+ }
537
+ };
538
+ if (this.closed) {
539
+ throw recordAbort(new AbortError("Closed"), "closed");
540
540
  }
541
+ const timeoutMs = options?.timeout || 10 * 1000;
542
+ if (profile)
543
+ effectiveTimeoutMs = timeoutMs;
544
+ const timeoutFn = setTimeout(() => {
545
+ deadlineFired = true;
546
+ profile?.emit({
547
+ name: "rpc.request.deadline",
548
+ details: {
549
+ timeoutMs,
550
+ expectedResponders: expectedCount,
551
+ receivedResponses: allResults.length,
552
+ unresolvedResponders: expectedCount === undefined
553
+ ? undefined
554
+ : expectedCount - (respondersForProfile?.size ?? 0),
555
+ },
556
+ });
557
+ abortPublish(new AbortError("RPC request timeout"));
558
+ deferredPromise.resolve();
559
+ }, timeoutMs);
560
+ const rejectForAbort = (signal) => {
561
+ const reason = getAbortReason(signal);
562
+ recordAbort(reason, "signal");
563
+ abortPublish(reason);
564
+ deferredPromise.reject(reason);
565
+ };
566
+ const abortListener = (event) => {
567
+ rejectForAbort(event.target);
568
+ };
569
+ requestSignal?.addEventListener("abort", abortListener);
570
+ // Cover the narrow handoff between the setup listener and the active request
571
+ // listener before registering any resolver or transport side effects.
541
572
  if (requestSignal?.aborted) {
542
- throw getAbortReason(requestSignal);
573
+ const reason = getAbortReason(requestSignal);
574
+ recordAbort(reason, "signal");
575
+ abortPublish(reason);
576
+ clearTimeout(timeoutFn);
577
+ requestSignal.removeEventListener("abort", abortListener);
578
+ throw reason;
543
579
  }
544
- const publishPromise = Promise.resolve()
545
- .then(() => this.node.services.pubsub.publish(requestBytes, this.getPublishOptions(messageId, options, publishAbortController.signal)))
546
- .catch((error) => {
547
- if (publishAbortController.signal.aborted &&
548
- (error instanceof AbortError ||
549
- error === publishAbortController.signal.reason)) {
550
- return;
580
+ const closeListener = () => {
581
+ const reason = new AbortError("Closed");
582
+ recordAbort(reason, "closed");
583
+ abortPublish(reason);
584
+ deferredPromise.reject(reason);
585
+ };
586
+ const dropListener = () => {
587
+ const reason = new AbortError("Dropped");
588
+ recordAbort(reason, "dropped");
589
+ abortPublish(reason);
590
+ deferredPromise.reject(reason);
591
+ };
592
+ this.events.addEventListener("close", closeListener);
593
+ this.events.addEventListener("drop", dropListener);
594
+ const expectedResponders = getExpectedResponders(options?.mode);
595
+ const responders = new Set();
596
+ if (profile) {
597
+ expectedCount = expectedResponders?.size;
598
+ respondersForProfile = responders;
599
+ }
600
+ const messageId = randomBytes(32);
601
+ const id = toBase64(messageId);
602
+ const responseHandler = this.createResponseHandler(deferredPromise, keypair, allResults, responders, expectedResponders, options, profile);
603
+ this._responseResolver.set(id, responseHandler);
604
+ void deferredPromise.promise
605
+ .finally(() => {
606
+ abortPublish(new AbortError("Resolved early"));
607
+ })
608
+ .catch(() => { });
609
+ try {
610
+ if (requestSignal?.aborted) {
611
+ throw recordAbort(getAbortReason(requestSignal), "signal");
551
612
  }
552
- if (error instanceof TimeoutError) {
553
- // Ignore publish timeouts
554
- return;
613
+ if (options?.responseInterceptor) {
614
+ options.responseInterceptor((response) => {
615
+ return this.handleDecodedResponse(response, deferredPromise, allResults, responders, expectedResponders, options, profile);
616
+ });
555
617
  }
556
- throw error;
557
- });
558
- await Promise.race([publishPromise, deferredPromise.promise]);
559
- await deferredPromise.promise;
618
+ if (requestSignal?.aborted) {
619
+ throw recordAbort(getAbortReason(requestSignal), "signal");
620
+ }
621
+ let publishStartedAt;
622
+ const rawPublishPromise = Promise.resolve().then(() => {
623
+ publishStartedAt = profile?.now();
624
+ profile?.emit({
625
+ name: "rpc.request.publish",
626
+ details: { edge: "start" },
627
+ });
628
+ return this.node.services.pubsub.publish(requestBytes, this.getPublishOptions(messageId, options, publishAbortController.signal));
629
+ });
630
+ if (profile) {
631
+ void rawPublishPromise.then(() => profile.emit({
632
+ name: "rpc.request.publish",
633
+ durationMs: profile.now() - publishStartedAt,
634
+ details: { edge: "end", outcome: "fulfilled" },
635
+ }), () => profile.emit({
636
+ name: "rpc.request.publish",
637
+ durationMs: profile.now() - publishStartedAt,
638
+ details: { edge: "end", outcome: "rejected" },
639
+ }));
640
+ }
641
+ const publishPromise = rawPublishPromise.catch((error) => {
642
+ if (publishAbortController.signal.aborted &&
643
+ (error instanceof AbortError ||
644
+ error === publishAbortController.signal.reason)) {
645
+ return;
646
+ }
647
+ if (error instanceof TimeoutError) {
648
+ // Ignore publish timeouts
649
+ return;
650
+ }
651
+ throw error;
652
+ });
653
+ await Promise.race([publishPromise, deferredPromise.promise]);
654
+ await deferredPromise.promise;
655
+ }
656
+ finally {
657
+ abortPublish(new AbortError("RPC request finished"));
658
+ clearTimeout(timeoutFn);
659
+ this.events.removeEventListener("close", closeListener);
660
+ this.events.removeEventListener("drop", dropListener);
661
+ requestSignal?.removeEventListener("abort", abortListener);
662
+ this._responseResolver.delete(id);
663
+ }
664
+ outcome =
665
+ deadlineFired &&
666
+ expectedResponders &&
667
+ responders.size < expectedResponders.size
668
+ ? "partial"
669
+ : "fulfilled";
670
+ reason = deadlineFired ? "deadline" : "responses";
671
+ return allResults;
672
+ }
673
+ catch (error) {
674
+ if (abortKind && error === abortCause) {
675
+ outcome = "aborted";
676
+ reason = abortKind;
677
+ }
678
+ throw error;
560
679
  }
561
680
  finally {
562
- abortPublish(new AbortError("RPC request finished"));
563
- clearTimeout(timeoutFn);
564
- this.events.removeEventListener("close", closeListener);
565
- this.events.removeEventListener("drop", dropListener);
566
- requestSignal?.removeEventListener("abort", abortListener);
567
- this._responseResolver.delete(id);
681
+ profile?.finish({
682
+ name: "rpc.request.settle",
683
+ details: {
684
+ outcome,
685
+ reason,
686
+ timeoutMs: effectiveTimeoutMs,
687
+ expectedResponders: expectedCount,
688
+ receivedResponses: resultsForProfile?.length ?? 0,
689
+ unresolvedResponders: expectedCount === undefined
690
+ ? undefined
691
+ : expectedCount - (respondersForProfile?.size ?? 0),
692
+ },
693
+ });
568
694
  }
569
- return allResults;
570
695
  }
571
696
  get topic() {
572
697
  if (!this._rpcTopic) {
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"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"}
package/dist/src/io.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { Ed25519PublicKey, PublicSignKey, X25519Keypair, X25519PublicKey } from "@peerbit/crypto";
2
+ import type { DiagnosticSink } from "@peerbit/diagnostics";
2
3
  import type { DataMessage, ExpiresAtOptions, PriorityOptions, ResponsePriorityOptions, WithExtraSigners, WithMode, WithTo } from "@peerbit/stream-interface";
3
4
  export declare const logger: import("@libp2p/interface").Logger;
4
5
  export type RPCRequestResponseOptions<R> = {
@@ -7,6 +8,8 @@ export type RPCRequestResponseOptions<R> = {
7
8
  isTrusted?: (publicKey: PublicSignKey) => Promise<boolean>;
8
9
  onResponse?: (response: R, from?: PublicSignKey) => void;
9
10
  signal?: AbortSignal;
11
+ /** Bounded, best-effort request timing; publish/response events are not delivery proofs. */
12
+ profile?: DiagnosticSink;
10
13
  };
11
14
  export type RequestResponseInterceptor<R> = {
12
15
  responseInterceptor?: (fn: (response: RPCResponse<R>) => void) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/io.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,eAAe,EACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EACX,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,QAAQ,EACR,MAAM,EACN,MAAM,2BAA2B,CAAC;AAEnC,eAAO,MAAM,MAAM,oCAA0B,CAAC;AAC9C,MAAM,MAAM,yBAAyB,CAAC,CAAC,IAAI;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACzD,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,CAAC,IAAI;IAC3C,mBAAmB,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC;CACvE,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,yBAAyB,CAAC,CAAC,CAAC,GAC9D,iBAAiB,GACjB,QAAQ,GACR,eAAe,GACf,uBAAuB,GACvB,gBAAgB,GAChB,gBAAgB,GAChB,0BAA0B,CAAC,CAAC,CAAC,CAAC;AAE/B,MAAM,MAAM,cAAc,GAAG,iBAAiB,GAC7C,CAAC,QAAQ,GAAG,MAAM,CAAC,GACnB,eAAe,GACf,uBAAuB,GACvB,gBAAgB,GAChB,gBAAgB,GAAG;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC/B,UAAU,CAAC,EAAE;QACZ,GAAG,EAAE,aAAa,CAAC;QACnB,UAAU,CAAC,EAAE,CAAC,eAAe,GAAG,gBAAgB,CAAC,EAAE,CAAC;KACpD,CAAC;CACF,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC5B,QAAQ,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,aAAa,CAAC;CACrB,CAAC"}
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/io.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,eAAe,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EACX,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,QAAQ,EACR,MAAM,EACN,MAAM,2BAA2B,CAAC;AAEnC,eAAO,MAAM,MAAM,oCAA0B,CAAC;AAC9C,MAAM,MAAM,yBAAyB,CAAC,CAAC,IAAI;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACzD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,4FAA4F;IAC5F,OAAO,CAAC,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,CAAC,IAAI;IAC3C,mBAAmB,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC;CACvE,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,yBAAyB,CAAC,CAAC,CAAC,GAC9D,iBAAiB,GACjB,QAAQ,GACR,eAAe,GACf,uBAAuB,GACvB,gBAAgB,GAChB,gBAAgB,GAChB,0BAA0B,CAAC,CAAC,CAAC,CAAC;AAE/B,MAAM,MAAM,cAAc,GAAG,iBAAiB,GAC7C,CAAC,QAAQ,GAAG,MAAM,CAAC,GACnB,eAAe,GACf,uBAAuB,GACvB,gBAAgB,GAChB,gBAAgB,GAAG;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC/B,UAAU,CAAC,EAAE;QACZ,GAAG,EAAE,aAAa,CAAC;QACnB,UAAU,CAAC,EAAE,CAAC,eAAe,GAAG,gBAAgB,CAAC,EAAE,CAAC;KACpD,CAAC;CACF,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC5B,QAAQ,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,aAAa,CAAC;CACrB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/io.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAWrD,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/io.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAWrD,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peerbit/rpc",
3
- "version": "6.1.31",
3
+ "version": "6.2.0",
4
4
  "description": "RPC calls for peers",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -54,16 +54,17 @@
54
54
  "dependencies": {
55
55
  "@dao-xyz/borsh": "^6.0.0",
56
56
  "p-defer": "^4.0.0",
57
- "@peerbit/program": "6.0.63",
58
- "@peerbit/crypto": "3.1.6",
59
- "@peerbit/pubsub": "5.4.8",
60
57
  "@peerbit/logger": "2.0.2",
58
+ "@peerbit/crypto": "3.1.6",
59
+ "@peerbit/diagnostics": "0.1.0",
60
+ "@peerbit/program": "6.0.64",
61
61
  "@peerbit/time": "3.0.1",
62
+ "@peerbit/pubsub": "5.4.9",
62
63
  "@peerbit/pubsub-interface": "5.2.2",
63
64
  "@peerbit/stream-interface": "6.0.16"
64
65
  },
65
66
  "devDependencies": {
66
- "@peerbit/test-utils": "3.1.44"
67
+ "@peerbit/test-utils": "3.1.45"
67
68
  },
68
69
  "scripts": {
69
70
  "clean": "aegir clean",
package/src/controller.ts CHANGED
@@ -15,18 +15,19 @@ import {
15
15
  randomBytes,
16
16
  toBase64,
17
17
  } from "@peerbit/crypto";
18
+ import { createDiagnosticTrace } from "@peerbit/diagnostics";
18
19
  import { Program, type ProgramEvents } from "@peerbit/program";
19
20
  import {
20
21
  DataEvent,
21
22
  type PublishOptions as PubSubPublishOptions,
22
23
  } from "@peerbit/pubsub-interface";
23
24
  import {
24
- createRequestTransportContext,
25
25
  DataMessage,
26
26
  type PriorityOptions,
27
27
  type RequestTransportContext,
28
28
  SilentDelivery,
29
29
  type WithExtraSigners,
30
+ createRequestTransportContext,
30
31
  } from "@peerbit/stream-interface";
31
32
  import { AbortError, TimeoutError } from "@peerbit/time";
32
33
  import pDefer, { type DeferredPromise } from "p-defer";
@@ -370,10 +371,7 @@ export class RPC<Q, R> extends Program<RPCSetupOptions<Q, R>, RPCEvents<Q, R>> {
370
371
  // cannot be re-serialized. Swallowing it silently makes the
371
372
  // requester time out with no trace, so surface it.
372
373
  logger.error(
373
- "RPC serialization failed at stage " +
374
- stage +
375
- ": " +
376
- error.message,
374
+ "RPC serialization failed at stage " + stage + ": " + error.message,
377
375
  );
378
376
  this.events.dispatchEvent(
379
377
  new CustomEvent<CodecErrorEvent>("codecError", {
@@ -457,10 +455,7 @@ export class RPC<Q, R> extends Program<RPCSetupOptions<Q, R>, RPCEvents<Q, R>> {
457
455
  * @param message
458
456
  * @param options
459
457
  */
460
- public async send(
461
- message: Q,
462
- options?: RPCSendOptions,
463
- ): Promise<void> {
458
+ public async send(message: Q, options?: RPCSendOptions): Promise<void> {
464
459
  await this.node.services.pubsub.publish(
465
460
  serialize(await this.seal(message, undefined, options)),
466
461
  this.getPublishOptions(undefined, options, options?.signal),
@@ -478,6 +473,7 @@ export class RPC<Q, R> extends Program<RPCSetupOptions<Q, R>, RPCEvents<Q, R>> {
478
473
  responders: Set<string>,
479
474
  expectedResponders?: Set<string>,
480
475
  options?: RPCRequestOptions<R>,
476
+ profile?: ReturnType<typeof createDiagnosticTrace>,
481
477
  ) {
482
478
  const expectedResponseHash =
483
479
  expectedResponders && response.from
@@ -504,6 +500,16 @@ export class RPC<Q, R> extends Program<RPCSetupOptions<Q, R>, RPCEvents<Q, R>> {
504
500
  allResults.push(response);
505
501
 
506
502
  responders.add(response.from.hashcode());
503
+ profile?.emit({
504
+ name: "rpc.request.response",
505
+ peer: allResults.length <= 16 ? expectedResponseHash : undefined,
506
+ details: {
507
+ peerSampleOmitted: allResults.length > 16,
508
+ expectedResponders: expectedResponders.size,
509
+ receivedResponses: allResults.length,
510
+ unresolvedResponders: expectedResponders.size - responders.size,
511
+ },
512
+ });
507
513
  if (responders.size === expectedResponders.size) {
508
514
  promise.resolve();
509
515
  }
@@ -512,6 +518,10 @@ export class RPC<Q, R> extends Program<RPCSetupOptions<Q, R>, RPCEvents<Q, R>> {
512
518
  options?.onResponse &&
513
519
  options?.onResponse(response.response, response.from);
514
520
  allResults.push(response);
521
+ profile?.emit({
522
+ name: "rpc.request.response",
523
+ details: { receivedResponses: allResults.length },
524
+ });
515
525
  if (
516
526
  options?.amount != null &&
517
527
  allResults.length >= (options?.amount as number)
@@ -527,6 +537,7 @@ export class RPC<Q, R> extends Program<RPCSetupOptions<Q, R>, RPCEvents<Q, R>> {
527
537
  responders: Set<string>,
528
538
  expectedResponders?: Set<string>,
529
539
  options?: RPCRequestOptions<R>,
540
+ profile?: ReturnType<typeof createDiagnosticTrace>,
530
541
  ) {
531
542
  return async (properties: {
532
543
  response: ResponseV0;
@@ -557,6 +568,7 @@ export class RPC<Q, R> extends Program<RPCSetupOptions<Q, R>, RPCEvents<Q, R>> {
557
568
  responders,
558
569
  expectedResponders,
559
570
  options,
571
+ profile,
560
572
  );
561
573
  } catch (error: any) {
562
574
  if (error instanceof AccessError) {
@@ -577,9 +589,7 @@ export class RPC<Q, R> extends Program<RPCSetupOptions<Q, R>, RPCEvents<Q, R>> {
577
589
  // request's keypair) but its payload failed to decode —
578
590
  // that is a codec bug, not a namespace conflict. Keep the
579
591
  // request alive for other responders, but surface it.
580
- logger.error(
581
- "Failed to decode RPC response: " + error.message,
582
- );
592
+ logger.error("Failed to decode RPC response: " + error.message);
583
593
  this.events.dispatchEvent(
584
594
  new CustomEvent<CodecErrorEvent>("codecError", {
585
595
  detail: {
@@ -608,153 +618,238 @@ export class RPC<Q, R> extends Program<RPCSetupOptions<Q, R>, RPCEvents<Q, R>> {
608
618
  request: Q,
609
619
  options?: RPCRequestOptions<R>,
610
620
  ): Promise<RPCResponse<R>[]> {
611
- const requestSignal = options?.signal;
612
- const getAbortReason = (signal?: AbortSignal): unknown =>
613
- signal?.reason === undefined ? new AbortError() : signal.reason;
614
- if (requestSignal?.aborted) {
615
- throw getAbortReason(requestSignal);
616
- }
617
-
618
- let rejectSetupForAbort!: (reason?: unknown) => void;
619
- const setupAbortPromise = new Promise<never>((_resolve, reject) => {
620
- rejectSetupForAbort = reject;
621
- });
622
- const setupAbortListener = () => {
623
- rejectSetupForAbort(getAbortReason(requestSignal));
621
+ const profile = createDiagnosticTrace(options?.profile, "rpc", "rpc");
622
+ let resultsForProfile: RPCResponse<R>[] | undefined;
623
+ let respondersForProfile: Set<string> | undefined;
624
+ let expectedCount: number | undefined;
625
+ let effectiveTimeoutMs: number | undefined;
626
+ let deadlineFired = false;
627
+ let abortCause: unknown;
628
+ let abortKind: string | undefined;
629
+ const recordAbort = (cause: unknown, kind: string): unknown => {
630
+ // The request promise keeps its first rejection even if another
631
+ // lifecycle callback runs before the awaiting continuation resumes.
632
+ if (abortKind === undefined) {
633
+ abortCause = cause;
634
+ abortKind = kind;
635
+ }
636
+ return cause;
624
637
  };
625
- requestSignal?.addEventListener("abort", setupAbortListener, { once: true });
626
- const setupPromise = (async () => {
627
- // We are generatinga new encryption keypair for each send, so we now that when we get the responses, they are encrypted specifcally for me, and for this request
628
- // this allows us to easily disregard a bunch of message just beacuse they are for a different receiver!
629
- const keypair = await X25519Keypair.create();
638
+ let outcome = "failed";
639
+ let reason = "error";
640
+ try {
641
+ const requestSignal = options?.signal;
642
+ const getAbortReason = (signal?: AbortSignal): unknown =>
643
+ signal?.reason === undefined ? new AbortError() : signal.reason;
630
644
  if (requestSignal?.aborted) {
631
- throw getAbortReason(requestSignal);
645
+ throw recordAbort(getAbortReason(requestSignal), "signal");
632
646
  }
633
- const requestMessage = await this.seal(
634
- request,
635
- keypair.publicKey,
636
- options,
637
- );
638
- return { keypair, requestBytes: serialize(requestMessage) };
639
- })();
640
- let setup: Awaited<typeof setupPromise>;
641
- try {
642
- setup = await Promise.race([setupPromise, setupAbortPromise]);
643
- } finally {
644
- requestSignal?.removeEventListener("abort", setupAbortListener);
645
- }
646
- const { keypair, requestBytes } = setup;
647
- if (requestSignal?.aborted) {
648
- throw getAbortReason(requestSignal);
649
- }
650
-
651
- const allResults: RPCResponse<R>[] = [];
652
647
 
653
- const deferredPromise = pDefer<void>();
654
- const publishAbortController = new AbortController();
655
- const abortPublish = (reason: unknown) => {
656
- if (!publishAbortController.signal.aborted) {
657
- publishAbortController.abort(reason);
648
+ let rejectSetupForAbort!: (reason?: unknown) => void;
649
+ const setupAbortPromise = new Promise<never>((_resolve, reject) => {
650
+ rejectSetupForAbort = reject;
651
+ });
652
+ const setupAbortListener = () => {
653
+ rejectSetupForAbort(
654
+ recordAbort(getAbortReason(requestSignal), "signal"),
655
+ );
656
+ };
657
+ requestSignal?.addEventListener("abort", setupAbortListener, {
658
+ once: true,
659
+ });
660
+ const setupStartedAt = profile?.now();
661
+ profile?.emit({ name: "rpc.request.setup", details: { edge: "start" } });
662
+ const setupPromise = (async () => {
663
+ try {
664
+ // We are generatinga new encryption keypair for each send, so we now that when we get the responses, they are encrypted specifcally for me, and for this request
665
+ // this allows us to easily disregard a bunch of message just beacuse they are for a different receiver!
666
+ const keypair = await X25519Keypair.create();
667
+ if (requestSignal?.aborted) {
668
+ throw recordAbort(getAbortReason(requestSignal), "signal");
669
+ }
670
+ const requestMessage = await this.seal(
671
+ request,
672
+ keypair.publicKey,
673
+ options,
674
+ );
675
+ const result = { keypair, requestBytes: serialize(requestMessage) };
676
+ profile?.emit({
677
+ name: "rpc.request.setup",
678
+ durationMs: profile.now() - setupStartedAt!,
679
+ details: { edge: "end", outcome: "fulfilled" },
680
+ });
681
+ return result;
682
+ } catch (error) {
683
+ profile?.emit({
684
+ name: "rpc.request.setup",
685
+ durationMs: profile.now() - setupStartedAt!,
686
+ details: { edge: "end", outcome: "rejected" },
687
+ });
688
+ throw error;
689
+ }
690
+ })();
691
+ let setup: Awaited<typeof setupPromise>;
692
+ try {
693
+ setup = await Promise.race([setupPromise, setupAbortPromise]);
694
+ } finally {
695
+ requestSignal?.removeEventListener("abort", setupAbortListener);
696
+ }
697
+ const { keypair, requestBytes } = setup;
698
+ if (requestSignal?.aborted) {
699
+ throw recordAbort(getAbortReason(requestSignal), "signal");
658
700
  }
659
- };
660
-
661
- if (this.closed) {
662
- throw new AbortError("Closed");
663
- }
664
- const timeoutFn = setTimeout(
665
- () => {
666
- abortPublish(new AbortError("RPC request timeout"));
667
- deferredPromise.resolve();
668
- },
669
- options?.timeout || 10 * 1000,
670
- );
671
-
672
- const rejectForAbort = (signal?: AbortSignal) => {
673
- const reason = getAbortReason(signal);
674
- abortPublish(reason);
675
- deferredPromise.reject(reason);
676
- };
677
- const abortListener = (event: Event) => {
678
- rejectForAbort(event.target as AbortSignal | undefined);
679
- };
680
- requestSignal?.addEventListener("abort", abortListener);
681
- // Cover the narrow handoff between the setup listener and the active request
682
- // listener before registering any resolver or transport side effects.
683
- if (requestSignal?.aborted) {
684
- const reason = getAbortReason(requestSignal);
685
- abortPublish(reason);
686
- clearTimeout(timeoutFn);
687
- requestSignal.removeEventListener("abort", abortListener);
688
- throw reason;
689
- }
690
-
691
- const closeListener = () => {
692
- const reason = new AbortError("Closed");
693
- abortPublish(reason);
694
- deferredPromise.reject(reason);
695
- };
696
- const dropListener = () => {
697
- const reason = new AbortError("Dropped");
698
- abortPublish(reason);
699
- deferredPromise.reject(reason);
700
- };
701
-
702
- this.events.addEventListener("close", closeListener);
703
- this.events.addEventListener("drop", dropListener);
704
-
705
- const expectedResponders = getExpectedResponders(options?.mode);
706
-
707
- const responders = new Set<string>();
708
701
 
709
- const messageId = randomBytes(32);
710
- const id = toBase64(messageId);
702
+ const allResults: RPCResponse<R>[] = [];
703
+ if (profile) resultsForProfile = allResults;
711
704
 
712
- const responseHandler = this.createResponseHandler(
713
- deferredPromise,
714
- keypair,
715
- allResults,
716
- responders,
717
- expectedResponders,
718
- options,
719
- );
720
- this._responseResolver.set(id, responseHandler);
721
- void deferredPromise.promise
722
- .finally(() => {
723
- abortPublish(new AbortError("Resolved early"));
724
- })
725
- .catch(() => {});
705
+ const deferredPromise = pDefer<void>();
706
+ const publishAbortController = new AbortController();
707
+ const abortPublish = (reason: unknown) => {
708
+ if (!publishAbortController.signal.aborted) {
709
+ publishAbortController.abort(reason);
710
+ }
711
+ };
726
712
 
727
- try {
728
- if (requestSignal?.aborted) {
729
- throw getAbortReason(requestSignal);
713
+ if (this.closed) {
714
+ throw recordAbort(new AbortError("Closed"), "closed");
730
715
  }
731
- if (options?.responseInterceptor) {
732
- options.responseInterceptor((response: RPCResponse<R>) => {
733
- return this.handleDecodedResponse(
734
- response,
735
- deferredPromise,
736
- allResults,
737
- responders,
738
- expectedResponders,
739
- options,
740
- );
716
+ const timeoutMs = options?.timeout || 10 * 1000;
717
+ if (profile) effectiveTimeoutMs = timeoutMs;
718
+ const timeoutFn = setTimeout(() => {
719
+ deadlineFired = true;
720
+ profile?.emit({
721
+ name: "rpc.request.deadline",
722
+ details: {
723
+ timeoutMs,
724
+ expectedResponders: expectedCount,
725
+ receivedResponses: allResults.length,
726
+ unresolvedResponders:
727
+ expectedCount === undefined
728
+ ? undefined
729
+ : expectedCount - (respondersForProfile?.size ?? 0),
730
+ },
741
731
  });
742
- }
732
+ abortPublish(new AbortError("RPC request timeout"));
733
+ deferredPromise.resolve();
734
+ }, timeoutMs);
735
+
736
+ const rejectForAbort = (signal?: AbortSignal) => {
737
+ const reason = getAbortReason(signal);
738
+ recordAbort(reason, "signal");
739
+ abortPublish(reason);
740
+ deferredPromise.reject(reason);
741
+ };
742
+ const abortListener = (event: Event) => {
743
+ rejectForAbort(event.target as AbortSignal | undefined);
744
+ };
745
+ requestSignal?.addEventListener("abort", abortListener);
746
+ // Cover the narrow handoff between the setup listener and the active request
747
+ // listener before registering any resolver or transport side effects.
743
748
  if (requestSignal?.aborted) {
744
- throw getAbortReason(requestSignal);
749
+ const reason = getAbortReason(requestSignal);
750
+ recordAbort(reason, "signal");
751
+ abortPublish(reason);
752
+ clearTimeout(timeoutFn);
753
+ requestSignal.removeEventListener("abort", abortListener);
754
+ throw reason;
755
+ }
756
+
757
+ const closeListener = () => {
758
+ const reason = new AbortError("Closed");
759
+ recordAbort(reason, "closed");
760
+ abortPublish(reason);
761
+ deferredPromise.reject(reason);
762
+ };
763
+ const dropListener = () => {
764
+ const reason = new AbortError("Dropped");
765
+ recordAbort(reason, "dropped");
766
+ abortPublish(reason);
767
+ deferredPromise.reject(reason);
768
+ };
769
+
770
+ this.events.addEventListener("close", closeListener);
771
+ this.events.addEventListener("drop", dropListener);
772
+
773
+ const expectedResponders = getExpectedResponders(options?.mode);
774
+
775
+ const responders = new Set<string>();
776
+ if (profile) {
777
+ expectedCount = expectedResponders?.size;
778
+ respondersForProfile = responders;
745
779
  }
746
- const publishPromise = Promise.resolve()
747
- .then(() =>
748
- this.node.services.pubsub.publish(
780
+
781
+ const messageId = randomBytes(32);
782
+ const id = toBase64(messageId);
783
+
784
+ const responseHandler = this.createResponseHandler(
785
+ deferredPromise,
786
+ keypair,
787
+ allResults,
788
+ responders,
789
+ expectedResponders,
790
+ options,
791
+ profile,
792
+ );
793
+ this._responseResolver.set(id, responseHandler);
794
+ void deferredPromise.promise
795
+ .finally(() => {
796
+ abortPublish(new AbortError("Resolved early"));
797
+ })
798
+ .catch(() => {});
799
+
800
+ try {
801
+ if (requestSignal?.aborted) {
802
+ throw recordAbort(getAbortReason(requestSignal), "signal");
803
+ }
804
+ if (options?.responseInterceptor) {
805
+ options.responseInterceptor((response: RPCResponse<R>) => {
806
+ return this.handleDecodedResponse(
807
+ response,
808
+ deferredPromise,
809
+ allResults,
810
+ responders,
811
+ expectedResponders,
812
+ options,
813
+ profile,
814
+ );
815
+ });
816
+ }
817
+ if (requestSignal?.aborted) {
818
+ throw recordAbort(getAbortReason(requestSignal), "signal");
819
+ }
820
+ let publishStartedAt: number | undefined;
821
+ const rawPublishPromise = Promise.resolve().then(() => {
822
+ publishStartedAt = profile?.now();
823
+ profile?.emit({
824
+ name: "rpc.request.publish",
825
+ details: { edge: "start" },
826
+ });
827
+ return this.node.services.pubsub.publish(
749
828
  requestBytes,
750
829
  this.getPublishOptions(
751
830
  messageId,
752
831
  options,
753
832
  publishAbortController.signal,
754
833
  ),
755
- ),
756
- )
757
- .catch((error: any) => {
834
+ );
835
+ });
836
+ if (profile) {
837
+ void rawPublishPromise.then(
838
+ () =>
839
+ profile.emit({
840
+ name: "rpc.request.publish",
841
+ durationMs: profile.now() - publishStartedAt!,
842
+ details: { edge: "end", outcome: "fulfilled" },
843
+ }),
844
+ () =>
845
+ profile.emit({
846
+ name: "rpc.request.publish",
847
+ durationMs: profile.now() - publishStartedAt!,
848
+ details: { edge: "end", outcome: "rejected" },
849
+ }),
850
+ );
851
+ }
852
+ const publishPromise = rawPublishPromise.catch((error: any) => {
758
853
  if (
759
854
  publishAbortController.signal.aborted &&
760
855
  (error instanceof AbortError ||
@@ -768,18 +863,47 @@ export class RPC<Q, R> extends Program<RPCSetupOptions<Q, R>, RPCEvents<Q, R>> {
768
863
  }
769
864
  throw error;
770
865
  });
771
- await Promise.race([publishPromise, deferredPromise.promise]);
772
- await deferredPromise.promise;
866
+ await Promise.race([publishPromise, deferredPromise.promise]);
867
+ await deferredPromise.promise;
868
+ } finally {
869
+ abortPublish(new AbortError("RPC request finished"));
870
+ clearTimeout(timeoutFn);
871
+ this.events.removeEventListener("close", closeListener);
872
+ this.events.removeEventListener("drop", dropListener);
873
+ requestSignal?.removeEventListener("abort", abortListener);
874
+ this._responseResolver.delete(id);
875
+ }
876
+
877
+ outcome =
878
+ deadlineFired &&
879
+ expectedResponders &&
880
+ responders.size < expectedResponders.size
881
+ ? "partial"
882
+ : "fulfilled";
883
+ reason = deadlineFired ? "deadline" : "responses";
884
+ return allResults;
885
+ } catch (error) {
886
+ if (abortKind && error === abortCause) {
887
+ outcome = "aborted";
888
+ reason = abortKind;
889
+ }
890
+ throw error;
773
891
  } finally {
774
- abortPublish(new AbortError("RPC request finished"));
775
- clearTimeout(timeoutFn);
776
- this.events.removeEventListener("close", closeListener);
777
- this.events.removeEventListener("drop", dropListener);
778
- requestSignal?.removeEventListener("abort", abortListener);
779
- this._responseResolver.delete(id);
892
+ profile?.finish({
893
+ name: "rpc.request.settle",
894
+ details: {
895
+ outcome,
896
+ reason,
897
+ timeoutMs: effectiveTimeoutMs,
898
+ expectedResponders: expectedCount,
899
+ receivedResponses: resultsForProfile?.length ?? 0,
900
+ unresolvedResponders:
901
+ expectedCount === undefined
902
+ ? undefined
903
+ : expectedCount - (respondersForProfile?.size ?? 0),
904
+ },
905
+ });
780
906
  }
781
-
782
- return allResults;
783
907
  }
784
908
 
785
909
  public get topic(): string {
package/src/io.ts CHANGED
@@ -4,6 +4,7 @@ import type {
4
4
  X25519Keypair,
5
5
  X25519PublicKey,
6
6
  } from "@peerbit/crypto";
7
+ import type { DiagnosticSink } from "@peerbit/diagnostics";
7
8
  import { logger as loggerFn } from "@peerbit/logger";
8
9
  import type {
9
10
  DataMessage,
@@ -22,6 +23,8 @@ export type RPCRequestResponseOptions<R> = {
22
23
  isTrusted?: (publicKey: PublicSignKey) => Promise<boolean>;
23
24
  onResponse?: (response: R, from?: PublicSignKey) => void;
24
25
  signal?: AbortSignal;
26
+ /** Bounded, best-effort request timing; publish/response events are not delivery proofs. */
27
+ profile?: DiagnosticSink;
25
28
  };
26
29
 
27
30
  export type RequestResponseInterceptor<R> = {