statewire 0.22.0 → 0.22.1

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.
@@ -63,6 +63,7 @@ export type Conn = {
63
63
  auth: unknown;
64
64
  authorizedAt: number | undefined;
65
65
  leaseTimer: ReturnType<typeof setTimeout> | null;
66
+ timedLease: boolean;
66
67
  lanes: Map<string, Lane>;
67
68
  contexts: Map<string, Statewire.Context>;
68
69
  documents: Map<string, StatewireHost.Document>;
@@ -107,6 +108,7 @@ export type SocketHostState = {
107
108
  wireVersion: StatewireProtocol.Range;
108
109
  heartbeatMs: number;
109
110
  maxLeaseLifetimeMs: number | null;
111
+ leaseTimers: boolean;
110
112
  wsInitTimeoutMs: number;
111
113
  maxSubscribers: number;
112
114
  maxInflightCommands: number;
@@ -168,7 +170,9 @@ export type Registration = {
168
170
  * before the snapshot (their documents and answers ride the hello), durable
169
171
  * ones after it. A violation in the attach frame closes the attach and throws.
170
172
  */
171
- export declare const register: (h: SocketHostState, clientId: string, socket: StatewireHostInternal.Socket, sawFrame?: boolean, auth?: unknown, selection?: StatewireProtocol.Selection, frame?: ParsedFrame, authorizedAt?: number, included?: Pick<StatewireHostInternal.SocketConnectOptions, "included" | "onIncludedChange">) => Registration | null;
173
+ export declare const register: (h: SocketHostState, clientId: string, socket: StatewireHostInternal.Socket, sawFrame?: boolean, auth?: unknown, selection?: StatewireProtocol.Selection, frame?: ParsedFrame, authorizedAt?: number, included?: Pick<StatewireHostInternal.SocketConnectOptions, "included" | "onIncludedChange"> & {
174
+ timedLease?: boolean;
175
+ }) => Registration | null;
172
176
  /**
173
177
  * Transport-agnostic WS binding over a statewire/host transport:
174
178
  * feed it sockets (anything with `send`/`close`) and raw text frames, and it
@@ -1 +1 @@
1
- {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/host/socket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/host/socket.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,4BAAyB;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAmB,kBAAe;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAiB;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAgB;AAC7C,OAAO,KAAK,EAAE,qBAAqB,EAAE,4BAAyB;AAY9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAoB;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAoB;AAGjD,eAAO,MAAM,YAAY,QAA6B,CAAC;AACvD,eAAO,MAAM,0BAA0B,4CACI,CAAC;AAE5C;0DAC0D;AAC1D,eAAO,MAAM,UAAU,GAAI,GAAG,OAAO,EAAE,GAAG,OAAO,KAAG,OA8BnD,CAAC;AAMF,eAAO,MAAM,wBAAwB,oCAAoC,CAAC;AAG1E,KAAK,GAAG,GAAG,qBAAqB,CAAC,GAAG,CAAC;AAErC,KAAK,MAAM,GAAG;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,iBAAiB,CAAC,SAAS,EAAE,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,kGAAkG;AAClG,KAAK,IAAI,GAAG;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IAC/C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,iFAAiF;IACjF,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAGF,MAAM,MAAM,IAAI,GAAG;IACjB,SAAS,EAAE,iBAAiB,CAAC,SAAS,CAAC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,8EAA8E;IAC9E,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;IACjD,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IACzC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC/C,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,gBAAgB,EACZ,CAAC,CAAC,QAAQ,EAAE,SAAS,qBAAqB,CAAC,gBAAgB,EAAE,KAAK,IAAI,CAAC,GACvE,SAAS,CAAC;IACd,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,GAAG,EAAE,CAAC;IACtB,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC;CAC9B,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;IAC5C,UAAU,EAAE,qBAAqB,CAAC,gBAAgB,GAAG,IAAI,CAAC;CAC3D,CAAC;AAaF,KAAK,YAAY,GAAG;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,YAAY,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAA;KAAE,EAAE,CAAC;CACxD,CAAC;AAOF,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,WAmFhD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,WAQxC,CAAC;AA+EF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC;IACvC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,iBAAiB,CAAC,KAAK,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5C,SAAS,EAAE,qBAAqB,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAChE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACjB,YAAY,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC,GAAG,GAAG,IAAI,CAAC;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAC;IACtD,SAAS,EAAE,aAAa,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1C,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,qBAAqB,CAAC,qBAAqB,GAAG,SAAS,CAAC;IACrE,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,OAAO,EAAE,CACP,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,qBAAqB,CAAC,MAAM,EACpC,OAAO,CAAC,EAAE,qBAAqB,CAAC,oBAAoB,KACjD,qBAAqB,CAAC,gBAAgB,GAAG,IAAI,CAAC;IACnD,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,CAAC,GAAG,KAAK,IAAI,CAAC;IACzC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACjD,CAAC;AAqDF,eAAO,MAAM,SAAS,GACpB,GAAG,eAAe,EAClB,MAAM,IAAI,EACV,OAAO,MAAM,EACb,SAAS,MAAM,SAmBhB,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,GAAG,eAAe,EAAE,MAAM,IAAI,EAAE,MAAM,MAAM,SAQlE,CAAC;AAkBF,eAAO,MAAM,WAAW,GAAI,GAAG,eAAe,EAAE,MAAM,IAAI,KAAG,OAS5D,CAAC;AAgCF,eAAO,MAAM,iBAAiB,GAAI,GAAG,eAAe,KAAG,OAGrC,CAAC;AAmNnB,eAAO,MAAM,KAAK,GAAI,GAAG,eAAe,EAAE,MAAM,aAAa,CAAC,GAAG,SAyEhE,CAAC;AA2PF,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GACd;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE;QACH,GAAG,EAAE;YAAE,SAAS,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,GAAG,EAAE,MAAM,CAAA;aAAE,EAAE,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACrE,CAAC;CACH,CAAC;AAuEN,eAAO,MAAM,UAAU,GACrB,GAAG,eAAe,EAClB,MAAM,IAAI,EACV,OAAO,WAAW,KACjB,cA8DF,CAAC;AA2WF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,qBAAqB,CAAC,gBAAgB,CAAC;CACpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GACnB,GAAG,eAAe,EAClB,UAAU,MAAM,EAChB,QAAQ,qBAAqB,CAAC,MAAM,EACpC,kBAAgB,EAChB,OAAM,OAAmB,EACzB,YAAW,iBAAiB,CAAC,SAG5B,EACD,QAAO,WAAyB,EAChC,eAAe,MAAM,EACrB,WAAU,IAAI,CACZ,qBAAqB,CAAC,oBAAoB,EAC1C,UAAU,GAAG,kBAAkB,CAChC,GAAG;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,KAChC,YAAY,GAAG,IAqKjB,CAAC;AAmMF;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAC9B,WAAW,eAAe,CAAC,SAAS,CAAC,EACrC,UAAU,qBAAqB,CAAC,iBAAiB,EACjD,cAAc,qBAAqB,CAAC,qBAAqB,KACxD,qBAAqB,CAAC,UAqBxB,CAAC"}
@@ -256,7 +256,7 @@ const expireLease = (h, conn) => {
256
256
  const armLeaseTimer = (h, conn) => {
257
257
  if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);
258
258
  conn.leaseTimer = null;
259
- if (h.disposed || h.maxLeaseLifetimeMs === null || expireLease(h, conn)) return;
259
+ if (h.disposed || h.maxLeaseLifetimeMs === null || expireLease(h, conn) || !conn.timedLease) return;
260
260
  const delay = h.maxLeaseLifetimeMs - (Date.now() - conn.authorizedAt);
261
261
  conn.leaseTimer = setTimeout(() => {
262
262
  conn.leaseTimer = null;
@@ -276,7 +276,7 @@ const ensureHeartbeat = (h) => {
276
276
  if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;
277
277
  h.heartbeatTimer = setInterval(() => {
278
278
  const now = Date.now();
279
- for (const conn of [...h.conns]) if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, "{}");
279
+ for (const conn of [...h.conns]) if (now - conn.lastSentAt >= h.heartbeatMs && !expireLease(h, conn)) sendTo(h, conn, "{}");
280
280
  }, h.heartbeatMs);
281
281
  h.heartbeatTimer.unref?.();
282
282
  };
@@ -434,7 +434,7 @@ const flush = (h, fin) => {
434
434
  h.pendingApplied = /* @__PURE__ */ new Map();
435
435
  h.pendingCmds = /* @__PURE__ */ new Map();
436
436
  for (const conn of [...h.conns]) {
437
- if (!conn.ready) continue;
437
+ if (!conn.ready || expireLease(h, conn)) continue;
438
438
  const forConn = (list) => (list ?? []).filter((cmd) => selects(conn, cmd.protocol));
439
439
  const ops = [...selects(conn, h.protocol.name) ? mainOps : [], ...diffView(h, conn)];
440
440
  const cmd = [
@@ -811,7 +811,10 @@ const connectAuthorized = (h, clientId, socket, options) => {
811
811
  } catch {}
812
812
  return null;
813
813
  }
814
- return register(h, clientId, socket, options.authorized === true, options.auth, options.selection, void 0, options.authorizedAt, options)?.connection ?? null;
814
+ return register(h, clientId, socket, options.authorized === true, options.auth, options.selection, void 0, options.authorizedAt, {
815
+ ...options,
816
+ timedLease: h.leaseTimers
817
+ })?.connection ?? null;
815
818
  }
816
819
  const refuse = (code, reason) => {
817
820
  try {
@@ -916,7 +919,10 @@ const connectAuthorized = (h, clientId, socket, options) => {
916
919
  if (pending.timer !== null) clearTimeout(pending.timer);
917
920
  let registration;
918
921
  try {
919
- registration = register(h, clientId, socket, true, auth, selection, frame, authorizedAt, options.onIncludedChange === void 0 ? {} : { onIncludedChange: options.onIncludedChange });
922
+ registration = register(h, clientId, socket, true, auth, selection, frame, authorizedAt, {
923
+ timedLease: h.leaseTimers,
924
+ ...options.onIncludedChange !== void 0 && { onIncludedChange: options.onIncludedChange }
925
+ });
920
926
  } catch (error) {
921
927
  if (violationReason(error) === null) throw error;
922
928
  return;
@@ -1019,6 +1025,7 @@ const register = (h, clientId, socket, sawFrame = false, auth = void 0, selectio
1019
1025
  auth,
1020
1026
  authorizedAt,
1021
1027
  leaseTimer: null,
1028
+ timedLease: included.timedLease ?? true,
1022
1029
  lanes: /* @__PURE__ */ new Map(),
1023
1030
  contexts: /* @__PURE__ */ new Map(),
1024
1031
  documents: /* @__PURE__ */ new Map(),
@@ -1164,6 +1171,7 @@ const useSocketHost = (transport, options, persistence) => {
1164
1171
  wireVersion: { version: WIRE_VERSION },
1165
1172
  heartbeatMs: 15e3,
1166
1173
  maxLeaseLifetimeMs: 864e5,
1174
+ leaseTimers: persistence?.hibernatable !== true,
1167
1175
  wsInitTimeoutMs: 5e3,
1168
1176
  maxSubscribers: MAX_SUBSCRIBERS,
1169
1177
  maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,
@@ -1 +1 @@
1
- {"version":3,"file":"socket.js","names":["contextValue","captureContext","MAX_CONTEXT_BYTES","encodeDocument","DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","documentIdentity","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","reviveValue","sanitizeValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_EPHEMERAL_DOCUMENT_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireDocument","StatewirePath","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","Cmd","WireOp","op","doc","path","value","meta","MetaEntry","protocol","main","Admission","seq","method","applied","appliedSent","settled","Lane","clientId","conn","Conn","lastSeq","results","Map","ts","cmd","inflight","ClientRec","id","touched","lanes","principal","selection","Selection","socket","Socket","open","ready","sawFrame","lastSentAt","lease","auth","authorizedAt","leaseTimer","ReturnType","setTimeout","contexts","Context","documents","Document","included","Set","onIncludedChange","IncludedDocument","view","nextDoc","pendingApplied","pendingCmds","attach","Attach","PendingConn","authorizing","queued","timer","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CmdStatement","params","ParsedFrame","ctx","isPlainObject","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","lane","hasOwn","prev","statement","Number","isInteger","last","get","undefined","set","push","NonNullable","seen","entry","some","includes","has","add","encode","JSON","stringify","byteLength","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","at","type","failure","fate","code","console","parseInitialFrame","headers","Response","status","values","SocketHostState","Definition","wireVersion","Range","heartbeatMs","maxLeaseLifetimeMs","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","pendingConns","pendingOps","viewsDirty","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","markViews","recordOp","next","nextState","state","nextCommands","commands","submit","setOnOp","setOnDocuments","closeConn","delete","clearTimeout","close","detached","size","clearInterval","sendTo","data","now","send","expiredAt","isFinite","leaseExpiredFin","expireLease","armLeaseTimer","delay","Math","min","unref","violate","atSubscriberLimit","ensureHeartbeat","setHeartbeatMs","ms","durableLanes","rec","allLanes","idleLevel","work","isIdle","selects","protocols","p","viewOf","shared","hostMain","record","diffView","ops","number","notifyIncluded","map","restoredIncluded","part","TypeError","attachOf","requireSelected","find","caller","callerOf","context","document","snapshot","mount","encoded","other","unmount","include","exclude","flush","takeChanged","queueApplied","level","edge","mainOps","cmds","forConn","list","splice","idle","queueCmd","notifyClientRecords","onClientRecordsChange","fromEntries","admittedThrough","retain","newest","max","watermark","laneOf","ephemeral","reemit","cached","settleCmd","settleWire","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","onApplied","onSettle","catch","FrameAdmission","syn","retry","refusal","validateContexts","selected","through","first","s","validateContext","installContexts","contextChanged","admitFrame","fresh","durableNew","clientLoad","hostLoad","isSafeInteger","findLast","dur","admission","closePending","pending","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","toLowerCase","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","Registration","gcClients","excess","changed","live","oldest","version","Pick","restored","known","created","attaching","isEphemeral","early","late","admit","statements","earlyAdmission","answers","hello","lateAdmission","abort","resume","suspend","restoreClientRecords","records","ClientRecord","entries","useSocketHost","transport","SocketHost","host","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose","reviveValue","serveStream","serveFrames"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { contextValue, captureContext } from \"../wire/context\";\nimport { MAX_CONTEXT_BYTES } from \"../wire/limits\";\nimport { encodeDocument } from \"../document\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { documentIdentity, getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { reviveValue } from \"../wire/meta\";\nimport { sanitizeValue } from \"../wire/ops\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_EPHEMERAL_DOCUMENT_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireDocument } from \"../document\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype Cmd = StatewireHostInternal.Cmd;\n\ntype WireOp = {\n op: string;\n doc?: number;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireDocument.MetaEntry[];\n protocol?: string;\n key?: readonly string[];\n main?: boolean;\n};\n\ntype Admission = {\n protocol: string;\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\n/** One statement lane: durable lanes live on the client record, ephemeral lanes on the attach. */\ntype Lane = {\n protocol: string;\n clientId: string;\n conn: Conn | null;\n lastSeq: number;\n results: Map<number, { ts: number; cmd: Cmd }>;\n inflight: Map<number, Admission>;\n};\n\nexport type ClientRec = {\n id: string;\n touched: number;\n lanes: Map<string, Lane>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\n// A Conn outlives its socket so an admitted command keeps its attach view.\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n ready: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n authorizedAt: number | undefined;\n leaseTimer: ReturnType<typeof setTimeout> | null;\n lanes: Map<string, Lane>;\n contexts: Map<string, Statewire.Context>;\n documents: Map<string, StatewireHost.Document>;\n included: Set<string>;\n onIncludedChange:\n | ((included: readonly StatewireHostInternal.IncludedDocument[]) => void)\n | undefined;\n view: Map<string, { doc: number; value: unknown }>;\n nextDoc: number;\n pendingApplied: Cmd[];\n pendingCmds: Cmd[];\n attach: StatewireHost.Attach;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n cmd: CmdStatement[];\n ctx?: { protocol: string; value: Statewire.Context }[];\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst frameEncoder = new TextEncoder();\n\nexport const parseFrameValue = (frame: unknown): ParsedFrame => {\n if (!isPlainObject(frame)) return violation(\"malformed frame\");\n const keys = Object.keys(frame);\n if (keys.length === 0) return violation(\"malformed frame\");\n const unknown = keys.filter((key) => key !== \"cmd\" && key !== \"ctx\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const lane = frame[\"cmd\"] ?? [];\n if (!Array.isArray(lane)) return violation(\"malformed frame\");\n if (Object.hasOwn(frame, \"cmd\") && lane.length === 0)\n return violation(\"empty lane\");\n if (lane.length > MAX_COMMANDS_PER_FRAME)\n return violation(\"too many commands\");\n const prev = new Map<string, number>();\n const cmd: CmdStatement[] = [];\n for (const statement of lane) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n const method = statement[\"method\"];\n const protocol = statement[\"protocol\"];\n if (\n typeof seq !== \"number\" ||\n !Number.isInteger(seq) ||\n seq < 1 ||\n typeof method !== \"string\" ||\n typeof protocol !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n const last = prev.get(protocol);\n if (last !== undefined && seq !== last + 1)\n return violation(\"malformed frame\");\n prev.set(protocol, seq);\n cmd.push({\n protocol,\n seq,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n const contexts = frame[\"ctx\"];\n const ctx: NonNullable<ParsedFrame[\"ctx\"]> = [];\n if (contexts !== undefined) {\n if (!Array.isArray(contexts) || contexts.length === 0)\n return violation(\"empty context lane\");\n const seen = new Set<string>();\n for (const entry of contexts) {\n if (\n !isPlainObject(entry) ||\n typeof entry[\"protocol\"] !== \"string\" ||\n !Object.hasOwn(entry, \"value\") ||\n Object.keys(entry).some(\n (key) => ![\"protocol\", \"value\", \"meta\"].includes(key),\n )\n )\n return violation(\"malformed context\");\n const protocol = entry[\"protocol\"];\n if (seen.has(protocol)) return violation(\"duplicate context protocol\");\n seen.add(protocol);\n if (\n frameEncoder.encode(JSON.stringify(entry)).byteLength >\n MAX_CONTEXT_BYTES\n )\n return violation(\"context entry too large\");\n try {\n ctx.push({\n protocol,\n value: contextValue({\n value: entry[\"value\"],\n ...(entry[\"meta\"] !== undefined && { meta: entry[\"meta\"] }),\n }),\n });\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n }\n if (cmd.length === 0 && ctx.length === 0) return violation(\"empty frame\");\n return { cmd, ...(ctx.length > 0 && { ctx }) };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireDocument.MetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeDocument(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): Cmd => {\n const at = { protocol: adm.protocol, seq: adm.seq };\n if (outcome.type === \"accepted\") {\n return { ...at, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { ...at, type: \"crashed\" };\n case \"failed\":\n return {\n ...at,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n ...at,\n type: \"rejected\",\n ...(failure.code !== undefined && { code: failure.code }),\n ...(message !== undefined && { message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n console.error(\"statewire command failed\", outcome.error);\n return {\n ...at,\n type: \"failed\",\n message: \"the command failed\",\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length ? parseFrameValue(lanes) : { cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n key: readonly string[] | undefined;\n wireVersion: StatewireProtocol.Range;\n heartbeatMs: number;\n maxLeaseLifetimeMs: number | null;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, Cmd[]>;\n pendingCmds: Map<string, Cmd[]>;\n viewsDirty: boolean;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst markViews = (h: SocketHostState) => {\n h.viewsDirty = true;\n scheduleFlush(h);\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeDocument(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n h.stateHost.setOnDocuments(() => markViews(h));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n if (conn.leaseTimer !== null) {\n clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n h.current?.detached?.(conn.attach);\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nconst expiredAt = (h: SocketHostState, authorizedAt: number | undefined) => {\n const now = Date.now();\n return (\n authorizedAt === undefined ||\n !Number.isFinite(authorizedAt) ||\n authorizedAt < 0 ||\n authorizedAt > now ||\n (h.maxLeaseLifetimeMs !== null &&\n now - authorizedAt >= h.maxLeaseLifetimeMs)\n );\n};\n\nconst leaseExpiredFin = JSON.stringify({\n fin: { reason: \"reconnect\", code: \"lease-expired\" },\n});\n\nexport const expireLease = (h: SocketHostState, conn: Conn): boolean => {\n if (!conn.open || expiredAt(h, conn.authorizedAt)) {\n if (conn.open) {\n sendTo(h, conn, leaseExpiredFin);\n closeConn(h, conn, 1000, \"lease-expired\");\n }\n return true;\n }\n return false;\n};\n\nconst armLeaseTimer = (h: SocketHostState, conn: Conn) => {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n if (h.disposed || h.maxLeaseLifetimeMs === null || expireLease(h, conn))\n return;\n const delay = h.maxLeaseLifetimeMs - (Date.now() - conn.authorizedAt!);\n conn.leaseTimer = setTimeout(\n () => {\n conn.leaseTimer = null;\n if (!expireLease(h, conn)) armLeaseTimer(h, conn);\n },\n Math.min(delay, 2_147_483_647),\n );\n (conn.leaseTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst violate = (h: SocketHostState, conn: Conn, reason: string) => {\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst durableLanes = function* (h: SocketHostState) {\n for (const rec of h.clients.values()) yield* rec.lanes.values();\n};\n\nconst allLanes = function* (h: SocketHostState) {\n yield* durableLanes(h);\n for (const conn of h.conns) yield* conn.lanes.values();\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const lane of allLanes(h)) {\n if (lane.inflight.size > 0) return false;\n }\n return true;\n};\n\nconst selects = (conn: Conn, protocol: string) =>\n conn.selection.protocols.some((p) => p.name === protocol);\n\n// ─── views ──────────────────────────────────────────────\n\nconst viewOf = (\n h: SocketHostState,\n conn: Conn,\n): Map<string, StatewireHost.Document> => {\n const view = new Map<string, StatewireHost.Document>();\n const shared = h.stateHost!.documents();\n const hostMain = documentIdentity(h.protocol.name);\n for (const p of conn.selection.protocols) {\n if (p.record === \"ephemeral\") {\n for (const [id, doc] of conn.documents)\n if (doc.protocol === p.name) view.set(id, doc);\n } else {\n for (const [id, doc] of shared) {\n if (\n doc.protocol === p.name &&\n id !== hostMain &&\n (doc.main || conn.included.has(id))\n )\n view.set(id, doc);\n }\n }\n }\n return view;\n};\n\nconst diffView = (h: SocketHostState, conn: Conn): WireOp[] => {\n const current = viewOf(h, conn);\n const ops: WireOp[] = [];\n for (const [id, entry] of conn.view) {\n if (current.has(id)) continue;\n conn.view.delete(id);\n ops.push({ op: \"unmount\", doc: entry.doc });\n }\n for (const [id, doc] of current) {\n const entry = conn.view.get(id);\n if (entry !== undefined && entry.value === doc.value) continue;\n const { value, meta } = encodeDocument(doc.value);\n if (entry === undefined) {\n const number = conn.nextDoc++;\n conn.view.set(id, { doc: number, value: doc.value });\n ops.push({\n op: \"mount\",\n doc: number,\n protocol: doc.protocol,\n ...(doc.key !== null && { key: doc.key }),\n ...(doc.main && { main: true }),\n value,\n ...(meta !== undefined && { meta }),\n });\n } else {\n entry.value = doc.value;\n ops.push({\n op: \"replace\",\n doc: entry.doc,\n path: [],\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n }\n return ops;\n};\n\nconst notifyIncluded = (conn: Conn) =>\n conn.onIncludedChange?.(\n [...conn.included].map(\n (id) => JSON.parse(id) as StatewireHostInternal.IncludedDocument,\n ),\n );\n\nconst restoredIncluded = (\n included: readonly StatewireHostInternal.IncludedDocument[],\n): Set<string> =>\n new Set(\n included.map((entry) => {\n if (\n !Array.isArray(entry) ||\n entry.length !== 2 ||\n typeof entry[0] !== \"string\" ||\n !(\n entry[1] === null ||\n (Array.isArray(entry[1]) &&\n entry[1].every((part) => typeof part === \"string\"))\n )\n )\n throw new TypeError(\"statewire: invalid restored include\");\n return documentIdentity(entry[0], entry[1] ?? undefined);\n }),\n );\n\nconst attachOf = (h: SocketHostState, conn: Conn): StatewireHost.Attach => {\n const requireSelected = (protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined)\n throw new Error(`statewire: protocol ${protocol} was not negotiated`);\n return entry;\n };\n return {\n get caller() {\n return callerOf(h, h.clients.get(conn.clientId)!, conn);\n },\n context: (protocol) => {\n requireSelected(protocol);\n return captureContext(conn.contexts.get(protocol) ?? {});\n },\n document: (protocol, key) => {\n if (key === undefined && protocol === h.protocol.name)\n return h.stateHost!.snapshot();\n const view = viewOf(h, conn);\n if (key !== undefined)\n return view.get(documentIdentity(protocol, key))?.value;\n for (const doc of view.values())\n if (doc.protocol === protocol && doc.main) return doc.value;\n return undefined;\n },\n mount: (protocol, value, key, main = key === undefined) => {\n if (requireSelected(protocol).record !== \"ephemeral\")\n throw new Error(`statewire: protocol ${protocol} is not ephemeral`);\n const encoded = encodeDocument(value);\n if (\n frameEncoder.encode(JSON.stringify(encoded)).byteLength >\n MAX_EPHEMERAL_DOCUMENT_BYTES\n )\n throw new Error(\"statewire: oversized ephemeral document\");\n const id = documentIdentity(protocol, key);\n if (main) {\n for (const [other, doc] of conn.documents) {\n if (doc.protocol === protocol && doc.main && other !== id)\n throw new Error(\n `statewire: ${protocol} already has a main document`,\n );\n }\n }\n conn.documents.set(id, {\n protocol,\n key: key === undefined ? null : [...key],\n main,\n value: sanitizeValue(value),\n });\n markViews(h);\n },\n unmount: (protocol, key) => {\n if (!conn.documents.delete(documentIdentity(protocol, key)))\n throw new Error(\"statewire: document is not mounted\");\n markViews(h);\n },\n include: (protocol, key) => {\n if (requireSelected(protocol).record !== undefined)\n throw new Error(`statewire: protocol ${protocol} is not durable`);\n const id = documentIdentity(protocol, key);\n if (conn.included.has(id)) return;\n conn.included.add(id);\n notifyIncluded(conn);\n markViews(h);\n },\n exclude: (protocol, key) => {\n if (!conn.included.delete(documentIdentity(protocol, key))) return;\n notifyIncluded(conn);\n markViews(h);\n },\n };\n};\n\n// ─── flush ──────────────────────────────────────────────\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const lane of allLanes(h)) {\n for (const adm of lane.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, lane, adm);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n !h.viewsDirty &&\n fin === undefined &&\n !edge &&\n ![...h.conns].some(\n (conn) => conn.pendingApplied.length > 0 || conn.pendingCmds.length > 0,\n )\n ) {\n return;\n }\n h.idleWire = level;\n h.viewsDirty = false;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const mainOps = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // One packet per flush: ops first, then applied entries, then verdicts.\n for (const conn of [...h.conns]) {\n if (!conn.ready) continue;\n const forConn = (list: Cmd[] | undefined) =>\n (list ?? []).filter((cmd) => selects(conn, cmd.protocol));\n const ops = [\n ...(selects(conn, h.protocol.name) ? mainOps : []),\n ...diffView(h, conn),\n ];\n const cmd = [\n ...forConn(applied.get(conn.clientId)),\n ...conn.pendingApplied.splice(0),\n ...forConn(cmds.get(conn.clientId)),\n ...conn.pendingCmds.splice(0),\n ];\n if (ops.length > 0) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n ops,\n ...(cmd.length > 0 && { cmd }),\n ...(edge && { idle: level }),\n }),\n );\n } else if (cmd.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, lane: Lane, adm: Admission) => {\n const cmd: Cmd = { protocol: adm.protocol, seq: adm.seq, type: \"applied\" };\n if (lane.conn !== null) lane.conn.pendingApplied.push(cmd);\n else {\n const list = h.pendingApplied.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingApplied.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, lane: Lane, cmd: Cmd) => {\n if (lane.conn !== null) lane.conn.pendingCmds.push(cmd);\n else {\n const list = h.pendingCmds.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n touched: rec.touched,\n lanes: Object.fromEntries(\n [...rec.lanes.values()].map((lane) => [\n lane.protocol,\n {\n lastSeq: admittedThrough(lane),\n results: [...lane.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n },\n ]),\n ),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (lane: Lane, cmd: Cmd) => {\n const now = Date.now();\n lane.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...lane.results.keys());\n for (const [seq, entry] of lane.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n lane.results.delete(seq);\n }\n }\n while (lane.results.size > RESULT_LIMIT) {\n lane.results.delete(Math.min(...lane.results.keys()));\n }\n};\n\n/** Lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (lane: Lane): number =>\n Math.max(lane.lastSeq, ...lane.inflight.keys());\n\nconst watermark = (h: SocketHostState, conn: Conn, protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol)!;\n const lane =\n entry.record === \"ephemeral\"\n ? conn.lanes.get(protocol)\n : h.clients.get(conn.clientId)?.lanes.get(protocol);\n return lane === undefined ? 0 : admittedThrough(lane);\n};\n\nconst laneOf = (h: SocketHostState, conn: Conn, protocol: string): Lane => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined) return violation(\"unsupported protocol\");\n const ephemeral = entry.record === \"ephemeral\";\n const lanes = ephemeral ? conn.lanes : h.clients.get(conn.clientId)!.lanes;\n let lane = lanes.get(protocol);\n if (lane === undefined) {\n lane = {\n protocol,\n clientId: conn.clientId,\n conn: ephemeral ? conn : null,\n lastSeq: 0,\n results: new Map(),\n inflight: new Map(),\n };\n lanes.set(protocol, lane);\n }\n return lane;\n};\n\n// A re-asked seq never re-runs: the stored verdict re-emits, an applied\n// inflight run re-answers applied; one not yet applied answers nothing (its\n// answers ride the stream when ready), an evicted verdict answers expired.\nconst reemit = (h: SocketHostState, lane: Lane, seq: number) => {\n const cached = lane.results.get(seq);\n if (cached) {\n const newest = Math.max(...lane.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, lane, cached.cmd);\n return;\n }\n lane.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = lane.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, lane, adm);\n return;\n }\n queueCmd(h, lane, { protocol: lane.protocol, seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n cmd: Cmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n lane.inflight.delete(adm.seq);\n retain(lane, cmd);\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, lane, cmd);\n if (lane.conn === null) notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, lane, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n conn: Conn,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth: conn.auth,\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n lane: Lane,\n conn: Conn,\n statement: CmdStatement,\n) => {\n const rec = h.clients.get(conn.clientId)!;\n const adm: Admission = {\n protocol: statement.protocol,\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n lane.inflight.set(statement.seq, adm);\n if (lane.conn === null) notifyClientRecords(h);\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, lane, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n lane,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, lane, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"result\",\n payload: names,\n });\n return;\n }\n // Subprotocol methods are registered under their full wire name.\n const method =\n statement.protocol === h.protocol.name\n ? statement.method\n : `${statement.protocol}/${statement.method}`;\n h.commandsHost!.submit!({\n method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, conn),\n attach: conn.attach,\n context: captureContext(conn.contexts.get(statement.protocol) ?? {}),\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n if (lane.conn === null) notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, lane, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, lane, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, every lane: absorbed statements answer from their lane,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating every lane's watermark, nothing consumed. A durable gap is\n// never a close; an ephemeral gap is a violation (the lane has no replay).\nexport type FrameAdmission =\n | { type: \"ok\" }\n | { type: \"expired\" }\n | {\n type: \"refused\";\n syn: {\n syn: { protocols: { name: string; seq: number }[]; retry?: number };\n };\n };\n\nconst refusal = (\n h: SocketHostState,\n conn: Conn,\n retry?: number,\n): FrameAdmission => ({\n type: \"refused\",\n syn: {\n syn: {\n protocols: conn.selection.protocols.map((p) => ({\n name: p.name,\n seq: watermark(h, conn, p.name),\n })),\n ...(retry !== undefined && { retry }),\n },\n },\n});\n\nconst validateContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const statement of frame.cmd) {\n if (!selects(conn, statement.protocol))\n return violation(\"unsupported protocol\");\n const selected = conn.selection.protocols.find(\n (p) => p.name === statement.protocol,\n )!;\n if (selected.record === \"ephemeral\") {\n const through = watermark(h, conn, statement.protocol);\n const first = frame.cmd.find(\n (s) => s.protocol === statement.protocol && s.seq > through,\n );\n if (first && first.seq !== through + 1)\n return violation(\"ephemeral lane gap\");\n }\n }\n for (const entry of frame.ctx ?? []) {\n if (!selects(conn, entry.protocol))\n return violation(\"unsupported context protocol\");\n try {\n h.current?.validateContext?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n};\n\nconst installContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const entry of frame.ctx ?? [])\n conn.contexts.set(entry.protocol, captureContext(entry.value));\n for (const entry of frame.ctx ?? [])\n h.current?.contextChanged?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n};\n\nexport const admitFrame = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n): FrameAdmission => {\n if (expireLease(h, conn)) return { type: \"expired\" };\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n const rec = h.clients.get(conn.clientId)!;\n rec.touched = Date.now();\n const lanes = new Map(\n frame.cmd.map((s) => [s.protocol, laneOf(h, conn, s.protocol)]),\n );\n const through = new Map(\n [...lanes].map(([protocol, lane]) => [protocol, admittedThrough(lane)]),\n );\n const fresh = frame.cmd.filter((s) => s.seq > through.get(s.protocol)!);\n for (const s of frame.cmd) {\n if (s.seq <= through.get(s.protocol)!)\n reemit(h, lanes.get(s.protocol)!, s.seq);\n }\n let durableNew = 0;\n for (const [protocol, lane] of lanes) {\n const first = fresh.find((s) => s.protocol === protocol);\n if (first === undefined) continue;\n if (first.seq !== through.get(protocol)! + 1) {\n if (lane.conn !== null) return violation(\"ephemeral lane gap\");\n notifyClientRecords(h);\n return refusal(h, conn);\n }\n if (lane.conn === null)\n durableNew += fresh.filter((s) => s.protocol === protocol).length;\n }\n if (durableNew > 0) {\n let clientLoad = 0;\n for (const lane of rec.lanes.values()) clientLoad += lane.inflight.size;\n let hostLoad = 0;\n for (const lane of durableLanes(h)) hostLoad += lane.inflight.size;\n if (\n clientLoad + durableNew > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostLoad + durableNew > h.maxInflightCommands\n ) {\n return refusal(h, conn, COMMAND_CAPACITY_RETRY_MS);\n }\n }\n if (fresh.length > 0 && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return refusal(h, conn, retry);\n }\n }\n if (expireLease(h, conn)) return { type: \"expired\" };\n for (const s of fresh) admitCmd(h, lanes.get(s.protocol)!, conn, s);\n for (const [protocol, lane] of lanes) {\n const last = fresh.findLast((s) => s.protocol === protocol);\n // Memory host: admitted means retained — dur rides the admitting flush.\n if (last !== undefined && lane.conn === null)\n queueCmd(h, lane, { protocol, seq: last.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null || expireLease(h, conn))\n return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n if (data === \"{}\") {\n if (conn.sawFrame) sendTo(h, conn, \"{}\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let admission: ReturnType<typeof admitFrame>;\n try {\n const frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n if (frame.cmd.length === 0 && !frame.ctx?.length) return;\n admission = admitFrame(h, conn, frame);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n if (expiredAt(h, options.authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1000, \"lease-expired\");\n } catch {\n /* peer already gone */\n }\n return null;\n }\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n undefined,\n options.authorizedAt,\n options,\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const authorizedAt = Date.now();\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection, authorizedAt);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n let registration: Registration | null;\n try {\n registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n frame,\n authorizedAt,\n options.onIncludedChange === undefined\n ? {}\n : { onIncludedChange: options.onIncludedChange },\n );\n } catch (error) {\n if (violationReason(error) === null) throw error;\n return;\n }\n if (registration === null) return;\n pending.connection = registration.connection;\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (\n live.has(rec.id) ||\n [...rec.lanes.values()].some((lane) => lane.inflight.size > 0)\n )\n continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\n/**\n * Attach a socket: ephemeral-lane statements of the attach frame are admitted\n * before the snapshot (their documents and answers ride the hello), durable\n * ones after it. A violation in the attach frame closes the attach and throws.\n */\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n frame: ParsedFrame = { cmd: [] },\n authorizedAt?: number,\n included: Pick<\n StatewireHostInternal.SocketConnectOptions,\n \"included\" | \"onIncludedChange\"\n > = {},\n): Registration | null => {\n const restored = restoredIncluded(included.included ?? []);\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n if (expiredAt(h, authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"lease-expired\");\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n touched: Date.now(),\n lanes: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n ready: false,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n authorizedAt,\n leaseTimer: null,\n lanes: new Map(),\n contexts: new Map(),\n documents: new Map(),\n included: restored,\n onIncludedChange: included.onIncludedChange,\n view: new Map(),\n nextDoc: 1,\n pendingApplied: [],\n pendingCmds: [],\n attach: undefined!,\n };\n conn.attach = attachOf(h, conn);\n h.conns.add(conn);\n try {\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n h.current?.attaching?.(conn.attach);\n } catch (error) {\n const reason = violationReason(error);\n if (reason !== null) violate(h, conn, reason);\n else closeConn(h, conn, 1011, \"attach failed\");\n throw error;\n }\n gcClients(h);\n ensureHeartbeat(h);\n armLeaseTimer(h, conn);\n if (!conn.open) return null;\n const isEphemeral = (s: CmdStatement) =>\n selection.protocols.find((p) => p.name === s.protocol)?.record ===\n \"ephemeral\";\n const early = frame.cmd.filter(isEphemeral);\n const late = frame.cmd.filter((s) => !isEphemeral(s));\n const admit = (statements: CmdStatement[]) => {\n if (statements.length === 0) return null;\n try {\n return admitFrame(h, conn, { cmd: statements });\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n throw error;\n }\n };\n const earlyAdmission = admit(early);\n if (early.length > 0) flush(h);\n notifyClientRecords(h);\n if (expireLease(h, conn)) return null;\n const ops: WireOp[] = [];\n if (selects(conn, h.protocol.name)) {\n const { value, meta } = encodeDocument(h.stateHost!.snapshot());\n ops.push({\n op: \"mount\",\n protocol: h.protocol.name,\n ...(h.key !== undefined && { key: h.key }),\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n ops.push(...diffView(h, conn));\n const answers = [\n ...conn.pendingApplied.splice(0),\n ...conn.pendingCmds.splice(0),\n ];\n const hello = {\n ops,\n syn: {\n version: selection.version,\n protocols: selection.protocols.map((p) => ({\n ...p,\n seq: p.record === \"ephemeral\" ? 0 : watermark(h, conn, p.name),\n })),\n ...(h.idleWire && { idle: true }),\n },\n ...(answers.length > 0 && { cmd: answers }),\n };\n conn.ready = true;\n sendTo(h, conn, JSON.stringify(hello));\n if (earlyAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(earlyAdmission.syn));\n const lateAdmission = admit(late);\n if (lateAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(lateAdmission.syn));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n h.stateHost?.setOnDocuments(() => markViews(h));\n for (const conn of h.conns) armLeaseTimer(h, conn);\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n for (const conn of h.conns) {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n id: record.id,\n touched: record.touched,\n lanes: new Map(\n Object.entries(record.lanes).map(([protocol, lane]) => [\n protocol,\n {\n protocol,\n clientId: record.id,\n conn: null,\n lastSeq: lane.lastSeq,\n results: new Map(\n lane.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n ),\n principal: record.principal,\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: WIRE_VERSION },\n key: undefined,\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n maxLeaseLifetimeMs: 86_400_000,\n wsInitTimeoutMs: 5_000,\n maxSubscribers: MAX_SUBSCRIBERS,\n maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,\n streamQueueSize: STREAM_QUEUE_SIZE,\n clientRecordLimit: CLIENT_RECORD_LIMIT,\n finOnIdle: false,\n pushback: undefined,\n authorize: undefined,\n clients: restoreClientRecords(persistence?.clientRecords),\n conns: new Set(),\n pendingConns: new Set(),\n pendingOps: [],\n pendingApplied: new Map(),\n pendingCmds: new Map(),\n viewsDirty: false,\n idleWire: true,\n finished: null,\n disposed: false,\n flushScheduled: false,\n heartbeatTimer: null,\n stateHost: null,\n commandsHost: null,\n current: null,\n persistence,\n post: createMacrotaskPoster(() => {\n host.flushScheduled = false;\n flush(host);\n }),\n connect: (clientId, socket, connectOptions) =>\n connect(host, clientId, socket, connectOptions),\n finish: (fin) => finish(host, fin),\n stream: (request) => serveStream(host, request),\n frames: (request) => serveFrames(host, request),\n };\n return host;\n });\n h.protocol = options?.protocol ?? {\n name: DEFAULT_PROTOCOL,\n version: WIRE_VERSION,\n };\n h.key = options?.key;\n h.wireVersion = options?.wireVersion ?? { version: WIRE_VERSION };\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n const maxLeaseLifetimeMs =\n options?.maxLeaseLifetimeMs === undefined\n ? 86_400_000\n : options.maxLeaseLifetimeMs;\n if (\n maxLeaseLifetimeMs !== null &&\n (!Number.isFinite(maxLeaseLifetimeMs) || maxLeaseLifetimeMs <= 0)\n ) {\n throw new TypeError(\n \"maxLeaseLifetimeMs must be finite and positive or null\",\n );\n }\n if (h.maxLeaseLifetimeMs !== maxLeaseLifetimeMs) {\n h.maxLeaseLifetimeMs = maxLeaseLifetimeMs;\n for (const conn of [...h.conns]) armLeaseTimer(h, conn);\n }\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * per-protocol statement lanes under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id (durable lanes) or the\n * admitting attach (ephemeral lanes), per-attach document views, idle edges,\n * and `fin` on finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":";;;;;;;;;;;;AAiCA,MAAasC,eAAe;AAC5B,MAAaC,6BACX;;;AAIF,MAAaC,cAAcC,GAAYC,MAAwB;CAC7D,IAAIC,OAAOC,GAAGH,GAAGC,CAAC,GAAG,OAAO;CAC5B,IAAID,aAAaI,QAAQH,aAAaG,MACpC,OAAOJ,EAAEK,QAAQ,MAAMJ,EAAEI,QAAQ;CACnC,IAAIC,MAAMC,QAAQP,CAAC,KAAKM,MAAMC,QAAQN,CAAC,GACrC,OAAOD,EAAEQ,WAAWP,EAAEO,UAAUR,EAAES,OAAOC,GAAGC,MAAMZ,WAAWW,GAAGT,EAAEU,EAAE,CAAC;CAEvE,IACE,OAAOX,MAAM,YACb,OAAOC,MAAM,YACbD,MAAM,QACNC,MAAM,QACNC,OAAOU,eAAeZ,CAAC,MAAME,OAAOW,aACpCX,OAAOU,eAAeX,CAAC,MAAMC,OAAOW,WACpC;EACA,MAAMC,QAAQZ,OAAOa,KAAKf,CAAC;EAC3B,MAAMgB,QAAQd,OAAOa,KAAKd,CAAC;EAC3B,OACEa,MAAMN,WAAWQ,MAAMR,UACvBM,MAAML,OACHQ,QACCA,OAAOhB,KACPF,WACGC,EAA8BiB,MAC9BhB,EAA8BgB,IACjC,CACJ;CAEJ;CACA,OAAO;AACT;AAEA,MAAME,gBAAgB;AACtB,MAAMC,eAAe;AACrB,MAAMC,sBAAsB;AAC5B,MAAMC,kBAAkB;AACxB,MAAaC,2BAA2B;AACxC,MAAMC,oBAAoB;AAiF1B,MAAMkE,aAAaC,WAA0B;CAC3C,MAAMzF,OAAO0F,OAAO,IAAIC,MAAMF,MAAM,GAAG,EAAEG,MAAM,qBAAqB,CAAC;AACvE;AAEA,MAAMC,mBAAmBC,UACvBA,iBAAiBH,SAASG,MAAMF,SAAS,uBACrCE,MAAMC,UACN;AAeN,MAAMK,iBAAiBxE,UACrB,OAAOA,UAAU,YAAYA,UAAU,QAAQ,CAACxB,MAAMC,QAAQuB,KAAK;AAErE,MAAMyE,eAAe,IAAIC,YAAY;AAErC,MAAaC,mBAAmBC,UAAgC;CAC9D,IAAI,CAACJ,cAAcI,KAAK,GAAG,OAAOhB,UAAU,iBAAiB;CAC7D,MAAM3E,OAAOb,OAAOa,KAAK2F,KAAK;CAC9B,IAAI3F,KAAKP,WAAW,GAAG,OAAOkF,UAAU,iBAAiB;CACzD,MAAMiB,UAAU5F,KAAK6F,QAAQ3F,QAAQA,QAAQ,SAASA,QAAQ,KAAK,CAAC,CAAC4F,KAAK;CAC1E,IAAIF,QAAQnG,SAAS,GACnB,OAAOkF,UAAU,uBAAuBiB,QAAQ,GAAE,EAAG;CACvD,MAAMG,OAAOJ,MAAM,UAAU,CAAA;CAC7B,IAAI,CAACpG,MAAMC,QAAQuG,IAAI,GAAG,OAAOpB,UAAU,iBAAiB;CAC5D,IAAIxF,OAAO6G,OAAOL,OAAO,KAAK,KAAKI,KAAKtG,WAAW,GACjD,OAAOkF,UAAU,YAAY;CAC/B,IAAIoB,KAAKtG,SAAAA,KACP,OAAOkF,UAAU,mBAAmB;CACtC,MAAMsB,uBAAO,IAAIjE,IAAoB;CACrC,MAAME,MAAsB,CAAA;CAC5B,KAAK,MAAMgE,aAAaH,MAAM;EAC5B,IAAI,CAACR,cAAcW,SAAS,GAAG,OAAOvB,UAAU,qBAAqB;EACrE,MAAMtD,MAAM6E,UAAU;EACtB,MAAM5E,SAAS4E,UAAU;EACzB,MAAMhF,WAAWgF,UAAU;EAC3B,IACE,OAAO7E,QAAQ,YACf,CAAC8E,OAAOC,UAAU/E,GAAG,KACrBA,MAAM,KACN,OAAOC,WAAW,YAClB,OAAOJ,aAAa,YACpB,EAAE,YAAYgF,YAEd,OAAOvB,UAAU,qBAAqB;EAExC,MAAM0B,OAAOJ,KAAKK,IAAIpF,QAAQ;EAC9B,IAAImF,SAASE,KAAAA,KAAalF,QAAQgF,OAAO,GACvC,OAAO1B,UAAU,iBAAiB;EACpCsB,KAAKO,IAAItF,UAAUG,GAAG;EACtBa,IAAIuE,KAAK;GACPvF;GACAG;GACAC;GACA8D,QAAQc,UAAU;GAClB,GAAIA,UAAU,YAAYK,KAAAA,KAAa,EAAEvF,MAAMkF,UAAU,QAAQ;EACnE,CAAC;CACH;CACA,MAAM3C,WAAWoC,MAAM;CACvB,MAAML,MAAuC,CAAA;CAC7C,IAAI/B,aAAagD,KAAAA,GAAW;EAC1B,IAAI,CAAChH,MAAMC,QAAQ+D,QAAQ,KAAKA,SAAS9D,WAAW,GAClD,OAAOkF,UAAU,oBAAoB;EACvC,MAAMgC,uBAAO,IAAI/C,IAAY;EAC7B,KAAK,MAAMgD,SAASrD,UAAU;GAC5B,IACE,CAACgC,cAAcqB,KAAK,KACpB,OAAOA,MAAM,gBAAgB,YAC7B,CAACzH,OAAO6G,OAAOY,OAAO,OAAO,KAC7BzH,OAAOa,KAAK4G,KAAK,CAAC,CAACC,MAChB3G,QAAQ,CAAC;IAAC;IAAY;IAAS;GAAM,CAAC,CAAC4G,SAAS5G,GAAG,CACtD,GAEA,OAAOyE,UAAU,mBAAmB;GACtC,MAAMzD,WAAW0F,MAAM;GACvB,IAAID,KAAKI,IAAI7F,QAAQ,GAAG,OAAOyD,UAAU,4BAA4B;GACrEgC,KAAKK,IAAI9F,QAAQ;GACjB,IACEsE,aAAayB,OAAOC,KAAKC,UAAUP,KAAK,CAAC,CAAC,CAACQ,aAAAA,OAG3C,OAAOzC,UAAU,yBAAyB;GAC5C,IAAI;IACFW,IAAImB,KAAK;KACPvF;KACAH,OAAOvE,aAAa;MAClBuE,OAAO6F,MAAM;MACb,GAAIA,MAAM,YAAYL,KAAAA,KAAa,EAAEvF,MAAM4F,MAAM,QAAQ;KAC3D,CAAC;IACH,CAAC;GACH,SAAS3B,OAAO;IACd,OAAON,UACLM,iBAAiBH,QAAQG,MAAMC,UAAU,iBAC3C;GACF;EACF;CACF;CACA,IAAIhD,IAAIzC,WAAW,KAAK6F,IAAI7F,WAAW,GAAG,OAAOkF,UAAU,aAAa;CACxE,OAAO;EAAEzC;EAAK,GAAIoD,IAAI7F,SAAS,KAAK,EAAE6F,IAAI;CAAG;AAC/C;AAEA,MAAa+B,cAAcC,QAA6B;CACtD,IAAI3B;CACJ,IAAI;EACFA,QAAQuB,KAAKK,MAAMD,GAAG;CACxB,QAAQ;EACN,OAAO3C,UAAU,iBAAiB;CACpC;CACA,OAAOe,gBAAgBC,KAAK;AAC9B;AAEA,MAAM6B,oBAAoBF,QACxBA,IAAI7H,SAAAA,WACJ+F,aAAayB,OAAOK,GAAG,CAAC,CAACF,aAAAA;AAI3B,MAAMK,iBACJC,YACgE;CAChE,IAAIA,YAAYnB,KAAAA,GAAW,OAAO,CAAC;CACnC,MAAM,EAAExF,OAAOC,SAASrE,eAAe+K,OAAO;CAC9C,OAAO;EAAEA,SAAS3G;EAAO,GAAIC,SAASuF,KAAAA,KAAa,EAAEvF,KAAK;CAAG;AAC/D;AAEA,MAAM2G,SAASC,KAAgBC,YAAkC;CAC/D,MAAMC,KAAK;EAAE5G,UAAU0G,IAAI1G;EAAUG,KAAKuG,IAAIvG;CAAI;CAClD,IAAIwG,QAAQE,SAAS,YACnB,OAAO;EAAE,GAAGD;EAAIC,MAAM;EAAU,GAAGN,cAAcI,QAAQH,OAAO;CAAE;CAEpE,MAAMM,UACJH,QAAQ5C,iBAAiBtH,qBAAqBkK,QAAQ5C,MAAM+C,UAAU;CACxE,QAAQA,SAASC,MAAjB;EACE,KAAK,WACH,OAAO;GAAE,GAAGH;GAAIC,MAAM;EAAU;EAClC,KAAK,UACH,OAAO;GACL,GAAGD;GACHC,MAAM;GACN,GAAIC,QAAQ9C,YAAYqB,KAAAA,KAAa,EAAErB,SAAS8C,QAAQ9C,QAAQ;EAClE;EACF,KAAK,YAAY;GACf,MAAMA,UACJ8C,QAAQE,SAAS,oBACb,oBAAoBN,IAAItG,OAAM,KAC9B0G,QAAQ9C;GACd,OAAO;IACL,GAAG4C;IACHC,MAAM;IACN,GAAIC,QAAQE,SAAS3B,KAAAA,KAAa,EAAE2B,MAAMF,QAAQE,KAAK;IACvD,GAAIhD,YAAYqB,KAAAA,KAAa,EAAErB,QAAQ;IACvC,GAAGuC,cAAcO,QAAQN,OAAO;GAClC;EACF;EACA;GACES,QAAQlD,MAAM,4BAA4B4C,QAAQ5C,KAAK;GACvD,OAAO;IACL,GAAG6C;IACHC,MAAM;IACN7C,SAAS;GACX;CACJ;AACF;AAEA,MAAMkD,qBAAqBd,QAAgB;CACzC,IAAIvG;CACJ,IAAI;EACFA,QAAQmG,KAAKK,MAAMD,GAAG;CACxB,QAAQ;EACN,OAAO3C,UAAU,iBAAiB;CACpC;CACA,IAAI,CAACY,cAAcxE,KAAK,GAAG,OAAO4D,UAAU,iBAAiB;CAC7D,MAAM,EAAE0D,SAAS,GAAG9F,UAAUxB;CAC9B,IAAIsH,YAAY9B,KAAAA,GAAW,MAAM,IAAI+B,SAAS,MAAM,EAAEC,QAAQ,IAAI,CAAC;CACnE,IACE,CAAChD,cAAc8C,OAAO,KACtBlJ,OAAOqJ,OAAOH,OAAO,CAAC,CAACxB,MAAMlH,MAAM,OAAOA,MAAM,QAAQ,GAExD,OAAOgF,UAAU,mBAAmB;CAEtC,OAAO;EACI0D;EACT1C,OAAOxG,OAAOa,KAAKuC,KAAK,CAAC,CAAC9C,SAASiG,gBAAgBnD,KAAK,IAAI,EAAEL,KAAK,CAAA,EAAG;CACxE;AACF;AA6CA,MAAMiJ,iBAAiBC,MAAuB;CAC5C,IAAIA,EAAEnB,kBAAkBmB,EAAEpB,UAAU;CACpCoB,EAAEnB,iBAAiB;CACnBmB,EAAEV,KAAK;AACT;AAEA,MAAMW,aAAaD,MAAuB;CACxCA,EAAExB,aAAa;CACfuB,cAAcC,CAAC;AACjB;AAEA,MAAME,YACJF,GACAxK,OAKG;CACH,IAAIA,GAAGA,OAAO,aAAaA,GAAGA,OAAO,OAAO;EAC1C,MAAM,EAAEG,OAAOC,SAASrE,eAAeiE,GAAGG,KAAK;EAC/CqK,EAAEzB,WAAWlD,KAAK;GAAE,GAAG7F;GAAIG;GAAO,GAAIC,SAASuF,KAAAA,KAAa,EAAEvF,KAAK;EAAG,CAAC;CACzE,OACEoK,EAAEzB,WAAWlD,KAAK7F,EAAE;CAEtBuK,cAAcC,CAAC;AACjB;AAEA,MAAMjH,UAAUiH,GAAoBG,SAA6B;CAC/D,IAAIA,SAASH,EAAEb,SAAS;CACxBa,EAAEb,UAAUgB;CACZ,MAAMC,YACJ,OAAOD,KAAKE,UAAU,YAAYF,KAAKE,UAAU,OAC7CjO,aAAa+N,KAAKE,KAAK,IACvBlF,KAAAA;CACN,MAAMmF,eAAenO,gBAAgBgO,KAAKI,QAAQ;CAClD,IAAI,CAACH,aAAa,CAACE,cAAcE,QAC/B,MAAM,IAAI9G,MACR,qHACF;CAEF,IAAI0G,cAAcJ,EAAEhB,WAAW;EAC7BgB,EAAEhB,WAAWyB,QAAQ,IAAI;EACzBT,EAAEhB,WAAW0B,eAAe,IAAI;EAChCV,EAAEhB,YAAYoB;EACdJ,EAAEhB,UAAUyB,SAASjL,OAAO0K,SAASF,GAAGxK,EAAE,CAAC;EAC3CwK,EAAEhB,UAAU0B,qBAAqBT,UAAUD,CAAC,CAAC;CAC/C;CACAA,EAAEd,eAAeoB;AACnB;AAEA,MAAaK,aACXX,GACAxJ,MACAsG,MACAtD,WACG;CACH,IAAI,CAAChD,KAAKiB,MAAM;CAChBjB,KAAKiB,OAAO;CACZuI,EAAE3B,MAAMuC,OAAOpK,IAAI;CACnB,IAAIA,KAAKwB,eAAe,MAAM;EAC5B6I,aAAarK,KAAKwB,UAAU;EAC5BxB,KAAKwB,aAAa;CACpB;CACA,IAAI;EACFxB,KAAKe,OAAOuJ,MAAMhE,MAAMtD,MAAM;CAChC,QAAQ,CACN;CAEFwG,EAAEb,SAAS4B,WAAWvK,KAAKuC,MAAM;CACjC,IAAIiH,EAAE3B,MAAM2C,SAAS,KAAKhB,EAAElB,mBAAmB,MAAM;EACnDmC,cAAcjB,EAAElB,cAAc;EAC9BkB,EAAElB,iBAAiB;CACrB;AACF;AAEA,MAAaoC,UAAUlB,GAAoBxJ,MAAY2K,SAAiB;CACtE,IAAI,CAAC3K,KAAKiB,MAAM;CAChBjB,KAAKoB,aAAa3D,KAAKmN,IAAI;CAC3B,IAAI;EACF5K,KAAKe,OAAO8J,KAAKF,IAAI;CACvB,QAAQ;EACNR,UAAUX,GAAGxJ,IAAI;CACnB;AACF;AAEA,MAAM8K,aAAatB,GAAoBjI,iBAAqC;CAC1E,MAAMqJ,MAAMnN,KAAKmN,IAAI;CACrB,OACErJ,iBAAiBoD,KAAAA,KACjB,CAACJ,OAAOwG,SAASxJ,YAAY,KAC7BA,eAAe,KACfA,eAAeqJ,OACdpB,EAAEtC,uBAAuB,QACxB0D,MAAMrJ,gBAAgBiI,EAAEtC;AAE9B;AAEA,MAAM8D,kBAAkB1F,KAAKC,UAAU,EACrC4D,KAAK;CAAEnG,QAAQ;CAAasD,MAAM;AAAgB,EACpD,CAAC;AAED,MAAa2E,eAAezB,GAAoBxJ,SAAwB;CACtE,IAAI,CAACA,KAAKiB,QAAQ6J,UAAUtB,GAAGxJ,KAAKuB,YAAY,GAAG;EACjD,IAAIvB,KAAKiB,MAAM;GACbyJ,OAAOlB,GAAGxJ,MAAMgL,eAAe;GAC/Bb,UAAUX,GAAGxJ,MAAM,KAAM,eAAe;EAC1C;EACA,OAAO;CACT;CACA,OAAO;AACT;AAEA,MAAMkL,iBAAiB1B,GAAoBxJ,SAAe;CACxD,IAAIA,KAAKwB,eAAe,MAAM6I,aAAarK,KAAKwB,UAAU;CAC1DxB,KAAKwB,aAAa;CAClB,IAAIgI,EAAEpB,YAAYoB,EAAEtC,uBAAuB,QAAQ+D,YAAYzB,GAAGxJ,IAAI,GACpE;CACF,MAAMmL,QAAQ3B,EAAEtC,sBAAsBzJ,KAAKmN,IAAI,IAAI5K,KAAKuB;CACxDvB,KAAKwB,aAAaE,iBACV;EACJ1B,KAAKwB,aAAa;EAClB,IAAI,CAACyJ,YAAYzB,GAAGxJ,IAAI,GAAGkL,cAAc1B,GAAGxJ,IAAI;CAClD,GACAoL,KAAKC,IAAIF,OAAO,UAAa,CAC/B;CACA,KAAM3J,WAAiD8J,QAAQ;AACjE;AAEA,MAAMC,WAAW/B,GAAoBxJ,MAAYgD,WAAmB;CAClE0H,OACElB,GACAxJ,MACAsF,KAAKC,UAAU,EAAE4D,KAAK;EAAEnG,QAAQ;EAAkBM,SAASN;CAAO,EAAE,CAAC,CACvE;CACAmH,UAAUX,GAAGxJ,MAAM,MAAMgD,MAAM;AACjC;AAEA,MAAawI,qBAAqBhC,MAChCA,EAAE3B,MAAM2C,OACN,CAAC,GAAGhB,EAAE1B,YAAY,CAAC,CAAC7D,QAAQjE,SAASA,KAAK0C,WAAW,CAAC,CAAC7E,UACzD2L,EAAEpC;AAEJ,MAAMqE,mBAAmBjC,MAAuB;CAC9C,IAAIA,EAAElB,mBAAmB,QAAQkB,EAAEvC,eAAe,GAAG;CACrDuC,EAAElB,iBAAiBC,kBAAkB;EACnC,MAAMqC,MAAMnN,KAAKmN,IAAI;EACrB,KAAK,MAAM5K,QAAQ,CAAC,GAAGwJ,EAAE3B,KAAK,GAC5B,IAAI+C,MAAM5K,KAAKoB,cAAcoI,EAAEvC,aAAayD,OAAOlB,GAAGxJ,MAAM,IAAI;CAEpE,GAAGwJ,EAAEvC,WAAW;CAChB,EAAGqB,eAAqDgD,QAAQ;AAClE;AAEA,MAAMI,kBAAkBlC,GAAoBmC,OAAe;CACzD,IAAIA,OAAOnC,EAAEvC,aAAa;CAC1BuC,EAAEvC,cAAc0E;CAChB,IAAInC,EAAElB,mBAAmB,MAAM;EAC7BmC,cAAcjB,EAAElB,cAAc;EAC9BkB,EAAElB,iBAAiB;EACnBmD,gBAAgBjC,CAAC;CACnB;AACF;AAEA,MAAMoC,eAAe,WAAWpC,GAAoB;CAClD,KAAK,MAAMqC,OAAOrC,EAAE5B,QAAQhB,OAAO,GAAG,OAAOiF,IAAIlL,MAAMiG,OAAO;AAChE;AAEA,MAAMkF,WAAW,WAAWtC,GAAoB;CAC9C,OAAOoC,aAAapC,CAAC;CACrB,KAAK,MAAMxJ,QAAQwJ,EAAE3B,OAAO,OAAO7H,KAAKW,MAAMiG,OAAO;AACvD;AAEA,MAAMmF,aAAavC,MAAgC;CACjD,IAAIA,EAAEb,SAASqD,MAAMC,WAAW,OAAO,OAAO;CAC9C,KAAK,MAAM9H,QAAQ2H,SAAStC,CAAC,GAC3B,IAAIrF,KAAK5D,SAASiK,OAAO,GAAG,OAAO;CAErC,OAAO;AACT;AAEA,MAAM0B,WAAWlM,MAAYV,aAC3BU,KAAKa,UAAUsL,UAAUlH,MAAMmH,MAAMA,EAAEjJ,SAAS7D,QAAQ;AAI1D,MAAM+M,UACJ7C,GACAxJ,SACwC;CACxC,MAAMmC,uBAAO,IAAI/B,IAAoC;CACrD,MAAMkM,SAAS9C,EAAEhB,UAAW3G,UAAU;CACtC,MAAM0K,WAAW7Q,iBAAiB8N,EAAElK,SAAS6D,IAAI;CACjD,KAAK,MAAMiJ,KAAKpM,KAAKa,UAAUsL,WAC7B,IAAIC,EAAEI,WAAW,aACV;OAAA,MAAM,CAAC/L,IAAIxB,QAAQe,KAAK6B,WAC3B,IAAI5C,IAAIK,aAAa8M,EAAEjJ,MAAMhB,KAAKyC,IAAInE,IAAIxB,GAAG;CAAA,OAE/C,KAAK,MAAM,CAACwB,IAAIxB,QAAQqN,QACtB,IACErN,IAAIK,aAAa8M,EAAEjJ,QACnB1C,OAAO8L,aACNtN,IAAIM,QAAQS,KAAK+B,SAASoD,IAAI1E,EAAE,IAEjC0B,KAAKyC,IAAInE,IAAIxB,GAAG;CAIxB,OAAOkD;AACT;AAEA,MAAMsK,YAAYjD,GAAoBxJ,SAAyB;CAC7D,MAAM2I,UAAU0D,OAAO7C,GAAGxJ,IAAI;CAC9B,MAAM0M,MAAgB,CAAA;CACtB,KAAK,MAAM,CAACjM,IAAIuE,UAAUhF,KAAKmC,MAAM;EACnC,IAAIwG,QAAQxD,IAAI1E,EAAE,GAAG;EACrBT,KAAKmC,KAAKiI,OAAO3J,EAAE;EACnBiM,IAAI7H,KAAK;GAAE7F,IAAI;GAAWC,KAAK+F,MAAM/F;EAAI,CAAC;CAC5C;CACA,KAAK,MAAM,CAACwB,IAAIxB,QAAQ0J,SAAS;EAC/B,MAAM3D,QAAQhF,KAAKmC,KAAKuC,IAAIjE,EAAE;EAC9B,IAAIuE,UAAUL,KAAAA,KAAaK,MAAM7F,UAAUF,IAAIE,OAAO;EACtD,MAAM,EAAEA,OAAOC,SAASrE,eAAekE,IAAIE,KAAK;EAChD,IAAI6F,UAAUL,KAAAA,GAAW;GACvB,MAAMgI,SAAS3M,KAAKoC;GACpBpC,KAAKmC,KAAKyC,IAAInE,IAAI;IAAExB,KAAK0N;IAAQxN,OAAOF,IAAIE;GAAM,CAAC;GACnDuN,IAAI7H,KAAK;IACP7F,IAAI;IACJC,KAAK0N;IACLrN,UAAUL,IAAIK;IACd,GAAIL,IAAIX,QAAQ,QAAQ,EAAEA,KAAKW,IAAIX,IAAI;IACvC,GAAIW,IAAIM,QAAQ,EAAEA,MAAM,KAAK;IAC7BJ;IACA,GAAIC,SAASuF,KAAAA,KAAa,EAAEvF,KAAK;GACnC,CAAC;EACH,OAAO;GACL4F,MAAM7F,QAAQF,IAAIE;GAClBuN,IAAI7H,KAAK;IACP7F,IAAI;IACJC,KAAK+F,MAAM/F;IACXC,MAAM,CAAA;IACNC;IACA,GAAIC,SAASuF,KAAAA,KAAa,EAAEvF,KAAK;GACnC,CAAC;EACH;CACF;CACA,OAAOsN;AACT;AAEA,MAAME,kBAAkB5M,SACtBA,KAAKiC,mBACH,CAAC,GAAGjC,KAAK+B,QAAQ,CAAC,CAAC8K,KAChBpM,OAAO6E,KAAKK,MAAMlF,EAAE,CACvB,CACF;AAEF,MAAMqM,oBACJ/K,aAEA,IAAIC,IACFD,SAAS8K,KAAK7H,UAAU;CACtB,IACE,CAACrH,MAAMC,QAAQoH,KAAK,KACpBA,MAAMnH,WAAW,KACjB,OAAOmH,MAAM,OAAO,YACpB,EACEA,MAAM,OAAO,QACZrH,MAAMC,QAAQoH,MAAM,EAAE,KACrBA,MAAM,EAAE,CAAClH,OAAOiP,SAAS,OAAOA,SAAS,QAAQ,IAGrD,MAAM,IAAIC,UAAU,qCAAqC;CAC3D,OAAOtR,iBAAiBsJ,MAAM,IAAIA,MAAM,MAAML,KAAAA,CAAS;AACzD,CAAC,CACH;AAEF,MAAMsI,YAAYzD,GAAoBxJ,SAAqC;CACzE,MAAMkN,mBAAmB5N,aAAqB;EAC5C,MAAM0F,QAAQhF,KAAKa,UAAUsL,UAAUgB,MAAMf,MAAMA,EAAEjJ,SAAS7D,QAAQ;EACtE,IAAI0F,UAAUL,KAAAA,GACZ,MAAM,IAAIzB,MAAM,uBAAuB5D,SAAQ,oBAAqB;EACtE,OAAO0F;CACT;CACA,OAAO;EACL,IAAIoI,SAAS;GACX,OAAOC,SAAS7D,GAAGA,EAAE5B,QAAQlD,IAAI1E,KAAKD,QAAQ,GAAIC,IAAI;EACxD;EACAsN,UAAUhO,aAAa;GACrB4N,gBAAgB5N,QAAQ;GACxB,OAAOzE,eAAemF,KAAK2B,SAAS+C,IAAIpF,QAAQ,KAAK,CAAC,CAAC;EACzD;EACAiO,WAAWjO,UAAUhB,QAAQ;GAC3B,IAAIA,QAAQqG,KAAAA,KAAarF,aAAakK,EAAElK,SAAS6D,MAC/C,OAAOqG,EAAEhB,UAAWgF,SAAS;GAC/B,MAAMrL,OAAOkK,OAAO7C,GAAGxJ,IAAI;GAC3B,IAAI1B,QAAQqG,KAAAA,GACV,OAAOxC,KAAKuC,IAAIhJ,iBAAiB4D,UAAUhB,GAAG,CAAC,CAAC,EAAEa;GACpD,KAAK,MAAMF,OAAOkD,KAAKyE,OAAO,GAC5B,IAAI3H,IAAIK,aAAaA,YAAYL,IAAIM,MAAM,OAAON,IAAIE;EAE1D;EACAsO,QAAQnO,UAAUH,OAAOb,KAAKiB,OAAOjB,QAAQqG,KAAAA,MAAc;GACzD,IAAIuI,gBAAgB5N,QAAQ,CAAC,CAACkN,WAAW,aACvC,MAAM,IAAItJ,MAAM,uBAAuB5D,SAAQ,kBAAmB;GACpE,MAAMoO,UAAU3S,eAAeoE,KAAK;GACpC,IACEyE,aAAayB,OAAOC,KAAKC,UAAUmI,OAAO,CAAC,CAAC,CAAClI,aAAAA,OAG7C,MAAM,IAAItC,MAAM,yCAAyC;GAC3D,MAAMzC,KAAK/E,iBAAiB4D,UAAUhB,GAAG;GACzC,IAAIiB,MACG;SAAA,MAAM,CAACoO,OAAO1O,QAAQe,KAAK6B,WAC9B,IAAI5C,IAAIK,aAAaA,YAAYL,IAAIM,QAAQoO,UAAUlN,IACrD,MAAM,IAAIyC,MACR,cAAc5D,SAAQ,6BACxB;GAAA;GAGNU,KAAK6B,UAAU+C,IAAInE,IAAI;IACrBnB;IACAhB,KAAKA,QAAQqG,KAAAA,IAAY,OAAO,CAAC,GAAGrG,GAAG;IACvCiB;IACAJ,OAAO/C,cAAc+C,KAAK;GAC5B,CAAC;GACDsK,UAAUD,CAAC;EACb;EACAoE,UAAUtO,UAAUhB,QAAQ;GAC1B,IAAI,CAAC0B,KAAK6B,UAAUuI,OAAO1O,iBAAiB4D,UAAUhB,GAAG,CAAC,GACxD,MAAM,IAAI4E,MAAM,oCAAoC;GACtDuG,UAAUD,CAAC;EACb;EACAqE,UAAUvO,UAAUhB,QAAQ;GAC1B,IAAI4O,gBAAgB5N,QAAQ,CAAC,CAACkN,WAAW7H,KAAAA,GACvC,MAAM,IAAIzB,MAAM,uBAAuB5D,SAAQ,gBAAiB;GAClE,MAAMmB,KAAK/E,iBAAiB4D,UAAUhB,GAAG;GACzC,IAAI0B,KAAK+B,SAASoD,IAAI1E,EAAE,GAAG;GAC3BT,KAAK+B,SAASqD,IAAI3E,EAAE;GACpBmM,eAAe5M,IAAI;GACnByJ,UAAUD,CAAC;EACb;EACAsE,UAAUxO,UAAUhB,QAAQ;GAC1B,IAAI,CAAC0B,KAAK+B,SAASqI,OAAO1O,iBAAiB4D,UAAUhB,GAAG,CAAC,GAAG;GAC5DsO,eAAe5M,IAAI;GACnByJ,UAAUD,CAAC;EACb;CACF;AACF;AAIA,MAAauE,SAASvE,GAAoBL,QAA4B;CACpE5N,mBAAmB,CAAC,CAAC;CACrBiO,EAAEhB,WAAWwF,YAAY;CACzB,KAAK,MAAM7J,QAAQ2H,SAAStC,CAAC,GAC3B,KAAK,MAAMxD,OAAO7B,KAAK5D,SAASqG,OAAO,GACrC,IAAIZ,IAAIrG,WAAW,CAACqG,IAAInG,WAAW,CAACmG,IAAIpG,aAAa;EACnDoG,IAAIpG,cAAc;EAClBqO,aAAazE,GAAGrF,MAAM6B,GAAG;CAC3B;CAGJ,MAAMkI,QAAQnC,UAAUvC,CAAC;CACzB,MAAM2E,OAAOD,UAAU1E,EAAEvB;CACzB,IACEuB,EAAEzB,WAAWlK,WAAW,KACxB2L,EAAEnH,eAAemI,SAAS,KAC1BhB,EAAElH,YAAYkI,SAAS,KACvB,CAAChB,EAAExB,cACHmB,QAAQxE,KAAAA,KACR,CAACwJ,QACD,CAAC,CAAC,GAAG3E,EAAE3B,KAAK,CAAC,CAAC5C,MACXjF,SAASA,KAAKqC,eAAexE,SAAS,KAAKmC,KAAKsC,YAAYzE,SAAS,CACxE,GAEA;CAEF2L,EAAEvB,WAAWiG;CACb1E,EAAExB,aAAa;CACf,IAAImB,QAAQxE,KAAAA,KAAawJ,QAAQD,SAAS1E,EAAEhC,WAC1C2B,MAAM,EAAEnG,QAAQ,OAAO;CAEzB,MAAMoL,UAAU5E,EAAEzB;CAClB,MAAMpI,UAAU6J,EAAEnH;CAClB,MAAMgM,OAAO7E,EAAElH;CACfkH,EAAEzB,aAAa,CAAA;CACfyB,EAAEnH,iCAAiB,IAAIjC,IAAI;CAC3BoJ,EAAElH,8BAAc,IAAIlC,IAAI;CAExB,KAAK,MAAMJ,QAAQ,CAAC,GAAGwJ,EAAE3B,KAAK,GAAG;EAC/B,IAAI,CAAC7H,KAAKkB,OAAO;EACjB,MAAMoN,WAAWC,UACdA,QAAQ,CAAA,EAAA,CAAItK,QAAQ3D,QAAQ4L,QAAQlM,MAAMM,IAAIhB,QAAQ,CAAC;EAC1D,MAAMoN,MAAM,CACV,GAAIR,QAAQlM,MAAMwJ,EAAElK,SAAS6D,IAAI,IAAIiL,UAAU,CAAA,GAC/C,GAAG3B,SAASjD,GAAGxJ,IAAI,CAAC;EAEtB,MAAMM,MAAM;GACV,GAAGgO,QAAQ3O,QAAQ+E,IAAI1E,KAAKD,QAAQ,CAAC;GACrC,GAAGC,KAAKqC,eAAemM,OAAO,CAAC;GAC/B,GAAGF,QAAQD,KAAK3J,IAAI1E,KAAKD,QAAQ,CAAC;GAClC,GAAGC,KAAKsC,YAAYkM,OAAO,CAAC;EAAC;EAE/B,IAAI9B,IAAI7O,SAAS,GACf6M,OACElB,GACAxJ,MACAsF,KAAKC,UAAU;GACbmH;GACA,GAAIpM,IAAIzC,SAAS,KAAK,EAAEyC,IAAI;GAC5B,GAAI6N,QAAQ,EAAEM,MAAMP,MAAM;EAC5B,CAAC,CACH;OACK,IAAI5N,IAAIzC,SAAS,GACtB6M,OAAOlB,GAAGxJ,MAAMsF,KAAKC,UAAU,EAAEjF,IAAI,CAAC,CAAC;EAEzC,IAAI6N,QAAQzB,IAAI7O,WAAW,GACzB6M,OAAOlB,GAAGxJ,MAAMsF,KAAKC,UAAU,EAAEkJ,MAAMP,MAAM,CAAC,CAAC;EAEjD,IAAI/E,QAAQxE,KAAAA,GAAW;GACrB+F,OAAOlB,GAAGxJ,MAAMsF,KAAKC,UAAU,EAAE4D,IAAI,CAAC,CAAC;GACvCgB,UAAUX,GAAGxJ,IAAI;EACnB;CACF;AACF;AAEA,MAAMiO,gBAAgBzE,GAAoBrF,MAAY6B,QAAmB;CACvE,MAAM1F,MAAW;EAAEhB,UAAU0G,IAAI1G;EAAUG,KAAKuG,IAAIvG;EAAK0G,MAAM;CAAU;CACzE,IAAIhC,KAAKnE,SAAS,MAAMmE,KAAKnE,KAAKqC,eAAewC,KAAKvE,GAAG;MACpD;EACH,MAAMiO,OAAO/E,EAAEnH,eAAeqC,IAAIP,KAAKpE,QAAQ;EAC/C,IAAIwO,MAAMA,KAAK1J,KAAKvE,GAAG;OAClBkJ,EAAEnH,eAAeuC,IAAIT,KAAKpE,UAAU,CAACO,GAAG,CAAC;CAChD;CACAiJ,cAAcC,CAAC;AACjB;AAEA,MAAMkF,YAAYlF,GAAoBrF,MAAY7D,QAAa;CAC7D,IAAI6D,KAAKnE,SAAS,MAAMmE,KAAKnE,KAAKsC,YAAYuC,KAAKvE,GAAG;MACjD;EACH,MAAMiO,OAAO/E,EAAElH,YAAYoC,IAAIP,KAAKpE,QAAQ;EAC5C,IAAIwO,MAAMA,KAAK1J,KAAKvE,GAAG;OAClBkJ,EAAElH,YAAYsC,IAAIT,KAAKpE,UAAU,CAACO,GAAG,CAAC;CAC7C;CACAiJ,cAAcC,CAAC;AACjB;AAEA,MAAMmF,uBAAuBnF,MAAuB;CAClDA,EAAEZ,aAAagG,wBACb,CAAC,GAAGpF,EAAE5B,QAAQhB,OAAO,CAAC,CAAC,CAACiG,KAAKhB,SAAS;EACpCpL,IAAIoL,IAAIpL;EACRC,SAASmL,IAAInL;EACbC,OAAOpD,OAAOsR,YACZ,CAAC,GAAGhD,IAAIlL,MAAMiG,OAAO,CAAC,CAAC,CAACiG,KAAK1I,SAAS,CACpCA,KAAK7E,UACL;GACEY,SAAS4O,gBAAgB3K,IAAI;GAC7BhE,SAAS,CAAC,GAAGgE,KAAKhE,OAAO,CAAC,CAAC0M,KAAK,CAACpN,KAAKuF,YAAY;IAChDvF;IACAY,IAAI2E,MAAM3E;IACVC,KAAK0E,MAAM1E;GACb,EAAE;EACJ,CAAC,CACF,CACH;EACAM,WAAWiL,IAAIjL;CACjB,EAAE,CACJ;AACF;AAEA,MAAMmO,UAAU5K,MAAY7D,QAAa;CACvC,MAAMsK,MAAMnN,KAAKmN,IAAI;CACrBzG,KAAKhE,QAAQyE,IAAItE,IAAIb,KAAK;EAAEY,IAAIuK;EAAKtK;CAAI,CAAC;CAC1C,MAAM0O,SAAS5D,KAAK6D,IAAI,GAAG9K,KAAKhE,QAAQ/B,KAAK,CAAC;CAC9C,KAAK,MAAM,CAACqB,KAAKuF,UAAUb,KAAKhE,SAC9B,IAAIV,QAAQuP,UAAUpE,MAAM5F,MAAM3E,KAAK7B,eACrC2F,KAAKhE,QAAQiK,OAAO3K,GAAG;CAG3B,OAAO0E,KAAKhE,QAAQqK,OAAO/L,cACzB0F,KAAKhE,QAAQiK,OAAOgB,KAAKC,IAAI,GAAGlH,KAAKhE,QAAQ/B,KAAK,CAAC,CAAC;AAExD;;AAGA,MAAM0Q,mBAAmB3K,SACvBiH,KAAK6D,IAAI9K,KAAKjE,SAAS,GAAGiE,KAAK5D,SAASnC,KAAK,CAAC;AAEhD,MAAM8Q,aAAa1F,GAAoBxJ,MAAYV,aAAqB;CAEtE,MAAM6E,OADQnE,KAAKa,UAAUsL,UAAUgB,MAAMf,MAAMA,EAAEjJ,SAAS7D,QAE5D0F,CAAK,CAACwH,WAAW,cACbxM,KAAKW,MAAM+D,IAAIpF,QAAQ,IACvBkK,EAAE5B,QAAQlD,IAAI1E,KAAKD,QAAQ,CAAC,EAAEY,MAAM+D,IAAIpF,QAAQ;CACtD,OAAO6E,SAASQ,KAAAA,IAAY,IAAImK,gBAAgB3K,IAAI;AACtD;AAEA,MAAMgL,UAAU3F,GAAoBxJ,MAAYV,aAA2B;CACzE,MAAM0F,QAAQhF,KAAKa,UAAUsL,UAAUgB,MAAMf,MAAMA,EAAEjJ,SAAS7D,QAAQ;CACtE,IAAI0F,UAAUL,KAAAA,GAAW,OAAO5B,UAAU,sBAAsB;CAChE,MAAMqM,YAAYpK,MAAMwH,WAAW;CACnC,MAAM7L,QAAQyO,YAAYpP,KAAKW,QAAQ6I,EAAE5B,QAAQlD,IAAI1E,KAAKD,QAAQ,CAAC,CAAEY;CACrE,IAAIwD,OAAOxD,MAAM+D,IAAIpF,QAAQ;CAC7B,IAAI6E,SAASQ,KAAAA,GAAW;EACtBR,OAAO;GACL7E;GACAS,UAAUC,KAAKD;GACfC,MAAMoP,YAAYpP,OAAO;GACzBE,SAAS;GACTC,yBAAS,IAAIC,IAAI;GACjBG,0BAAU,IAAIH,IAAI;EACpB;EACAO,MAAMiE,IAAItF,UAAU6E,IAAI;CAC1B;CACA,OAAOA;AACT;AAKA,MAAMkL,UAAU7F,GAAoBrF,MAAY1E,QAAgB;CAC9D,MAAM6P,SAASnL,KAAKhE,QAAQuE,IAAIjF,GAAG;CACnC,IAAI6P,QAAQ;EAEV,IAAI7P,QADW2L,KAAK6D,IAAI,GAAG9K,KAAKhE,QAAQ/B,KAAK,CACjC4Q,KAAUvR,KAAKmN,IAAI,IAAI0E,OAAOjP,MAAM7B,eAAe;GAC7DkQ,SAASlF,GAAGrF,MAAMmL,OAAOhP,GAAG;GAC5B;EACF;EACA6D,KAAKhE,QAAQiK,OAAO3K,GAAG;EACvBkP,oBAAoBnF,CAAC;CACvB;CACA,MAAMxD,MAAM7B,KAAK5D,SAASmE,IAAIjF,GAAG;CACjC,IAAIuG,KAAK;EACP,IAAIA,IAAIrG,SAASsO,aAAazE,GAAGrF,MAAM6B,GAAG;EAC1C;CACF;CACA0I,SAASlF,GAAGrF,MAAM;EAAE7E,UAAU6E,KAAK7E;EAAUG;EAAK0G,MAAM;CAAU,CAAC;AACrE;AAEA,MAAMoJ,aACJ/F,GACArF,MACA6B,KACA1F,QACG;CACH,IAAI0F,IAAInG,SAAS;CACjBmG,IAAInG,UAAU;CACdsE,KAAK5D,SAAS6J,OAAOpE,IAAIvG,GAAG;CAC5BsP,OAAO5K,MAAM7D,GAAG;CAChB6D,KAAKjE,UAAUkL,KAAK6D,IAAI9K,KAAKjE,SAAS8F,IAAIvG,GAAG;CAC7CuG,IAAIrG,UAAU;CACd+O,SAASlF,GAAGrF,MAAM7D,GAAG;CACrB,IAAI6D,KAAKnE,SAAS,MAAM2O,oBAAoBnF,CAAC;AAC/C;AAEA,MAAMgG,cACJhG,GACArF,MACA6B,KACAC,YACGsJ,UAAU/F,GAAGrF,MAAM6B,KAAKD,MAAMC,KAAKC,OAAO,CAAC;AAEhD,MAAMoH,YACJ7D,GACAqC,KACA7L,UAC0B;CAC1BD,UAAU8L,IAAIpL;CACda,MAAMtB,KAAKsB;CACX,IAAIoO,cAAc;EAChB,IAAIlG,EAAE5B,QAAQlD,IAAImH,IAAIpL,EAAE,MAAMoL,KAAK,OAAO;EAC1C,KAAK,MAAM7L,QAAQwJ,EAAE3B,OACnB,IAAI7H,KAAKD,aAAa8L,IAAIpL,MAAMT,KAAKiB,MAAM,OAAO;EAEpD,OAAO;CACT;AACF;AAEA,MAAM0O,mBACJnG,GACArF,MACA6B,KACA1C,YAEAiM,UAAU/F,GAAGrF,MAAM6B,KAAK;CACtB1G,UAAU0G,IAAI1G;CACdG,KAAKuG,IAAIvG;CACT0G,MAAM;CACNG,MAAM;CACNhD;AACF,CAAC;AAEH,MAAMsM,YACJpG,GACArF,MACAnE,MACAsE,cACG;CACH,MAAMuH,MAAMrC,EAAE5B,QAAQlD,IAAI1E,KAAKD,QAAQ;CACvC,MAAMiG,MAAiB;EACrB1G,UAAUgF,UAAUhF;EACpBG,KAAK6E,UAAU7E;EACfC,QAAQ4E,UAAU5E;EAClBC,SAAS;EACTC,aAAa;EACbC,SAAS;CACX;CACAsE,KAAK5D,SAASqE,IAAIN,UAAU7E,KAAKuG,GAAG;CACpC,IAAI7B,KAAKnE,SAAS,MAAM2O,oBAAoBnF,CAAC;CAC7C,IAAI,CAAC7L,MAAMC,QAAQ0G,UAAUd,MAAM,GAAG;EACpCmM,gBAAgBnG,GAAGrF,MAAM6B,KAAK,yBAAyB;EACvD;CACF;CACA,IAAIxC,SAASc,UAAUd;CACvB,IAAIc,UAAUlF,SAASuF,KAAAA,GACrB,IAAI;EACFnB,SAASrH,oBAAYqH,QAAQc,UAAUlF,MAAM,EAC3CyQ,eAAe,KACjB,CAAC;CACH,SAASxM,OAAO;EACdsM,gBACEnG,GACArF,MACA6B,KACA,mBAAoB3C,MAAgBC,SACtC;EACA;CACF;CAEF,IAAIgB,UAAU5E,WAAW,sBAAsB;EAC7C,IAAI8D,OAAO3F,SAAS,GAAG;GACrB8R,gBAAgBnG,GAAGrF,MAAM6B,KAAK,oCAAoC;GAClE;EACF;EACA,MAAM8J,QAAQ,CACZ,GAAItG,EAAEd,cAAcqH,UAAU,KAAK,CAAA,GACnC,oBAAoB,CACrB,CAAC7L,KAAK;EACPqL,UAAU/F,GAAGrF,MAAM6B,KAAK;GACtB1G,UAAU0G,IAAI1G;GACdG,KAAKuG,IAAIvG;GACT0G,MAAM;GACNL,SAASgK;EACX,CAAC;EACD;CACF;CAEA,MAAMpQ,SACJ4E,UAAUhF,aAAakK,EAAElK,SAAS6D,OAC9BmB,UAAU5E,SACV,GAAG4E,UAAUhF,SAAQ,GAAIgF,UAAU5E;CACzC8J,EAAEd,aAAcsB,OAAQ;EACtBtK;EACA8D;EACAzD,UAAU8L,IAAIpL;EACd2M,QAAQC,SAAS7D,GAAGqC,KAAK7L,IAAI;EAC7BuC,QAAQvC,KAAKuC;EACb+K,SAASzS,eAAemF,KAAK2B,SAAS+C,IAAIJ,UAAUhF,QAAQ,KAAK,CAAC,CAAC;EACnE0Q,iBAAiB;GACf,IAAIhK,IAAInG,WAAWmG,IAAIrG,SAAS;GAChCqG,IAAIrG,UAAU;GACdwE,KAAKjE,UAAUkL,KAAK6D,IAAI9K,KAAKjE,SAAS8F,IAAIvG,GAAG;GAC7C,IAAI0E,KAAKnE,SAAS,MAAM2O,oBAAoBnF,CAAC;GAC7CD,cAAcC,CAAC;EACjB;EACAyG,WAAWhK,YAAYuJ,WAAWhG,GAAGrF,MAAM6B,KAAKC,OAAO;CACzD,CAAC,CAAC,CAACiK,OAAO7M,UAAmB;EAC3B,IAAI,CAAC2C,IAAInG,SAAS2P,WAAWhG,GAAGrF,MAAM6B,KAAK;GAAEG,MAAM;GAAY9C;EAAM,CAAC;CACxE,CAAC;AACH;AAgBA,MAAMiN,WACJ9G,GACAxJ,MACAqQ,WACoB;CACpBlK,MAAM;CACNiK,KAAK,EACHA,KAAK;EACHjE,WAAWnM,KAAKa,UAAUsL,UAAUU,KAAKT,OAAO;GAC9CjJ,MAAMiJ,EAAEjJ;GACR1D,KAAKyP,UAAU1F,GAAGxJ,MAAMoM,EAAEjJ,IAAI;EAChC,EAAE;EACF,GAAIkN,UAAU1L,KAAAA,KAAa,EAAE0L,MAAM;CACrC,EACF;AACF;AAEA,MAAME,oBACJ/G,GACAxJ,MACA+D,UACG;CACH,KAAK,MAAMO,aAAaP,MAAMzD,KAAK;EACjC,IAAI,CAAC4L,QAAQlM,MAAMsE,UAAUhF,QAAQ,GACnC,OAAOyD,UAAU,sBAAsB;EAIzC,IAHiB/C,KAAKa,UAAUsL,UAAUgB,MACvCf,MAAMA,EAAEjJ,SAASmB,UAAUhF,QAE1BkR,CAAQ,CAAChE,WAAW,aAAa;GACnC,MAAMiE,UAAUvB,UAAU1F,GAAGxJ,MAAMsE,UAAUhF,QAAQ;GACrD,MAAMoR,QAAQ3M,MAAMzD,IAAI6M,MACrBwD,MAAMA,EAAErR,aAAagF,UAAUhF,YAAYqR,EAAElR,MAAMgR,OACtD;GACA,IAAIC,SAASA,MAAMjR,QAAQgR,UAAU,GACnC,OAAO1N,UAAU,oBAAoB;EACzC;CACF;CACA,KAAK,MAAMiC,SAASjB,MAAML,OAAO,CAAA,GAAI;EACnC,IAAI,CAACwI,QAAQlM,MAAMgF,MAAM1F,QAAQ,GAC/B,OAAOyD,UAAU,8BAA8B;EACjD,IAAI;GACFyG,EAAEb,SAASiI,kBACT5L,MAAM1F,UACNzE,eAAemK,MAAM7F,KAAK,GAC1Ba,KAAKuC,MACP;EACF,SAASc,OAAO;GACd,OAAON,UACLM,iBAAiBH,QAAQG,MAAMC,UAAU,iBAC3C;EACF;CACF;AACF;AAEA,MAAMuN,mBACJrH,GACAxJ,MACA+D,UACG;CACH,KAAK,MAAMiB,SAASjB,MAAML,OAAO,CAAA,GAC/B1D,KAAK2B,SAASiD,IAAII,MAAM1F,UAAUzE,eAAemK,MAAM7F,KAAK,CAAC;CAC/D,KAAK,MAAM6F,SAASjB,MAAML,OAAO,CAAA,GAC/B8F,EAAEb,SAASmI,iBACT9L,MAAM1F,UACNzE,eAAemK,MAAM7F,KAAK,GAC1Ba,KAAKuC,MACP;AACJ;AAEA,MAAawO,cACXvH,GACAxJ,MACA+D,UACmB;CACnB,IAAIkH,YAAYzB,GAAGxJ,IAAI,GAAG,OAAO,EAAEmG,MAAM,UAAU;CACnDoK,iBAAiB/G,GAAGxJ,MAAM+D,KAAK;CAC/B8M,gBAAgBrH,GAAGxJ,MAAM+D,KAAK;CAC9B,MAAM8H,MAAMrC,EAAE5B,QAAQlD,IAAI1E,KAAKD,QAAQ;CACvC8L,IAAInL,UAAUjD,KAAKmN,IAAI;CACvB,MAAMjK,QAAQ,IAAIP,IAChB2D,MAAMzD,IAAIuM,KAAK8D,MAAM,CAACA,EAAErR,UAAU6P,OAAO3F,GAAGxJ,MAAM2Q,EAAErR,QAAQ,CAAC,CAAC,CAChE;CACA,MAAMmR,UAAU,IAAIrQ,IAClB,CAAC,GAAGO,KAAK,CAAC,CAACkM,KAAK,CAACvN,UAAU6E,UAAU,CAAC7E,UAAUwP,gBAAgB3K,IAAI,CAAC,CAAC,CACxE;CACA,MAAM6M,QAAQjN,MAAMzD,IAAI2D,QAAQ0M,MAAMA,EAAElR,MAAMgR,QAAQ/L,IAAIiM,EAAErR,QAAQ,CAAE;CACtE,KAAK,MAAMqR,KAAK5M,MAAMzD,KACpB,IAAIqQ,EAAElR,OAAOgR,QAAQ/L,IAAIiM,EAAErR,QAAQ,GACjC+P,OAAO7F,GAAG7I,MAAM+D,IAAIiM,EAAErR,QAAQ,GAAIqR,EAAElR,GAAG;CAE3C,IAAIwR,aAAa;CACjB,KAAK,MAAM,CAAC3R,UAAU6E,SAASxD,OAAO;EACpC,MAAM+P,QAAQM,MAAM7D,MAAMwD,MAAMA,EAAErR,aAAaA,QAAQ;EACvD,IAAIoR,UAAU/L,KAAAA,GAAW;EACzB,IAAI+L,MAAMjR,QAAQgR,QAAQ/L,IAAIpF,QAAQ,IAAK,GAAG;GAC5C,IAAI6E,KAAKnE,SAAS,MAAM,OAAO+C,UAAU,oBAAoB;GAC7D4L,oBAAoBnF,CAAC;GACrB,OAAO8G,QAAQ9G,GAAGxJ,IAAI;EACxB;EACA,IAAImE,KAAKnE,SAAS,MAChBiR,cAAcD,MAAM/M,QAAQ0M,MAAMA,EAAErR,aAAaA,QAAQ,CAAC,CAACzB;CAC/D;CACA,IAAIoT,aAAa,GAAG;EAClB,IAAIC,aAAa;EACjB,KAAK,MAAM/M,QAAQ0H,IAAIlL,MAAMiG,OAAO,GAAGsK,cAAc/M,KAAK5D,SAASiK;EACnE,IAAI2G,WAAW;EACf,KAAK,MAAMhN,QAAQyH,aAAapC,CAAC,GAAG2H,YAAYhN,KAAK5D,SAASiK;EAC9D,IACE0G,aAAaD,aAAAA,OACbE,WAAWF,aAAazH,EAAEnC,qBAE1B,OAAOiJ,QAAQ9G,GAAGxJ,MAAM3D,yBAAyB;CAErD;CACA,IAAI2U,MAAMnT,SAAS,KAAK2L,EAAE/B,UAAU;EAClC,MAAM4I,QAAQ7G,EAAE/B,SAAS;EACzB,IAAI4I,UAAU,MAAM;GAClB,IAAI,CAAC9L,OAAO6M,cAAcf,KAAK,KAAKA,QAAQ,GAC1C,MAAM,IAAIrD,UACR,yDACF;GACF,OAAOsD,QAAQ9G,GAAGxJ,MAAMqQ,KAAK;EAC/B;CACF;CACA,IAAIpF,YAAYzB,GAAGxJ,IAAI,GAAG,OAAO,EAAEmG,MAAM,UAAU;CACnD,KAAK,MAAMwK,KAAKK,OAAOpB,SAASpG,GAAG7I,MAAM+D,IAAIiM,EAAErR,QAAQ,GAAIU,MAAM2Q,CAAC;CAClE,KAAK,MAAM,CAACrR,UAAU6E,SAASxD,OAAO;EACpC,MAAM8D,OAAOuM,MAAMK,UAAUV,MAAMA,EAAErR,aAAaA,QAAQ;EAE1D,IAAImF,SAASE,KAAAA,KAAaR,KAAKnE,SAAS,MACtC0O,SAASlF,GAAGrF,MAAM;GAAE7E;GAAUG,KAAKgF,KAAKhF;GAAK6R,KAAK;EAAK,CAAC;CAC5D;CACA3C,oBAAoBnF,CAAC;CACrBD,cAAcC,CAAC;CACf,OAAO,EAAErD,MAAM,KAAK;AACtB;AAEA,MAAM7C,WAAWkG,GAAoBxJ,MAAY2K,SAAiB;CAChE,IAAI,CAAC3K,KAAKiB,QAAQuI,EAAEpB,YAAYoB,EAAEtB,aAAa,QAAQ+C,YAAYzB,GAAGxJ,IAAI,GACxE;CACF,IAAI4F,iBAAiB+E,IAAI,GAAG;EAC1BD,OACElB,GACAxJ,MACAsF,KAAKC,UAAU,EACb4D,KAAK;GACHnG,QAAQ;GACRM,SAAS;EACX,EACF,CAAC,CACH;EACA6G,UAAUX,GAAGxJ,MAAM,MAAM,iBAAiB;EAC1C;CACF;CACA,IAAI2K,SAAS,MAAM;EACjB,IAAI3K,KAAKmB,UAAUuJ,OAAOlB,GAAGxJ,MAAM,IAAI;EACvC;CACF;CACA,MAAM0Q,QAAQ,CAAC1Q,KAAKmB;CACpBnB,KAAKmB,WAAW;CAChB,IAAIoQ;CACJ,IAAI;EACF,MAAMxN,QAAQ2M,QAAQlK,kBAAkBmE,IAAI,CAAC,CAAC5G,QAAQ0B,WAAWkF,IAAI;EACrE,IAAI5G,MAAMzD,IAAIzC,WAAW,KAAK,CAACkG,MAAML,KAAK7F,QAAQ;EAClD0T,YAAYR,WAAWvH,GAAGxJ,MAAM+D,KAAK;CACvC,SAASV,OAAO;EACd,MAAML,SAASI,gBAAgBC,KAAK;EACpC,IAAIL,WAAW,MAAM,MAAMK;EAC3BkI,QAAQ/B,GAAGxJ,MAAMgD,MAAM;EACvB;CACF;CACA,IAAIuO,UAAUpL,SAAS,WACrBuE,OAAOlB,GAAGxJ,MAAMsF,KAAKC,UAAUgM,UAAUnB,GAAG,CAAC;AAEjD;AAEA,MAAMoB,gBACJhI,GACAiI,SACAnL,MACAtD,WACG;CACH,IAAI,CAACyO,QAAQxQ,MAAM;CACnBwQ,QAAQxQ,OAAO;CACfuI,EAAE1B,aAAasC,OAAOqH,OAAO;CAC7B,IAAIA,QAAQ7O,UAAU,MAAMyH,aAAaoH,QAAQ7O,KAAK;CACtD,IAAI;EACF6O,QAAQ1Q,OAAOuJ,MAAMhE,MAAMtD,MAAM;CACnC,QAAQ,CACN;AAEJ;AAEA,MAAM0O,eAAeD,SAAsB9G,SAA0B;CACnE,IAAI,CAAC8G,QAAQxQ,MAAM,OAAO;CAC1B,IAAI;EACFwQ,QAAQ1Q,OAAO8J,KAAKF,IAAI;EACxB,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;AAEA,MAAMgH,yBAAyB5Q,WAA+C;CAC5E,IAAI;EACFA,OAAO8J,KACLvF,KAAKC,UAAU,EACb4D,KAAK;GACHnG,QAAQ;GACRsD,MAAM;GACNhD,SAAS1E;EACX,EACF,CAAC,CACH;CACF,QAAQ,CACN;CAEF,IAAI;EACFmC,OAAOuJ,MAAM,MAAM1L,wBAAwB;CAC7C,QAAQ,CACN;CAEF,OAAO;AACT;AAEA,MAAMgT,8BACJpI,GACAiI,SACApO,UACG;CACH,MAAMwO,WAAWxO,iBAAiBqD,WAAWrD,QAAQ;CACrD,MAAMyO,eAAeD,UAAUlL,WAAW,OAAOkL,UAAUlL,WAAW;CACtE,MAAMA,SAASkL,UAAUlL;CACzB,MAAMrD,UAAUwO,eACZ,iBACAD,UAAUE,eACTpL,WAAWhC,KAAAA,IAAY,yBAAyB,QAAQgC;CAC7D+K,YACED,SACAnM,KAAKC,UAAU,EACb4D,KAAK;EACHnG,QACE2D,WAAW,MACP,cACAmL,eACE,iBACA;EACRxO;EACA,GAAIqD,WAAWhC,KAAAA,KAAa,EAAEgC,OAAO;CACvC,EACF,CAAC,CACH;CACA6K,aAAahI,GAAGiI,SAASK,eAAe,OAAO,MAAMxO,OAAO;AAC9D;AAEA,MAAM0O,qBACJvL,YAC2B;CAC3B,MAAM1B,uBAAO,IAAI/C,IAAY;CAC7B,KAAK,MAAMmB,QAAQ5F,OAAOa,KAAKqI,OAAO,GAAG;EACvC,MAAMnI,MAAM6E,KAAK8O,YAAY;EAC7B,IAAIlN,KAAKI,IAAI7G,GAAG,GAAG,MAAM,IAAI0O,UAAU,uBAAuB;EAC9DjI,KAAKK,IAAI9G,GAAG;CACd;CACA,OAAOf,OAAOsR,YAAY,IAAIqD,QAAQzL,OAAO,CAAC;AAChD;AAEA,MAAM0L,qBACJ3I,GACAzJ,UACAgB,QACAiI,YACkD;CAClD,MAAMtB,YAAY8B,EAAE9B;CACpB,IAAIsB,QAAQoJ,eAAe,MAAM;EAC/B,IAAItH,UAAUtB,GAAGR,QAAQzH,YAAY,GAAG;GACtC,IAAI;IACFR,OAAO8J,KAAKG,eAAe;GAC7B,QAAQ,CACN;GAEF,IAAI;IACFjK,OAAOuJ,MAAM,KAAM,eAAe;GACpC,QAAQ,CACN;GAEF,OAAO;EACT;EAYA,OAXqBgI,SACnB9I,GACAzJ,UACAgB,QACAiI,QAAQoJ,eAAe,MACvBpJ,QAAQ1H,MACR0H,QAAQnI,WACR8D,KAAAA,GACAqE,QAAQzH,cACRyH,OAEKqJ,CAAY,EAAExP,cAAc;CACrC;CACA,MAAM0P,UAAUjM,MAActD,WAAmB;EAC/C,IAAI;GACFjC,OAAOuJ,MAAMhE,MAAMtD,MAAM;EAC3B,QAAQ,CACN;EAEF,OAAO;CACT;CACA,IAAIwG,EAAEpB,UAAU,OAAOmK,OAAO,MAAM,UAAU;CAC9C,IAAI,CAACrV,aAAasV,KAAKzS,QAAQ,GAAG,OAAOwS,OAAO,MAAM,mBAAmB;CACzExE,MAAMvE,CAAC;CACP,IAAIA,EAAEtB,aAAa,MAAM;EACvB,IAAI;GACFnH,OAAO8J,KAAKvF,KAAKC,UAAU,EAAE4D,KAAKK,EAAEtB,SAAS,CAAC,CAAC;EACjD,QAAQ,CACN;EAEF,OAAOqK,OAAO,KAAM,UAAU;CAChC;CACA,MAAMd,UAAuB;EAC3B1Q;EACAE,MAAM;EACNyB,aAAa;EACbC,QAAQ,CAAA;EACRC,OAAO;EACPC,YAAY;CACd;CACA2G,EAAE1B,aAAa1C,IAAIqM,OAAO;CAC1BA,QAAQ7O,QAAQlB,iBAEZkQ,2BACEpI,GACAiI,SACA,IAAI/K,SAAS,MAAM,EAAEC,QAAQ,IAAI,CAAC,CACpC,GACF6C,EAAErC,eACJ;CACA,QAASvE,MAA4C0I,QAAQ;CAC7D,OAAO;EACLvL;EACAuD,UAAUqH,SAAS;GACjB,IAAI8G,QAAQ5O,eAAe,MAAM;IAC/B4O,QAAQ5O,WAAWS,QAAQqH,IAAI;IAC/B;GACF;GACA,IAAI,CAAC8G,QAAQxQ,QAAQuI,EAAEpB,YAAYoB,EAAEtB,aAAa,MAAM;GACxD,IAAItC,iBAAiB+E,IAAI,GAAG;IAC1B+G,YACED,SACAnM,KAAKC,UAAU,EACb4D,KAAK;KACHnG,QAAQ;KACRM,SAAS;IACX,EACF,CAAC,CACH;IACAkO,aAAahI,GAAGiI,SAAS,MAAM,iBAAiB;IAChD;GACF;GACA,IAAIA,QAAQ/O,aAAa;IACvB+O,QAAQ9O,OAAOkC,KAAK8F,IAAI;IACxB;GACF;GACA,IAAI8H;GACJ,IAAI;IACFA,UAAUjM,kBAAkBmE,IAAI;GAClC,SAAStH,OAAO;IACd,IAAIA,iBAAiBqD,UAAU;KAC7BkL,2BAA2BpI,GAAGiI,SAASpO,KAAK;KAC5C;IACF;IACA,MAAML,SAASI,gBAAgBC,KAAK;IACpC,IAAIL,WAAW,MAAM,MAAMK;IAC3BqO,YACED,SACAnM,KAAKC,UAAU,EACb4D,KAAK;KACHnG,QAAQ;KACRM,SAASN;IACX,EACF,CAAC,CACH;IACAwO,aAAahI,GAAGiI,SAAS,MAAMzO,MAAM;IACrC;GACF;GACA,MAAMe,QAAQ0O,QAAQ1O;GACtB,IAAI0C;GACJ,IAAI;IACFA,UAAU;KACR,GAAGuL,kBAAkBS,QAAQhM,OAAO;KACpC,GAAGuL,kBAAkBhJ,QAAQvC,WAAW,CAAC,CAAC;IAC5C;GACF,QAAQ;IACNiL,YACED,SACAnM,KAAKC,UAAU,EACb4D,KAAK;KACHnG,QAAQ;KACRM,SAAS;IACX,EACF,CAAC,CACH;IACAkO,aAAahI,GAAGiI,SAAS,MAAM,mBAAmB;IAClD;GACF;GACA,IAAIjG,kBAAkBhC,CAAC,GAAG;IACxBkI,YACED,SACAnM,KAAKC,UAAU,EACb4D,KAAK;KACHnG,QAAQ;KACRsD,MAAM;KACNhD,SAAS1E;IACX,EACF,CAAC,CACH;IACA4S,aAAahI,GAAGiI,SAAS,MAAM7S,wBAAwB;IACvD;GACF;GACA6S,QAAQ/O,cAAc;GACtB4G,QAAQoJ,QAAQ,CAAC,CACdC,WAAWjL,YAAY,EAAEjB,QAAQ,CAAC,CAAC,CAAC,CACpCkM,MAAMrR,SAAS;IACd,IAAI,CAACmQ,QAAQxQ,QAAQuI,EAAEpB,YAAYoB,EAAEtB,aAAa,MAAM;IACxD,MAAM3G,eAAe9D,KAAKmN,IAAI;IAC9B,MAAM/J,YAAY3F,mBAChB,IAAIgX,QAAQzL,OAAO,GACnB+C,EAAEzC,aACF,CAACyC,EAAElK,QAAQ,CACb;IACA,IAAI,SAASuB,WAAW;KACtB6Q,YAAYD,SAASnM,KAAKC,UAAU1E,SAAS,CAAC;KAC9C2Q,aAAahI,GAAGiI,SAAS,MAAM5Q,UAAUsI,IAAI7F,OAAO;KACpD;IACF;IACA0F,QAAQ4J,eAAetR,MAAMT,WAAWU,YAAY;IACpDkQ,QAAQxQ,OAAO;IACfuI,EAAE1B,aAAasC,OAAOqH,OAAO;IAC7B,IAAIA,QAAQ7O,UAAU,MAAMyH,aAAaoH,QAAQ7O,KAAK;IACtD,IAAIyP;IACJ,IAAI;KACFA,eAAeC,SACb9I,GACAzJ,UACAgB,QACA,MACAO,MACAT,WACAkD,OACAxC,cACAyH,QAAQ/G,qBAAqB0C,KAAAA,IACzB,CAAC,IACD,EAAE1C,kBAAkB+G,QAAQ/G,iBAAiB,CACnD;IACF,SAASoB,OAAO;KACd,IAAID,gBAAgBC,KAAK,MAAM,MAAM,MAAMA;KAC3C;IACF;IACA,IAAIgP,iBAAiB,MAAM;IAC3BZ,QAAQ5O,aAAawP,aAAaxP;IAClC,KAAK,MAAM8H,QAAQ8G,QAAQ9O,OAAO6L,OAAO,CAAC,GACxC6D,aAAaxP,WAAWS,QAAQqH,IAAI;GACxC,CAAC,CAAC,CACDuF,OAAO7M,UAAmB;IACzB,IAAIoO,QAAQxQ,MAAM2Q,2BAA2BpI,GAAGiI,SAASpO,KAAK;GAChE,CAAC;EACL;EACAiH,aAAa;GACX,IAAImH,QAAQ5O,eAAe,MAAM4O,QAAQ5O,WAAWyH,MAAM;QACrDkH,aAAahI,GAAGiI,OAAO;EAC9B;CACF;AACF;AAEA,MAAMqB,aAAatJ,MAAuB;CACxC,IAAIuJ,SAASvJ,EAAE5B,QAAQ4C,OAAOhB,EAAEjC;CAChC,IAAIwL,UAAU,GAAG;CACjB,IAAIC,UAAU;CACd,MAAMC,OAAO,IAAIjR,IAAI,CAAC,GAAGwH,EAAE3B,KAAK,CAAC,CAACgF,KAAK7M,SAASA,KAAKD,QAAQ,CAAC;CAC9D,MAAMmT,SAAS,CAAC,GAAG1J,EAAE5B,QAAQhB,OAAO,CAAC,CAAC,CAAC1C,MAAM7G,GAAGC,MAAMD,EAAEqD,UAAUpD,EAAEoD,OAAO;CAC3E,KAAK,MAAMmL,OAAOqH,QAAQ;EACxB,IAAIH,UAAU,GAAG;EACjB,IACEE,KAAK9N,IAAI0G,IAAIpL,EAAE,KACf,CAAC,GAAGoL,IAAIlL,MAAMiG,OAAO,CAAC,CAAC,CAAC3B,MAAMd,SAASA,KAAK5D,SAASiK,OAAO,CAAC,GAE7D;EACFhB,EAAE5B,QAAQwC,OAAOyB,IAAIpL,EAAE;EACvBuS,UAAU;EACVD,UAAU;CACZ;CACA,IAAIC,SAASrE,oBAAoBnF,CAAC;AACpC;;;;;;AAYA,MAAa8I,YACX9I,GACAzJ,UACAgB,QACAI,WAAW,OACXG,OAAgBqD,KAAAA,GAChB9D,YAAyC;CACvCsS,SAAS3J,EAAEzC,YAAYoM;CACvBhH,WAAW,CAAC;EAAEhJ,MAAMqG,EAAElK,SAAS6D;EAAMgQ,SAAS3J,EAAElK,SAAS6T;CAAQ,CAAC;AACpE,GACApP,QAAqB,EAAEzD,KAAK,CAAA,EAAG,GAC/BiB,cACAQ,WAGI,CAAC,MACmB;CACxB,MAAMsR,WAAWvG,iBAAiB/K,SAASA,YAAY,CAAA,CAAE;CACzD,MAAMwQ,UAAUjM,MAActD,WAAmB;EAC/C,IAAI;GACFjC,OAAOuJ,MAAMhE,MAAMtD,MAAM;EAC3B,QAAQ,CACN;EAEF,OAAO;CACT;CACA,IAAIwG,EAAEpB,UAAU,OAAOmK,OAAO,MAAM,UAAU;CAC9C,IAAI,CAACrV,aAAasV,KAAKzS,QAAQ,GAAG,OAAOwS,OAAO,MAAM,mBAAmB;CACzExE,MAAMvE,CAAC;CACP,IAAIA,EAAEtB,aAAa,MAAM;EACvB,IAAI;GACFnH,OAAO8J,KAAKvF,KAAKC,UAAU,EAAE4D,KAAKK,EAAEtB,SAAS,CAAC,CAAC;EACjD,QAAQ,CACN;EAEFqK,OAAO,KAAM,UAAU;EACvB,OAAO;CACT;CACA,IAAI/G,kBAAkBhC,CAAC,GACrB,OAAOmI,sBAAsB5Q,MAAM;CAErC,IAAI+J,UAAUtB,GAAGjI,YAAY,GAAG;EAC9B,IAAI;GACFR,OAAO8J,KAAKG,eAAe;EAC7B,QAAQ,CACN;EAEF,OAAOuH,OAAO,KAAM,eAAe;CACrC;CACA,MAAMe,QAAQ9J,EAAE5B,QAAQlD,IAAI3E,QAAQ;CACpC,IAAIuT,UAAU3O,KAAAA,KAAa,CAACvH,WAAWkW,MAAM1S,WAAWU,IAAI,GAAG;EAC7D,IAAI;GACFP,OAAO8J,KACLvF,KAAKC,UAAU,EACb4D,KAAK;IACHnG,QAAQ;IACRM,SAASnG;IACTwJ,QAAQ;GACV,EACF,CAAC,CACH;EACF,QAAQ,CACN;EAEF,OAAO4L,OAAO,MAAMpV,0BAA0B;CAChD;CACA,MAAM0O,MACJyH,gBACO;EACL,MAAMC,UAAqB;GACzB9S,IAAIV;GACJW,SAASjD,KAAKmN,IAAI;GAClBjK,uBAAO,IAAIP,IAAI;GACfQ,WAAWU;EACb;EACAkI,EAAE5B,QAAQhD,IAAI7E,UAAUwT,OAAO;EAC/B,OAAOA;CACT,EAAA,CAAG;CACL1H,IAAInL,UAAUjD,KAAKmN,IAAI;CACvB,MAAM5K,OAAa;EACjBa;EACAd;EACAgB;EACAE,MAAM;EACNC,OAAO;EACPC;EACAC,YAAY;EACZC,OAAO;EACPC;EACAC;EACAC,YAAY;EACZb,uBAAO,IAAIP,IAAI;EACfuB,0BAAU,IAAIvB,IAAI;EAClByB,2BAAW,IAAIzB,IAAI;EACnB2B,UAAUsR;EACVpR,kBAAkBF,SAASE;EAC3BE,sBAAM,IAAI/B,IAAI;EACdgC,SAAS;EACTC,gBAAgB,CAAA;EAChBC,aAAa,CAAA;EACbC,QAAQoC,KAAAA;CACV;CACA3E,KAAKuC,SAAS0K,SAASzD,GAAGxJ,IAAI;CAC9BwJ,EAAE3B,MAAMzC,IAAIpF,IAAI;CAChB,IAAI;EACFuQ,iBAAiB/G,GAAGxJ,MAAM+D,KAAK;EAC/B8M,gBAAgBrH,GAAGxJ,MAAM+D,KAAK;EAC9ByF,EAAEb,SAAS6K,YAAYxT,KAAKuC,MAAM;CACpC,SAASc,OAAO;EACd,MAAML,SAASI,gBAAgBC,KAAK;EACpC,IAAIL,WAAW,MAAMuI,QAAQ/B,GAAGxJ,MAAMgD,MAAM;OACvCmH,UAAUX,GAAGxJ,MAAM,MAAM,eAAe;EAC7C,MAAMqD;CACR;CACAyP,UAAUtJ,CAAC;CACXiC,gBAAgBjC,CAAC;CACjB0B,cAAc1B,GAAGxJ,IAAI;CACrB,IAAI,CAACA,KAAKiB,MAAM,OAAO;CACvB,MAAMwS,eAAe9C,MACnB9P,UAAUsL,UAAUgB,MAAMf,MAAMA,EAAEjJ,SAASwN,EAAErR,QAAQ,CAAC,EAAEkN,WACxD;CACF,MAAMkH,QAAQ3P,MAAMzD,IAAI2D,OAAOwP,WAAW;CAC1C,MAAME,OAAO5P,MAAMzD,IAAI2D,QAAQ0M,MAAM,CAAC8C,YAAY9C,CAAC,CAAC;CACpD,MAAMiD,SAASC,eAA+B;EAC5C,IAAIA,WAAWhW,WAAW,GAAG,OAAO;EACpC,IAAI;GACF,OAAOkT,WAAWvH,GAAGxJ,MAAM,EAAEM,KAAKuT,WAAW,CAAC;EAChD,SAASxQ,OAAO;GACd,MAAML,SAASI,gBAAgBC,KAAK;GACpC,IAAIL,WAAW,MAAM,MAAMK;GAC3BkI,QAAQ/B,GAAGxJ,MAAMgD,MAAM;GACvB,MAAMK;EACR;CACF;CACA,MAAMyQ,iBAAiBF,MAAMF,KAAK;CAClC,IAAIA,MAAM7V,SAAS,GAAGkQ,MAAMvE,CAAC;CAC7BmF,oBAAoBnF,CAAC;CACrB,IAAIyB,YAAYzB,GAAGxJ,IAAI,GAAG,OAAO;CACjC,MAAM0M,MAAgB,CAAA;CACtB,IAAIR,QAAQlM,MAAMwJ,EAAElK,SAAS6D,IAAI,GAAG;EAClC,MAAM,EAAEhE,OAAOC,SAASrE,eAAeyO,EAAEhB,UAAWgF,SAAS,CAAC;EAC9Dd,IAAI7H,KAAK;GACP7F,IAAI;GACJM,UAAUkK,EAAElK,SAAS6D;GACrB,GAAIqG,EAAElL,QAAQqG,KAAAA,KAAa,EAAErG,KAAKkL,EAAElL,IAAI;GACxCiB,MAAM;GACNJ;GACA,GAAIC,SAASuF,KAAAA,KAAa,EAAEvF,KAAK;EACnC,CAAC;CACH;CACAsN,IAAI7H,KAAK,GAAG4H,SAASjD,GAAGxJ,IAAI,CAAC;CAC7B,MAAM+T,UAAU,CACd,GAAG/T,KAAKqC,eAAemM,OAAO,CAAC,GAC/B,GAAGxO,KAAKsC,YAAYkM,OAAO,CAAC,CAAC;CAE/B,MAAMwF,QAAQ;EACZtH;EACA0D,KAAK;GACH+C,SAAStS,UAAUsS;GACnBhH,WAAWtL,UAAUsL,UAAUU,KAAKT,OAAO;IACzC,GAAGA;IACH3M,KAAK2M,EAAEI,WAAW,cAAc,IAAI0C,UAAU1F,GAAGxJ,MAAMoM,EAAEjJ,IAAI;GAC/D,EAAE;GACF,GAAIqG,EAAEvB,YAAY,EAAEwG,MAAM,KAAK;EACjC;EACA,GAAIsF,QAAQlW,SAAS,KAAK,EAAEyC,KAAKyT,QAAQ;CAC3C;CACA/T,KAAKkB,QAAQ;CACbwJ,OAAOlB,GAAGxJ,MAAMsF,KAAKC,UAAUyO,KAAK,CAAC;CACrC,IAAIF,gBAAgB3N,SAAS,WAC3BuE,OAAOlB,GAAGxJ,MAAMsF,KAAKC,UAAUuO,eAAe1D,GAAG,CAAC;CACpD,MAAM6D,gBAAgBL,MAAMD,IAAI;CAChC,IAAIM,eAAe9N,SAAS,WAC1BuE,OAAOlB,GAAGxJ,MAAMsF,KAAKC,UAAU0O,cAAc7D,GAAG,CAAC;CAMnD,OAAO;EAAEpQ;EAAM6C,YAAAA;GAJb9C;GACAuD,UAAUqH,SAASrH,QAAQkG,GAAGxJ,MAAM2K,IAAI;GACxCL,aAAaH,UAAUX,GAAGxJ,IAAI;EAEjB6C;CAAW;AAC5B;AAEA,MAAMkG,WACJS,GACAzJ,UACAgB,QACAiI,UAAsD,CAAC,MACL;CAClD,OAAOmJ,kBAAkB3I,GAAGzJ,UAAUgB,QAAQiI,OAAO;AACvD;AAEA,MAAME,UAAUM,GAAoBL,QAA2B;CAC7D,IACEA,IAAIkH,UAAU1L,KAAAA,MACb,CAACJ,OAAO6M,cAAcjI,IAAIkH,KAAK,KAAKlH,IAAIkH,QAAQ,IAEjD,MAAM,IAAInN,MAAM,qDAAqD;CAEvE,IAAIsG,EAAEtB,aAAa,QAAQsB,EAAEpB,UAAU;CACvCoB,EAAEd,cAAcwL,QAAQ;CACxB1K,EAAEtB,WAAWiB;CACb,KAAK,MAAMsI,WAAW,CAAC,GAAGjI,EAAE1B,YAAY,GAAG;EACzC4J,YAAYD,SAASnM,KAAKC,UAAU,EAAE4D,IAAI,CAAC,CAAC;EAC5CqI,aAAahI,GAAGiI,SAAS,KAAMtI,IAAInG,MAAM;CAC3C;CACA+K,MAAMvE,GAAGL,GAAG;AACd;AAEA,MAAMgL,UAAU3K,MAAuB;CACrCA,EAAEpB,WAAW;CACboB,EAAEhB,WAAWyB,SAASjL,OAAO0K,SAASF,GAAGxK,EAAE,CAAC;CAC5CwK,EAAEhB,WAAW0B,qBAAqBT,UAAUD,CAAC,CAAC;CAC9C,KAAK,MAAMxJ,QAAQwJ,EAAE3B,OAAOqD,cAAc1B,GAAGxJ,IAAI;AACnD;AAEA,MAAMoU,WAAW5K,MAAuB;CACtCA,EAAEpB,WAAW;CACb,KAAK,MAAMpI,QAAQwJ,EAAE3B,OAAO;EAC1B,IAAI7H,KAAKwB,eAAe,MAAM6I,aAAarK,KAAKwB,UAAU;EAC1DxB,KAAKwB,aAAa;CACpB;CACA,IAAIgI,EAAElB,mBAAmB,MAAM;EAC7BmC,cAAcjB,EAAElB,cAAc;EAC9BkB,EAAElB,iBAAiB;CACrB;CACAkB,EAAEhB,WAAWyB,QAAQ,IAAI;CACzBT,EAAEhB,WAAW0B,eAAe,IAAI;AAClC;AAEA,MAAMmK,wBACJC,UAAyD,CAAA,MAEzD,IAAIlU,IACFkU,QAAQzH,KAAKL,WAAW,CACtBA,OAAO/L,IACP;CACEA,IAAI+L,OAAO/L;CACXC,SAAS8L,OAAO9L;CAChBC,OAAO,IAAIP,IACT7C,OAAOiX,QAAQhI,OAAO7L,KAAK,CAAC,CAACkM,KAAK,CAACvN,UAAU6E,UAAU,CACrD7E,UACA;EACEA;EACAS,UAAUyM,OAAO/L;EACjBT,MAAM;EACNE,SAASiE,KAAKjE;EACdC,SAAS,IAAIC,IACX+D,KAAKhE,QAAQ0M,KAAK,EAAEpN,KAAKY,IAAIC,UAAU,CAACb,KAAK;GAAEY;GAAIC;EAAI,CAAC,CAAC,CAC3D;EACAC,0BAAU,IAAIH,IAAI;CACpB,CAAC,CACF,CACH;CACAQ,WAAW4L,OAAO5L;AACpB,CAAC,CACF,CACH;AAEF,MAAM6T,iBACJC,WACA1L,SACAJ,gBAIG;CACH,MAAM,CAACY,KAAKnO,eAAgC;EAC1C,MAAMuZ,OAAwB;GAC5BtV,UAAU;IAAE6D,MAAMnI;IAAkBmY,SAASlY;GAAa;GAC1DqD,KAAKqG,KAAAA;GACLoC,aAAa,EAAEoM,SAASlY,aAAa;GACrCgM,aAAa;GACbC,oBAAoB;GACpBC,iBAAiB;GACjBC,gBAAgBzI;GAChB0I,qBAAqB3K;GACrB4K,iBAAiBzI;GACjB0I,mBAAmB7I;GACnB8I,WAAW;GACXC,UAAU9C,KAAAA;GACV+C,WAAW/C,KAAAA;GACXiD,SAASyM,qBAAqBzL,aAAaiM,aAAa;GACxDhN,uBAAO,IAAI7F,IAAI;GACf8F,8BAAc,IAAI9F,IAAI;GACtB+F,YAAY,CAAA;GACZ1F,gCAAgB,IAAIjC,IAAI;GACxBkC,6BAAa,IAAIlC,IAAI;GACrB4H,YAAY;GACZC,UAAU;GACVC,UAAU;GACVE,UAAU;GACVC,gBAAgB;GAChBC,gBAAgB;GAChBE,WAAW;GACXE,cAAc;GACdC,SAAS;GACTC;GACAE,MAAMnM,4BAA4B;IAChCiY,KAAKvM,iBAAiB;IACtB0F,MAAM6G,IAAI;GACZ,CAAC;GACD7L,UAAUhJ,UAAUgB,QAAQ+T,mBAC1B/L,QAAQ6L,MAAM7U,UAAUgB,QAAQ+T,cAAc;GAChD5L,SAASC,QAAQD,OAAO0L,MAAMzL,GAAG;GACjCnM,SAASoM,YAAYnM,OAAY2X,MAAMxL,OAAO;GAC9CtM,SAASsM,cAAYrM,OAAY6X,MAAMxL,SAAO;EAChD;EACA,OAAOwL;CACT,CAAC;CACDpL,EAAElK,WAAW0J,SAAS1J,YAAY;EAChC6D,MAAAA;EACAgQ,SAAAA;CACF;CACA3J,EAAElL,MAAM0K,SAAS1K;CACjBkL,EAAEzC,cAAciC,SAASjC,eAAe,EAAEoM,SAAAA,aAAsB;CAChEzH,eAAelC,GAAGR,SAAS+L,uBAAuB,IAAM;CACxD,MAAM7N,qBACJ8B,SAAS9B,uBAAuBvC,KAAAA,IAC5B,QACAqE,QAAQ9B;CACd,IACEA,uBAAuB,SACtB,CAAC3C,OAAOwG,SAAS7D,kBAAkB,KAAKA,sBAAsB,IAE/D,MAAM,IAAI8F,UACR,wDACF;CAEF,IAAIxD,EAAEtC,uBAAuBA,oBAAoB;EAC/CsC,EAAEtC,qBAAqBA;EACvB,KAAK,MAAMlH,QAAQ,CAAC,GAAGwJ,EAAE3B,KAAK,GAAGqD,cAAc1B,GAAGxJ,IAAI;CACxD;CACAwJ,EAAE/B,WAAWuB,SAASvB;CACtB+B,EAAErC,kBAAkB6B,SAAS7B,mBAAmB;CAChD,MAAMC,iBACJ4B,SAAS5B,mBAAmBzC,KAAAA,IACxBhG,kBACAqK,QAAQ5B;CACd,IAAI,CAAC7C,OAAOC,UAAU4C,cAAc,KAAKA,iBAAiB,GACxD,MAAM,IAAI4F,UAAU,2CAA2C;CAEjExD,EAAEpC,iBAAiBA;CACnB,MAAMC,sBACJ2B,SAAS3B,wBAAwB1C,KAAAA,IAC7BjI,iCACAsM,QAAQ3B;CACd,IAAI,CAAC9C,OAAOC,UAAU6C,mBAAmB,KAAKA,sBAAsB,GAClE,MAAM,IAAI2F,UAAU,gDAAgD;CAEtExD,EAAEnC,sBAAsBA;CACxB,MAAMC,kBACJ0B,SAAS1B,oBAAoB3C,KAAAA,IACzB9F,oBACAmK,QAAQ1B;CACd,IAAI,CAAC/C,OAAOC,UAAU8C,eAAe,KAAKA,kBAAkB,GAC1D,MAAM,IAAI0F,UAAU,4CAA4C;CAElExD,EAAElC,kBAAkBA;CACpBkC,EAAEjC,oBAAoByB,SAASzB,qBAAqB7I;CACpD8K,EAAEhC,YAAYwB,SAASxB,aAAa;CACpCgC,EAAE9B,YAAYsB,SAAStB;CACvB,MAAMvI,QAAQ3D,YAAYkZ,SAAS;CACnCnS,OAAOiH,GAAGrK,KAAK;CACf/D,gBAAgB;EACdmH,OAAOiH,GAAGrK,KAAK;EACfoK,cAAcC,CAAC;CACjB,CAAC;CACDpO,gBAAgB;EACd+Y,OAAO3K,CAAC;EACR,aAAa4K,QAAQ5K,CAAC;CACxB,GAAG,CAACA,CAAC,CAAC;CACN,OAAOA;AACT;;;;;;;;;;AAWA,MAAawL,uBACXN,WACA1L,SACAJ,gBACqC;CACrC,MAAMqM,uBAAiB;EAAA,OAAMR,cAAcC,WAAW1L,SAASJ,WAAW;CAAC;CAC3E,MAAMsM,OAAO5Z,cAAc2Z,cAAc;CACzC,IAAI7M,WAAW;CACf,OAAO;EACLW,UAAUhJ,UAAUgB,QAAQ+T,mBAC1BvZ,mBACE2Z,KAAKC,SAAS,CAAC,CAACpM,QAAQhJ,UAAUgB,QAAQ+T,cAAc,CAC1D;EACF9X,SAASoM,YAAY7N,mBAAmB2Z,KAAKC,SAAS,CAAC,CAACnY,OAAOoM,OAAO,CAAC;EACvEtM,SAASsM,YAAY7N,mBAAmB2Z,KAAKC,SAAS,CAAC,CAACrY,OAAOsM,OAAO,CAAC;EACvEF,SAASC,QAAQ5N,mBAAmB2Z,KAAKC,SAAS,CAAC,CAACjM,OAAOC,GAAG,CAAC;EAC/DiM,eAAe;GACb,IAAIhN,UAAU;GACdA,WAAW;GACX7M,mBACE2Z,KAAKC,SAAS,CAAC,CAACjM,OAAO;IAAElG,QAAQ;IAAasD,MAAM;GAAU,CAAC,CACjE;GACA4O,KAAKtH,QAAQ;EACf;CACF;AACF"}
1
+ {"version":3,"file":"socket.js","names":["contextValue","captureContext","MAX_CONTEXT_BYTES","encodeDocument","DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","documentIdentity","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","reviveValue","sanitizeValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_EPHEMERAL_DOCUMENT_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireDocument","StatewirePath","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","Cmd","WireOp","op","doc","path","value","meta","MetaEntry","protocol","main","Admission","seq","method","applied","appliedSent","settled","Lane","clientId","conn","Conn","lastSeq","results","Map","ts","cmd","inflight","ClientRec","id","touched","lanes","principal","selection","Selection","socket","Socket","open","ready","sawFrame","lastSentAt","lease","auth","authorizedAt","leaseTimer","ReturnType","setTimeout","timedLease","contexts","Context","documents","Document","included","Set","onIncludedChange","IncludedDocument","view","nextDoc","pendingApplied","pendingCmds","attach","Attach","PendingConn","authorizing","queued","timer","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CmdStatement","params","ParsedFrame","ctx","isPlainObject","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","lane","hasOwn","prev","statement","Number","isInteger","last","get","undefined","set","push","NonNullable","seen","entry","some","includes","has","add","encode","JSON","stringify","byteLength","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","at","type","failure","fate","code","console","parseInitialFrame","headers","Response","status","values","SocketHostState","Definition","wireVersion","Range","heartbeatMs","maxLeaseLifetimeMs","leaseTimers","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","pendingConns","pendingOps","viewsDirty","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","markViews","recordOp","next","nextState","state","nextCommands","commands","submit","setOnOp","setOnDocuments","closeConn","delete","clearTimeout","close","detached","size","clearInterval","sendTo","data","now","send","expiredAt","isFinite","leaseExpiredFin","expireLease","armLeaseTimer","delay","Math","min","unref","violate","atSubscriberLimit","ensureHeartbeat","setHeartbeatMs","ms","durableLanes","rec","allLanes","idleLevel","work","isIdle","selects","protocols","p","viewOf","shared","hostMain","record","diffView","ops","number","notifyIncluded","map","restoredIncluded","part","TypeError","attachOf","requireSelected","find","caller","callerOf","context","document","snapshot","mount","encoded","other","unmount","include","exclude","flush","takeChanged","queueApplied","level","edge","mainOps","cmds","forConn","list","splice","idle","queueCmd","notifyClientRecords","onClientRecordsChange","fromEntries","admittedThrough","retain","newest","max","watermark","laneOf","ephemeral","reemit","cached","settleCmd","settleWire","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","onApplied","onSettle","catch","FrameAdmission","syn","retry","refusal","validateContexts","selected","through","first","s","validateContext","installContexts","contextChanged","admitFrame","fresh","durableNew","clientLoad","hostLoad","isSafeInteger","findLast","dur","admission","closePending","pending","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","toLowerCase","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","Registration","gcClients","excess","changed","live","oldest","version","Pick","restored","known","created","attaching","isEphemeral","early","late","admit","statements","earlyAdmission","answers","hello","lateAdmission","abort","resume","suspend","restoreClientRecords","records","ClientRecord","entries","useSocketHost","transport","SocketHost","host","hibernatable","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose","reviveValue","serveStream","serveFrames"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { contextValue, captureContext } from \"../wire/context\";\nimport { MAX_CONTEXT_BYTES } from \"../wire/limits\";\nimport { encodeDocument } from \"../document\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { documentIdentity, getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { reviveValue } from \"../wire/meta\";\nimport { sanitizeValue } from \"../wire/ops\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_EPHEMERAL_DOCUMENT_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireDocument } from \"../document\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype Cmd = StatewireHostInternal.Cmd;\n\ntype WireOp = {\n op: string;\n doc?: number;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireDocument.MetaEntry[];\n protocol?: string;\n key?: readonly string[];\n main?: boolean;\n};\n\ntype Admission = {\n protocol: string;\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\n/** One statement lane: durable lanes live on the client record, ephemeral lanes on the attach. */\ntype Lane = {\n protocol: string;\n clientId: string;\n conn: Conn | null;\n lastSeq: number;\n results: Map<number, { ts: number; cmd: Cmd }>;\n inflight: Map<number, Admission>;\n};\n\nexport type ClientRec = {\n id: string;\n touched: number;\n lanes: Map<string, Lane>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\n// A Conn outlives its socket so an admitted command keeps its attach view.\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n ready: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n authorizedAt: number | undefined;\n leaseTimer: ReturnType<typeof setTimeout> | null;\n timedLease: boolean;\n lanes: Map<string, Lane>;\n contexts: Map<string, Statewire.Context>;\n documents: Map<string, StatewireHost.Document>;\n included: Set<string>;\n onIncludedChange:\n | ((included: readonly StatewireHostInternal.IncludedDocument[]) => void)\n | undefined;\n view: Map<string, { doc: number; value: unknown }>;\n nextDoc: number;\n pendingApplied: Cmd[];\n pendingCmds: Cmd[];\n attach: StatewireHost.Attach;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n cmd: CmdStatement[];\n ctx?: { protocol: string; value: Statewire.Context }[];\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst frameEncoder = new TextEncoder();\n\nexport const parseFrameValue = (frame: unknown): ParsedFrame => {\n if (!isPlainObject(frame)) return violation(\"malformed frame\");\n const keys = Object.keys(frame);\n if (keys.length === 0) return violation(\"malformed frame\");\n const unknown = keys.filter((key) => key !== \"cmd\" && key !== \"ctx\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const lane = frame[\"cmd\"] ?? [];\n if (!Array.isArray(lane)) return violation(\"malformed frame\");\n if (Object.hasOwn(frame, \"cmd\") && lane.length === 0)\n return violation(\"empty lane\");\n if (lane.length > MAX_COMMANDS_PER_FRAME)\n return violation(\"too many commands\");\n const prev = new Map<string, number>();\n const cmd: CmdStatement[] = [];\n for (const statement of lane) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n const method = statement[\"method\"];\n const protocol = statement[\"protocol\"];\n if (\n typeof seq !== \"number\" ||\n !Number.isInteger(seq) ||\n seq < 1 ||\n typeof method !== \"string\" ||\n typeof protocol !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n const last = prev.get(protocol);\n if (last !== undefined && seq !== last + 1)\n return violation(\"malformed frame\");\n prev.set(protocol, seq);\n cmd.push({\n protocol,\n seq,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n const contexts = frame[\"ctx\"];\n const ctx: NonNullable<ParsedFrame[\"ctx\"]> = [];\n if (contexts !== undefined) {\n if (!Array.isArray(contexts) || contexts.length === 0)\n return violation(\"empty context lane\");\n const seen = new Set<string>();\n for (const entry of contexts) {\n if (\n !isPlainObject(entry) ||\n typeof entry[\"protocol\"] !== \"string\" ||\n !Object.hasOwn(entry, \"value\") ||\n Object.keys(entry).some(\n (key) => ![\"protocol\", \"value\", \"meta\"].includes(key),\n )\n )\n return violation(\"malformed context\");\n const protocol = entry[\"protocol\"];\n if (seen.has(protocol)) return violation(\"duplicate context protocol\");\n seen.add(protocol);\n if (\n frameEncoder.encode(JSON.stringify(entry)).byteLength >\n MAX_CONTEXT_BYTES\n )\n return violation(\"context entry too large\");\n try {\n ctx.push({\n protocol,\n value: contextValue({\n value: entry[\"value\"],\n ...(entry[\"meta\"] !== undefined && { meta: entry[\"meta\"] }),\n }),\n });\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n }\n if (cmd.length === 0 && ctx.length === 0) return violation(\"empty frame\");\n return { cmd, ...(ctx.length > 0 && { ctx }) };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireDocument.MetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeDocument(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): Cmd => {\n const at = { protocol: adm.protocol, seq: adm.seq };\n if (outcome.type === \"accepted\") {\n return { ...at, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { ...at, type: \"crashed\" };\n case \"failed\":\n return {\n ...at,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n ...at,\n type: \"rejected\",\n ...(failure.code !== undefined && { code: failure.code }),\n ...(message !== undefined && { message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n console.error(\"statewire command failed\", outcome.error);\n return {\n ...at,\n type: \"failed\",\n message: \"the command failed\",\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length ? parseFrameValue(lanes) : { cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n key: readonly string[] | undefined;\n wireVersion: StatewireProtocol.Range;\n heartbeatMs: number;\n maxLeaseLifetimeMs: number | null;\n leaseTimers: boolean;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, Cmd[]>;\n pendingCmds: Map<string, Cmd[]>;\n viewsDirty: boolean;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst markViews = (h: SocketHostState) => {\n h.viewsDirty = true;\n scheduleFlush(h);\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeDocument(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n h.stateHost.setOnDocuments(() => markViews(h));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n if (conn.leaseTimer !== null) {\n clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n h.current?.detached?.(conn.attach);\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nconst expiredAt = (h: SocketHostState, authorizedAt: number | undefined) => {\n const now = Date.now();\n return (\n authorizedAt === undefined ||\n !Number.isFinite(authorizedAt) ||\n authorizedAt < 0 ||\n authorizedAt > now ||\n (h.maxLeaseLifetimeMs !== null &&\n now - authorizedAt >= h.maxLeaseLifetimeMs)\n );\n};\n\nconst leaseExpiredFin = JSON.stringify({\n fin: { reason: \"reconnect\", code: \"lease-expired\" },\n});\n\nexport const expireLease = (h: SocketHostState, conn: Conn): boolean => {\n if (!conn.open || expiredAt(h, conn.authorizedAt)) {\n if (conn.open) {\n sendTo(h, conn, leaseExpiredFin);\n closeConn(h, conn, 1000, \"lease-expired\");\n }\n return true;\n }\n return false;\n};\n\nconst armLeaseTimer = (h: SocketHostState, conn: Conn) => {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n if (\n h.disposed ||\n h.maxLeaseLifetimeMs === null ||\n expireLease(h, conn) ||\n !conn.timedLease\n )\n return;\n const delay = h.maxLeaseLifetimeMs - (Date.now() - conn.authorizedAt!);\n conn.leaseTimer = setTimeout(\n () => {\n conn.leaseTimer = null;\n if (!expireLease(h, conn)) armLeaseTimer(h, conn);\n },\n Math.min(delay, 2_147_483_647),\n );\n (conn.leaseTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst violate = (h: SocketHostState, conn: Conn, reason: string) => {\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs && !expireLease(h, conn))\n sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst durableLanes = function* (h: SocketHostState) {\n for (const rec of h.clients.values()) yield* rec.lanes.values();\n};\n\nconst allLanes = function* (h: SocketHostState) {\n yield* durableLanes(h);\n for (const conn of h.conns) yield* conn.lanes.values();\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const lane of allLanes(h)) {\n if (lane.inflight.size > 0) return false;\n }\n return true;\n};\n\nconst selects = (conn: Conn, protocol: string) =>\n conn.selection.protocols.some((p) => p.name === protocol);\n\n// ─── views ──────────────────────────────────────────────\n\nconst viewOf = (\n h: SocketHostState,\n conn: Conn,\n): Map<string, StatewireHost.Document> => {\n const view = new Map<string, StatewireHost.Document>();\n const shared = h.stateHost!.documents();\n const hostMain = documentIdentity(h.protocol.name);\n for (const p of conn.selection.protocols) {\n if (p.record === \"ephemeral\") {\n for (const [id, doc] of conn.documents)\n if (doc.protocol === p.name) view.set(id, doc);\n } else {\n for (const [id, doc] of shared) {\n if (\n doc.protocol === p.name &&\n id !== hostMain &&\n (doc.main || conn.included.has(id))\n )\n view.set(id, doc);\n }\n }\n }\n return view;\n};\n\nconst diffView = (h: SocketHostState, conn: Conn): WireOp[] => {\n const current = viewOf(h, conn);\n const ops: WireOp[] = [];\n for (const [id, entry] of conn.view) {\n if (current.has(id)) continue;\n conn.view.delete(id);\n ops.push({ op: \"unmount\", doc: entry.doc });\n }\n for (const [id, doc] of current) {\n const entry = conn.view.get(id);\n if (entry !== undefined && entry.value === doc.value) continue;\n const { value, meta } = encodeDocument(doc.value);\n if (entry === undefined) {\n const number = conn.nextDoc++;\n conn.view.set(id, { doc: number, value: doc.value });\n ops.push({\n op: \"mount\",\n doc: number,\n protocol: doc.protocol,\n ...(doc.key !== null && { key: doc.key }),\n ...(doc.main && { main: true }),\n value,\n ...(meta !== undefined && { meta }),\n });\n } else {\n entry.value = doc.value;\n ops.push({\n op: \"replace\",\n doc: entry.doc,\n path: [],\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n }\n return ops;\n};\n\nconst notifyIncluded = (conn: Conn) =>\n conn.onIncludedChange?.(\n [...conn.included].map(\n (id) => JSON.parse(id) as StatewireHostInternal.IncludedDocument,\n ),\n );\n\nconst restoredIncluded = (\n included: readonly StatewireHostInternal.IncludedDocument[],\n): Set<string> =>\n new Set(\n included.map((entry) => {\n if (\n !Array.isArray(entry) ||\n entry.length !== 2 ||\n typeof entry[0] !== \"string\" ||\n !(\n entry[1] === null ||\n (Array.isArray(entry[1]) &&\n entry[1].every((part) => typeof part === \"string\"))\n )\n )\n throw new TypeError(\"statewire: invalid restored include\");\n return documentIdentity(entry[0], entry[1] ?? undefined);\n }),\n );\n\nconst attachOf = (h: SocketHostState, conn: Conn): StatewireHost.Attach => {\n const requireSelected = (protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined)\n throw new Error(`statewire: protocol ${protocol} was not negotiated`);\n return entry;\n };\n return {\n get caller() {\n return callerOf(h, h.clients.get(conn.clientId)!, conn);\n },\n context: (protocol) => {\n requireSelected(protocol);\n return captureContext(conn.contexts.get(protocol) ?? {});\n },\n document: (protocol, key) => {\n if (key === undefined && protocol === h.protocol.name)\n return h.stateHost!.snapshot();\n const view = viewOf(h, conn);\n if (key !== undefined)\n return view.get(documentIdentity(protocol, key))?.value;\n for (const doc of view.values())\n if (doc.protocol === protocol && doc.main) return doc.value;\n return undefined;\n },\n mount: (protocol, value, key, main = key === undefined) => {\n if (requireSelected(protocol).record !== \"ephemeral\")\n throw new Error(`statewire: protocol ${protocol} is not ephemeral`);\n const encoded = encodeDocument(value);\n if (\n frameEncoder.encode(JSON.stringify(encoded)).byteLength >\n MAX_EPHEMERAL_DOCUMENT_BYTES\n )\n throw new Error(\"statewire: oversized ephemeral document\");\n const id = documentIdentity(protocol, key);\n if (main) {\n for (const [other, doc] of conn.documents) {\n if (doc.protocol === protocol && doc.main && other !== id)\n throw new Error(\n `statewire: ${protocol} already has a main document`,\n );\n }\n }\n conn.documents.set(id, {\n protocol,\n key: key === undefined ? null : [...key],\n main,\n value: sanitizeValue(value),\n });\n markViews(h);\n },\n unmount: (protocol, key) => {\n if (!conn.documents.delete(documentIdentity(protocol, key)))\n throw new Error(\"statewire: document is not mounted\");\n markViews(h);\n },\n include: (protocol, key) => {\n if (requireSelected(protocol).record !== undefined)\n throw new Error(`statewire: protocol ${protocol} is not durable`);\n const id = documentIdentity(protocol, key);\n if (conn.included.has(id)) return;\n conn.included.add(id);\n notifyIncluded(conn);\n markViews(h);\n },\n exclude: (protocol, key) => {\n if (!conn.included.delete(documentIdentity(protocol, key))) return;\n notifyIncluded(conn);\n markViews(h);\n },\n };\n};\n\n// ─── flush ──────────────────────────────────────────────\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const lane of allLanes(h)) {\n for (const adm of lane.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, lane, adm);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n !h.viewsDirty &&\n fin === undefined &&\n !edge &&\n ![...h.conns].some(\n (conn) => conn.pendingApplied.length > 0 || conn.pendingCmds.length > 0,\n )\n ) {\n return;\n }\n h.idleWire = level;\n h.viewsDirty = false;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const mainOps = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // One packet per flush: ops first, then applied entries, then verdicts.\n for (const conn of [...h.conns]) {\n if (!conn.ready || expireLease(h, conn)) continue;\n const forConn = (list: Cmd[] | undefined) =>\n (list ?? []).filter((cmd) => selects(conn, cmd.protocol));\n const ops = [\n ...(selects(conn, h.protocol.name) ? mainOps : []),\n ...diffView(h, conn),\n ];\n const cmd = [\n ...forConn(applied.get(conn.clientId)),\n ...conn.pendingApplied.splice(0),\n ...forConn(cmds.get(conn.clientId)),\n ...conn.pendingCmds.splice(0),\n ];\n if (ops.length > 0) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n ops,\n ...(cmd.length > 0 && { cmd }),\n ...(edge && { idle: level }),\n }),\n );\n } else if (cmd.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, lane: Lane, adm: Admission) => {\n const cmd: Cmd = { protocol: adm.protocol, seq: adm.seq, type: \"applied\" };\n if (lane.conn !== null) lane.conn.pendingApplied.push(cmd);\n else {\n const list = h.pendingApplied.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingApplied.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, lane: Lane, cmd: Cmd) => {\n if (lane.conn !== null) lane.conn.pendingCmds.push(cmd);\n else {\n const list = h.pendingCmds.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n touched: rec.touched,\n lanes: Object.fromEntries(\n [...rec.lanes.values()].map((lane) => [\n lane.protocol,\n {\n lastSeq: admittedThrough(lane),\n results: [...lane.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n },\n ]),\n ),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (lane: Lane, cmd: Cmd) => {\n const now = Date.now();\n lane.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...lane.results.keys());\n for (const [seq, entry] of lane.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n lane.results.delete(seq);\n }\n }\n while (lane.results.size > RESULT_LIMIT) {\n lane.results.delete(Math.min(...lane.results.keys()));\n }\n};\n\n/** Lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (lane: Lane): number =>\n Math.max(lane.lastSeq, ...lane.inflight.keys());\n\nconst watermark = (h: SocketHostState, conn: Conn, protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol)!;\n const lane =\n entry.record === \"ephemeral\"\n ? conn.lanes.get(protocol)\n : h.clients.get(conn.clientId)?.lanes.get(protocol);\n return lane === undefined ? 0 : admittedThrough(lane);\n};\n\nconst laneOf = (h: SocketHostState, conn: Conn, protocol: string): Lane => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined) return violation(\"unsupported protocol\");\n const ephemeral = entry.record === \"ephemeral\";\n const lanes = ephemeral ? conn.lanes : h.clients.get(conn.clientId)!.lanes;\n let lane = lanes.get(protocol);\n if (lane === undefined) {\n lane = {\n protocol,\n clientId: conn.clientId,\n conn: ephemeral ? conn : null,\n lastSeq: 0,\n results: new Map(),\n inflight: new Map(),\n };\n lanes.set(protocol, lane);\n }\n return lane;\n};\n\n// A re-asked seq never re-runs: the stored verdict re-emits, an applied\n// inflight run re-answers applied; one not yet applied answers nothing (its\n// answers ride the stream when ready), an evicted verdict answers expired.\nconst reemit = (h: SocketHostState, lane: Lane, seq: number) => {\n const cached = lane.results.get(seq);\n if (cached) {\n const newest = Math.max(...lane.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, lane, cached.cmd);\n return;\n }\n lane.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = lane.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, lane, adm);\n return;\n }\n queueCmd(h, lane, { protocol: lane.protocol, seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n cmd: Cmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n lane.inflight.delete(adm.seq);\n retain(lane, cmd);\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, lane, cmd);\n if (lane.conn === null) notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, lane, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n conn: Conn,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth: conn.auth,\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n lane: Lane,\n conn: Conn,\n statement: CmdStatement,\n) => {\n const rec = h.clients.get(conn.clientId)!;\n const adm: Admission = {\n protocol: statement.protocol,\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n lane.inflight.set(statement.seq, adm);\n if (lane.conn === null) notifyClientRecords(h);\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, lane, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n lane,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, lane, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"result\",\n payload: names,\n });\n return;\n }\n // Subprotocol methods are registered under their full wire name.\n const method =\n statement.protocol === h.protocol.name\n ? statement.method\n : `${statement.protocol}/${statement.method}`;\n h.commandsHost!.submit!({\n method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, conn),\n attach: conn.attach,\n context: captureContext(conn.contexts.get(statement.protocol) ?? {}),\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n if (lane.conn === null) notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, lane, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, lane, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, every lane: absorbed statements answer from their lane,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating every lane's watermark, nothing consumed. A durable gap is\n// never a close; an ephemeral gap is a violation (the lane has no replay).\nexport type FrameAdmission =\n | { type: \"ok\" }\n | { type: \"expired\" }\n | {\n type: \"refused\";\n syn: {\n syn: { protocols: { name: string; seq: number }[]; retry?: number };\n };\n };\n\nconst refusal = (\n h: SocketHostState,\n conn: Conn,\n retry?: number,\n): FrameAdmission => ({\n type: \"refused\",\n syn: {\n syn: {\n protocols: conn.selection.protocols.map((p) => ({\n name: p.name,\n seq: watermark(h, conn, p.name),\n })),\n ...(retry !== undefined && { retry }),\n },\n },\n});\n\nconst validateContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const statement of frame.cmd) {\n if (!selects(conn, statement.protocol))\n return violation(\"unsupported protocol\");\n const selected = conn.selection.protocols.find(\n (p) => p.name === statement.protocol,\n )!;\n if (selected.record === \"ephemeral\") {\n const through = watermark(h, conn, statement.protocol);\n const first = frame.cmd.find(\n (s) => s.protocol === statement.protocol && s.seq > through,\n );\n if (first && first.seq !== through + 1)\n return violation(\"ephemeral lane gap\");\n }\n }\n for (const entry of frame.ctx ?? []) {\n if (!selects(conn, entry.protocol))\n return violation(\"unsupported context protocol\");\n try {\n h.current?.validateContext?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n};\n\nconst installContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const entry of frame.ctx ?? [])\n conn.contexts.set(entry.protocol, captureContext(entry.value));\n for (const entry of frame.ctx ?? [])\n h.current?.contextChanged?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n};\n\nexport const admitFrame = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n): FrameAdmission => {\n if (expireLease(h, conn)) return { type: \"expired\" };\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n const rec = h.clients.get(conn.clientId)!;\n rec.touched = Date.now();\n const lanes = new Map(\n frame.cmd.map((s) => [s.protocol, laneOf(h, conn, s.protocol)]),\n );\n const through = new Map(\n [...lanes].map(([protocol, lane]) => [protocol, admittedThrough(lane)]),\n );\n const fresh = frame.cmd.filter((s) => s.seq > through.get(s.protocol)!);\n for (const s of frame.cmd) {\n if (s.seq <= through.get(s.protocol)!)\n reemit(h, lanes.get(s.protocol)!, s.seq);\n }\n let durableNew = 0;\n for (const [protocol, lane] of lanes) {\n const first = fresh.find((s) => s.protocol === protocol);\n if (first === undefined) continue;\n if (first.seq !== through.get(protocol)! + 1) {\n if (lane.conn !== null) return violation(\"ephemeral lane gap\");\n notifyClientRecords(h);\n return refusal(h, conn);\n }\n if (lane.conn === null)\n durableNew += fresh.filter((s) => s.protocol === protocol).length;\n }\n if (durableNew > 0) {\n let clientLoad = 0;\n for (const lane of rec.lanes.values()) clientLoad += lane.inflight.size;\n let hostLoad = 0;\n for (const lane of durableLanes(h)) hostLoad += lane.inflight.size;\n if (\n clientLoad + durableNew > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostLoad + durableNew > h.maxInflightCommands\n ) {\n return refusal(h, conn, COMMAND_CAPACITY_RETRY_MS);\n }\n }\n if (fresh.length > 0 && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return refusal(h, conn, retry);\n }\n }\n if (expireLease(h, conn)) return { type: \"expired\" };\n for (const s of fresh) admitCmd(h, lanes.get(s.protocol)!, conn, s);\n for (const [protocol, lane] of lanes) {\n const last = fresh.findLast((s) => s.protocol === protocol);\n // Memory host: admitted means retained — dur rides the admitting flush.\n if (last !== undefined && lane.conn === null)\n queueCmd(h, lane, { protocol, seq: last.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null || expireLease(h, conn))\n return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n if (data === \"{}\") {\n if (conn.sawFrame) sendTo(h, conn, \"{}\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let admission: ReturnType<typeof admitFrame>;\n try {\n const frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n if (frame.cmd.length === 0 && !frame.ctx?.length) return;\n admission = admitFrame(h, conn, frame);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n if (expiredAt(h, options.authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1000, \"lease-expired\");\n } catch {\n /* peer already gone */\n }\n return null;\n }\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n undefined,\n options.authorizedAt,\n { ...options, timedLease: h.leaseTimers },\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const authorizedAt = Date.now();\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection, authorizedAt);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n let registration: Registration | null;\n try {\n registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n frame,\n authorizedAt,\n {\n timedLease: h.leaseTimers,\n ...(options.onIncludedChange !== undefined && {\n onIncludedChange: options.onIncludedChange,\n }),\n },\n );\n } catch (error) {\n if (violationReason(error) === null) throw error;\n return;\n }\n if (registration === null) return;\n pending.connection = registration.connection;\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (\n live.has(rec.id) ||\n [...rec.lanes.values()].some((lane) => lane.inflight.size > 0)\n )\n continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\n/**\n * Attach a socket: ephemeral-lane statements of the attach frame are admitted\n * before the snapshot (their documents and answers ride the hello), durable\n * ones after it. A violation in the attach frame closes the attach and throws.\n */\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n frame: ParsedFrame = { cmd: [] },\n authorizedAt?: number,\n included: Pick<\n StatewireHostInternal.SocketConnectOptions,\n \"included\" | \"onIncludedChange\"\n > & { timedLease?: boolean } = {},\n): Registration | null => {\n const restored = restoredIncluded(included.included ?? []);\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n if (expiredAt(h, authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"lease-expired\");\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n touched: Date.now(),\n lanes: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n ready: false,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n authorizedAt,\n leaseTimer: null,\n timedLease: included.timedLease ?? true,\n lanes: new Map(),\n contexts: new Map(),\n documents: new Map(),\n included: restored,\n onIncludedChange: included.onIncludedChange,\n view: new Map(),\n nextDoc: 1,\n pendingApplied: [],\n pendingCmds: [],\n attach: undefined!,\n };\n conn.attach = attachOf(h, conn);\n h.conns.add(conn);\n try {\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n h.current?.attaching?.(conn.attach);\n } catch (error) {\n const reason = violationReason(error);\n if (reason !== null) violate(h, conn, reason);\n else closeConn(h, conn, 1011, \"attach failed\");\n throw error;\n }\n gcClients(h);\n ensureHeartbeat(h);\n armLeaseTimer(h, conn);\n if (!conn.open) return null;\n const isEphemeral = (s: CmdStatement) =>\n selection.protocols.find((p) => p.name === s.protocol)?.record ===\n \"ephemeral\";\n const early = frame.cmd.filter(isEphemeral);\n const late = frame.cmd.filter((s) => !isEphemeral(s));\n const admit = (statements: CmdStatement[]) => {\n if (statements.length === 0) return null;\n try {\n return admitFrame(h, conn, { cmd: statements });\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n throw error;\n }\n };\n const earlyAdmission = admit(early);\n if (early.length > 0) flush(h);\n notifyClientRecords(h);\n if (expireLease(h, conn)) return null;\n const ops: WireOp[] = [];\n if (selects(conn, h.protocol.name)) {\n const { value, meta } = encodeDocument(h.stateHost!.snapshot());\n ops.push({\n op: \"mount\",\n protocol: h.protocol.name,\n ...(h.key !== undefined && { key: h.key }),\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n ops.push(...diffView(h, conn));\n const answers = [\n ...conn.pendingApplied.splice(0),\n ...conn.pendingCmds.splice(0),\n ];\n const hello = {\n ops,\n syn: {\n version: selection.version,\n protocols: selection.protocols.map((p) => ({\n ...p,\n seq: p.record === \"ephemeral\" ? 0 : watermark(h, conn, p.name),\n })),\n ...(h.idleWire && { idle: true }),\n },\n ...(answers.length > 0 && { cmd: answers }),\n };\n conn.ready = true;\n sendTo(h, conn, JSON.stringify(hello));\n if (earlyAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(earlyAdmission.syn));\n const lateAdmission = admit(late);\n if (lateAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(lateAdmission.syn));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n h.stateHost?.setOnDocuments(() => markViews(h));\n for (const conn of h.conns) armLeaseTimer(h, conn);\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n for (const conn of h.conns) {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n id: record.id,\n touched: record.touched,\n lanes: new Map(\n Object.entries(record.lanes).map(([protocol, lane]) => [\n protocol,\n {\n protocol,\n clientId: record.id,\n conn: null,\n lastSeq: lane.lastSeq,\n results: new Map(\n lane.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n ),\n principal: record.principal,\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: WIRE_VERSION },\n key: undefined,\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n maxLeaseLifetimeMs: 86_400_000,\n leaseTimers: persistence?.hibernatable !== true,\n wsInitTimeoutMs: 5_000,\n maxSubscribers: MAX_SUBSCRIBERS,\n maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,\n streamQueueSize: STREAM_QUEUE_SIZE,\n clientRecordLimit: CLIENT_RECORD_LIMIT,\n finOnIdle: false,\n pushback: undefined,\n authorize: undefined,\n clients: restoreClientRecords(persistence?.clientRecords),\n conns: new Set(),\n pendingConns: new Set(),\n pendingOps: [],\n pendingApplied: new Map(),\n pendingCmds: new Map(),\n viewsDirty: false,\n idleWire: true,\n finished: null,\n disposed: false,\n flushScheduled: false,\n heartbeatTimer: null,\n stateHost: null,\n commandsHost: null,\n current: null,\n persistence,\n post: createMacrotaskPoster(() => {\n host.flushScheduled = false;\n flush(host);\n }),\n connect: (clientId, socket, connectOptions) =>\n connect(host, clientId, socket, connectOptions),\n finish: (fin) => finish(host, fin),\n stream: (request) => serveStream(host, request),\n frames: (request) => serveFrames(host, request),\n };\n return host;\n });\n h.protocol = options?.protocol ?? {\n name: DEFAULT_PROTOCOL,\n version: WIRE_VERSION,\n };\n h.key = options?.key;\n h.wireVersion = options?.wireVersion ?? { version: WIRE_VERSION };\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n const maxLeaseLifetimeMs =\n options?.maxLeaseLifetimeMs === undefined\n ? 86_400_000\n : options.maxLeaseLifetimeMs;\n if (\n maxLeaseLifetimeMs !== null &&\n (!Number.isFinite(maxLeaseLifetimeMs) || maxLeaseLifetimeMs <= 0)\n ) {\n throw new TypeError(\n \"maxLeaseLifetimeMs must be finite and positive or null\",\n );\n }\n if (h.maxLeaseLifetimeMs !== maxLeaseLifetimeMs) {\n h.maxLeaseLifetimeMs = maxLeaseLifetimeMs;\n for (const conn of [...h.conns]) armLeaseTimer(h, conn);\n }\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * per-protocol statement lanes under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id (durable lanes) or the\n * admitting attach (ephemeral lanes), per-attach document views, idle edges,\n * and `fin` on finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":"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"}
@@ -69,6 +69,8 @@ export declare namespace StatewireHostInternal {
69
69
  type SocketHostPersistence = {
70
70
  clientRecords?: readonly ClientRecord[];
71
71
  onClientRecordsChange?: (records: readonly ClientRecord[]) => void;
72
+ /** The adapter can evict the host while its WebSockets stay open: their leases arm no timer and are checked on every message, delivery and restore instead. */
73
+ hibernatable?: boolean;
72
74
  };
73
75
  type SocketHostOptions<TAuth = unknown> = {
74
76
  protocol?: StatewireProtocol.Definition;
@@ -1 +1 @@
1
- {"version":3,"file":"host-internal.d.ts","sourceRoot":"","sources":["../src/host-internal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"host-internal.d.ts","sourceRoot":"","sources":["../src/host-internal.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "statewire",
3
- "version": "0.22.0",
3
+ "version": "0.22.1",
4
4
  "description": "State over the wire: snapshot-first delta streaming and command submission for any state and any command",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -130,6 +130,7 @@ export type Conn = {
130
130
  auth: unknown;
131
131
  authorizedAt: number | undefined;
132
132
  leaseTimer: ReturnType<typeof setTimeout> | null;
133
+ timedLease: boolean;
133
134
  lanes: Map<string, Lane>;
134
135
  contexts: Map<string, Statewire.Context>;
135
136
  documents: Map<string, StatewireHost.Document>;
@@ -360,6 +361,7 @@ export type SocketHostState = {
360
361
  wireVersion: StatewireProtocol.Range;
361
362
  heartbeatMs: number;
362
363
  maxLeaseLifetimeMs: number | null;
364
+ leaseTimers: boolean;
363
365
  wsInitTimeoutMs: number;
364
366
  maxSubscribers: number;
365
367
  maxInflightCommands: number;
@@ -511,7 +513,12 @@ export const expireLease = (h: SocketHostState, conn: Conn): boolean => {
511
513
  const armLeaseTimer = (h: SocketHostState, conn: Conn) => {
512
514
  if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);
513
515
  conn.leaseTimer = null;
514
- if (h.disposed || h.maxLeaseLifetimeMs === null || expireLease(h, conn))
516
+ if (
517
+ h.disposed ||
518
+ h.maxLeaseLifetimeMs === null ||
519
+ expireLease(h, conn) ||
520
+ !conn.timedLease
521
+ )
515
522
  return;
516
523
  const delay = h.maxLeaseLifetimeMs - (Date.now() - conn.authorizedAt!);
517
524
  conn.leaseTimer = setTimeout(
@@ -543,7 +550,8 @@ const ensureHeartbeat = (h: SocketHostState) => {
543
550
  h.heartbeatTimer = setInterval(() => {
544
551
  const now = Date.now();
545
552
  for (const conn of [...h.conns]) {
546
- if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, "{}");
553
+ if (now - conn.lastSentAt >= h.heartbeatMs && !expireLease(h, conn))
554
+ sendTo(h, conn, "{}");
547
555
  }
548
556
  }, h.heartbeatMs);
549
557
  (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();
@@ -785,7 +793,7 @@ export const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {
785
793
  h.pendingCmds = new Map();
786
794
  // One packet per flush: ops first, then applied entries, then verdicts.
787
795
  for (const conn of [...h.conns]) {
788
- if (!conn.ready) continue;
796
+ if (!conn.ready || expireLease(h, conn)) continue;
789
797
  const forConn = (list: Cmd[] | undefined) =>
790
798
  (list ?? []).filter((cmd) => selects(conn, cmd.protocol));
791
799
  const ops = [
@@ -1377,7 +1385,7 @@ const connectAuthorized = (
1377
1385
  options.selection,
1378
1386
  undefined,
1379
1387
  options.authorizedAt,
1380
- options,
1388
+ { ...options, timedLease: h.leaseTimers },
1381
1389
  );
1382
1390
  return registration?.connection ?? null;
1383
1391
  }
@@ -1531,9 +1539,12 @@ const connectAuthorized = (
1531
1539
  selection,
1532
1540
  frame,
1533
1541
  authorizedAt,
1534
- options.onIncludedChange === undefined
1535
- ? {}
1536
- : { onIncludedChange: options.onIncludedChange },
1542
+ {
1543
+ timedLease: h.leaseTimers,
1544
+ ...(options.onIncludedChange !== undefined && {
1545
+ onIncludedChange: options.onIncludedChange,
1546
+ }),
1547
+ },
1537
1548
  );
1538
1549
  } catch (error) {
1539
1550
  if (violationReason(error) === null) throw error;
@@ -1600,7 +1611,7 @@ export const register = (
1600
1611
  included: Pick<
1601
1612
  StatewireHostInternal.SocketConnectOptions,
1602
1613
  "included" | "onIncludedChange"
1603
- > = {},
1614
+ > & { timedLease?: boolean } = {},
1604
1615
  ): Registration | null => {
1605
1616
  const restored = restoredIncluded(included.included ?? []);
1606
1617
  const refuse = (code: number, reason: string) => {
@@ -1676,6 +1687,7 @@ export const register = (
1676
1687
  auth,
1677
1688
  authorizedAt,
1678
1689
  leaseTimer: null,
1690
+ timedLease: included.timedLease ?? true,
1679
1691
  lanes: new Map(),
1680
1692
  contexts: new Map(),
1681
1693
  documents: new Map(),
@@ -1858,6 +1870,7 @@ const useSocketHost = (
1858
1870
  wireVersion: { version: WIRE_VERSION },
1859
1871
  heartbeatMs: 15_000,
1860
1872
  maxLeaseLifetimeMs: 86_400_000,
1873
+ leaseTimers: persistence?.hibernatable !== true,
1861
1874
  wsInitTimeoutMs: 5_000,
1862
1875
  maxSubscribers: MAX_SUBSCRIBERS,
1863
1876
  maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,
@@ -86,6 +86,8 @@ export namespace StatewireHostInternal {
86
86
  export type SocketHostPersistence = {
87
87
  clientRecords?: readonly ClientRecord[];
88
88
  onClientRecordsChange?: (records: readonly ClientRecord[]) => void;
89
+ /** The adapter can evict the host while its WebSockets stay open: their leases arm no timer and are checked on every message, delivery and restore instead. */
90
+ hibernatable?: boolean;
89
91
  };
90
92
 
91
93
  export type SocketHostOptions<TAuth = unknown> = {