@enbox/dwn-server 0.0.14 → 0.0.16
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/esm/src/connection/flow-controller.d.ts +3 -3
- package/dist/esm/src/connection/flow-controller.d.ts.map +1 -1
- package/dist/esm/src/connection/flow-controller.js +17 -5
- package/dist/esm/src/connection/flow-controller.js.map +1 -1
- package/dist/esm/src/connection/socket-connection.d.ts +4 -4
- package/dist/esm/src/connection/socket-connection.d.ts.map +1 -1
- package/dist/esm/src/connection/socket-connection.js +2 -2
- package/dist/esm/src/connection/socket-connection.js.map +1 -1
- package/dist/esm/src/json-rpc-handlers/subscription/ack.d.ts +2 -2
- package/dist/esm/src/json-rpc-handlers/subscription/ack.d.ts.map +1 -1
- package/dist/esm/src/json-rpc-handlers/subscription/ack.js +17 -4
- package/dist/esm/src/json-rpc-handlers/subscription/ack.js.map +1 -1
- package/dist/esm/src/plugins/event-log-nats.d.ts +6 -2
- package/dist/esm/src/plugins/event-log-nats.d.ts.map +1 -1
- package/dist/esm/src/plugins/event-log-nats.js +152 -12
- package/dist/esm/src/plugins/event-log-nats.js.map +1 -1
- package/package.json +4 -4
- package/src/connection/flow-controller.ts +25 -8
- package/src/connection/socket-connection.ts +4 -4
- package/src/json-rpc-handlers/subscription/ack.ts +22 -5
- package/src/plugins/event-log-nats.ts +173 -13
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { SubscriptionMessage } from '@enbox/dwn-sdk-js';
|
|
2
1
|
import type { JsonRpcId, JsonRpcSuccessResponse } from '@enbox/dwn-clients';
|
|
2
|
+
import type { ProgressToken, SubscriptionMessage } from '@enbox/dwn-sdk-js';
|
|
3
3
|
/** Default maximum number of unacknowledged events before pausing delivery. */
|
|
4
4
|
export declare const DEFAULT_MAX_IN_FLIGHT = 32;
|
|
5
5
|
/** Maximum buffer size before the subscription is force-closed to prevent OOM. */
|
|
@@ -19,7 +19,7 @@ export declare class FlowController {
|
|
|
19
19
|
private readonly maxInFlight;
|
|
20
20
|
private readonly send;
|
|
21
21
|
private readonly onOverflow;
|
|
22
|
-
/** Ordered list of
|
|
22
|
+
/** Ordered list of progress tokens for events that have been sent but not yet acknowledged. */
|
|
23
23
|
private unacked;
|
|
24
24
|
/** Buffer of events waiting to be sent once the window opens. */
|
|
25
25
|
private buffer;
|
|
@@ -36,7 +36,7 @@ export declare class FlowController {
|
|
|
36
36
|
* to and including the given cursor, then flushes buffered events into the
|
|
37
37
|
* newly opened window slots.
|
|
38
38
|
*/
|
|
39
|
-
ack(cursor:
|
|
39
|
+
ack(cursor: ProgressToken): void;
|
|
40
40
|
/**
|
|
41
41
|
* Returns the number of events currently in flight (sent but unacknowledged).
|
|
42
42
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-controller.d.ts","sourceRoot":"","sources":["../../../../src/connection/flow-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"flow-controller.d.ts","sourceRoot":"","sources":["../../../../src/connection/flow-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAM5E,+EAA+E;AAC/E,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,kFAAkF;AAClF,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC;;;;;;;;;GASG;AACH,qBAAa,cAAc;IAWvB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAb7B,+FAA+F;IAC/F,OAAO,CAAC,OAAO,CAAuB;IAEtC,iEAAiE;IACjE,OAAO,CAAC,MAAM,CAA6B;IAE3C,8DAA8D;IAC9D,OAAO,CAAC,MAAM,CAAS;gBAGJ,cAAc,EAAE,SAAS,EACzB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,EAChD,UAAU,EAAE,MAAM,IAAI;IAGzC;;;OAGG;IACI,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAuB/C;;;;OAIG;IACI,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAuCvC;;OAEG;IACH,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED;;OAEG;IACH,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED;;OAEG;IACH,OAAO,CAAC,WAAW;CAKpB"}
|
|
@@ -19,7 +19,7 @@ export class FlowController {
|
|
|
19
19
|
maxInFlight;
|
|
20
20
|
send;
|
|
21
21
|
onOverflow;
|
|
22
|
-
/** Ordered list of
|
|
22
|
+
/** Ordered list of progress tokens for events that have been sent but not yet acknowledged. */
|
|
23
23
|
unacked = [];
|
|
24
24
|
/** Buffer of events waiting to be sent once the window opens. */
|
|
25
25
|
buffer = [];
|
|
@@ -63,13 +63,25 @@ export class FlowController {
|
|
|
63
63
|
if (this.closed) {
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
|
-
|
|
66
|
+
// Reject tokens from a different stream/epoch — these indicate a client
|
|
67
|
+
// bug or a stale reconnection with an old token domain.
|
|
68
|
+
if (this.unacked.length > 0) {
|
|
69
|
+
const expected = this.unacked[0];
|
|
70
|
+
if (cursor.streamId !== expected.streamId || cursor.epoch !== expected.epoch) {
|
|
71
|
+
log.debug(`FlowController: rejected ack with mismatched token domain for subscription ${String(this.subscriptionId)}: ` +
|
|
72
|
+
`expected streamId=${expected.streamId} epoch=${expected.epoch}, ` +
|
|
73
|
+
`got streamId=${cursor.streamId} epoch=${cursor.epoch}`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Find the matching token by position + messageCid.
|
|
78
|
+
const idx = this.unacked.findIndex((t) => t.position === cursor.position && t.messageCid === cursor.messageCid);
|
|
67
79
|
if (idx === -1) {
|
|
68
|
-
// Unknown
|
|
69
|
-
log.debug(`FlowController: unknown cursor in ack for subscription ${String(this.subscriptionId)}:
|
|
80
|
+
// Unknown token — could be a stale or duplicate ack. Ignore silently.
|
|
81
|
+
log.debug(`FlowController: unknown cursor in ack for subscription ${String(this.subscriptionId)}: position=${cursor.position}`);
|
|
70
82
|
return;
|
|
71
83
|
}
|
|
72
|
-
// Remove all entries up to and including the acked
|
|
84
|
+
// Remove all entries up to and including the acked token.
|
|
73
85
|
this.unacked.splice(0, idx + 1);
|
|
74
86
|
// Flush buffered messages into the freed window slots.
|
|
75
87
|
while (this.buffer.length > 0 && this.unacked.length < this.maxInFlight) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-controller.js","sourceRoot":"","sources":["../../../../src/connection/flow-controller.ts"],"names":[],"mappings":"AAGA,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAElE,+EAA+E;AAC/E,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAExC,kFAAkF;AAClF,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC;;;;;;;;;GASG;AACH,MAAM,OAAO,cAAc;IAWN;IACA;IACA;IACA;IAbnB
|
|
1
|
+
{"version":3,"file":"flow-controller.js","sourceRoot":"","sources":["../../../../src/connection/flow-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import type { RateLimiter } from '../rate-limiter.js';
|
|
|
7
7
|
import type { RegistrationStore } from '../registration/registration-store.js';
|
|
8
8
|
import type { ServerWebSocket } from 'bun';
|
|
9
9
|
import type { WsData } from '../http-api.js';
|
|
10
|
-
import type { Dwn } from '@enbox/dwn-sdk-js';
|
|
10
|
+
import type { Dwn, ProgressToken } from '@enbox/dwn-sdk-js';
|
|
11
11
|
import type { JsonRpcId, JsonRpcSubscription } from '@enbox/dwn-clients';
|
|
12
12
|
/**
|
|
13
13
|
* SocketConnection handles a WebSocket connection to a DWN using JSON RPC.
|
|
@@ -57,10 +57,10 @@ export declare class SocketConnection {
|
|
|
57
57
|
*/
|
|
58
58
|
closeSubscription(id: JsonRpcId): Promise<void>;
|
|
59
59
|
/**
|
|
60
|
-
* Acknowledges subscription events up to the given
|
|
61
|
-
* flow-control window for the subscription.
|
|
60
|
+
* Acknowledges subscription events up to the given progress token, advancing
|
|
61
|
+
* the flow-control window for the subscription.
|
|
62
62
|
*/
|
|
63
|
-
ackSubscription(id: JsonRpcId, cursor:
|
|
63
|
+
ackSubscription(id: JsonRpcId, cursor: ProgressToken): void;
|
|
64
64
|
/**
|
|
65
65
|
* Closes the existing connection and cleans up any listeners or subscriptions.
|
|
66
66
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-connection.d.ts","sourceRoot":"","sources":["../../../../src/connection/socket-connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"socket-connection.d.ts","sourceRoot":"","sources":["../../../../src/connection/socket-connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,GAAG,EAAkB,aAAa,EAAuB,MAAM,mBAAmB,CAAC;AACjG,OAAO,KAAK,EAAwB,SAAS,EAAmC,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAchI;;;;;;;GAOG;AACH,qBAAa,gBAAgB;IAazB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,eAAe,CAAC;IACxB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,UAAU,CAAC;IACnB,OAAO,CAAC,iBAAiB,CAAC;IAC1B,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,iBAAiB,CAAC;IAC1B,OAAO,CAAC,qBAAqB,CAAC;IArBhC,uEAAuE;IACvE,SAAgB,EAAE,EAAE,MAAM,CAAY;IAEtC,+EAA+E;IAC/E,SAAgB,WAAW,EAAE,MAAM,CAAc;IAEjD,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,aAAa,CAAkD;IACvE,OAAO,CAAC,eAAe,CAA6C;IACpE,OAAO,CAAC,OAAO,CAAU;gBAGf,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,EAC/B,GAAG,EAAE,GAAG,EACR,eAAe,CAAC,EAAE,MAAM,IAAI,EAC5B,WAAW,GAAE,MAA8B,EAC3C,WAAW,CAAC,EAAE,WAAW,EACzB,UAAU,CAAC,EAAE,UAAU,EACvB,iBAAiB,CAAC,EAAE,iBAAiB,EACrC,YAAY,CAAC,EAAE,eAAe,EAC9B,iBAAiB,CAAC,EAAE,WAAW,EAC/B,qBAAqB,CAAC,EAAE,oBAAoB,EAAE;IAexD;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO;IAIvC;;;OAGG;IACG,eAAe,CAAC,YAAY,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvE;;;;OAIG;IACG,iBAAiB,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAcrD;;;OAGG;IACH,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;IAO3D;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxC;;;OAGG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmChD;;OAEG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED;;OAEG;IACH,UAAU,IAAI,uBAAuB;IAiBrC;;OAEG;IACH,OAAO,CAAC,IAAI;IAIZ;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAsBjC;;OAEG;YACW,mBAAmB;CA4BlC"}
|
|
@@ -94,8 +94,8 @@ export class SocketConnection {
|
|
|
94
94
|
this.flowControllers.delete(id);
|
|
95
95
|
}
|
|
96
96
|
/**
|
|
97
|
-
* Acknowledges subscription events up to the given
|
|
98
|
-
* flow-control window for the subscription.
|
|
97
|
+
* Acknowledges subscription events up to the given progress token, advancing
|
|
98
|
+
* the flow-control window for the subscription.
|
|
99
99
|
*/
|
|
100
100
|
ackSubscription(id, cursor) {
|
|
101
101
|
const fc = this.flowControllers.get(id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-connection.js","sourceRoot":"","sources":["../../../../src/connection/socket-connection.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"socket-connection.js","sourceRoot":"","sources":["../../../../src/connection/socket-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { JsonRpcHandler } from '../../lib/json-rpc-router.js';
|
|
2
2
|
/**
|
|
3
3
|
* Handles `rpc.ack` — acknowledges receipt of subscription events up to the
|
|
4
|
-
* given
|
|
4
|
+
* given progress token, advancing the per-subscription flow-control window.
|
|
5
5
|
*
|
|
6
6
|
* Request shape:
|
|
7
7
|
* ```json
|
|
8
8
|
* {
|
|
9
9
|
* "jsonrpc": "2.0",
|
|
10
10
|
* "method": "rpc.ack",
|
|
11
|
-
* "params": { "cursor": "
|
|
11
|
+
* "params": { "cursor": { "streamId": "...", "epoch": "...", "position": "...", "messageCid": "..." } },
|
|
12
12
|
* "subscription": { "id": "<subscription-id>" }
|
|
13
13
|
* }
|
|
14
14
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ack.d.ts","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/ack.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ack.d.ts","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/ack.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,cAAc,EACf,MAAM,8BAA8B,CAAC;AAkBtC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAoCnC,CAAC"}
|
|
@@ -1,15 +1,28 @@
|
|
|
1
1
|
import { v4 as uuidv4 } from 'uuid';
|
|
2
2
|
import { createJsonRpcErrorResponse, createJsonRpcSuccessResponse, JsonRpcErrorCodes } from '@enbox/dwn-clients';
|
|
3
|
+
/**
|
|
4
|
+
* Validates that a value is a well-formed {@link ProgressToken}.
|
|
5
|
+
*/
|
|
6
|
+
function isProgressToken(value) {
|
|
7
|
+
if (typeof value !== 'object' || value === null) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
const obj = value;
|
|
11
|
+
return typeof obj.streamId === 'string' && obj.streamId !== '' &&
|
|
12
|
+
typeof obj.epoch === 'string' && obj.epoch !== '' &&
|
|
13
|
+
typeof obj.position === 'string' && obj.position !== '' &&
|
|
14
|
+
typeof obj.messageCid === 'string' && obj.messageCid !== '';
|
|
15
|
+
}
|
|
3
16
|
/**
|
|
4
17
|
* Handles `rpc.ack` — acknowledges receipt of subscription events up to the
|
|
5
|
-
* given
|
|
18
|
+
* given progress token, advancing the per-subscription flow-control window.
|
|
6
19
|
*
|
|
7
20
|
* Request shape:
|
|
8
21
|
* ```json
|
|
9
22
|
* {
|
|
10
23
|
* "jsonrpc": "2.0",
|
|
11
24
|
* "method": "rpc.ack",
|
|
12
|
-
* "params": { "cursor": "
|
|
25
|
+
* "params": { "cursor": { "streamId": "...", "epoch": "...", "position": "...", "messageCid": "..." } },
|
|
13
26
|
* "subscription": { "id": "<subscription-id>" }
|
|
14
27
|
* }
|
|
15
28
|
* ```
|
|
@@ -29,8 +42,8 @@ export const handleSubscriptionAck = async (jsonRpcRequest, context) => {
|
|
|
29
42
|
}
|
|
30
43
|
const { id: subscriptionId } = jsonRpcRequest.subscription;
|
|
31
44
|
const { cursor } = (jsonRpcRequest.params ?? {});
|
|
32
|
-
if (cursor
|
|
33
|
-
const jsonRpcResponse = createJsonRpcErrorResponse(requestId, JsonRpcErrorCodes.InvalidParams, 'params.cursor is required and must be a
|
|
45
|
+
if (!isProgressToken(cursor)) {
|
|
46
|
+
const jsonRpcResponse = createJsonRpcErrorResponse(requestId, JsonRpcErrorCodes.InvalidParams, 'params.cursor is required and must be a ProgressToken object with streamId, epoch, position, and messageCid');
|
|
34
47
|
return { jsonRpcResponse };
|
|
35
48
|
}
|
|
36
49
|
const { socketConnection } = context;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ack.js","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/ack.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ack.js","sourceRoot":"","sources":["../../../../../src/json-rpc-handlers/subscription/ack.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAQpC,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEjH;;GAEG;AACH,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE;QAC5D,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,EAAE;QACjD,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE;QACvD,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAmB,KAAK,EACxD,cAAc,EACd,OAAO,EACP,EAAE;IACF,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;IAEhD,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,eAAe,GAAG,0BAA0B,CAChD,SAAS,EAAE,iBAAiB,CAAC,cAAc,EAAE,kCAAkC,CAChF,CAAC;QACF,OAAO,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,cAAc,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC9C,MAAM,eAAe,GAAG,0BAA0B,CAChD,SAAS,EAAE,iBAAiB,CAAC,aAAa,EAAE,mCAAmC,CAChF,CAAC;QACF,OAAO,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC,YAAiC,CAAC;IAChF,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,IAAI,EAAE,CAAyB,CAAC;IAEzE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,eAAe,GAAG,0BAA0B,CAChD,SAAS,EAAE,iBAAiB,CAAC,aAAa,EAC1C,6GAA6G,CAC9G,CAAC;QACF,OAAO,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IACrC,gBAAgB,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAEzD,MAAM,eAAe,GAAG,4BAA4B,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1G,OAAO,EAAE,eAAe,EAAqB,CAAC;AAChD,CAAC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EventLog, EventLogReadOptions, EventLogReadResult, EventLogSubscribeOptions, EventSubscription, KeyValues, MessageEvent, SubscriptionListener } from '@enbox/dwn-sdk-js';
|
|
1
|
+
import type { EventLog, EventLogReadOptions, EventLogReadResult, EventLogSubscribeOptions, EventSubscription, KeyValues, MessageEvent, ProgressToken, SubscriptionListener } from '@enbox/dwn-sdk-js';
|
|
2
2
|
/**
|
|
3
3
|
* Distributed {@link EventLog} implementation backed by NATS JetStream.
|
|
4
4
|
*
|
|
@@ -17,9 +17,13 @@ export default class NatsEventLog implements EventLog {
|
|
|
17
17
|
constructor();
|
|
18
18
|
open(): Promise<void>;
|
|
19
19
|
close(): Promise<void>;
|
|
20
|
-
emit(tenant: string, event: MessageEvent, indexes: KeyValues): Promise<
|
|
20
|
+
emit(tenant: string, event: MessageEvent, indexes: KeyValues, messageCid: string): Promise<ProgressToken | undefined>;
|
|
21
21
|
read(tenant: string, options?: EventLogReadOptions): Promise<EventLogReadResult>;
|
|
22
22
|
subscribe(tenant: string, id: string, listener: SubscriptionListener, options?: EventLogSubscribeOptions): Promise<EventSubscription>;
|
|
23
|
+
getReplayBounds(tenant: string): Promise<{
|
|
24
|
+
oldest: ProgressToken;
|
|
25
|
+
latest: ProgressToken;
|
|
26
|
+
} | undefined>;
|
|
23
27
|
trim(tenant: string, olderThan: number | string): Promise<void>;
|
|
24
28
|
}
|
|
25
29
|
//# sourceMappingURL=event-log-nats.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-log-nats.d.ts","sourceRoot":"","sources":["../../../../src/plugins/event-log-nats.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAiB,mBAAmB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,iBAAiB,EAAU,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"event-log-nats.d.ts","sourceRoot":"","sources":["../../../../src/plugins/event-log-nats.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAiB,mBAAmB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,iBAAiB,EAAU,SAAS,EAAE,YAAY,EAAsC,aAAa,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAmJjQ;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,OAAO,YAAa,YAAW,QAAQ;;;IAqBtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwFtB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAWrH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgFpF,SAAS,CACpB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,iBAAiB,CAAC;IAsHhB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,GAAG,SAAS,CAAC;IA6DtG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA2D7E"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import log from 'loglevel';
|
|
2
|
+
import { DwnError, DwnErrorCode } from '@enbox/dwn-sdk-js';
|
|
2
3
|
import { connect } from '@nats-io/transport-node';
|
|
3
4
|
import { AckPolicy, DeliverPolicy, jetstream, jetstreamManager } from '@nats-io/jetstream';
|
|
4
5
|
function loadConfig() {
|
|
@@ -121,6 +122,11 @@ export default class NatsEventLog {
|
|
|
121
122
|
#jsm;
|
|
122
123
|
/** Active subscription consumers, keyed by consumer name. */
|
|
123
124
|
#activeConsumers = new Map();
|
|
125
|
+
/**
|
|
126
|
+
* Epoch for this EventLog instance. Stable as long as the JetStream stream exists.
|
|
127
|
+
* Generated once at `open()` from the stream's creation timestamp.
|
|
128
|
+
*/
|
|
129
|
+
#epoch = '';
|
|
124
130
|
constructor() {
|
|
125
131
|
this.#config = loadConfig();
|
|
126
132
|
}
|
|
@@ -135,6 +141,9 @@ export default class NatsEventLog {
|
|
|
135
141
|
this.#jsm = await jetstreamManager(this.#nc);
|
|
136
142
|
// Ensure the stream exists (idempotent — update if it already exists).
|
|
137
143
|
await this.#ensureStream();
|
|
144
|
+
// Derive a stable epoch from the stream creation time.
|
|
145
|
+
const streamInfo = await this.#jsm.streams.info(this.#config.streamName);
|
|
146
|
+
this.#epoch = streamInfo.created ?? crypto.randomUUID();
|
|
138
147
|
log.info(`NatsEventLog: connected to ${servers.join(', ')}, stream '${this.#config.streamName}' ready`);
|
|
139
148
|
}
|
|
140
149
|
async close() {
|
|
@@ -157,18 +166,81 @@ export default class NatsEventLog {
|
|
|
157
166
|
this.#jsm = undefined;
|
|
158
167
|
}
|
|
159
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Derives a stable streamId from the JetStream stream name and tenant subject.
|
|
171
|
+
*/
|
|
172
|
+
async #getStreamId(tenant) {
|
|
173
|
+
const input = `${this.#config.streamName}/${this.#tenantSubject(tenant)}`;
|
|
174
|
+
const bytes = new TextEncoder().encode(input);
|
|
175
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', bytes);
|
|
176
|
+
const hashArray = new Uint8Array(hashBuffer);
|
|
177
|
+
return Array.from(hashArray.slice(0, 8), (b) => b.toString(16).padStart(2, '0')).join('');
|
|
178
|
+
}
|
|
179
|
+
async #buildToken(tenant, seq, messageCid) {
|
|
180
|
+
return {
|
|
181
|
+
streamId: await this.#getStreamId(tenant),
|
|
182
|
+
epoch: this.#epoch,
|
|
183
|
+
position: String(seq),
|
|
184
|
+
messageCid,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Validates a cursor against the current NatsEventLog state.
|
|
189
|
+
* Throws `DwnError(EventLogProgressGap)` if the cursor cannot be resumed.
|
|
190
|
+
*/
|
|
191
|
+
async #validateCursor(tenant, cursor) {
|
|
192
|
+
const expectedStreamId = await this.#getStreamId(tenant);
|
|
193
|
+
let reason;
|
|
194
|
+
if (cursor.streamId !== expectedStreamId) {
|
|
195
|
+
reason = 'stream_mismatch';
|
|
196
|
+
}
|
|
197
|
+
else if (cursor.epoch !== this.#epoch) {
|
|
198
|
+
reason = 'epoch_mismatch';
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
// Check if position is within replay bounds using BigInt
|
|
202
|
+
// for safe handling of NATS sequences beyond Number.MAX_SAFE_INTEGER.
|
|
203
|
+
const bounds = await this.getReplayBounds(tenant);
|
|
204
|
+
if (bounds !== undefined) {
|
|
205
|
+
const cursorSeq = BigInt(cursor.position);
|
|
206
|
+
const oldestSeq = BigInt(bounds.oldest.position);
|
|
207
|
+
if (cursorSeq < oldestSeq - 1n) {
|
|
208
|
+
reason = 'token_too_old';
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
return; // Valid.
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
return; // No events — vacuously valid.
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const bounds = await this.getReplayBounds(tenant);
|
|
219
|
+
const gapInfo = {
|
|
220
|
+
requested: cursor,
|
|
221
|
+
oldestAvailable: bounds?.oldest ?? cursor,
|
|
222
|
+
latestAvailable: bounds?.latest ?? cursor,
|
|
223
|
+
reason,
|
|
224
|
+
};
|
|
225
|
+
const error = new DwnError(DwnErrorCode.EventLogProgressGap, `progress token gap: ${reason}`);
|
|
226
|
+
error.gapInfo = gapInfo;
|
|
227
|
+
throw error;
|
|
228
|
+
}
|
|
160
229
|
// ---- emit ----------------------------------------------------------------
|
|
161
|
-
async emit(tenant, event, indexes) {
|
|
230
|
+
async emit(tenant, event, indexes, messageCid) {
|
|
162
231
|
this.#assertOpen();
|
|
163
232
|
const subject = this.#tenantSubject(tenant);
|
|
164
|
-
const data = encodePayload({ event, indexes });
|
|
233
|
+
const data = encodePayload({ event, indexes, messageCid });
|
|
165
234
|
const ack = await this.#js.publish(subject, data);
|
|
166
|
-
return
|
|
235
|
+
return this.#buildToken(tenant, ack.seq, messageCid);
|
|
167
236
|
}
|
|
168
237
|
// ---- read ----------------------------------------------------------------
|
|
169
238
|
async read(tenant, options = {}) {
|
|
170
239
|
this.#assertOpen();
|
|
171
240
|
const { cursor, limit, filters } = options;
|
|
241
|
+
if (cursor !== undefined) {
|
|
242
|
+
await this.#validateCursor(tenant, cursor);
|
|
243
|
+
}
|
|
172
244
|
const subject = this.#tenantSubject(tenant);
|
|
173
245
|
// Create a one-shot ordered consumer for the read.
|
|
174
246
|
const consumerOpts = {
|
|
@@ -177,7 +249,7 @@ export default class NatsEventLog {
|
|
|
177
249
|
};
|
|
178
250
|
if (cursor !== undefined) {
|
|
179
251
|
consumerOpts.deliver_policy = DeliverPolicy.StartSequence;
|
|
180
|
-
consumerOpts.opt_start_seq = Number(cursor) + 1;
|
|
252
|
+
consumerOpts.opt_start_seq = Number(cursor.position) + 1;
|
|
181
253
|
}
|
|
182
254
|
else {
|
|
183
255
|
consumerOpts.deliver_policy = DeliverPolicy.All;
|
|
@@ -185,7 +257,8 @@ export default class NatsEventLog {
|
|
|
185
257
|
const consumer = await this.#jsm.consumers.add(this.#config.streamName, consumerOpts);
|
|
186
258
|
const maxResults = limit ?? Number.MAX_SAFE_INTEGER;
|
|
187
259
|
const events = [];
|
|
188
|
-
let
|
|
260
|
+
let lastSeq;
|
|
261
|
+
let lastMessageCid;
|
|
189
262
|
try {
|
|
190
263
|
const messages = await this.#js.consumers.get(this.#config.streamName, consumer.name);
|
|
191
264
|
const iter = await messages.fetch({ max_messages: maxResults, expires: 2_000 });
|
|
@@ -202,7 +275,10 @@ export default class NatsEventLog {
|
|
|
202
275
|
event: payload.event,
|
|
203
276
|
indexes: payload.indexes,
|
|
204
277
|
});
|
|
205
|
-
|
|
278
|
+
lastSeq = msg.seq;
|
|
279
|
+
// Prefer the dedicated messageCid field (v0.0.16+), fall back to indexes for older payloads,
|
|
280
|
+
// then a deterministic placeholder so pre-upgrade messages never produce empty-string tokens.
|
|
281
|
+
lastMessageCid = payload.messageCid || payload.indexes['messageCid'] || `legacy-seq-${msg.seq}`;
|
|
206
282
|
if (events.length >= maxResults) {
|
|
207
283
|
break;
|
|
208
284
|
}
|
|
@@ -217,9 +293,13 @@ export default class NatsEventLog {
|
|
|
217
293
|
// May already be cleaned up.
|
|
218
294
|
}
|
|
219
295
|
}
|
|
296
|
+
if (lastSeq !== undefined) {
|
|
297
|
+
const lastToken = await this.#buildToken(tenant, lastSeq, lastMessageCid || `legacy-seq-${lastSeq}`);
|
|
298
|
+
return { events, cursor: lastToken };
|
|
299
|
+
}
|
|
220
300
|
return {
|
|
221
301
|
events,
|
|
222
|
-
cursor
|
|
302
|
+
cursor,
|
|
223
303
|
};
|
|
224
304
|
}
|
|
225
305
|
// ---- subscribe -----------------------------------------------------------
|
|
@@ -227,6 +307,10 @@ export default class NatsEventLog {
|
|
|
227
307
|
this.#assertOpen();
|
|
228
308
|
const subject = this.#tenantSubject(tenant);
|
|
229
309
|
const { cursor, filters } = options ?? {};
|
|
310
|
+
// Validate cursor before subscribing.
|
|
311
|
+
if (cursor !== undefined) {
|
|
312
|
+
await this.#validateCursor(tenant, cursor);
|
|
313
|
+
}
|
|
230
314
|
// Build the consumer config.
|
|
231
315
|
const consumerName = `sub-${id}`;
|
|
232
316
|
const consumerOpts = {
|
|
@@ -237,7 +321,7 @@ export default class NatsEventLog {
|
|
|
237
321
|
};
|
|
238
322
|
if (cursor !== undefined) {
|
|
239
323
|
consumerOpts.deliver_policy = DeliverPolicy.StartSequence;
|
|
240
|
-
consumerOpts.opt_start_seq = Number(cursor) + 1;
|
|
324
|
+
consumerOpts.opt_start_seq = Number(cursor.position) + 1;
|
|
241
325
|
}
|
|
242
326
|
else {
|
|
243
327
|
consumerOpts.deliver_policy = DeliverPolicy.New;
|
|
@@ -265,13 +349,16 @@ export default class NatsEventLog {
|
|
|
265
349
|
msg.ack();
|
|
266
350
|
continue;
|
|
267
351
|
}
|
|
268
|
-
|
|
269
|
-
|
|
352
|
+
// Prefer the dedicated messageCid field (v0.0.16+), fall back to indexes for older payloads,
|
|
353
|
+
// then a deterministic placeholder so pre-upgrade messages never produce empty-string tokens.
|
|
354
|
+
const msgCid = payload.messageCid || payload.indexes['messageCid'] || `legacy-seq-${msg.seq}`;
|
|
355
|
+
const eventToken = await this.#buildToken(tenant, msg.seq, msgCid);
|
|
356
|
+
listener({ type: 'event', cursor: eventToken, event: payload.event });
|
|
270
357
|
msg.ack();
|
|
271
358
|
// EOSE detection: when pending reaches 0, all stored events have been
|
|
272
359
|
// delivered and we transition to live mode.
|
|
273
360
|
if (!sentEose && msg.info.pending === 0) {
|
|
274
|
-
listener({ type: 'eose', cursor:
|
|
361
|
+
listener({ type: 'eose', cursor: eventToken });
|
|
275
362
|
sentEose = true;
|
|
276
363
|
}
|
|
277
364
|
}
|
|
@@ -295,7 +382,7 @@ export default class NatsEventLog {
|
|
|
295
382
|
}
|
|
296
383
|
try {
|
|
297
384
|
const info = await this.#jsm.consumers.info(this.#config.streamName, consumerName);
|
|
298
|
-
if (info.num_pending === 0 && info.delivered.stream_seq <= Number(cursor)) {
|
|
385
|
+
if (info.num_pending === 0 && info.delivered.stream_seq <= Number(cursor.position)) {
|
|
299
386
|
listener({ type: 'eose', cursor });
|
|
300
387
|
}
|
|
301
388
|
}
|
|
@@ -319,6 +406,59 @@ export default class NatsEventLog {
|
|
|
319
406
|
},
|
|
320
407
|
};
|
|
321
408
|
}
|
|
409
|
+
// ---- getReplayBounds ------------------------------------------------------
|
|
410
|
+
async getReplayBounds(tenant) {
|
|
411
|
+
this.#assertOpen();
|
|
412
|
+
const subject = this.#tenantSubject(tenant);
|
|
413
|
+
// Get stream info to find first/last sequence for this subject.
|
|
414
|
+
const streamInfo = await this.#jsm.streams.info(this.#config.streamName, { subjects_filter: subject });
|
|
415
|
+
const firstSeq = streamInfo.state.first_seq;
|
|
416
|
+
const lastSeq = streamInfo.state.last_seq;
|
|
417
|
+
if (lastSeq === 0 || firstSeq > lastSeq) {
|
|
418
|
+
return undefined;
|
|
419
|
+
}
|
|
420
|
+
// Read boundary messages to extract their real messageCid values.
|
|
421
|
+
// Uses a one-shot ordered consumer to fetch a single message at a given sequence.
|
|
422
|
+
const readBoundaryCid = async (seq) => {
|
|
423
|
+
let consumerName;
|
|
424
|
+
try {
|
|
425
|
+
const consumer = await this.#jsm.consumers.add(this.#config.streamName, {
|
|
426
|
+
filter_subject: subject,
|
|
427
|
+
ack_policy: AckPolicy.None,
|
|
428
|
+
deliver_policy: DeliverPolicy.StartSequence,
|
|
429
|
+
opt_start_seq: seq,
|
|
430
|
+
});
|
|
431
|
+
consumerName = consumer.name;
|
|
432
|
+
const handle = await this.#js.consumers.get(this.#config.streamName, consumerName);
|
|
433
|
+
const iter = await handle.fetch({ max_messages: 1, expires: 2_000 });
|
|
434
|
+
for await (const msg of iter) {
|
|
435
|
+
const payload = decodePayload(msg.data);
|
|
436
|
+
const cid = payload?.indexes?.['messageCid'];
|
|
437
|
+
if (cid && cid !== '') {
|
|
438
|
+
return cid;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
catch {
|
|
443
|
+
// Fall through to deterministic placeholder.
|
|
444
|
+
}
|
|
445
|
+
finally {
|
|
446
|
+
if (consumerName) {
|
|
447
|
+
try {
|
|
448
|
+
await this.#jsm.consumers.delete(this.#config.streamName, consumerName);
|
|
449
|
+
}
|
|
450
|
+
catch { /* best effort */ }
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// Deterministic placeholder if the message could not be read.
|
|
454
|
+
return `boundary-seq-${seq}`;
|
|
455
|
+
};
|
|
456
|
+
const oldestCid = await readBoundaryCid(firstSeq);
|
|
457
|
+
const latestCid = await readBoundaryCid(lastSeq);
|
|
458
|
+
const oldest = await this.#buildToken(tenant, firstSeq, oldestCid);
|
|
459
|
+
const latest = await this.#buildToken(tenant, lastSeq, latestCid);
|
|
460
|
+
return { oldest, latest };
|
|
461
|
+
}
|
|
322
462
|
// ---- trim ----------------------------------------------------------------
|
|
323
463
|
async trim(tenant, olderThan) {
|
|
324
464
|
this.#assertOpen();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-log-nats.js","sourceRoot":"","sources":["../../../../src/plugins/event-log-nats.ts"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAmB3F,SAAS,UAAU;IACjB,OAAO;QACL,GAAG,EAAiB,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,uBAAuB;QACnE,UAAU,EAAU,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,YAAY;QAChE,YAAY,EAAQ,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,iBAAiB,CAAC,EAAE,kBAAkB;QACtG,QAAQ,EAAY,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,GAAG,CAAC;QACrE,iBAAiB,EAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,QAAQ,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,cAAc,CAAC,SAAoB,EAAE,OAA6B;IACzE,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iGAAiG;AACjG,SAAS,WAAW,CAAC,aAAwB,EAAE,MAAc;IAC3D,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACrE,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;gBACrC,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kFAAkF;AAClF,SAAS,gBAAgB,CAAC,WAAoB,EAAE,UAAqC;IACnF,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,cAAc;YACd,OAAQ,WAAgD,CAAC,QAAQ,CAAC,UAAmB,CAAC,CAAC;QACzF,CAAC;QACD,cAAc;QACd,MAAM,KAAK,GAAG,WAA2G,CAAC;QAC1H,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,IAAI,UAAU,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,UAAU,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YACtD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,IAAI,UAAU,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,UAAU,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YACtD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,cAAc;IACd,OAAO,UAAU,KAAK,WAAW,CAAC;AACpC,CAAC;AAWD,SAAS,aAAa,CAAC,OAAyB;IAC9C,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,aAAa,CAAC,IAAgB;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAqB,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAC9E,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,oBAAoB,CAAC,MAAc;IAC1C,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,8EAA8E;AAC9E,yEAAyE;AACzE,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,OAAO,YAAY;IAC/B,OAAO,CAAqB;IAC5B,GAAG,CAA6B;IAChC,GAAG,CAA8B;IACjC,IAAI,CAA+B;IAEnC,6DAA6D;IAC7D,gBAAgB,GAAmE,IAAI,GAAG,EAAE,CAAC;IAE7F;QACE,IAAI,CAAC,OAAO,GAAG,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,6EAA6E;IAEtE,KAAK,CAAC,IAAI;QACf,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,GAAG,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE7C,uEAAuE;QACvE,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE3B,GAAG,CAAC,IAAI,CAAC,8BAA8B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,UAAU,SAAS,CAAC,CAAC;IAC1G,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,0CAA0C;QAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAClD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YACrB,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACnE,CAAC;YAAC,MAAM,CAAC;gBACP,oDAAoD;YACtD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAE9B,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;YACrB,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;YACrB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACxB,CAAC;IACH,CAAC;IAED,6EAA6E;IAEtE,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,KAAmB,EAAE,OAAkB;QACvE,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnD,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,6EAA6E;IAEtE,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,UAA+B,EAAE;QACjE,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAE5C,mDAAmD;QACnD,MAAM,YAAY,GAA4B;YAC5C,cAAc,EAAG,OAAO;YACxB,UAAU,EAAO,SAAS,CAAC,IAAI,EAAE,gCAAgC;SAClE,CAAC;QAEF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,YAAY,CAAC,cAAc,GAAG,aAAa,CAAC,aAAa,CAAC;YAC1D,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC;QAClD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACvF,MAAM,UAAU,GAAG,KAAK,IAAI,MAAM,CAAC,gBAAgB,CAAC;QAEpD,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,IAAI,UAA8B,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAEhF,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC9C,SAAS;gBACX,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC;oBACV,GAAG,EAAO,GAAG,CAAC,GAAG;oBACjB,KAAK,EAAK,OAAO,CAAC,KAAK;oBACvB,OAAO,EAAG,OAAO,CAAC,OAAO;iBAC1B,CAAC,CAAC;gBAEH,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAE7B,IAAI,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;oBAChC,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,kCAAkC;YAClC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5E,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM;YACN,MAAM,EAAE,UAAU,IAAI,MAAM;SAC7B,CAAC;IACJ,CAAC;IAED,6EAA6E;IAEtE,KAAK,CAAC,SAAS,CACpB,MAAc,EACd,EAAU,EACV,QAA8B,EAC9B,OAAkC;QAElC,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QAE1C,6BAA6B;QAC7B,MAAM,YAAY,GAAG,OAAO,EAAE,EAAE,CAAC;QACjC,MAAM,YAAY,GAA4B;YAC5C,IAAI,EAAiB,YAAY;YACjC,cAAc,EAAO,OAAO;YAC5B,UAAU,EAAW,SAAS,CAAC,QAAQ;YACvC,kBAAkB,EAAG,cAAc,EAAE,sBAAsB;SAC5D,CAAC;QAEF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,YAAY,CAAC,cAAc,GAAG,aAAa,CAAC,aAAa,CAAC;YAC1D,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC;QAClD,CAAC;QAED,MAAM,IAAI,CAAC,IAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAEtE,MAAM,KAAK,GAAsD,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACpF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAE/C,yCAAyC;QACzC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;YAC5C,IAAI,QAAQ,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,6BAA6B;YAElE,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;gBACtF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAC1C,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAE1B,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;oBACjC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;wBAClB,MAAM;oBACR,CAAC;oBAED,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;wBAC1B,GAAG,CAAC,GAAG,EAAE,CAAC;wBACV,SAAS;oBACX,CAAC;oBAED,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;wBAC9C,GAAG,CAAC,GAAG,EAAE,CAAC;wBACV,SAAS;oBACX,CAAC;oBAED,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACpC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;oBACvE,GAAG,CAAC,GAAG,EAAE,CAAC;oBAEV,sEAAsE;oBACtE,4CAA4C;oBAC5C,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;wBACxC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;wBAChD,QAAQ,GAAG,IAAI,CAAC;oBAClB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;oBACnB,GAAG,CAAC,KAAK,CAAC,sDAAsD,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,kEAAkE;QAClE,WAAW,EAAE,CAAC;QAEd,oEAAoE;QACpE,uEAAuE;QACvE,sEAAsE;QACtE,0CAA0C;QAC1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,UAAU,CAAC,KAAK,IAAmB,EAAE;gBACnC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBAClB,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;oBACpF,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC1E,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;oBACrC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,gCAAgC;gBAClC,CAAC;YACH,CAAC,EAAE,EAAE,CAAC,CAAC;QACT,CAAC;QAED,OAAO;YACL,EAAE;YACF,KAAK,EAAE,KAAK,IAAmB,EAAE;gBAC/B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;gBACrB,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBAC3C,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,IAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;gBAC3E,CAAC;gBAAC,MAAM,CAAC;oBACP,oDAAoD;gBACtD,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED,6EAA6E;IAEtE,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,SAA0B;QAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,0CAA0C;YAC1C,MAAM,IAAI,CAAC,IAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;gBACtD,MAAM,EAAG,OAAO;gBAChB,GAAG,EAAM,SAAS;aACnB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,yEAAyE;YACzE,yEAAyE;YACzE,4EAA4E;YAC5E,6EAA6E;YAC7E,4EAA4E;YAC5E,2DAA2D;YAC3D,6EAA6E;YAC7E,MAAM,IAAI,CAAC,IAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;gBACtD,MAAM,EAAE,OAAO;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,6EAA6E;IAE7E,cAAc,CAAC,MAAc;QAC3B,OAAO,cAAc,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;IACtD,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAChF,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC9C,2CAA2C;YAC3C,MAAM,IAAI,CAAC,IAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE;gBAC9C,QAAQ,EAAe,CAAC,cAAc,CAAC;gBACvC,OAAO,EAAgB,GAAG,CAAC,YAAY;gBACvC,YAAY,EAAW,GAAG,CAAC,QAAQ;gBACnC,oBAAoB,EAAG,GAAG,CAAC,iBAAiB;aAC7C,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;YACrC,MAAM,IAAI,CAAC,IAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBAC3B,IAAI,EAAmB,GAAG,CAAC,UAAU;gBACrC,QAAQ,EAAe,CAAC,cAAc,CAAC;gBACvC,OAAO,EAAgB,GAAG,CAAC,YAAY;gBACvC,YAAY,EAAW,GAAG,CAAC,QAAQ;gBACnC,oBAAoB,EAAG,GAAG,CAAC,iBAAiB;aAC7C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"event-log-nats.js","sourceRoot":"","sources":["../../../../src/plugins/event-log-nats.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enbox/dwn-server",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.16",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
@@ -33,9 +33,9 @@
|
|
|
33
33
|
"@enbox/common": "0.1.0",
|
|
34
34
|
"@enbox/crypto": "0.1.0",
|
|
35
35
|
"@enbox/dids": "0.1.0",
|
|
36
|
-
"@enbox/dwn-clients": "0.2.
|
|
37
|
-
"@enbox/dwn-sdk-js": "0.3.
|
|
38
|
-
"@enbox/dwn-sql-store": "0.0.
|
|
36
|
+
"@enbox/dwn-clients": "0.2.6",
|
|
37
|
+
"@enbox/dwn-sdk-js": "0.3.2",
|
|
38
|
+
"@enbox/dwn-sql-store": "0.0.17",
|
|
39
39
|
"@nats-io/jetstream": "3.3.1",
|
|
40
40
|
"@nats-io/transport-node": "3.3.1",
|
|
41
41
|
"@simplewebauthn/server": "13.2.3",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { SubscriptionMessage } from '@enbox/dwn-sdk-js';
|
|
2
1
|
import type { JsonRpcId, JsonRpcSuccessResponse } from '@enbox/dwn-clients';
|
|
2
|
+
import type { ProgressToken, SubscriptionMessage } from '@enbox/dwn-sdk-js';
|
|
3
3
|
|
|
4
4
|
import log from 'loglevel';
|
|
5
5
|
|
|
@@ -22,8 +22,8 @@ export const MAX_BUFFER_SIZE = 1000;
|
|
|
22
22
|
* memory growth.
|
|
23
23
|
*/
|
|
24
24
|
export class FlowController {
|
|
25
|
-
/** Ordered list of
|
|
26
|
-
private unacked:
|
|
25
|
+
/** Ordered list of progress tokens for events that have been sent but not yet acknowledged. */
|
|
26
|
+
private unacked: ProgressToken[] = [];
|
|
27
27
|
|
|
28
28
|
/** Buffer of events waiting to be sent once the window opens. */
|
|
29
29
|
private buffer: SubscriptionMessage[] = [];
|
|
@@ -70,19 +70,36 @@ export class FlowController {
|
|
|
70
70
|
* to and including the given cursor, then flushes buffered events into the
|
|
71
71
|
* newly opened window slots.
|
|
72
72
|
*/
|
|
73
|
-
public ack(cursor:
|
|
73
|
+
public ack(cursor: ProgressToken): void {
|
|
74
74
|
if (this.closed) {
|
|
75
75
|
return;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
// Reject tokens from a different stream/epoch — these indicate a client
|
|
79
|
+
// bug or a stale reconnection with an old token domain.
|
|
80
|
+
if (this.unacked.length > 0) {
|
|
81
|
+
const expected = this.unacked[0];
|
|
82
|
+
if (cursor.streamId !== expected.streamId || cursor.epoch !== expected.epoch) {
|
|
83
|
+
log.debug(
|
|
84
|
+
`FlowController: rejected ack with mismatched token domain for subscription ${String(this.subscriptionId)}: ` +
|
|
85
|
+
`expected streamId=${expected.streamId} epoch=${expected.epoch}, ` +
|
|
86
|
+
`got streamId=${cursor.streamId} epoch=${cursor.epoch}`
|
|
87
|
+
);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Find the matching token by position + messageCid.
|
|
93
|
+
const idx = this.unacked.findIndex(
|
|
94
|
+
(t) => t.position === cursor.position && t.messageCid === cursor.messageCid
|
|
95
|
+
);
|
|
79
96
|
if (idx === -1) {
|
|
80
|
-
// Unknown
|
|
81
|
-
log.debug(`FlowController: unknown cursor in ack for subscription ${String(this.subscriptionId)}:
|
|
97
|
+
// Unknown token — could be a stale or duplicate ack. Ignore silently.
|
|
98
|
+
log.debug(`FlowController: unknown cursor in ack for subscription ${String(this.subscriptionId)}: position=${cursor.position}`);
|
|
82
99
|
return;
|
|
83
100
|
}
|
|
84
101
|
|
|
85
|
-
// Remove all entries up to and including the acked
|
|
102
|
+
// Remove all entries up to and including the acked token.
|
|
86
103
|
this.unacked.splice(0, idx + 1);
|
|
87
104
|
|
|
88
105
|
// Flush buffered messages into the freed window slots.
|
|
@@ -8,7 +8,7 @@ import type { RegistrationStore } from '../registration/registration-store.js';
|
|
|
8
8
|
import type { RequestContext } from '../lib/json-rpc-router.js';
|
|
9
9
|
import type { ServerWebSocket } from 'bun';
|
|
10
10
|
import type { WsData } from '../http-api.js';
|
|
11
|
-
import type { Dwn, GenericMessage, SubscriptionMessage } from '@enbox/dwn-sdk-js';
|
|
11
|
+
import type { Dwn, GenericMessage, ProgressToken, SubscriptionMessage } from '@enbox/dwn-sdk-js';
|
|
12
12
|
import type { JsonRpcErrorResponse, JsonRpcId, JsonRpcRequest, JsonRpcResponse, JsonRpcSubscription } from '@enbox/dwn-clients';
|
|
13
13
|
|
|
14
14
|
import log from 'loglevel';
|
|
@@ -117,10 +117,10 @@ export class SocketConnection {
|
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
/**
|
|
120
|
-
* Acknowledges subscription events up to the given
|
|
121
|
-
* flow-control window for the subscription.
|
|
120
|
+
* Acknowledges subscription events up to the given progress token, advancing
|
|
121
|
+
* the flow-control window for the subscription.
|
|
122
122
|
*/
|
|
123
|
-
ackSubscription(id: JsonRpcId, cursor:
|
|
123
|
+
ackSubscription(id: JsonRpcId, cursor: ProgressToken): void {
|
|
124
124
|
const fc = this.flowControllers.get(id);
|
|
125
125
|
if (fc) {
|
|
126
126
|
fc.ack(cursor);
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { ProgressToken } from '@enbox/dwn-sdk-js';
|
|
2
|
+
|
|
1
3
|
import { v4 as uuidv4 } from 'uuid';
|
|
2
4
|
|
|
3
5
|
import type { JsonRpcId } from '@enbox/dwn-clients';
|
|
@@ -8,16 +10,30 @@ import type {
|
|
|
8
10
|
|
|
9
11
|
import { createJsonRpcErrorResponse, createJsonRpcSuccessResponse, JsonRpcErrorCodes } from '@enbox/dwn-clients';
|
|
10
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Validates that a value is a well-formed {@link ProgressToken}.
|
|
15
|
+
*/
|
|
16
|
+
function isProgressToken(value: unknown): value is ProgressToken {
|
|
17
|
+
if (typeof value !== 'object' || value === null) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const obj = value as Record<string, unknown>;
|
|
21
|
+
return typeof obj.streamId === 'string' && obj.streamId !== '' &&
|
|
22
|
+
typeof obj.epoch === 'string' && obj.epoch !== '' &&
|
|
23
|
+
typeof obj.position === 'string' && obj.position !== '' &&
|
|
24
|
+
typeof obj.messageCid === 'string' && obj.messageCid !== '';
|
|
25
|
+
}
|
|
26
|
+
|
|
11
27
|
/**
|
|
12
28
|
* Handles `rpc.ack` — acknowledges receipt of subscription events up to the
|
|
13
|
-
* given
|
|
29
|
+
* given progress token, advancing the per-subscription flow-control window.
|
|
14
30
|
*
|
|
15
31
|
* Request shape:
|
|
16
32
|
* ```json
|
|
17
33
|
* {
|
|
18
34
|
* "jsonrpc": "2.0",
|
|
19
35
|
* "method": "rpc.ack",
|
|
20
|
-
* "params": { "cursor": "
|
|
36
|
+
* "params": { "cursor": { "streamId": "...", "epoch": "...", "position": "...", "messageCid": "..." } },
|
|
21
37
|
* "subscription": { "id": "<subscription-id>" }
|
|
22
38
|
* }
|
|
23
39
|
* ```
|
|
@@ -46,11 +62,12 @@ export const handleSubscriptionAck: JsonRpcHandler = async (
|
|
|
46
62
|
}
|
|
47
63
|
|
|
48
64
|
const { id: subscriptionId } = jsonRpcRequest.subscription as { id: JsonRpcId };
|
|
49
|
-
const { cursor } = (jsonRpcRequest.params ?? {}) as { cursor?:
|
|
65
|
+
const { cursor } = (jsonRpcRequest.params ?? {}) as { cursor?: unknown };
|
|
50
66
|
|
|
51
|
-
if (cursor
|
|
67
|
+
if (!isProgressToken(cursor)) {
|
|
52
68
|
const jsonRpcResponse = createJsonRpcErrorResponse(
|
|
53
|
-
requestId, JsonRpcErrorCodes.InvalidParams,
|
|
69
|
+
requestId, JsonRpcErrorCodes.InvalidParams,
|
|
70
|
+
'params.cursor is required and must be a ProgressToken object with streamId, epoch, position, and messageCid'
|
|
54
71
|
);
|
|
55
72
|
return { jsonRpcResponse };
|
|
56
73
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { NatsConnection } from '@nats-io/transport-node';
|
|
2
2
|
import type { ConsumerMessages, JetStreamClient, JetStreamManager } from '@nats-io/jetstream';
|
|
3
|
-
import type { EventLog, EventLogEntry, EventLogReadOptions, EventLogReadResult, EventLogSubscribeOptions, EventSubscription, Filter, KeyValues, MessageEvent, SubscriptionListener } from '@enbox/dwn-sdk-js';
|
|
3
|
+
import type { EventLog, EventLogEntry, EventLogReadOptions, EventLogReadResult, EventLogSubscribeOptions, EventSubscription, Filter, KeyValues, MessageEvent, ProgressGapInfo, ProgressGapReason, ProgressToken, SubscriptionListener } from '@enbox/dwn-sdk-js';
|
|
4
4
|
|
|
5
5
|
import log from 'loglevel';
|
|
6
6
|
|
|
7
|
+
import { DwnError, DwnErrorCode } from '@enbox/dwn-sdk-js';
|
|
8
|
+
|
|
7
9
|
import { connect } from '@nats-io/transport-node';
|
|
8
10
|
import { AckPolicy, DeliverPolicy, jetstream, jetstreamManager } from '@nats-io/jetstream';
|
|
9
11
|
|
|
@@ -112,6 +114,8 @@ function matchSingleValue(filterValue: unknown, indexValue: string | number | bo
|
|
|
112
114
|
type NatsEventPayload = {
|
|
113
115
|
event : MessageEvent;
|
|
114
116
|
indexes : KeyValues;
|
|
117
|
+
/** The CID of the message that triggered this event. Added in v0.0.16. */
|
|
118
|
+
messageCid? : string;
|
|
115
119
|
};
|
|
116
120
|
|
|
117
121
|
function encodePayload(payload: NatsEventPayload): Uint8Array {
|
|
@@ -165,6 +169,12 @@ export default class NatsEventLog implements EventLog {
|
|
|
165
169
|
/** Active subscription consumers, keyed by consumer name. */
|
|
166
170
|
#activeConsumers: Map<string, { messages?: ConsumerMessages; stopped: boolean }> = new Map();
|
|
167
171
|
|
|
172
|
+
/**
|
|
173
|
+
* Epoch for this EventLog instance. Stable as long as the JetStream stream exists.
|
|
174
|
+
* Generated once at `open()` from the stream's creation timestamp.
|
|
175
|
+
*/
|
|
176
|
+
#epoch: string = '';
|
|
177
|
+
|
|
168
178
|
constructor() {
|
|
169
179
|
this.#config = loadConfig();
|
|
170
180
|
}
|
|
@@ -184,6 +194,10 @@ export default class NatsEventLog implements EventLog {
|
|
|
184
194
|
// Ensure the stream exists (idempotent — update if it already exists).
|
|
185
195
|
await this.#ensureStream();
|
|
186
196
|
|
|
197
|
+
// Derive a stable epoch from the stream creation time.
|
|
198
|
+
const streamInfo = await this.#jsm.streams.info(this.#config.streamName);
|
|
199
|
+
this.#epoch = streamInfo.created ?? crypto.randomUUID();
|
|
200
|
+
|
|
187
201
|
log.info(`NatsEventLog: connected to ${servers.join(', ')}, stream '${this.#config.streamName}' ready`);
|
|
188
202
|
}
|
|
189
203
|
|
|
@@ -208,15 +222,80 @@ export default class NatsEventLog implements EventLog {
|
|
|
208
222
|
}
|
|
209
223
|
}
|
|
210
224
|
|
|
225
|
+
/**
|
|
226
|
+
* Derives a stable streamId from the JetStream stream name and tenant subject.
|
|
227
|
+
*/
|
|
228
|
+
async #getStreamId(tenant: string): Promise<string> {
|
|
229
|
+
const input = `${this.#config.streamName}/${this.#tenantSubject(tenant)}`;
|
|
230
|
+
const bytes = new TextEncoder().encode(input);
|
|
231
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', bytes);
|
|
232
|
+
const hashArray = new Uint8Array(hashBuffer);
|
|
233
|
+
return Array.from(hashArray.slice(0, 8), (b: number) => b.toString(16).padStart(2, '0')).join('');
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
async #buildToken(tenant: string, seq: number, messageCid: string): Promise<ProgressToken> {
|
|
237
|
+
return {
|
|
238
|
+
streamId : await this.#getStreamId(tenant),
|
|
239
|
+
epoch : this.#epoch,
|
|
240
|
+
position : String(seq),
|
|
241
|
+
messageCid,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Validates a cursor against the current NatsEventLog state.
|
|
247
|
+
* Throws `DwnError(EventLogProgressGap)` if the cursor cannot be resumed.
|
|
248
|
+
*/
|
|
249
|
+
async #validateCursor(tenant: string, cursor: ProgressToken): Promise<void> {
|
|
250
|
+
const expectedStreamId = await this.#getStreamId(tenant);
|
|
251
|
+
|
|
252
|
+
let reason: ProgressGapReason;
|
|
253
|
+
if (cursor.streamId !== expectedStreamId) {
|
|
254
|
+
reason = 'stream_mismatch';
|
|
255
|
+
} else if (cursor.epoch !== this.#epoch) {
|
|
256
|
+
reason = 'epoch_mismatch';
|
|
257
|
+
} else {
|
|
258
|
+
// Check if position is within replay bounds using BigInt
|
|
259
|
+
// for safe handling of NATS sequences beyond Number.MAX_SAFE_INTEGER.
|
|
260
|
+
const bounds = await this.getReplayBounds(tenant);
|
|
261
|
+
if (bounds !== undefined) {
|
|
262
|
+
const cursorSeq = BigInt(cursor.position);
|
|
263
|
+
const oldestSeq = BigInt(bounds.oldest.position);
|
|
264
|
+
if (cursorSeq < oldestSeq - 1n) {
|
|
265
|
+
reason = 'token_too_old';
|
|
266
|
+
} else {
|
|
267
|
+
return; // Valid.
|
|
268
|
+
}
|
|
269
|
+
} else {
|
|
270
|
+
return; // No events — vacuously valid.
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const bounds = await this.getReplayBounds(tenant);
|
|
275
|
+
const gapInfo: ProgressGapInfo = {
|
|
276
|
+
requested : cursor,
|
|
277
|
+
oldestAvailable : bounds?.oldest ?? cursor,
|
|
278
|
+
latestAvailable : bounds?.latest ?? cursor,
|
|
279
|
+
reason,
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
const error = new DwnError(
|
|
283
|
+
DwnErrorCode.EventLogProgressGap,
|
|
284
|
+
`progress token gap: ${reason}`
|
|
285
|
+
);
|
|
286
|
+
(error as any).gapInfo = gapInfo;
|
|
287
|
+
throw error;
|
|
288
|
+
}
|
|
289
|
+
|
|
211
290
|
// ---- emit ----------------------------------------------------------------
|
|
212
291
|
|
|
213
|
-
public async emit(tenant: string, event: MessageEvent, indexes: KeyValues): Promise<
|
|
292
|
+
public async emit(tenant: string, event: MessageEvent, indexes: KeyValues, messageCid: string): Promise<ProgressToken | undefined> {
|
|
214
293
|
this.#assertOpen();
|
|
215
294
|
|
|
216
295
|
const subject = this.#tenantSubject(tenant);
|
|
217
|
-
const data = encodePayload({ event, indexes });
|
|
296
|
+
const data = encodePayload({ event, indexes, messageCid });
|
|
218
297
|
const ack = await this.#js!.publish(subject, data);
|
|
219
|
-
return
|
|
298
|
+
return this.#buildToken(tenant, ack.seq, messageCid);
|
|
220
299
|
}
|
|
221
300
|
|
|
222
301
|
// ---- read ----------------------------------------------------------------
|
|
@@ -225,6 +304,9 @@ export default class NatsEventLog implements EventLog {
|
|
|
225
304
|
this.#assertOpen();
|
|
226
305
|
|
|
227
306
|
const { cursor, limit, filters } = options;
|
|
307
|
+
if (cursor !== undefined) {
|
|
308
|
+
await this.#validateCursor(tenant, cursor);
|
|
309
|
+
}
|
|
228
310
|
const subject = this.#tenantSubject(tenant);
|
|
229
311
|
|
|
230
312
|
// Create a one-shot ordered consumer for the read.
|
|
@@ -235,7 +317,7 @@ export default class NatsEventLog implements EventLog {
|
|
|
235
317
|
|
|
236
318
|
if (cursor !== undefined) {
|
|
237
319
|
consumerOpts.deliver_policy = DeliverPolicy.StartSequence;
|
|
238
|
-
consumerOpts.opt_start_seq = Number(cursor) + 1;
|
|
320
|
+
consumerOpts.opt_start_seq = Number(cursor.position) + 1;
|
|
239
321
|
} else {
|
|
240
322
|
consumerOpts.deliver_policy = DeliverPolicy.All;
|
|
241
323
|
}
|
|
@@ -244,7 +326,8 @@ export default class NatsEventLog implements EventLog {
|
|
|
244
326
|
const maxResults = limit ?? Number.MAX_SAFE_INTEGER;
|
|
245
327
|
|
|
246
328
|
const events: EventLogEntry[] = [];
|
|
247
|
-
let
|
|
329
|
+
let lastSeq: number | undefined;
|
|
330
|
+
let lastMessageCid: string | undefined;
|
|
248
331
|
|
|
249
332
|
try {
|
|
250
333
|
const messages = await this.#js!.consumers.get(this.#config.streamName, consumer.name);
|
|
@@ -266,7 +349,10 @@ export default class NatsEventLog implements EventLog {
|
|
|
266
349
|
indexes : payload.indexes,
|
|
267
350
|
});
|
|
268
351
|
|
|
269
|
-
|
|
352
|
+
lastSeq = msg.seq;
|
|
353
|
+
// Prefer the dedicated messageCid field (v0.0.16+), fall back to indexes for older payloads,
|
|
354
|
+
// then a deterministic placeholder so pre-upgrade messages never produce empty-string tokens.
|
|
355
|
+
lastMessageCid = payload.messageCid || (payload.indexes['messageCid'] as string) || `legacy-seq-${msg.seq}`;
|
|
270
356
|
|
|
271
357
|
if (events.length >= maxResults) {
|
|
272
358
|
break;
|
|
@@ -281,9 +367,14 @@ export default class NatsEventLog implements EventLog {
|
|
|
281
367
|
}
|
|
282
368
|
}
|
|
283
369
|
|
|
370
|
+
if (lastSeq !== undefined) {
|
|
371
|
+
const lastToken = await this.#buildToken(tenant, lastSeq, lastMessageCid || `legacy-seq-${lastSeq}`);
|
|
372
|
+
return { events, cursor: lastToken };
|
|
373
|
+
}
|
|
374
|
+
|
|
284
375
|
return {
|
|
285
376
|
events,
|
|
286
|
-
cursor
|
|
377
|
+
cursor,
|
|
287
378
|
};
|
|
288
379
|
}
|
|
289
380
|
|
|
@@ -300,6 +391,11 @@ export default class NatsEventLog implements EventLog {
|
|
|
300
391
|
const subject = this.#tenantSubject(tenant);
|
|
301
392
|
const { cursor, filters } = options ?? {};
|
|
302
393
|
|
|
394
|
+
// Validate cursor before subscribing.
|
|
395
|
+
if (cursor !== undefined) {
|
|
396
|
+
await this.#validateCursor(tenant, cursor);
|
|
397
|
+
}
|
|
398
|
+
|
|
303
399
|
// Build the consumer config.
|
|
304
400
|
const consumerName = `sub-${id}`;
|
|
305
401
|
const consumerOpts: Record<string, unknown> = {
|
|
@@ -311,7 +407,7 @@ export default class NatsEventLog implements EventLog {
|
|
|
311
407
|
|
|
312
408
|
if (cursor !== undefined) {
|
|
313
409
|
consumerOpts.deliver_policy = DeliverPolicy.StartSequence;
|
|
314
|
-
consumerOpts.opt_start_seq = Number(cursor) + 1;
|
|
410
|
+
consumerOpts.opt_start_seq = Number(cursor.position) + 1;
|
|
315
411
|
} else {
|
|
316
412
|
consumerOpts.deliver_policy = DeliverPolicy.New;
|
|
317
413
|
}
|
|
@@ -346,14 +442,17 @@ export default class NatsEventLog implements EventLog {
|
|
|
346
442
|
continue;
|
|
347
443
|
}
|
|
348
444
|
|
|
349
|
-
|
|
350
|
-
|
|
445
|
+
// Prefer the dedicated messageCid field (v0.0.16+), fall back to indexes for older payloads,
|
|
446
|
+
// then a deterministic placeholder so pre-upgrade messages never produce empty-string tokens.
|
|
447
|
+
const msgCid = payload.messageCid || (payload.indexes['messageCid'] as string) || `legacy-seq-${msg.seq}`;
|
|
448
|
+
const eventToken = await this.#buildToken(tenant, msg.seq, msgCid);
|
|
449
|
+
listener({ type: 'event', cursor: eventToken, event: payload.event });
|
|
351
450
|
msg.ack();
|
|
352
451
|
|
|
353
452
|
// EOSE detection: when pending reaches 0, all stored events have been
|
|
354
453
|
// delivered and we transition to live mode.
|
|
355
454
|
if (!sentEose && msg.info.pending === 0) {
|
|
356
|
-
listener({ type: 'eose', cursor:
|
|
455
|
+
listener({ type: 'eose', cursor: eventToken });
|
|
357
456
|
sentEose = true;
|
|
358
457
|
}
|
|
359
458
|
}
|
|
@@ -378,7 +477,7 @@ export default class NatsEventLog implements EventLog {
|
|
|
378
477
|
}
|
|
379
478
|
try {
|
|
380
479
|
const info = await this.#jsm!.consumers.info(this.#config.streamName, consumerName);
|
|
381
|
-
if (info.num_pending === 0 && info.delivered.stream_seq <= Number(cursor)) {
|
|
480
|
+
if (info.num_pending === 0 && info.delivered.stream_seq <= Number(cursor.position)) {
|
|
382
481
|
listener({ type: 'eose', cursor });
|
|
383
482
|
}
|
|
384
483
|
} catch {
|
|
@@ -402,6 +501,67 @@ export default class NatsEventLog implements EventLog {
|
|
|
402
501
|
};
|
|
403
502
|
}
|
|
404
503
|
|
|
504
|
+
// ---- getReplayBounds ------------------------------------------------------
|
|
505
|
+
|
|
506
|
+
public async getReplayBounds(tenant: string): Promise<{ oldest: ProgressToken; latest: ProgressToken } | undefined> {
|
|
507
|
+
this.#assertOpen();
|
|
508
|
+
|
|
509
|
+
const subject = this.#tenantSubject(tenant);
|
|
510
|
+
|
|
511
|
+
// Get stream info to find first/last sequence for this subject.
|
|
512
|
+
const streamInfo = await this.#jsm!.streams.info(this.#config.streamName, { subjects_filter: subject });
|
|
513
|
+
const firstSeq = streamInfo.state.first_seq;
|
|
514
|
+
const lastSeq = streamInfo.state.last_seq;
|
|
515
|
+
|
|
516
|
+
if (lastSeq === 0 || firstSeq > lastSeq) {
|
|
517
|
+
return undefined;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// Read boundary messages to extract their real messageCid values.
|
|
521
|
+
// Uses a one-shot ordered consumer to fetch a single message at a given sequence.
|
|
522
|
+
const readBoundaryCid = async (seq: number): Promise<string> => {
|
|
523
|
+
let consumerName: string | undefined;
|
|
524
|
+
try {
|
|
525
|
+
const consumer = await this.#jsm!.consumers.add(this.#config.streamName, {
|
|
526
|
+
filter_subject : subject,
|
|
527
|
+
ack_policy : AckPolicy.None,
|
|
528
|
+
deliver_policy : DeliverPolicy.StartSequence,
|
|
529
|
+
opt_start_seq : seq,
|
|
530
|
+
});
|
|
531
|
+
consumerName = consumer.name;
|
|
532
|
+
|
|
533
|
+
const handle = await this.#js!.consumers.get(this.#config.streamName, consumerName);
|
|
534
|
+
const iter = await handle.fetch({ max_messages: 1, expires: 2_000 });
|
|
535
|
+
|
|
536
|
+
for await (const msg of iter) {
|
|
537
|
+
const payload = decodePayload(msg.data);
|
|
538
|
+
const cid = (payload?.indexes?.['messageCid'] as string);
|
|
539
|
+
if (cid && cid !== '') {
|
|
540
|
+
return cid;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
} catch {
|
|
544
|
+
// Fall through to deterministic placeholder.
|
|
545
|
+
} finally {
|
|
546
|
+
if (consumerName) {
|
|
547
|
+
try {
|
|
548
|
+
await this.#jsm!.consumers.delete(this.#config.streamName, consumerName);
|
|
549
|
+
} catch { /* best effort */ }
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
// Deterministic placeholder if the message could not be read.
|
|
553
|
+
return `boundary-seq-${seq}`;
|
|
554
|
+
};
|
|
555
|
+
|
|
556
|
+
const oldestCid = await readBoundaryCid(firstSeq);
|
|
557
|
+
const latestCid = await readBoundaryCid(lastSeq);
|
|
558
|
+
|
|
559
|
+
const oldest = await this.#buildToken(tenant, firstSeq, oldestCid);
|
|
560
|
+
const latest = await this.#buildToken(tenant, lastSeq, latestCid);
|
|
561
|
+
|
|
562
|
+
return { oldest, latest };
|
|
563
|
+
}
|
|
564
|
+
|
|
405
565
|
// ---- trim ----------------------------------------------------------------
|
|
406
566
|
|
|
407
567
|
public async trim(tenant: string, olderThan: number | string): Promise<void> {
|