@kronos-ts/axon-server 0.5.0 → 0.7.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.
Files changed (68) hide show
  1. package/dist/axon-server-event-store.d.ts.map +1 -1
  2. package/dist/axon-server-event-store.js +72 -77
  3. package/dist/axon-server-event-store.js.map +1 -1
  4. package/dist/axon-server-snapshotting-event-store.d.ts +3 -3
  5. package/dist/axon-server-snapshotting-event-store.d.ts.map +1 -1
  6. package/dist/axon-server-snapshotting-event-store.js +3 -2
  7. package/dist/axon-server-snapshotting-event-store.js.map +1 -1
  8. package/dist/axon-server.d.ts +15 -7
  9. package/dist/axon-server.d.ts.map +1 -1
  10. package/dist/axon-server.js +447 -275
  11. package/dist/axon-server.js.map +1 -1
  12. package/dist/bounded-read.d.ts +19 -0
  13. package/dist/bounded-read.d.ts.map +1 -0
  14. package/dist/bounded-read.js +39 -0
  15. package/dist/bounded-read.js.map +1 -0
  16. package/dist/connection.d.ts +13 -0
  17. package/dist/connection.d.ts.map +1 -1
  18. package/dist/connection.js +78 -40
  19. package/dist/connection.js.map +1 -1
  20. package/dist/control-plane.d.ts +9 -19
  21. package/dist/control-plane.d.ts.map +1 -1
  22. package/dist/control-plane.js +6 -37
  23. package/dist/control-plane.js.map +1 -1
  24. package/dist/event-processor-info.d.ts +5 -23
  25. package/dist/event-processor-info.d.ts.map +1 -1
  26. package/dist/event-processor-info.js +16 -20
  27. package/dist/event-processor-info.js.map +1 -1
  28. package/dist/flow-controlled-sender.d.ts.map +1 -1
  29. package/dist/flow-controlled-sender.js +37 -17
  30. package/dist/flow-controlled-sender.js.map +1 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/outbound-stream.d.ts +5 -9
  35. package/dist/outbound-stream.d.ts.map +1 -1
  36. package/dist/outbound-stream.js +65 -16
  37. package/dist/outbound-stream.js.map +1 -1
  38. package/dist/platform-service.d.ts +10 -1
  39. package/dist/platform-service.d.ts.map +1 -1
  40. package/dist/platform-service.js +70 -10
  41. package/dist/platform-service.js.map +1 -1
  42. package/dist/resilience.d.ts +2 -0
  43. package/dist/resilience.d.ts.map +1 -1
  44. package/dist/resilience.js +2 -1
  45. package/dist/resilience.js.map +1 -1
  46. package/dist/shutdown-latch.d.ts +1 -0
  47. package/dist/shutdown-latch.d.ts.map +1 -1
  48. package/dist/shutdown-latch.js +20 -1
  49. package/dist/shutdown-latch.js.map +1 -1
  50. package/dist/stream-recovery.d.ts +9 -0
  51. package/dist/stream-recovery.d.ts.map +1 -0
  52. package/dist/stream-recovery.js +70 -0
  53. package/dist/stream-recovery.js.map +1 -0
  54. package/package.json +2 -2
  55. package/src/axon-server-event-store.ts +77 -79
  56. package/src/axon-server-snapshotting-event-store.ts +10 -7
  57. package/src/axon-server.ts +417 -316
  58. package/src/bounded-read.ts +43 -0
  59. package/src/connection.ts +77 -45
  60. package/src/control-plane.ts +19 -63
  61. package/src/event-processor-info.ts +22 -43
  62. package/src/flow-controlled-sender.ts +33 -14
  63. package/src/index.ts +0 -1
  64. package/src/outbound-stream.ts +57 -27
  65. package/src/platform-service.ts +75 -11
  66. package/src/resilience.ts +6 -2
  67. package/src/shutdown-latch.ts +14 -1
  68. package/src/stream-recovery.ts +72 -0
@@ -1 +1 @@
1
- {"version":3,"file":"event-processor-info.d.ts","sourceRoot":"","sources":["../src/event-processor-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAoC,MAAM,wBAAwB,CAAA;AAElG;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,CAAA;IACzC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAA;IACtC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,kBAAkB,CAahF;AAaD;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,eAAe,EAAE,CAAA"}
1
+ {"version":3,"file":"event-processor-info.d.ts","sourceRoot":"","sources":["../src/event-processor-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAEhE;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,kBAAkB,CAsBhF;AAED,MAAM,MAAM,uBAAuB,GAAG,MAAM,eAAe,EAAE,CAAA"}
@@ -1,28 +1,24 @@
1
- /**
2
- * Converts a ProcessorStatus to the proto EventProcessorInfo format.
3
- */
4
1
  export function toEventProcessorInfo(status) {
5
2
  return {
6
3
  processorName: status.name,
7
- mode: status.mode,
8
- activeThreads: status.activeThreads,
4
+ mode: "Tracking",
5
+ activeThreads: status.running ? 1 : 0,
9
6
  running: status.running,
10
- error: status.error,
11
- segmentStatus: status.segments.map(toSegmentStatus),
12
- availableThreads: status.availableThreads,
13
- tokenStoreIdentifier: status.tokenStoreIdentifier,
14
- isStreamingProcessor: status.isStreamingProcessor,
7
+ error: status.error !== undefined,
8
+ segmentStatus: [
9
+ {
10
+ segmentId: 0,
11
+ caughtUp: status.caughtUp,
12
+ replaying: status.replaying,
13
+ onePartOf: 1,
14
+ tokenPosition: status.position,
15
+ errorState: status.error ?? "",
16
+ },
17
+ ],
18
+ availableThreads: 0,
19
+ tokenStoreIdentifier: "",
20
+ isStreamingProcessor: true,
15
21
  loadBalancingStrategyName: "",
16
22
  };
17
23
  }
18
- function toSegmentStatus(seg) {
19
- return {
20
- segmentId: seg.segmentId,
21
- caughtUp: seg.caughtUp,
22
- replaying: seg.replaying,
23
- onePartOf: seg.onePartOf,
24
- tokenPosition: seg.tokenPosition,
25
- errorState: seg.errorState,
26
- };
27
- }
28
24
  //# sourceMappingURL=event-processor-info.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-processor-info.js","sourceRoot":"","sources":["../src/event-processor-info.ts"],"names":[],"mappings":"AA4BA;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAuB;IAC1D,OAAO;QACL,aAAa,EAAE,MAAM,CAAC,IAAI;QAC1B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;QACnD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;QACjD,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;QACjD,yBAAyB,EAAE,EAAE;KAC9B,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,GAAkB;IACzC,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,UAAU,EAAE,GAAG,CAAC,UAAU;KAC3B,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"event-processor-info.js","sourceRoot":"","sources":["../src/event-processor-info.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,oBAAoB,CAAC,MAAuB;IAC1D,OAAO;QACL,aAAa,EAAE,MAAM,CAAC,IAAI;QAC1B,IAAI,EAAE,UAAU;QAChB,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS;QACjC,aAAa,EAAE;YACb;gBACE,SAAS,EAAE,CAAC;gBACZ,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,SAAS,EAAE,CAAC;gBACZ,aAAa,EAAE,MAAM,CAAC,QAAQ;gBAC9B,UAAU,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;aAC/B;SACF;QACD,gBAAgB,EAAE,CAAC;QACnB,oBAAoB,EAAE,EAAE;QACxB,oBAAoB,EAAE,IAAI;QAC1B,yBAAyB,EAAE,EAAE;KAC9B,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"flow-controlled-sender.d.ts","sourceRoot":"","sources":["../src/flow-controlled-sender.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI;IACpC,uDAAuD;IACvD,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAA;IACxB,8CAA8C;IAC9C,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,oCAAoC;IACpC,QAAQ,IAAI,IAAI,CAAA;IAChB,yCAAyC;IACzC,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACzC,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,EACxB,UAAU,CAAC,EAAE,MAAM,IAAI,EACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,EAChC,aAAa,GAAE,MAAY,GAC1B,oBAAoB,CAAC,CAAC,CAAC,CAwDzB"}
1
+ {"version":3,"file":"flow-controlled-sender.d.ts","sourceRoot":"","sources":["../src/flow-controlled-sender.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI;IACpC,uDAAuD;IACvD,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAA;IACxB,8CAA8C;IAC9C,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,oCAAoC;IACpC,QAAQ,IAAI,IAAI,CAAA;IAChB,yCAAyC;IACzC,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACzC,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,EACxB,UAAU,CAAC,EAAE,MAAM,IAAI,EACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,EAChC,aAAa,GAAE,MAAY,GAC1B,oBAAoB,CAAC,CAAC,CAAC,CA2EzB"}
@@ -6,28 +6,49 @@
6
6
  * @param maxBufferSize Maximum number of updates to buffer. Default: 256.
7
7
  */
8
8
  export function flowControlledSender(send, onComplete, onError, maxBufferSize = 256) {
9
+ if (!Number.isSafeInteger(maxBufferSize) || maxBufferSize <= 0)
10
+ throw new RangeError("maxBufferSize must be a positive integer");
9
11
  const buffer = [];
10
12
  let permits = 0;
11
13
  let isActive = true;
14
+ let completionRequested = false;
15
+ function fail(error) {
16
+ if (!isActive)
17
+ return;
18
+ isActive = false;
19
+ buffer.length = 0;
20
+ onError?.(error);
21
+ }
22
+ function sendOne(value) {
23
+ try {
24
+ send(value);
25
+ }
26
+ catch (error) {
27
+ fail(error instanceof Error ? error : new Error(String(error)));
28
+ throw error;
29
+ }
30
+ }
31
+ function finishIfDrained() {
32
+ if (isActive && completionRequested && !buffer.length) {
33
+ isActive = false;
34
+ onComplete?.();
35
+ }
36
+ }
12
37
  function drain() {
13
38
  while (permits > 0 && buffer.length > 0 && isActive) {
14
39
  const value = buffer.shift();
15
40
  permits--;
16
- try {
17
- send(value);
18
- }
19
- catch (err) {
20
- console.warn("FlowControlledSender: send error", err);
21
- }
41
+ sendOne(value);
22
42
  }
43
+ finishIfDrained();
23
44
  }
24
45
  return {
25
46
  offer(value) {
26
- if (!isActive)
47
+ if (!isActive || completionRequested)
27
48
  return false;
28
49
  if (permits > 0) {
29
50
  permits--;
30
- send(value);
51
+ sendOne(value);
31
52
  return true;
32
53
  }
33
54
  if (buffer.length >= maxBufferSize) {
@@ -37,23 +58,22 @@ export function flowControlledSender(send, onComplete, onError, maxBufferSize =
37
58
  return true;
38
59
  },
39
60
  addPermits(count) {
61
+ if (!Number.isSafeInteger(count) || count <= 0 || !Number.isSafeInteger(permits + count))
62
+ throw new RangeError("Permits must be positive safe integers");
63
+ if (!isActive)
64
+ return;
40
65
  permits += count;
41
66
  drain();
42
67
  },
43
68
  complete() {
44
- isActive = false;
45
- buffer.length = 0;
46
- if (onComplete)
47
- onComplete();
69
+ completionRequested = true;
70
+ finishIfDrained();
48
71
  },
49
72
  completeExceptionally(error) {
50
- isActive = false;
51
- buffer.length = 0;
52
- if (onError)
53
- onError(error);
73
+ fail(error);
54
74
  },
55
75
  get active() {
56
- return isActive;
76
+ return isActive && !completionRequested;
57
77
  },
58
78
  };
59
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"flow-controlled-sender.js","sourceRoot":"","sources":["../src/flow-controlled-sender.ts"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAwB,EACxB,UAAuB,EACvB,OAAgC,EAChC,aAAa,GAAW,GAAG;IAE3B,MAAM,MAAM,GAAQ,EAAE,CAAA;IACtB,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,IAAI,QAAQ,GAAG,IAAI,CAAA;IAEnB,SAAS,KAAK;QACZ,OAAO,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAG,CAAA;YAC7B,OAAO,EAAE,CAAA;YACT,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,CAAA;YACb,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAA;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,CAAC,KAAQ;YACZ,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAA;YAE3B,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,OAAO,EAAE,CAAA;gBACT,IAAI,CAAC,KAAK,CAAC,CAAA;gBACX,OAAO,IAAI,CAAA;YACb,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAA;YACd,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,UAAU,CAAC,KAAa;YACtB,OAAO,IAAI,KAAK,CAAA;YAChB,KAAK,EAAE,CAAA;QACT,CAAC;QAED,QAAQ;YACN,QAAQ,GAAG,KAAK,CAAA;YAChB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;YACjB,IAAI,UAAU;gBAAE,UAAU,EAAE,CAAA;QAC9B,CAAC;QAED,qBAAqB,CAAC,KAAY;YAChC,QAAQ,GAAG,KAAK,CAAA;YAChB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;YACjB,IAAI,OAAO;gBAAE,OAAO,CAAC,KAAK,CAAC,CAAA;QAC7B,CAAC;QAED,IAAI,MAAM;YACR,OAAO,QAAQ,CAAA;QACjB,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"flow-controlled-sender.js","sourceRoot":"","sources":["../src/flow-controlled-sender.ts"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAwB,EACxB,UAAuB,EACvB,OAAgC,EAChC,aAAa,GAAW,GAAG;IAE3B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,aAAa,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,0CAA0C,CAAC,CAAA;IAChI,MAAM,MAAM,GAAQ,EAAE,CAAA;IACtB,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,IAAI,QAAQ,GAAG,IAAI,CAAA;IACnB,IAAI,mBAAmB,GAAG,KAAK,CAAA;IAE/B,SAAS,IAAI,CAAC,KAAY;QACxB,IAAI,CAAC,QAAQ;YAAE,OAAM;QACrB,QAAQ,GAAG,KAAK,CAAA;QAChB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;QACjB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;IAClB,CAAC;IACD,SAAS,OAAO,CAAC,KAAQ;QACvB,IAAI,CAAC;YAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAAC,CAAC;QACnB,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAC/D,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IACD,SAAS,eAAe;QACtB,IAAI,QAAQ,IAAI,mBAAmB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACtD,QAAQ,GAAG,KAAK,CAAA;YAChB,UAAU,EAAE,EAAE,CAAA;QAChB,CAAC;IACH,CAAC;IAGD,SAAS,KAAK;QACZ,OAAO,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAG,CAAA;YAC7B,OAAO,EAAE,CAAA;YACT,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC;QACD,eAAe,EAAE,CAAA;IACnB,CAAC;IAED,OAAO;QACL,KAAK,CAAC,KAAQ;YACZ,IAAI,CAAC,QAAQ,IAAI,mBAAmB;gBAAE,OAAO,KAAK,CAAA;YAElD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,OAAO,EAAE,CAAA;gBACT,OAAO,CAAC,KAAK,CAAC,CAAA;gBACd,OAAO,IAAI,CAAA;YACb,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAA;YACd,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,UAAU,CAAC,KAAa;YACtB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,GAAG,KAAK,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,wCAAwC,CAAC,CAAA;YACxJ,IAAI,CAAC,QAAQ;gBAAE,OAAM;YACrB,OAAO,IAAI,KAAK,CAAA;YAChB,KAAK,EAAE,CAAA;QACT,CAAC;QAED,QAAQ;YACN,mBAAmB,GAAG,IAAI,CAAA;YAC1B,eAAe,EAAE,CAAA;QACnB,CAAC;QAED,qBAAqB,CAAC,KAAY;YAChC,IAAI,CAAC,KAAK,CAAC,CAAA;QACb,CAAC;QAED,IAAI,MAAM;YACR,OAAO,QAAQ,IAAI,CAAC,mBAAmB,CAAA;QACzC,CAAC;KACF,CAAA;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ export { axonServerSnapshottingEventStore } from "./axon-server-snapshotting-eve
4
4
  export { axonServerCommandBus, axonServerQueryBus, type AxonServerCommandBusOptions, type AxonServerQueryBusOptions, type FlowControlConfig, type ProcessingInstructions, } from "./axon-server.js";
5
5
  export { axonServerControlPlane, type AxonServerControlPlane, type ManagedEventProcessor, } from "./control-plane.js";
6
6
  export { type MessageSizeConfig, MessageSizeExceededError, messageSizeValidator, } from "./message-size.js";
7
- export { type ProcessorStatus, type SegmentStatus, type ProcessorStatusSupplier, toEventProcessorInfo, } from "./event-processor-info.js";
7
+ export { type ProcessorStatus, type ProcessorStatusSupplier, toEventProcessorInfo, } from "./event-processor-info.js";
8
8
  export { type PlatformConnection, type PlatformInstruction, type InstructionHandler, type PlatformServiceOptions, platformConnection, } from "./platform-service.js";
9
9
  export { type FlowControlledSender, flowControlledSender, } from "./flow-controlled-sender.js";
10
10
  export { type ShutdownLatch, type ActivityHandle, ShutdownInProgressError, shutdownLatch, } from "./shutdown-latch.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAEnE,OAAO,EAAE,gCAAgC,EAAE,MAAM,2CAA2C,CAAA;AAE5F,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,GAC5B,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EACL,KAAK,iBAAiB,EACtB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,oBAAoB,GACrB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,kBAAkB,GACnB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,KAAK,oBAAoB,EACzB,oBAAoB,GACrB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,uBAAuB,EACvB,aAAa,GACd,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,GACjB,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAEnE,OAAO,EAAE,gCAAgC,EAAE,MAAM,2CAA2C,CAAA;AAE5F,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,GAC5B,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EACL,KAAK,iBAAiB,EACtB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,oBAAoB,GACrB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,kBAAkB,GACnB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,KAAK,oBAAoB,EACzB,oBAAoB,GACrB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,uBAAuB,EACvB,aAAa,GACd,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,GACjB,MAAM,aAAa,CAAA"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAEnE,OAAO,EAAE,gCAAgC,EAAE,MAAM,2CAA2C,CAAA;AAE5F,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GAKnB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,sBAAsB,GAGvB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAEL,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAIL,oBAAoB,GACrB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAKL,kBAAkB,GACnB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAEL,oBAAoB,GACrB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAGL,uBAAuB,EACvB,aAAa,GACd,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,mBAAmB,EAEnB,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,GACjB,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAEnE,OAAO,EAAE,gCAAgC,EAAE,MAAM,2CAA2C,CAAA;AAE5F,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GAKnB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,sBAAsB,GAGvB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAEL,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAGL,oBAAoB,GACrB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAKL,kBAAkB,GACnB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAEL,oBAAoB,GACrB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAGL,uBAAuB,EACvB,aAAa,GACd,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,mBAAmB,EAEnB,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,GACjB,MAAM,aAAa,CAAA"}
@@ -1,15 +1,11 @@
1
- /**
2
- * A queue-backed async iterable for feeding outbound messages to a
3
- * bidirectional gRPC stream. Buffers messages when the stream isn't
4
- * consuming, and resolves promises when the stream is waiting.
5
- */
1
+ /** Bounded single-consumer queue feeding a gRPC request stream. */
6
2
  export type OutboundStream<T> = {
7
- /** Send a message into the stream. */
8
3
  send(message: T): void;
9
- /** The async iterable to pass to the gRPC client. */
10
4
  readonly iterable: AsyncIterable<T>;
11
- /** Close the stream. */
5
+ /** Wait until the consumer has requested the next frame after this batch. Not a server acknowledgement. */
6
+ flush(): Promise<void>;
7
+ readonly buffered: number;
12
8
  close(): void;
13
9
  };
14
- export declare function outboundStream<T>(): OutboundStream<T>;
10
+ export declare function outboundStream<T>(maxBuffered?: number): OutboundStream<T>;
15
11
  //# sourceMappingURL=outbound-stream.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbound-stream.d.ts","sourceRoot":"","sources":["../src/outbound-stream.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,sCAAsC;IACtC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAA;IACtB,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IACnC,wBAAwB;IACxB,KAAK,IAAI,IAAI,CAAA;CACd,CAAA;AAED,wBAAgB,cAAc,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,CAqCrD"}
1
+ {"version":3,"file":"outbound-stream.d.ts","sourceRoot":"","sources":["../src/outbound-stream.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IACnC,2GAA2G;IAC3G,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,KAAK,IAAI,IAAI,CAAA;CACd,CAAA;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,WAAW,SAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAuEvE"}
@@ -1,39 +1,88 @@
1
- export function outboundStream() {
2
- let resolve = null;
1
+ export function outboundStream(maxBuffered = 4096) {
2
+ if (!Number.isSafeInteger(maxBuffered) || maxBuffered <= 0)
3
+ throw new RangeError("maxBuffered must be a positive integer");
4
+ let resolve;
3
5
  const queue = [];
4
6
  let closed = false;
7
+ let claimed = false;
8
+ let handingOff = false;
9
+ let flushed;
10
+ function acknowledgeRead() {
11
+ handingOff = false;
12
+ if (!queue.length) {
13
+ flushed?.resolve();
14
+ flushed = undefined;
15
+ }
16
+ }
17
+ const done = () => ({ value: undefined, done: true });
18
+ function close() {
19
+ closed = true;
20
+ if (!queue.length && !handingOff) {
21
+ flushed?.resolve();
22
+ flushed = undefined;
23
+ }
24
+ resolve?.(done());
25
+ resolve = undefined;
26
+ }
5
27
  return {
28
+ get buffered() { return queue.length; },
29
+ flush() {
30
+ if (!queue.length && !handingOff)
31
+ return Promise.resolve();
32
+ if (closed)
33
+ return Promise.reject(new Error("Outbound stream closed before flush"));
34
+ if (!flushed) {
35
+ let resolve, reject;
36
+ const promise = new Promise((a, b) => { resolve = a; reject = b; });
37
+ flushed = { promise, resolve, reject };
38
+ }
39
+ return flushed.promise;
40
+ },
6
41
  send(message) {
42
+ if (closed)
43
+ throw new Error("Outbound stream is closed");
7
44
  if (resolve) {
8
- const r = resolve;
9
- resolve = null;
10
- r({ value: message, done: false });
45
+ const waiter = resolve;
46
+ resolve = undefined;
47
+ handingOff = true;
48
+ waiter({ value: message, done: false });
11
49
  }
12
50
  else {
51
+ if (queue.length >= maxBuffered)
52
+ throw new Error("Outbound stream buffer overflow");
13
53
  queue.push(message);
14
54
  }
15
55
  },
16
56
  iterable: {
17
57
  [Symbol.asyncIterator]() {
58
+ if (claimed)
59
+ throw new Error("Outbound stream supports one consumer");
60
+ claimed = true;
18
61
  return {
19
62
  next() {
20
- const queued = queue.shift();
21
- if (queued)
22
- return Promise.resolve({ value: queued, done: false });
63
+ acknowledgeRead();
64
+ if (queue.length) {
65
+ handingOff = true;
66
+ return Promise.resolve({ value: queue.shift(), done: false });
67
+ }
23
68
  if (closed)
24
- return Promise.resolve({ value: undefined, done: true });
69
+ return Promise.resolve(done());
70
+ if (resolve)
71
+ return Promise.reject(new Error("Concurrent outbound stream reads are not supported"));
25
72
  return new Promise((r) => { resolve = r; });
26
73
  },
74
+ return() {
75
+ queue.length = 0;
76
+ flushed?.reject(new Error("Outbound stream cancelled before flush"));
77
+ flushed = undefined;
78
+ handingOff = false;
79
+ close();
80
+ return Promise.resolve(done());
81
+ },
27
82
  };
28
83
  },
29
84
  },
30
- close() {
31
- closed = true;
32
- if (resolve) {
33
- resolve({ value: undefined, done: true });
34
- resolve = null;
35
- }
36
- },
85
+ close,
37
86
  };
38
87
  }
39
88
  //# sourceMappingURL=outbound-stream.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbound-stream.js","sourceRoot":"","sources":["../src/outbound-stream.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,cAAc;IAC5B,IAAI,OAAO,GAAgD,IAAI,CAAA;IAC/D,MAAM,KAAK,GAAQ,EAAE,CAAA;IACrB,IAAI,MAAM,GAAG,KAAK,CAAA;IAElB,OAAO;QACL,IAAI,CAAC,OAAU;YACb,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,GAAG,OAAO,CAAA;gBACjB,OAAO,GAAG,IAAI,CAAA;gBACd,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;YACpC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACrB,CAAC;QACH,CAAC;QAED,QAAQ,EAAE;YACR,CAAC,MAAM,CAAC,aAAa,CAAC;gBACpB,OAAO;oBACL,IAAI;wBACF,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;wBAC5B,IAAI,MAAM;4BAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;wBAClE,IAAI,MAAM;4BAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;wBAC3E,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,GAAG,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;oBAC5C,CAAC;iBACF,CAAA;YACH,CAAC;SACF;QAED,KAAK;YACH,MAAM,GAAG,IAAI,CAAA;YACb,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,EAAE,KAAK,EAAE,SAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;gBAChD,OAAO,GAAG,IAAI,CAAA;YAChB,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"outbound-stream.js","sourceRoot":"","sources":["../src/outbound-stream.ts"],"names":[],"mappings":"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"}
@@ -123,7 +123,16 @@ export type PlatformConnection = {
123
123
  subscriptionsAcked(): Promise<boolean>;
124
124
  };
125
125
  export type PlatformServiceOptions = {
126
- /** Heartbeat interval in ms. Default: 10000 */
126
+ /**
127
+ * Heartbeat interval in ms. Default: 2500.
128
+ *
129
+ * Axon Server's `client-heartbeat-timeout` defaults to 5000 ms and is
130
+ * refreshed ONLY by heartbeats the client sends (`HeartbeatMonitor`), checked
131
+ * every second. A 10 s cadence — Axon Framework's own default — survives
132
+ * there only because the framework also answers every heartbeat the SERVER
133
+ * sends; this client does both, and beats at half the server's window so a
134
+ * paused runner still fits.
135
+ */
127
136
  heartbeatIntervalMs?: number;
128
137
  /** Heartbeat timeout in ms. If no response within this window, reconnect. Default: 7500 */
129
138
  heartbeatTimeoutMs?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"platform-service.d.ts","sourceRoot":"","sources":["../src/platform-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAI3D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAGxE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,yBAAyB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC/E;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAAA;AAEjC;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,WAAW,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAE3F;;;;;;;;GAQG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;;;;;;;;;;;;;OAeG;IACH,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC;;;;;;OAMG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB;;;;;;;;OAQG;IACH,IAAI,IAAI,IAAI,CAAA;IACZ,4DAA4D;IAC5D,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAChD;;;OAGG;IACH,+BAA+B,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAAA;IACxE,6CAA6C;IAC7C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,+CAA+C;IAC/C,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,2FAA2F;IAC3F,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;OAGG;IACH,4BAA4B,CAAC,EAAE,MAAM,CAAA;IACrC;;;OAGG;IACH,oCAAoC,CAAC,EAAE,MAAM,CAAA;CAC9C,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,oBAAoB,EAChC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,kBAAkB,CA0UpB"}
1
+ {"version":3,"file":"platform-service.d.ts","sourceRoot":"","sources":["../src/platform-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAI3D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAGxE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,yBAAyB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC/E;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAAA;AAEjC;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,WAAW,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAE3F;;;;;;;;GAQG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;;;;;;;;;;;;;OAeG;IACH,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC;;;;;;OAMG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB;;;;;;;;OAQG;IACH,IAAI,IAAI,IAAI,CAAA;IACZ,4DAA4D;IAC5D,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAChD;;;OAGG;IACH,+BAA+B,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAAA;IACxE,6CAA6C;IAC7C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;;;;;;;OASG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,2FAA2F;IAC3F,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;OAGG;IACH,4BAA4B,CAAC,EAAE,MAAM,CAAA;IACrC;;;OAGG;IACH,oCAAoC,CAAC,EAAE,MAAM,CAAA;CAC9C,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,oBAAoB,EAChC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,kBAAkB,CAiYpB"}
@@ -10,7 +10,7 @@ import { toEventProcessorInfo } from "./event-processor-info.js";
10
10
  * 3. Receives instructions from Axon Server (split, merge, pause, resume)
11
11
  */
12
12
  export function platformConnection(connection, options) {
13
- const heartbeatIntervalMs = options?.heartbeatIntervalMs ?? 10000;
13
+ const heartbeatIntervalMs = options?.heartbeatIntervalMs ?? 2500;
14
14
  const heartbeatTimeoutMs = options?.heartbeatTimeoutMs ?? 7500;
15
15
  const processorsNotificationRateMs = options?.processorsNotificationRateMs ?? 500;
16
16
  const processorsNotificationInitialDelayMs = options?.processorsNotificationInitialDelayMs ?? 5000;
@@ -30,12 +30,22 @@ export function platformConnection(connection, options) {
30
30
  */
31
31
  const pendingInstructions = [];
32
32
  let isConnected = false;
33
+ let monitoringArmed = false;
34
+ let recoveryTimer;
33
35
  let heartbeatTimer = null;
34
36
  let heartbeatTimeoutTimer = null;
37
+ let processorStatusInitialTimer;
35
38
  let processorStatusTimer = null;
36
39
  /** Guards against arming the status-report timer twice — see `startProcessorStatusReporting`. */
37
40
  let processorStatusArmed = false;
38
41
  let lastHeartbeatResponse = Date.now();
42
+ // Whether this server has EVER sent a heartbeat. Axon Server only beats at
43
+ // clients whose registered framework version it recognises (4.2.1+); a client
44
+ // it does not beat at cannot be judged by the silence — that judgement fell
45
+ // every window and tore down a healthy stream, every 10 s, in production.
46
+ // Dead-channel detection for a server that never beats is gRPC keepalive's
47
+ // job (see `connection.ts`), not this timer's.
48
+ let serverBeats = false;
39
49
  let outbound = null;
40
50
  /**
41
51
  * Latches once Axon Server sends its first inbound message after
@@ -50,13 +60,39 @@ export function platformConnection(connection, options) {
50
60
  if (connection.config.token) {
51
61
  grpcMetadata.set("AxonIQ-Access-Token", connection.config.token);
52
62
  }
53
- async function processInboundInstructions(inbound) {
63
+ function scheduleRecovery() {
64
+ if (!monitoringArmed || recoveryTimer || connection.state === "closed" || connection.state === "reconnecting")
65
+ return;
66
+ recoveryTimer = setTimeout(() => {
67
+ recoveryTimer = undefined;
68
+ if (!monitoringArmed || connection.state === "closed")
69
+ return;
70
+ void connection.reconnect().catch((error) => console.error("Platform recovery failed", error));
71
+ }, connection.config.reconnectIntervalMs ?? 2000);
72
+ }
73
+ connection.onDisconnect?.(() => {
74
+ isConnected = false;
75
+ outbound?.close();
76
+ });
77
+ connection.onReconnect(() => {
78
+ if (!monitoringArmed)
79
+ return;
80
+ clearTimeout(recoveryTimer);
81
+ recoveryTimer = undefined;
82
+ isConnected = false;
83
+ openPlatformStream();
84
+ });
85
+ async function processInboundInstructions(inbound, stream) {
54
86
  try {
55
87
  for await (const message of inbound) {
88
+ if (stream !== outbound || !monitoringArmed)
89
+ return;
56
90
  // First inbound message after start() = the platform has accepted our
57
91
  // registration and is talking back. Latch the ack flag (mirror of
58
92
  // kronosdb Plan 09-03 / D-102 — replaces the legacy 1s sleep).
59
93
  acked = true;
94
+ if (message.requestReconnect)
95
+ scheduleRecovery();
60
96
  // Parse instruction type
61
97
  const instruction = parseInstruction(message);
62
98
  if (instruction) {
@@ -74,18 +110,30 @@ export function platformConnection(connection, options) {
74
110
  }
75
111
  }
76
112
  }
77
- // Handle heartbeat response track last response time for timeout detection
113
+ // A heartbeat from the server is BOTH the liveness signal this side
114
+ // tracks and a request: Axon Server measures client inactivity by the
115
+ // heartbeats it receives, so every one it sends is answered at once
116
+ // (what Axon Framework's connector does). Without the echo, the only
117
+ // activity the server ever sees is the periodic beat below.
78
118
  if (message.heartbeat) {
119
+ serverBeats = true;
79
120
  lastHeartbeatResponse = Date.now();
121
+ outbound?.send({ heartbeat: { clientId: connection.config.clientId }, instructionId: "" });
80
122
  }
81
123
  }
82
124
  }
83
125
  catch (err) {
84
- if (isConnected) {
126
+ if (stream === outbound && monitoringArmed && isConnected) {
85
127
  console.error("Platform stream error:", err);
86
128
  isConnected = false;
87
129
  }
88
130
  }
131
+ finally {
132
+ if (stream === outbound && monitoringArmed) {
133
+ isConnected = false;
134
+ scheduleRecovery();
135
+ }
136
+ }
89
137
  }
90
138
  function parseInstruction(message) {
91
139
  if (message.requestReconnect) {
@@ -137,9 +185,13 @@ export function platformConnection(connection, options) {
137
185
  heartbeatTimer = setInterval(() => {
138
186
  if (!isConnected || !outbound)
139
187
  return;
140
- // Check if last heartbeat response was too long ago
188
+ // Not before the server has acknowledged the registration: a heartbeat
189
+ // from a stream it has not filed yet is an error on its side, not a beat.
190
+ if (!acked)
191
+ return;
192
+ // Judge silence only from a server that has beaten before.
141
193
  const timeSinceLastResponse = Date.now() - lastHeartbeatResponse;
142
- if (timeSinceLastResponse > heartbeatTimeoutMs) {
194
+ if (serverBeats && timeSinceLastResponse > heartbeatTimeoutMs) {
143
195
  console.warn(`Platform heartbeat timeout: no response in ${timeSinceLastResponse}ms ` +
144
196
  `(threshold: ${heartbeatTimeoutMs}ms). Marking connection as lost.`);
145
197
  isConnected = false;
@@ -169,10 +221,11 @@ export function platformConnection(connection, options) {
169
221
  if (processorStatusTimer)
170
222
  clearInterval(processorStatusTimer);
171
223
  // Initial delay before first report
172
- setTimeout(() => {
173
- if (!isConnected)
224
+ processorStatusInitialTimer = setTimeout(() => {
225
+ if (!monitoringArmed)
174
226
  return;
175
- reportProcessorStatus();
227
+ if (isConnected)
228
+ void reportProcessorStatus();
176
229
  // Then report at the configured rate
177
230
  processorStatusTimer = setInterval(() => {
178
231
  if (!isConnected || !outbound)
@@ -218,6 +271,7 @@ export function platformConnection(connection, options) {
218
271
  }
219
272
  // Re-arm the ack latch so a stop/start cycle correctly re-waits.
220
273
  acked = false;
274
+ serverBeats = false;
221
275
  outbound = outboundStream();
222
276
  // Register with Axon Server
223
277
  outbound.send({
@@ -238,7 +292,7 @@ export function platformConnection(connection, options) {
238
292
  // timeout, which is what the command/query buses hang their stream
239
293
  // re-establishment off. It belongs to every service, administered or not.
240
294
  startHeartbeat();
241
- processInboundInstructions(inbound);
295
+ void processInboundInstructions(inbound, outbound);
242
296
  // Axon Server's PlatformService does NOT proactively emit an inbound
243
297
  // frame in response to `register` — the stream is held open silently
244
298
  // until either (a) the server pushes a topology / instruction event,
@@ -260,13 +314,19 @@ export function platformConnection(connection, options) {
260
314
  }
261
315
  return {
262
316
  async armConnectionMonitoring() {
317
+ monitoringArmed = true;
263
318
  openPlatformStream();
264
319
  },
265
320
  async start() {
321
+ monitoringArmed = true;
266
322
  openPlatformStream();
267
323
  startProcessorStatusReporting();
268
324
  },
269
325
  stop() {
326
+ monitoringArmed = false;
327
+ clearTimeout(processorStatusInitialTimer);
328
+ clearTimeout(recoveryTimer);
329
+ recoveryTimer = undefined;
270
330
  isConnected = false;
271
331
  // A stopped stream's un-routed backlog is stale — do not replay it if a
272
332
  // handler registers later.
@@ -1 +1 @@
1
- {"version":3,"file":"platform-service.js","sourceRoot":"","sources":["../src/platform-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform-service.js","sourceRoot":"","sources":["../src/platform-service.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,8 @@ export type ResilienceConfig = {
33
33
  log?: (msg: string) => void;
34
34
  /** Per-attempt classification: returns false to short-circuit (terminal error). */
35
35
  isRetryable?: (err: unknown) => boolean;
36
+ /** How a retry waits. Defaults to `setTimeout`; a test injects one to observe delays without touching globals. */
37
+ sleep?: (ms: number) => Promise<void>;
36
38
  };
37
39
  /**
38
40
  * Run `fn` with exponential-backoff full-jitter retries.
@@ -1 +1 @@
1
- {"version":3,"file":"resilience.d.ts","sourceRoot":"","sources":["../src/resilience.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,kEAAkE;AAClE,MAAM,MAAM,UAAU,GAClB,iBAAiB,GACjB,WAAW,GACX,eAAe,GACf,cAAc,CAAA;AAElB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAA;IACtB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAA;IAClB,uFAAuF;IACvF,WAAW,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAA;IAClB,4EAA4E;IAC5E,sBAAsB,EAAE,MAAM,CAAA;IAC9B,iDAAiD;IACjD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,mFAAmF;IACnF,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAA;CACxC,CAAA;AAoCD;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,EAAE;IAAE,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,GACtD,OAAO,CAAC,CAAC,CAAC,CAqBZ;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACvB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GAC/D,OAAO,CAAC,IAAI,CAAC,CAwBf"}
1
+ {"version":3,"file":"resilience.d.ts","sourceRoot":"","sources":["../src/resilience.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,kEAAkE;AAClE,MAAM,MAAM,UAAU,GAClB,iBAAiB,GACjB,WAAW,GACX,eAAe,GACf,cAAc,CAAA;AAElB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAA;IACtB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAA;IAClB,uFAAuF;IACvF,WAAW,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAA;IAClB,4EAA4E;IAC5E,sBAAsB,EAAE,MAAM,CAAA;IAC9B,iDAAiD;IACjD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,mFAAmF;IACnF,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAA;IACvC,kHAAkH;IAClH,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACtC,CAAA;AAoCD;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,EAAE;IAAE,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,GACtD,OAAO,CAAC,CAAC,CAAC,CAqBZ;AAID;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACvB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GAC/D,OAAO,CAAC,IAAI,CAAC,CAwBf"}
@@ -66,11 +66,12 @@ export async function withRetry(fn, opts) {
66
66
  const delay = fullJitterDelay(attempt, cfg);
67
67
  cfg.log?.(`[kronos:resilience] ${opts.event} attempt ${attempt + 1}/${cfg.maxAttempts} ` +
68
68
  `failed; retrying in ${Math.round(delay)}ms — ${err?.message ?? String(err)}`);
69
- await new Promise((r) => setTimeout(r, delay));
69
+ await (cfg.sleep ?? defaultSleep)(delay);
70
70
  }
71
71
  }
72
72
  throw lastErr;
73
73
  }
74
+ const defaultSleep = (ms) => new Promise((r) => setTimeout(r, ms));
74
75
  /**
75
76
  * Run a health-check probe with warn-then-continue semantics (D-100).
76
77
  *