statewire 0.20.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/client/changes.d.ts +3 -6
  2. package/dist/client/changes.d.ts.map +1 -1
  3. package/dist/client/changes.js +1 -2
  4. package/dist/client/connection.d.ts +80 -83
  5. package/dist/client/connection.d.ts.map +1 -1
  6. package/dist/client/connection.js +20 -7
  7. package/dist/client/connection.js.map +1 -1
  8. package/dist/client/core.d.ts +39 -41
  9. package/dist/client/core.d.ts.map +1 -1
  10. package/dist/client/core.js +2 -3
  11. package/dist/client/session.d.ts +93 -93
  12. package/dist/client/session.d.ts.map +1 -1
  13. package/dist/client/session.js +47 -23
  14. package/dist/client/session.js.map +1 -1
  15. package/dist/client/sessionStore.d.ts +11 -14
  16. package/dist/client/sessionStore.d.ts.map +1 -1
  17. package/dist/client/sessionStore.js +1 -2
  18. package/dist/client/storageError.d.ts +2 -5
  19. package/dist/client/storageError.d.ts.map +1 -1
  20. package/dist/client/storageError.js +1 -2
  21. package/dist/client/timing.d.ts +11 -14
  22. package/dist/client/timing.d.ts.map +1 -1
  23. package/dist/client/timing.js +1 -2
  24. package/dist/document.d.ts +17 -20
  25. package/dist/document.d.ts.map +1 -1
  26. package/dist/document.js +1 -2
  27. package/dist/host/adapter.d.ts +4 -7
  28. package/dist/host/adapter.d.ts.map +1 -1
  29. package/dist/host/adapter.js +1 -2
  30. package/dist/host/draft.d.ts +13 -16
  31. package/dist/host/draft.d.ts.map +1 -1
  32. package/dist/host/draft.js +1 -2
  33. package/dist/host/engine.d.ts +7 -10
  34. package/dist/host/engine.d.ts.map +1 -1
  35. package/dist/host/engine.js +1 -2
  36. package/dist/host/host.d.ts +42 -45
  37. package/dist/host/host.d.ts.map +1 -1
  38. package/dist/host/host.js +15 -13
  39. package/dist/host/host.js.map +1 -1
  40. package/dist/host/http.d.ts +4 -7
  41. package/dist/host/http.d.ts.map +1 -1
  42. package/dist/host/http.js +15 -11
  43. package/dist/host/http.js.map +1 -1
  44. package/dist/host/socket.d.ts +145 -140
  45. package/dist/host/socket.d.ts.map +1 -1
  46. package/dist/host/socket.js +99 -17
  47. package/dist/host/socket.js.map +1 -1
  48. package/dist/host/synced.d.ts +3 -6
  49. package/dist/host/synced.d.ts.map +1 -1
  50. package/dist/host/synced.js +1 -2
  51. package/dist/host/work.d.ts +2 -5
  52. package/dist/host/work.d.ts.map +1 -1
  53. package/dist/host/work.js +1 -2
  54. package/dist/host-internal.d.ts +99 -90
  55. package/dist/host-internal.d.ts.map +1 -1
  56. package/dist/host.d.ts +90 -91
  57. package/dist/host.d.ts.map +1 -1
  58. package/dist/index.d.ts +11 -8
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +1 -1
  61. package/dist/statewire.d.ts +265 -268
  62. package/dist/statewire.d.ts.map +1 -1
  63. package/dist/statewire.js +7 -7
  64. package/dist/statewire.js.map +1 -1
  65. package/dist/storage.d.ts +23 -26
  66. package/dist/storage.d.ts.map +1 -1
  67. package/dist/storage.js +1 -2
  68. package/dist/transports/fake-sse.d.ts +7 -10
  69. package/dist/transports/fake-sse.d.ts.map +1 -1
  70. package/dist/transports/fake-sse.js +1 -2
  71. package/dist/transports/fixtures.d.ts +19 -25
  72. package/dist/transports/fixtures.d.ts.map +1 -1
  73. package/dist/transports/fixtures.js +1 -2
  74. package/dist/transports/remote.d.ts +8 -11
  75. package/dist/transports/remote.d.ts.map +1 -1
  76. package/dist/transports/remote.js +1 -2
  77. package/dist/transports/sse-parser.d.ts +1 -4
  78. package/dist/transports/sse-parser.d.ts.map +1 -1
  79. package/dist/transports/sse-parser.js +1 -2
  80. package/dist/transports/sse.d.ts +50 -52
  81. package/dist/transports/sse.d.ts.map +1 -1
  82. package/dist/transports/sse.js +9 -3
  83. package/dist/transports/sse.js.map +1 -1
  84. package/dist/transports/testing.d.ts +31 -34
  85. package/dist/transports/testing.d.ts.map +1 -1
  86. package/dist/transports/testing.js +1 -2
  87. package/dist/transports/ws.d.ts +5 -7
  88. package/dist/transports/ws.d.ts.map +1 -1
  89. package/dist/transports/ws.js +3 -4
  90. package/dist/transports/ws.js.map +1 -1
  91. package/dist/types.d.ts +81 -78
  92. package/dist/types.d.ts.map +1 -1
  93. package/dist/types.js +1 -2
  94. package/dist/util/draftTraps.d.ts +2 -4
  95. package/dist/util/draftTraps.d.ts.map +1 -1
  96. package/dist/util/draftTraps.js +1 -2
  97. package/dist/util/macrotask.d.ts +1 -4
  98. package/dist/util/macrotask.d.ts.map +1 -1
  99. package/dist/util/macrotask.js +1 -2
  100. package/dist/util/methodProxy.d.ts +1 -4
  101. package/dist/util/methodProxy.d.ts.map +1 -1
  102. package/dist/util/methodProxy.js +1 -2
  103. package/dist/util/randomId.d.ts +1 -4
  104. package/dist/util/randomId.d.ts.map +1 -1
  105. package/dist/util/randomId.js +1 -2
  106. package/dist/util/recordMutations.d.ts +5 -7
  107. package/dist/util/recordMutations.d.ts.map +1 -1
  108. package/dist/util/recordMutations.js +1 -2
  109. package/dist/util/statePath.d.ts +9 -12
  110. package/dist/util/statePath.d.ts.map +1 -1
  111. package/dist/util/statePath.js +1 -2
  112. package/dist/wire/context.d.ts +7 -12
  113. package/dist/wire/context.d.ts.map +1 -1
  114. package/dist/wire/context.js +2 -3
  115. package/dist/wire/documents.d.ts +36 -39
  116. package/dist/wire/documents.d.ts.map +1 -1
  117. package/dist/wire/documents.js +2 -3
  118. package/dist/wire/documents.js.map +1 -1
  119. package/dist/wire/limits.d.ts +7 -10
  120. package/dist/wire/limits.d.ts.map +1 -1
  121. package/dist/wire/limits.js +1 -2
  122. package/dist/wire/meta.d.ts +9 -11
  123. package/dist/wire/meta.d.ts.map +1 -1
  124. package/dist/wire/meta.js +1 -2
  125. package/dist/wire/meta.js.map +1 -1
  126. package/dist/wire/ops.d.ts +9 -12
  127. package/dist/wire/ops.d.ts.map +1 -1
  128. package/dist/wire/ops.js +1 -2
  129. package/dist/wire/protocol.d.ts +53 -56
  130. package/dist/wire/protocol.d.ts.map +1 -1
  131. package/dist/wire/protocol.js +1 -2
  132. package/dist/wire/version.d.ts +1 -4
  133. package/dist/wire/version.d.ts.map +1 -1
  134. package/dist/wire/version.js +1 -2
  135. package/package.json +6 -6
  136. package/src/client/connection.ts +25 -15
  137. package/src/client/session.ts +54 -15
  138. package/src/host/host.ts +9 -3
  139. package/src/host/http.ts +37 -5
  140. package/src/host/socket.ts +158 -9
  141. package/src/host-internal.ts +14 -0
  142. package/src/statewire.ts +11 -6
  143. package/src/transports/sse.ts +12 -0
@@ -1 +1 @@
1
- {"version":3,"file":"sse.js","names":["StatewireDocument","flushTapSync","resource","ResourceElement","createSseParser","timing","settleFin","classify","handleEnvelope","resolveHeaders","useLink","validateRefusalSyn","AttemptOutcome","Conn","StatewireCmd","StatewireEnvelope","StatewireSyn","Statewire","StatewireClient","StatewireHost","useStatewireRemote","negotiationHeaders","parseNegotiation","StatewireFrame","ctx","protocol","Encoded","cmd","method","params","meta","seq","StatewireRemoteProps","beforeAttach","Promise","clientId","takeAttachLanes","onHello","args","ops","syn","onOps","cmds","onCmds","onRefusal","onIdle","level","onDetach","onFinish","Fin","StatewireSubmitResult","type","ConnectionState","RemoteLink","storageFailed","error","Error","connection","Connection","parked","send","frame","LEASE_HEADER","baseUrl","options","HttpOptions","url","replace","withExtra","headers","Headers","extra","Record","merged","name","value","Object","entries","set","timedFetch","input","init","RequestInit","signal","AbortSignal","timeout","Response","fetch","globalThis","consume","c","reader","ReadableStreamDefaultReader","Uint8Array","heartbeat","AbortController","dead","decoder","TextDecoder","parse","timer","setTimeout","abort","heartbeatTimeoutMs","result","ReadableStreamReadResult","read","clearTimeout","done","data","decode","stream","env","JSON","attemptStream","persistence","aborted","lease","authStale","has","negotiation","lanes","body","undefined","stringify","headerTimer","res","accept","cache","any","ok","clone","json","catch","fin","httpFin","get","getReader","cancel","addEventListener","once","removeEventListener","postFrame","lifetime","retryAfterMs","header","trim","test","retry","Number","isSafeInteger","reason","status","message","code","refusalSyn","sendFrame","headerRetry","useSseLink","attemptOnce","SyntaxError","startsWith","useStatewireHttp","StatewireHttp","Commands","TState","TCommands"],"sources":["../../src/transports/sse.ts"],"sourcesContent":["import type { StatewireDocument } from \"../document\";\nimport { flushTapSync, resource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { createSseParser } from \"./sse-parser\";\nimport { timing } from \"../client/timing\";\nimport {\n settleFin,\n classify,\n handleEnvelope,\n resolveHeaders,\n useLink,\n validateRefusalSyn,\n} from \"../client/connection\";\nimport type {\n AttemptOutcome,\n Conn,\n StatewireCmd,\n StatewireEnvelope,\n StatewireSyn,\n} from \"../client/connection\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireClient } from \"../statewire\";\nimport type { StatewireHost } from \"../host\";\nimport { useStatewireRemote } from \"./remote\";\nimport { negotiationHeaders, parseNegotiation } from \"../wire/protocol\";\n\n/** A client frame's lanes: stamped statements, strictly consecutive per lane. */\nexport type StatewireFrame = {\n ctx?: ({ protocol: string } & StatewireDocument.Encoded)[];\n cmd?: {\n protocol: string;\n method: string;\n params: unknown[];\n meta?: unknown;\n seq: number;\n }[];\n};\n\nexport type StatewireRemoteProps = {\n beforeAttach?: () => void | Promise<void>;\n clientId: string;\n /** Lanes to ride the attach frame: ephemeral-lane statements, plus durable cmds on no-lease supersession; records the included entries. */\n takeAttachLanes: () => StatewireFrame | null;\n onHello: (args: { ops: unknown[]; syn: StatewireSyn }) => void;\n onOps: (args: { ops: unknown[]; cmds: StatewireCmd[] }) => void;\n onCmds: (cmds: StatewireCmd[]) => void;\n onRefusal: (syn: StatewireSyn) => void;\n onIdle: (level: boolean) => void;\n onDetach: () => void;\n onFinish: (args: StatewireHost.Fin) => void;\n};\n\nexport type StatewireSubmitResult =\n | { type: \"ok\" }\n | { type: \"refusal\"; syn: StatewireSyn }\n | { type: \"stale-lease\" }\n | { type: \"no-lease\" };\n\nexport type ConnectionState = StatewireClient.ConnectionState;\n\n/** The live wire a remote session drives: connection status plus frame submission. */\nexport type RemoteLink = {\n storageFailed: (error: Error) => void;\n connection: StatewireClient.Connection;\n /** A deferred first attach still waiting; `reconnect()` releases it. */\n parked: boolean;\n send: (frame: StatewireFrame) => Promise<StatewireSubmitResult>;\n};\n\nconst LEASE_HEADER = \"Statewire-Lease\";\n\nconst baseUrl = (options: StatewireClient.HttpOptions) =>\n options.url.replace(/\\/$/, \"\");\n\nconst withExtra = (headers: Headers, extra: Record<string, string>) => {\n const merged = new Headers(headers);\n for (const [name, value] of Object.entries(extra)) merged.set(name, value);\n return merged;\n};\n\nconst timedFetch = async (\n options: StatewireClient.HttpOptions,\n input: string,\n init: RequestInit & { signal: AbortSignal },\n timeout: AbortSignal,\n): Promise<Response> => {\n try {\n return await (options.fetch ?? globalThis.fetch)(input, init);\n } catch {\n throw classify(timeout);\n }\n};\n\nconst consume = async (\n c: Conn,\n reader: ReadableStreamDefaultReader<Uint8Array>,\n heartbeat: AbortController,\n dead: () => boolean,\n): Promise<AttemptOutcome> => {\n const decoder = new TextDecoder();\n const parse = createSseParser();\n for (;;) {\n const timer = setTimeout(\n () => heartbeat.abort(),\n timing.heartbeatTimeoutMs,\n );\n let result: ReadableStreamReadResult<Uint8Array>;\n try {\n result = await reader.read();\n } catch {\n throw classify(heartbeat.signal);\n } finally {\n clearTimeout(timer);\n }\n if (result.done) return \"ended\";\n for (const data of parse(decoder.decode(result.value, { stream: true }))) {\n if (dead()) return \"ended\";\n const env = JSON.parse(data) as StatewireEnvelope;\n const done = flushTapSync(() => handleEnvelope(c, env));\n if (done) return done;\n }\n }\n};\n\nconst attemptStream = async (\n c: Conn,\n options: StatewireClient.HttpOptions,\n abort: AbortController,\n): Promise<AttemptOutcome> => {\n const persistence = c.ctx.beforeAttach?.();\n if (persistence) await persistence;\n if (abort.signal.aborted) return \"ended\";\n c.lease = null;\n const headers = await resolveHeaders(options.headers, c.authStale);\n for (const [name, value] of Object.entries(negotiationHeaders(options))) {\n if (!headers.has(name)) headers.set(name, value);\n }\n c.negotiation = parseNegotiation(headers);\n c.authStale = false;\n const lanes = flushTapSync(() => c.ctx.takeAttachLanes());\n const body = lanes === null ? undefined : JSON.stringify(lanes);\n const heartbeat = new AbortController();\n const headerTimer = setTimeout(\n () => heartbeat.abort(),\n timing.heartbeatTimeoutMs,\n );\n let res: Response;\n try {\n res = await timedFetch(\n options,\n `${baseUrl(options)}/stream`,\n {\n method: body === undefined ? \"GET\" : \"POST\",\n headers: withExtra(headers, {\n \"content-type\": \"application/json\",\n \"Statewire-Client-Id\": c.ctx.clientId,\n accept: \"text/event-stream\",\n }),\n ...(body === undefined ? {} : { body }),\n cache: \"no-store\",\n signal: AbortSignal.any([abort.signal, heartbeat.signal]),\n },\n heartbeat.signal,\n );\n } finally {\n clearTimeout(headerTimer);\n }\n if (!res.ok) {\n const body = await res\n .clone()\n .json()\n .catch(() => null);\n return (\n flushTapSync(() =>\n body?.fin === undefined\n ? settleFin(c, httpFin(res))\n : handleEnvelope(c, body),\n ) ?? \"stop\"\n );\n }\n if (!res.body)\n throw new Error(\"statewire: protocol error: stream response has no body\");\n c.lease = res.headers.get(LEASE_HEADER);\n const reader = res.body.getReader();\n const cancel = () => {\n void reader.cancel().catch(() => {});\n };\n abort.signal.addEventListener(\"abort\", cancel, { once: true });\n try {\n return await consume(c, reader, heartbeat, () => abort.signal.aborted);\n } finally {\n abort.signal.removeEventListener(\"abort\", cancel);\n reader.cancel().catch(() => {});\n }\n};\n\nconst postFrame = async (\n c: Conn,\n options: StatewireClient.HttpOptions,\n lease: string,\n frame: StatewireFrame,\n timeout: AbortSignal,\n): Promise<Response> =>\n timedFetch(\n options,\n `${baseUrl(options)}/frames`,\n {\n method: \"POST\",\n headers: withExtra(new Headers(), {\n \"content-type\": \"application/json\",\n [LEASE_HEADER]: lease,\n }),\n body: JSON.stringify(frame),\n signal: AbortSignal.any([\n c.lifetime?.signal ?? AbortSignal.abort(),\n timeout,\n ]),\n },\n timeout,\n );\n\n// Delta-seconds only; anything else reads as absent.\nconst retryAfterMs = (res: Response): number | null => {\n const header = res.headers.get(\"retry-after\")?.trim();\n if (header === undefined || !/^\\d+$/.test(header)) return null;\n const retry = Number(header) * 1000;\n return Number.isSafeInteger(retry) ? retry : null;\n};\n\nconst httpFin = (res: Response): StatewireHost.Fin => ({\n reason:\n res.status === 401\n ? \"unauthorized\"\n : res.status === 403\n ? \"forbidden\"\n : res.status === 429 || res.status === 503\n ? \"reconnect\"\n : res.status >= 400 && res.status < 500\n ? \"protocol-error\"\n : \"error\",\n status: res.status,\n message: `HTTP ${res.status}`,\n ...(res.status === 429 || res.status === 503 ? { code: \"overloaded\" } : {}),\n ...(retryAfterMs(res) !== null ? { retry: retryAfterMs(res)! } : {}),\n});\n\nconst refusalSyn = async (res: Response): Promise<StatewireSyn> => {\n const body = (await res.json().catch(() => null)) as {\n syn?: StatewireSyn;\n } | null;\n const syn = body?.syn;\n if (typeof syn !== \"object\" || syn === null) {\n throw new Error(`HTTP ${res.status}`);\n }\n return validateRefusalSyn(syn);\n};\n\nconst sendFrame = async (\n c: Conn,\n options: StatewireClient.HttpOptions,\n frame: StatewireFrame,\n): Promise<StatewireSubmitResult> => {\n const lease = c.lease;\n if (lease === null) return { type: \"no-lease\" };\n const timeout = AbortSignal.timeout(timing.heartbeatTimeoutMs);\n const res = await postFrame(c, options, lease, frame, timeout);\n if (res.ok) return { type: \"ok\" };\n if (res.status === 429 || res.status === 409) {\n // The syn body retry wins; Retry-After covers 429s minted below the host.\n const headerRetry = res.status === 429 ? retryAfterMs(res) : null;\n const syn: StatewireSyn = await refusalSyn(res).catch((error: unknown) => {\n if (headerRetry === null) throw error;\n return { retry: headerRetry };\n });\n if (syn.retry === undefined && headerRetry !== null)\n syn.retry = headerRetry;\n return { type: \"refusal\", syn };\n }\n if (res.status === 423) return { type: \"stale-lease\" };\n flushTapSync(() => settleFin(c, httpFin(res)));\n c.abort?.abort();\n throw new Error(`HTTP ${res.status}`);\n};\n\nconst useSseLink = (\n options: StatewireClient.HttpOptions,\n ctx: StatewireRemoteProps,\n): RemoteLink =>\n useLink({\n ...options,\n ctx,\n attemptOnce: (c, abort) => attemptStream(c, options, abort),\n send: async (c, frame) => {\n try {\n return await sendFrame(c, options, frame);\n } catch (error) {\n if (\n error instanceof SyntaxError ||\n (error instanceof Error &&\n error.message.startsWith(\"statewire: protocol error:\"))\n ) {\n flushTapSync(() =>\n settleFin(c, { reason: \"protocol-error\", message: error.message }),\n );\n c.abort?.abort();\n }\n throw error;\n }\n },\n });\n\nconst useStatewireHttp = (\n options: StatewireClient.HttpOptions,\n): Statewire<any, any> => useStatewireRemote(options, useSseLink);\n\nexport const StatewireHttp = resource(useStatewireHttp) as <\n TState = any,\n TCommands extends Statewire.Commands = Statewire.Commands,\n>(\n options: StatewireClient.HttpOptions,\n) => ResourceElement<Statewire<TState | undefined, TCommands>>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"sse.js","names":["StatewireDocument","flushTapSync","resource","ResourceElement","createSseParser","timing","settleFin","classify","handleEnvelope","resolveHeaders","useLink","validateRefusalSyn","AttemptOutcome","Conn","StatewireCmd","StatewireEnvelope","StatewireSyn","Statewire","StatewireClient","StatewireHost","useStatewireRemote","negotiationHeaders","parseNegotiation","StatewireFrame","ctx","protocol","Encoded","cmd","method","params","meta","seq","StatewireRemoteProps","beforeAttach","Promise","clientId","takeAttachLanes","onHello","args","ops","syn","onOps","cmds","onCmds","onRefusal","onIdle","level","onDetach","onFinish","Fin","StatewireSubmitResult","type","ConnectionState","RemoteLink","storageFailed","error","Error","protocolFailed","connection","Connection","parked","send","frame","LEASE_HEADER","warnedNoLease","warnNoLease","console","warn","baseUrl","options","HttpOptions","url","replace","withExtra","headers","Headers","extra","Record","merged","name","value","Object","entries","set","timedFetch","input","init","RequestInit","signal","AbortSignal","timeout","Response","fetch","globalThis","consume","c","reader","ReadableStreamDefaultReader","Uint8Array","heartbeat","AbortController","dead","decoder","TextDecoder","parse","timer","setTimeout","abort","heartbeatTimeoutMs","result","ReadableStreamReadResult","read","clearTimeout","done","data","decode","stream","env","JSON","attemptStream","persistence","aborted","lease","authStale","has","negotiation","lanes","body","undefined","stringify","headerTimer","res","accept","cache","any","ok","clone","json","catch","fin","httpFin","get","getReader","cancel","addEventListener","once","removeEventListener","postFrame","lifetime","retryAfterMs","header","trim","test","retry","Number","isSafeInteger","reason","status","message","code","refusalSyn","sendFrame","headerRetry","useSseLink","attemptOnce","SyntaxError","startsWith","useStatewireHttp","StatewireHttp","Commands","TState","TCommands"],"sources":["../../src/transports/sse.ts"],"sourcesContent":["import type { StatewireDocument } from \"../document\";\nimport { flushTapSync, resource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { createSseParser } from \"./sse-parser\";\nimport { timing } from \"../client/timing\";\nimport {\n settleFin,\n classify,\n handleEnvelope,\n resolveHeaders,\n useLink,\n validateRefusalSyn,\n} from \"../client/connection\";\nimport type {\n AttemptOutcome,\n Conn,\n StatewireCmd,\n StatewireEnvelope,\n StatewireSyn,\n} from \"../client/connection\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireClient } from \"../statewire\";\nimport type { StatewireHost } from \"../host\";\nimport { useStatewireRemote } from \"./remote\";\nimport { negotiationHeaders, parseNegotiation } from \"../wire/protocol\";\n\n/** A client frame's lanes: stamped statements, strictly consecutive per lane. */\nexport type StatewireFrame = {\n ctx?: ({ protocol: string } & StatewireDocument.Encoded)[];\n cmd?: {\n protocol: string;\n method: string;\n params: unknown[];\n meta?: unknown;\n seq: number;\n }[];\n};\n\nexport type StatewireRemoteProps = {\n beforeAttach?: () => void | Promise<void>;\n clientId: string;\n /** Lanes to ride the attach frame: ephemeral-lane statements, plus durable cmds on no-lease supersession; records the included entries. */\n takeAttachLanes: () => StatewireFrame | null;\n onHello: (args: { ops: unknown[]; syn: StatewireSyn }) => void;\n onOps: (args: { ops: unknown[]; cmds: StatewireCmd[] }) => void;\n onCmds: (cmds: StatewireCmd[]) => void;\n onRefusal: (syn: StatewireSyn) => void;\n onIdle: (level: boolean) => void;\n onDetach: () => void;\n onFinish: (args: StatewireHost.Fin) => void;\n};\n\nexport type StatewireSubmitResult =\n | { type: \"ok\" }\n | { type: \"refusal\"; syn: StatewireSyn }\n | { type: \"stale-lease\" }\n | { type: \"no-lease\" };\n\nexport type ConnectionState = StatewireClient.ConnectionState;\n\n/** The live wire a remote session drives: connection status plus frame submission. */\nexport type RemoteLink = {\n storageFailed: (error: Error) => void;\n protocolFailed: (error: Error) => void;\n connection: StatewireClient.Connection;\n /** A deferred first attach still waiting; `reconnect()` releases it. */\n parked: boolean;\n send: (frame: StatewireFrame) => Promise<StatewireSubmitResult>;\n};\n\nconst LEASE_HEADER = \"Statewire-Lease\";\n\nlet warnedNoLease = false;\n\nconst warnNoLease = () => {\n if (warnedNoLease) return;\n warnedNoLease = true;\n console.warn(\n \"statewire: SSE attach returned no readable Statewire-Lease header; commands will re-attach the stream. Cross-origin hosts must expose it (Access-Control-Expose-Headers: Statewire-Lease).\",\n );\n};\n\nconst baseUrl = (options: StatewireClient.HttpOptions) =>\n options.url.replace(/\\/$/, \"\");\n\nconst withExtra = (headers: Headers, extra: Record<string, string>) => {\n const merged = new Headers(headers);\n for (const [name, value] of Object.entries(extra)) merged.set(name, value);\n return merged;\n};\n\nconst timedFetch = async (\n options: StatewireClient.HttpOptions,\n input: string,\n init: RequestInit & { signal: AbortSignal },\n timeout: AbortSignal,\n): Promise<Response> => {\n try {\n return await (options.fetch ?? globalThis.fetch)(input, init);\n } catch {\n throw classify(timeout);\n }\n};\n\nconst consume = async (\n c: Conn,\n reader: ReadableStreamDefaultReader<Uint8Array>,\n heartbeat: AbortController,\n dead: () => boolean,\n): Promise<AttemptOutcome> => {\n const decoder = new TextDecoder();\n const parse = createSseParser();\n for (;;) {\n const timer = setTimeout(\n () => heartbeat.abort(),\n timing.heartbeatTimeoutMs,\n );\n let result: ReadableStreamReadResult<Uint8Array>;\n try {\n result = await reader.read();\n } catch {\n throw classify(heartbeat.signal);\n } finally {\n clearTimeout(timer);\n }\n if (result.done) return \"ended\";\n for (const data of parse(decoder.decode(result.value, { stream: true }))) {\n if (dead()) return \"ended\";\n const env = JSON.parse(data) as StatewireEnvelope;\n const done = flushTapSync(() => handleEnvelope(c, env));\n if (done) return done;\n }\n }\n};\n\nconst attemptStream = async (\n c: Conn,\n options: StatewireClient.HttpOptions,\n abort: AbortController,\n): Promise<AttemptOutcome> => {\n const persistence = c.ctx.beforeAttach?.();\n if (persistence) await persistence;\n if (abort.signal.aborted) return \"ended\";\n c.lease = null;\n const headers = await resolveHeaders(options.headers, c.authStale);\n for (const [name, value] of Object.entries(negotiationHeaders(options))) {\n if (!headers.has(name)) headers.set(name, value);\n }\n c.negotiation = parseNegotiation(headers);\n c.authStale = false;\n const lanes = flushTapSync(() => c.ctx.takeAttachLanes());\n const body = lanes === null ? undefined : JSON.stringify(lanes);\n const heartbeat = new AbortController();\n const headerTimer = setTimeout(\n () => heartbeat.abort(),\n timing.heartbeatTimeoutMs,\n );\n let res: Response;\n try {\n res = await timedFetch(\n options,\n `${baseUrl(options)}/stream`,\n {\n method: body === undefined ? \"GET\" : \"POST\",\n headers: withExtra(headers, {\n \"content-type\": \"application/json\",\n \"Statewire-Client-Id\": c.ctx.clientId,\n accept: \"text/event-stream\",\n }),\n ...(body === undefined ? {} : { body }),\n cache: \"no-store\",\n signal: AbortSignal.any([abort.signal, heartbeat.signal]),\n },\n heartbeat.signal,\n );\n } finally {\n clearTimeout(headerTimer);\n }\n if (!res.ok) {\n const body = await res\n .clone()\n .json()\n .catch(() => null);\n return (\n flushTapSync(() =>\n body?.fin === undefined\n ? settleFin(c, httpFin(res))\n : handleEnvelope(c, body),\n ) ?? \"stop\"\n );\n }\n if (!res.body)\n throw new Error(\"statewire: protocol error: stream response has no body\");\n c.lease = res.headers.get(LEASE_HEADER);\n if (c.lease === null) warnNoLease();\n const reader = res.body.getReader();\n const cancel = () => {\n void reader.cancel().catch(() => {});\n };\n abort.signal.addEventListener(\"abort\", cancel, { once: true });\n try {\n return await consume(c, reader, heartbeat, () => abort.signal.aborted);\n } finally {\n abort.signal.removeEventListener(\"abort\", cancel);\n reader.cancel().catch(() => {});\n }\n};\n\nconst postFrame = async (\n c: Conn,\n options: StatewireClient.HttpOptions,\n lease: string,\n frame: StatewireFrame,\n timeout: AbortSignal,\n): Promise<Response> =>\n timedFetch(\n options,\n `${baseUrl(options)}/frames`,\n {\n method: \"POST\",\n headers: withExtra(new Headers(), {\n \"content-type\": \"application/json\",\n [LEASE_HEADER]: lease,\n }),\n body: JSON.stringify(frame),\n signal: AbortSignal.any([\n c.lifetime?.signal ?? AbortSignal.abort(),\n timeout,\n ]),\n },\n timeout,\n );\n\n// Delta-seconds only; anything else reads as absent.\nconst retryAfterMs = (res: Response): number | null => {\n const header = res.headers.get(\"retry-after\")?.trim();\n if (header === undefined || !/^\\d+$/.test(header)) return null;\n const retry = Number(header) * 1000;\n return Number.isSafeInteger(retry) ? retry : null;\n};\n\nconst httpFin = (res: Response): StatewireHost.Fin => ({\n reason:\n res.status === 401\n ? \"unauthorized\"\n : res.status === 403\n ? \"forbidden\"\n : res.status === 429 || res.status === 503\n ? \"reconnect\"\n : res.status >= 400 && res.status < 500\n ? \"protocol-error\"\n : \"error\",\n status: res.status,\n message: `HTTP ${res.status}`,\n ...(res.status === 429 || res.status === 503 ? { code: \"overloaded\" } : {}),\n ...(retryAfterMs(res) !== null ? { retry: retryAfterMs(res)! } : {}),\n});\n\nconst refusalSyn = async (res: Response): Promise<StatewireSyn> => {\n const body = (await res.json().catch(() => null)) as {\n syn?: StatewireSyn;\n } | null;\n const syn = body?.syn;\n if (typeof syn !== \"object\" || syn === null) {\n throw new Error(`HTTP ${res.status}`);\n }\n return validateRefusalSyn(syn);\n};\n\nconst sendFrame = async (\n c: Conn,\n options: StatewireClient.HttpOptions,\n frame: StatewireFrame,\n): Promise<StatewireSubmitResult> => {\n const lease = c.lease;\n if (lease === null) return { type: \"no-lease\" };\n const timeout = AbortSignal.timeout(timing.heartbeatTimeoutMs);\n const res = await postFrame(c, options, lease, frame, timeout);\n if (res.ok) return { type: \"ok\" };\n if (res.status === 429 || res.status === 409) {\n // The syn body retry wins; Retry-After covers 429s minted below the host.\n const headerRetry = res.status === 429 ? retryAfterMs(res) : null;\n const syn: StatewireSyn = await refusalSyn(res).catch((error: unknown) => {\n if (headerRetry === null) throw error;\n return { retry: headerRetry };\n });\n if (syn.retry === undefined && headerRetry !== null)\n syn.retry = headerRetry;\n return { type: \"refusal\", syn };\n }\n if (res.status === 423) return { type: \"stale-lease\" };\n flushTapSync(() => settleFin(c, httpFin(res)));\n c.abort?.abort();\n throw new Error(`HTTP ${res.status}`);\n};\n\nconst useSseLink = (\n options: StatewireClient.HttpOptions,\n ctx: StatewireRemoteProps,\n): RemoteLink =>\n useLink({\n ...options,\n ctx,\n attemptOnce: (c, abort) => attemptStream(c, options, abort),\n send: async (c, frame) => {\n try {\n return await sendFrame(c, options, frame);\n } catch (error) {\n if (\n error instanceof SyntaxError ||\n (error instanceof Error &&\n error.message.startsWith(\"statewire: protocol error:\"))\n ) {\n flushTapSync(() =>\n settleFin(c, { reason: \"protocol-error\", message: error.message }),\n );\n c.abort?.abort();\n }\n throw error;\n }\n },\n });\n\nconst useStatewireHttp = (\n options: StatewireClient.HttpOptions,\n): Statewire<any, any> => useStatewireRemote(options, useSseLink);\n\nexport const StatewireHttp = resource(useStatewireHttp) as <\n TState = any,\n TCommands extends Statewire.Commands = Statewire.Commands,\n>(\n options: StatewireClient.HttpOptions,\n) => ResourceElement<Statewire<TState | undefined, TCommands>>;\n"],"mappings":"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"}
@@ -1,38 +1,35 @@
1
- import { StatewireFrame } from "./sse.js";
2
- import { StatewireEnvelope } from "../client/connection.js";
3
- import { Statewire } from "../types.js";
4
- import { SocketRecorder, commandFrame, createCounterElement, createSocketRecorder, settle } from "./fixtures.js";
5
- import { applyOptimistic } from "../util/recordMutations.js";
6
- import { ResourceElement } from "@assistant-ui/tap";
7
- //#region src/transports/testing.d.ts
1
+ import type { ResourceElement } from "@assistant-ui/tap";
2
+ import type { StatewireEnvelope } from "../client/connection.js";
3
+ import type { StatewireFrame } from "./sse.js";
4
+ import type { Statewire } from "../types.js";
5
+ export * from "./fixtures.js";
8
6
  /** Let queued microtasks and op batches drain through the statewire client. */
9
- declare const tick: () => Promise<void>;
10
- type MockTransport<TState> = {
11
- /** Pass as the `transport:` option of useStatewire / Harness. */
12
- transport: ResourceElement<Statewire<TState | undefined, any>>;
13
- /** Captured statements in arrival order. */
14
- commands: {
15
- protocol: string;
16
- method: string;
17
- params: unknown[];
18
- }[];
19
- contexts: NonNullable<StatewireFrame["ctx"]>;
20
- /** Replace the replicated state and broadcast it as a root snapshot op. */
21
- setState: (state: TState) => Promise<void>;
22
- /** Deliver a bare ack cmd packet on the stream. */
23
- applied: (seq: number) => Promise<void>;
24
- /** Deliver a terminal result cmd packet on the stream. */
25
- settle: (seq: number, payload?: unknown) => Promise<void>;
26
- /** Deliver an arbitrary envelope on the stream. */
27
- sendEnvelope: (envelope: StatewireEnvelope) => Promise<void>;
28
- /** End the stream with a fin; further attaches fail like a dead server. */
29
- finish: (reason: string, message?: string) => Promise<void>;
30
- readonly clientId: string;
31
- readonly attached: boolean;
7
+ export declare const tick: () => Promise<void>;
8
+ export { applyOptimistic } from "../util/recordMutations.js";
9
+ export type MockTransport<TState> = {
10
+ /** Pass as the `transport:` option of useStatewire / Harness. */
11
+ transport: ResourceElement<Statewire<TState | undefined, any>>;
12
+ /** Captured statements in arrival order. */
13
+ commands: {
14
+ protocol: string;
15
+ method: string;
16
+ params: unknown[];
17
+ }[];
18
+ contexts: NonNullable<StatewireFrame["ctx"]>;
19
+ /** Replace the replicated state and broadcast it as a root snapshot op. */
20
+ setState: (state: TState) => Promise<void>;
21
+ /** Deliver a bare ack cmd packet on the stream. */
22
+ applied: (seq: number) => Promise<void>;
23
+ /** Deliver a terminal result cmd packet on the stream. */
24
+ settle: (seq: number, payload?: unknown) => Promise<void>;
25
+ /** Deliver an arbitrary envelope on the stream. */
26
+ sendEnvelope: (envelope: StatewireEnvelope) => Promise<void>;
27
+ /** End the stream with a fin; further attaches fail like a dead server. */
28
+ finish: (reason: string, message?: string) => Promise<void>;
29
+ readonly clientId: string;
30
+ readonly attached: boolean;
32
31
  };
33
- declare const createMockTransport: <TState>(initialState: TState, protocol?: string, options?: {
34
- ephemeral?: readonly string[];
32
+ export declare const createMockTransport: <TState>(initialState: TState, protocol?: string, options?: {
33
+ ephemeral?: readonly string[];
35
34
  }) => MockTransport<TState>;
36
- //#endregion
37
- export { MockTransport, SocketRecorder, applyOptimistic, commandFrame, createCounterElement, createMockTransport, createSocketRecorder, settle, tick };
38
35
  //# sourceMappingURL=testing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","names":[],"sources":["../../src/transports/testing.ts"],"mappings":";;;;;;;;cAYa,YAAI;KAIL,cAAc;;EAExB,WAAW,gBAAgB,UAAU;;EAErC;IAAY;IAAkB;IAAgB;;EAC9C,UAAU,YAAY;;EAEtB,WAAW,OAAO,WAAW;;EAE7B,UAAU,gBAAgB;;EAE1B,SAAS,aAAa,sBAAsB;;EAE5C,eAAe,UAAU,sBAAsB;;EAE/C,SAAS,gBAAgB,qBAAqB;WACrC;WACA;;cAUE,sBAAuB,QAClC,cAAc,QACd,mBACA;EAAW;MACV,cAAc"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/transports/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,gCAA6B;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAc;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAiB;AAK1C,8BAA2B;AAE3B,+EAA+E;AAC/E,eAAO,MAAM,IAAI,qBAAmD,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,mCAAgC;AAE1D,MAAM,MAAM,aAAa,CAAC,MAAM,IAAI;IAClC,iEAAiE;IACjE,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/D,4CAA4C;IAC5C,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,EAAE,CAAA;KAAE,EAAE,CAAC;IACpE,QAAQ,EAAE,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,2EAA2E;IAC3E,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,mDAAmD;IACnD,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,0DAA0D;IAC1D,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,mDAAmD;IACnD,YAAY,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,2EAA2E;IAC3E,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,CAAC;AASF,eAAO,MAAM,mBAAmB,GAAI,MAAM,EACxC,cAAc,MAAM,EACpB,iBAAoB,EACpB,UAAS;IAAE,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,KAC9C,aAAa,CAAC,MAAM,CAmItB,CAAC"}
@@ -3,7 +3,7 @@ import { applyOptimistic } from "../util/recordMutations.js";
3
3
  import { StatewireHttp } from "./sse.js";
4
4
  import { openSSEStream, sseFrame } from "./fake-sse.js";
5
5
  import { commandFrame, createCounterElement, createSocketRecorder, settle } from "./fixtures.js";
6
- //#region src/transports/testing.ts
6
+ // src/transports/testing.ts
7
7
  /** Let queued microtasks and op batches drain through the statewire client. */
8
8
  const tick = () => new Promise((r) => setTimeout(r, 0));
9
9
  /**
@@ -128,7 +128,6 @@ const createMockTransport = (initialState, protocol = "default", options = {}) =
128
128
  }
129
129
  };
130
130
  };
131
- //#endregion
132
131
  export { applyOptimistic, commandFrame, createCounterElement, createMockTransport, createSocketRecorder, settle, tick };
133
132
 
134
133
  //# sourceMappingURL=testing.js.map
@@ -1,9 +1,7 @@
1
- import { StatewireClient } from "../statewire.js";
2
- import { Statewire } from "../types.js";
1
+ import type { ResourceElement } from "@assistant-ui/tap";
2
+ import type { Statewire } from "../types.js";
3
+ import type { StatewireClient } from "../statewire.js";
3
4
  import { WS_SUBPROTOCOL } from "../wire/version.js";
4
- import { ResourceElement } from "@assistant-ui/tap";
5
- //#region src/transports/ws.d.ts
6
- declare const StatewireWebsocket: <TState = any, TCommands extends Statewire.Commands = Statewire.Commands>(options: StatewireClient.WebsocketOptions) => ResourceElement<Statewire<TState | undefined, TCommands>>;
7
- //#endregion
8
- export { StatewireWebsocket, WS_SUBPROTOCOL };
5
+ export { WS_SUBPROTOCOL };
6
+ export declare const StatewireWebsocket: <TState = any, TCommands extends Statewire.Commands = Statewire.Commands>(options: StatewireClient.WebsocketOptions) => ResourceElement<Statewire<TState | undefined, TCommands>>;
9
7
  //# sourceMappingURL=ws.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ws.d.ts","names":[],"sources":["../../src/transports/ws.ts"],"mappings":";;;;;cA8La,qBACX,cACA,kBAAkB,UAAU,WAAW,UAAU,UAEjD,SAAS,gBAAgB,qBACtB,gBAAgB,UAAU,oBAAoB"}
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/transports/ws.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAazD,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAiB;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAqB;AAGpD,OAAO,EAAE,cAAc,EAAE,2BAAwB;AAcjD,OAAO,EAAE,cAAc,EAAE,CAAC;AA6J1B,eAAO,MAAM,kBAAkB,EAAsC,CACnE,MAAM,GAAG,GAAG,EACZ,SAAS,SAAS,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAEzD,OAAO,EAAE,eAAe,CAAC,gBAAgB,KACtC,eAAe,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC"}
@@ -1,12 +1,12 @@
1
- import { CLIENT_QUERY_PARAM } from "../host/adapter.js";
2
- import { WS_SUBPROTOCOL } from "../wire/version.js";
3
1
  import { timing } from "../client/timing.js";
4
2
  import { attachFrame, handleEnvelope, unsupportedVersion, useLink } from "../client/connection.js";
3
+ import { CLIENT_QUERY_PARAM } from "../host/adapter.js";
4
+ import { WS_SUBPROTOCOL } from "../wire/version.js";
5
5
  import { useStatewireRemote } from "./remote.js";
6
6
  import { useState } from "@assistant-ui/tap/react-shim";
7
7
  import { flushTapSync, resource } from "@assistant-ui/tap";
8
8
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
9
- //#region src/transports/ws.ts
9
+ // src/transports/ws.ts
10
10
  const OPEN = 1;
11
11
  const socketUrl = async (options, clientId) => {
12
12
  const { url, query } = options;
@@ -143,7 +143,6 @@ const StatewireWebsocket = resource(useStatewireWebsocket);
143
143
  function _temp() {
144
144
  return { socket: null };
145
145
  }
146
- //#endregion
147
146
  export { StatewireWebsocket, WS_SUBPROTOCOL };
148
147
 
149
148
  //# sourceMappingURL=ws.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ws.js","names":["useState","flushTapSync","resource","ResourceElement","timing","attachFrame","handleEnvelope","unsupportedVersion","useLink","AttemptOutcome","Conn","StatewireEnvelope","Statewire","StatewireClient","useStatewireRemote","CLIENT_QUERY_PARAM","WS_SUBPROTOCOL","RemoteLink","StatewireFrame","StatewireSubmitResult","StatewireRemoteProps","WsChannel","socket","WebSocket","OPEN","socketUrl","options","WebsocketOptions","clientId","url","query","params","URLSearchParams","set","resolved","URL","globalThis","location","href","protocol","replace","pathname","search","toString","runSocket","c","ws","frame","abort","AbortController","Promise","resolve","reject","timer","ReturnType","setTimeout","ping","setInterval","timedOut","outcome","closed","arm","clearTimeout","close","heartbeatTimeoutMs","signal","addEventListener","onerror","onopen","negotiated","trim","send","pingIntervalMs","stale","Boolean","aborted","fail","error","clearInterval","Error","onmessage","event","env","JSON","parse","String","data","SyntaxError","Object","keys","length","done","onclose","attemptSocket","w","ctx","body","headers","throwIfAborted","protocols","webSocket","WS","extra","undefined","sendFrame","readyState","stringify","type","useWsLink","$","_c","_temp","t0","t1","_","t2","attemptOnce","useStatewireWebsocket","StatewireWebsocket","Commands","TState","TCommands"],"sources":["../../src/transports/ws.ts"],"sourcesContent":["import { useState } from \"react\";\nimport { flushTapSync, resource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { timing } from \"../client/timing\";\nimport {\n attachFrame,\n handleEnvelope,\n unsupportedVersion,\n useLink,\n} from \"../client/connection\";\nimport type {\n AttemptOutcome,\n Conn,\n StatewireEnvelope,\n} from \"../client/connection\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireClient } from \"../statewire\";\nimport { useStatewireRemote } from \"./remote\";\nimport { CLIENT_QUERY_PARAM } from \"../host/adapter\";\nimport { WS_SUBPROTOCOL } from \"../wire/version\";\nimport type {\n RemoteLink,\n StatewireFrame,\n StatewireSubmitResult,\n StatewireRemoteProps,\n} from \"./sse\";\n\ntype WsChannel = {\n socket: WebSocket | null;\n};\n\nconst OPEN = 1;\n\nexport { WS_SUBPROTOCOL };\n\nconst socketUrl = async (\n options: StatewireClient.WebsocketOptions,\n clientId: string,\n) => {\n const { url, query } = options;\n const params = new URLSearchParams(\n typeof query === \"function\" ? await query() : query,\n );\n params.set(CLIENT_QUERY_PARAM, clientId);\n const resolved = new URL(url, globalThis.location?.href);\n resolved.protocol = resolved.protocol.replace(/^http/, \"ws\");\n resolved.pathname = `${resolved.pathname.replace(/\\/$/, \"\")}/ws`;\n resolved.search = params.toString();\n return resolved.href;\n};\n\nconst runSocket = (\n c: Conn,\n ws: WebSocket,\n frame: string,\n abort: AbortController,\n): Promise<AttemptOutcome> =>\n new Promise((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let ping: ReturnType<typeof setInterval> | undefined;\n let timedOut = false;\n let outcome: AttemptOutcome | null = null;\n let closed = false;\n const arm = () => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n timedOut = true;\n ws.close();\n }, timing.heartbeatTimeoutMs);\n };\n arm();\n abort.signal.addEventListener(\"abort\", () => ws.close());\n ws.onerror = () => {};\n ws.onopen = () => {\n const negotiated = ws.protocol.trim();\n if (negotiated !== WS_SUBPROTOCOL) {\n outcome = unsupportedVersion(c, negotiated);\n ws.close();\n return;\n }\n ws.send(frame);\n // A ping keeps a host that cannot run timers (a hibernating durable\n // object answers it without waking) talking before the silence timeout.\n ping = setInterval(() => ws.send(\"{}\"), timing.pingIntervalMs);\n };\n const stale = () => Boolean(outcome) || closed || abort.signal.aborted;\n const fail = (error: unknown) => {\n clearTimeout(timer);\n clearInterval(ping);\n reject(error instanceof Error ? error : new Error(\"protocol\"));\n ws.close();\n };\n ws.onmessage = (event) => {\n if (stale()) return;\n arm();\n let env: StatewireEnvelope;\n try {\n env = JSON.parse(String(event.data)) as StatewireEnvelope;\n } catch {\n fail(new SyntaxError(\"invalid JSON packet\"));\n return;\n }\n // {} heartbeats live below the packet layer: invisible to handlers.\n if (\n typeof env === \"object\" &&\n env !== null &&\n Object.keys(env).length === 0\n ) {\n return;\n }\n try {\n const done = flushTapSync(() => handleEnvelope(c, env));\n if (done) {\n outcome = done;\n ws.close();\n }\n } catch (error) {\n fail(error);\n }\n };\n ws.onclose = () => {\n closed = true;\n clearTimeout(timer);\n clearInterval(ping);\n if (outcome) resolve(outcome);\n else reject(new Error(timedOut ? \"timeout\" : \"network\"));\n };\n });\n\nconst attemptSocket = async (\n c: Conn,\n w: WsChannel,\n options: StatewireClient.WebsocketOptions,\n abort: AbortController,\n): Promise<AttemptOutcome> => {\n let ws: WebSocket | null = null;\n try {\n const url = await socketUrl(options, c.ctx.clientId);\n const { body } = await attachFrame(c, options.headers);\n abort.signal.throwIfAborted();\n const { protocols, webSocket } = options;\n const WS = webSocket ?? globalThis.WebSocket;\n if (!WS) throw new Error(\"no WebSocket implementation\");\n const extra =\n protocols === undefined\n ? []\n : typeof protocols === \"string\"\n ? [protocols]\n : protocols;\n ws = new WS(url, [WS_SUBPROTOCOL, ...extra]);\n w.socket = ws;\n return await runSocket(c, ws, body, abort);\n } finally {\n if (w.socket === ws) w.socket = null;\n }\n};\n\nconst sendFrame = (\n w: WsChannel,\n frame: StatewireFrame,\n): Promise<StatewireSubmitResult> => {\n const ws = w.socket;\n if (!ws || ws.readyState !== OPEN) {\n return Promise.reject(new Error(\"network\"));\n }\n try {\n ws.send(JSON.stringify(frame));\n } catch {\n return Promise.reject(new Error(\"network\"));\n }\n return Promise.resolve({ type: \"ok\" });\n};\n\nconst useWsLink = (\n options: StatewireClient.WebsocketOptions,\n ctx: StatewireRemoteProps,\n): RemoteLink => {\n const [w] = useState((): WsChannel => ({ socket: null }));\n return useLink({\n ...options,\n ctx,\n attemptOnce: (c, abort) => attemptSocket(c, w, options, abort),\n send: (_, frame) => sendFrame(w, frame),\n });\n};\n\nconst useStatewireWebsocket = (\n options: StatewireClient.WebsocketOptions,\n): Statewire<any, any> => useStatewireRemote(options, useWsLink);\n\nexport const StatewireWebsocket = resource(useStatewireWebsocket) as <\n TState = any,\n TCommands extends Statewire.Commands = Statewire.Commands,\n>(\n options: StatewireClient.WebsocketOptions,\n) => ResourceElement<Statewire<TState | undefined, TCommands>>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ws.js","names":["useState","flushTapSync","resource","ResourceElement","timing","attachFrame","handleEnvelope","unsupportedVersion","useLink","AttemptOutcome","Conn","StatewireEnvelope","Statewire","StatewireClient","useStatewireRemote","CLIENT_QUERY_PARAM","WS_SUBPROTOCOL","RemoteLink","StatewireFrame","StatewireSubmitResult","StatewireRemoteProps","WsChannel","socket","WebSocket","OPEN","socketUrl","options","WebsocketOptions","clientId","url","query","params","URLSearchParams","set","resolved","URL","globalThis","location","href","protocol","replace","pathname","search","toString","runSocket","c","ws","frame","abort","AbortController","Promise","resolve","reject","timer","ReturnType","setTimeout","ping","setInterval","timedOut","outcome","closed","arm","clearTimeout","close","heartbeatTimeoutMs","signal","addEventListener","onerror","onopen","negotiated","trim","send","pingIntervalMs","stale","Boolean","aborted","fail","error","clearInterval","Error","onmessage","event","env","JSON","parse","String","data","SyntaxError","Object","keys","length","done","onclose","attemptSocket","w","ctx","body","headers","throwIfAborted","protocols","webSocket","WS","extra","undefined","sendFrame","readyState","stringify","type","useWsLink","$","_c","_temp","t0","t1","_","t2","attemptOnce","useStatewireWebsocket","StatewireWebsocket","Commands","TState","TCommands","_c"],"sources":["../../src/transports/ws.ts"],"sourcesContent":["import { useState } from \"react\";\nimport { flushTapSync, resource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { timing } from \"../client/timing\";\nimport {\n attachFrame,\n handleEnvelope,\n unsupportedVersion,\n useLink,\n} from \"../client/connection\";\nimport type {\n AttemptOutcome,\n Conn,\n StatewireEnvelope,\n} from \"../client/connection\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireClient } from \"../statewire\";\nimport { useStatewireRemote } from \"./remote\";\nimport { CLIENT_QUERY_PARAM } from \"../host/adapter\";\nimport { WS_SUBPROTOCOL } from \"../wire/version\";\nimport type {\n RemoteLink,\n StatewireFrame,\n StatewireSubmitResult,\n StatewireRemoteProps,\n} from \"./sse\";\n\ntype WsChannel = {\n socket: WebSocket | null;\n};\n\nconst OPEN = 1;\n\nexport { WS_SUBPROTOCOL };\n\nconst socketUrl = async (\n options: StatewireClient.WebsocketOptions,\n clientId: string,\n) => {\n const { url, query } = options;\n const params = new URLSearchParams(\n typeof query === \"function\" ? await query() : query,\n );\n params.set(CLIENT_QUERY_PARAM, clientId);\n const resolved = new URL(url, globalThis.location?.href);\n resolved.protocol = resolved.protocol.replace(/^http/, \"ws\");\n resolved.pathname = `${resolved.pathname.replace(/\\/$/, \"\")}/ws`;\n resolved.search = params.toString();\n return resolved.href;\n};\n\nconst runSocket = (\n c: Conn,\n ws: WebSocket,\n frame: string,\n abort: AbortController,\n): Promise<AttemptOutcome> =>\n new Promise((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let ping: ReturnType<typeof setInterval> | undefined;\n let timedOut = false;\n let outcome: AttemptOutcome | null = null;\n let closed = false;\n const arm = () => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n timedOut = true;\n ws.close();\n }, timing.heartbeatTimeoutMs);\n };\n arm();\n abort.signal.addEventListener(\"abort\", () => ws.close());\n ws.onerror = () => {};\n ws.onopen = () => {\n const negotiated = ws.protocol.trim();\n if (negotiated !== WS_SUBPROTOCOL) {\n outcome = unsupportedVersion(c, negotiated);\n ws.close();\n return;\n }\n ws.send(frame);\n // A ping keeps a host that cannot run timers (a hibernating durable\n // object answers it without waking) talking before the silence timeout.\n ping = setInterval(() => ws.send(\"{}\"), timing.pingIntervalMs);\n };\n const stale = () => Boolean(outcome) || closed || abort.signal.aborted;\n const fail = (error: unknown) => {\n clearTimeout(timer);\n clearInterval(ping);\n reject(error instanceof Error ? error : new Error(\"protocol\"));\n ws.close();\n };\n ws.onmessage = (event) => {\n if (stale()) return;\n arm();\n let env: StatewireEnvelope;\n try {\n env = JSON.parse(String(event.data)) as StatewireEnvelope;\n } catch {\n fail(new SyntaxError(\"invalid JSON packet\"));\n return;\n }\n // {} heartbeats live below the packet layer: invisible to handlers.\n if (\n typeof env === \"object\" &&\n env !== null &&\n Object.keys(env).length === 0\n ) {\n return;\n }\n try {\n const done = flushTapSync(() => handleEnvelope(c, env));\n if (done) {\n outcome = done;\n ws.close();\n }\n } catch (error) {\n fail(error);\n }\n };\n ws.onclose = () => {\n closed = true;\n clearTimeout(timer);\n clearInterval(ping);\n if (outcome) resolve(outcome);\n else reject(new Error(timedOut ? \"timeout\" : \"network\"));\n };\n });\n\nconst attemptSocket = async (\n c: Conn,\n w: WsChannel,\n options: StatewireClient.WebsocketOptions,\n abort: AbortController,\n): Promise<AttemptOutcome> => {\n let ws: WebSocket | null = null;\n try {\n const url = await socketUrl(options, c.ctx.clientId);\n const { body } = await attachFrame(c, options.headers);\n abort.signal.throwIfAborted();\n const { protocols, webSocket } = options;\n const WS = webSocket ?? globalThis.WebSocket;\n if (!WS) throw new Error(\"no WebSocket implementation\");\n const extra =\n protocols === undefined\n ? []\n : typeof protocols === \"string\"\n ? [protocols]\n : protocols;\n ws = new WS(url, [WS_SUBPROTOCOL, ...extra]);\n w.socket = ws;\n return await runSocket(c, ws, body, abort);\n } finally {\n if (w.socket === ws) w.socket = null;\n }\n};\n\nconst sendFrame = (\n w: WsChannel,\n frame: StatewireFrame,\n): Promise<StatewireSubmitResult> => {\n const ws = w.socket;\n if (!ws || ws.readyState !== OPEN) {\n return Promise.reject(new Error(\"network\"));\n }\n try {\n ws.send(JSON.stringify(frame));\n } catch {\n return Promise.reject(new Error(\"network\"));\n }\n return Promise.resolve({ type: \"ok\" });\n};\n\nconst useWsLink = (\n options: StatewireClient.WebsocketOptions,\n ctx: StatewireRemoteProps,\n): RemoteLink => {\n const [w] = useState((): WsChannel => ({ socket: null }));\n return useLink({\n ...options,\n ctx,\n attemptOnce: (c, abort) => attemptSocket(c, w, options, abort),\n send: (_, frame) => sendFrame(w, frame),\n });\n};\n\nconst useStatewireWebsocket = (\n options: StatewireClient.WebsocketOptions,\n): Statewire<any, any> => useStatewireRemote(options, useWsLink);\n\nexport const StatewireWebsocket = resource(useStatewireWebsocket) as <\n TState = any,\n TCommands extends Statewire.Commands = Statewire.Commands,\n>(\n options: StatewireClient.WebsocketOptions,\n) => ResourceElement<Statewire<TState | undefined, TCommands>>;\n"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,82 +1,85 @@
1
- import { StatewireDocuments } from "./wire/documents.js";
2
- import { StatewireHost } from "./host.js";
3
- import { StatewireProtocol } from "./wire/protocol.js";
4
- import { StatewireClient } from "./statewire.js";
5
- import { StatewirePath } from "./wire/ops.js";
6
- //#region src/types.d.ts
7
- declare namespace Statewire {
8
- type Context = Readonly<Record<string, unknown>>;
9
- type Commands = Record<string, (...args: never[]) => unknown>;
10
- type Command<TCommands extends Commands = Commands> = { [K in keyof TCommands]: {
11
- method: K;
12
- params: Parameters<TCommands[K]>;
13
- }; }[keyof TCommands];
14
- type CommandsProxy<TCommands extends Commands> = { [K in keyof TCommands]: (...args: Parameters<TCommands[K]>) => Promise<Awaited<ReturnType<TCommands[K]>>>; };
15
- type CommandUpdate<TCommands extends Commands = Commands> = { [K in keyof TCommands]: {
16
- readonly protocol?: string;
17
- method: K;
18
- params: Parameters<TCommands[K]>;
19
- seq: number;
20
- status: "queued" | "posted" | "applied" | "settled";
21
- result?: unknown;
22
- failure?: StatewireClient.SendFailure;
23
- }; }[keyof TCommands];
24
- /** Push-based canonical state feed a statewire hands to the client core. */
25
- type StateSource = {
26
- snapshot: () => unknown;
27
- /** Drain the paths changed since the last take (`[]` entry = whole state). */
28
- takeChanged: () => StatewirePath[];
29
- /** Synchronous, per change; the consumer owns coalescing. */
30
- setOnChange: (listener: (() => void) | null) => void;
31
- };
32
- type Op = {
33
- op: "replace";
34
- path: StatewirePath;
35
- value: unknown;
36
- } | {
37
- op: "add";
38
- path: StatewirePath;
39
- value: unknown;
40
- } | {
41
- op: "remove";
42
- path: StatewirePath;
43
- };
44
- type Changes = {
45
- isChangedAt(path: readonly (string | number)[]): boolean;
46
- getChangedKeys(path: readonly (string | number)[]): string[];
47
- };
1
+ import type { StatewireDocuments } from "./wire/documents.js";
2
+ import type { StatewireHost } from "./host.js";
3
+ import type { StatewireProtocol } from "./wire/protocol.js";
4
+ import type { StatewireClient } from "./statewire.js";
5
+ import type { StatewirePath } from "./wire/ops.js";
6
+ export declare namespace Statewire {
7
+ type Context = Readonly<Record<string, unknown>>;
8
+ type Commands = Record<string, (...args: never[]) => unknown>;
9
+ type Command<TCommands extends Commands = Commands> = {
10
+ [K in keyof TCommands]: {
11
+ method: K;
12
+ params: Parameters<TCommands[K]>;
13
+ };
14
+ }[keyof TCommands];
15
+ type CommandsProxy<TCommands extends Commands> = {
16
+ [K in keyof TCommands]: (...args: Parameters<TCommands[K]>) => Promise<Awaited<ReturnType<TCommands[K]>>>;
17
+ };
18
+ type CommandUpdate<TCommands extends Commands = Commands> = {
19
+ [K in keyof TCommands]: {
20
+ readonly protocol?: string;
21
+ method: K;
22
+ params: Parameters<TCommands[K]>;
23
+ seq: number;
24
+ status: "queued" | "posted" | "applied" | "settled";
25
+ result?: unknown;
26
+ failure?: StatewireClient.SendFailure;
27
+ };
28
+ }[keyof TCommands];
29
+ /** Push-based canonical state feed a statewire hands to the client core. */
30
+ type StateSource = {
31
+ snapshot: () => unknown;
32
+ /** Drain the paths changed since the last take (`[]` entry = whole state). */
33
+ takeChanged: () => StatewirePath[];
34
+ /** Synchronous, per change; the consumer owns coalescing. */
35
+ setOnChange: (listener: (() => void) | null) => void;
36
+ };
37
+ type Op = {
38
+ op: "replace";
39
+ path: StatewirePath;
40
+ value: unknown;
41
+ } | {
42
+ op: "add";
43
+ path: StatewirePath;
44
+ value: unknown;
45
+ } | {
46
+ op: "remove";
47
+ path: StatewirePath;
48
+ };
49
+ type Changes = {
50
+ isChangedAt(path: readonly (string | number)[]): boolean;
51
+ getChangedKeys(path: readonly (string | number)[]): string[];
52
+ };
48
53
  }
49
- interface Statewire<TState = any, TCommands extends Statewire.Commands = Statewire.Commands> {
50
- state: TState;
51
- documents?: StatewireDocuments.Source;
52
- selection?: StatewireProtocol.Selection | undefined;
53
- setContext?: (protocol: string, value: Statewire.Context) => void;
54
- validateContext?: (protocol: string, value: Statewire.Context, attach: StatewireHost.Attach) => void;
55
- contextChanged?: (protocol: string, value: Statewire.Context, attach: StatewireHost.Attach) => void;
56
- invoke?: (protocol: string, method: string, params: readonly unknown[]) => Promise<unknown>;
57
- commands: Statewire.CommandsProxy<TCommands>;
58
- connection?: StatewireClient.Connection;
59
- source?: Statewire.StateSource;
60
- /** Negation of the server's broadcast idle level; absent means always busy. */
61
- isBusy?: boolean;
62
- work?: {
63
- readonly isIdle: boolean;
64
- };
65
- /** Called by the serving host once an attach is registered, before its hello: documents mounted here ride the hello. */
66
- attaching?: (attach: StatewireHost.Attach) => void;
67
- /** Called by the serving host when an attach ends; its ephemeral documents and includes are gone. */
68
- detached?: (attach: StatewireHost.Attach) => void;
69
- /** The retained failed-send lane; present on transports with a durable session. */
70
- failures?: {
71
- list: () => readonly StatewireClient.FailedCommand[];
72
- retry: (entry: StatewireClient.FailedCommand) => Promise<unknown>;
73
- discard: (entry: StatewireClient.FailedCommand) => void;
74
- };
54
+ export interface Statewire<TState = any, TCommands extends Statewire.Commands = Statewire.Commands> {
55
+ state: TState;
56
+ documents?: StatewireDocuments.Source;
57
+ selection?: StatewireProtocol.Selection | undefined;
58
+ setContext?: (protocol: string, value: Statewire.Context) => void;
59
+ validateContext?: (protocol: string, value: Statewire.Context, attach: StatewireHost.Attach) => void;
60
+ contextChanged?: (protocol: string, value: Statewire.Context, attach: StatewireHost.Attach) => void;
61
+ invoke?: (protocol: string, method: string, params: readonly unknown[]) => Promise<unknown>;
62
+ commands: Statewire.CommandsProxy<TCommands>;
63
+ connection?: StatewireClient.Connection;
64
+ source?: Statewire.StateSource;
65
+ /** Negation of the server's broadcast idle level; absent means always busy. */
66
+ isBusy?: boolean;
67
+ work?: {
68
+ readonly isIdle: boolean;
69
+ };
70
+ /** Called by the serving host once an attach is registered, before its hello: documents mounted here ride the hello. */
71
+ attaching?: (attach: StatewireHost.Attach) => void;
72
+ /** Called by the serving host when an attach ends; its ephemeral documents and includes are gone. */
73
+ detached?: (attach: StatewireHost.Attach) => void;
74
+ /** The retained failed-send lane; present on transports with a durable session. */
75
+ failures?: {
76
+ list: () => readonly StatewireClient.FailedCommand[];
77
+ retry: (entry: StatewireClient.FailedCommand) => Promise<unknown>;
78
+ discard: (entry: StatewireClient.FailedCommand) => void;
79
+ };
75
80
  }
76
- declare class StatewireSendError extends Error {
77
- readonly failure: StatewireClient.SendFailure;
78
- constructor(failure: StatewireClient.SendFailure);
81
+ export declare class StatewireSendError extends Error {
82
+ readonly failure: StatewireClient.SendFailure;
83
+ constructor(failure: StatewireClient.SendFailure);
79
84
  }
80
- //#endregion
81
- export { Statewire, StatewireSendError };
82
85
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;kBAMiB;OACH,UAAU,SAAS;OACnB,WAAW,mBAAmB;OAE9B,QAAQ,kBAAkB,WAAW,eAC9C,WAAW;IAAc,QAAQ;IAAG,QAAQ,WAAW,UAAU;aAC5D;OAEI,cAAc,kBAAkB,eACzC,WAAW,gBACP,MAAM,WAAW,UAAU,QAC3B,QAAQ,QAAQ,WAAW,UAAU;OAGhC,cAAc,kBAAkB,WAAW,eACpD,WAAW;aACD;IACT,QAAQ;IACR,QAAQ,WAAW,UAAU;IAC7B;IACA;IACA;IACA,UAAU,gBAAgB;aAEtB;;OAGI;IACV;;IAEA,mBAAmB;;IAEnB,cAAc;;OAGJ;IACN;IAAe,MAAM;IAAe;;IACpC;IAAW,MAAM;IAAe;;IAChC;IAAc,MAAM;;OAEd;IACV,YAAY;IACZ,eAAe;;;UAIF,UACf,cACA,kBAAkB,UAAU,WAAW,UAAU;EAEjD,OAAO;EACP,YAAY,mBAAmB;EAC/B,YAAY,kBAAkB;EAC9B,cAAc,kBAAkB,OAAO,UAAU;EACjD,mBACE,kBACA,OAAO,UAAU,SACjB,QAAQ,cAAc;EAExB,kBACE,kBACA,OAAO,UAAU,SACjB,QAAQ,cAAc;EAExB,UACE,kBACA,gBACA,+BACG;EACL,UAAU,UAAU,cAAc;EAClC,aAAa,gBAAgB;EAC7B,SAAS,UAAU;;EAEnB;EACA;aAAkB;;;EAElB,aAAa,QAAQ,cAAc;;EAEnC,YAAY,QAAQ,cAAc;;EAElC;IACE,qBAAqB,gBAAgB;IACrC,QAAQ,OAAO,gBAAgB,kBAAkB;IACjD,UAAU,OAAO,gBAAgB;;;cAuBxB,2BAA2B;WAC7B,SAAS,gBAAgB;EAEtB,YAAA,SAAS,gBAAgB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -1,4 +1,4 @@
1
- //#region src/types.ts
1
+ // src/types.ts
2
2
  const describe = (failure) => {
3
3
  switch (failure.fate) {
4
4
  case "rejected": return `statewire: command rejected${failure.code ? ` (${failure.code})` : ""}${failure.message ? `: ${failure.message}` : ""}`;
@@ -17,7 +17,6 @@ var StatewireSendError = class extends Error {
17
17
  this.failure = failure;
18
18
  }
19
19
  };
20
- //#endregion
21
20
  export { StatewireSendError };
22
21
 
23
22
  //# sourceMappingURL=types.js.map
@@ -1,6 +1,4 @@
1
- //#region src/util/draftTraps.d.ts
2
1
  type SharedTraps = Pick<ProxyHandler<object>, "defineProperty" | "setPrototypeOf" | "preventExtensions" | "ownKeys" | "getOwnPropertyDescriptor">;
3
- declare const sharedDraftTraps: (current: () => object, context: string) => SharedTraps;
4
- //#endregion
5
- export { sharedDraftTraps };
2
+ export declare const sharedDraftTraps: (current: () => object, context: string) => SharedTraps;
3
+ export {};
6
4
  //# sourceMappingURL=draftTraps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"draftTraps.d.ts","names":[],"sources":["../../src/util/draftTraps.ts"],"mappings":";KAAK,cAAc,KACjB;cAQW,mBACX,uBACA,oBACC"}
1
+ {"version":3,"file":"draftTraps.d.ts","sourceRoot":"","sources":["../../src/util/draftTraps.ts"],"names":[],"mappings":"AAAA,KAAK,WAAW,GAAG,IAAI,CACrB,YAAY,CAAC,MAAM,CAAC,EAClB,gBAAgB,GAChB,gBAAgB,GAChB,mBAAmB,GACnB,SAAS,GACT,0BAA0B,CAC7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,SAAS,MAAM,MAAM,EACrB,SAAS,MAAM,KACd,WAmBF,CAAC"}
@@ -1,4 +1,4 @@
1
- //#region src/util/draftTraps.ts
1
+ // src/util/draftTraps.ts
2
2
  const sharedDraftTraps = (current, context) => {
3
3
  const unsupported = (op) => {
4
4
  throw new Error(`statewire: ${op} is not supported ${context}`);
@@ -19,7 +19,6 @@ const sharedDraftTraps = (current, context) => {
19
19
  }
20
20
  };
21
21
  };
22
- //#endregion
23
22
  export { sharedDraftTraps };
24
23
 
25
24
  //# sourceMappingURL=draftTraps.js.map
@@ -1,5 +1,2 @@
1
- //#region src/util/macrotask.d.ts
2
- declare const createMacrotaskPoster: (callback: () => void) => (() => void);
3
- //#endregion
4
- export { createMacrotaskPoster };
1
+ export declare const createMacrotaskPoster: (callback: () => void) => (() => void);
5
2
  //# sourceMappingURL=macrotask.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"macrotask.d.ts","names":[],"sources":["../../src/util/macrotask.ts"],"mappings":";cAIa,wBAAyB"}
1
+ {"version":3,"file":"macrotask.d.ts","sourceRoot":"","sources":["../../src/util/macrotask.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,qBAAqB,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAoBvE,CAAC"}
@@ -1,4 +1,4 @@
1
- //#region src/util/macrotask.ts
1
+ // src/util/macrotask.ts
2
2
  const createMacrotaskPoster = (callback) => {
3
3
  if (typeof MessageChannel !== "undefined") {
4
4
  let port1 = null;
@@ -19,7 +19,6 @@ const createMacrotaskPoster = (callback) => {
19
19
  }
20
20
  return () => setTimeout(callback, 0);
21
21
  };
22
- //#endregion
23
22
  export { createMacrotaskPoster };
24
23
 
25
24
  //# sourceMappingURL=macrotask.js.map
@@ -1,5 +1,2 @@
1
- //#region src/util/methodProxy.d.ts
2
- declare const createMethodProxy: <T extends object>(dispatch: (method: string, params: unknown[]) => Promise<unknown>) => T;
3
- //#endregion
4
- export { createMethodProxy };
1
+ export declare const createMethodProxy: <T extends object>(dispatch: (method: string, params: unknown[]) => Promise<unknown>) => T;
5
2
  //# sourceMappingURL=methodProxy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"methodProxy.d.ts","names":[],"sources":["../../src/util/methodProxy.ts"],"mappings":";cAAa,oBAAqB,kBAChC,WAAW,gBAAgB,sBAAsB,qBAChD"}
1
+ {"version":3,"file":"methodProxy.d.ts","sourceRoot":"","sources":["../../src/util/methodProxy.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,MAAM,EAChD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,KAChE,CAaF,CAAC"}
@@ -1,4 +1,4 @@
1
- //#region src/util/methodProxy.ts
1
+ // src/util/methodProxy.ts
2
2
  const createMethodProxy = (dispatch) => {
3
3
  const memo = /* @__PURE__ */ new Map();
4
4
  return new Proxy({}, { get: (_target, method) => {
@@ -11,7 +11,6 @@ const createMethodProxy = (dispatch) => {
11
11
  return fn;
12
12
  } });
13
13
  };
14
- //#endregion
15
14
  export { createMethodProxy };
16
15
 
17
16
  //# sourceMappingURL=methodProxy.js.map
@@ -1,5 +1,2 @@
1
- //#region src/util/randomId.d.ts
2
- declare const randomId: () => string;
3
- //#endregion
4
- export { randomId };
1
+ export declare const randomId: () => string;
5
2
  //# sourceMappingURL=randomId.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"randomId.d.ts","names":[],"sources":["../../src/util/randomId.ts"],"mappings":";cAAa"}
1
+ {"version":3,"file":"randomId.d.ts","sourceRoot":"","sources":["../../src/util/randomId.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,QAAO,MAGhB,CAAC"}