dynamodb-reactive 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -620,7 +620,24 @@ override alarm() {
620
620
  }
621
621
  ```
622
622
 
623
- `hub.present(principal)` is true while the principal holds a socket that pinged within `timeoutMs`. The runtime records each auto-answered ping without waking the object, so presence costs nothing per heartbeat. An alarm wakes the object when the stalest tracked socket would time out, closes silent sockets with code `4001`, and reschedules while tracked sockets remain. That sweep is what catches a peer that vanished without a close frame, which an open socket alone never reveals. `onChange` runs when a principal gains its first live socket or loses its last one; the last reported state is stored under `presence:<principal>`, so each change is reported once. Presence needs `autoPong` and the object's `alarm` delegated to the hub.
623
+ `hub.present(principal)` is true while the principal holds a socket that pinged within `timeoutMs`. The runtime records each auto-answered ping without waking the object, so presence costs nothing per heartbeat. An alarm wakes the object when the stalest tracked socket would time out, closes silent sockets with code `4001`, and reschedules while tracked sockets remain. That sweep is what catches a peer that vanished without a close frame, which an open socket alone never reveals. `onChange` runs when a principal gains its first live socket or loses its last one; the last reported state is stored under `presence:<principal>`, so each change is reported once. Presence needs `autoPong` and the object's `alarm` delegated to the hub. `principals` may also be a predicate, such as `(principal) => principal.startsWith('listener:')`, for open-ended principals. The hub keeps an earlier alarm when it schedules its sweep, so an object with its own alarm work should schedule the same way and call `hub.alarm()` from its `alarm`.
624
+
625
+ ### Application frames and socket data
626
+
627
+ `onOpen(socket, principal)` and `onClose(socket, principal)` run as sockets come and go, and `onMessage(socket, principal, frame)` receives any client frame with a `type` the protocol does not handle. Clients send those with `client.send({ type: 'listening', track })`, which returns false while disconnected; resend from `onConnectionStateChange` once connected again. `hub.setSocketData(socket, data)` keeps small per-socket state that survives hibernation, read back with `hub.socketData(socket)` while iterating `hub.sockets()`. It shares the 2,048-byte attachment limit with subscriptions. During `onClose` the closing socket may still be listed, so exclude it when counting.
628
+
629
+ ### Hubs for apps hosted elsewhere
630
+
631
+ An app on Vercel or AWS can still use a Cloudflare hub. Add `routes.notify` with a `notifySecret`, and call it after writes from any backend:
632
+
633
+ ```ts
634
+ import { remoteHub } from 'dynamodb-reactive/cloudflare';
635
+
636
+ const hub = remoteHub({ url: 'https://hub.example.com/api/reactive/notify', secret });
637
+ await hub.notify('scraper.status');
638
+ ```
639
+
640
+ The app can mint browser tickets itself with `createSignedClusterTicket` and the hub's ticket secret, pointing `url` at the hub's socket route. Pass `allowedOrigins` so browsers on the app's origin may call the ticket and reactive routes cross-origin. When the data lives outside Cloudflare, a path's snapshot can be a small marker such as `{ version }`, and the page re-fetches from its own API whenever the marker changes.
624
641
 
625
642
  ## Delivery model
626
643
 
@@ -169,6 +169,14 @@ declare class ReactiveClient {
169
169
  disconnect(): void;
170
170
  forceReconnect(): void;
171
171
  getConnectionState(): ConnectionState;
172
+ /**
173
+ * Sends an application frame over the socket, such as a presence update a
174
+ * hub's `onMessage` handles. Returns false while disconnected; resend from
175
+ * `onConnectionStateChange` once connected again.
176
+ */
177
+ send(frame: Record<string, unknown> & {
178
+ type: string;
179
+ }): boolean;
172
180
  onConnectionStateChange(listener: (state: ConnectionState) => void): () => void;
173
181
  subscribe<TData, TInput = unknown>(path: string, options?: SubscriptionOptions<TInput, TData>): Subscription<TData>;
174
182
  call<TInput, TOutput>(path: string, input: TInput, options?: MutationOptions<TInput, TOutput>): Promise<TOutput>;
package/dist/client.cjs CHANGED
@@ -273,6 +273,13 @@ var WebSocketManager = class {
273
273
  this.setState("disconnected");
274
274
  void this.connect().catch(() => void 0);
275
275
  }
276
+ /** Sends an application frame on the open socket; false when not connected. */
277
+ send(frame) {
278
+ const socket = this.ws;
279
+ if (!socket || this.state !== "connected" || socket.readyState !== socket.OPEN) return false;
280
+ socket.send(JSON.stringify(frame));
281
+ return true;
282
+ }
276
283
  onMessage(handler) {
277
284
  this.messageHandlers.add(handler);
278
285
  return () => this.messageHandlers.delete(handler);
@@ -496,6 +503,14 @@ var ReactiveClient = class {
496
503
  getConnectionState() {
497
504
  return this.connectionState;
498
505
  }
506
+ /**
507
+ * Sends an application frame over the socket, such as a presence update a
508
+ * hub's `onMessage` handles. Returns false while disconnected; resend from
509
+ * `onConnectionStateChange` once connected again.
510
+ */
511
+ send(frame) {
512
+ return this.wsManager.send(frame);
513
+ }
499
514
  onConnectionStateChange(listener) {
500
515
  this.stateListeners.add(listener);
501
516
  return () => this.stateListeners.delete(listener);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../client/src/canonical.ts","../../client/src/patcher.ts","../../client/src/log.ts","../../client/src/websocket.ts","../../client/src/client.ts"],"names":["key","jsonpatch","error"],"mappings":";;;;;;;;;AAAA,SAAS,aACP,KAAA,EACA,IAAA,EACA,KACA,SAAA,GAAY,KAAA,EACZ,cAAc,IAAA,EACM;AACpB,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,MAAA;AAE3B,EAAA,QAAQ,OAAO,KAAA;AAAO,IACpB,KAAK,QAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,IAC7B,KAAK,QAAA;AACH,MAAA,OAAO,OAAO,QAAA,CAAS,KAAK,IAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,MAAA;AAAA,IAC1D,KAAK,WAAA;AACH,MAAA,OAAO,YAAY,MAAA,GAAS,MAAA;AAAA,IAC9B,KAAK,QAAA,EAAU;AACb,MAAA,IAAI,eAAe,QAAA,IAAY,KAAA,IAAS,OAAO,KAAA,CAAM,WAAW,UAAA,EAAY;AAC1E,QAAA,OAAO,YAAA,CAAa,MAAM,MAAA,CAAO,GAAG,GAAG,IAAA,EAAM,GAAA,EAAK,WAAW,KAAK,CAAA;AAAA,MACpE;AACA,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACnB,QAAA,MAAM,IAAI,UAAU,kDAAkD,CAAA;AAAA,MACxE;AAEA,MAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,MAAA,IAAI;AACF,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,UAAA,MAAM,QAAkB,EAAC;AACzB,UAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,QAAQ,KAAA,EAAA,EAAS;AACjD,YAAA,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA,EAAG,IAAI,CAAA,IAAK,MAAM,CAAA;AAAA,UAC5E;AACA,UAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,QAC5B;AAEA,QAAA,MAAM,MAAA,GAAS,KAAA;AACf,QAAA,MAAM,UAAoB,EAAC;AAC3B,QAAA,KAAA,MAAWA,QAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAK,EAAG;AAC5C,UAAA,MAAM,OAAO,YAAA,CAAa,MAAA,CAAOA,IAAG,CAAA,EAAG,MAAMA,IAAG,CAAA;AAChD,UAAA,IAAI,SAAS,KAAA,CAAA,EAAW;AACtB,YAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAA,CAAK,SAAA,CAAUA,IAAG,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,UAC/C;AAAA,QACF;AACA,QAAA,OAAO,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,MAC9B,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAAA,IACA,KAAK,QAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL;AACE,MAAA,MAAM,IAAI,SAAA,CAAU,CAAA,+BAAA,EAAkC,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA;AAE1E;AAGO,SAAS,WAAA,CAAY,MAAc,KAAA,EAAyB;AACjE,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,KAAA,kBAAO,IAAI,GAAA,EAAI,EAAG,EAAE,KAAK,WAAW,CAAA,CAAA;AACrF;ACpDO,SAAS,YAAA,CAAgB,UAAa,OAAA,EAAyB;AACpE,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAA0B,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AACrD,IAAA,MAAM,EAAA,GAAgB;AAAA,MACpB,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,MAAM,KAAA,CAAM;AAAA,KACd;AAEA,IAAA,IAAI,OAAA,IAAW,KAAA,IAAS,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW;AACjD,MAAC,EAAA,CAA0B,QAAQ,KAAA,CAAM,KAAA;AAAA,IAC3C;AACA,IAAA,IAAI,MAAA,IAAU,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW;AAC/C,MAAC,EAAA,CAAwB,OAAO,KAAA,CAAM,IAAA;AAAA,IACxC;AAEA,IAAA,OAAO,EAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,SAASC,0BAAA,CAAU,UAAA;AAAA,MACvB,gBAAgB,QAAQ,CAAA;AAAA,MACxB,UAAA;AAAA,MACA,IAAA;AAAA;AAAA,MACA;AAAA;AAAA,KACF;AAEA,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,EAChB,SAASC,MAAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,yBAAA,EAA2B,EAAE,KAAA,EAAOA,QAAO,CAAA;AAAA,EAC7D;AACF;;;ACzBO,SAAS,SAAS,MAAA,EAAyB;AAChD,EAAA,OAAA,CAAQ,KAAA,CAAM,GAAG,MAAM,CAAA;AACzB;;;ACYA,SAAS,aAAa,MAAA,EAA6C;AACjE,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,IAAA;AAAA,IACf,iBAAA,EAAmB,GAAA;AAAA,IACnB,gBAAA,EAAkB,GAAA;AAAA,IAClB,iBAAA,EAAmB,IAAI,EAAA,GAAK,GAAA;AAAA,IAC5B,gBAAA,EAAkB,IAAA;AAAA,IAClB,oBAAA,EAAsB,EAAA;AAAA,IACtB,cAAA,EAAgB,GAAA;AAAA,IAChB,GAAG;AAAA,GACL;AACF;AAGO,IAAM,mBAAN,MAAuB;AAAA,EACpB,MAAA;AAAA,EACA,EAAA,GAAuB,IAAA;AAAA,EACvB,KAAA,GAAyB,cAAA;AAAA,EACzB,iBAAA,GAAoB,CAAA;AAAA,EACpB,cAAA,GAAuD,IAAA;AAAA,EACvD,cAAA,GAAuD,IAAA;AAAA,EACvD,cAAA,GAAwD,IAAA;AAAA,EACxD,SAAA,GAAkD,IAAA;AAAA,EAClD,eAAA,uBAAsB,GAAA,EAAuC;AAAA,EAC7D,aAAA,uBAAoB,GAAA,EAAsC;AAAA,EAC1D,iBAAA,uBAAwB,GAAA,EAAkC;AAAA,EAC1D,aAAA,GAA+B,IAAA;AAAA,EAC/B,iBAAA,uBAAwB,GAAA,EAAsB;AAAA,EAC9C,gBAAA,GAAmB,CAAA;AAAA,EACnB,qBAAA,GAAwB,KAAA;AAAA,EACxB,mBAAA;AAAA,EAER,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,aAAa,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,UAAU,MAAA,EAAoC;AAC5C,IAAA,IAAA,CAAK,MAAA,GAAS,aAAa,MAAM,CAAA;AAAA,EACnC;AAAA,EAEA,IAAI,YAAA,GAA8B;AAChC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,IAAI,UAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA,EAEA,mBAAA,CAAoB,OAAA,GAAiC,EAAC,EAAoB;AACxE,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,KAAA,KAAU,WAAA,EAAa;AACpD,MAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,OAAA,CAAQ,QAAQ,OAAA,EAAS;AAC3B,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,yBAAyB,CAAC,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,iBAAA;AACnD,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AAEtC,MAAA,IAAI,OAAA;AACJ,MAAA,MAAM,QAAQ,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,yBAAyB,CAAC,CAAA;AAC/D,MAAA,MAAM,MAAA,GAA2B;AAAA,QAC/B,OAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAS,MAAM;AACb,UAAA,IAAI,OAAA,eAAsB,OAAO,CAAA;AACjC,UAAA,OAAA,CAAQ,MAAA,EAAQ,mBAAA,CAAoB,OAAA,EAAS,KAAK,CAAA;AAAA,QACpD;AAAA,OACF;AACA,MAAA,MAAM,MAAA,GAAS,CAAC,OAAA,KAAmB;AACjC,QAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,MAAM,CAAA,EAAG;AAC5C,QAAA,MAAA,CAAO,OAAA,EAAQ;AACf,QAAA,MAAA,CAAO,OAAO,CAAA;AAAA,MAChB,CAAA;AAEA,MAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,MAAM,CAAA;AACjC,MAAA,OAAA,CAAQ,QAAQ,gBAAA,CAAiB,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AAC/D,MAAA,OAAA,GAAU,UAAA;AAAA,QACR,MACE,MAAA;AAAA,UACE,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,SAAS,CAAA,EAAA,CAAA,EAAM;AAAA,YACrD,OAAO,IAAA,CAAK;AAAA,WACb;AAAA,SACH;AAAA,QACF;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,QAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,IAAA,CAAK,UAAU,WAAA,EAAa;AAChC,IAAA,IAAI,IAAA,CAAK,UAAU,YAAA,EAAc;AAC/B,MAAA,MAAM,KAAK,mBAAA,EAAoB;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,cAAA,EAAgB,IAAA,CAAK,mBAAA,GAAsB,MAAA;AAC9D,IAAA,IAAA,CAAK,qBAAA,GAAwB,KAAA;AAC7B,IAAA,MAAM,UAAA,GAAa,EAAE,IAAA,CAAK,gBAAA;AAC1B,IAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAC1B,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,SAAA,GAAY,IAAA;AAEhB,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,oBAAoB,OAAO,UAAA,CAAW,cAAc,UAAA,EAAY;AAC/E,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SAEF;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,QAAA,EAAS;AAEhC,MAAA,IAAI,UAAA,KAAe,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,qBAAA,EAAuB;AACtE,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,UAAA;AACJ,MAAA,IAAI;AACF,QAAA,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,gBAAA,GACrB,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,GAAG,CAAA,GAChC,IAAI,UAAA,CAAW,SAAA,CAAU,GAAG,CAAA;AAAA,MAClC,SAAS,KAAA,EAAO;AAGd,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAA,GAAS,UAAA;AACT,MAAA,IAAA,CAAK,EAAA,GAAK,UAAA;AACV,MAAA,IAAA,CAAK,mBAAA,CAAoB,YAAY,UAAU,CAAA;AAE/C,MAAA,UAAA,CAAW,SAAS,MAAM;AACxB,QAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,UAAU,CAAA,EAAG;AAC7C,QAAA,UAAA,CAAW,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAC,CAAA;AAAA,MAClD,CAAA;AAEA,MAAA,UAAA,CAAW,UAAU,MAAM;AACzB,QAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,UAAU,CAAA,EAAG;AAC7C,QAAA,IAAA,CAAK,WAAA,EAAY;AAAA,MACnB,CAAA;AAEA,MAAA,UAAA,CAAW,UAAU,MAAM;AACzB,QAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,UAAU,CAAA,EAAG;AAC7C,QAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,iBAAiB,CAAA;AAC3C,QAAA,IAAA,CAAK,mBAAA,GAAsB,OAAA;AAC3B,QAAA,IAAA,CAAK,uBAAA,CAAwB,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,SAAS,OAAO,CAAA;AAAA,MACtE,CAAA;AAEA,MAAA,UAAA,CAAW,SAAA,GAAY,CAAC,KAAA,KAAU;AAChC,QAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,UAAU,CAAA,EAAG;AAC7C,QAAA,IAAA,CAAK,cAAA,CAAe,UAAA,EAAY,UAAA,EAAY,KAAA,CAAM,IAAI,CAAA;AAAA,MACxD,CAAA;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,UAAA,KAAe,KAAK,gBAAA,EAAkB;AAC1C,MAAA,MAAM,OAAA,GAAU,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACxE,MAAA,IAAA,CAAK,mBAAA,GAAsB,OAAA;AAC3B,MAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,IAAA,CAAK,WAAA,EAAY;AACjB,QAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AAAA,MAC3B;AACA,MAAA,IAAI,MAAA,IAAU,IAAA,CAAK,EAAA,KAAO,MAAA,SAAe,KAAA,EAAM;AAC/C,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,MAAA,IAAA,CAAK,uBAAA,CAAwB,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,SAAS,OAAO,CAAA;AAGpE,MAAA,IAAI,aAAa,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,CAAC,KAAK,qBAAA,EAAuB;AACzE,QAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,QAAA,MAAM,KAAK,mBAAA,EAAoB;AAC/B,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,cAAc,OAAO,CAAA;AAC1B,MAAA,MAAM,OAAA;AAAA,IACR;AAEA,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAAA,EACjC;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA;AAC7B,IAAA,EAAE,IAAA,CAAK,gBAAA;AACP,IAAA,IAAA,CAAK,WAAA,EAAY;AAEjB,IAAA,MAAM,SAAS,IAAA,CAAK,EAAA;AACpB,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,IAAA,MAAA,EAAQ,KAAA,CAAM,KAAM,mBAAmB,CAAA;AACvC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,KAAA,CAAM,wBAAwB,CAAC,CAAA;AAAA,EACxD;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,qBAAA,GAAwB,KAAA;AAC7B,IAAA,EAAE,IAAA,CAAK,gBAAA;AACP,IAAA,IAAA,CAAK,WAAA,EAAY;AAEjB,IAAA,MAAM,SAAS,IAAA,CAAK,EAAA;AACpB,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,IAAA,MAAA,EAAQ,KAAA,CAAM,KAAM,iBAAiB,CAAA;AACrC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,IAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,IAAA,KAAK,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EAC3C;AAAA,EAEA,UAAU,OAAA,EAAwD;AAChE,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,OAAO,CAAA;AAChC,IAAA,OAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAO,CAAA;AAAA,EAClD;AAAA,EAEA,cAAc,OAAA,EAAuD;AACnE,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,OAAO,CAAA;AAC9B,IAAA,OAAO,MAAM,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA;AAAA,EAChD;AAAA,EAEA,YAAY,OAAA,EAAmD;AAC7D,IAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,OAAO,CAAA;AAClC,IAAA,OAAO,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,OAAO,CAAA;AAAA,EACpD;AAAA,EAEA,MAAc,QAAA,GAA4B;AACxC,IAAA,IAAI,GAAA,GAAM,KAAK,MAAA,CAAO,GAAA;AACtB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,OAAO,GAAA;AAE9B,IAAA,MAAM,KAAA,GACJ,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,UAAA,GAAa,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK,GAAI,IAAA,CAAK,MAAA,CAAO,IAAA;AAClF,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAC5C,IAAA,GAAA,GAAM,GAAG,GAAG,CAAA,EAAG,SAAS,CAAA,MAAA,EAAS,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAC1D,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,cAAA,CAAe,MAAA,EAAmB,UAAA,EAAoB,OAAA,EAAwB;AACpF,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AAC1C,MAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa;AAChC,QAAA,IAAI,KAAK,aAAA,EAAe;AACxB,QAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,YAAA;AAC7B,QAAA,MAAA,CAAO,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAC,CAAA;AAC5C,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA,IAAI,CAAC,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,UAAU,WAAA,EAAa;AACvD,QAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,QAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA,CAAA;AAC3B,QAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,QAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AACzB,QAAA,IAAA,CAAK,cAAA,CAAe,QAAQ,UAAU,CAAA;AACtC,QAAA,IAAA,CAAK,uBAAA,CAAwB,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAC/D,QAAA,IAAA,CAAK,cAAA,CAAe,KAAK,aAAa,CAAA;AACtC,QAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,iBAAA,EAAmB,OAAA,CAAQ,UAAU,CAAA;AAChE,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,eAAA,EAAiB,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC7D,SAAS,KAAA,EAAO;AACd,MAAA,KAAA,CAAS,sCAAsC,KAAK,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEQ,mBAAA,CAAoB,QAAmB,UAAA,EAA0B;AACvE,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,MAAA,IAAI,CAAC,KAAK,SAAA,CAAU,MAAA,EAAQ,UAAU,CAAA,IAAK,IAAA,CAAK,UAAU,WAAA,EAAa;AACrE,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,+BAA+B,CAAA;AACzD,MAAA,IAAA,CAAK,mBAAA,GAAsB,OAAA;AAC3B,MAAA,IAAA,CAAK,uBAAA,CAAwB,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,SAAS,OAAO,CAAA;AACpE,MAAA,MAAA,CAAO,KAAA,CAAM,KAAM,mBAAmB,CAAA;AAAA,IACxC,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,gBAAgB,CAAA;AAAA,EACjC;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,IAAA,IAAA,CAAK,uBAAA,CAAwB,cAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA;AAErE,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,CAAC,KAAK,qBAAA,EAAuB;AAC5D,MAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAA,CAAc,IAAI,KAAA,CAAM,wBAAwB,CAAC,CAAA;AAAA,IACxD;AAAA,EACF;AAAA,EAEQ,cAAA,CAAe,QAAmB,UAAA,EAA0B;AAClE,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,cAAA,GAAiB,YAAY,MAAM;AACtC,MAAA,IACE,CAAC,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,UAAU,CAAA,IAClC,IAAA,CAAK,KAAA,KAAU,WAAA,IACf,MAAA,CAAO,UAAA,KAAe,MAAA,CAAO,IAAA,EAC7B;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAC,CAAA;AAC5C,MAAA,IAAA,CAAK,SAAA,KAAc,WAAW,MAAM;AAClC,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,UAAU,CAAA,EAAG;AACzC,QAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,+BAA+B,CAAA;AACzD,QAAA,IAAA,CAAK,mBAAA,GAAsB,OAAA;AAC3B,QAAA,IAAA,CAAK,uBAAA,CAAwB,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,SAAS,OAAO,CAAA;AAGpE,QAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,QAAA,MAAA,CAAO,KAAA,CAAM,MAAM,mBAAmB,CAAA;AACtC,QAAA,IAAA,CAAK,WAAA,EAAY;AAAA,MACnB,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,gBAAgB,CAAA;AAAA,IACjC,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,iBAAiB,CAAA;AAAA,EAClC;AAAA,EAEQ,SAAA,CAAU,QAAmB,UAAA,EAA6B;AAChE,IAAA,OAAO,IAAA,CAAK,EAAA,KAAO,MAAA,IAAU,IAAA,CAAK,gBAAA,KAAqB,UAAA;AAAA,EACzD;AAAA,EAEQ,SAAS,KAAA,EAA8B;AAC7C,IAAA,IAAI,IAAA,CAAK,UAAU,KAAA,EAAO;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,aAAA,EAAe,OAAA,CAAQ,KAAK,CAAA;AAAA,EACzD;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,qBAAA,EAAuB;AACvD,IAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,MAAA,CAAO,oBAAA,EAAsB;AAC9D,MAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,mCAAA,EAAqC;AAAA,QAC7D,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AACD,MAAA,KAAA,CAAS,QAAQ,OAAO,CAAA;AACxB,MAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,MAAA,IAAA,CAAK,cAAc,OAAO,CAAA;AAC1B,MAAA,IAAA,CAAK,uBAAA,CAAwB,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,SAAS,OAAO,CAAA;AACpE,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,IAAA,IAAA,CAAK,iBAAA,EAAA;AACL,IAAA,MAAM,KAAA,GACJ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAO,cAAA,GAAiB,CAAA,KAAM,IAAA,CAAK,iBAAA,GAAoB,IAAI,GAAK,CAAA,IAC7E,GAAA,GAAM,IAAA,CAAK,QAAO,GAAI,GAAA,CAAA;AAEzB,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,KAAK,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IAC3C,GAAG,KAAK,CAAA;AAAA,EACV;AAAA,EAEQ,eAAe,YAAA,EAA4B;AACjD,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAA,CAAK,iBAAiB,CAAA;AAC1C,IAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAC7B,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAA,CAAO,OAAA,EAAQ;AACf,MAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA,EAEQ,uBAAA,CACN,IAAA,EACA,QAAA,EAAA,GACG,IAAA,EACG;AACN,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,GAAG,IAAI,CAAA;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,IAAI;AACF,QAAA,KAAA,CAAS,CAAA,oBAAA,EAAuB,IAAI,CAAA,iBAAA,CAAA,EAAqB,KAAK,CAAA;AAAA,MAChE,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,OAAA,EAAsB;AAC1C,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAA,CAAK,iBAAiB,CAAA;AAC1C,IAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAC7B,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAA,CAAO,OAAA,EAAQ;AACf,MAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAC1B,IAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EACxB;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAC1B,IAAA,aAAA,CAAc,KAAK,cAAc,CAAA;AACjC,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EACxB;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACrB,IAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA,EAEQ,qBAAA,GAA8B;AACpC,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACtB;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAC1B,IAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EACxB;AACF,CAAA;;;ACvbA,IAAM,gBAAA,GAAmB,eAAA;AAEzB,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACjE;AA+CO,IAAM,iBAAN,MAAqB;AAAA,EAClB,SAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA,uBAAwB,GAAA,EAAwC;AAAA,EAChE,kBAAA,uBAAyB,GAAA,EAAwC;AAAA,EACjE,eAAA,GAAmC,cAAA;AAAA,EACnC,cAAA,uBAAqB,GAAA,EAAsC;AAAA,EAEnE,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,gBAAA,CAAiB,MAAM,CAAA;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,gBAAA;AACjC,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AACxB,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,OAAO,CAAA;AAErC,IAAA,IAAA,CAAK,UAAU,SAAA,CAAU,CAAC,YAAY,IAAA,CAAK,aAAA,CAAc,OAAO,CAAC,CAAA;AACjE,IAAA,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,CAAC,KAAA,KAAU;AACtC,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA,IAAI,KAAA,KAAU,cAAA,IAAkB,KAAA,KAAU,cAAA,EAAgB;AACxD,QAAA,IAAA,CAAK,sBAAA,EAAuB;AAAA,MAC9B;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,CAAC,gBAAA,KAAqB;AAC/C,MAAA,IAAA,CAAK,4BAA4B,gBAAgB,CAAA;AAAA,IACnD,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,UAAU,MAAA,EAAoC;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,gBAAA;AACjC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAO,CAAA;AACxD,IAAA,IAAA,CAAK,SAAA,CAAU,UAAU,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,EAAQ;AAAA,EAC/B;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,UAAU,UAAA,EAAW;AAAA,EAC5B;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,UAAU,cAAA,EAAe;AAAA,EAChC;AAAA,EAEA,kBAAA,GAAsC;AACpC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,wBAAwB,QAAA,EAAwD;AAC9E,IAAA,IAAA,CAAK,cAAA,CAAe,IAAI,QAAQ,CAAA;AAChC,IAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,QAAQ,CAAA;AAAA,EAClD;AAAA,EAEA,SAAA,CACE,IAAA,EACA,OAAA,GAA8C,EAAC,EAC1B;AACrB,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,KAAK,CAAA;AAC3C,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,GAAG,CAAA;AAE5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,GAAS;AAAA,QACP,IAAI,UAAA,EAAW;AAAA,QACf,GAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,iBAAA,EAAmB,MAAA;AAAA,QACnB,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO,IAAA;AAAA,QACP,KAAA,EAAO,MAAA;AAAA,QACP,SAAA,sBAAe,GAAA,EAAI;AAAA,QACnB,SAAA,sBAAe,GAAA,EAAI;AAAA,QACnB,MAAA,EAAQ,IAAA;AAAA,QACR,aAAA,EAAe,KAAA;AAAA,QACf,UAAA,EAAY,CAAA;AAAA,QACZ,cAAA,EAAgB,MAAA;AAAA,QAChB,wBAAA,EAA0B,MAAA;AAAA,QAC1B,4BAAA,EAA8B,MAAA;AAAA,QAC9B,mBAAA,EAAqB,MAAA;AAAA,QACrB,OAAA,EAAS,MAAA;AAAA,QACT,WAAA,sBAAiB,GAAA,EAAI;AAAA,QACrB,iBAAA,sBAAuB,GAAA,EAAI;AAAA,QAC3B,aAAA,EAAe,MAAA;AAAA,QACf,gBAAA,EAAkB,MAAA;AAAA,QAClB,gBAAA,sBAAsB,GAAA,EAAI;AAAA,QAC1B,kBAAA,EAAoB,CAAA;AAAA,QACpB,8BAAA,EAAgC,CAAA;AAAA,QAChC,QAAA,EAAU;AAAA,OACZ;AACA,MAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AACvC,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,MAAM,CAAA;AAC5C,MAAA,IAAI,IAAA,CAAK,oBAAoB,WAAA,EAAa;AACxC,QAAA,KAAK,IAAA,CAAK,iBAAiB,MAAA,EAAQ,IAAA,CAAK,UAAU,UAAU,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,MACrF;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,UAAA,EAAW;AAC3B,IAAA,MAAA,CAAO,SAAA,CAAU,IAAI,OAAA,EAAS;AAAA,MAC5B,MAAA,EAAQ,QAAQ,MAAA,GAAS,CAAC,SAAS,OAAA,CAAQ,MAAA,GAAS,IAAa,CAAA,GAAI,MAAA;AAAA,MACrE,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AACD,IAAA,IACE,IAAA,CAAK,eAAA,KAAoB,WAAA,KACxB,CAAC,MAAA,CAAO,iBAAiB,MAAA,CAAO,KAAA,CAAA,IACjC,CAAC,MAAA,CAAO,mBAAA,EACR;AACA,MAAA,KAAK,IAAA,CAAK,iBAAiB,MAAA,EAAQ,IAAA,CAAK,UAAU,UAAU,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IACrF;AACA,IAAA,MAAM,KAAA,GAAQ,MAAA;AACd,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,OAAO;AAAA,MACL,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,IAAI,IAAA,GAAO;AACT,QAAA,OAAO,KAAA,CAAM,IAAA;AAAA,MACf,CAAA;AAAA,MACA,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,KAAA,CAAM,OAAA;AAAA,MACf,CAAA;AAAA,MACA,IAAI,KAAA,GAAQ;AACV,QAAA,OAAO,KAAA,CAAM,KAAA;AAAA,MACf,CAAA;AAAA,MACA,IAAI,KAAA,GAAQ;AACV,QAAA,OAAO,KAAA,CAAM,KAAA;AAAA,MACf,CAAA;AAAA,MACA,aAAa,MAAM;AACjB,QAAA,IAAI,QAAA,EAAU;AACd,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,OAAO,CAAA;AAAA,MACzC,CAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK;AAAA,KACnC;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CACJ,IAAA,EACA,KAAA,EACA,OAAA,EACkB;AAClB,IAAA,MAAM,aAAa,UAAA,EAAW;AAC9B,IAAA,MAAM,SAAuC,EAAC;AAE9C,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,oBAAA,CAAqB,UAAA,EAAY,KAAA,EAAO,OAAA,EAAS,MAAM,CAAA;AAC5D,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,SAAA,CAAU,mBAAA,EAAoB;AAC9D,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,EAAa;AACxC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS;AAAA,QACzC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,MAAM,MAAA,EAAQ,YAAA,EAAc,IAAA,EAAM,KAAA,EAAO;AAAA,OACjE,CAAA;AACD,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,CAAA,aAAA,EAAgB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MAC1E;AAEA,MAAA,MAAM,MAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AAKpC,MAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,IAAW,eAAe,CAAA;AAAA,MACnD;AAEA,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,MAAA,IAAA,CAAK,oBAAA,CAAqB,UAAA,EAAY,KAAA,EAAO,IAAA,EAAM,SAAS,MAAM,CAAA;AAClE,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,oBAAA,CAAqB,YAAY,MAAM,CAAA;AAC5C,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,uBAAA,CAAwB,IAAY,QAAA,EAAkC;AACpE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,EAAE,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,MAAM,MAAA;AACzB,IAAA,KAAA,CAAM,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC5B,IAAA,OAAO,MAAM,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC9C;AAAA,EAEA,wBAAwB,EAAA,EAAoB;AAC1C,IAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,EAAE,GAAG,QAAA,IAAY,EAAA;AAAA,EACrD;AAAA,EAEA,qBAAA,CAAsB,gBAAwB,OAAA,EAA2C;AACvF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,cAAc,CAAA;AACvD,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW;AACxC,IAAA,KAAA,CAAM,gBAAA,CAAiB,GAAA,CAAI,CAAA,MAAA,EAAS,UAAA,EAAY,CAAA,CAAA,EAAI;AAAA,MAClD;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AACxB,IAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,IAAI,CAAA;AAAA,EACrC;AAAA,EAEQ,QAAQ,IAAA,EAA0C;AACxD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAAA,EAC1C;AAAA,EAEQ,kBAAkB,OAAA,EAAgD;AACxE,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAAA,EACnD;AAAA,EAEQ,aACN,IAAA,EAC8C;AAC9C,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,IAAA,OAAO,OAAO,IAAA,KAAS,UAAA,GAAa,IAAA,GAAO,MAAM,IAAA;AAAA,EACnD;AAAA,EAEQ,gBACN,OAAA,EAC8E;AAC9E,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,IAAA,OAAO,OAAO,OAAA,KAAY,UAAA,GAAa,OAAA,GAAU,MAAM,OAAA;AAAA,EACzD;AAAA,EAEQ,4BAA4B,gBAAA,EAAgC;AAClE,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAO,EAAG;AACpD,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,KAAK,KAAK,gBAAA,CAAiB,KAAA,EAAO,gBAAgB,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAA,CACN,KAAA,EACA,gBAAA,EACA,KAAA,GAAQ,KAAA,EACO;AACf,IAAA,IACE,CAAC,KAAA,IACD,KAAA,CAAM,4BAAA,KAAiC,gBAAA,IACvC,MAAM,mBAAA,EACN;AACA,MAAA,OAAO,KAAA,CAAM,mBAAA;AAAA,IACf;AAEA,IAAA,KAAA,CAAM,UAAA,EAAA;AACN,IAAA,KAAA,CAAM,iCAAiC,KAAA,CAAM,kBAAA;AAC7C,IAAA,KAAA,CAAM,iBAAiB,UAAA,EAAW;AAClC,IAAA,KAAA,CAAM,4BAAA,GAA+B,gBAAA;AACrC,IAAA,KAAA,CAAM,wBAAA,GAA2B,MAAA;AACjC,IAAA,KAAA,CAAM,mBAAA,GAAsB,MAAA;AAC5B,IAAA,KAAA,CAAM,aAAA,GAAgB,MAAA;AACtB,IAAA,KAAA,CAAM,gBAAA,GAAmB,MAAA;AACzB,IAAA,KAAA,CAAM,aAAA,GAAgB,KAAA;AACtB,IAAA,KAAA,CAAM,OAAA,GAAU,MAAA;AAChB,IAAA,KAAA,CAAM,YAAY,KAAA,EAAM;AACxB,IAAA,KAAA,CAAM,kBAAkB,KAAA,EAAM;AAC9B,IAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,IAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,IAAA,KAAA,CAAM,KAAA,GAAQ,MAAA;AACd,IAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAE7B,IAAA,MAAM,aAAa,KAAA,CAAM,UAAA;AACzB,IAAA,MAAM,iBAAiB,KAAA,CAAM,cAAA;AAC7B,IAAA,MAAM,SAAA,GAAY,MAChB,KAAA,CAAM,MAAA,IACN,MAAM,UAAA,KAAe,UAAA,IACrB,KAAA,CAAM,cAAA,KAAmB,kBACzB,KAAA,CAAM,4BAAA,KAAiC,gBAAA,IACvC,IAAA,CAAK,UAAU,UAAA,KAAe,gBAAA;AAChC,IAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,IAAA,IAAI,wBAAA;AAIJ,IAAA,IAAI,OAAA;AACJ,IAAA,OAAA,GAAA,CAAW,YAAY;AACrB,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,SAAA,CAAU,mBAAA,EAAoB;AAC9D,QAAA,IAAI,CAAC,WAAU,EAAG;AAClB,QAAA,wBAAA,GAA2B,YAAA;AAC3B,QAAA,KAAA,CAAM,wBAAA,GAA2B,YAAA;AACjC,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,EAAa;AACxC,QAAA,IAAI,CAAC,WAAU,EAAG;AAClB,QAAA,aAAA,GAAgB,IAAA;AAChB,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS;AAAA,UACzC,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,IAAA,EAAM,WAAA;AAAA,YACN,YAAA;AAAA,YACA,gBAAgB,KAAA,CAAM,EAAA;AAAA,YACtB,UAAA;AAAA,YACA,cAAA;AAAA,YACA,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,OAAO,KAAA,CAAM;AAAA,WACd;AAAA,SACF,CAAA;AACD,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,QAC/E;AAEA,QAAA,MAAM,MAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,QAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,UAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AAAA,QAChC;AACA,QAAA,IAAI,CAAC,WAAU,EAAG;AAClB,QAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAC1B,QAAA,IAAI,SAAA,EAAU,EAAG,KAAA,CAAM,aAAA,GAAgB,IAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,WAAU,EAAG;AACf,UAAA,MAAM,OAAA,GAAU,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACxE,UAAA,KAAA,CAAM,KAAA,GAAQ,OAAA;AACd,UAAA,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAC3C,UAAA,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AAAA,QAC/C;AACA,QAAA,MAAM,KAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,CAAC,KAAA,CAAM,MAAA,IAAU,CAAC,SAAA,OAAgB,aAAA,EAAe;AACpD,UAAA,KAAK,KAAK,eAAA,CAAgB,wBAAA,EAA0B,KAAA,CAAM,EAAA,EAAI,YAAY,cAAc,CAAA;AAAA,QAC1F;AACA,QAAA,IAAI,KAAA,CAAM,wBAAwB,OAAA,EAAS;AACzC,UAAA,KAAA,CAAM,mBAAA,GAAsB,MAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,CAAA,GAAG;AACH,IAAA,KAAA,CAAM,mBAAA,GAAsB,OAAA;AAC5B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,mBAAA,CAAoB,OAAmC,OAAA,EAAuB;AACpF,IAAA,KAAA,CAAM,SAAA,CAAU,OAAO,OAAO,CAAA;AAC9B,IAAA,IAAI,KAAA,CAAM,SAAA,CAAU,IAAA,GAAO,CAAA,EAAG;AAE9B,IAAA,KAAA,CAAM,MAAA,GAAS,KAAA;AACf,IAAA,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AACtC,IAAA,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACxC,IAAA,IAAI,KAAA,CAAM,cAAA,IAAkB,KAAA,CAAM,wBAAA,IAA4B,MAAM,aAAA,EAAe;AACjF,MAAA,KAAK,IAAA,CAAK,eAAA;AAAA,QACR,KAAA,CAAM,wBAAA;AAAA,QACN,KAAA,CAAM,EAAA;AAAA,QACN,KAAA,CAAM,UAAA;AAAA,QACN,KAAA,CAAM;AAAA,OACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,CACZ,YAAA,EACA,cAAA,EACA,YACA,cAAA,EACe;AACf,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,EAAa;AACxC,MAAA,MAAM,KAAA,CAAM,KAAK,OAAA,EAAS;AAAA,QACxB,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,IAAA,EAAM,aAAA;AAAA,UACN,YAAA;AAAA,UACA,cAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACD;AAAA,OACF,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAc,QAAQ,KAAA,EAAkD;AACtE,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACnB,IAAA,IAAI,CAAC,MAAM,cAAA,EAAgB;AACzB,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,IAAA,CAAK,UAAU,UAAU,CAAA;AAC5D,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,EAChC;AAAA,EAEQ,cAAc,OAAA,EAA+B;AACnD,IAAA,QAAQ,QAAQ,IAAA;AAAM,MACpB,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AACxB,QAAA;AAAA,MACF,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,QAAQ,cAAc,CAAA;AAC/D,QAAA,IAAI,KAAA,EAAO,UAAA,KAAe,OAAA,CAAQ,UAAA,EAAY;AAC5C,UAAA,KAAK,KAAK,aAAA,CAAc,KAAK,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,QACtD;AACA,QAAA;AAAA,MACF;AAGE;AACJ,EACF;AAAA,EAEQ,eAAe,OAAA,EAAiC;AACtD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,QAAQ,cAAc,CAAA;AAC/D,IAAA,IAAI,CAAC,KAAA,IAAS,OAAA,CAAQ,UAAA,KAAe,MAAM,UAAA,EAAY;AACvD,IAAA,IAAI,MAAM,OAAA,KAAY,MAAA,IAAa,OAAA,CAAQ,OAAA,IAAW,MAAM,OAAA,EAAS;AAErE,IAAA,KAAA,CAAM,oBAAoB,OAAA,CAAQ,IAAA;AAClC,IAAA,KAAA,CAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,IAAA,KAAA,CAAM,KAAA,GAAQ,MAAA;AAEd,IAAA,MAAM,kBAAkB,KAAA,CAAM,8BAAA;AAC9B,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,CAAA,IAAK,MAAM,gBAAA,EAAkB;AACrD,MAAA,IAAI,KAAA,CAAM,eAAA,KAAoB,MAAA,IAAa,KAAA,CAAM,mBAAmB,eAAA,EAAiB;AACnF,QAAA,KAAA,CAAM,gBAAA,CAAiB,OAAO,OAAO,CAAA;AAAA,MACvC;AAAA,IACF;AACA,IAAA,MAAM,sBAAA,GAAyB,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAC1D,IAAA,KAAA,CAAM,OAAA,GAAU,sBAAA;AAChB,IAAA,KAAA,CAAM,KAAA,GAAQ,sBAAA;AACd,IAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AACxB,IAAA,IAAA,CAAK,oBAAoB,KAAK,CAAA;AAC9B,IAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,EAC7B;AAAA,EAEQ,YAAY,OAAA,EAA2B;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,QAAQ,cAAc,CAAA;AAC/D,IAAA,IAAI,CAAC,KAAA,IAAS,OAAA,CAAQ,UAAA,KAAe,MAAM,UAAA,EAAY;AACvD,IAAA,IACE,KAAA,CAAM,iBAAA,CAAkB,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA,IAC7C,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA,EACvC;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAM,OAAA,KAAY,MAAA,IAAa,OAAA,CAAQ,SAAA,IAAa,MAAM,OAAA,EAAS;AACrE,MAAA,KAAA,CAAM,iBAAA,CAAkB,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA;AAC7C,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AAChD,IAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW;AACjC,IAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,EAC7B;AAAA,EAEQ,iBAAiB,KAAA,EAAyC;AAChE,IAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,IAAa,KAAA,CAAM,sBAAsB,MAAA,EAAW;AACxE,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,oBAAoB,KAAK,CAAA;AAC9B,IAAA,WAAS;AACP,MAAA,MAAM,IAAA,GAAO,CAAC,GAAG,KAAA,CAAM,WAAA,CAAY,MAAA,EAAQ,CAAA,CACxC,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,WAAA,KAAgB,MAAM,OAAO,CAAA,CACrD,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,CAAK,SAAA,GAAY,KAAA,CAAM,SAAS,CAAA,CACtD,EAAA,CAAG,CAAC,CAAA;AACP,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,KAAA,CAAM,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AACvC,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,iBAAA,GAAoB,YAAA,CAAa,KAAA,CAAM,iBAAA,EAAmB,KAAK,OAAO,CAAA;AAC5E,QAAA,KAAA,CAAM,UAAU,IAAA,CAAK,SAAA;AACrB,QAAA,KAAA,CAAM,iBAAA,CAAkB,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AAC1C,QAAA,MAAM,sBAAA,GAAyB,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAC1D,QAAA,KAAA,CAAM,OAAA,GAAU,sBAAA;AAChB,QAAA,KAAA,CAAM,KAAA,GAAQ,sBAAA;AACd,QAAA,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAA;AACd,QAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AACxB,QAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,IAAI,CAAA;AACnC,QAAA,IAAA,CAAK,oBAAoB,KAAK,CAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AACN,QAAA,KAAK,KAAK,aAAA,CAAc,KAAK,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACpD,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IACE,CAAC,GAAG,KAAA,CAAM,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,MAC9B,CAAC,UAAU,KAAA,CAAM,SAAA,GAAY,MAAM,OAAA,IAAY,KAAA,CAAM,gBAAgB,KAAA,CAAM;AAAA,KAC7E,EACA;AACA,MAAA,KAAK,KAAK,aAAA,CAAc,KAAK,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEQ,oBAAoB,KAAA,EAAyC;AACnE,IAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW;AACjC,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,CAAA,IAAK,MAAM,WAAA,EAAa;AAClD,MAAA,IAAI,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,OAAA,EAAS;AACpC,QAAA,KAAA,CAAM,WAAA,CAAY,OAAO,SAAS,CAAA;AAClC,QAAA,KAAA,CAAM,iBAAA,CAAkB,IAAI,SAAS,CAAA;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,KAAA,EAAkD;AACtE,IAAA,IAAI,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,gBAAA,KAAqB,MAAM,UAAA,EAAY;AACtE,MAAA,OAAO,KAAA,CAAM,aAAA;AAAA,IACf;AACA,IAAA,IAAI,CAAC,MAAM,MAAA,IAAU,CAAC,MAAM,cAAA,EAAgB,OAAO,QAAQ,OAAA,EAAQ;AAEnE,IAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,IAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,IAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAC7B,IAAA,MAAM,OAAA,GAAyB,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,IAAA,CAAK,UAAU,UAAA,EAAY,IAAI,CAAA,CACxF,OAAA,CAAQ,MAAM;AACb,MAAA,IAAI,KAAA,CAAM,kBAAkB,OAAA,EAAS;AACnC,QAAA,KAAA,CAAM,aAAA,GAAgB,MAAA;AACtB,QAAA,KAAA,CAAM,gBAAA,GAAmB,MAAA;AAAA,MAC3B;AAAA,IACF,CAAC,CAAA,CACA,IAAA,CAAK,MAAM;AACV,MAAA,IAAI,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAChD,QAAA,OAAO,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,MACjC;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AACH,IAAA,KAAA,CAAM,aAAA,GAAgB,OAAA;AACtB,IAAA,KAAA,CAAM,mBAAmB,KAAA,CAAM,UAAA;AAC/B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,oBAAA,CACN,UAAA,EACA,KAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA;AAChD,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,uBAAA,CAAwB,KAAA,EAAO,OAAO,CAAA;AAC3D,MAAA,IAAI,CAAC,OAAA,IAAW,KAAA,CAAM,iBAAA,KAAsB,MAAA,EAAW;AACvD,MAAA,KAAA,CAAM,gBAAA,CAAiB,IAAI,UAAA,EAAY;AAAA,QACrC;AAAA,OACD,CAAA;AACD,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,MAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AACxB,MAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,IAAI,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,oBACN,OAAA,EAC8B;AAC9B,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAQ,QAAQ,CAAA;AAC1D,MAAA,OAAO,KAAA,GAAQ,CAAC,KAAK,CAAA,GAAI,EAAC;AAAA,IAC5B;AACA,IAAA,IAAI,OAAO,OAAA,EAAS,WAAA,KAAgB,QAAA,EAAU;AAC5C,MAAA,MAAM,KAAA,GAAQ,KAAK,kBAAA,CAAmB,GAAA;AAAA,QACpC,YAAY,OAAA,CAAQ,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,YAAY,KAAK;AAAA,OACjE;AACA,MAAA,OAAO,KAAA,GAAQ,CAAC,KAAK,CAAA,GAAI,EAAC;AAAA,IAC5B;AACA,IAAA,IAAI,OAAO,OAAA,EAAS,WAAA,KAAgB,QAAA,EAAU;AAC5C,MAAA,OAAO,CAAC,GAAG,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,QAC3C,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,KAAS,OAAA,CAAQ;AAAA,OACpC;AAAA,IACF;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEQ,uBAAA,CACN,KAAA,EACA,OAAA,EACA,MAAA,EACA,UAAU,KAAA,EACqB;AAC/B,IAAA,MAAM,SAAS,OAAA,EAAS,gBAAA;AACxB,IAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,MAAA,OAAO,CAAC,IAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,IAAI,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA,GAAI,IAAA;AAAA,IACxE;AAEA,IAAA,MAAM,SACJ,OAAO,KAAA,KAAU,YAAY,KAAA,KAAU,IAAA,GAAQ,MAA2B,EAAA,GAAK,MAAA;AACjF,IAAA,IAAI,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,MAAA,EAAW;AAC/C,MAAA,OAAO,CAAC,IAAA,KACN,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GACd,IAAA,CAAK,MAAA,CAAO,CAAC,IAAA,KAAU,IAAA,CAA0B,EAAA,KAAO,MAAM,CAAA,GAC9D,IAAA;AAAA,IACR;AACA,IAAA,IAAI,MAAA,KAAW,SAAS,OAAO,MAAA;AAE/B,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,MAAM,YAAA,GAAe,WAAW,OAAO,MAAA,KAAW,YAAY,MAAA,KAAW,IAAA,GAAO,SAAS,EAAC;AAC1F,MAAA,OAAO,CAAC,IAAA,KAAS;AACf,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,GAAG,OAAO,IAAA;AACjC,QAAA,OAAO,IAAA,CAAK,GAAA;AAAA,UAAI,CAAC,IAAA,KACd,IAAA,CAA0B,EAAA,KAAO,MAAA,GAAS,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,EAAO,GAAG,YAAA,EAAa,GAAI;AAAA,SACtF;AAAA,MACF,CAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS,cAAA,KAAmB,MAAA,EAAW,OAAO,MAAA;AAElD,IAAA,OAAO,CAAC,IAAA,KAAS;AACf,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,GAAG,OAAO,IAAA;AACjC,MAAA,MAAM,UAAA,GAAa,OAAA;AAAA;AAAA,QAEf,MAAA,KAAW,MAAA,GACT,OAAO,OAAA,CAAQ,cAAA,KAAmB,UAAA,GAE9B,OAAA,CAAQ,cAAA,CAIR,KAAA,EAAO,IAAI,CAAA,GACb,OAAA,CAAQ,cAAA,GACV;AAAA,UACF,OAAO,QAAQ,cAAA,KAAmB,UAAA,GAE9B,QAAQ,cAAA,CAIR,KAAA,EAAO,IAAI,CAAA,GACb,OAAA,CAAQ,cAAA;AACd,MAAA,IAAI,OAAA,IAAW,UAAA,KAAe,IAAA,IAAQ,OAAO,eAAe,QAAA,EAAU;AACpE,QAAA,MAAM,eAAgB,UAAA,CAAgC,EAAA;AACtD,QAAA,IACE,YAAA,KAAiB,UACjB,IAAA,CAAK,IAAA;AAAA,UACH,CAAC,SACC,OAAO,IAAA,KAAS,YAChB,IAAA,KAAS,IAAA,IACR,KAA0B,EAAA,KAAO;AAAA,SACtC,EACA;AACA,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,eAAe,MAAA,GAAY,IAAA,GAAO,CAAC,UAAA,EAAY,GAAG,IAAI,CAAA;AAAA,IAC/D,CAAA;AAAA,EACF;AAAA,EAEQ,oBAAA,CACN,UAAA,EACA,KAAA,EACA,MAAA,EACA,SACA,MAAA,EACM;AACN,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,gBAAA,CAAiB,GAAA,CAAI,UAAU,CAAA;AACnD,MAAA,MAAM,UAAU,IAAA,CAAK,uBAAA,CAAwB,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,CAAA;AACzE,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,OAAA,EAAS;AACxB,MAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAChB,MAAA,KAAA,CAAM,eAAA,GAAkB,EAAE,KAAA,CAAM,kBAAA;AAChC,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,MAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AACxB,MAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,IAAI,CAAA;AACnC,MAAA,KAAK,KAAK,aAAA,CAAc,KAAK,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEQ,oBAAA,CAAqB,YAAoB,MAAA,EAA4C;AAC3F,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,CAAC,KAAA,CAAM,gBAAA,CAAiB,MAAA,CAAO,UAAU,CAAA,EAAG;AAChD,MAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AACxB,MAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,IAAI,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,cAAc,KAAA,EAAyC;AAC7D,IAAA,IAAI,OAAO,KAAA,CAAM,iBAAA;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,gBAAA,CAAiB,MAAA,EAAO,EAAG;AACnD,MAAA,IAAA,GAAO,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,IAC3B;AACA,IAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AAAA,EACf;AAAA,EAEQ,iBAAiB,KAAA,EAA4C;AACnE,IAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,gBAAA,CAAiB,MAAA,EAAO,EAAG;AACnD,MAAA,IAAI,KAAA,CAAM,eAAA,KAAoB,MAAA,EAAW,OAAO,IAAA;AAAA,IAClD;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAc,YAAA,GAAgD;AAC5D,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB;AAAA,KAClB;AACA,IAAA,IAAI,IAAA,CAAK,eAAe,MAAA,CAAO,MAAA,CAAO,SAAS,MAAM,IAAA,CAAK,eAAe,CAAA;AACzE,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,MAAM,IAAA,CAAK,YAAY,CAAA,CAAA;AAAA,IAC9D;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,sBAAA,GAA+B;AACrC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAO,EAAG;AACpD,MAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACnB,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,MAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,kBAAA,CACN,KAAA,EACA,WAAA,GAAc,KAAA,EACd,OAAA,EACM;AACN,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACnB,IAAA,KAAA,CAAM,QAAA,EAAA;AACN,IAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,SAAA,EAAW,QAAA,EAAS;AACjD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,SAAA,CAAU,MAAA,EAAO,EAAG;AAC/C,QAAA,QAAA,CAAS,MAAA,GAAS,MAAM,IAAI,CAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,SAAA,CAAU,MAAA,EAAO,EAAG;AAC/C,QAAA,QAAA,CAAS,UAAU,OAAO,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,cAAA,EAAgB;AAC1C,MAAA,QAAA,CAAS,KAAK,eAAe,CAAA;AAAA,IAC/B;AAAA,EACF;AACF;AAsDO,SAAS,qBACd,MAAA,EAC8B;AAC9B,EAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAe,MAAM,CAAA;AACxC,EAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,EAAE,CAAA;AACpC;AAEA,SAAS,gBAAA,CAAiB,QAAwB,IAAA,EAAyB;AACzE,EAAA,OAAO,IAAI,KAAA;AAAA,IACT,EAAC;AAAA,IACD;AAAA,MACE,GAAA,CAAI,SAAS,QAAA,EAAU;AACrB,QAAA,IAAI,QAAA,KAAa,SAAA,EAAW,OAAO,MAAM,OAAO,OAAA,EAAQ;AACxD,QAAA,IAAI,QAAA,KAAa,YAAA,EAAc,OAAO,MAAM,OAAO,UAAA,EAAW;AAC9D,QAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,OAAO,MAAA;AAEzC,QAAA,IAAI,aAAa,iBAAA,EAAmB;AAClC,UAAA,OAAO,CAAC,KAAA,EAAiB,OAAA,KACvB,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAG,EAAE,GAAG,OAAA,EAAS,OAAO,CAAA;AAAA,QAC1D;AACA,QAAA,IAAI,aAAa,QAAA,EAAU;AACzB,UAAA,OAAO,CAAC,KAAA,EAAgB,OAAA,KACtB,MAAA,CAAO,IAAA,CAAK,KAAK,IAAA,CAAK,GAAG,CAAA,EAAG,KAAA,EAAO,OAAO,CAAA;AAAA,QAC9C;AACA,QAAA,OAAO,iBAAiB,MAAA,EAAQ,CAAC,GAAG,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,MACrD;AAAA;AACF,GACF;AACF","file":"client.cjs","sourcesContent":["function canonicalize(\n value: unknown,\n seen: Set<object>,\n key: string,\n arrayItem = false,\n applyToJSON = true,\n): string | undefined {\n if (value === null) return 'null';\n\n switch (typeof value) {\n case 'string':\n case 'boolean':\n return JSON.stringify(value);\n case 'number':\n return Number.isFinite(value) ? JSON.stringify(value) : 'null';\n case 'undefined':\n return arrayItem ? 'null' : undefined;\n case 'object': {\n if (applyToJSON && 'toJSON' in value && typeof value.toJSON === 'function') {\n return canonicalize(value.toJSON(key), seen, key, arrayItem, false);\n }\n if (seen.has(value)) {\n throw new TypeError('Query input must not contain circular references');\n }\n\n seen.add(value);\n try {\n if (Array.isArray(value)) {\n const items: string[] = [];\n for (let index = 0; index < value.length; index++) {\n items.push(canonicalize(value[index], seen, String(index), true) ?? 'null');\n }\n return `[${items.join(',')}]`;\n }\n\n const object = value as Record<string, unknown>;\n const entries: string[] = [];\n for (const key of Object.keys(object).sort()) {\n const item = canonicalize(object[key], seen, key);\n if (item !== undefined) {\n entries.push(`${JSON.stringify(key)}:${item}`);\n }\n }\n return `{${entries.join(',')}}`;\n } finally {\n seen.delete(value);\n }\n }\n case 'bigint':\n case 'function':\n case 'symbol':\n default:\n throw new TypeError(`Unsupported query input value: ${typeof value}`);\n }\n}\n\n/** Return the stable identity used for subscription sharing and targeting. */\nexport function getQueryKey(path: string, input?: unknown): string {\n return `${JSON.stringify(path)}:${canonicalize(input, new Set(), '') ?? 'undefined'}`;\n}\n","import jsonpatch, { type Operation } from 'fast-json-patch';\n\nimport type { JsonPatch } from './protocol.js';\n\n/**\n * Apply JSON patches to a document\n */\nexport function applyPatches<T>(document: T, patches: JsonPatch[]): T {\n if (patches.length === 0) {\n return document;\n }\n\n const operations: Operation[] = patches.map((patch) => {\n const op: Operation = {\n op: patch.op,\n path: patch.path,\n } as Operation;\n\n if ('value' in patch && patch.value !== undefined) {\n (op as { value: unknown }).value = patch.value;\n }\n if ('from' in patch && patch.from !== undefined) {\n (op as { from: string }).from = patch.from;\n }\n\n return op;\n });\n\n try {\n const result = jsonpatch.applyPatch(\n structuredClone(document),\n operations,\n true, // Validate operations\n false, // Don't mutate the original\n );\n\n return result.newDocument as T;\n } catch (error) {\n throw new Error('Failed to apply patches', { cause: error });\n }\n}\n","/* eslint-disable no-console */\ntype DebugGlobal = typeof globalThis & {\n __DYNAMODB_REACTIVE_DEBUG__?: boolean;\n};\n\nexport function debug(...values: unknown[]): void {\n if ((globalThis as DebugGlobal).__DYNAMODB_REACTIVE_DEBUG__) {\n console.debug(...values);\n }\n}\n\nexport function warn(...values: unknown[]): void {\n console.warn(...values);\n}\n\nexport function error(...values: unknown[]): void {\n console.error(...values);\n}\n","import { error as logError } from './log.js';\nimport type { WebSocketEvent } from './protocol.js';\nimport type { ConnectionState, ReactiveClientConfig } from './types.js';\n\ninterface ConnectionWaitOptions {\n signal?: AbortSignal;\n timeoutMs?: number;\n}\n\ninterface ConnectionWaiter {\n resolve: (id: string) => void;\n reject: (error: Error) => void;\n cleanup: () => void;\n}\n\ntype ManagerConfig = Required<\n Pick<\n ReactiveClientConfig,\n | 'autoReconnect'\n | 'connectionTimeout'\n | 'handshakeTimeout'\n | 'heartbeatInterval'\n | 'heartbeatTimeout'\n | 'maxReconnectAttempts'\n | 'reconnectDelay'\n >\n> &\n ReactiveClientConfig;\n\nfunction withDefaults(config: ReactiveClientConfig): ManagerConfig {\n return {\n autoReconnect: true,\n connectionTimeout: 10000,\n handshakeTimeout: 10000,\n heartbeatInterval: 5 * 60 * 1000,\n heartbeatTimeout: 15_000,\n maxReconnectAttempts: 10,\n reconnectDelay: 1000,\n ...config,\n };\n}\n\n/** WebSocket manager with generation-fenced events and reconnection. */\nexport class WebSocketManager {\n private config: ManagerConfig;\n private ws: WebSocket | null = null;\n private state: ConnectionState = 'disconnected';\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private handshakeTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private pongTimer: ReturnType<typeof setTimeout> | null = null;\n private messageHandlers = new Set<(message: WebSocketEvent) => void>();\n private stateHandlers = new Set<(state: ConnectionState) => void>();\n private handshakeHandlers = new Set<(generation: number) => void>();\n private _connectionId: string | null = null;\n private connectionWaiters = new Set<ConnectionWaiter>();\n private socketGeneration = 0;\n private intentionalDisconnect = false;\n private lastConnectionError: Error | undefined;\n\n constructor(config: ReactiveClientConfig) {\n this.config = withDefaults(config);\n }\n\n /** Apply settings used by future requests/events without replacing the socket. */\n configure(config: ReactiveClientConfig): void {\n this.config = withDefaults(config);\n }\n\n get connectionId(): string | null {\n return this._connectionId;\n }\n\n get generation(): number {\n return this.socketGeneration;\n }\n\n waitForConnectionId(options: ConnectionWaitOptions = {}): Promise<string> {\n if (this._connectionId && this.state === 'connected') {\n return Promise.resolve(this._connectionId);\n }\n if (options.signal?.aborted) {\n return Promise.reject(new Error('Connection wait aborted'));\n }\n\n const timeoutMs = options.timeoutMs ?? this.config.connectionTimeout;\n return new Promise((resolve, reject) => {\n // oxlint-disable-next-line prefer-const -- cleanup can run before the timer is set.\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const abort = () => finish(new Error('Connection wait aborted'));\n const waiter: ConnectionWaiter = {\n resolve,\n reject,\n cleanup: () => {\n if (timeout) clearTimeout(timeout);\n options.signal?.removeEventListener('abort', abort);\n },\n };\n const finish = (failure: Error) => {\n if (!this.connectionWaiters.delete(waiter)) return;\n waiter.cleanup();\n reject(failure);\n };\n\n this.connectionWaiters.add(waiter);\n options.signal?.addEventListener('abort', abort, { once: true });\n timeout = setTimeout(\n () =>\n finish(\n new Error(`Connection timed out after ${timeoutMs}ms`, {\n cause: this.lastConnectionError,\n }),\n ),\n timeoutMs,\n );\n });\n }\n\n getState(): ConnectionState {\n return this.state;\n }\n\n async connect(): Promise<void> {\n if (this.state === 'connected') return;\n if (this.state === 'connecting') {\n await this.waitForConnectionId();\n return;\n }\n\n if (this.state !== 'reconnecting') this.lastConnectionError = undefined;\n this.intentionalDisconnect = false;\n const generation = ++this.socketGeneration;\n this.setState('connecting');\n let socket: WebSocket | undefined;\n let retryable = true;\n\n try {\n if (!this.config.webSocketFactory && typeof globalThis.WebSocket !== 'function') {\n retryable = false;\n throw new Error(\n 'WebSocket is unavailable in this runtime. Enable the native WebSocket API ' +\n '(Node 20: --experimental-websocket), use Node 22 or newer, or configure webSocketFactory.',\n );\n }\n const url = await this.buildUrl();\n // oxlint-disable-next-line typescript/no-unnecessary-condition -- disconnect() can run while the URL is built.\n if (generation !== this.socketGeneration || this.intentionalDisconnect) {\n return;\n }\n\n let nextSocket: WebSocket;\n try {\n nextSocket = this.config.webSocketFactory\n ? this.config.webSocketFactory(url)\n : new globalThis.WebSocket(url);\n } catch (cause) {\n // Retrying cannot repair missing APIs, malformed URLs or a factory\n // that cannot construct a socket. Preserve its original error.\n retryable = false;\n throw cause;\n }\n socket = nextSocket;\n this.ws = nextSocket;\n this.startHandshakeTimer(nextSocket, generation);\n\n nextSocket.onopen = () => {\n if (!this.isCurrent(nextSocket, generation)) return;\n nextSocket.send(JSON.stringify({ type: 'init' }));\n };\n\n nextSocket.onclose = () => {\n if (!this.isCurrent(nextSocket, generation)) return;\n this.handleClose();\n };\n\n nextSocket.onerror = () => {\n if (!this.isCurrent(nextSocket, generation)) return;\n const failure = new Error('WebSocket error');\n this.lastConnectionError = failure;\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n };\n\n nextSocket.onmessage = (event) => {\n if (!this.isCurrent(nextSocket, generation)) return;\n this.receiveMessage(nextSocket, generation, event.data);\n };\n } catch (cause) {\n if (generation !== this.socketGeneration) return;\n const failure = cause instanceof Error ? cause : new Error(String(cause));\n this.lastConnectionError = failure;\n this.clearConnectionTimers();\n if (!retryable) {\n this.clearTimers();\n this.reconnectAttempts = 0;\n }\n if (socket && this.ws === socket) socket.close();\n this.ws = null;\n this._connectionId = null;\n this.setState('disconnected');\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n\n // oxlint-disable-next-line typescript/no-unnecessary-condition -- disconnect() sets it from outside this handler.\n if (retryable && this.config.autoReconnect && !this.intentionalDisconnect) {\n this.scheduleReconnect();\n await this.waitForConnectionId();\n return;\n }\n this.rejectWaiters(failure);\n throw failure;\n }\n\n await this.waitForConnectionId();\n }\n\n disconnect(): void {\n this.intentionalDisconnect = true;\n ++this.socketGeneration;\n this.clearTimers();\n\n const socket = this.ws;\n this.ws = null;\n socket?.close(1000, 'Client disconnect');\n this._connectionId = null;\n this.setState('disconnected');\n this.rejectWaiters(new Error('WebSocket disconnected'));\n }\n\n forceReconnect(): void {\n this.intentionalDisconnect = false;\n ++this.socketGeneration;\n this.clearTimers();\n\n const socket = this.ws;\n this.ws = null;\n socket?.close(1000, 'Force reconnect');\n this._connectionId = null;\n this.reconnectAttempts = 0;\n this.setState('disconnected');\n void this.connect().catch(() => undefined);\n }\n\n onMessage(handler: (message: WebSocketEvent) => void): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n onStateChange(handler: (state: ConnectionState) => void): () => void {\n this.stateHandlers.add(handler);\n return () => this.stateHandlers.delete(handler);\n }\n\n onHandshake(handler: (generation: number) => void): () => void {\n this.handshakeHandlers.add(handler);\n return () => this.handshakeHandlers.delete(handler);\n }\n\n private async buildUrl(): Promise<string> {\n let url = this.config.url;\n if (!this.config.auth) return url;\n\n const token =\n typeof this.config.auth === 'function' ? await this.config.auth() : this.config.auth;\n const separator = url.includes('?') ? '&' : '?';\n url = `${url}${separator}token=${encodeURIComponent(token)}`;\n return url;\n }\n\n private receiveMessage(socket: WebSocket, generation: number, rawData: unknown): void {\n try {\n const message = JSON.parse(String(rawData)) as WebSocketEvent;\n if (message.type === 'connected') {\n if (this._connectionId) return;\n this._connectionId = message.connectionId;\n socket.send(JSON.stringify({ type: 'ping' }));\n return;\n }\n\n if (message.type === 'pong') {\n this.clearPongTimer();\n if (!this._connectionId || this.state === 'connected') return;\n this.clearHandshakeTimer();\n this.lastConnectionError = undefined;\n this.reconnectAttempts = 0;\n this.setState('connected');\n this.startHeartbeat(socket, generation);\n this.invokeLifecycleCallback('onConnect', this.config.onConnect);\n this.resolveWaiters(this._connectionId);\n for (const handler of this.handshakeHandlers) handler(generation);\n return;\n }\n\n for (const handler of this.messageHandlers) handler(message);\n } catch (cause) {\n logError('Failed to parse WebSocket message:', cause);\n }\n }\n\n private startHandshakeTimer(socket: WebSocket, generation: number): void {\n this.clearHandshakeTimer();\n this.handshakeTimer = setTimeout(() => {\n if (!this.isCurrent(socket, generation) || this.state === 'connected') {\n return;\n }\n const failure = new Error('WebSocket handshake timed out');\n this.lastConnectionError = failure;\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n socket.close(4000, 'Handshake timeout');\n }, this.config.handshakeTimeout);\n }\n\n private handleClose(): void {\n this.clearConnectionTimers();\n this.ws = null;\n this._connectionId = null;\n this.setState('disconnected');\n this.invokeLifecycleCallback('onDisconnect', this.config.onDisconnect);\n\n if (this.config.autoReconnect && !this.intentionalDisconnect) {\n this.scheduleReconnect();\n } else {\n this.rejectWaiters(new Error('WebSocket disconnected'));\n }\n }\n\n private startHeartbeat(socket: WebSocket, generation: number): void {\n this.clearHeartbeatTimer();\n this.heartbeatTimer = setInterval(() => {\n if (\n !this.isCurrent(socket, generation) ||\n this.state !== 'connected' ||\n socket.readyState !== socket.OPEN\n ) {\n return;\n }\n socket.send(JSON.stringify({ type: 'ping' }));\n this.pongTimer ??= setTimeout(() => {\n this.pongTimer = null;\n if (!this.isCurrent(socket, generation)) return;\n const failure = new Error('WebSocket heartbeat timed out');\n this.lastConnectionError = failure;\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n // A dead peer can hold close() in CLOSING for minutes, so drop the socket now\n // instead of waiting for its close event.\n socket.onclose = null;\n socket.close(4001, 'Heartbeat timeout');\n this.handleClose();\n }, this.config.heartbeatTimeout);\n }, this.config.heartbeatInterval);\n }\n\n private isCurrent(socket: WebSocket, generation: number): boolean {\n return this.ws === socket && this.socketGeneration === generation;\n }\n\n private setState(state: ConnectionState): void {\n if (this.state === state) return;\n this.state = state;\n for (const handler of this.stateHandlers) handler(state);\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer || this.intentionalDisconnect) return;\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n const failure = new Error('Max reconnection attempts reached', {\n cause: this.lastConnectionError,\n });\n logError(failure.message);\n this.setState('disconnected');\n this.rejectWaiters(failure);\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n return;\n }\n\n this.setState('reconnecting');\n this.reconnectAttempts++;\n const delay =\n Math.min(this.config.reconnectDelay * 2 ** (this.reconnectAttempts - 1), 30000) *\n (0.5 + Math.random() * 0.5);\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n void this.connect().catch(() => undefined);\n }, delay);\n }\n\n private resolveWaiters(connectionId: string): void {\n const waiters = [...this.connectionWaiters];\n this.connectionWaiters.clear();\n for (const waiter of waiters) {\n waiter.cleanup();\n waiter.resolve(connectionId);\n }\n }\n\n private invokeLifecycleCallback<TArguments extends unknown[]>(\n name: 'onConnect' | 'onDisconnect' | 'onError',\n callback: ((...args: TArguments) => void) | undefined,\n ...args: TArguments\n ): void {\n if (!callback) return;\n try {\n callback(...args);\n } catch (cause) {\n try {\n logError(`[dynamodb-reactive] ${name} callback failed:`, cause);\n } catch {\n // Reporting must not let user callbacks re-enter socket lifecycle paths.\n }\n }\n }\n\n private rejectWaiters(failure: Error): void {\n const waiters = [...this.connectionWaiters];\n this.connectionWaiters.clear();\n for (const waiter of waiters) {\n waiter.cleanup();\n waiter.reject(failure);\n }\n }\n\n private clearHandshakeTimer(): void {\n if (!this.handshakeTimer) return;\n clearTimeout(this.handshakeTimer);\n this.handshakeTimer = null;\n }\n\n private clearHeartbeatTimer(): void {\n if (!this.heartbeatTimer) return;\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n private clearPongTimer(): void {\n if (!this.pongTimer) return;\n clearTimeout(this.pongTimer);\n this.pongTimer = null;\n }\n\n private clearConnectionTimers(): void {\n this.clearHandshakeTimer();\n this.clearHeartbeatTimer();\n this.clearPongTimer();\n }\n\n private clearTimers(): void {\n this.clearConnectionTimers();\n if (!this.reconnectTimer) return;\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n}\n","import { getQueryKey } from './canonical.js';\nimport { applyPatches } from './patcher.js';\nimport type { ErrorResponse, PatchEvent, SnapshotResponse, WebSocketEvent } from './protocol.js';\nimport type {\n ConnectionState,\n MutationOptions,\n ReactiveClientConfig,\n Subscription,\n SubscriptionOptions,\n} from './types.js';\nimport { WebSocketManager } from './websocket.js';\n\nconst DEFAULT_HTTP_URL = '/api/reactive';\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\ntype OptimisticUpdater = (data: unknown) => unknown;\n\ninterface OptimisticLayer {\n updater: OptimisticUpdater;\n settledRevision?: number;\n}\n\ninterface SubscriptionObserver {\n onData?: (data: unknown) => void;\n onError?: (error: Error) => void;\n}\n\ninterface SubscriptionState<TData> {\n id: string;\n key: string;\n path: string;\n input: unknown;\n authoritativeData: unknown;\n data: TData | undefined;\n loading: boolean;\n stale: boolean;\n error: Error | undefined;\n listeners: Set<() => void>;\n observers: Map<string, SubscriptionObserver>;\n active: boolean;\n hasRegistered: boolean;\n generation: number;\n registrationId: string | undefined;\n registrationConnectionId: string | undefined;\n registrationSocketGeneration: number | undefined;\n registrationPromise: Promise<void> | undefined;\n version: number | undefined;\n patchBuffer: Map<string, PatchEvent>;\n appliedMessageIds: Set<string>;\n resyncPromise: Promise<void> | undefined;\n resyncGeneration: number | undefined;\n optimisticLayers: Map<string, OptimisticLayer>;\n settlementRevision: number;\n registrationSettlementRevision: number;\n revision: number;\n}\n\ntype HttpResult = SnapshotResponse | ErrorResponse;\n\n/** Reactive client for shared, versioned subscriptions. */\nexport class ReactiveClient {\n private wsManager: WebSocketManager;\n private httpUrl: string;\n private authGetter?: () => string | Promise<string>;\n private headersGetter?: () => Record<string, string> | Promise<Record<string, string>>;\n private subscriptionsById = new Map<string, SubscriptionState<unknown>>();\n private subscriptionsByKey = new Map<string, SubscriptionState<unknown>>();\n private connectionState: ConnectionState = 'disconnected';\n private stateListeners = new Set<(state: ConnectionState) => void>();\n\n constructor(config: ReactiveClientConfig) {\n this.wsManager = new WebSocketManager(config);\n this.httpUrl = config.httpUrl ?? DEFAULT_HTTP_URL;\n this.setAuth(config.auth);\n this.setInitialHeaders(config.headers);\n\n this.wsManager.onMessage((message) => this.handleMessage(message));\n this.wsManager.onStateChange((state) => {\n this.connectionState = state;\n this.notifyStateListeners();\n if (state === 'disconnected' || state === 'reconnecting') {\n this.markSubscriptionsStale();\n }\n });\n this.wsManager.onHandshake((socketGeneration) => {\n this.registerActiveSubscriptions(socketGeneration);\n });\n }\n\n /** Apply live configuration without replacing subscription caches or the socket. */\n configure(config: ReactiveClientConfig): void {\n this.httpUrl = config.httpUrl ?? DEFAULT_HTTP_URL;\n this.authGetter = this.toAuthGetter(config.auth);\n this.headersGetter = this.toHeadersGetter(config.headers);\n this.wsManager.configure(config);\n }\n\n async connect(): Promise<void> {\n await this.wsManager.connect();\n }\n\n disconnect(): void {\n this.wsManager.disconnect();\n }\n\n forceReconnect(): void {\n this.wsManager.forceReconnect();\n }\n\n getConnectionState(): ConnectionState {\n return this.connectionState;\n }\n\n onConnectionStateChange(listener: (state: ConnectionState) => void): () => void {\n this.stateListeners.add(listener);\n return () => this.stateListeners.delete(listener);\n }\n\n subscribe<TData, TInput = unknown>(\n path: string,\n options: SubscriptionOptions<TInput, TData> = {},\n ): Subscription<TData> {\n const key = getQueryKey(path, options.input);\n let shared = this.subscriptionsByKey.get(key);\n\n if (!shared) {\n shared = {\n id: generateId(),\n key,\n path,\n input: options.input,\n authoritativeData: undefined,\n data: undefined,\n loading: true,\n stale: true,\n error: undefined,\n listeners: new Set(),\n observers: new Map(),\n active: true,\n hasRegistered: false,\n generation: 0,\n registrationId: undefined,\n registrationConnectionId: undefined,\n registrationSocketGeneration: undefined,\n registrationPromise: undefined,\n version: undefined,\n patchBuffer: new Map(),\n appliedMessageIds: new Set(),\n resyncPromise: undefined,\n resyncGeneration: undefined,\n optimisticLayers: new Map(),\n settlementRevision: 0,\n registrationSettlementRevision: 0,\n revision: 0,\n };\n this.subscriptionsByKey.set(key, shared);\n this.subscriptionsById.set(shared.id, shared);\n if (this.connectionState === 'connected') {\n void this.ensureRegistered(shared, this.wsManager.generation).catch(() => undefined);\n }\n }\n\n const leaseId = generateId();\n shared.observers.set(leaseId, {\n onData: options.onData ? (data) => options.onData?.(data as TData) : undefined,\n onError: options.onError,\n });\n if (\n this.connectionState === 'connected' &&\n (!shared.hasRegistered || shared.stale) &&\n !shared.registrationPromise\n ) {\n void this.ensureRegistered(shared, this.wsManager.generation).catch(() => undefined);\n }\n const state = shared as SubscriptionState<TData>;\n let released = false;\n\n return {\n id: state.id,\n key: state.key,\n get data() {\n return state.data;\n },\n get loading() {\n return state.loading;\n },\n get stale() {\n return state.stale;\n },\n get error() {\n return state.error;\n },\n unsubscribe: () => {\n if (released) return;\n released = true;\n this.releaseSubscription(state, leaseId);\n },\n refetch: () => this.refetch(state),\n };\n }\n\n async call<TInput, TOutput>(\n path: string,\n input: TInput,\n options?: MutationOptions<TInput, TOutput>,\n ): Promise<TOutput> {\n const mutationId = generateId();\n const layers: SubscriptionState<unknown>[] = [];\n\n try {\n this.createMutationLayers(mutationId, input, options, layers);\n const connectionId = await this.wsManager.waitForConnectionId();\n const headers = await this.buildHeaders();\n const response = await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({ type: 'call', connectionId, path, input }),\n });\n if (!response.ok) {\n throw new Error(`Call failed: ${response.status} ${response.statusText}`);\n }\n\n const result = (await response.json()) as {\n type: string;\n message?: string;\n data?: unknown;\n };\n if (result.type === 'error') {\n throw new Error(result.message ?? 'Unknown error');\n }\n\n const data = result.data as TOutput;\n this.settleMutationLayers(mutationId, input, data, options, layers);\n return data;\n } catch (cause) {\n this.removeMutationLayers(mutationId, layers);\n throw cause;\n }\n }\n\n addSubscriptionListener(id: string, listener: () => void): () => void {\n const state = this.subscriptionsById.get(id);\n if (!state) return () => undefined;\n state.listeners.add(listener);\n return () => state.listeners.delete(listener);\n }\n\n getSubscriptionRevision(id: string): number {\n return this.subscriptionsById.get(id)?.revision ?? -1;\n }\n\n applyOptimisticUpdate(subscriptionId: string, updater: (data: unknown) => unknown): void {\n const state = this.subscriptionsById.get(subscriptionId);\n if (!state || state.data === undefined) return;\n state.optimisticLayers.set(`local-${generateId()}`, {\n updater,\n });\n this.recomputeData(state);\n this.notifySubscription(state, true);\n }\n\n private setAuth(auth: ReactiveClientConfig['auth']): void {\n this.authGetter = this.toAuthGetter(auth);\n }\n\n private setInitialHeaders(headers: ReactiveClientConfig['headers']): void {\n this.headersGetter = this.toHeadersGetter(headers);\n }\n\n private toAuthGetter(\n auth: ReactiveClientConfig['auth'],\n ): (() => string | Promise<string>) | undefined {\n if (!auth) return undefined;\n return typeof auth === 'function' ? auth : () => auth;\n }\n\n private toHeadersGetter(\n headers: ReactiveClientConfig['headers'],\n ): (() => Record<string, string> | Promise<Record<string, string>>) | undefined {\n if (!headers) return undefined;\n return typeof headers === 'function' ? headers : () => headers;\n }\n\n private registerActiveSubscriptions(socketGeneration: number): void {\n for (const state of this.subscriptionsByKey.values()) {\n if (state.active) {\n void this.ensureRegistered(state, socketGeneration).catch(() => undefined);\n }\n }\n }\n\n private ensureRegistered(\n state: SubscriptionState<unknown>,\n socketGeneration: number,\n force = false,\n ): Promise<void> {\n if (\n !force &&\n state.registrationSocketGeneration === socketGeneration &&\n state.registrationPromise\n ) {\n return state.registrationPromise;\n }\n\n state.generation++;\n state.registrationSettlementRevision = state.settlementRevision;\n state.registrationId = generateId();\n state.registrationSocketGeneration = socketGeneration;\n state.registrationConnectionId = undefined;\n state.registrationPromise = undefined;\n state.resyncPromise = undefined;\n state.resyncGeneration = undefined;\n state.hasRegistered = false;\n state.version = undefined;\n state.patchBuffer.clear();\n state.appliedMessageIds.clear();\n state.loading = true;\n state.stale = true;\n state.error = undefined;\n this.notifySubscription(state);\n\n const generation = state.generation;\n const registrationId = state.registrationId;\n const isCurrent = () =>\n state.active &&\n state.generation === generation &&\n state.registrationId === registrationId &&\n state.registrationSocketGeneration === socketGeneration &&\n this.wsManager.generation === socketGeneration;\n let requestIssued = false;\n let registrationConnectionId: string | undefined;\n // A synchronous throw before the first await runs the finally block before\n // this assignment completes, so `request` must exist (undefined) already.\n // oxlint-disable-next-line prefer-const -- Read before assignment on a synchronous throw.\n let request!: Promise<void>;\n request = (async () => {\n try {\n const connectionId = await this.wsManager.waitForConnectionId();\n if (!isCurrent()) return;\n registrationConnectionId = connectionId;\n state.registrationConnectionId = connectionId;\n const headers = await this.buildHeaders();\n if (!isCurrent()) return;\n requestIssued = true;\n const response = await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n type: 'subscribe',\n connectionId,\n subscriptionId: state.id,\n generation,\n registrationId,\n path: state.path,\n input: state.input,\n }),\n });\n if (!response.ok) {\n throw new Error(`Subscribe failed: ${response.status} ${response.statusText}`);\n }\n\n const result = (await response.json()) as HttpResult;\n if (result.type === 'error') {\n throw new Error(result.message);\n }\n if (!isCurrent()) return;\n this.handleSnapshot(result);\n if (isCurrent()) state.hasRegistered = true;\n } catch (cause) {\n if (isCurrent()) {\n const failure = cause instanceof Error ? cause : new Error(String(cause));\n state.error = failure;\n state.loading = this.hasSettledLayers(state);\n this.notifySubscription(state, false, failure);\n }\n throw cause;\n } finally {\n if ((!state.active || !isCurrent()) && requestIssued) {\n void this.sendUnsubscribe(registrationConnectionId, state.id, generation, registrationId);\n }\n if (state.registrationPromise === request) {\n state.registrationPromise = undefined;\n }\n }\n })();\n state.registrationPromise = request;\n return request;\n }\n\n private releaseSubscription(state: SubscriptionState<unknown>, leaseId: string): void {\n state.observers.delete(leaseId);\n if (state.observers.size > 0) return;\n\n state.active = false;\n this.subscriptionsById.delete(state.id);\n this.subscriptionsByKey.delete(state.key);\n if (state.registrationId && state.registrationConnectionId && state.hasRegistered) {\n void this.sendUnsubscribe(\n state.registrationConnectionId,\n state.id,\n state.generation,\n state.registrationId,\n );\n }\n }\n\n private async sendUnsubscribe(\n connectionId: string | undefined,\n subscriptionId: string,\n generation: number,\n registrationId: string,\n ): Promise<void> {\n if (!connectionId) return;\n try {\n const headers = await this.buildHeaders();\n await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n type: 'unsubscribe',\n connectionId,\n subscriptionId,\n generation,\n registrationId,\n }),\n });\n } catch {\n // Connection cleanup is the fallback when an unsubscribe cannot be sent.\n }\n }\n\n private async refetch(state: SubscriptionState<unknown>): Promise<void> {\n if (!state.active) return;\n if (!state.registrationId) {\n await this.ensureRegistered(state, this.wsManager.generation);\n return;\n }\n await this.requestResync(state);\n }\n\n private handleMessage(message: WebSocketEvent): void {\n switch (message.type) {\n case 'patch':\n this.handlePatch(message);\n break;\n case 'resync': {\n const state = this.subscriptionsById.get(message.subscriptionId);\n if (state?.generation === message.generation) {\n void this.requestResync(state).catch(() => undefined);\n }\n break;\n }\n case 'connected':\n case 'pong':\n break;\n }\n }\n\n private handleSnapshot(message: SnapshotResponse): void {\n const state = this.subscriptionsById.get(message.subscriptionId);\n if (!state || message.generation !== state.generation) return;\n if (state.version !== undefined && message.version <= state.version) return;\n\n state.authoritativeData = message.data;\n state.version = message.version;\n state.error = undefined;\n\n const coveredRevision = state.registrationSettlementRevision;\n for (const [layerId, layer] of state.optimisticLayers) {\n if (layer.settledRevision !== undefined && layer.settledRevision <= coveredRevision) {\n state.optimisticLayers.delete(layerId);\n }\n }\n const awaitingReconciliation = this.hasSettledLayers(state);\n state.loading = awaitingReconciliation;\n state.stale = awaitingReconciliation;\n this.recomputeData(state);\n this.discardStalePatches(state);\n this.notifySubscription(state, true);\n this.drainPatchBuffer(state);\n }\n\n private handlePatch(message: PatchEvent): void {\n const state = this.subscriptionsById.get(message.subscriptionId);\n if (!state || message.generation !== state.generation) return;\n if (\n state.appliedMessageIds.has(message.messageId) ||\n state.patchBuffer.has(message.messageId)\n ) {\n return;\n }\n if (state.version !== undefined && message.toVersion <= state.version) {\n state.appliedMessageIds.add(message.messageId);\n return;\n }\n\n state.patchBuffer.set(message.messageId, message);\n if (state.version === undefined) return;\n this.drainPatchBuffer(state);\n }\n\n private drainPatchBuffer(state: SubscriptionState<unknown>): void {\n if (state.version === undefined || state.authoritativeData === undefined) {\n return;\n }\n\n this.discardStalePatches(state);\n for (;;) {\n const next = [...state.patchBuffer.values()]\n .filter((patch) => patch.fromVersion === state.version)\n .sort((left, right) => left.toVersion - right.toVersion)\n .at(0);\n if (!next) break;\n\n state.patchBuffer.delete(next.messageId);\n try {\n state.authoritativeData = applyPatches(state.authoritativeData, next.patches);\n state.version = next.toVersion;\n state.appliedMessageIds.add(next.messageId);\n const awaitingReconciliation = this.hasSettledLayers(state);\n state.loading = awaitingReconciliation;\n state.stale = awaitingReconciliation;\n state.error = undefined;\n this.recomputeData(state);\n this.notifySubscription(state, true);\n this.discardStalePatches(state);\n } catch {\n void this.requestResync(state).catch(() => undefined);\n return;\n }\n }\n\n if (\n [...state.patchBuffer.values()].some(\n (patch) => patch.toVersion > state.version! && patch.fromVersion !== state.version,\n )\n ) {\n void this.requestResync(state).catch(() => undefined);\n }\n }\n\n private discardStalePatches(state: SubscriptionState<unknown>): void {\n if (state.version === undefined) return;\n for (const [messageId, patch] of state.patchBuffer) {\n if (patch.toVersion <= state.version) {\n state.patchBuffer.delete(messageId);\n state.appliedMessageIds.add(messageId);\n }\n }\n }\n\n private requestResync(state: SubscriptionState<unknown>): Promise<void> {\n if (state.resyncPromise && state.resyncGeneration === state.generation) {\n return state.resyncPromise;\n }\n if (!state.active || !state.registrationId) return Promise.resolve();\n\n state.stale = true;\n state.loading = true;\n this.notifySubscription(state);\n const request: Promise<void> = this.ensureRegistered(state, this.wsManager.generation, true)\n .finally(() => {\n if (state.resyncPromise === request) {\n state.resyncPromise = undefined;\n state.resyncGeneration = undefined;\n }\n })\n .then(() => {\n if (state.active && this.hasSettledLayers(state)) {\n return this.requestResync(state);\n }\n return undefined;\n });\n state.resyncPromise = request;\n state.resyncGeneration = state.generation;\n return request;\n }\n\n private createMutationLayers<TInput, TOutput>(\n mutationId: string,\n input: TInput,\n options: MutationOptions<TInput, TOutput> | undefined,\n layered: SubscriptionState<unknown>[],\n ): void {\n const targets = this.findMutationTargets(options);\n for (const state of targets) {\n const updater = this.createOptimisticUpdater(input, options);\n if (!updater || state.authoritativeData === undefined) continue;\n state.optimisticLayers.set(mutationId, {\n updater,\n });\n layered.push(state);\n this.recomputeData(state);\n this.notifySubscription(state, true);\n }\n }\n\n private findMutationTargets<TInput, TOutput>(\n options: MutationOptions<TInput, TOutput> | undefined,\n ): SubscriptionState<unknown>[] {\n if (options?.queryKey) {\n const exact = this.subscriptionsByKey.get(options.queryKey);\n return exact ? [exact] : [];\n }\n if (typeof options?.invalidates === 'object') {\n const exact = this.subscriptionsByKey.get(\n getQueryKey(options.invalidates.path, options.invalidates.input),\n );\n return exact ? [exact] : [];\n }\n if (typeof options?.invalidates === 'string') {\n return [...this.subscriptionsByKey.values()].filter(\n (state) => state.path === options.invalidates,\n );\n }\n return [];\n }\n\n private createOptimisticUpdater<TInput, TOutput>(\n input: TInput,\n options: MutationOptions<TInput, TOutput> | undefined,\n result?: TOutput,\n settled = false,\n ): OptimisticUpdater | undefined {\n const update = options?.optimisticUpdate;\n if (typeof update === 'function') {\n return (data) => (Array.isArray(data) ? update(data, input, result) : data);\n }\n\n const itemId =\n typeof input === 'object' && input !== null ? (input as { id?: unknown }).id : undefined;\n if (update === 'remove' && itemId !== undefined) {\n return (data) =>\n Array.isArray(data)\n ? data.filter((item) => (item as { id?: unknown }).id !== itemId)\n : data;\n }\n if (update !== 'merge') return undefined;\n\n if (itemId !== undefined) {\n const resultFields = settled && typeof result === 'object' && result !== null ? result : {};\n return (data) => {\n if (!Array.isArray(data)) return data;\n return data.map((item) =>\n (item as { id?: unknown }).id === itemId ? { ...item, ...input, ...resultFields } : item,\n );\n };\n }\n if (options?.optimisticData === undefined) return undefined;\n\n return (data) => {\n if (!Array.isArray(data)) return data;\n const optimistic = settled\n ? // oxlint-disable-next-line typescript/prefer-nullish-coalescing -- null is a valid mutation result.\n result === undefined\n ? typeof options.optimisticData === 'function'\n ? (\n options.optimisticData as (\n optimisticInput: TInput,\n currentData: unknown[],\n ) => TOutput | undefined\n )(input, data)\n : options.optimisticData\n : result\n : typeof options.optimisticData === 'function'\n ? (\n options.optimisticData as (\n optimisticInput: TInput,\n currentData: unknown[],\n ) => TOutput | undefined\n )(input, data)\n : options.optimisticData;\n if (settled && optimistic !== null && typeof optimistic === 'object') {\n const optimisticId = (optimistic as { id?: unknown }).id;\n if (\n optimisticId !== undefined &&\n data.some(\n (item) =>\n typeof item === 'object' &&\n item !== null &&\n (item as { id?: unknown }).id === optimisticId,\n )\n ) {\n return data;\n }\n }\n return optimistic === undefined ? data : [optimistic, ...data];\n };\n }\n\n private settleMutationLayers<TInput, TOutput>(\n mutationId: string,\n input: TInput,\n result: TOutput,\n options: MutationOptions<TInput, TOutput> | undefined,\n states: SubscriptionState<unknown>[],\n ): void {\n for (const state of states) {\n const layer = state.optimisticLayers.get(mutationId);\n const updater = this.createOptimisticUpdater(input, options, result, true);\n if (!layer || !updater) continue;\n layer.updater = updater;\n layer.settledRevision = ++state.settlementRevision;\n state.loading = true;\n state.stale = true;\n this.recomputeData(state);\n this.notifySubscription(state, true);\n void this.requestResync(state).catch(() => undefined);\n }\n }\n\n private removeMutationLayers(mutationId: string, states: SubscriptionState<unknown>[]): void {\n for (const state of states) {\n if (!state.optimisticLayers.delete(mutationId)) continue;\n this.recomputeData(state);\n this.notifySubscription(state, true);\n }\n }\n\n private recomputeData(state: SubscriptionState<unknown>): void {\n let data = state.authoritativeData;\n for (const layer of state.optimisticLayers.values()) {\n data = layer.updater(data);\n }\n state.data = data;\n }\n\n private hasSettledLayers(state: SubscriptionState<unknown>): boolean {\n for (const layer of state.optimisticLayers.values()) {\n if (layer.settledRevision !== undefined) return true;\n }\n return false;\n }\n\n private async buildHeaders(): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.headersGetter) Object.assign(headers, await this.headersGetter());\n if (this.authGetter) {\n headers['Authorization'] = `Bearer ${await this.authGetter()}`;\n }\n return headers;\n }\n\n private markSubscriptionsStale(): void {\n for (const state of this.subscriptionsByKey.values()) {\n if (!state.active) continue;\n state.stale = true;\n state.loading = true;\n this.notifySubscription(state);\n }\n }\n\n private notifySubscription(\n state: SubscriptionState<unknown>,\n dataChanged = false,\n failure?: Error,\n ): void {\n if (!state.active) return;\n state.revision++;\n for (const listener of state.listeners) listener();\n if (dataChanged) {\n for (const observer of state.observers.values()) {\n observer.onData?.(state.data);\n }\n }\n if (failure) {\n for (const observer of state.observers.values()) {\n observer.onError?.(failure);\n }\n }\n }\n\n private notifyStateListeners(): void {\n for (const listener of this.stateListeners) {\n listener(this.connectionState);\n }\n }\n}\n\ntype ProcedureInput<T> = T extends { inputSchema?: { _output: infer TInput } } ? TInput : undefined;\n\ntype ProcedureOutput<T> = T extends {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- resolver parameter variance prevents `unknown`\n resolver: (...args: any[]) => infer TReturn;\n}\n ? Awaited<TReturn>\n : unknown;\n\ntype ExtractRouterDefinition<T> = T extends { definition: infer TDefinition } ? TDefinition : T;\n\ntype QueryProcedure<T> = [ProcedureInput<T>] extends [undefined]\n ? {\n useSubscription: (\n input?: undefined,\n options?: Omit<SubscriptionOptions<undefined, ProcedureOutput<T>>, 'input'>,\n ) => Subscription<ProcedureOutput<T>>;\n }\n : {\n useSubscription: (\n input: ProcedureInput<T>,\n options?: Omit<SubscriptionOptions<ProcedureInput<T>, ProcedureOutput<T>>, 'input'>,\n ) => Subscription<ProcedureOutput<T>>;\n };\n\ntype MutationProcedure<T> = [ProcedureInput<T>] extends [undefined]\n ? {\n mutate: (\n input?: undefined,\n options?: MutationOptions<undefined, ProcedureOutput<T>>,\n ) => Promise<ProcedureOutput<T>>;\n }\n : {\n mutate: (\n input: ProcedureInput<T>,\n options?: MutationOptions<ProcedureInput<T>, ProcedureOutput<T>>,\n ) => Promise<ProcedureOutput<T>>;\n };\n\ntype TypedReactiveClientTree<T> = T extends { type: 'query' }\n ? QueryProcedure<T>\n : T extends { type: 'mutation' }\n ? MutationProcedure<T>\n : { [K in keyof T]: TypedReactiveClientTree<T[K]> };\n\nexport type TypedReactiveClient<TRouter> = TypedReactiveClientTree<\n ExtractRouterDefinition<TRouter>\n> & {\n connect: () => Promise<void>;\n disconnect: () => void;\n};\n\nexport function createReactiveClient<TRouter>(\n config: ReactiveClientConfig,\n): TypedReactiveClient<TRouter> {\n const client = new ReactiveClient(config);\n return createTypedProxy(client, []) as TypedReactiveClient<TRouter>;\n}\n\nfunction createTypedProxy(client: ReactiveClient, path: string[]): unknown {\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (property === 'connect') return () => client.connect();\n if (property === 'disconnect') return () => client.disconnect();\n if (typeof property !== 'string') return undefined;\n\n if (property === 'useSubscription') {\n return (input?: unknown, options?: SubscriptionOptions) =>\n client.subscribe(path.join('.'), { ...options, input });\n }\n if (property === 'mutate') {\n return (input: unknown, options?: MutationOptions<unknown, unknown>) =>\n client.call(path.join('.'), input, options);\n }\n return createTypedProxy(client, [...path, property]);\n },\n },\n );\n}\n"]}
1
+ {"version":3,"sources":["../../client/src/canonical.ts","../../client/src/patcher.ts","../../client/src/log.ts","../../client/src/websocket.ts","../../client/src/client.ts"],"names":["key","jsonpatch","error"],"mappings":"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","file":"client.cjs","sourcesContent":["function canonicalize(\n value: unknown,\n seen: Set<object>,\n key: string,\n arrayItem = false,\n applyToJSON = true,\n): string | undefined {\n if (value === null) return 'null';\n\n switch (typeof value) {\n case 'string':\n case 'boolean':\n return JSON.stringify(value);\n case 'number':\n return Number.isFinite(value) ? JSON.stringify(value) : 'null';\n case 'undefined':\n return arrayItem ? 'null' : undefined;\n case 'object': {\n if (applyToJSON && 'toJSON' in value && typeof value.toJSON === 'function') {\n return canonicalize(value.toJSON(key), seen, key, arrayItem, false);\n }\n if (seen.has(value)) {\n throw new TypeError('Query input must not contain circular references');\n }\n\n seen.add(value);\n try {\n if (Array.isArray(value)) {\n const items: string[] = [];\n for (let index = 0; index < value.length; index++) {\n items.push(canonicalize(value[index], seen, String(index), true) ?? 'null');\n }\n return `[${items.join(',')}]`;\n }\n\n const object = value as Record<string, unknown>;\n const entries: string[] = [];\n for (const key of Object.keys(object).sort()) {\n const item = canonicalize(object[key], seen, key);\n if (item !== undefined) {\n entries.push(`${JSON.stringify(key)}:${item}`);\n }\n }\n return `{${entries.join(',')}}`;\n } finally {\n seen.delete(value);\n }\n }\n case 'bigint':\n case 'function':\n case 'symbol':\n default:\n throw new TypeError(`Unsupported query input value: ${typeof value}`);\n }\n}\n\n/** Return the stable identity used for subscription sharing and targeting. */\nexport function getQueryKey(path: string, input?: unknown): string {\n return `${JSON.stringify(path)}:${canonicalize(input, new Set(), '') ?? 'undefined'}`;\n}\n","import jsonpatch, { type Operation } from 'fast-json-patch';\n\nimport type { JsonPatch } from './protocol.js';\n\n/**\n * Apply JSON patches to a document\n */\nexport function applyPatches<T>(document: T, patches: JsonPatch[]): T {\n if (patches.length === 0) {\n return document;\n }\n\n const operations: Operation[] = patches.map((patch) => {\n const op: Operation = {\n op: patch.op,\n path: patch.path,\n } as Operation;\n\n if ('value' in patch && patch.value !== undefined) {\n (op as { value: unknown }).value = patch.value;\n }\n if ('from' in patch && patch.from !== undefined) {\n (op as { from: string }).from = patch.from;\n }\n\n return op;\n });\n\n try {\n const result = jsonpatch.applyPatch(\n structuredClone(document),\n operations,\n true, // Validate operations\n false, // Don't mutate the original\n );\n\n return result.newDocument as T;\n } catch (error) {\n throw new Error('Failed to apply patches', { cause: error });\n }\n}\n","/* eslint-disable no-console */\ntype DebugGlobal = typeof globalThis & {\n __DYNAMODB_REACTIVE_DEBUG__?: boolean;\n};\n\nexport function debug(...values: unknown[]): void {\n if ((globalThis as DebugGlobal).__DYNAMODB_REACTIVE_DEBUG__) {\n console.debug(...values);\n }\n}\n\nexport function warn(...values: unknown[]): void {\n console.warn(...values);\n}\n\nexport function error(...values: unknown[]): void {\n console.error(...values);\n}\n","import { error as logError } from './log.js';\nimport type { WebSocketEvent } from './protocol.js';\nimport type { ConnectionState, ReactiveClientConfig } from './types.js';\n\ninterface ConnectionWaitOptions {\n signal?: AbortSignal;\n timeoutMs?: number;\n}\n\ninterface ConnectionWaiter {\n resolve: (id: string) => void;\n reject: (error: Error) => void;\n cleanup: () => void;\n}\n\ntype ManagerConfig = Required<\n Pick<\n ReactiveClientConfig,\n | 'autoReconnect'\n | 'connectionTimeout'\n | 'handshakeTimeout'\n | 'heartbeatInterval'\n | 'heartbeatTimeout'\n | 'maxReconnectAttempts'\n | 'reconnectDelay'\n >\n> &\n ReactiveClientConfig;\n\nfunction withDefaults(config: ReactiveClientConfig): ManagerConfig {\n return {\n autoReconnect: true,\n connectionTimeout: 10000,\n handshakeTimeout: 10000,\n heartbeatInterval: 5 * 60 * 1000,\n heartbeatTimeout: 15_000,\n maxReconnectAttempts: 10,\n reconnectDelay: 1000,\n ...config,\n };\n}\n\n/** WebSocket manager with generation-fenced events and reconnection. */\nexport class WebSocketManager {\n private config: ManagerConfig;\n private ws: WebSocket | null = null;\n private state: ConnectionState = 'disconnected';\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private handshakeTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private pongTimer: ReturnType<typeof setTimeout> | null = null;\n private messageHandlers = new Set<(message: WebSocketEvent) => void>();\n private stateHandlers = new Set<(state: ConnectionState) => void>();\n private handshakeHandlers = new Set<(generation: number) => void>();\n private _connectionId: string | null = null;\n private connectionWaiters = new Set<ConnectionWaiter>();\n private socketGeneration = 0;\n private intentionalDisconnect = false;\n private lastConnectionError: Error | undefined;\n\n constructor(config: ReactiveClientConfig) {\n this.config = withDefaults(config);\n }\n\n /** Apply settings used by future requests/events without replacing the socket. */\n configure(config: ReactiveClientConfig): void {\n this.config = withDefaults(config);\n }\n\n get connectionId(): string | null {\n return this._connectionId;\n }\n\n get generation(): number {\n return this.socketGeneration;\n }\n\n waitForConnectionId(options: ConnectionWaitOptions = {}): Promise<string> {\n if (this._connectionId && this.state === 'connected') {\n return Promise.resolve(this._connectionId);\n }\n if (options.signal?.aborted) {\n return Promise.reject(new Error('Connection wait aborted'));\n }\n\n const timeoutMs = options.timeoutMs ?? this.config.connectionTimeout;\n return new Promise((resolve, reject) => {\n // oxlint-disable-next-line prefer-const -- cleanup can run before the timer is set.\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const abort = () => finish(new Error('Connection wait aborted'));\n const waiter: ConnectionWaiter = {\n resolve,\n reject,\n cleanup: () => {\n if (timeout) clearTimeout(timeout);\n options.signal?.removeEventListener('abort', abort);\n },\n };\n const finish = (failure: Error) => {\n if (!this.connectionWaiters.delete(waiter)) return;\n waiter.cleanup();\n reject(failure);\n };\n\n this.connectionWaiters.add(waiter);\n options.signal?.addEventListener('abort', abort, { once: true });\n timeout = setTimeout(\n () =>\n finish(\n new Error(`Connection timed out after ${timeoutMs}ms`, {\n cause: this.lastConnectionError,\n }),\n ),\n timeoutMs,\n );\n });\n }\n\n getState(): ConnectionState {\n return this.state;\n }\n\n async connect(): Promise<void> {\n if (this.state === 'connected') return;\n if (this.state === 'connecting') {\n await this.waitForConnectionId();\n return;\n }\n\n if (this.state !== 'reconnecting') this.lastConnectionError = undefined;\n this.intentionalDisconnect = false;\n const generation = ++this.socketGeneration;\n this.setState('connecting');\n let socket: WebSocket | undefined;\n let retryable = true;\n\n try {\n if (!this.config.webSocketFactory && typeof globalThis.WebSocket !== 'function') {\n retryable = false;\n throw new Error(\n 'WebSocket is unavailable in this runtime. Enable the native WebSocket API ' +\n '(Node 20: --experimental-websocket), use Node 22 or newer, or configure webSocketFactory.',\n );\n }\n const url = await this.buildUrl();\n // oxlint-disable-next-line typescript/no-unnecessary-condition -- disconnect() can run while the URL is built.\n if (generation !== this.socketGeneration || this.intentionalDisconnect) {\n return;\n }\n\n let nextSocket: WebSocket;\n try {\n nextSocket = this.config.webSocketFactory\n ? this.config.webSocketFactory(url)\n : new globalThis.WebSocket(url);\n } catch (cause) {\n // Retrying cannot repair missing APIs, malformed URLs or a factory\n // that cannot construct a socket. Preserve its original error.\n retryable = false;\n throw cause;\n }\n socket = nextSocket;\n this.ws = nextSocket;\n this.startHandshakeTimer(nextSocket, generation);\n\n nextSocket.onopen = () => {\n if (!this.isCurrent(nextSocket, generation)) return;\n nextSocket.send(JSON.stringify({ type: 'init' }));\n };\n\n nextSocket.onclose = () => {\n if (!this.isCurrent(nextSocket, generation)) return;\n this.handleClose();\n };\n\n nextSocket.onerror = () => {\n if (!this.isCurrent(nextSocket, generation)) return;\n const failure = new Error('WebSocket error');\n this.lastConnectionError = failure;\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n };\n\n nextSocket.onmessage = (event) => {\n if (!this.isCurrent(nextSocket, generation)) return;\n this.receiveMessage(nextSocket, generation, event.data);\n };\n } catch (cause) {\n if (generation !== this.socketGeneration) return;\n const failure = cause instanceof Error ? cause : new Error(String(cause));\n this.lastConnectionError = failure;\n this.clearConnectionTimers();\n if (!retryable) {\n this.clearTimers();\n this.reconnectAttempts = 0;\n }\n if (socket && this.ws === socket) socket.close();\n this.ws = null;\n this._connectionId = null;\n this.setState('disconnected');\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n\n // oxlint-disable-next-line typescript/no-unnecessary-condition -- disconnect() sets it from outside this handler.\n if (retryable && this.config.autoReconnect && !this.intentionalDisconnect) {\n this.scheduleReconnect();\n await this.waitForConnectionId();\n return;\n }\n this.rejectWaiters(failure);\n throw failure;\n }\n\n await this.waitForConnectionId();\n }\n\n disconnect(): void {\n this.intentionalDisconnect = true;\n ++this.socketGeneration;\n this.clearTimers();\n\n const socket = this.ws;\n this.ws = null;\n socket?.close(1000, 'Client disconnect');\n this._connectionId = null;\n this.setState('disconnected');\n this.rejectWaiters(new Error('WebSocket disconnected'));\n }\n\n forceReconnect(): void {\n this.intentionalDisconnect = false;\n ++this.socketGeneration;\n this.clearTimers();\n\n const socket = this.ws;\n this.ws = null;\n socket?.close(1000, 'Force reconnect');\n this._connectionId = null;\n this.reconnectAttempts = 0;\n this.setState('disconnected');\n void this.connect().catch(() => undefined);\n }\n\n /** Sends an application frame on the open socket; false when not connected. */\n send(frame: Record<string, unknown>): boolean {\n const socket = this.ws;\n if (!socket || this.state !== 'connected' || socket.readyState !== socket.OPEN) return false;\n socket.send(JSON.stringify(frame));\n return true;\n }\n\n onMessage(handler: (message: WebSocketEvent) => void): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n onStateChange(handler: (state: ConnectionState) => void): () => void {\n this.stateHandlers.add(handler);\n return () => this.stateHandlers.delete(handler);\n }\n\n onHandshake(handler: (generation: number) => void): () => void {\n this.handshakeHandlers.add(handler);\n return () => this.handshakeHandlers.delete(handler);\n }\n\n private async buildUrl(): Promise<string> {\n let url = this.config.url;\n if (!this.config.auth) return url;\n\n const token =\n typeof this.config.auth === 'function' ? await this.config.auth() : this.config.auth;\n const separator = url.includes('?') ? '&' : '?';\n url = `${url}${separator}token=${encodeURIComponent(token)}`;\n return url;\n }\n\n private receiveMessage(socket: WebSocket, generation: number, rawData: unknown): void {\n try {\n const message = JSON.parse(String(rawData)) as WebSocketEvent;\n if (message.type === 'connected') {\n if (this._connectionId) return;\n this._connectionId = message.connectionId;\n socket.send(JSON.stringify({ type: 'ping' }));\n return;\n }\n\n if (message.type === 'pong') {\n this.clearPongTimer();\n if (!this._connectionId || this.state === 'connected') return;\n this.clearHandshakeTimer();\n this.lastConnectionError = undefined;\n this.reconnectAttempts = 0;\n this.setState('connected');\n this.startHeartbeat(socket, generation);\n this.invokeLifecycleCallback('onConnect', this.config.onConnect);\n this.resolveWaiters(this._connectionId);\n for (const handler of this.handshakeHandlers) handler(generation);\n return;\n }\n\n for (const handler of this.messageHandlers) handler(message);\n } catch (cause) {\n logError('Failed to parse WebSocket message:', cause);\n }\n }\n\n private startHandshakeTimer(socket: WebSocket, generation: number): void {\n this.clearHandshakeTimer();\n this.handshakeTimer = setTimeout(() => {\n if (!this.isCurrent(socket, generation) || this.state === 'connected') {\n return;\n }\n const failure = new Error('WebSocket handshake timed out');\n this.lastConnectionError = failure;\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n socket.close(4000, 'Handshake timeout');\n }, this.config.handshakeTimeout);\n }\n\n private handleClose(): void {\n this.clearConnectionTimers();\n this.ws = null;\n this._connectionId = null;\n this.setState('disconnected');\n this.invokeLifecycleCallback('onDisconnect', this.config.onDisconnect);\n\n if (this.config.autoReconnect && !this.intentionalDisconnect) {\n this.scheduleReconnect();\n } else {\n this.rejectWaiters(new Error('WebSocket disconnected'));\n }\n }\n\n private startHeartbeat(socket: WebSocket, generation: number): void {\n this.clearHeartbeatTimer();\n this.heartbeatTimer = setInterval(() => {\n if (\n !this.isCurrent(socket, generation) ||\n this.state !== 'connected' ||\n socket.readyState !== socket.OPEN\n ) {\n return;\n }\n socket.send(JSON.stringify({ type: 'ping' }));\n this.pongTimer ??= setTimeout(() => {\n this.pongTimer = null;\n if (!this.isCurrent(socket, generation)) return;\n const failure = new Error('WebSocket heartbeat timed out');\n this.lastConnectionError = failure;\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n // A dead peer can hold close() in CLOSING for minutes, so drop the socket now\n // instead of waiting for its close event.\n socket.onclose = null;\n socket.close(4001, 'Heartbeat timeout');\n this.handleClose();\n }, this.config.heartbeatTimeout);\n }, this.config.heartbeatInterval);\n }\n\n private isCurrent(socket: WebSocket, generation: number): boolean {\n return this.ws === socket && this.socketGeneration === generation;\n }\n\n private setState(state: ConnectionState): void {\n if (this.state === state) return;\n this.state = state;\n for (const handler of this.stateHandlers) handler(state);\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer || this.intentionalDisconnect) return;\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n const failure = new Error('Max reconnection attempts reached', {\n cause: this.lastConnectionError,\n });\n logError(failure.message);\n this.setState('disconnected');\n this.rejectWaiters(failure);\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n return;\n }\n\n this.setState('reconnecting');\n this.reconnectAttempts++;\n const delay =\n Math.min(this.config.reconnectDelay * 2 ** (this.reconnectAttempts - 1), 30000) *\n (0.5 + Math.random() * 0.5);\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n void this.connect().catch(() => undefined);\n }, delay);\n }\n\n private resolveWaiters(connectionId: string): void {\n const waiters = [...this.connectionWaiters];\n this.connectionWaiters.clear();\n for (const waiter of waiters) {\n waiter.cleanup();\n waiter.resolve(connectionId);\n }\n }\n\n private invokeLifecycleCallback<TArguments extends unknown[]>(\n name: 'onConnect' | 'onDisconnect' | 'onError',\n callback: ((...args: TArguments) => void) | undefined,\n ...args: TArguments\n ): void {\n if (!callback) return;\n try {\n callback(...args);\n } catch (cause) {\n try {\n logError(`[dynamodb-reactive] ${name} callback failed:`, cause);\n } catch {\n // Reporting must not let user callbacks re-enter socket lifecycle paths.\n }\n }\n }\n\n private rejectWaiters(failure: Error): void {\n const waiters = [...this.connectionWaiters];\n this.connectionWaiters.clear();\n for (const waiter of waiters) {\n waiter.cleanup();\n waiter.reject(failure);\n }\n }\n\n private clearHandshakeTimer(): void {\n if (!this.handshakeTimer) return;\n clearTimeout(this.handshakeTimer);\n this.handshakeTimer = null;\n }\n\n private clearHeartbeatTimer(): void {\n if (!this.heartbeatTimer) return;\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n private clearPongTimer(): void {\n if (!this.pongTimer) return;\n clearTimeout(this.pongTimer);\n this.pongTimer = null;\n }\n\n private clearConnectionTimers(): void {\n this.clearHandshakeTimer();\n this.clearHeartbeatTimer();\n this.clearPongTimer();\n }\n\n private clearTimers(): void {\n this.clearConnectionTimers();\n if (!this.reconnectTimer) return;\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n}\n","import { getQueryKey } from './canonical.js';\nimport { applyPatches } from './patcher.js';\nimport type { ErrorResponse, PatchEvent, SnapshotResponse, WebSocketEvent } from './protocol.js';\nimport type {\n ConnectionState,\n MutationOptions,\n ReactiveClientConfig,\n Subscription,\n SubscriptionOptions,\n} from './types.js';\nimport { WebSocketManager } from './websocket.js';\n\nconst DEFAULT_HTTP_URL = '/api/reactive';\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\ntype OptimisticUpdater = (data: unknown) => unknown;\n\ninterface OptimisticLayer {\n updater: OptimisticUpdater;\n settledRevision?: number;\n}\n\ninterface SubscriptionObserver {\n onData?: (data: unknown) => void;\n onError?: (error: Error) => void;\n}\n\ninterface SubscriptionState<TData> {\n id: string;\n key: string;\n path: string;\n input: unknown;\n authoritativeData: unknown;\n data: TData | undefined;\n loading: boolean;\n stale: boolean;\n error: Error | undefined;\n listeners: Set<() => void>;\n observers: Map<string, SubscriptionObserver>;\n active: boolean;\n hasRegistered: boolean;\n generation: number;\n registrationId: string | undefined;\n registrationConnectionId: string | undefined;\n registrationSocketGeneration: number | undefined;\n registrationPromise: Promise<void> | undefined;\n version: number | undefined;\n patchBuffer: Map<string, PatchEvent>;\n appliedMessageIds: Set<string>;\n resyncPromise: Promise<void> | undefined;\n resyncGeneration: number | undefined;\n optimisticLayers: Map<string, OptimisticLayer>;\n settlementRevision: number;\n registrationSettlementRevision: number;\n revision: number;\n}\n\ntype HttpResult = SnapshotResponse | ErrorResponse;\n\n/** Reactive client for shared, versioned subscriptions. */\nexport class ReactiveClient {\n private wsManager: WebSocketManager;\n private httpUrl: string;\n private authGetter?: () => string | Promise<string>;\n private headersGetter?: () => Record<string, string> | Promise<Record<string, string>>;\n private subscriptionsById = new Map<string, SubscriptionState<unknown>>();\n private subscriptionsByKey = new Map<string, SubscriptionState<unknown>>();\n private connectionState: ConnectionState = 'disconnected';\n private stateListeners = new Set<(state: ConnectionState) => void>();\n\n constructor(config: ReactiveClientConfig) {\n this.wsManager = new WebSocketManager(config);\n this.httpUrl = config.httpUrl ?? DEFAULT_HTTP_URL;\n this.setAuth(config.auth);\n this.setInitialHeaders(config.headers);\n\n this.wsManager.onMessage((message) => this.handleMessage(message));\n this.wsManager.onStateChange((state) => {\n this.connectionState = state;\n this.notifyStateListeners();\n if (state === 'disconnected' || state === 'reconnecting') {\n this.markSubscriptionsStale();\n }\n });\n this.wsManager.onHandshake((socketGeneration) => {\n this.registerActiveSubscriptions(socketGeneration);\n });\n }\n\n /** Apply live configuration without replacing subscription caches or the socket. */\n configure(config: ReactiveClientConfig): void {\n this.httpUrl = config.httpUrl ?? DEFAULT_HTTP_URL;\n this.authGetter = this.toAuthGetter(config.auth);\n this.headersGetter = this.toHeadersGetter(config.headers);\n this.wsManager.configure(config);\n }\n\n async connect(): Promise<void> {\n await this.wsManager.connect();\n }\n\n disconnect(): void {\n this.wsManager.disconnect();\n }\n\n forceReconnect(): void {\n this.wsManager.forceReconnect();\n }\n\n getConnectionState(): ConnectionState {\n return this.connectionState;\n }\n\n /**\n * Sends an application frame over the socket, such as a presence update a\n * hub's `onMessage` handles. Returns false while disconnected; resend from\n * `onConnectionStateChange` once connected again.\n */\n send(frame: Record<string, unknown> & { type: string }): boolean {\n return this.wsManager.send(frame);\n }\n\n onConnectionStateChange(listener: (state: ConnectionState) => void): () => void {\n this.stateListeners.add(listener);\n return () => this.stateListeners.delete(listener);\n }\n\n subscribe<TData, TInput = unknown>(\n path: string,\n options: SubscriptionOptions<TInput, TData> = {},\n ): Subscription<TData> {\n const key = getQueryKey(path, options.input);\n let shared = this.subscriptionsByKey.get(key);\n\n if (!shared) {\n shared = {\n id: generateId(),\n key,\n path,\n input: options.input,\n authoritativeData: undefined,\n data: undefined,\n loading: true,\n stale: true,\n error: undefined,\n listeners: new Set(),\n observers: new Map(),\n active: true,\n hasRegistered: false,\n generation: 0,\n registrationId: undefined,\n registrationConnectionId: undefined,\n registrationSocketGeneration: undefined,\n registrationPromise: undefined,\n version: undefined,\n patchBuffer: new Map(),\n appliedMessageIds: new Set(),\n resyncPromise: undefined,\n resyncGeneration: undefined,\n optimisticLayers: new Map(),\n settlementRevision: 0,\n registrationSettlementRevision: 0,\n revision: 0,\n };\n this.subscriptionsByKey.set(key, shared);\n this.subscriptionsById.set(shared.id, shared);\n if (this.connectionState === 'connected') {\n void this.ensureRegistered(shared, this.wsManager.generation).catch(() => undefined);\n }\n }\n\n const leaseId = generateId();\n shared.observers.set(leaseId, {\n onData: options.onData ? (data) => options.onData?.(data as TData) : undefined,\n onError: options.onError,\n });\n if (\n this.connectionState === 'connected' &&\n (!shared.hasRegistered || shared.stale) &&\n !shared.registrationPromise\n ) {\n void this.ensureRegistered(shared, this.wsManager.generation).catch(() => undefined);\n }\n const state = shared as SubscriptionState<TData>;\n let released = false;\n\n return {\n id: state.id,\n key: state.key,\n get data() {\n return state.data;\n },\n get loading() {\n return state.loading;\n },\n get stale() {\n return state.stale;\n },\n get error() {\n return state.error;\n },\n unsubscribe: () => {\n if (released) return;\n released = true;\n this.releaseSubscription(state, leaseId);\n },\n refetch: () => this.refetch(state),\n };\n }\n\n async call<TInput, TOutput>(\n path: string,\n input: TInput,\n options?: MutationOptions<TInput, TOutput>,\n ): Promise<TOutput> {\n const mutationId = generateId();\n const layers: SubscriptionState<unknown>[] = [];\n\n try {\n this.createMutationLayers(mutationId, input, options, layers);\n const connectionId = await this.wsManager.waitForConnectionId();\n const headers = await this.buildHeaders();\n const response = await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({ type: 'call', connectionId, path, input }),\n });\n if (!response.ok) {\n throw new Error(`Call failed: ${response.status} ${response.statusText}`);\n }\n\n const result = (await response.json()) as {\n type: string;\n message?: string;\n data?: unknown;\n };\n if (result.type === 'error') {\n throw new Error(result.message ?? 'Unknown error');\n }\n\n const data = result.data as TOutput;\n this.settleMutationLayers(mutationId, input, data, options, layers);\n return data;\n } catch (cause) {\n this.removeMutationLayers(mutationId, layers);\n throw cause;\n }\n }\n\n addSubscriptionListener(id: string, listener: () => void): () => void {\n const state = this.subscriptionsById.get(id);\n if (!state) return () => undefined;\n state.listeners.add(listener);\n return () => state.listeners.delete(listener);\n }\n\n getSubscriptionRevision(id: string): number {\n return this.subscriptionsById.get(id)?.revision ?? -1;\n }\n\n applyOptimisticUpdate(subscriptionId: string, updater: (data: unknown) => unknown): void {\n const state = this.subscriptionsById.get(subscriptionId);\n if (!state || state.data === undefined) return;\n state.optimisticLayers.set(`local-${generateId()}`, {\n updater,\n });\n this.recomputeData(state);\n this.notifySubscription(state, true);\n }\n\n private setAuth(auth: ReactiveClientConfig['auth']): void {\n this.authGetter = this.toAuthGetter(auth);\n }\n\n private setInitialHeaders(headers: ReactiveClientConfig['headers']): void {\n this.headersGetter = this.toHeadersGetter(headers);\n }\n\n private toAuthGetter(\n auth: ReactiveClientConfig['auth'],\n ): (() => string | Promise<string>) | undefined {\n if (!auth) return undefined;\n return typeof auth === 'function' ? auth : () => auth;\n }\n\n private toHeadersGetter(\n headers: ReactiveClientConfig['headers'],\n ): (() => Record<string, string> | Promise<Record<string, string>>) | undefined {\n if (!headers) return undefined;\n return typeof headers === 'function' ? headers : () => headers;\n }\n\n private registerActiveSubscriptions(socketGeneration: number): void {\n for (const state of this.subscriptionsByKey.values()) {\n if (state.active) {\n void this.ensureRegistered(state, socketGeneration).catch(() => undefined);\n }\n }\n }\n\n private ensureRegistered(\n state: SubscriptionState<unknown>,\n socketGeneration: number,\n force = false,\n ): Promise<void> {\n if (\n !force &&\n state.registrationSocketGeneration === socketGeneration &&\n state.registrationPromise\n ) {\n return state.registrationPromise;\n }\n\n state.generation++;\n state.registrationSettlementRevision = state.settlementRevision;\n state.registrationId = generateId();\n state.registrationSocketGeneration = socketGeneration;\n state.registrationConnectionId = undefined;\n state.registrationPromise = undefined;\n state.resyncPromise = undefined;\n state.resyncGeneration = undefined;\n state.hasRegistered = false;\n state.version = undefined;\n state.patchBuffer.clear();\n state.appliedMessageIds.clear();\n state.loading = true;\n state.stale = true;\n state.error = undefined;\n this.notifySubscription(state);\n\n const generation = state.generation;\n const registrationId = state.registrationId;\n const isCurrent = () =>\n state.active &&\n state.generation === generation &&\n state.registrationId === registrationId &&\n state.registrationSocketGeneration === socketGeneration &&\n this.wsManager.generation === socketGeneration;\n let requestIssued = false;\n let registrationConnectionId: string | undefined;\n // A synchronous throw before the first await runs the finally block before\n // this assignment completes, so `request` must exist (undefined) already.\n // oxlint-disable-next-line prefer-const -- Read before assignment on a synchronous throw.\n let request!: Promise<void>;\n request = (async () => {\n try {\n const connectionId = await this.wsManager.waitForConnectionId();\n if (!isCurrent()) return;\n registrationConnectionId = connectionId;\n state.registrationConnectionId = connectionId;\n const headers = await this.buildHeaders();\n if (!isCurrent()) return;\n requestIssued = true;\n const response = await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n type: 'subscribe',\n connectionId,\n subscriptionId: state.id,\n generation,\n registrationId,\n path: state.path,\n input: state.input,\n }),\n });\n if (!response.ok) {\n throw new Error(`Subscribe failed: ${response.status} ${response.statusText}`);\n }\n\n const result = (await response.json()) as HttpResult;\n if (result.type === 'error') {\n throw new Error(result.message);\n }\n if (!isCurrent()) return;\n this.handleSnapshot(result);\n if (isCurrent()) state.hasRegistered = true;\n } catch (cause) {\n if (isCurrent()) {\n const failure = cause instanceof Error ? cause : new Error(String(cause));\n state.error = failure;\n state.loading = this.hasSettledLayers(state);\n this.notifySubscription(state, false, failure);\n }\n throw cause;\n } finally {\n if ((!state.active || !isCurrent()) && requestIssued) {\n void this.sendUnsubscribe(registrationConnectionId, state.id, generation, registrationId);\n }\n if (state.registrationPromise === request) {\n state.registrationPromise = undefined;\n }\n }\n })();\n state.registrationPromise = request;\n return request;\n }\n\n private releaseSubscription(state: SubscriptionState<unknown>, leaseId: string): void {\n state.observers.delete(leaseId);\n if (state.observers.size > 0) return;\n\n state.active = false;\n this.subscriptionsById.delete(state.id);\n this.subscriptionsByKey.delete(state.key);\n if (state.registrationId && state.registrationConnectionId && state.hasRegistered) {\n void this.sendUnsubscribe(\n state.registrationConnectionId,\n state.id,\n state.generation,\n state.registrationId,\n );\n }\n }\n\n private async sendUnsubscribe(\n connectionId: string | undefined,\n subscriptionId: string,\n generation: number,\n registrationId: string,\n ): Promise<void> {\n if (!connectionId) return;\n try {\n const headers = await this.buildHeaders();\n await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n type: 'unsubscribe',\n connectionId,\n subscriptionId,\n generation,\n registrationId,\n }),\n });\n } catch {\n // Connection cleanup is the fallback when an unsubscribe cannot be sent.\n }\n }\n\n private async refetch(state: SubscriptionState<unknown>): Promise<void> {\n if (!state.active) return;\n if (!state.registrationId) {\n await this.ensureRegistered(state, this.wsManager.generation);\n return;\n }\n await this.requestResync(state);\n }\n\n private handleMessage(message: WebSocketEvent): void {\n switch (message.type) {\n case 'patch':\n this.handlePatch(message);\n break;\n case 'resync': {\n const state = this.subscriptionsById.get(message.subscriptionId);\n if (state?.generation === message.generation) {\n void this.requestResync(state).catch(() => undefined);\n }\n break;\n }\n case 'connected':\n case 'pong':\n break;\n }\n }\n\n private handleSnapshot(message: SnapshotResponse): void {\n const state = this.subscriptionsById.get(message.subscriptionId);\n if (!state || message.generation !== state.generation) return;\n if (state.version !== undefined && message.version <= state.version) return;\n\n state.authoritativeData = message.data;\n state.version = message.version;\n state.error = undefined;\n\n const coveredRevision = state.registrationSettlementRevision;\n for (const [layerId, layer] of state.optimisticLayers) {\n if (layer.settledRevision !== undefined && layer.settledRevision <= coveredRevision) {\n state.optimisticLayers.delete(layerId);\n }\n }\n const awaitingReconciliation = this.hasSettledLayers(state);\n state.loading = awaitingReconciliation;\n state.stale = awaitingReconciliation;\n this.recomputeData(state);\n this.discardStalePatches(state);\n this.notifySubscription(state, true);\n this.drainPatchBuffer(state);\n }\n\n private handlePatch(message: PatchEvent): void {\n const state = this.subscriptionsById.get(message.subscriptionId);\n if (!state || message.generation !== state.generation) return;\n if (\n state.appliedMessageIds.has(message.messageId) ||\n state.patchBuffer.has(message.messageId)\n ) {\n return;\n }\n if (state.version !== undefined && message.toVersion <= state.version) {\n state.appliedMessageIds.add(message.messageId);\n return;\n }\n\n state.patchBuffer.set(message.messageId, message);\n if (state.version === undefined) return;\n this.drainPatchBuffer(state);\n }\n\n private drainPatchBuffer(state: SubscriptionState<unknown>): void {\n if (state.version === undefined || state.authoritativeData === undefined) {\n return;\n }\n\n this.discardStalePatches(state);\n for (;;) {\n const next = [...state.patchBuffer.values()]\n .filter((patch) => patch.fromVersion === state.version)\n .sort((left, right) => left.toVersion - right.toVersion)\n .at(0);\n if (!next) break;\n\n state.patchBuffer.delete(next.messageId);\n try {\n state.authoritativeData = applyPatches(state.authoritativeData, next.patches);\n state.version = next.toVersion;\n state.appliedMessageIds.add(next.messageId);\n const awaitingReconciliation = this.hasSettledLayers(state);\n state.loading = awaitingReconciliation;\n state.stale = awaitingReconciliation;\n state.error = undefined;\n this.recomputeData(state);\n this.notifySubscription(state, true);\n this.discardStalePatches(state);\n } catch {\n void this.requestResync(state).catch(() => undefined);\n return;\n }\n }\n\n if (\n [...state.patchBuffer.values()].some(\n (patch) => patch.toVersion > state.version! && patch.fromVersion !== state.version,\n )\n ) {\n void this.requestResync(state).catch(() => undefined);\n }\n }\n\n private discardStalePatches(state: SubscriptionState<unknown>): void {\n if (state.version === undefined) return;\n for (const [messageId, patch] of state.patchBuffer) {\n if (patch.toVersion <= state.version) {\n state.patchBuffer.delete(messageId);\n state.appliedMessageIds.add(messageId);\n }\n }\n }\n\n private requestResync(state: SubscriptionState<unknown>): Promise<void> {\n if (state.resyncPromise && state.resyncGeneration === state.generation) {\n return state.resyncPromise;\n }\n if (!state.active || !state.registrationId) return Promise.resolve();\n\n state.stale = true;\n state.loading = true;\n this.notifySubscription(state);\n const request: Promise<void> = this.ensureRegistered(state, this.wsManager.generation, true)\n .finally(() => {\n if (state.resyncPromise === request) {\n state.resyncPromise = undefined;\n state.resyncGeneration = undefined;\n }\n })\n .then(() => {\n if (state.active && this.hasSettledLayers(state)) {\n return this.requestResync(state);\n }\n return undefined;\n });\n state.resyncPromise = request;\n state.resyncGeneration = state.generation;\n return request;\n }\n\n private createMutationLayers<TInput, TOutput>(\n mutationId: string,\n input: TInput,\n options: MutationOptions<TInput, TOutput> | undefined,\n layered: SubscriptionState<unknown>[],\n ): void {\n const targets = this.findMutationTargets(options);\n for (const state of targets) {\n const updater = this.createOptimisticUpdater(input, options);\n if (!updater || state.authoritativeData === undefined) continue;\n state.optimisticLayers.set(mutationId, {\n updater,\n });\n layered.push(state);\n this.recomputeData(state);\n this.notifySubscription(state, true);\n }\n }\n\n private findMutationTargets<TInput, TOutput>(\n options: MutationOptions<TInput, TOutput> | undefined,\n ): SubscriptionState<unknown>[] {\n if (options?.queryKey) {\n const exact = this.subscriptionsByKey.get(options.queryKey);\n return exact ? [exact] : [];\n }\n if (typeof options?.invalidates === 'object') {\n const exact = this.subscriptionsByKey.get(\n getQueryKey(options.invalidates.path, options.invalidates.input),\n );\n return exact ? [exact] : [];\n }\n if (typeof options?.invalidates === 'string') {\n return [...this.subscriptionsByKey.values()].filter(\n (state) => state.path === options.invalidates,\n );\n }\n return [];\n }\n\n private createOptimisticUpdater<TInput, TOutput>(\n input: TInput,\n options: MutationOptions<TInput, TOutput> | undefined,\n result?: TOutput,\n settled = false,\n ): OptimisticUpdater | undefined {\n const update = options?.optimisticUpdate;\n if (typeof update === 'function') {\n return (data) => (Array.isArray(data) ? update(data, input, result) : data);\n }\n\n const itemId =\n typeof input === 'object' && input !== null ? (input as { id?: unknown }).id : undefined;\n if (update === 'remove' && itemId !== undefined) {\n return (data) =>\n Array.isArray(data)\n ? data.filter((item) => (item as { id?: unknown }).id !== itemId)\n : data;\n }\n if (update !== 'merge') return undefined;\n\n if (itemId !== undefined) {\n const resultFields = settled && typeof result === 'object' && result !== null ? result : {};\n return (data) => {\n if (!Array.isArray(data)) return data;\n return data.map((item) =>\n (item as { id?: unknown }).id === itemId ? { ...item, ...input, ...resultFields } : item,\n );\n };\n }\n if (options?.optimisticData === undefined) return undefined;\n\n return (data) => {\n if (!Array.isArray(data)) return data;\n const optimistic = settled\n ? // oxlint-disable-next-line typescript/prefer-nullish-coalescing -- null is a valid mutation result.\n result === undefined\n ? typeof options.optimisticData === 'function'\n ? (\n options.optimisticData as (\n optimisticInput: TInput,\n currentData: unknown[],\n ) => TOutput | undefined\n )(input, data)\n : options.optimisticData\n : result\n : typeof options.optimisticData === 'function'\n ? (\n options.optimisticData as (\n optimisticInput: TInput,\n currentData: unknown[],\n ) => TOutput | undefined\n )(input, data)\n : options.optimisticData;\n if (settled && optimistic !== null && typeof optimistic === 'object') {\n const optimisticId = (optimistic as { id?: unknown }).id;\n if (\n optimisticId !== undefined &&\n data.some(\n (item) =>\n typeof item === 'object' &&\n item !== null &&\n (item as { id?: unknown }).id === optimisticId,\n )\n ) {\n return data;\n }\n }\n return optimistic === undefined ? data : [optimistic, ...data];\n };\n }\n\n private settleMutationLayers<TInput, TOutput>(\n mutationId: string,\n input: TInput,\n result: TOutput,\n options: MutationOptions<TInput, TOutput> | undefined,\n states: SubscriptionState<unknown>[],\n ): void {\n for (const state of states) {\n const layer = state.optimisticLayers.get(mutationId);\n const updater = this.createOptimisticUpdater(input, options, result, true);\n if (!layer || !updater) continue;\n layer.updater = updater;\n layer.settledRevision = ++state.settlementRevision;\n state.loading = true;\n state.stale = true;\n this.recomputeData(state);\n this.notifySubscription(state, true);\n void this.requestResync(state).catch(() => undefined);\n }\n }\n\n private removeMutationLayers(mutationId: string, states: SubscriptionState<unknown>[]): void {\n for (const state of states) {\n if (!state.optimisticLayers.delete(mutationId)) continue;\n this.recomputeData(state);\n this.notifySubscription(state, true);\n }\n }\n\n private recomputeData(state: SubscriptionState<unknown>): void {\n let data = state.authoritativeData;\n for (const layer of state.optimisticLayers.values()) {\n data = layer.updater(data);\n }\n state.data = data;\n }\n\n private hasSettledLayers(state: SubscriptionState<unknown>): boolean {\n for (const layer of state.optimisticLayers.values()) {\n if (layer.settledRevision !== undefined) return true;\n }\n return false;\n }\n\n private async buildHeaders(): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.headersGetter) Object.assign(headers, await this.headersGetter());\n if (this.authGetter) {\n headers['Authorization'] = `Bearer ${await this.authGetter()}`;\n }\n return headers;\n }\n\n private markSubscriptionsStale(): void {\n for (const state of this.subscriptionsByKey.values()) {\n if (!state.active) continue;\n state.stale = true;\n state.loading = true;\n this.notifySubscription(state);\n }\n }\n\n private notifySubscription(\n state: SubscriptionState<unknown>,\n dataChanged = false,\n failure?: Error,\n ): void {\n if (!state.active) return;\n state.revision++;\n for (const listener of state.listeners) listener();\n if (dataChanged) {\n for (const observer of state.observers.values()) {\n observer.onData?.(state.data);\n }\n }\n if (failure) {\n for (const observer of state.observers.values()) {\n observer.onError?.(failure);\n }\n }\n }\n\n private notifyStateListeners(): void {\n for (const listener of this.stateListeners) {\n listener(this.connectionState);\n }\n }\n}\n\ntype ProcedureInput<T> = T extends { inputSchema?: { _output: infer TInput } } ? TInput : undefined;\n\ntype ProcedureOutput<T> = T extends {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- resolver parameter variance prevents `unknown`\n resolver: (...args: any[]) => infer TReturn;\n}\n ? Awaited<TReturn>\n : unknown;\n\ntype ExtractRouterDefinition<T> = T extends { definition: infer TDefinition } ? TDefinition : T;\n\ntype QueryProcedure<T> = [ProcedureInput<T>] extends [undefined]\n ? {\n useSubscription: (\n input?: undefined,\n options?: Omit<SubscriptionOptions<undefined, ProcedureOutput<T>>, 'input'>,\n ) => Subscription<ProcedureOutput<T>>;\n }\n : {\n useSubscription: (\n input: ProcedureInput<T>,\n options?: Omit<SubscriptionOptions<ProcedureInput<T>, ProcedureOutput<T>>, 'input'>,\n ) => Subscription<ProcedureOutput<T>>;\n };\n\ntype MutationProcedure<T> = [ProcedureInput<T>] extends [undefined]\n ? {\n mutate: (\n input?: undefined,\n options?: MutationOptions<undefined, ProcedureOutput<T>>,\n ) => Promise<ProcedureOutput<T>>;\n }\n : {\n mutate: (\n input: ProcedureInput<T>,\n options?: MutationOptions<ProcedureInput<T>, ProcedureOutput<T>>,\n ) => Promise<ProcedureOutput<T>>;\n };\n\ntype TypedReactiveClientTree<T> = T extends { type: 'query' }\n ? QueryProcedure<T>\n : T extends { type: 'mutation' }\n ? MutationProcedure<T>\n : { [K in keyof T]: TypedReactiveClientTree<T[K]> };\n\nexport type TypedReactiveClient<TRouter> = TypedReactiveClientTree<\n ExtractRouterDefinition<TRouter>\n> & {\n connect: () => Promise<void>;\n disconnect: () => void;\n};\n\nexport function createReactiveClient<TRouter>(\n config: ReactiveClientConfig,\n): TypedReactiveClient<TRouter> {\n const client = new ReactiveClient(config);\n return createTypedProxy(client, []) as TypedReactiveClient<TRouter>;\n}\n\nfunction createTypedProxy(client: ReactiveClient, path: string[]): unknown {\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (property === 'connect') return () => client.connect();\n if (property === 'disconnect') return () => client.disconnect();\n if (typeof property !== 'string') return undefined;\n\n if (property === 'useSubscription') {\n return (input?: unknown, options?: SubscriptionOptions) =>\n client.subscribe(path.join('.'), { ...options, input });\n }\n if (property === 'mutate') {\n return (input: unknown, options?: MutationOptions<unknown, unknown>) =>\n client.call(path.join('.'), input, options);\n }\n return createTypedProxy(client, [...path, property]);\n },\n },\n );\n}\n"]}
package/dist/client.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- export { C as ConnectionState, M as MutationOptions, Q as QueryTarget, R as ReactiveClient, a as ReactiveClientConfig, S as Subscription, b as SubscriptionOptions, T as TypedReactiveClient, c as createReactiveClient } from './client-wZQ9XC9S.js';
1
+ export { C as ConnectionState, M as MutationOptions, Q as QueryTarget, R as ReactiveClient, a as ReactiveClientConfig, S as Subscription, b as SubscriptionOptions, T as TypedReactiveClient, c as createReactiveClient } from './client-BPAct-Dz.js';
2
2
 
3
3
  /** Return the stable identity used for subscription sharing and targeting. */
4
4
  declare function getQueryKey(path: string, input?: unknown): string;
package/dist/client.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { C as ConnectionState, M as MutationOptions, Q as QueryTarget, R as ReactiveClient, a as ReactiveClientConfig, S as Subscription, b as SubscriptionOptions, T as TypedReactiveClient, c as createReactiveClient } from './client-wZQ9XC9S.js';
1
+ export { C as ConnectionState, M as MutationOptions, Q as QueryTarget, R as ReactiveClient, a as ReactiveClientConfig, S as Subscription, b as SubscriptionOptions, T as TypedReactiveClient, c as createReactiveClient } from './client-BPAct-Dz.js';
2
2
 
3
3
  /** Return the stable identity used for subscription sharing and targeting. */
4
4
  declare function getQueryKey(path: string, input?: unknown): string;
package/dist/client.js CHANGED
@@ -267,6 +267,13 @@ var WebSocketManager = class {
267
267
  this.setState("disconnected");
268
268
  void this.connect().catch(() => void 0);
269
269
  }
270
+ /** Sends an application frame on the open socket; false when not connected. */
271
+ send(frame) {
272
+ const socket = this.ws;
273
+ if (!socket || this.state !== "connected" || socket.readyState !== socket.OPEN) return false;
274
+ socket.send(JSON.stringify(frame));
275
+ return true;
276
+ }
270
277
  onMessage(handler) {
271
278
  this.messageHandlers.add(handler);
272
279
  return () => this.messageHandlers.delete(handler);
@@ -490,6 +497,14 @@ var ReactiveClient = class {
490
497
  getConnectionState() {
491
498
  return this.connectionState;
492
499
  }
500
+ /**
501
+ * Sends an application frame over the socket, such as a presence update a
502
+ * hub's `onMessage` handles. Returns false while disconnected; resend from
503
+ * `onConnectionStateChange` once connected again.
504
+ */
505
+ send(frame) {
506
+ return this.wsManager.send(frame);
507
+ }
493
508
  onConnectionStateChange(listener) {
494
509
  this.stateListeners.add(listener);
495
510
  return () => this.stateListeners.delete(listener);