@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.
- package/dist/axon-server-event-store.d.ts.map +1 -1
- package/dist/axon-server-event-store.js +72 -77
- package/dist/axon-server-event-store.js.map +1 -1
- package/dist/axon-server-snapshotting-event-store.d.ts +3 -3
- package/dist/axon-server-snapshotting-event-store.d.ts.map +1 -1
- package/dist/axon-server-snapshotting-event-store.js +3 -2
- package/dist/axon-server-snapshotting-event-store.js.map +1 -1
- package/dist/axon-server.d.ts +15 -7
- package/dist/axon-server.d.ts.map +1 -1
- package/dist/axon-server.js +447 -275
- package/dist/axon-server.js.map +1 -1
- package/dist/bounded-read.d.ts +19 -0
- package/dist/bounded-read.d.ts.map +1 -0
- package/dist/bounded-read.js +39 -0
- package/dist/bounded-read.js.map +1 -0
- package/dist/connection.d.ts +13 -0
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +78 -40
- package/dist/connection.js.map +1 -1
- package/dist/control-plane.d.ts +9 -19
- package/dist/control-plane.d.ts.map +1 -1
- package/dist/control-plane.js +6 -37
- package/dist/control-plane.js.map +1 -1
- package/dist/event-processor-info.d.ts +5 -23
- package/dist/event-processor-info.d.ts.map +1 -1
- package/dist/event-processor-info.js +16 -20
- package/dist/event-processor-info.js.map +1 -1
- package/dist/flow-controlled-sender.d.ts.map +1 -1
- package/dist/flow-controlled-sender.js +37 -17
- package/dist/flow-controlled-sender.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/outbound-stream.d.ts +5 -9
- package/dist/outbound-stream.d.ts.map +1 -1
- package/dist/outbound-stream.js +65 -16
- package/dist/outbound-stream.js.map +1 -1
- package/dist/platform-service.d.ts +10 -1
- package/dist/platform-service.d.ts.map +1 -1
- package/dist/platform-service.js +70 -10
- package/dist/platform-service.js.map +1 -1
- package/dist/resilience.d.ts +2 -0
- package/dist/resilience.d.ts.map +1 -1
- package/dist/resilience.js +2 -1
- package/dist/resilience.js.map +1 -1
- package/dist/shutdown-latch.d.ts +1 -0
- package/dist/shutdown-latch.d.ts.map +1 -1
- package/dist/shutdown-latch.js +20 -1
- package/dist/shutdown-latch.js.map +1 -1
- package/dist/stream-recovery.d.ts +9 -0
- package/dist/stream-recovery.d.ts.map +1 -0
- package/dist/stream-recovery.js +70 -0
- package/dist/stream-recovery.js.map +1 -0
- package/package.json +2 -2
- package/src/axon-server-event-store.ts +77 -79
- package/src/axon-server-snapshotting-event-store.ts +10 -7
- package/src/axon-server.ts +417 -316
- package/src/bounded-read.ts +43 -0
- package/src/connection.ts +77 -45
- package/src/control-plane.ts +19 -63
- package/src/event-processor-info.ts +22 -43
- package/src/flow-controlled-sender.ts +33 -14
- package/src/index.ts +0 -1
- package/src/outbound-stream.ts +57 -27
- package/src/platform-service.ts +75 -11
- package/src/resilience.ts +6 -2
- package/src/shutdown-latch.ts +14 -1
- 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,
|
|
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:
|
|
8
|
-
activeThreads: status.
|
|
4
|
+
mode: "Tracking",
|
|
5
|
+
activeThreads: status.running ? 1 : 0,
|
|
9
6
|
running: status.running,
|
|
10
|
-
error: status.error,
|
|
11
|
-
segmentStatus:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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":"
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
if (onComplete)
|
|
47
|
-
onComplete();
|
|
69
|
+
completionRequested = true;
|
|
70
|
+
finishIfDrained();
|
|
48
71
|
},
|
|
49
72
|
completeExceptionally(error) {
|
|
50
|
-
|
|
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;
|
|
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
|
|
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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,
|
|
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
|
-
/**
|
|
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
|
|
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"}
|
package/dist/outbound-stream.js
CHANGED
|
@@ -1,39 +1,88 @@
|
|
|
1
|
-
export function outboundStream() {
|
|
2
|
-
|
|
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
|
|
9
|
-
resolve =
|
|
10
|
-
|
|
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
|
-
|
|
21
|
-
if (
|
|
22
|
-
|
|
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(
|
|
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":"
|
|
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
|
-
/**
|
|
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
|
|
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"}
|
package/dist/platform-service.js
CHANGED
|
@@ -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 ??
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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 (!
|
|
224
|
+
processorStatusInitialTimer = setTimeout(() => {
|
|
225
|
+
if (!monitoringArmed)
|
|
174
226
|
return;
|
|
175
|
-
|
|
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":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"platform-service.js","sourceRoot":"","sources":["../src/platform-service.ts"],"names":[],"mappings":"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"}
|
package/dist/resilience.d.ts
CHANGED
|
@@ -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.
|
package/dist/resilience.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/resilience.js
CHANGED
|
@@ -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
|
|
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
|
*
|