@enbox/dwn-server 0.0.13 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,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 cursors for events that have been sent but not yet acknowledged. */
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: string): void;
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,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,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,uFAAuF;IACvF,OAAO,CAAC,OAAO,CAAgB;IAE/B,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,MAAM,GAAG,IAAI;IAsBhC;;OAEG;IACH,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED;;OAEG;IACH,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED;;OAEG;IACH,OAAO,CAAC,WAAW;CAKpB"}
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 cursors for events that have been sent but not yet acknowledged. */
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
- const idx = this.unacked.lastIndexOf(cursor);
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 cursor — could be a stale or duplicate ack. Ignore silently.
69
- log.debug(`FlowController: unknown cursor in ack for subscription ${String(this.subscriptionId)}: ${cursor}`);
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 cursor.
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":"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"}
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,+FAA+F;IACvF,OAAO,GAAoB,EAAE,CAAC;IAEtC,iEAAiE;IACzD,MAAM,GAA0B,EAAE,CAAC;IAE3C,8DAA8D;IACtD,MAAM,GAAG,KAAK,CAAC;IAEvB,YACmB,cAAyB,EACzB,WAAmB,EACnB,IAAgD,EAChD,UAAsB;QAHtB,mBAAc,GAAd,cAAc,CAAW;QACzB,gBAAW,GAAX,WAAW,CAAQ;QACnB,SAAI,GAAJ,IAAI,CAA4C;QAChD,eAAU,GAAV,UAAU,CAAY;IACtC,CAAC;IAEJ;;;OAGG;IACI,IAAI,CAAC,OAA4B;QACtC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;gBACzC,GAAG,CAAC,IAAI,CACN,oDAAoD,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI;oBACnF,gCAAgC,IAAI,CAAC,MAAM,CAAC,MAAM,aAAa,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CACtF,CAAC;gBACF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;gBACjB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;gBAClB,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,GAAG,CAAC,MAAqB;QAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,wEAAwE;QACxE,wDAAwD;QACxD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC7E,GAAG,CAAC,KAAK,CACP,8EAA8E,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI;oBAC7G,qBAAqB,QAAQ,CAAC,QAAQ,UAAU,QAAQ,CAAC,KAAK,IAAI;oBAClE,gBAAgB,MAAM,CAAC,QAAQ,UAAU,MAAM,CAAC,KAAK,EAAE,CACxD,CAAC;gBACF,OAAO;YACT,CAAC;QACH,CAAC;QAED,oDAAoD;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,CAC5E,CAAC;QACF,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,sEAAsE;YACtE,GAAG,CAAC,KAAK,CAAC,0DAA0D,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChI,OAAO;QACT,CAAC;QAED,0DAA0D;QAC1D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAEhC,uDAAuD;QACvD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAG,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,OAA4B;QAC9C,MAAM,QAAQ,GAAG,4BAA4B,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -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 cursor, advancing the
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: string): void;
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,EAAuC,MAAM,mBAAmB,CAAC;AAClF,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,MAAM,GAAG,IAAI;IAOpD;;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"}
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 cursor, advancing the
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 cursor, advancing the per-subscription flow-control window.
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": "<opaque-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":"AAGA,OAAO,KAAK,EAEV,cAAc,EACf,MAAM,8BAA8B,CAAC;AAItC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAmCnC,CAAC"}
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 cursor, advancing the per-subscription flow-control window.
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": "<opaque-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 === undefined || typeof cursor !== 'string' || cursor === '') {
33
- const jsonRpcResponse = createJsonRpcErrorResponse(requestId, JsonRpcErrorCodes.InvalidParams, 'params.cursor is required and must be a non-empty string');
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":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAQpC,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEjH;;;;;;;;;;;;;;;;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,CAAwB,CAAC;IAExE,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QACxE,MAAM,eAAe,GAAG,0BAA0B,CAChD,SAAS,EAAE,iBAAiB,CAAC,aAAa,EAAE,0DAA0D,CACvG,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
+ {"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<string>;
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;AA+I9M;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,OAAO,YAAa,YAAW,QAAQ;;;IAetC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBtB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAW9E,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAoEpF,SAAS,CACpB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,iBAAiB,CAAC;IA8GhB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA2D7E"}
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;AAiJjQ;;;;;;;;;;;;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;IA+EpF,SAAS,CACpB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,iBAAiB,CAAC;IAoHhB,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
233
  const data = encodePayload({ event, indexes });
165
234
  const ack = await this.#js.publish(subject, data);
166
- return String(ack.seq);
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 lastCursor;
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,9 @@ export default class NatsEventLog {
202
275
  event: payload.event,
203
276
  indexes: payload.indexes,
204
277
  });
205
- lastCursor = String(msg.seq);
278
+ lastSeq = msg.seq;
279
+ // Extract messageCid from the event's message if available.
280
+ lastMessageCid = payload.indexes['messageCid'] ?? '';
206
281
  if (events.length >= maxResults) {
207
282
  break;
208
283
  }
@@ -217,9 +292,13 @@ export default class NatsEventLog {
217
292
  // May already be cleaned up.
218
293
  }
219
294
  }
295
+ if (lastSeq !== undefined) {
296
+ const lastToken = await this.#buildToken(tenant, lastSeq, lastMessageCid ?? '');
297
+ return { events, cursor: lastToken };
298
+ }
220
299
  return {
221
300
  events,
222
- cursor: lastCursor ?? cursor,
301
+ cursor,
223
302
  };
224
303
  }
225
304
  // ---- subscribe -----------------------------------------------------------
@@ -227,6 +306,10 @@ export default class NatsEventLog {
227
306
  this.#assertOpen();
228
307
  const subject = this.#tenantSubject(tenant);
229
308
  const { cursor, filters } = options ?? {};
309
+ // Validate cursor before subscribing.
310
+ if (cursor !== undefined) {
311
+ await this.#validateCursor(tenant, cursor);
312
+ }
230
313
  // Build the consumer config.
231
314
  const consumerName = `sub-${id}`;
232
315
  const consumerOpts = {
@@ -237,7 +320,7 @@ export default class NatsEventLog {
237
320
  };
238
321
  if (cursor !== undefined) {
239
322
  consumerOpts.deliver_policy = DeliverPolicy.StartSequence;
240
- consumerOpts.opt_start_seq = Number(cursor) + 1;
323
+ consumerOpts.opt_start_seq = Number(cursor.position) + 1;
241
324
  }
242
325
  else {
243
326
  consumerOpts.deliver_policy = DeliverPolicy.New;
@@ -265,13 +348,14 @@ export default class NatsEventLog {
265
348
  msg.ack();
266
349
  continue;
267
350
  }
268
- const eventCursor = String(msg.seq);
269
- listener({ type: 'event', cursor: eventCursor, event: payload.event });
351
+ const msgCid = payload.indexes['messageCid'] ?? '';
352
+ const eventToken = await this.#buildToken(tenant, msg.seq, msgCid);
353
+ listener({ type: 'event', cursor: eventToken, event: payload.event });
270
354
  msg.ack();
271
355
  // EOSE detection: when pending reaches 0, all stored events have been
272
356
  // delivered and we transition to live mode.
273
357
  if (!sentEose && msg.info.pending === 0) {
274
- listener({ type: 'eose', cursor: eventCursor });
358
+ listener({ type: 'eose', cursor: eventToken });
275
359
  sentEose = true;
276
360
  }
277
361
  }
@@ -295,7 +379,7 @@ export default class NatsEventLog {
295
379
  }
296
380
  try {
297
381
  const info = await this.#jsm.consumers.info(this.#config.streamName, consumerName);
298
- if (info.num_pending === 0 && info.delivered.stream_seq <= Number(cursor)) {
382
+ if (info.num_pending === 0 && info.delivered.stream_seq <= Number(cursor.position)) {
299
383
  listener({ type: 'eose', cursor });
300
384
  }
301
385
  }
@@ -319,6 +403,59 @@ export default class NatsEventLog {
319
403
  },
320
404
  };
321
405
  }
406
+ // ---- getReplayBounds ------------------------------------------------------
407
+ async getReplayBounds(tenant) {
408
+ this.#assertOpen();
409
+ const subject = this.#tenantSubject(tenant);
410
+ // Get stream info to find first/last sequence for this subject.
411
+ const streamInfo = await this.#jsm.streams.info(this.#config.streamName, { subjects_filter: subject });
412
+ const firstSeq = streamInfo.state.first_seq;
413
+ const lastSeq = streamInfo.state.last_seq;
414
+ if (lastSeq === 0 || firstSeq > lastSeq) {
415
+ return undefined;
416
+ }
417
+ // Read boundary messages to extract their real messageCid values.
418
+ // Uses a one-shot ordered consumer to fetch a single message at a given sequence.
419
+ const readBoundaryCid = async (seq) => {
420
+ let consumerName;
421
+ try {
422
+ const consumer = await this.#jsm.consumers.add(this.#config.streamName, {
423
+ filter_subject: subject,
424
+ ack_policy: AckPolicy.None,
425
+ deliver_policy: DeliverPolicy.StartSequence,
426
+ opt_start_seq: seq,
427
+ });
428
+ consumerName = consumer.name;
429
+ const handle = await this.#js.consumers.get(this.#config.streamName, consumerName);
430
+ const iter = await handle.fetch({ max_messages: 1, expires: 2_000 });
431
+ for await (const msg of iter) {
432
+ const payload = decodePayload(msg.data);
433
+ const cid = payload?.indexes?.['messageCid'];
434
+ if (cid && cid !== '') {
435
+ return cid;
436
+ }
437
+ }
438
+ }
439
+ catch {
440
+ // Fall through to deterministic placeholder.
441
+ }
442
+ finally {
443
+ if (consumerName) {
444
+ try {
445
+ await this.#jsm.consumers.delete(this.#config.streamName, consumerName);
446
+ }
447
+ catch { /* best effort */ }
448
+ }
449
+ }
450
+ // Deterministic placeholder if the message could not be read.
451
+ return `boundary-seq-${seq}`;
452
+ };
453
+ const oldestCid = await readBoundaryCid(firstSeq);
454
+ const latestCid = await readBoundaryCid(lastSeq);
455
+ const oldest = await this.#buildToken(tenant, firstSeq, oldestCid);
456
+ const latest = await this.#buildToken(tenant, lastSeq, latestCid);
457
+ return { oldest, latest };
458
+ }
322
459
  // ---- trim ----------------------------------------------------------------
323
460
  async trim(tenant, olderThan) {
324
461
  this.#assertOpen();
@@ -1 +1 @@
1
- {"version":3,"file":"event-log-nats.js","sourceRoot":"","sources":["../../../../src/plugins/event-log-nats.ts"],"names":[],"mappings":"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"}
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.13",
4
+ "version": "0.0.15",
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.3",
37
- "@enbox/dwn-sdk-js": "0.2.2",
38
- "@enbox/dwn-sql-store": "0.0.14",
36
+ "@enbox/dwn-clients": "0.2.5",
37
+ "@enbox/dwn-sdk-js": "0.3.1",
38
+ "@enbox/dwn-sql-store": "0.0.16",
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 cursors for events that have been sent but not yet acknowledged. */
26
- private unacked: string[] = [];
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: string): void {
73
+ public ack(cursor: ProgressToken): void {
74
74
  if (this.closed) {
75
75
  return;
76
76
  }
77
77
 
78
- const idx = this.unacked.lastIndexOf(cursor);
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 cursor — could be a stale or duplicate ack. Ignore silently.
81
- log.debug(`FlowController: unknown cursor in ack for subscription ${String(this.subscriptionId)}: ${cursor}`);
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 cursor.
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 cursor, advancing the
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: string): void {
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 cursor, advancing the per-subscription flow-control window.
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": "<opaque-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?: string };
65
+ const { cursor } = (jsonRpcRequest.params ?? {}) as { cursor?: unknown };
50
66
 
51
- if (cursor === undefined || typeof cursor !== 'string' || cursor === '') {
67
+ if (!isProgressToken(cursor)) {
52
68
  const jsonRpcResponse = createJsonRpcErrorResponse(
53
- requestId, JsonRpcErrorCodes.InvalidParams, 'params.cursor is required and must be a non-empty string'
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
 
@@ -165,6 +167,12 @@ export default class NatsEventLog implements EventLog {
165
167
  /** Active subscription consumers, keyed by consumer name. */
166
168
  #activeConsumers: Map<string, { messages?: ConsumerMessages; stopped: boolean }> = new Map();
167
169
 
170
+ /**
171
+ * Epoch for this EventLog instance. Stable as long as the JetStream stream exists.
172
+ * Generated once at `open()` from the stream's creation timestamp.
173
+ */
174
+ #epoch: string = '';
175
+
168
176
  constructor() {
169
177
  this.#config = loadConfig();
170
178
  }
@@ -184,6 +192,10 @@ export default class NatsEventLog implements EventLog {
184
192
  // Ensure the stream exists (idempotent — update if it already exists).
185
193
  await this.#ensureStream();
186
194
 
195
+ // Derive a stable epoch from the stream creation time.
196
+ const streamInfo = await this.#jsm.streams.info(this.#config.streamName);
197
+ this.#epoch = streamInfo.created ?? crypto.randomUUID();
198
+
187
199
  log.info(`NatsEventLog: connected to ${servers.join(', ')}, stream '${this.#config.streamName}' ready`);
188
200
  }
189
201
 
@@ -208,15 +220,80 @@ export default class NatsEventLog implements EventLog {
208
220
  }
209
221
  }
210
222
 
223
+ /**
224
+ * Derives a stable streamId from the JetStream stream name and tenant subject.
225
+ */
226
+ async #getStreamId(tenant: string): Promise<string> {
227
+ const input = `${this.#config.streamName}/${this.#tenantSubject(tenant)}`;
228
+ const bytes = new TextEncoder().encode(input);
229
+ const hashBuffer = await crypto.subtle.digest('SHA-256', bytes);
230
+ const hashArray = new Uint8Array(hashBuffer);
231
+ return Array.from(hashArray.slice(0, 8), (b: number) => b.toString(16).padStart(2, '0')).join('');
232
+ }
233
+
234
+ async #buildToken(tenant: string, seq: number, messageCid: string): Promise<ProgressToken> {
235
+ return {
236
+ streamId : await this.#getStreamId(tenant),
237
+ epoch : this.#epoch,
238
+ position : String(seq),
239
+ messageCid,
240
+ };
241
+ }
242
+
243
+ /**
244
+ * Validates a cursor against the current NatsEventLog state.
245
+ * Throws `DwnError(EventLogProgressGap)` if the cursor cannot be resumed.
246
+ */
247
+ async #validateCursor(tenant: string, cursor: ProgressToken): Promise<void> {
248
+ const expectedStreamId = await this.#getStreamId(tenant);
249
+
250
+ let reason: ProgressGapReason;
251
+ if (cursor.streamId !== expectedStreamId) {
252
+ reason = 'stream_mismatch';
253
+ } else if (cursor.epoch !== this.#epoch) {
254
+ reason = 'epoch_mismatch';
255
+ } else {
256
+ // Check if position is within replay bounds using BigInt
257
+ // for safe handling of NATS sequences beyond Number.MAX_SAFE_INTEGER.
258
+ const bounds = await this.getReplayBounds(tenant);
259
+ if (bounds !== undefined) {
260
+ const cursorSeq = BigInt(cursor.position);
261
+ const oldestSeq = BigInt(bounds.oldest.position);
262
+ if (cursorSeq < oldestSeq - 1n) {
263
+ reason = 'token_too_old';
264
+ } else {
265
+ return; // Valid.
266
+ }
267
+ } else {
268
+ return; // No events — vacuously valid.
269
+ }
270
+ }
271
+
272
+ const bounds = await this.getReplayBounds(tenant);
273
+ const gapInfo: ProgressGapInfo = {
274
+ requested : cursor,
275
+ oldestAvailable : bounds?.oldest ?? cursor,
276
+ latestAvailable : bounds?.latest ?? cursor,
277
+ reason,
278
+ };
279
+
280
+ const error = new DwnError(
281
+ DwnErrorCode.EventLogProgressGap,
282
+ `progress token gap: ${reason}`
283
+ );
284
+ (error as any).gapInfo = gapInfo;
285
+ throw error;
286
+ }
287
+
211
288
  // ---- emit ----------------------------------------------------------------
212
289
 
213
- public async emit(tenant: string, event: MessageEvent, indexes: KeyValues): Promise<string> {
290
+ public async emit(tenant: string, event: MessageEvent, indexes: KeyValues, messageCid: string): Promise<ProgressToken | undefined> {
214
291
  this.#assertOpen();
215
292
 
216
293
  const subject = this.#tenantSubject(tenant);
217
294
  const data = encodePayload({ event, indexes });
218
295
  const ack = await this.#js!.publish(subject, data);
219
- return String(ack.seq);
296
+ return this.#buildToken(tenant, ack.seq, messageCid);
220
297
  }
221
298
 
222
299
  // ---- read ----------------------------------------------------------------
@@ -225,6 +302,9 @@ export default class NatsEventLog implements EventLog {
225
302
  this.#assertOpen();
226
303
 
227
304
  const { cursor, limit, filters } = options;
305
+ if (cursor !== undefined) {
306
+ await this.#validateCursor(tenant, cursor);
307
+ }
228
308
  const subject = this.#tenantSubject(tenant);
229
309
 
230
310
  // Create a one-shot ordered consumer for the read.
@@ -235,7 +315,7 @@ export default class NatsEventLog implements EventLog {
235
315
 
236
316
  if (cursor !== undefined) {
237
317
  consumerOpts.deliver_policy = DeliverPolicy.StartSequence;
238
- consumerOpts.opt_start_seq = Number(cursor) + 1;
318
+ consumerOpts.opt_start_seq = Number(cursor.position) + 1;
239
319
  } else {
240
320
  consumerOpts.deliver_policy = DeliverPolicy.All;
241
321
  }
@@ -244,7 +324,8 @@ export default class NatsEventLog implements EventLog {
244
324
  const maxResults = limit ?? Number.MAX_SAFE_INTEGER;
245
325
 
246
326
  const events: EventLogEntry[] = [];
247
- let lastCursor: string | undefined;
327
+ let lastSeq: number | undefined;
328
+ let lastMessageCid: string | undefined;
248
329
 
249
330
  try {
250
331
  const messages = await this.#js!.consumers.get(this.#config.streamName, consumer.name);
@@ -266,7 +347,9 @@ export default class NatsEventLog implements EventLog {
266
347
  indexes : payload.indexes,
267
348
  });
268
349
 
269
- lastCursor = String(msg.seq);
350
+ lastSeq = msg.seq;
351
+ // Extract messageCid from the event's message if available.
352
+ lastMessageCid = (payload.indexes['messageCid'] as string) ?? '';
270
353
 
271
354
  if (events.length >= maxResults) {
272
355
  break;
@@ -281,9 +364,14 @@ export default class NatsEventLog implements EventLog {
281
364
  }
282
365
  }
283
366
 
367
+ if (lastSeq !== undefined) {
368
+ const lastToken = await this.#buildToken(tenant, lastSeq, lastMessageCid ?? '');
369
+ return { events, cursor: lastToken };
370
+ }
371
+
284
372
  return {
285
373
  events,
286
- cursor: lastCursor ?? cursor,
374
+ cursor,
287
375
  };
288
376
  }
289
377
 
@@ -300,6 +388,11 @@ export default class NatsEventLog implements EventLog {
300
388
  const subject = this.#tenantSubject(tenant);
301
389
  const { cursor, filters } = options ?? {};
302
390
 
391
+ // Validate cursor before subscribing.
392
+ if (cursor !== undefined) {
393
+ await this.#validateCursor(tenant, cursor);
394
+ }
395
+
303
396
  // Build the consumer config.
304
397
  const consumerName = `sub-${id}`;
305
398
  const consumerOpts: Record<string, unknown> = {
@@ -311,7 +404,7 @@ export default class NatsEventLog implements EventLog {
311
404
 
312
405
  if (cursor !== undefined) {
313
406
  consumerOpts.deliver_policy = DeliverPolicy.StartSequence;
314
- consumerOpts.opt_start_seq = Number(cursor) + 1;
407
+ consumerOpts.opt_start_seq = Number(cursor.position) + 1;
315
408
  } else {
316
409
  consumerOpts.deliver_policy = DeliverPolicy.New;
317
410
  }
@@ -346,14 +439,15 @@ export default class NatsEventLog implements EventLog {
346
439
  continue;
347
440
  }
348
441
 
349
- const eventCursor = String(msg.seq);
350
- listener({ type: 'event', cursor: eventCursor, event: payload.event });
442
+ const msgCid = (payload.indexes['messageCid'] as string) ?? '';
443
+ const eventToken = await this.#buildToken(tenant, msg.seq, msgCid);
444
+ listener({ type: 'event', cursor: eventToken, event: payload.event });
351
445
  msg.ack();
352
446
 
353
447
  // EOSE detection: when pending reaches 0, all stored events have been
354
448
  // delivered and we transition to live mode.
355
449
  if (!sentEose && msg.info.pending === 0) {
356
- listener({ type: 'eose', cursor: eventCursor });
450
+ listener({ type: 'eose', cursor: eventToken });
357
451
  sentEose = true;
358
452
  }
359
453
  }
@@ -378,7 +472,7 @@ export default class NatsEventLog implements EventLog {
378
472
  }
379
473
  try {
380
474
  const info = await this.#jsm!.consumers.info(this.#config.streamName, consumerName);
381
- if (info.num_pending === 0 && info.delivered.stream_seq <= Number(cursor)) {
475
+ if (info.num_pending === 0 && info.delivered.stream_seq <= Number(cursor.position)) {
382
476
  listener({ type: 'eose', cursor });
383
477
  }
384
478
  } catch {
@@ -402,6 +496,67 @@ export default class NatsEventLog implements EventLog {
402
496
  };
403
497
  }
404
498
 
499
+ // ---- getReplayBounds ------------------------------------------------------
500
+
501
+ public async getReplayBounds(tenant: string): Promise<{ oldest: ProgressToken; latest: ProgressToken } | undefined> {
502
+ this.#assertOpen();
503
+
504
+ const subject = this.#tenantSubject(tenant);
505
+
506
+ // Get stream info to find first/last sequence for this subject.
507
+ const streamInfo = await this.#jsm!.streams.info(this.#config.streamName, { subjects_filter: subject });
508
+ const firstSeq = streamInfo.state.first_seq;
509
+ const lastSeq = streamInfo.state.last_seq;
510
+
511
+ if (lastSeq === 0 || firstSeq > lastSeq) {
512
+ return undefined;
513
+ }
514
+
515
+ // Read boundary messages to extract their real messageCid values.
516
+ // Uses a one-shot ordered consumer to fetch a single message at a given sequence.
517
+ const readBoundaryCid = async (seq: number): Promise<string> => {
518
+ let consumerName: string | undefined;
519
+ try {
520
+ const consumer = await this.#jsm!.consumers.add(this.#config.streamName, {
521
+ filter_subject : subject,
522
+ ack_policy : AckPolicy.None,
523
+ deliver_policy : DeliverPolicy.StartSequence,
524
+ opt_start_seq : seq,
525
+ });
526
+ consumerName = consumer.name;
527
+
528
+ const handle = await this.#js!.consumers.get(this.#config.streamName, consumerName);
529
+ const iter = await handle.fetch({ max_messages: 1, expires: 2_000 });
530
+
531
+ for await (const msg of iter) {
532
+ const payload = decodePayload(msg.data);
533
+ const cid = (payload?.indexes?.['messageCid'] as string);
534
+ if (cid && cid !== '') {
535
+ return cid;
536
+ }
537
+ }
538
+ } catch {
539
+ // Fall through to deterministic placeholder.
540
+ } finally {
541
+ if (consumerName) {
542
+ try {
543
+ await this.#jsm!.consumers.delete(this.#config.streamName, consumerName);
544
+ } catch { /* best effort */ }
545
+ }
546
+ }
547
+ // Deterministic placeholder if the message could not be read.
548
+ return `boundary-seq-${seq}`;
549
+ };
550
+
551
+ const oldestCid = await readBoundaryCid(firstSeq);
552
+ const latestCid = await readBoundaryCid(lastSeq);
553
+
554
+ const oldest = await this.#buildToken(tenant, firstSeq, oldestCid);
555
+ const latest = await this.#buildToken(tenant, lastSeq, latestCid);
556
+
557
+ return { oldest, latest };
558
+ }
559
+
405
560
  // ---- trim ----------------------------------------------------------------
406
561
 
407
562
  public async trim(tenant: string, olderThan: number | string): Promise<void> {