@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.
@@ -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":"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,uFAAuF;IAC/E,OAAO,GAAa,EAAE,CAAC;IAE/B,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,MAAc;QACvB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,uEAAuE;YACvE,GAAG,CAAC,KAAK,CAAC,0DAA0D,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;YAC9G,OAAO;QACT,CAAC;QAED,2DAA2D;QAC3D,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"}
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 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;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 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,10 @@ 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
+ // 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: lastCursor ?? 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
- const eventCursor = String(msg.seq);
269
- listener({ type: 'event', cursor: eventCursor, event: payload.event });
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: eventCursor });
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":"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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.14",
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.4",
37
- "@enbox/dwn-sdk-js": "0.3.0",
38
- "@enbox/dwn-sql-store": "0.0.15",
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 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
 
@@ -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<string> {
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 String(ack.seq);
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 lastCursor: string | undefined;
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
- lastCursor = String(msg.seq);
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: lastCursor ?? 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
- const eventCursor = String(msg.seq);
350
- listener({ type: 'event', cursor: eventCursor, event: payload.event });
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: eventCursor });
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> {