@kronos-ts/axon-server 0.4.0 → 0.6.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 (106) hide show
  1. package/dist/axon-server-event-store.d.ts +0 -16
  2. package/dist/axon-server-event-store.d.ts.map +1 -1
  3. package/dist/axon-server-event-store.js +73 -45
  4. package/dist/axon-server-event-store.js.map +1 -1
  5. package/dist/axon-server-snapshotting-event-store.d.ts +30 -0
  6. package/dist/axon-server-snapshotting-event-store.d.ts.map +1 -0
  7. package/dist/axon-server-snapshotting-event-store.js +154 -0
  8. package/dist/axon-server-snapshotting-event-store.js.map +1 -0
  9. package/dist/axon-server.d.ts +46 -65
  10. package/dist/axon-server.d.ts.map +1 -1
  11. package/dist/axon-server.js +490 -317
  12. package/dist/axon-server.js.map +1 -1
  13. package/dist/bounded-read.d.ts +19 -0
  14. package/dist/bounded-read.d.ts.map +1 -0
  15. package/dist/bounded-read.js +39 -0
  16. package/dist/bounded-read.js.map +1 -0
  17. package/dist/connection-manager.d.ts +2 -2
  18. package/dist/connection-manager.d.ts.map +1 -1
  19. package/dist/connection.d.ts +36 -21
  20. package/dist/connection.d.ts.map +1 -1
  21. package/dist/connection.js +84 -45
  22. package/dist/connection.js.map +1 -1
  23. package/dist/context-view.d.ts +2 -2
  24. package/dist/context-view.d.ts.map +1 -1
  25. package/dist/control-plane.d.ts +14 -24
  26. package/dist/control-plane.d.ts.map +1 -1
  27. package/dist/control-plane.js +6 -37
  28. package/dist/control-plane.js.map +1 -1
  29. package/dist/event-processor-info.d.ts +7 -25
  30. package/dist/event-processor-info.d.ts.map +1 -1
  31. package/dist/event-processor-info.js +16 -20
  32. package/dist/event-processor-info.js.map +1 -1
  33. package/dist/flow-controlled-sender.d.ts +2 -2
  34. package/dist/flow-controlled-sender.d.ts.map +1 -1
  35. package/dist/flow-controlled-sender.js +37 -17
  36. package/dist/flow-controlled-sender.js.map +1 -1
  37. package/dist/generated/command.d.ts +20 -20
  38. package/dist/generated/command.d.ts.map +1 -1
  39. package/dist/generated/common.d.ts +20 -20
  40. package/dist/generated/common.d.ts.map +1 -1
  41. package/dist/generated/control.d.ts +36 -40
  42. package/dist/generated/control.d.ts.map +1 -1
  43. package/dist/generated/dcb.d.ts +88 -94
  44. package/dist/generated/dcb.d.ts.map +1 -1
  45. package/dist/generated/event.d.ts +81 -84
  46. package/dist/generated/event.d.ts.map +1 -1
  47. package/dist/generated/google/protobuf/empty.d.ts +3 -4
  48. package/dist/generated/google/protobuf/empty.d.ts.map +1 -1
  49. package/dist/generated/query.d.ts +40 -40
  50. package/dist/generated/query.d.ts.map +1 -1
  51. package/dist/index.d.ts +2 -2
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +1 -1
  54. package/dist/index.js.map +1 -1
  55. package/dist/message-size.d.ts +2 -2
  56. package/dist/message-size.d.ts.map +1 -1
  57. package/dist/outbound-stream.d.ts +7 -11
  58. package/dist/outbound-stream.d.ts.map +1 -1
  59. package/dist/outbound-stream.js +65 -16
  60. package/dist/outbound-stream.js.map +1 -1
  61. package/dist/platform-service.d.ts +14 -5
  62. package/dist/platform-service.d.ts.map +1 -1
  63. package/dist/platform-service.js +70 -10
  64. package/dist/platform-service.js.map +1 -1
  65. package/dist/resilience.d.ts +62 -0
  66. package/dist/resilience.d.ts.map +1 -0
  67. package/dist/resilience.js +103 -0
  68. package/dist/resilience.js.map +1 -0
  69. package/dist/shutdown-latch.d.ts +5 -4
  70. package/dist/shutdown-latch.d.ts.map +1 -1
  71. package/dist/shutdown-latch.js +20 -1
  72. package/dist/shutdown-latch.js.map +1 -1
  73. package/dist/stream-recovery.d.ts +9 -0
  74. package/dist/stream-recovery.d.ts.map +1 -0
  75. package/dist/stream-recovery.js +70 -0
  76. package/dist/stream-recovery.js.map +1 -0
  77. package/package.json +3 -3
  78. package/src/axon-server-event-store.ts +77 -47
  79. package/src/axon-server-snapshotting-event-store.ts +194 -0
  80. package/src/axon-server.ts +472 -374
  81. package/src/bounded-read.ts +43 -0
  82. package/src/connection-manager.ts +1 -1
  83. package/src/connection.ts +93 -59
  84. package/src/context-view.ts +1 -1
  85. package/src/control-plane.ts +22 -66
  86. package/src/event-processor-info.ts +23 -44
  87. package/src/flow-controlled-sender.ts +34 -15
  88. package/src/generated/command.ts +10 -10
  89. package/src/generated/common.ts +10 -10
  90. package/src/generated/control.ts +20 -20
  91. package/src/generated/dcb.ts +47 -47
  92. package/src/generated/event.ts +42 -42
  93. package/src/generated/google/protobuf/empty.ts +2 -2
  94. package/src/generated/query.ts +20 -20
  95. package/src/index.ts +1 -2
  96. package/src/message-size.ts +1 -1
  97. package/src/outbound-stream.ts +58 -28
  98. package/src/platform-service.ts +77 -13
  99. package/src/resilience.ts +149 -0
  100. package/src/shutdown-latch.ts +16 -3
  101. package/src/stream-recovery.ts +72 -0
  102. package/dist/axon-server-snapshot-store.d.ts +0 -12
  103. package/dist/axon-server-snapshot-store.d.ts.map +0 -1
  104. package/dist/axon-server-snapshot-store.js +0 -82
  105. package/dist/axon-server-snapshot-store.js.map +0 -1
  106. package/src/axon-server-snapshot-store.ts +0 -110
@@ -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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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Connection resilience — PACKAGE-PRIVATE.
3
+ *
4
+ * Exponential backoff with full jitter, per-event attempt caps, terminal-error
5
+ * short-circuit, and a warn-then-continue health probe. Nothing here is
6
+ * exported from this package's barrel.
7
+ *
8
+ * It used to live in `@kronos-ts/core`, and it does not belong there. Core is
9
+ * only what cannot be a helper, and this is a helper by every test: it touches
10
+ * no core shape, no message, no unit of work — it is `setTimeout` and a loop
11
+ * over a function anybody could have written. Its only consumers were the
12
+ * transports and the pool, core's own `src/` never called it, and a helper
13
+ * lives with its users. Same reasoning that moved each persistence package's
14
+ * transaction glue out of core, applied one folder up.
15
+ *
16
+ * Each consuming package keeps its own copy, carrying only what it uses, so
17
+ * each can also state its own retry policy without negotiating with the others.
18
+ */
19
+ /** Classified retry sites used by transport extensions (D-97). */
20
+ export type RetryEvent = "initial-connect" | "reconnect" | "per-operation" | "health-check";
21
+ export type ResilienceConfig = {
22
+ /** Initial backoff delay (ms). Default: 100. */
23
+ initialDelayMs: number;
24
+ /** Cap for backoff (ms). Default: 30_000. */
25
+ maxDelayMs: number;
26
+ /** Max retry attempts before giving up. Per-event defaults applied if not provided. */
27
+ maxAttempts: number;
28
+ /** Base for exponential growth. Default: 2. */
29
+ multiplier: number;
30
+ /** Health-check threshold (ms) before warn-then-continue. Default: 5000. */
31
+ healthCheckThresholdMs: number;
32
+ /** Optional logger. Defaults to console.warn. */
33
+ log?: (msg: string) => void;
34
+ /** Per-attempt classification: returns false to short-circuit (terminal error). */
35
+ isRetryable?: (err: unknown) => boolean;
36
+ };
37
+ /**
38
+ * Run `fn` with exponential-backoff full-jitter retries.
39
+ *
40
+ * Resolves with the first successful result, or rejects with the last error
41
+ * after `maxAttempts` exhausted. If `isRetryable(err)` returns false on any
42
+ * attempt, the error is rethrown immediately (terminal error short-circuit).
43
+ *
44
+ * D-101: opts may carry caller-supplied resilience overrides — this is the
45
+ * per-extension knob path (`kronosDbConnection({ resilience: { ... } })`).
46
+ */
47
+ export declare function withRetry<T>(fn: () => Promise<T>, opts: {
48
+ event: RetryEvent;
49
+ } & Partial<ResilienceConfig>): Promise<T>;
50
+ /**
51
+ * Run a health-check probe with warn-then-continue semantics (D-100).
52
+ *
53
+ * Resolves WITHOUT throwing on success OR after `thresholdMs` elapses with
54
+ * the probe still pending — production loops should NEVER stall on a flaky
55
+ * health probe. Failures (rejection or threshold breach) emit a single warn
56
+ * via `log` and otherwise resolve normally.
57
+ */
58
+ export declare function healthCheck(fn: () => Promise<void>, opts?: {
59
+ thresholdMs?: number;
60
+ log?: (msg: string) => void;
61
+ }): Promise<void>;
62
+ //# sourceMappingURL=resilience.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Connection resilience — PACKAGE-PRIVATE.
3
+ *
4
+ * Exponential backoff with full jitter, per-event attempt caps, terminal-error
5
+ * short-circuit, and a warn-then-continue health probe. Nothing here is
6
+ * exported from this package's barrel.
7
+ *
8
+ * It used to live in `@kronos-ts/core`, and it does not belong there. Core is
9
+ * only what cannot be a helper, and this is a helper by every test: it touches
10
+ * no core shape, no message, no unit of work — it is `setTimeout` and a loop
11
+ * over a function anybody could have written. Its only consumers were the
12
+ * transports and the pool, core's own `src/` never called it, and a helper
13
+ * lives with its users. Same reasoning that moved each persistence package's
14
+ * transaction glue out of core, applied one folder up.
15
+ *
16
+ * Each consuming package keeps its own copy, carrying only what it uses, so
17
+ * each can also state its own retry policy without negotiating with the others.
18
+ */
19
+ const DEFAULTS = {
20
+ initialDelayMs: 100,
21
+ maxDelayMs: 30_000,
22
+ maxAttempts: 10,
23
+ multiplier: 2,
24
+ healthCheckThresholdMs: 5_000,
25
+ };
26
+ const ATTEMPTS_BY_EVENT = {
27
+ "initial-connect": 10,
28
+ "reconnect": 30,
29
+ "per-operation": 5,
30
+ "health-check": 3,
31
+ };
32
+ function resolveConfig(event, partial) {
33
+ return {
34
+ ...DEFAULTS,
35
+ maxAttempts: ATTEMPTS_BY_EVENT[event],
36
+ ...partial,
37
+ };
38
+ }
39
+ function fullJitterDelay(attempt, cfg) {
40
+ const exponential = Math.min(cfg.initialDelayMs * Math.pow(cfg.multiplier, attempt), cfg.maxDelayMs);
41
+ return Math.random() * exponential;
42
+ }
43
+ /**
44
+ * Run `fn` with exponential-backoff full-jitter retries.
45
+ *
46
+ * Resolves with the first successful result, or rejects with the last error
47
+ * after `maxAttempts` exhausted. If `isRetryable(err)` returns false on any
48
+ * attempt, the error is rethrown immediately (terminal error short-circuit).
49
+ *
50
+ * D-101: opts may carry caller-supplied resilience overrides — this is the
51
+ * per-extension knob path (`kronosDbConnection({ resilience: { ... } })`).
52
+ */
53
+ export async function withRetry(fn, opts) {
54
+ const cfg = resolveConfig(opts.event, opts);
55
+ let lastErr;
56
+ for (let attempt = 0; attempt < cfg.maxAttempts; attempt++) {
57
+ try {
58
+ return await fn();
59
+ }
60
+ catch (err) {
61
+ lastErr = err;
62
+ if (cfg.isRetryable && !cfg.isRetryable(err))
63
+ throw err;
64
+ if (attempt === cfg.maxAttempts - 1)
65
+ break;
66
+ const delay = fullJitterDelay(attempt, cfg);
67
+ cfg.log?.(`[kronos:resilience] ${opts.event} attempt ${attempt + 1}/${cfg.maxAttempts} ` +
68
+ `failed; retrying in ${Math.round(delay)}ms — ${err?.message ?? String(err)}`);
69
+ await new Promise((r) => setTimeout(r, delay));
70
+ }
71
+ }
72
+ throw lastErr;
73
+ }
74
+ /**
75
+ * Run a health-check probe with warn-then-continue semantics (D-100).
76
+ *
77
+ * Resolves WITHOUT throwing on success OR after `thresholdMs` elapses with
78
+ * the probe still pending — production loops should NEVER stall on a flaky
79
+ * health probe. Failures (rejection or threshold breach) emit a single warn
80
+ * via `log` and otherwise resolve normally.
81
+ */
82
+ export async function healthCheck(fn, opts = {}) {
83
+ const threshold = opts.thresholdMs ?? DEFAULTS.healthCheckThresholdMs;
84
+ const log = opts.log ?? ((m) => console.warn(m));
85
+ let timer;
86
+ try {
87
+ await Promise.race([
88
+ fn(),
89
+ new Promise((_, reject) => {
90
+ timer = setTimeout(() => reject(new Error("health-check threshold exceeded")), threshold);
91
+ }),
92
+ ]);
93
+ }
94
+ catch (err) {
95
+ log(`[kronos:resilience] health-check soft-failed (${err?.message ?? String(err)}); continuing`);
96
+ // warn-then-continue: do NOT rethrow.
97
+ }
98
+ finally {
99
+ if (timer)
100
+ clearTimeout(timer);
101
+ }
102
+ }
103
+ //# sourceMappingURL=resilience.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resilience.js","sourceRoot":"","sources":["../src/resilience.ts"],"names":[],"mappings":"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"}
@@ -10,11 +10,12 @@
10
10
  *
11
11
  * This is the TypeScript equivalent of AF5's ShutdownLatch pattern.
12
12
  */
13
- export interface ShutdownLatch {
13
+ export type ShutdownLatch = {
14
14
  /**
15
15
  * Register an in-flight activity. Throws if shutdown is in progress.
16
16
  * Call `end()` on the returned handle when the activity completes.
17
17
  */
18
+ onShutdown(callback: () => void): () => void;
18
19
  registerActivity(): ActivityHandle;
19
20
  /**
20
21
  * Begin graceful shutdown. Returns a promise that resolves when
@@ -26,11 +27,11 @@ export interface ShutdownLatch {
26
27
  readonly shuttingDown: boolean;
27
28
  /** Number of currently in-flight activities. */
28
29
  readonly activeCount: number;
29
- }
30
- export interface ActivityHandle {
30
+ };
31
+ export type ActivityHandle = {
31
32
  /** Mark this activity as complete. */
32
33
  end(): void;
33
- }
34
+ };
34
35
  export declare class ShutdownInProgressError extends Error {
35
36
  constructor(message?: string);
36
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown-latch.d.ts","sourceRoot":"","sources":["../src/shutdown-latch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,gBAAgB,IAAI,cAAc,CAAA;IAElC;;;;OAIG;IACH,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjC,2CAA2C;IAC3C,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAE9B,gDAAgD;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,GAAG,IAAI,IAAI,CAAA;CACZ;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAO,GAAE,MAA+B,EAGnD;CACF;AAED,wBAAgB,aAAa,IAAI,aAAa,CAmD7C"}
1
+ {"version":3,"file":"shutdown-latch.d.ts","sourceRoot":"","sources":["../src/shutdown-latch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IAC5C,gBAAgB,IAAI,cAAc,CAAA;IAElC;;;;OAIG;IACH,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjC,2CAA2C;IAC3C,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAE9B,gDAAgD;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,sCAAsC;IACtC,GAAG,IAAI,IAAI,CAAA;CACZ,CAAA;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAO,GAAE,MAA+B,EAGnD;CACF;AAED,wBAAgB,aAAa,IAAI,aAAa,CA+D7C"}
@@ -5,8 +5,10 @@ export class ShutdownInProgressError extends Error {
5
5
  }
6
6
  }
7
7
  export function shutdownLatch() {
8
+ const callbacks = new Set();
8
9
  let activeCount = 0;
9
10
  let shuttingDown = false;
11
+ let drainPromise;
10
12
  let drainResolve = null;
11
13
  function checkDrained() {
12
14
  if (shuttingDown && activeCount === 0 && drainResolve) {
@@ -15,6 +17,13 @@ export function shutdownLatch() {
15
17
  }
16
18
  }
17
19
  return {
20
+ onShutdown(callback) {
21
+ if (shuttingDown)
22
+ callback();
23
+ else
24
+ callbacks.add(callback);
25
+ return () => { callbacks.delete(callback); };
26
+ },
18
27
  registerActivity() {
19
28
  if (shuttingDown) {
20
29
  throw new ShutdownInProgressError();
@@ -33,12 +42,22 @@ export function shutdownLatch() {
33
42
  },
34
43
  initiateShutdown() {
35
44
  shuttingDown = true;
45
+ for (const callback of callbacks) {
46
+ try {
47
+ callback();
48
+ }
49
+ catch (error) {
50
+ console.error("Messaging shutdown callback failed", error);
51
+ }
52
+ }
53
+ callbacks.clear();
36
54
  if (activeCount === 0) {
37
55
  return Promise.resolve();
38
56
  }
39
- return new Promise((resolve) => {
57
+ drainPromise ??= new Promise((resolve) => {
40
58
  drainResolve = resolve;
41
59
  });
60
+ return drainPromise;
42
61
  },
43
62
  get shuttingDown() {
44
63
  return shuttingDown;
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown-latch.js","sourceRoot":"","sources":["../src/shutdown-latch.ts"],"names":[],"mappings":"AAsCA,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAO,GAAW,sBAAsB;QAClD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAA;IACvC,CAAC;CACF;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,IAAI,YAAY,GAAG,KAAK,CAAA;IACxB,IAAI,YAAY,GAAwB,IAAI,CAAA;IAE5C,SAAS,YAAY;QACnB,IAAI,YAAY,IAAI,WAAW,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;YACtD,YAAY,EAAE,CAAA;YACd,YAAY,GAAG,IAAI,CAAA;QACrB,CAAC;IACH,CAAC;IAED,OAAO;QACL,gBAAgB;YACd,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,IAAI,uBAAuB,EAAE,CAAA;YACrC,CAAC;YAED,WAAW,EAAE,CAAA;YACb,IAAI,KAAK,GAAG,KAAK,CAAA;YAEjB,OAAO;gBACL,GAAG;oBACD,IAAI,KAAK;wBAAE,OAAM;oBACjB,KAAK,GAAG,IAAI,CAAA;oBACZ,WAAW,EAAE,CAAA;oBACb,YAAY,EAAE,CAAA;gBAChB,CAAC;aACF,CAAA;QACH,CAAC;QAED,gBAAgB;YACd,YAAY,GAAG,IAAI,CAAA;YAEnB,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;YAC1B,CAAC;YAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,YAAY,GAAG,OAAO,CAAA;YACxB,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,YAAY;YACd,OAAO,YAAY,CAAA;QACrB,CAAC;QAED,IAAI,WAAW;YACb,OAAO,WAAW,CAAA;QACpB,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"shutdown-latch.js","sourceRoot":"","sources":["../src/shutdown-latch.ts"],"names":[],"mappings":"AAuCA,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAO,GAAW,sBAAsB;QAClD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAA;IACvC,CAAC;CACF;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAA;IACvC,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,IAAI,YAAY,GAAG,KAAK,CAAA;IACxB,IAAI,YAAuC,CAAA;IAC3C,IAAI,YAAY,GAAwB,IAAI,CAAA;IAE5C,SAAS,YAAY;QACnB,IAAI,YAAY,IAAI,WAAW,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;YACtD,YAAY,EAAE,CAAA;YACd,YAAY,GAAG,IAAI,CAAA;QACrB,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU,CAAC,QAAQ;YACjB,IAAI,YAAY;gBAAE,QAAQ,EAAE,CAAA;;gBACvB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC5B,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA,CAAC,CAAC,CAAA;QAC7C,CAAC;QACD,gBAAgB;YACd,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,IAAI,uBAAuB,EAAE,CAAA;YACrC,CAAC;YAED,WAAW,EAAE,CAAA;YACb,IAAI,KAAK,GAAG,KAAK,CAAA;YAEjB,OAAO;gBACL,GAAG;oBACD,IAAI,KAAK;wBAAE,OAAM;oBACjB,KAAK,GAAG,IAAI,CAAA;oBACZ,WAAW,EAAE,CAAA;oBACb,YAAY,EAAE,CAAA;gBAChB,CAAC;aACF,CAAA;QACH,CAAC;QAED,gBAAgB;YACd,YAAY,GAAG,IAAI,CAAA;YACnB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBAAC,QAAQ,EAAE,CAAA;gBAAC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAAC,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAA;gBAAC,CAAC;YACjG,CAAC;YACD,SAAS,CAAC,KAAK,EAAE,CAAA;YAEjB,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;YAC1B,CAAC;YAED,YAAY,KAAK,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACvC,YAAY,GAAG,OAAO,CAAA;YACxB,CAAC,CAAC,CAAA;YACF,OAAO,YAAY,CAAA;QACrB,CAAC;QAED,IAAI,YAAY;YACd,OAAO,YAAY,CAAA;QACrB,CAAC;QAED,IAAI,WAAW;YACb,OAAO,WAAW,CAAA;QACpB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ResilienceConfig } from "./resilience.js";
2
+ /** Retry failures of the async stream, not just synchronous stream creation. */
3
+ export declare function streamRecovery(reopen: () => void, canReconnect: () => boolean, config?: Partial<ResilienceConfig>): {
4
+ failed: (error: unknown) => void;
5
+ received(): void;
6
+ restart(): void;
7
+ stop(): void;
8
+ };
9
+ //# sourceMappingURL=stream-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-recovery.d.ts","sourceRoot":"","sources":["../src/stream-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,gFAAgF;AAChF,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,IAAI,EAClB,YAAY,EAAE,MAAM,OAAO,EAC3B,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;oBAcf,OAAO;;;;EAmD/B"}
@@ -0,0 +1,70 @@
1
+ /** Retry failures of the async stream, not just synchronous stream creation. */
2
+ export function streamRecovery(reopen, canReconnect, config = {}) {
3
+ const log = (message) => {
4
+ try {
5
+ ;
6
+ (config.log ?? console.warn)(message);
7
+ }
8
+ catch {
9
+ /* Diagnostics cannot prevent recovery. */
10
+ }
11
+ };
12
+ let timer;
13
+ let stopped = false;
14
+ let attempts = 0;
15
+ let openedAt = Date.now();
16
+ function failed(error) {
17
+ if (stopped || timer || !canReconnect())
18
+ return;
19
+ if (config.isRetryable?.(error) === false || attempts >= (config.maxAttempts ?? 30)) {
20
+ log(`Provider stream recovery exhausted: ${String(error)}`);
21
+ return;
22
+ }
23
+ // Keep a positive floor even when jitter is zero. An immediately-ended
24
+ // async generator must never create a microtask reconnect loop.
25
+ const cap = Math.min((config.initialDelayMs ?? 100) * (config.multiplier ?? 2) ** attempts++, config.maxDelayMs ?? 30000);
26
+ const delay = Math.max(1, cap * (0.5 + Math.random() * 0.5));
27
+ log(`Provider stream failed; reconnecting in ${Math.round(delay)}ms: ${String(error)}`);
28
+ timer = setTimeout(() => {
29
+ timer = undefined;
30
+ if (stopped || !canReconnect())
31
+ return;
32
+ openedAt = Date.now();
33
+ try {
34
+ reopen();
35
+ }
36
+ catch (error) {
37
+ failed(error);
38
+ }
39
+ }, delay);
40
+ timer.unref?.();
41
+ }
42
+ return {
43
+ failed,
44
+ received() {
45
+ // Subscription acknowledgements alone do not prove a stable connection.
46
+ if (Date.now() - openedAt >= 30000)
47
+ attempts = 0;
48
+ },
49
+ restart() {
50
+ if (stopped || !canReconnect())
51
+ return;
52
+ clearTimeout(timer);
53
+ timer = undefined;
54
+ attempts = 0;
55
+ openedAt = Date.now();
56
+ try {
57
+ reopen();
58
+ }
59
+ catch (error) {
60
+ failed(error);
61
+ }
62
+ },
63
+ stop() {
64
+ stopped = true;
65
+ clearTimeout(timer);
66
+ timer = undefined;
67
+ },
68
+ };
69
+ }
70
+ //# sourceMappingURL=stream-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-recovery.js","sourceRoot":"","sources":["../src/stream-recovery.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAC5B,MAAkB,EAClB,YAA2B,EAC3B,MAAM,GAA8B,EAAE;IAEtC,MAAM,GAAG,GAAG,CAAC,OAAe,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,CAAC;YAAA,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAA;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;IACH,CAAC,CAAA;IACD,IAAI,KAAgD,CAAA;IACpD,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAEzB,SAAS,MAAM,CAAC,KAAc;QAC5B,IAAI,OAAO,IAAI,KAAK,IAAI,CAAC,YAAY,EAAE;YAAE,OAAM;QAC/C,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC;YACpF,GAAG,CAAC,uCAAuC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC3D,OAAM;QACR,CAAC;QACD,uEAAuE;QACvE,gEAAgE;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,CAAC,MAAM,CAAC,cAAc,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,QAAQ,EAAE,EACvE,MAAM,CAAC,UAAU,IAAI,KAAK,CAC3B,CAAA;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;QAC5D,GAAG,CAAC,2CAA2C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACvF,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,KAAK,GAAG,SAAS,CAAA;YACjB,IAAI,OAAO,IAAI,CAAC,YAAY,EAAE;gBAAE,OAAM;YACtC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACrB,IAAI,CAAC;gBACH,MAAM,EAAE,CAAA;YACV,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAA;YACf,CAAC;QACH,CAAC,EAAE,KAAK,CAAC,CAAA;QACT,KAAK,CAAC,KAAK,EAAE,EAAE,CAAA;IACjB,CAAC;IAED,OAAO;QACL,MAAM;QACN,QAAQ;YACN,wEAAwE;YACxE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,IAAI,KAAK;gBAAE,QAAQ,GAAG,CAAC,CAAA;QAClD,CAAC;QACD,OAAO;YACL,IAAI,OAAO,IAAI,CAAC,YAAY,EAAE;gBAAE,OAAM;YACtC,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,KAAK,GAAG,SAAS,CAAA;YACjB,QAAQ,GAAG,CAAC,CAAA;YACZ,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACrB,IAAI,CAAC;gBACH,MAAM,EAAE,CAAA;YACV,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAA;YACf,CAAC;QACH,CAAC;QACD,IAAI;YACF,OAAO,GAAG,IAAI,CAAA;YACd,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,KAAK,GAAG,SAAS,CAAA;QACnB,CAAC;KACF,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kronos-ts/axon-server",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "Axon Server extension for Kronos — event store and command bus over Axon Server.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -33,7 +33,7 @@
33
33
  "!src/**/*.bench.ts"
34
34
  ],
35
35
  "scripts": {
36
- "generate-proto": "grpc_tools_node_protoc --ts_proto_out=./src/generated --ts_proto_opt=outputServices=nice-grpc,outputServices=generic-definitions,useExactTypes=false,esModuleInterop=true --proto_path=./proto ./proto/*.proto",
36
+ "generate-proto": "grpc_tools_node_protoc --ts_proto_out=./src/generated --ts_proto_opt=outputServices=nice-grpc,outputServices=generic-definitions,useExactTypes=false,esModuleInterop=true --proto_path=./proto ./proto/*.proto && bun ../../scripts/interface-to-type/convert.ts ./src/generated",
37
37
  "build": "tsc -p tsconfig.json",
38
38
  "clean": "rm -rf dist *.tsbuildinfo"
39
39
  },
@@ -49,7 +49,7 @@
49
49
  }
50
50
  },
51
51
  "dependencies": {
52
- "@kronos-ts/core": "0.2.0",
52
+ "@kronos-ts/core": "0.4.0",
53
53
  "@bufbuild/protobuf": "^2.3",
54
54
  "@grpc/grpc-js": "^1.12",
55
55
  "nice-grpc": "^2.1",