@lodestar/beacon-node 1.50.0-dev.0837ebd402 → 1.50.0-dev.08c4bed201

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,18 +1,22 @@
1
1
  import { ResponseIncoming, ResponseOutgoing } from "@lodestar/reqresp";
2
- import { AsyncIterableEventBus, IteratorEvent, RequestEvent } from "../../util/asyncIterableToEvents.js";
2
+ import { AsyncIterableEventBus, IteratorEvent, RequestCancelEvent, RequestEvent } from "../../util/asyncIterableToEvents.js";
3
3
  import { StrictEventEmitterSingleArg } from "../../util/strictEvents.js";
4
4
  import { EventDirection } from "../events.js";
5
5
  import { IncomingRequestArgs, OutgoingRequestArgs } from "../reqresp/types.js";
6
6
  export declare enum ReqRespBridgeEvent {
7
7
  outgoingRequest = "reqresp.outgoingRequest",
8
+ outgoingRequestCancel = "reqresp.outgoingRequestCancel",
8
9
  outgoingResponse = "reqresp.outgoingResponse",
9
10
  incomingRequest = "reqresp.incomingRequest",
11
+ incomingRequestCancel = "reqresp.incomingRequestCancel",
10
12
  incomingResponse = "reqresp.incomingResponse"
11
13
  }
12
14
  export type ReqRespBridgeEventData = {
13
15
  [ReqRespBridgeEvent.outgoingRequest]: RequestEvent<OutgoingRequestArgs>;
16
+ [ReqRespBridgeEvent.outgoingRequestCancel]: RequestCancelEvent;
14
17
  [ReqRespBridgeEvent.outgoingResponse]: IteratorEvent<ResponseOutgoing>;
15
18
  [ReqRespBridgeEvent.incomingRequest]: RequestEvent<IncomingRequestArgs>;
19
+ [ReqRespBridgeEvent.incomingRequestCancel]: RequestCancelEvent;
16
20
  [ReqRespBridgeEvent.incomingResponse]: IteratorEvent<ResponseIncoming>;
17
21
  };
18
22
  type IReqRespBridgeEventBus = StrictEventEmitterSingleArg<ReqRespBridgeEventData>;
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/network/core/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAC,qBAAqB,EAAE,aAAa,EAAE,YAAY,EAAC,MAAM,qCAAqC,CAAC;AACvG,OAAO,EAAC,2BAA2B,EAAC,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAC,mBAAmB,EAAE,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AAE7E,oBAAY,kBAAkB;IAC5B,eAAe,4BAA4B;IAC3C,gBAAgB,6BAA6B;IAC7C,eAAe,4BAA4B;IAC3C,gBAAgB,6BAA6B;CAC9C;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;IACxE,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;IACvE,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;IACxE,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;CACxE,CAAC;AAEF,KAAK,sBAAsB,GAAG,2BAA2B,CAAC,sBAAsB,CAAC,CAAC;oDAEb,sBAAsB;AAA3F,qBAAa,qBAAsB,SAAQ,0BAAkD;CAAG;AAGhG,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,kBAAkB,EAAE,cAAc,CAKlF,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,sBAAsB,GAC7B,qBAAqB,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAO9D;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,sBAAsB,GAC7B,qBAAqB,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAO9D;AAED,oBAAY,4BAA4B;IACtC,YAAY,iBAAiB;IAC7B,mBAAmB,wBAAwB;CAC5C"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/network/core/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,mBAAmB,CAAC;AACrE,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,kBAAkB,EAClB,YAAY,EACb,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAC,2BAA2B,EAAC,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAC,mBAAmB,EAAE,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AAE7E,oBAAY,kBAAkB;IAC5B,eAAe,4BAA4B;IAC3C,qBAAqB,kCAAkC;IACvD,gBAAgB,6BAA6B;IAC7C,eAAe,4BAA4B;IAC3C,qBAAqB,kCAAkC;IACvD,gBAAgB,6BAA6B;CAC9C;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;IACxE,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,EAAE,kBAAkB,CAAC;IAC/D,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;IACvE,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;IACxE,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,EAAE,kBAAkB,CAAC;IAC/D,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;CACxE,CAAC;AAEF,KAAK,sBAAsB,GAAG,2BAA2B,CAAC,sBAAsB,CAAC,CAAC;oDAEb,sBAAsB;AAA3F,qBAAa,qBAAsB,SAAQ,0BAAkD;CAAG;AAGhG,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,kBAAkB,EAAE,cAAc,CAOlF,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,sBAAsB,GAC7B,qBAAqB,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAS9D;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,sBAAsB,GAC7B,qBAAqB,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAS9D;AAED,oBAAY,4BAA4B;IACtC,YAAY,iBAAiB;IAC7B,mBAAmB,wBAAwB;CAC5C"}
@@ -3,8 +3,10 @@ import { EventDirection } from "../events.js";
3
3
  export var ReqRespBridgeEvent;
4
4
  (function (ReqRespBridgeEvent) {
5
5
  ReqRespBridgeEvent["outgoingRequest"] = "reqresp.outgoingRequest";
6
+ ReqRespBridgeEvent["outgoingRequestCancel"] = "reqresp.outgoingRequestCancel";
6
7
  ReqRespBridgeEvent["outgoingResponse"] = "reqresp.outgoingResponse";
7
8
  ReqRespBridgeEvent["incomingRequest"] = "reqresp.incomingRequest";
9
+ ReqRespBridgeEvent["incomingRequestCancel"] = "reqresp.incomingRequestCancel";
8
10
  ReqRespBridgeEvent["incomingResponse"] = "reqresp.incomingResponse";
9
11
  })(ReqRespBridgeEvent || (ReqRespBridgeEvent = {}));
10
12
  export class ReqRespBridgeEventBus extends EventEmitter {
@@ -12,23 +14,29 @@ export class ReqRespBridgeEventBus extends EventEmitter {
12
14
  // NOTE: If the same event is on this two arrays it can create an infinite cycle
13
15
  export const reqRespBridgeEventDirection = {
14
16
  [ReqRespBridgeEvent.outgoingRequest]: EventDirection.mainToWorker,
17
+ [ReqRespBridgeEvent.outgoingRequestCancel]: EventDirection.mainToWorker,
15
18
  [ReqRespBridgeEvent.outgoingResponse]: EventDirection.mainToWorker,
16
19
  [ReqRespBridgeEvent.incomingRequest]: EventDirection.workerToMain,
20
+ [ReqRespBridgeEvent.incomingRequestCancel]: EventDirection.workerToMain,
17
21
  [ReqRespBridgeEvent.incomingResponse]: EventDirection.workerToMain,
18
22
  };
19
23
  export function getReqRespBridgeReqEvents(events) {
20
24
  return {
21
25
  emitRequest: (data) => events.emit(ReqRespBridgeEvent.outgoingRequest, data),
26
+ emitRequestCancel: (data) => events.emit(ReqRespBridgeEvent.outgoingRequestCancel, data),
22
27
  emitResponse: (data) => events.emit(ReqRespBridgeEvent.incomingResponse, data),
23
28
  onRequest: (cb) => events.on(ReqRespBridgeEvent.outgoingRequest, cb),
29
+ onRequestCancel: (cb) => events.on(ReqRespBridgeEvent.outgoingRequestCancel, cb),
24
30
  onResponse: (cb) => events.on(ReqRespBridgeEvent.incomingResponse, cb),
25
31
  };
26
32
  }
27
33
  export function getReqRespBridgeRespEvents(events) {
28
34
  return {
29
35
  emitRequest: (data) => events.emit(ReqRespBridgeEvent.incomingRequest, data),
36
+ emitRequestCancel: (data) => events.emit(ReqRespBridgeEvent.incomingRequestCancel, data),
30
37
  emitResponse: (data) => events.emit(ReqRespBridgeEvent.outgoingResponse, data),
31
38
  onRequest: (cb) => events.on(ReqRespBridgeEvent.incomingRequest, cb),
39
+ onRequestCancel: (cb) => events.on(ReqRespBridgeEvent.incomingRequestCancel, cb),
32
40
  onResponse: (cb) => events.on(ReqRespBridgeEvent.outgoingResponse, cb),
33
41
  };
34
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/network/core/events.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAC;AAIvC,OAAO,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAG5C,MAAM,CAAN,IAAY,kBAKX;AALD,WAAY,kBAAkB;IAC5B,iEAA2C,CAAA;IAC3C,mEAA6C,CAAA;IAC7C,iEAA2C,CAAA;IAC3C,mEAA6C,CAAA;AAC/C,CAAC,EALW,kBAAkB,KAAlB,kBAAkB,QAK7B;AAWD,MAAM,OAAO,qBAAsB,SAAS,YAAiD;CAAG;AAEhG,gFAAgF;AAChF,MAAM,CAAC,MAAM,2BAA2B,GAA+C;IACrF,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,cAAc,CAAC,YAAY;IACjE,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,cAAc,CAAC,YAAY;IAClE,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,cAAc,CAAC,YAAY;IACjE,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,cAAc,CAAC,YAAY;CACnE,CAAC;AAEF,MAAM,UAAU,yBAAyB,CACvC,MAA8B;IAE9B,OAAO;QACL,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,IAAI,CAAC;QAC5E,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,IAAI,CAAC;QAC9E,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,eAAe,EAAE,EAAE,CAAC;QACpE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,EAAE,CAAC;KACvE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,MAA8B;IAE9B,OAAO;QACL,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,IAAI,CAAC;QAC5E,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,IAAI,CAAC;QAC9E,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,eAAe,EAAE,EAAE,CAAC;QACpE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,EAAE,CAAC;KACvE,CAAC;AACJ,CAAC;AAED,MAAM,CAAN,IAAY,4BAGX;AAHD,WAAY,4BAA4B;IACtC,6DAA6B,CAAA;IAC7B,2EAA2C,CAAA;AAC7C,CAAC,EAHW,4BAA4B,KAA5B,4BAA4B,QAGvC"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/network/core/events.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,9 @@ export type RequestEvent<T> = {
3
3
  callArgs: T;
4
4
  id: number;
5
5
  };
6
+ export type RequestCancelEvent = {
7
+ id: number;
8
+ };
6
9
  export declare enum IteratorEventType {
7
10
  next = "iterator.next",
8
11
  done = "iterator.done",
@@ -22,15 +25,17 @@ export type IteratorEvent<V> = {
22
25
  };
23
26
  export type AsyncIterableEventBus<Args, Item> = {
24
27
  emitRequest(data: RequestEvent<Args>): void;
28
+ emitRequestCancel(data: RequestCancelEvent): void;
25
29
  emitResponse(data: IteratorEvent<Item>): void;
26
30
  onRequest(handler: (data: RequestEvent<Args>) => void): void;
31
+ onRequestCancel(handler: (data: RequestCancelEvent) => void): void;
27
32
  onResponse(handler: (data: IteratorEvent<Item>) => void): void;
28
33
  };
29
34
  export declare class AsyncIterableBridgeCaller<Args, Item> {
30
35
  private readonly events;
31
36
  private nextRequestId;
32
37
  private readonly pending;
33
- constructor(events: Pick<AsyncIterableEventBus<Args, Item>, "onResponse" | "emitRequest">);
38
+ constructor(events: Pick<AsyncIterableEventBus<Args, Item>, "onResponse" | "emitRequest" | "emitRequestCancel">);
34
39
  get pendingCount(): number;
35
40
  getAsyncIterable(callArgs: Args): AsyncIterable<Item>;
36
41
  private onResponse;
@@ -38,7 +43,10 @@ export declare class AsyncIterableBridgeCaller<Args, Item> {
38
43
  export declare class AsyncIterableBridgeHandler<Args, Item> {
39
44
  private readonly events;
40
45
  private readonly handler;
41
- constructor(events: Pick<AsyncIterableEventBus<Args, Item>, "onRequest" | "emitResponse">, handler: (args: Args) => AsyncIterable<Item>);
46
+ private readonly iterators;
47
+ constructor(events: Pick<AsyncIterableEventBus<Args, Item>, "onRequest" | "onRequestCancel" | "emitResponse">, handler: (args: Args) => AsyncIterable<Item>);
48
+ get iteratingCount(): number;
42
49
  private onRequest;
50
+ private onRequestCancel;
43
51
  }
44
52
  //# sourceMappingURL=asyncIterableToEvents.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"asyncIterableToEvents.d.ts","sourceRoot":"","sources":["../../src/util/asyncIterableToEvents.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,mBAAmB,EAAiD,MAAM,YAAY,CAAC;AAE/F,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC5B,QAAQ,EAAE,CAAC,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,oBAAY,iBAAiB;IAC3B,IAAI,kBAAkB;IACtB,IAAI,kBAAkB;IACtB,KAAK,mBAAmB;CACzB;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,IACvB;IAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAC,GACnD;IAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,GAC1C;IAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAC,CAAC;AAE5E,MAAM,MAAM,qBAAqB,CAAC,IAAI,EAAE,IAAI,IAAI;IAC9C,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5C,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9C,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7D,UAAU,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;CAChE,CAAC;AASF,qBAAa,yBAAyB,CAAC,IAAI,EAAE,IAAI;IAMnC,OAAO,CAAC,QAAQ,CAAC,MAAM;IALnC,OAAO,CAAC,aAAa,CAAK;IAG1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAEhE,YAA6B,MAAM,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC,EAEzG;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,gBAAgB,CAAC,QAAQ,EAAE,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAkDpD;IAED,OAAO,CAAC,UAAU;CAgCnB;AAED,qBAAa,0BAA0B,CAAC,IAAI,EAAE,IAAI;IAE9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAF1B,YACmB,MAAM,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,EAC7E,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,aAAa,CAAC,IAAI,CAAC,EAG9D;YAEa,SAAS;CAsBxB"}
1
+ {"version":3,"file":"asyncIterableToEvents.d.ts","sourceRoot":"","sources":["../../src/util/asyncIterableToEvents.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,mBAAmB,EAAiD,MAAM,YAAY,CAAC;AAE/F,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC5B,QAAQ,EAAE,CAAC,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,oBAAY,iBAAiB;IAC3B,IAAI,kBAAkB;IACtB,IAAI,kBAAkB;IACtB,KAAK,mBAAmB;CACzB;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,IACvB;IAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAC,GACnD;IAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,GAC1C;IAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAC,CAAC;AAE5E,MAAM,MAAM,qBAAqB,CAAC,IAAI,EAAE,IAAI,IAAI;IAC9C,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5C,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAClD,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9C,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7D,eAAe,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAAC;IACnE,UAAU,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;CAChE,CAAC;AASF,qBAAa,yBAAyB,CAAC,IAAI,EAAE,IAAI;IAO7C,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,aAAa,CAAK;IAG1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAEhE,YACmB,MAAM,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,aAAa,GAAG,mBAAmB,CAAC,EAGrH;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,gBAAgB,CAAC,QAAQ,EAAE,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAqDpD;IAED,OAAO,CAAC,UAAU;CAgCnB;AAED,qBAAa,0BAA0B,CAAC,IAAI,EAAE,IAAI;IAI9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;IAEpE,YACmB,MAAM,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,iBAAiB,GAAG,cAAc,CAAC,EACjG,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,aAAa,CAAC,IAAI,CAAC,EAI9D;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;YAEa,SAAS;IAiCvB,OAAO,CAAC,eAAe;CAUxB"}
@@ -55,7 +55,10 @@ export class AsyncIterableBridgeCaller {
55
55
  },
56
56
  async return() {
57
57
  // This will be reached if the consumer called 'break' or 'return' early in the loop.
58
- self.pending.delete(id);
58
+ // Without the cancel the handler keeps producing items that cross the thread boundary just to be dropped
59
+ if (self.pending.delete(id)) {
60
+ self.events.emitRequestCancel({ id });
61
+ }
59
62
  return { value: undefined, done: true };
60
63
  },
61
64
  };
@@ -92,18 +95,29 @@ export class AsyncIterableBridgeCaller {
92
95
  export class AsyncIterableBridgeHandler {
93
96
  events;
94
97
  handler;
98
+ iterators = new Map();
95
99
  constructor(events, handler) {
96
100
  this.events = events;
97
101
  this.handler = handler;
98
102
  events.onRequest(this.onRequest.bind(this));
103
+ events.onRequestCancel(this.onRequestCancel.bind(this));
104
+ }
105
+ get iteratingCount() {
106
+ return this.iterators.size;
99
107
  }
100
108
  async onRequest(data) {
101
109
  try {
102
- for await (const item of this.handler(data.callArgs)) {
110
+ const iterator = this.handler(data.callArgs)[Symbol.asyncIterator]();
111
+ this.iterators.set(data.id, iterator);
112
+ while (true) {
113
+ const result = await iterator.next();
114
+ if (result.done) {
115
+ break;
116
+ }
103
117
  this.events.emitResponse({
104
118
  type: IteratorEventType.next,
105
119
  id: data.id,
106
- item,
120
+ item: result.value,
107
121
  });
108
122
  }
109
123
  this.events.emitResponse({
@@ -118,6 +132,18 @@ export class AsyncIterableBridgeHandler {
118
132
  error: toThreadBoundaryError(e),
119
133
  });
120
134
  }
135
+ finally {
136
+ this.iterators.delete(data.id);
137
+ }
138
+ }
139
+ onRequestCancel(data) {
140
+ const iterator = this.iterators.get(data.id);
141
+ if (!iterator?.return) {
142
+ return;
143
+ }
144
+ // An async generator queues return() behind the next() that is in flight, so at most one more
145
+ // item is produced before its finally blocks run. Any error surfaces through that next() call.
146
+ void iterator.return().catch(() => { });
121
147
  }
122
148
  }
123
149
  //# sourceMappingURL=asyncIterableToEvents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"asyncIterableToEvents.js","sourceRoot":"","sources":["../../src/util/asyncIterableToEvents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"asyncIterableToEvents.js","sourceRoot":"","sources":["../../src/util/asyncIterableToEvents.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "bugs": {
12
12
  "url": "https://github.com/ChainSafe/lodestar/issues"
13
13
  },
14
- "version": "1.50.0-dev.0837ebd402",
14
+ "version": "1.50.0-dev.08c4bed201",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -127,17 +127,17 @@
127
127
  "@libp2p/prometheus-metrics": "^5.0.28",
128
128
  "@libp2p/tcp": "^11.0.27",
129
129
  "@libp2p/utils": "^7.4.0",
130
- "@lodestar/api": "^1.50.0-dev.0837ebd402",
131
- "@lodestar/config": "^1.50.0-dev.0837ebd402",
132
- "@lodestar/db": "^1.50.0-dev.0837ebd402",
133
- "@lodestar/fork-choice": "^1.50.0-dev.0837ebd402",
134
- "@lodestar/logger": "^1.50.0-dev.0837ebd402",
135
- "@lodestar/params": "^1.50.0-dev.0837ebd402",
136
- "@lodestar/reqresp": "^1.50.0-dev.0837ebd402",
137
- "@lodestar/state-transition": "^1.50.0-dev.0837ebd402",
138
- "@lodestar/types": "^1.50.0-dev.0837ebd402",
139
- "@lodestar/utils": "^1.50.0-dev.0837ebd402",
140
- "@lodestar/validator": "^1.50.0-dev.0837ebd402",
130
+ "@lodestar/api": "^1.50.0-dev.08c4bed201",
131
+ "@lodestar/config": "^1.50.0-dev.08c4bed201",
132
+ "@lodestar/db": "^1.50.0-dev.08c4bed201",
133
+ "@lodestar/fork-choice": "^1.50.0-dev.08c4bed201",
134
+ "@lodestar/logger": "^1.50.0-dev.08c4bed201",
135
+ "@lodestar/params": "^1.50.0-dev.08c4bed201",
136
+ "@lodestar/reqresp": "^1.50.0-dev.08c4bed201",
137
+ "@lodestar/state-transition": "^1.50.0-dev.08c4bed201",
138
+ "@lodestar/types": "^1.50.0-dev.08c4bed201",
139
+ "@lodestar/utils": "^1.50.0-dev.08c4bed201",
140
+ "@lodestar/validator": "^1.50.0-dev.08c4bed201",
141
141
  "@multiformats/multiaddr": "^13.0.1",
142
142
  "datastore-core": "^12.0.1",
143
143
  "datastore-level": "^13.0.1",
@@ -158,8 +158,8 @@
158
158
  "devDependencies": {
159
159
  "@libp2p/interface-internal": "^3.1.12",
160
160
  "@libp2p/logger": "^6.2.13",
161
- "@lodestar/spec-test-util": "^1.50.0-dev.0837ebd402",
162
- "@lodestar/test-utils": "^1.50.0-dev.0837ebd402",
161
+ "@lodestar/spec-test-util": "^1.50.0-dev.08c4bed201",
162
+ "@lodestar/test-utils": "^1.50.0-dev.08c4bed201",
163
163
  "@types/js-yaml": "^4.0.5",
164
164
  "@types/qs": "^6.9.7",
165
165
  "@types/tmp": "^0.2.3",
@@ -174,5 +174,5 @@
174
174
  "beacon",
175
175
  "blockchain"
176
176
  ],
177
- "gitHead": "24816891bf63de795f296996a1149cec3b71af4d"
177
+ "gitHead": "70891683ed33187aca902723b5515d6a164ada13"
178
178
  }
@@ -1,21 +1,30 @@
1
1
  import EventEmitter from "node:events";
2
2
  import {ResponseIncoming, ResponseOutgoing} from "@lodestar/reqresp";
3
- import {AsyncIterableEventBus, IteratorEvent, RequestEvent} from "../../util/asyncIterableToEvents.js";
3
+ import {
4
+ AsyncIterableEventBus,
5
+ IteratorEvent,
6
+ RequestCancelEvent,
7
+ RequestEvent,
8
+ } from "../../util/asyncIterableToEvents.js";
4
9
  import {StrictEventEmitterSingleArg} from "../../util/strictEvents.js";
5
10
  import {EventDirection} from "../events.js";
6
11
  import {IncomingRequestArgs, OutgoingRequestArgs} from "../reqresp/types.js";
7
12
 
8
13
  export enum ReqRespBridgeEvent {
9
14
  outgoingRequest = "reqresp.outgoingRequest",
15
+ outgoingRequestCancel = "reqresp.outgoingRequestCancel",
10
16
  outgoingResponse = "reqresp.outgoingResponse",
11
17
  incomingRequest = "reqresp.incomingRequest",
18
+ incomingRequestCancel = "reqresp.incomingRequestCancel",
12
19
  incomingResponse = "reqresp.incomingResponse",
13
20
  }
14
21
 
15
22
  export type ReqRespBridgeEventData = {
16
23
  [ReqRespBridgeEvent.outgoingRequest]: RequestEvent<OutgoingRequestArgs>;
24
+ [ReqRespBridgeEvent.outgoingRequestCancel]: RequestCancelEvent;
17
25
  [ReqRespBridgeEvent.outgoingResponse]: IteratorEvent<ResponseOutgoing>;
18
26
  [ReqRespBridgeEvent.incomingRequest]: RequestEvent<IncomingRequestArgs>;
27
+ [ReqRespBridgeEvent.incomingRequestCancel]: RequestCancelEvent;
19
28
  [ReqRespBridgeEvent.incomingResponse]: IteratorEvent<ResponseIncoming>;
20
29
  };
21
30
 
@@ -26,8 +35,10 @@ export class ReqRespBridgeEventBus extends (EventEmitter as {new (): IReqRespBri
26
35
  // NOTE: If the same event is on this two arrays it can create an infinite cycle
27
36
  export const reqRespBridgeEventDirection: Record<ReqRespBridgeEvent, EventDirection> = {
28
37
  [ReqRespBridgeEvent.outgoingRequest]: EventDirection.mainToWorker,
38
+ [ReqRespBridgeEvent.outgoingRequestCancel]: EventDirection.mainToWorker,
29
39
  [ReqRespBridgeEvent.outgoingResponse]: EventDirection.mainToWorker,
30
40
  [ReqRespBridgeEvent.incomingRequest]: EventDirection.workerToMain,
41
+ [ReqRespBridgeEvent.incomingRequestCancel]: EventDirection.workerToMain,
31
42
  [ReqRespBridgeEvent.incomingResponse]: EventDirection.workerToMain,
32
43
  };
33
44
 
@@ -36,8 +47,10 @@ export function getReqRespBridgeReqEvents(
36
47
  ): AsyncIterableEventBus<OutgoingRequestArgs, ResponseIncoming> {
37
48
  return {
38
49
  emitRequest: (data) => events.emit(ReqRespBridgeEvent.outgoingRequest, data),
50
+ emitRequestCancel: (data) => events.emit(ReqRespBridgeEvent.outgoingRequestCancel, data),
39
51
  emitResponse: (data) => events.emit(ReqRespBridgeEvent.incomingResponse, data),
40
52
  onRequest: (cb) => events.on(ReqRespBridgeEvent.outgoingRequest, cb),
53
+ onRequestCancel: (cb) => events.on(ReqRespBridgeEvent.outgoingRequestCancel, cb),
41
54
  onResponse: (cb) => events.on(ReqRespBridgeEvent.incomingResponse, cb),
42
55
  };
43
56
  }
@@ -47,8 +60,10 @@ export function getReqRespBridgeRespEvents(
47
60
  ): AsyncIterableEventBus<IncomingRequestArgs, ResponseOutgoing> {
48
61
  return {
49
62
  emitRequest: (data) => events.emit(ReqRespBridgeEvent.incomingRequest, data),
63
+ emitRequestCancel: (data) => events.emit(ReqRespBridgeEvent.incomingRequestCancel, data),
50
64
  emitResponse: (data) => events.emit(ReqRespBridgeEvent.outgoingResponse, data),
51
65
  onRequest: (cb) => events.on(ReqRespBridgeEvent.incomingRequest, cb),
66
+ onRequestCancel: (cb) => events.on(ReqRespBridgeEvent.incomingRequestCancel, cb),
52
67
  onResponse: (cb) => events.on(ReqRespBridgeEvent.outgoingResponse, cb),
53
68
  };
54
69
  }
@@ -6,6 +6,10 @@ export type RequestEvent<T> = {
6
6
  id: number;
7
7
  };
8
8
 
9
+ export type RequestCancelEvent = {
10
+ id: number;
11
+ };
12
+
9
13
  export enum IteratorEventType {
10
14
  next = "iterator.next",
11
15
  done = "iterator.done",
@@ -19,8 +23,10 @@ export type IteratorEvent<V> =
19
23
 
20
24
  export type AsyncIterableEventBus<Args, Item> = {
21
25
  emitRequest(data: RequestEvent<Args>): void;
26
+ emitRequestCancel(data: RequestCancelEvent): void;
22
27
  emitResponse(data: IteratorEvent<Item>): void;
23
28
  onRequest(handler: (data: RequestEvent<Args>) => void): void;
29
+ onRequestCancel(handler: (data: RequestCancelEvent) => void): void;
24
30
  onResponse(handler: (data: IteratorEvent<Item>) => void): void;
25
31
  };
26
32
 
@@ -37,7 +43,9 @@ export class AsyncIterableBridgeCaller<Args, Item> {
37
43
  // TODO: Consider expiring the requests after no reply for long enough, t
38
44
  private readonly pending = new Map<number, PendingItem<Item>>();
39
45
 
40
- constructor(private readonly events: Pick<AsyncIterableEventBus<Args, Item>, "onResponse" | "emitRequest">) {
46
+ constructor(
47
+ private readonly events: Pick<AsyncIterableEventBus<Args, Item>, "onResponse" | "emitRequest" | "emitRequestCancel">
48
+ ) {
41
49
  events.onResponse(this.onResponse.bind(this));
42
50
  }
43
51
 
@@ -89,7 +97,10 @@ export class AsyncIterableBridgeCaller<Args, Item> {
89
97
 
90
98
  async return() {
91
99
  // This will be reached if the consumer called 'break' or 'return' early in the loop.
92
- self.pending.delete(id);
100
+ // Without the cancel the handler keeps producing items that cross the thread boundary just to be dropped
101
+ if (self.pending.delete(id)) {
102
+ self.events.emitRequestCancel({id});
103
+ }
93
104
  return {value: undefined, done: true};
94
105
  },
95
106
  };
@@ -132,20 +143,35 @@ export class AsyncIterableBridgeCaller<Args, Item> {
132
143
  }
133
144
 
134
145
  export class AsyncIterableBridgeHandler<Args, Item> {
146
+ private readonly iterators = new Map<number, AsyncIterator<Item>>();
147
+
135
148
  constructor(
136
- private readonly events: Pick<AsyncIterableEventBus<Args, Item>, "onRequest" | "emitResponse">,
149
+ private readonly events: Pick<AsyncIterableEventBus<Args, Item>, "onRequest" | "onRequestCancel" | "emitResponse">,
137
150
  private readonly handler: (args: Args) => AsyncIterable<Item>
138
151
  ) {
139
152
  events.onRequest(this.onRequest.bind(this));
153
+ events.onRequestCancel(this.onRequestCancel.bind(this));
154
+ }
155
+
156
+ get iteratingCount(): number {
157
+ return this.iterators.size;
140
158
  }
141
159
 
142
160
  private async onRequest(data: RequestEvent<Args>): Promise<void> {
143
161
  try {
144
- for await (const item of this.handler(data.callArgs)) {
162
+ const iterator = this.handler(data.callArgs)[Symbol.asyncIterator]();
163
+ this.iterators.set(data.id, iterator);
164
+
165
+ while (true) {
166
+ const result = await iterator.next();
167
+ if (result.done) {
168
+ break;
169
+ }
170
+
145
171
  this.events.emitResponse({
146
172
  type: IteratorEventType.next,
147
173
  id: data.id,
148
- item,
174
+ item: result.value,
149
175
  });
150
176
  }
151
177
 
@@ -159,6 +185,19 @@ export class AsyncIterableBridgeHandler<Args, Item> {
159
185
  id: data.id,
160
186
  error: toThreadBoundaryError(e as Error),
161
187
  });
188
+ } finally {
189
+ this.iterators.delete(data.id);
190
+ }
191
+ }
192
+
193
+ private onRequestCancel(data: RequestCancelEvent): void {
194
+ const iterator = this.iterators.get(data.id);
195
+ if (!iterator?.return) {
196
+ return;
162
197
  }
198
+
199
+ // An async generator queues return() behind the next() that is in flight, so at most one more
200
+ // item is produced before its finally blocks run. Any error surfaces through that next() call.
201
+ void iterator.return().catch(() => {});
163
202
  }
164
203
  }