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,25 +1,22 @@
1
- //#region src/document.d.ts
2
- declare namespace StatewireDocument {
3
- type Value = null | boolean | number | string | Value[] | {
4
- [key: string]: Value;
5
- };
6
- type MetaEntry = {
7
- path: (string | number)[];
8
- type: "date";
9
- };
10
- type Encoded = {
11
- value: Value;
12
- meta?: MetaEntry[];
13
- };
1
+ export declare namespace StatewireDocument {
2
+ type Value = null | boolean | number | string | Value[] | {
3
+ [key: string]: Value;
4
+ };
5
+ type MetaEntry = {
6
+ path: (string | number)[];
7
+ type: "date";
8
+ };
9
+ type Encoded = {
10
+ value: Value;
11
+ meta?: MetaEntry[];
12
+ };
14
13
  }
15
14
  /** Encode a document value as detached JSON data with date metadata. */
16
- declare const encodeDocument: (value: unknown) => StatewireDocument.Encoded;
15
+ export declare const encodeDocument: (value: unknown) => StatewireDocument.Encoded;
17
16
  /** Validate and decode a document into detached values with native dates. */
18
- declare const decodeDocument: (encoded: unknown) => unknown;
19
- declare const reviveDocumentValue: (value: unknown, meta: unknown, { rejectUnknown, canonical }?: {
20
- rejectUnknown?: boolean | undefined;
21
- canonical?: boolean | undefined;
17
+ export declare const decodeDocument: (encoded: unknown) => unknown;
18
+ export declare const reviveDocumentValue: (value: unknown, meta: unknown, { rejectUnknown, canonical }?: {
19
+ rejectUnknown?: boolean | undefined;
20
+ canonical?: boolean | undefined;
22
21
  }) => unknown;
23
- //#endregion
24
- export { StatewireDocument, decodeDocument, encodeDocument, reviveDocumentValue };
25
22
  //# sourceMappingURL=document.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"document.d.ts","names":[],"sources":["../src/document.ts"],"mappings":";kBAEiB;OACH,2CAKR;KACG,cAAc;;OACT;IAAc;IAA2B;;OACzC;IAAY,OAAO;IAAO,OAAO;;;;cAoGlC,iBAAkB,mBAAiB,kBAAkB;;cAOrD,iBAAkB;cAiBlB,sBACX,gBACA,iBACA,eAAA"}
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"AAEA,yBAAiB,iBAAiB,CAAC;IACjC,KAAY,KAAK,GACb,IAAI,GACJ,OAAO,GACP,MAAM,GACN,MAAM,GACN,KAAK,EAAE,GACP;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAA;KAAE,CAAC;IAC7B,KAAY,SAAS,GAAG;QAAE,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,KAAY,OAAO,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAA;KAAE,CAAC;CAC5D;AAkGD,wEAAwE;AACxE,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,KAAG,iBAAiB,CAAC,OAIjE,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,cAAc,GAAI,SAAS,OAAO,KAAG,OAejD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,OAAO,OAAO,EACd,MAAM,OAAO,EACb;;;CAAiD,KAChD,OA6CF,CAAC"}
package/dist/document.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { isUnsafeKey, walkStatePath } from "./util/statePath.js";
2
- //#region src/document.ts
2
+ // src/document.ts
3
3
  const invalid = (message) => {
4
4
  throw new Error(`statewire: protocol error: invalid document: ${message}`);
5
5
  };
@@ -82,7 +82,6 @@ const reviveDocumentValue = (value, meta, { rejectUnknown = false, canonical = f
82
82
  }
83
83
  return value;
84
84
  };
85
- //#endregion
86
85
  export { decodeDocument, encodeDocument, reviveDocumentValue };
87
86
 
88
87
  //# sourceMappingURL=document.js.map
@@ -1,8 +1,5 @@
1
- import { StatewireHostInternal } from "../host-internal.js";
2
- //#region src/host/adapter.d.ts
3
- declare const CLIENT_QUERY_PARAM = "client";
4
- declare const clientIdFromUrl: (url: string | null | undefined) => string;
5
- declare const textFrameOrClose: (socket: Pick<StatewireHostInternal.Socket, "send" | "close">, data: unknown) => string | null;
6
- //#endregion
7
- export { CLIENT_QUERY_PARAM, clientIdFromUrl, textFrameOrClose };
1
+ import type { StatewireHostInternal } from "../host-internal.js";
2
+ export declare const CLIENT_QUERY_PARAM = "client";
3
+ export declare const clientIdFromUrl: (url: string | null | undefined) => string;
4
+ export declare const textFrameOrClose: (socket: Pick<StatewireHostInternal.Socket, "send" | "close">, data: unknown) => string | null;
8
5
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","names":[],"sources":["../../src/host/adapter.ts"],"mappings":";;cAGa;cAEA,kBAAmB;cAuBnB,mBACX,QAAQ,KAAK,sBAAsB,2BACnC"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/host/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,4BAAyB;AAE9D,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MAqBhE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAC5D,MAAM,OAAO,KACZ,MAAM,GAAG,IASX,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { CLIENT_ID_RE } from "./socket.js";
2
- //#region src/host/adapter.ts
2
+ // src/host/adapter.ts
3
3
  const CLIENT_QUERY_PARAM = "client";
4
4
  const clientIdFromUrl = (url) => {
5
5
  if (!url) throw new Error("statewire: cannot resolve client id: missing url");
@@ -23,7 +23,6 @@ const textFrameOrClose = (socket, data) => {
23
23
  socket.close(1008, "malformed frame");
24
24
  return null;
25
25
  };
26
- //#endregion
27
26
  export { CLIENT_QUERY_PARAM, clientIdFromUrl, textFrameOrClose };
28
27
 
29
28
  //# sourceMappingURL=adapter.js.map
@@ -1,25 +1,22 @@
1
- import { Statewire } from "../types.js";
2
- import { StatewirePath } from "../wire/ops.js";
3
- //#region src/host/draft.d.ts
4
- type DraftHost = {
5
- snapshot: () => unknown;
6
- record: (op: Statewire.Op, changedPath: StatewirePath) => void;
1
+ import type { Statewire } from "../types.js";
2
+ import type { StatewirePath } from "../wire/ops.js";
3
+ export type DraftHost = {
4
+ snapshot: () => unknown;
5
+ record: (op: Statewire.Op, changedPath: StatewirePath) => void;
7
6
  };
8
- type StateDraft<T> = {
9
- proxy: T;
10
- /** Seal pending writes and return the committed state. */
11
- flush: () => unknown;
12
- /** Committed state was replaced externally; cached nodes re-resolve. */
13
- invalidate: () => void;
7
+ export type StateDraft<T> = {
8
+ proxy: T;
9
+ /** Seal pending writes and return the committed state. */
10
+ flush: () => unknown;
11
+ /** Committed state was replaced externally; cached nodes re-resolve. */
12
+ invalidate: () => void;
14
13
  };
15
- declare const createStateDraft: <T>(host: DraftHost) => StateDraft<T>;
14
+ export declare const createStateDraft: <T>(host: DraftHost) => StateDraft<T>;
16
15
  /**
17
16
  * Append `suffix` to the string at `parent[key]` on a statewire state draft,
18
17
  * recording a single end-offset text-insert `add` op instead of a full
19
18
  * `replace` — use it on token-streaming hot paths. Throws when the current
20
19
  * value is not a string.
21
20
  */
22
- declare const append: <TKey extends string | number>(parent: { readonly [P in TKey]: string; }, key: TKey, suffix: string) => void;
23
- //#endregion
24
- export { DraftHost, StateDraft, append, createStateDraft };
21
+ export declare const append: <TKey extends string | number>(parent: { readonly [P in TKey]: string; }, key: TKey, suffix: string) => void;
25
22
  //# sourceMappingURL=draft.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"draft.d.ts","names":[],"sources":["../../src/host/draft.ts"],"mappings":";;;KAMY;EACV;EACA,SAAS,IAAI,UAAU,IAAI,aAAa;;KAG9B,WAAW;EACrB,OAAO;;EAEP;;EAEA;;cAuCW,mBAAoB,GAAG,MAAM,cAAY,WAAW;;;;;;;cA0QpD,SAAU,8BACrB,oBAAoB,KAAK,kBACzB,KAAK,MACL"}
1
+ {"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../src/host/draft.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAiB;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAoB;AAKjD,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,MAAM,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,aAAa,KAAK,IAAI,CAAC;CAChE,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAC1B,KAAK,EAAE,CAAC,CAAC;IACT,0DAA0D;IAC1D,KAAK,EAAE,MAAM,OAAO,CAAC;IACrB,wEAAwE;IACxE,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAsCF,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,MAAM,SAAS,KAAG,UAAU,CAAC,CAAC,CAkQjE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,IAAI,SAAS,MAAM,GAAG,MAAM,EACjD,QAAQ,EAAE,QAAQ,EAAE,CAAC,IAAI,IAAI,GAAG,MAAM,GAAE,EACxC,KAAK,IAAI,EACT,QAAQ,MAAM,KACb,IASF,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { isUnsafeKey } from "../util/statePath.js";
2
2
  import { sharedDraftTraps } from "../util/draftTraps.js";
3
3
  import { sanitizeValue } from "../wire/ops.js";
4
- //#region src/host/draft.ts
4
+ // src/host/draft.ts
5
5
  const NODE = Symbol("statewire.draftNode");
6
6
  const isIndex = (key) => /^(0|[1-9]\d*)$/.test(key);
7
7
  const invalid = (path, message) => /* @__PURE__ */ new Error(`statewire: ${message} at path: ${path.join(".")}`);
@@ -213,7 +213,6 @@ const append = (parent, key, suffix) => {
213
213
  if (typeof suffix !== "string") throw new Error("statewire: append suffix must be a string");
214
214
  handle.append(key, suffix);
215
215
  };
216
- //#endregion
217
216
  export { append, createStateDraft };
218
217
 
219
218
  //# sourceMappingURL=draft.js.map
@@ -1,16 +1,13 @@
1
- //#region src/host/engine.d.ts
2
1
  /**
3
2
  * Definitive handler rejection: the command settles rejected and
4
3
  * message/payload travel to the client's rejected promise.
5
4
  */
6
- declare class StatewireReject extends Error {
7
- readonly code?: string;
8
- readonly payload?: unknown;
9
- constructor(message: string, options?: {
10
- code?: string;
11
- payload?: unknown;
12
- });
5
+ export declare class StatewireReject extends Error {
6
+ readonly code?: string;
7
+ readonly payload?: unknown;
8
+ constructor(message: string, options?: {
9
+ code?: string;
10
+ payload?: unknown;
11
+ });
13
12
  }
14
- //#endregion
15
- export { StatewireReject };
16
13
  //# sourceMappingURL=engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","names":[],"sources":["../../src/host/engine.ts"],"mappings":";;;;;cAIa,wBAAwB;WAC1B;WACA;EAEG,YAAA,iBAAiB;IAAY;IAAe"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/host/engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEf,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;CAM5E"}
@@ -1,4 +1,4 @@
1
- //#region src/host/engine.ts
1
+ // src/host/engine.ts
2
2
  /**
3
3
  * Definitive handler rejection: the command settles rejected and
4
4
  * message/payload travel to the client's rejected promise.
@@ -13,7 +13,6 @@ var StatewireReject = class extends Error {
13
13
  if (options?.payload !== void 0) this.payload = options.payload;
14
14
  }
15
15
  };
16
- //#endregion
17
16
  export { StatewireReject };
18
17
 
19
18
  //# sourceMappingURL=engine.js.map
@@ -1,53 +1,50 @@
1
- import { StatewireHost } from "../host.js";
2
- import { Statewire } from "../types.js";
3
- //#region src/host/host.d.ts
4
- declare const documentIdentity: (protocol: string, key?: readonly string[]) => string;
1
+ import type { Statewire } from "../types.js";
2
+ import type { StatewireHost } from "../host.js";
3
+ export declare const documentIdentity: (protocol: string, key?: readonly string[]) => string;
5
4
  /** Host-side accessor for a `useStatewireState` state object's source (`snapshot()` reads the committed state). */
6
- declare const getStateHost: (state: object) => StatewireHost.StateHost | undefined;
7
- declare const useStatewireState: <TState>(init: () => TState) => readonly [TState, StatewireHost.StateCtl<TState>];
8
- type CommandsInvocation = {
9
- readonly protocol?: string;
10
- readonly method: string;
11
- readonly params: readonly unknown[];
12
- readonly ts: number;
13
- readonly seq: number;
14
- readonly clientId?: string;
5
+ export declare const getStateHost: (state: object) => StatewireHost.StateHost | undefined;
6
+ export declare const useStatewireState: <TState>(init: () => TState) => readonly [TState, StatewireHost.StateCtl<TState>];
7
+ export type CommandsInvocation = {
8
+ readonly protocol?: string;
9
+ readonly method: string;
10
+ readonly params: readonly unknown[];
11
+ readonly ts: number;
12
+ readonly seq: number;
13
+ readonly clientId?: string;
15
14
  };
16
- type CommandsOutcome = {
17
- type: "accepted";
18
- payload?: unknown;
15
+ export type CommandsOutcome = {
16
+ type: "accepted";
17
+ payload?: unknown;
19
18
  } | {
20
- type: "rejected";
21
- error: unknown;
19
+ type: "rejected";
20
+ error: unknown;
22
21
  };
23
- type CommandsListener = {
24
- onStart: (inv: CommandsInvocation) => void;
25
- onPosted?: (inv: CommandsInvocation) => void;
26
- onApplied: (inv: CommandsInvocation) => void;
27
- /** Canonical state now covers the invocation's effect — drop any overlay. */
28
- onCovered?: (inv: CommandsInvocation) => void;
29
- onSettle: (inv: CommandsInvocation, outcome: CommandsOutcome) => void;
22
+ export type CommandsListener = {
23
+ onStart: (inv: CommandsInvocation) => void;
24
+ onPosted?: (inv: CommandsInvocation) => void;
25
+ onApplied: (inv: CommandsInvocation) => void;
26
+ /** Canonical state now covers the invocation's effect — drop any overlay. */
27
+ onCovered?: (inv: CommandsInvocation) => void;
28
+ onSettle: (inv: CommandsInvocation, outcome: CommandsOutcome) => void;
30
29
  };
31
- type CommandsSubmission = {
32
- method: string;
33
- params: readonly unknown[];
34
- clientId?: string;
35
- caller?: StatewireHost.Caller;
36
- context?: Statewire.Context;
37
- attach?: StatewireHost.Attach;
38
- onApplied?: () => void;
39
- onSettle?: (outcome: CommandsOutcome) => void;
30
+ export type CommandsSubmission = {
31
+ method: string;
32
+ params: readonly unknown[];
33
+ clientId?: string;
34
+ caller?: StatewireHost.Caller;
35
+ context?: Statewire.Context;
36
+ attach?: StatewireHost.Attach;
37
+ onApplied?: () => void;
38
+ onSettle?: (outcome: CommandsOutcome) => void;
40
39
  };
41
- type CommandsHost = {
42
- setListener: (listener: CommandsListener | null) => void;
43
- submit?: (call: CommandsSubmission) => Promise<unknown>;
44
- /** Registered command names, read live. */
45
- methods?: () => string[];
46
- abort?: () => void;
40
+ export type CommandsHost = {
41
+ setListener: (listener: CommandsListener | null) => void;
42
+ submit?: (call: CommandsSubmission) => Promise<unknown>;
43
+ /** Registered command names, read live. */
44
+ methods?: () => string[];
45
+ abort?: () => void;
47
46
  };
48
- declare const getCommandsHost: (commands: object) => CommandsHost | undefined;
49
- declare const bindCommandsHost: (commands: object, host: CommandsHost) => void;
50
- declare const useStatewireCommands: <THandlers extends Statewire.Commands>(commands: (THandlers & ThisType<StatewireHost.Ctx>) | undefined | null | false, options?: StatewireHost.CommandsOptions) => Statewire.CommandsProxy<StatewireHost.HandledCommands<THandlers>>;
51
- //#endregion
52
- export { CommandsHost, CommandsInvocation, CommandsListener, CommandsOutcome, CommandsSubmission, bindCommandsHost, documentIdentity, getCommandsHost, getStateHost, useStatewireCommands, useStatewireState };
47
+ export declare const getCommandsHost: (commands: object) => CommandsHost | undefined;
48
+ export declare const bindCommandsHost: (commands: object, host: CommandsHost) => void;
49
+ export declare const useStatewireCommands: <THandlers extends Statewire.Commands>(commands: (THandlers & ThisType<StatewireHost.Ctx>) | undefined | null | false, options?: StatewireHost.CommandsOptions) => Statewire.CommandsProxy<StatewireHost.HandledCommands<THandlers>>;
53
50
  //# sourceMappingURL=host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","names":[],"sources":["../../src/host/host.ts"],"mappings":";;;cAmBa,mBAAoB,kBAAkB;;cAItC,eACX,kBACC,cAAc;cAeJ,oBAAqB,QAChC,YAAY,qBACD,QAAQ,cAAc,SAAS;KAqGhC;WACD;WACA;WACA;WACA;WACA;WACA;;KAGC;EACN;EAAkB;;EAClB;EAAkB;;KAEZ;EACV,UAAU,KAAK;EACf,YAAY,KAAK;EACjB,YAAY,KAAK;;EAEjB,aAAa,KAAK;EAClB,WAAW,KAAK,oBAAoB,SAAS;;KAGnC;EACV;EACA;EACA;EACA,SAAS,cAAc;EACvB,UAAU,UAAU;EACpB,SAAS,cAAc;EACvB;EACA,YAAY,SAAS;;KAGX;EACV,cAAc,UAAU;EACxB,UAAU,MAAM,uBAAuB;;EAEvC;EACA;;cAKW,kBAAmB,qBAAmB;cAGtC,mBAAoB,kBAAkB,MAAM;cAoO5C,uBAAwB,kBAAkB,UAAU,UAC/D,WACK,YAAY,SAAS,cAAc,kCAIxC,UAAU,cAAc,oBACvB,UAAU,cAAc,cAAc,gBAAgB"}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/host/host.ts"],"names":[],"mappings":"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"}
package/dist/host/host.js CHANGED
@@ -5,7 +5,7 @@ import { createStateDraft } from "./draft.js";
5
5
  import { createMethodProxy } from "../util/methodProxy.js";
6
6
  import { StatewireSendError } from "../types.js";
7
7
  import { useEffect, useState } from "@assistant-ui/tap/react-shim";
8
- //#region src/host/host.ts
8
+ // src/host/host.ts
9
9
  const isDev = () => typeof process === "undefined" || process.env["NODE_ENV"] !== "production";
10
10
  const stateHosts = /* @__PURE__ */ new WeakMap();
11
11
  const documentIdentity = (protocol, key) => JSON.stringify([protocol, key ?? null]);
@@ -107,17 +107,20 @@ const LOCAL_CALLER = Object.freeze({
107
107
  auth: void 0,
108
108
  isConnected: true
109
109
  });
110
- const toSendError = (error) => error instanceof StatewireSendError ? error : error instanceof StatewireReject ? new StatewireSendError({
111
- fate: "rejected",
112
- cause: "server",
113
- message: error.message,
114
- ...error.code !== void 0 && { code: error.code },
115
- ...error.payload !== void 0 && { payload: error.payload }
116
- }) : new StatewireSendError({
117
- fate: "failed",
118
- cause: "server",
119
- message: error instanceof Error ? error.message : String(error)
120
- });
110
+ const toSendError = (error) => {
111
+ if (!(error instanceof StatewireSendError) && !(error instanceof StatewireReject)) console.error("statewire command failed", error);
112
+ return error instanceof StatewireSendError ? error : error instanceof StatewireReject ? new StatewireSendError({
113
+ fate: "rejected",
114
+ cause: "server",
115
+ message: error.message,
116
+ ...error.code !== void 0 && { code: error.code },
117
+ ...error.payload !== void 0 && { payload: error.payload }
118
+ }) : new StatewireSendError({
119
+ fate: "failed",
120
+ cause: "server",
121
+ message: "the command failed"
122
+ });
123
+ };
121
124
  const applyInvocation = (cell, inv) => {
122
125
  if (inv.applied) return;
123
126
  inv.applied = true;
@@ -348,7 +351,6 @@ const useStatewireCommands = (commands, options) => {
348
351
  });
349
352
  return built.proxy;
350
353
  };
351
- //#endregion
352
354
  export { bindCommandsHost, documentIdentity, getCommandsHost, getStateHost, useStatewireCommands, useStatewireState };
353
355
 
354
356
  //# sourceMappingURL=host.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.js","names":["captureContext","useEffect","useState","applyOps","sanitizeValue","StatewirePath","StatewireReject","createStateDraft","createMethodProxy","StateDraft","StatewireSendError","Statewire","StatewireHost","isDev","process","env","stateHosts","WeakMap","StateHost","documentIdentity","protocol","key","JSON","stringify","getStateHost","state","get","StateCell","current","draft","changed","documents","Map","Document","onOp","op","Op","onChange","onDocuments","ctl","StateCtl","host","bump","useStatewireState","init","TState","setVersion","cell","commit","c","flush","v","apply","ops","result","invalidate","push","changedPaths","snapshot","setOnOp","listener","setOnChange","takeChanged","mount","value","options","main","undefined","id","doc","Error","set","unmount","delete","setOnDocuments","record","changedPath","proxy","const","Settled","type","error","CommandsInvocation","method","params","ts","seq","clientId","CommandsOutcome","payload","CommandsListener","onStart","inv","onPosted","onApplied","onCovered","onSettle","outcome","CommandsSubmission","caller","Caller","context","Context","attach","Attach","CommandsHost","setListener","submit","call","Promise","methods","abort","commandsHosts","getCommandsHost","commands","bindCommandsHost","QueuedCall","resolve","reject","origin","ActiveInvocation","applied","controller","AbortController","settled","CommandsCell","handlers","Record","args","queue","active","running","unmounted","stallTimer","ReturnType","setTimeout","STALL_WARN_MS","LOCAL_CALLER","Object","freeze","auth","isConnected","toSendError","fate","cause","message","code","String","applyInvocation","settleInvocation","abortInvocations","clear","isThenable","PromiseLike","then","handlerOf","prototype","propertyIsEnumerable","handler","dispatch","ctx","Ctx","signal","this","resolved","pump","watchStall","shift","length","console","warn","useStatewireCommands","Commands","THandlers","ThisType","CommandsOptions","CommandsProxy","HandledCommands","built","Date","now","keys","filter","clearTimeout","queueMicrotask","queued","startsWith"],"sources":["../../src/host/host.ts"],"sourcesContent":["import { captureContext } from \"../wire/context\";\nimport { useEffect, useState } from \"react\";\nimport { applyOps, sanitizeValue } from \"../wire/ops\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport { StatewireReject } from \"./engine\";\nimport { createStateDraft } from \"./draft\";\nimport { createMethodProxy } from \"../util/methodProxy\";\nimport type { StateDraft } from \"./draft\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\n\nconst isDev = () =>\n typeof process === \"undefined\" || process.env[\"NODE_ENV\"] !== \"production\";\n\n// ─── state ──────────────────────────────────────────────\n\nconst stateHosts = new WeakMap<object, StatewireHost.StateHost>();\n\nexport const documentIdentity = (protocol: string, key?: readonly string[]) =>\n JSON.stringify([protocol, key ?? null]);\n\n/** Host-side accessor for a `useStatewireState` state object's source (`snapshot()` reads the committed state). */\nexport const getStateHost = (\n state: object,\n): StatewireHost.StateHost | undefined => stateHosts.get(state);\n\ntype StateCell = {\n current: unknown;\n draft: StateDraft<object> | null;\n changed: StatewirePath[];\n documents: Map<string, StatewireHost.Document>;\n onOp: ((op: Statewire.Op) => void) | null;\n onChange: (() => void) | null;\n onDocuments: (() => void) | null;\n ctl: StatewireHost.StateCtl;\n host: StatewireHost.StateHost;\n bump: () => void;\n};\n\nexport const useStatewireState = <TState>(\n init: () => TState,\n): readonly [TState, StatewireHost.StateCtl<TState>] => {\n const [, setVersion] = useState(0);\n const [cell] = useState((): StateCell => {\n const commit = () => {\n if (c.draft) c.current = c.draft.flush();\n return c.current;\n };\n const c: StateCell = {\n current: sanitizeValue(init()),\n draft: null,\n changed: [[]],\n documents: new Map(),\n onOp: null,\n onChange: null,\n onDocuments: null,\n bump: () => setVersion((v) => v + 1),\n ctl: {\n apply: (ops) => {\n const result = applyOps(commit(), ops);\n c.current = result.state;\n c.draft?.invalidate();\n c.changed.push(...result.changedPaths);\n if (c.onOp) for (const op of ops) c.onOp(op);\n c.bump();\n c.onChange?.();\n },\n snapshot: commit,\n },\n host: {\n snapshot: commit,\n setOnOp: (listener) => {\n c.onOp = listener;\n },\n setOnChange: (listener) => {\n c.onChange = listener;\n },\n takeChanged: () => {\n const changed = c.changed;\n c.changed = [];\n return changed;\n },\n mount: (protocol, value, options) => {\n const key = options?.key;\n const main = options?.main ?? key === undefined;\n if (main) {\n for (const [id, doc] of c.documents) {\n if (\n doc.protocol === protocol &&\n doc.main &&\n id !== documentIdentity(protocol, key)\n )\n throw new Error(\n `statewire: ${protocol} already has a main document`,\n );\n }\n }\n c.documents.set(documentIdentity(protocol, key), {\n protocol,\n key: key === undefined ? null : [...key],\n main,\n value: sanitizeValue(value),\n });\n c.onDocuments?.();\n },\n unmount: (protocol, key) => {\n if (!c.documents.delete(documentIdentity(protocol, key)))\n throw new Error(\"statewire: document is not mounted\");\n c.onDocuments?.();\n },\n documents: () => c.documents,\n setOnDocuments: (listener) => {\n c.onDocuments = listener;\n },\n },\n };\n return c;\n });\n\n let value = cell.ctl.snapshot();\n if (typeof value === \"object\" && value !== null) {\n cell.draft ??= createStateDraft<object>({\n snapshot: () => cell.current,\n record: (op, changedPath) => {\n cell.changed.push(changedPath);\n cell.onOp?.(op);\n cell.bump();\n cell.onChange?.();\n },\n });\n stateHosts.set(cell.draft.proxy, cell.host);\n value = cell.draft.proxy;\n }\n return [value as TState, cell.ctl as StatewireHost.StateCtl<TState>] as const;\n};\n\n// ─── commands ───────────────────────────────────────────\n\ntype Settled =\n | { type: \"resolved\"; value: unknown }\n | { type: \"rejected\"; error: unknown };\n\nexport type CommandsInvocation = {\n readonly protocol?: string;\n readonly method: string;\n readonly params: readonly unknown[];\n readonly ts: number;\n readonly seq: number;\n readonly clientId?: string;\n};\n\nexport type CommandsOutcome =\n | { type: \"accepted\"; payload?: unknown }\n | { type: \"rejected\"; error: unknown };\n\nexport type CommandsListener = {\n onStart: (inv: CommandsInvocation) => void;\n onPosted?: (inv: CommandsInvocation) => void;\n onApplied: (inv: CommandsInvocation) => void;\n /** Canonical state now covers the invocation's effect — drop any overlay. */\n onCovered?: (inv: CommandsInvocation) => void;\n onSettle: (inv: CommandsInvocation, outcome: CommandsOutcome) => void;\n};\n\nexport type CommandsSubmission = {\n method: string;\n params: readonly unknown[];\n clientId?: string;\n caller?: StatewireHost.Caller;\n context?: Statewire.Context;\n attach?: StatewireHost.Attach;\n onApplied?: () => void;\n onSettle?: (outcome: CommandsOutcome) => void;\n};\n\nexport type CommandsHost = {\n setListener: (listener: CommandsListener | null) => void;\n submit?: (call: CommandsSubmission) => Promise<unknown>;\n /** Registered command names, read live. */\n methods?: () => string[];\n abort?: () => void;\n};\n\nconst commandsHosts = new WeakMap<object, CommandsHost>();\n\nexport const getCommandsHost = (commands: object): CommandsHost | undefined =>\n commandsHosts.get(commands);\n\nexport const bindCommandsHost = (commands: object, host: CommandsHost) => {\n commandsHosts.set(commands, host);\n};\n\ntype QueuedCall = {\n context?: Statewire.Context;\n method: string;\n params: readonly unknown[];\n ts: number;\n resolve: (value: unknown) => void;\n reject: (error: unknown) => void;\n origin?: CommandsSubmission;\n};\n\ntype ActiveInvocation = CommandsInvocation & {\n applied: boolean;\n controller: AbortController;\n settled: boolean;\n origin?: CommandsSubmission;\n};\n\ntype CommandsCell = {\n context: (() => Statewire.Context) | undefined;\n handlers: Record<string, (...args: never[]) => unknown> | null;\n queue: QueuedCall[];\n active: Map<ActiveInvocation, QueuedCall>;\n running: boolean;\n listener: CommandsListener | null;\n seq: number;\n unmounted: boolean;\n stallTimer: ReturnType<typeof setTimeout> | null;\n};\n\nconst STALL_WARN_MS = 5000;\n\n// In-process dispatch has no wire client: trivially attached.\nconst LOCAL_CALLER: StatewireHost.Caller = Object.freeze({\n get clientId(): string {\n throw new Error(\"statewire: in-process dispatch has no client id\");\n },\n auth: undefined,\n isConnected: true,\n});\n\nconst toSendError = (error: unknown): StatewireSendError =>\n error instanceof StatewireSendError\n ? error\n : error instanceof StatewireReject\n ? new StatewireSendError({\n fate: \"rejected\",\n cause: \"server\",\n message: error.message,\n ...(error.code !== undefined && { code: error.code }),\n ...(error.payload !== undefined && { payload: error.payload }),\n })\n : new StatewireSendError({\n fate: \"failed\",\n cause: \"server\",\n message: error instanceof Error ? error.message : String(error),\n });\n\nconst applyInvocation = (cell: CommandsCell, inv: ActiveInvocation) => {\n if (inv.applied) return;\n inv.applied = true;\n cell.listener?.onApplied(inv);\n cell.listener?.onCovered?.(inv);\n inv.origin?.onApplied?.();\n};\n\nconst settleInvocation = (\n cell: CommandsCell,\n inv: ActiveInvocation,\n call: QueuedCall,\n settled: Settled,\n) => {\n if (inv.settled) return;\n inv.settled = true;\n cell.active.delete(inv);\n if (settled.type === \"resolved\") {\n applyInvocation(cell, inv);\n const outcome: CommandsOutcome =\n settled.value === undefined\n ? { type: \"accepted\" }\n : { type: \"accepted\", payload: sanitizeValue(settled.value) };\n cell.listener?.onSettle(inv, outcome);\n inv.origin?.onSettle?.(outcome);\n call.resolve(outcome.payload);\n } else {\n cell.listener?.onCovered?.(inv);\n const error = toSendError(settled.error);\n const outcome: CommandsOutcome = { type: \"rejected\", error };\n cell.listener?.onSettle(inv, outcome);\n inv.origin?.onSettle?.(outcome);\n call.reject(error);\n }\n};\n\nconst abortInvocations = (cell: CommandsCell) => {\n for (const [inv, call] of cell.active) {\n inv.settled = true;\n inv.controller.abort();\n const error = new StatewireSendError({ fate: \"crashed\", cause: \"server\" });\n const outcome: CommandsOutcome = { type: \"rejected\", error };\n cell.listener?.onSettle(inv, outcome);\n inv.origin?.onSettle?.(outcome);\n call.reject(error);\n }\n cell.active.clear();\n};\n\nconst isThenable = (value: unknown): value is PromiseLike<unknown> =>\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { then?: unknown }).then === \"function\";\n\n// A command is an own, enumerable, function-valued property — exactly what\n// `Object.keys` shows, so dispatch, `statewire/commands`, and the reserved-\n// namespace guard share one view; prototype-chain names are not commands.\nconst handlerOf = (\n handlers: Record<string, (...args: never[]) => unknown>,\n method: string,\n): ((...args: never[]) => unknown) | undefined => {\n if (!Object.prototype.propertyIsEnumerable.call(handlers, method)) {\n return undefined;\n }\n const handler = handlers[method];\n return typeof handler === \"function\" ? handler : undefined;\n};\n\nconst dispatch = (cell: CommandsCell, call: QueuedCall) => {\n const handler = handlerOf(cell.handlers!, call.method);\n if (handler === undefined) {\n const error = new StatewireSendError({\n fate: \"rejected\",\n cause: \"server\",\n code: \"unknown-command\",\n });\n call.origin?.onSettle?.({ type: \"rejected\", error });\n call.reject(error);\n return;\n }\n const inv: ActiveInvocation = {\n method: call.method,\n params: call.params,\n ts: call.ts,\n seq: ++cell.seq,\n applied: false,\n controller: new AbortController(),\n settled: false,\n ...(call.origin !== undefined && { origin: call.origin }),\n ...(call.origin?.clientId !== undefined && {\n clientId: call.origin.clientId,\n }),\n };\n cell.active.set(inv, call);\n cell.listener?.onStart(inv);\n cell.listener?.onPosted?.(inv);\n const attach = call.origin?.attach;\n const ctx: StatewireHost.Ctx = {\n caller: call.origin?.caller ?? LOCAL_CALLER,\n context: call.context ?? call.origin?.context ?? Object.freeze({}),\n get attach() {\n if (attach === undefined)\n throw new Error(\"statewire: in-process dispatch has no attach\");\n return attach;\n },\n signal: inv.controller.signal,\n applied: () => {\n if (!inv.settled) applyInvocation(cell, inv);\n },\n };\n try {\n const value = (\n handler as (\n this: StatewireHost.Ctx,\n ...args: readonly unknown[]\n ) => unknown\n ).call(ctx, ...call.params);\n if (isThenable(value)) {\n value.then(\n (resolved) =>\n settleInvocation(cell, inv, call, {\n type: \"resolved\",\n value: resolved,\n }),\n (error: unknown) =>\n settleInvocation(cell, inv, call, { type: \"rejected\", error }),\n );\n } else {\n settleInvocation(cell, inv, call, { type: \"resolved\", value });\n }\n } catch (error) {\n settleInvocation(cell, inv, call, { type: \"rejected\", error });\n }\n};\n\n// Prefix-only advancement: each handler runs synchronously to its first\n// await, then the pump moves on; settlement rides the returned promise.\nconst pump = (cell: CommandsCell) => {\n if (cell.running || !cell.handlers) {\n watchStall(cell);\n return;\n }\n cell.running = true;\n try {\n while (cell.handlers) {\n const call = cell.queue.shift();\n if (!call) break;\n dispatch(cell, call);\n }\n } finally {\n cell.running = false;\n }\n};\n\nconst watchStall = (cell: CommandsCell) => {\n if (!isDev() || cell.stallTimer !== null || cell.queue.length === 0) return;\n if (cell.handlers) return;\n cell.stallTimer = setTimeout(() => {\n cell.stallTimer = null;\n if (cell.handlers === null && cell.queue.length > 0 && !cell.unmounted) {\n console.warn(\n `statewire: ${cell.queue.length} buffered command(s) waiting over ${STALL_WARN_MS}ms — did the host forget to arm useStatewireCommands?`,\n );\n }\n }, STALL_WARN_MS);\n};\n\nexport const useStatewireCommands = <THandlers extends Statewire.Commands>(\n commands:\n | (THandlers & ThisType<StatewireHost.Ctx>)\n | undefined\n | null\n | false,\n options?: StatewireHost.CommandsOptions,\n): Statewire.CommandsProxy<StatewireHost.HandledCommands<THandlers>> => {\n const [built] = useState(() => {\n const cell: CommandsCell = {\n context: undefined,\n handlers: null,\n queue: [],\n active: new Map(),\n running: false,\n listener: null,\n seq: 0,\n unmounted: false,\n stallTimer: null,\n };\n const proxy = createMethodProxy<\n Statewire.CommandsProxy<StatewireHost.HandledCommands<THandlers>>\n >(\n (method, params) =>\n new Promise((resolve, reject) => {\n if (cell.unmounted) {\n reject(new Error(\"statewire: commands called after unmount\"));\n return;\n }\n cell.queue.push({\n context: captureContext(cell.context?.() ?? {}),\n method,\n params,\n ts: Date.now(),\n resolve,\n reject,\n });\n pump(cell);\n }),\n );\n commandsHosts.set(proxy, {\n abort: () => abortInvocations(cell),\n setListener: (listener) => {\n cell.listener = listener;\n },\n methods: () => {\n const handlers = cell.handlers;\n if (!handlers) return [];\n return Object.keys(handlers).filter(\n (method) => handlerOf(handlers, method) !== undefined,\n );\n },\n submit: (origin) =>\n new Promise((resolve, reject) => {\n if (cell.unmounted) {\n reject(new Error(\"statewire: commands called after unmount\"));\n return;\n }\n cell.queue.push({\n method: origin.method,\n params: origin.params,\n ts: Date.now(),\n resolve,\n reject,\n origin,\n });\n pump(cell);\n }),\n });\n return { cell, proxy };\n });\n\n built.cell.context = options?.context;\n useEffect(() => {\n const { cell } = built;\n cell.unmounted = false;\n return () => {\n cell.unmounted = true;\n cell.handlers = null;\n if (cell.stallTimer !== null) {\n clearTimeout(cell.stallTimer);\n cell.stallTimer = null;\n }\n queueMicrotask(() => {\n if (!cell.unmounted) return;\n abortInvocations(cell);\n const queued = cell.queue;\n cell.queue = [];\n for (const call of queued) {\n call.reject(new Error(\"statewire: unmounted\"));\n }\n });\n };\n }, [built]);\n\n useEffect(() => {\n if (commands) {\n for (const method of Object.keys(commands)) {\n if (method.startsWith(\"statewire/\")) {\n throw new Error(\n `statewire: cannot register \"${method}\": the \"statewire/\" method namespace is reserved`,\n );\n }\n }\n }\n built.cell.handlers = commands || null;\n pump(built.cell);\n });\n\n return built.proxy;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"host.js","names":["captureContext","useEffect","useState","applyOps","sanitizeValue","StatewirePath","StatewireReject","createStateDraft","createMethodProxy","StateDraft","StatewireSendError","Statewire","StatewireHost","isDev","process","env","stateHosts","WeakMap","StateHost","documentIdentity","protocol","key","JSON","stringify","getStateHost","state","get","StateCell","current","draft","changed","documents","Map","Document","onOp","op","Op","onChange","onDocuments","ctl","StateCtl","host","bump","useStatewireState","init","TState","setVersion","cell","commit","c","flush","v","apply","ops","result","invalidate","push","changedPaths","snapshot","setOnOp","listener","setOnChange","takeChanged","mount","value","options","main","undefined","id","doc","Error","set","unmount","delete","setOnDocuments","record","changedPath","proxy","const","Settled","type","error","CommandsInvocation","method","params","ts","seq","clientId","CommandsOutcome","payload","CommandsListener","onStart","inv","onPosted","onApplied","onCovered","onSettle","outcome","CommandsSubmission","caller","Caller","context","Context","attach","Attach","CommandsHost","setListener","submit","call","Promise","methods","abort","commandsHosts","getCommandsHost","commands","bindCommandsHost","QueuedCall","resolve","reject","origin","ActiveInvocation","applied","controller","AbortController","settled","CommandsCell","handlers","Record","args","queue","active","running","unmounted","stallTimer","ReturnType","setTimeout","STALL_WARN_MS","LOCAL_CALLER","Object","freeze","auth","isConnected","toSendError","console","fate","cause","message","code","applyInvocation","settleInvocation","abortInvocations","clear","isThenable","PromiseLike","then","handlerOf","prototype","propertyIsEnumerable","handler","dispatch","ctx","Ctx","signal","this","resolved","pump","watchStall","shift","length","warn","useStatewireCommands","Commands","THandlers","ThisType","CommandsOptions","CommandsProxy","HandledCommands","built","Date","now","keys","filter","clearTimeout","queueMicrotask","queued","startsWith"],"sources":["../../src/host/host.ts"],"sourcesContent":["import { captureContext } from \"../wire/context\";\nimport { useEffect, useState } from \"react\";\nimport { applyOps, sanitizeValue } from \"../wire/ops\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport { StatewireReject } from \"./engine\";\nimport { createStateDraft } from \"./draft\";\nimport { createMethodProxy } from \"../util/methodProxy\";\nimport type { StateDraft } from \"./draft\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\n\nconst isDev = () =>\n typeof process === \"undefined\" || process.env[\"NODE_ENV\"] !== \"production\";\n\n// ─── state ──────────────────────────────────────────────\n\nconst stateHosts = new WeakMap<object, StatewireHost.StateHost>();\n\nexport const documentIdentity = (protocol: string, key?: readonly string[]) =>\n JSON.stringify([protocol, key ?? null]);\n\n/** Host-side accessor for a `useStatewireState` state object's source (`snapshot()` reads the committed state). */\nexport const getStateHost = (\n state: object,\n): StatewireHost.StateHost | undefined => stateHosts.get(state);\n\ntype StateCell = {\n current: unknown;\n draft: StateDraft<object> | null;\n changed: StatewirePath[];\n documents: Map<string, StatewireHost.Document>;\n onOp: ((op: Statewire.Op) => void) | null;\n onChange: (() => void) | null;\n onDocuments: (() => void) | null;\n ctl: StatewireHost.StateCtl;\n host: StatewireHost.StateHost;\n bump: () => void;\n};\n\nexport const useStatewireState = <TState>(\n init: () => TState,\n): readonly [TState, StatewireHost.StateCtl<TState>] => {\n const [, setVersion] = useState(0);\n const [cell] = useState((): StateCell => {\n const commit = () => {\n if (c.draft) c.current = c.draft.flush();\n return c.current;\n };\n const c: StateCell = {\n current: sanitizeValue(init()),\n draft: null,\n changed: [[]],\n documents: new Map(),\n onOp: null,\n onChange: null,\n onDocuments: null,\n bump: () => setVersion((v) => v + 1),\n ctl: {\n apply: (ops) => {\n const result = applyOps(commit(), ops);\n c.current = result.state;\n c.draft?.invalidate();\n c.changed.push(...result.changedPaths);\n if (c.onOp) for (const op of ops) c.onOp(op);\n c.bump();\n c.onChange?.();\n },\n snapshot: commit,\n },\n host: {\n snapshot: commit,\n setOnOp: (listener) => {\n c.onOp = listener;\n },\n setOnChange: (listener) => {\n c.onChange = listener;\n },\n takeChanged: () => {\n const changed = c.changed;\n c.changed = [];\n return changed;\n },\n mount: (protocol, value, options) => {\n const key = options?.key;\n const main = options?.main ?? key === undefined;\n if (main) {\n for (const [id, doc] of c.documents) {\n if (\n doc.protocol === protocol &&\n doc.main &&\n id !== documentIdentity(protocol, key)\n )\n throw new Error(\n `statewire: ${protocol} already has a main document`,\n );\n }\n }\n c.documents.set(documentIdentity(protocol, key), {\n protocol,\n key: key === undefined ? null : [...key],\n main,\n value: sanitizeValue(value),\n });\n c.onDocuments?.();\n },\n unmount: (protocol, key) => {\n if (!c.documents.delete(documentIdentity(protocol, key)))\n throw new Error(\"statewire: document is not mounted\");\n c.onDocuments?.();\n },\n documents: () => c.documents,\n setOnDocuments: (listener) => {\n c.onDocuments = listener;\n },\n },\n };\n return c;\n });\n\n let value = cell.ctl.snapshot();\n if (typeof value === \"object\" && value !== null) {\n cell.draft ??= createStateDraft<object>({\n snapshot: () => cell.current,\n record: (op, changedPath) => {\n cell.changed.push(changedPath);\n cell.onOp?.(op);\n cell.bump();\n cell.onChange?.();\n },\n });\n stateHosts.set(cell.draft.proxy, cell.host);\n value = cell.draft.proxy;\n }\n return [value as TState, cell.ctl as StatewireHost.StateCtl<TState>] as const;\n};\n\n// ─── commands ───────────────────────────────────────────\n\ntype Settled =\n | { type: \"resolved\"; value: unknown }\n | { type: \"rejected\"; error: unknown };\n\nexport type CommandsInvocation = {\n readonly protocol?: string;\n readonly method: string;\n readonly params: readonly unknown[];\n readonly ts: number;\n readonly seq: number;\n readonly clientId?: string;\n};\n\nexport type CommandsOutcome =\n | { type: \"accepted\"; payload?: unknown }\n | { type: \"rejected\"; error: unknown };\n\nexport type CommandsListener = {\n onStart: (inv: CommandsInvocation) => void;\n onPosted?: (inv: CommandsInvocation) => void;\n onApplied: (inv: CommandsInvocation) => void;\n /** Canonical state now covers the invocation's effect — drop any overlay. */\n onCovered?: (inv: CommandsInvocation) => void;\n onSettle: (inv: CommandsInvocation, outcome: CommandsOutcome) => void;\n};\n\nexport type CommandsSubmission = {\n method: string;\n params: readonly unknown[];\n clientId?: string;\n caller?: StatewireHost.Caller;\n context?: Statewire.Context;\n attach?: StatewireHost.Attach;\n onApplied?: () => void;\n onSettle?: (outcome: CommandsOutcome) => void;\n};\n\nexport type CommandsHost = {\n setListener: (listener: CommandsListener | null) => void;\n submit?: (call: CommandsSubmission) => Promise<unknown>;\n /** Registered command names, read live. */\n methods?: () => string[];\n abort?: () => void;\n};\n\nconst commandsHosts = new WeakMap<object, CommandsHost>();\n\nexport const getCommandsHost = (commands: object): CommandsHost | undefined =>\n commandsHosts.get(commands);\n\nexport const bindCommandsHost = (commands: object, host: CommandsHost) => {\n commandsHosts.set(commands, host);\n};\n\ntype QueuedCall = {\n context?: Statewire.Context;\n method: string;\n params: readonly unknown[];\n ts: number;\n resolve: (value: unknown) => void;\n reject: (error: unknown) => void;\n origin?: CommandsSubmission;\n};\n\ntype ActiveInvocation = CommandsInvocation & {\n applied: boolean;\n controller: AbortController;\n settled: boolean;\n origin?: CommandsSubmission;\n};\n\ntype CommandsCell = {\n context: (() => Statewire.Context) | undefined;\n handlers: Record<string, (...args: never[]) => unknown> | null;\n queue: QueuedCall[];\n active: Map<ActiveInvocation, QueuedCall>;\n running: boolean;\n listener: CommandsListener | null;\n seq: number;\n unmounted: boolean;\n stallTimer: ReturnType<typeof setTimeout> | null;\n};\n\nconst STALL_WARN_MS = 5000;\n\n// In-process dispatch has no wire client: trivially attached.\nconst LOCAL_CALLER: StatewireHost.Caller = Object.freeze({\n get clientId(): string {\n throw new Error(\"statewire: in-process dispatch has no client id\");\n },\n auth: undefined,\n isConnected: true,\n});\n\nconst toSendError = (error: unknown): StatewireSendError => {\n if (\n !(error instanceof StatewireSendError) &&\n !(error instanceof StatewireReject)\n )\n console.error(\"statewire command failed\", error);\n return error instanceof StatewireSendError\n ? error\n : error instanceof StatewireReject\n ? new StatewireSendError({\n fate: \"rejected\",\n cause: \"server\",\n message: error.message,\n ...(error.code !== undefined && { code: error.code }),\n ...(error.payload !== undefined && { payload: error.payload }),\n })\n : new StatewireSendError({\n fate: \"failed\",\n cause: \"server\",\n message: \"the command failed\",\n });\n};\n\nconst applyInvocation = (cell: CommandsCell, inv: ActiveInvocation) => {\n if (inv.applied) return;\n inv.applied = true;\n cell.listener?.onApplied(inv);\n cell.listener?.onCovered?.(inv);\n inv.origin?.onApplied?.();\n};\n\nconst settleInvocation = (\n cell: CommandsCell,\n inv: ActiveInvocation,\n call: QueuedCall,\n settled: Settled,\n) => {\n if (inv.settled) return;\n inv.settled = true;\n cell.active.delete(inv);\n if (settled.type === \"resolved\") {\n applyInvocation(cell, inv);\n const outcome: CommandsOutcome =\n settled.value === undefined\n ? { type: \"accepted\" }\n : { type: \"accepted\", payload: sanitizeValue(settled.value) };\n cell.listener?.onSettle(inv, outcome);\n inv.origin?.onSettle?.(outcome);\n call.resolve(outcome.payload);\n } else {\n cell.listener?.onCovered?.(inv);\n const error = toSendError(settled.error);\n const outcome: CommandsOutcome = { type: \"rejected\", error };\n cell.listener?.onSettle(inv, outcome);\n inv.origin?.onSettle?.(outcome);\n call.reject(error);\n }\n};\n\nconst abortInvocations = (cell: CommandsCell) => {\n for (const [inv, call] of cell.active) {\n inv.settled = true;\n inv.controller.abort();\n const error = new StatewireSendError({ fate: \"crashed\", cause: \"server\" });\n const outcome: CommandsOutcome = { type: \"rejected\", error };\n cell.listener?.onSettle(inv, outcome);\n inv.origin?.onSettle?.(outcome);\n call.reject(error);\n }\n cell.active.clear();\n};\n\nconst isThenable = (value: unknown): value is PromiseLike<unknown> =>\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { then?: unknown }).then === \"function\";\n\n// A command is an own, enumerable, function-valued property — exactly what\n// `Object.keys` shows, so dispatch, `statewire/commands`, and the reserved-\n// namespace guard share one view; prototype-chain names are not commands.\nconst handlerOf = (\n handlers: Record<string, (...args: never[]) => unknown>,\n method: string,\n): ((...args: never[]) => unknown) | undefined => {\n if (!Object.prototype.propertyIsEnumerable.call(handlers, method)) {\n return undefined;\n }\n const handler = handlers[method];\n return typeof handler === \"function\" ? handler : undefined;\n};\n\nconst dispatch = (cell: CommandsCell, call: QueuedCall) => {\n const handler = handlerOf(cell.handlers!, call.method);\n if (handler === undefined) {\n const error = new StatewireSendError({\n fate: \"rejected\",\n cause: \"server\",\n code: \"unknown-command\",\n });\n call.origin?.onSettle?.({ type: \"rejected\", error });\n call.reject(error);\n return;\n }\n const inv: ActiveInvocation = {\n method: call.method,\n params: call.params,\n ts: call.ts,\n seq: ++cell.seq,\n applied: false,\n controller: new AbortController(),\n settled: false,\n ...(call.origin !== undefined && { origin: call.origin }),\n ...(call.origin?.clientId !== undefined && {\n clientId: call.origin.clientId,\n }),\n };\n cell.active.set(inv, call);\n cell.listener?.onStart(inv);\n cell.listener?.onPosted?.(inv);\n const attach = call.origin?.attach;\n const ctx: StatewireHost.Ctx = {\n caller: call.origin?.caller ?? LOCAL_CALLER,\n context: call.context ?? call.origin?.context ?? Object.freeze({}),\n get attach() {\n if (attach === undefined)\n throw new Error(\"statewire: in-process dispatch has no attach\");\n return attach;\n },\n signal: inv.controller.signal,\n applied: () => {\n if (!inv.settled) applyInvocation(cell, inv);\n },\n };\n try {\n const value = (\n handler as (\n this: StatewireHost.Ctx,\n ...args: readonly unknown[]\n ) => unknown\n ).call(ctx, ...call.params);\n if (isThenable(value)) {\n value.then(\n (resolved) =>\n settleInvocation(cell, inv, call, {\n type: \"resolved\",\n value: resolved,\n }),\n (error: unknown) =>\n settleInvocation(cell, inv, call, { type: \"rejected\", error }),\n );\n } else {\n settleInvocation(cell, inv, call, { type: \"resolved\", value });\n }\n } catch (error) {\n settleInvocation(cell, inv, call, { type: \"rejected\", error });\n }\n};\n\n// Prefix-only advancement: each handler runs synchronously to its first\n// await, then the pump moves on; settlement rides the returned promise.\nconst pump = (cell: CommandsCell) => {\n if (cell.running || !cell.handlers) {\n watchStall(cell);\n return;\n }\n cell.running = true;\n try {\n while (cell.handlers) {\n const call = cell.queue.shift();\n if (!call) break;\n dispatch(cell, call);\n }\n } finally {\n cell.running = false;\n }\n};\n\nconst watchStall = (cell: CommandsCell) => {\n if (!isDev() || cell.stallTimer !== null || cell.queue.length === 0) return;\n if (cell.handlers) return;\n cell.stallTimer = setTimeout(() => {\n cell.stallTimer = null;\n if (cell.handlers === null && cell.queue.length > 0 && !cell.unmounted) {\n console.warn(\n `statewire: ${cell.queue.length} buffered command(s) waiting over ${STALL_WARN_MS}ms — did the host forget to arm useStatewireCommands?`,\n );\n }\n }, STALL_WARN_MS);\n};\n\nexport const useStatewireCommands = <THandlers extends Statewire.Commands>(\n commands:\n | (THandlers & ThisType<StatewireHost.Ctx>)\n | undefined\n | null\n | false,\n options?: StatewireHost.CommandsOptions,\n): Statewire.CommandsProxy<StatewireHost.HandledCommands<THandlers>> => {\n const [built] = useState(() => {\n const cell: CommandsCell = {\n context: undefined,\n handlers: null,\n queue: [],\n active: new Map(),\n running: false,\n listener: null,\n seq: 0,\n unmounted: false,\n stallTimer: null,\n };\n const proxy = createMethodProxy<\n Statewire.CommandsProxy<StatewireHost.HandledCommands<THandlers>>\n >(\n (method, params) =>\n new Promise((resolve, reject) => {\n if (cell.unmounted) {\n reject(new Error(\"statewire: commands called after unmount\"));\n return;\n }\n cell.queue.push({\n context: captureContext(cell.context?.() ?? {}),\n method,\n params,\n ts: Date.now(),\n resolve,\n reject,\n });\n pump(cell);\n }),\n );\n commandsHosts.set(proxy, {\n abort: () => abortInvocations(cell),\n setListener: (listener) => {\n cell.listener = listener;\n },\n methods: () => {\n const handlers = cell.handlers;\n if (!handlers) return [];\n return Object.keys(handlers).filter(\n (method) => handlerOf(handlers, method) !== undefined,\n );\n },\n submit: (origin) =>\n new Promise((resolve, reject) => {\n if (cell.unmounted) {\n reject(new Error(\"statewire: commands called after unmount\"));\n return;\n }\n cell.queue.push({\n method: origin.method,\n params: origin.params,\n ts: Date.now(),\n resolve,\n reject,\n origin,\n });\n pump(cell);\n }),\n });\n return { cell, proxy };\n });\n\n built.cell.context = options?.context;\n useEffect(() => {\n const { cell } = built;\n cell.unmounted = false;\n return () => {\n cell.unmounted = true;\n cell.handlers = null;\n if (cell.stallTimer !== null) {\n clearTimeout(cell.stallTimer);\n cell.stallTimer = null;\n }\n queueMicrotask(() => {\n if (!cell.unmounted) return;\n abortInvocations(cell);\n const queued = cell.queue;\n cell.queue = [];\n for (const call of queued) {\n call.reject(new Error(\"statewire: unmounted\"));\n }\n });\n };\n }, [built]);\n\n useEffect(() => {\n if (commands) {\n for (const method of Object.keys(commands)) {\n if (method.startsWith(\"statewire/\")) {\n throw new Error(\n `statewire: cannot register \"${method}\": the \"statewire/\" method namespace is reserved`,\n );\n }\n }\n }\n built.cell.handlers = commands || null;\n pump(built.cell);\n });\n\n return built.proxy;\n};\n"],"mappings":";;;;;;;;AAYA,MAAMa,cACJ,OAAOC,YAAY,eAAeA,QAAQC,IAAI,gBAAgB;AAIhE,MAAMC,6BAAa,IAAIC,QAAyC;AAEhE,MAAaE,oBAAoBC,UAAkBC,QACjDC,KAAKC,UAAU,CAACH,UAAUC,OAAO,IAAI,CAAC;;AAGxC,MAAaG,gBACXC,UACwCT,WAAWU,IAAID,KAAK;AAe9D,MAAakB,qBACXC,SACsD;CACtD,MAAM,GAAGE,cAAc5C,SAAS,CAAC;CACjC,MAAM,CAAC6C,QAAQ7C,eAA0B;EACvC,MAAM8C,eAAe;GACnB,IAAIC,EAAEpB,OAAOoB,EAAErB,UAAUqB,EAAEpB,MAAMqB,MAAM;GACvC,OAAOD,EAAErB;EACX;EACA,MAAMqB,IAAe;GACnBrB,SAASxB,cAAcwC,KAAK,CAAC;GAC7Bf,OAAO;GACPC,SAAS,CAAC,CAAA,CAAE;GACZC,2BAAW,IAAIC,IAAI;GACnBE,MAAM;GACNG,UAAU;GACVC,aAAa;GACbI,YAAYI,YAAYK,MAAMA,IAAI,CAAC;GACnCZ,KAAK;IACHa,QAAQC,QAAQ;KACd,MAAMC,SAASnD,SAAS6C,OAAO,GAAGK,GAAG;KACrCJ,EAAErB,UAAU0B,OAAO7B;KACnBwB,EAAEpB,OAAO0B,WAAW;KACpBN,EAAEnB,QAAQ0B,KAAK,GAAGF,OAAOG,YAAY;KACrC,IAAIR,EAAEf,MAAM,KAAK,MAAMC,MAAMkB,KAAKJ,EAAEf,KAAKC,EAAE;KAC3Cc,EAAEP,KAAK;KACPO,EAAEZ,WAAW;IACf;IACAqB,UAAUV;GACZ;GACAP,MAAM;IACJiB,UAAUV;IACVW,UAAUC,aAAa;KACrBX,EAAEf,OAAO0B;IACX;IACAC,cAAcD,eAAa;KACzBX,EAAEZ,WAAWuB;IACf;IACAE,mBAAmB;KACjB,MAAMhC,UAAUmB,EAAEnB;KAClBmB,EAAEnB,UAAU,CAAA;KACZ,OAAOA;IACT;IACAiC,QAAQ3C,UAAU4C,OAAOC,YAAY;KACnC,MAAM5C,MAAM4C,SAAS5C;KACrB,MAAM6C,OAAOD,SAASC,QAAQ7C,QAAQ8C,KAAAA;KACtC,IAAID,MACG;WAAA,MAAM,CAACE,IAAIC,QAAQpB,EAAElB,WACxB,IACEsC,IAAIjD,aAAaA,YACjBiD,IAAIH,QACJE,OAAOjD,iBAAiBC,UAAUC,GAAG,GAErC,MAAM,IAAIiD,MACR,cAAclD,SAAQ,6BACxB;KAAA;KAGN6B,EAAElB,UAAUwC,IAAIpD,iBAAiBC,UAAUC,GAAG,GAAG;MAC/CD;MACAC,KAAKA,QAAQ8C,KAAAA,IAAY,OAAO,CAAC,GAAG9C,GAAG;MACvC6C;MACAF,OAAO5D,cAAc4D,KAAK;KAC5B,CAAC;KACDf,EAAEX,cAAc;IAClB;IACAkC,UAAUpD,YAAUC,UAAQ;KAC1B,IAAI,CAAC4B,EAAElB,UAAU0C,OAAOtD,iBAAiBC,YAAUC,KAAG,CAAC,GACrD,MAAM,IAAIiD,MAAM,oCAAoC;KACtDrB,EAAEX,cAAc;IAClB;IACAP,iBAAiBkB,EAAElB;IACnB2C,iBAAiBd,eAAa;KAC5BX,EAAEX,cAAcsB;IAClB;GACF;EACF;EACA,OAAOX;CACT,CAAC;CAED,IAAIe,UAAQjB,KAAKR,IAAImB,SAAS;CAC9B,IAAI,OAAOM,YAAU,YAAYA,YAAU,MAAM;EAC/CjB,KAAKlB,UAAUtB,iBAAyB;GACtCmD,gBAAgBX,KAAKnB;GACrB+C,SAASxC,IAAIyC,gBAAgB;IAC3B7B,KAAKjB,QAAQ0B,KAAKoB,WAAW;IAC7B7B,KAAKb,OAAOC,EAAE;IACdY,KAAKL,KAAK;IACVK,KAAKV,WAAW;GAClB;EACF,CAAC;EACDrB,WAAWuD,IAAIxB,KAAKlB,MAAMgD,OAAO9B,KAAKN,IAAI;EAC1CuB,UAAQjB,KAAKlB,MAAMgD;CACrB;CACA,OAAO,CAACb,SAAiBjB,KAAKR,GAAqC;AACrE;AAiDA,MAAMyE,gCAAgB,IAAI/F,QAA8B;AAExD,MAAagG,mBAAmBC,aAC9BF,cAActF,IAAIwF,QAAQ;AAE5B,MAAaC,oBAAoBD,UAAkBzE,SAAuB;CACxEuE,cAAczC,IAAI2C,UAAUzE,IAAI;AAClC;AA+BA,MAAM+F,gBAAgB;AAGtB,MAAMC,eAAqCC,OAAOC,OAAO;CACvD,IAAIpD,WAAmB;EACrB,MAAM,IAAIjB,MAAM,iDAAiD;CACnE;CACAsE,MAAMzE,KAAAA;CACN0E,aAAa;AACf,CAAC;AAED,MAAMC,eAAe7D,UAAuC;CAC1D,IACE,EAAEA,iBAAiBvE,uBACnB,EAAEuE,iBAAiB3E,kBAEnByI,QAAQ9D,MAAM,4BAA4BA,KAAK;CACjD,OAAOA,iBAAiBvE,qBACpBuE,QACAA,iBAAiB3E,kBACf,IAAII,mBAAmB;EACrBsI,MAAM;EACNC,OAAO;EACPC,SAASjE,MAAMiE;EACf,GAAIjE,MAAMkE,SAAShF,KAAAA,KAAa,EAAEgF,MAAMlE,MAAMkE,KAAK;EACnD,GAAIlE,MAAMQ,YAAYtB,KAAAA,KAAa,EAAEsB,SAASR,MAAMQ,QAAQ;CAC9D,CAAC,IACD,IAAI/E,mBAAmB;EACrBsI,MAAM;EACNC,OAAO;EACPC,SAAS;CACX,CAAC;AACT;AAEA,MAAME,mBAAmBrG,MAAoB6C,QAA0B;CACrE,IAAIA,IAAI6B,SAAS;CACjB7B,IAAI6B,UAAU;CACd1E,KAAKa,UAAUkC,UAAUF,GAAG;CAC5B7C,KAAKa,UAAUmC,YAAYH,GAAG;CAC9BA,IAAI2B,QAAQzB,YAAY;AAC1B;AAEA,MAAMuD,oBACJtG,MACA6C,KACAgB,MACAgB,YACG;CACH,IAAIhC,IAAIgC,SAAS;CACjBhC,IAAIgC,UAAU;CACd7E,KAAKmF,OAAOzD,OAAOmB,GAAG;CACtB,IAAIgC,QAAQ5C,SAAS,YAAY;EAC/BoE,gBAAgBrG,MAAM6C,GAAG;EACzB,MAAMK,UACJ2B,QAAQ5D,UAAUG,KAAAA,IACd,EAAEa,MAAM,WAAW,IACnB;GAAEA,MAAM;GAAYS,SAASrF,cAAcwH,QAAQ5D,KAAK;EAAE;EAChEjB,KAAKa,UAAUoC,SAASJ,KAAKK,OAAO;EACpCL,IAAI2B,QAAQvB,WAAWC,OAAO;EAC9BW,KAAKS,QAAQpB,QAAQR,OAAO;CAC9B,OAAO;EACL1C,KAAKa,UAAUmC,YAAYH,GAAG;EAC9B,MAAMX,QAAQ6D,YAAYlB,QAAQ3C,KAAK;EACvC,MAAMgB,UAA2B;GAAEjB,MAAM;GAAYC;EAAM;EAC3DlC,KAAKa,UAAUoC,SAASJ,KAAKK,OAAO;EACpCL,IAAI2B,QAAQvB,WAAWC,OAAO;EAC9BW,KAAKU,OAAOrC,KAAK;CACnB;AACF;AAEA,MAAMqE,oBAAoBvG,SAAuB;CAC/C,KAAK,MAAM,CAAC6C,KAAKgB,SAAS7D,KAAKmF,QAAQ;EACrCtC,IAAIgC,UAAU;EACdhC,IAAI8B,WAAWX,MAAM;EACrB,MAAM9B,QAAQ,IAAIvE,mBAAmB;GAAEsI,MAAM;GAAWC,OAAO;EAAS,CAAC;EACzE,MAAMhD,UAA2B;GAAEjB,MAAM;GAAYC;EAAM;EAC3DlC,KAAKa,UAAUoC,SAASJ,KAAKK,OAAO;EACpCL,IAAI2B,QAAQvB,WAAWC,OAAO;EAC9BW,KAAKU,OAAOrC,KAAK;CACnB;CACAlC,KAAKmF,OAAOqB,MAAM;AACpB;AAEA,MAAMC,cAAcxF,UAClB,OAAOA,UAAU,YACjBA,UAAU,QACV,OAAQA,MAA6B0F,SAAS;AAKhD,MAAMC,aACJ7B,UACA3C,WACgD;CAChD,IAAI,CAACuD,OAAOkB,UAAUC,qBAAqBjD,KAAKkB,UAAU3C,MAAM,GAC9D;CAEF,MAAM2E,UAAUhC,SAAS3C;CACzB,OAAO,OAAO2E,YAAY,aAAaA,UAAU3F,KAAAA;AACnD;AAEA,MAAM4F,YAAYhH,MAAoB6D,SAAqB;CACzD,MAAMkD,UAAUH,UAAU5G,KAAK+E,UAAWlB,KAAKzB,MAAM;CACrD,IAAI2E,YAAY3F,KAAAA,GAAW;EACzB,MAAMc,QAAQ,IAAIvE,mBAAmB;GACnCsI,MAAM;GACNC,OAAO;GACPE,MAAM;EACR,CAAC;EACDvC,KAAKW,QAAQvB,WAAW;GAAEhB,MAAM;GAAYC;EAAM,CAAC;EACnD2B,KAAKU,OAAOrC,KAAK;EACjB;CACF;CACA,MAAMW,MAAwB;EAC5BT,QAAQyB,KAAKzB;EACbC,QAAQwB,KAAKxB;EACbC,IAAIuB,KAAKvB;EACTC,KAAK,EAAEvC,KAAKuC;EACZmC,SAAS;EACTC,YAAY,IAAIC,gBAAgB;EAChCC,SAAS;EACT,GAAIhB,KAAKW,WAAWpD,KAAAA,KAAa,EAAEoD,QAAQX,KAAKW,OAAO;EACvD,GAAIX,KAAKW,QAAQhC,aAAapB,KAAAA,KAAa,EACzCoB,UAAUqB,KAAKW,OAAOhC,SACxB;CACF;CACAxC,KAAKmF,OAAO3D,IAAIqB,KAAKgB,IAAI;CACzB7D,KAAKa,UAAU+B,QAAQC,GAAG;CAC1B7C,KAAKa,UAAUiC,WAAWD,GAAG;CAC7B,MAAMW,SAASK,KAAKW,QAAQhB;CAC5B,MAAMyD,MAAyB;EAC7B7D,QAAQS,KAAKW,QAAQpB,UAAUsC;EAC/BpC,SAASO,KAAKP,WAAWO,KAAKW,QAAQlB,WAAWqC,OAAOC,OAAO,CAAC,CAAC;EACjE,IAAIpC,SAAS;GACX,IAAIA,WAAWpC,KAAAA,GACb,MAAM,IAAIG,MAAM,8CAA8C;GAChE,OAAOiC;EACT;EACA2D,QAAQtE,IAAI8B,WAAWwC;EACvBzC,eAAe;GACb,IAAI,CAAC7B,IAAIgC,SAASwB,gBAAgBrG,MAAM6C,GAAG;EAC7C;CACF;CACA,IAAI;EACF,MAAM5B,QACJ8F,QAIAlD,KAAKoD,KAAK,GAAGpD,KAAKxB,MAAM;EAC1B,IAAIoE,WAAWxF,KAAK,GAClBA,MAAM0F,MACHU,aACCf,iBAAiBtG,MAAM6C,KAAKgB,MAAM;GAChC5B,MAAM;GACNhB,OAAOoG;EACT,CAAC,IACFnF,UACCoE,iBAAiBtG,MAAM6C,KAAKgB,MAAM;GAAE5B,MAAM;GAAYC;EAAM,CAAC,CACjE;OAEAoE,iBAAiBtG,MAAM6C,KAAKgB,MAAM;GAAE5B,MAAM;GAAYhB;EAAM,CAAC;CAEjE,SAASiB,OAAO;EACdoE,iBAAiBtG,MAAM6C,KAAKgB,MAAM;GAAE5B,MAAM;GAAYC;EAAM,CAAC;CAC/D;AACF;AAIA,MAAMoF,QAAQtH,SAAuB;CACnC,IAAIA,KAAKoF,WAAW,CAACpF,KAAK+E,UAAU;EAClCwC,WAAWvH,IAAI;EACf;CACF;CACAA,KAAKoF,UAAU;CACf,IAAI;EACF,OAAOpF,KAAK+E,UAAU;GACpB,MAAMlB,OAAO7D,KAAKkF,MAAMsC,MAAM;GAC9B,IAAI,CAAC3D,MAAM;GACXmD,SAAShH,MAAM6D,IAAI;EACrB;CACF,UAAU;EACR7D,KAAKoF,UAAU;CACjB;AACF;AAEA,MAAMmC,cAAcvH,SAAuB;CACzC,IAAI,CAAClC,MAAM,KAAKkC,KAAKsF,eAAe,QAAQtF,KAAKkF,MAAMuC,WAAW,GAAG;CACrE,IAAIzH,KAAK+E,UAAU;CACnB/E,KAAKsF,aAAaE,iBAAiB;EACjCxF,KAAKsF,aAAa;EAClB,IAAItF,KAAK+E,aAAa,QAAQ/E,KAAKkF,MAAMuC,SAAS,KAAK,CAACzH,KAAKqF,WAC3DW,QAAQ0B,KACN,cAAc1H,KAAKkF,MAAMuC,OAAM,oCAAqChC,cAAa,sDACnF;CAEJ,GAAGA,aAAa;AAClB;AAEA,MAAakC,wBACXxD,UAKAjD,YACsE;CACtE,MAAM,CAACgH,SAAS/K,eAAe;EAC7B,MAAM6C,OAAqB;GACzBsD,SAASlC,KAAAA;GACT2D,UAAU;GACVG,OAAO,CAAA;GACPC,wBAAQ,IAAIlG,IAAI;GAChBmG,SAAS;GACTvE,UAAU;GACV0B,KAAK;GACL8C,WAAW;GACXC,YAAY;EACd;EACA,MAAMxD,QAAQrE,mBAGX2E,QAAQC,WACP,IAAIyB,SAASQ,SAASC,WAAW;GAC/B,IAAIvE,KAAKqF,WAAW;IAClBd,uBAAO,IAAIhD,MAAM,0CAA0C,CAAC;IAC5D;GACF;GACAvB,KAAKkF,MAAMzE,KAAK;IACd6C,SAASrG,eAAe+C,KAAKsD,UAAU,KAAK,CAAC,CAAC;IAC9ClB;IACAC;IACAC,IAAI6F,KAAKC,IAAI;IACb9D;IACAC;GACF,CAAC;GACD+C,KAAKtH,IAAI;EACX,CAAC,CACL;EACAiE,cAAczC,IAAIM,OAAO;GACvBkC,aAAauC,iBAAiBvG,IAAI;GAClC2D,cAAc9C,aAAa;IACzBb,KAAKa,WAAWA;GAClB;GACAkD,eAAe;IACb,MAAMgB,WAAW/E,KAAK+E;IACtB,IAAI,CAACA,UAAU,OAAO,CAAA;IACtB,OAAOY,OAAO0C,KAAKtD,QAAQ,CAAC,CAACuD,QAC1BlG,aAAWwE,UAAU7B,UAAU3C,QAAM,MAAMhB,KAAAA,CAC9C;GACF;GACAwC,SAASY,WACP,IAAIV,SAASQ,WAASC,aAAW;IAC/B,IAAIvE,KAAKqF,WAAW;KAClBd,yBAAO,IAAIhD,MAAM,0CAA0C,CAAC;KAC5D;IACF;IACAvB,KAAKkF,MAAMzE,KAAK;KACd2B,QAAQoC,OAAOpC;KACfC,QAAQmC,OAAOnC;KACfC,IAAI6F,KAAKC,IAAI;KACb9D,SAAAA;KACAC,QAAAA;KACAC;IACF,CAAC;IACD8C,KAAKtH,IAAI;GACX,CAAC;EACL,CAAC;EACD,OAAO;GAAEA;GAAM8B;EAAM;CACvB,CAAC;CAEDoG,MAAMlI,KAAKsD,UAAUpC,SAASoC;CAC9BpG,gBAAgB;EACd,MAAM,EAAE8C,MAAAA,WAASkI;EACjBlI,OAAKqF,YAAY;EACjB,aAAa;GACXrF,OAAKqF,YAAY;GACjBrF,OAAK+E,WAAW;GAChB,IAAI/E,OAAKsF,eAAe,MAAM;IAC5BiD,aAAavI,OAAKsF,UAAU;IAC5BtF,OAAKsF,aAAa;GACpB;GACAkD,qBAAqB;IACnB,IAAI,CAACxI,OAAKqF,WAAW;IACrBkB,iBAAiBvG,MAAI;IACrB,MAAMyI,SAASzI,OAAKkF;IACpBlF,OAAKkF,QAAQ,CAAA;IACb,KAAK,MAAMrB,QAAQ4E,QACjB5E,KAAKU,uBAAO,IAAIhD,MAAM,sBAAsB,CAAC;GAEjD,CAAC;EACH;CACF,GAAG,CAAC2G,KAAK,CAAC;CAEVhL,gBAAgB;EACd,IAAIiH,UACG;QAAA,MAAM/B,YAAUuD,OAAO0C,KAAKlE,QAAQ,GACvC,IAAI/B,SAAOsG,WAAW,YAAY,GAChC,MAAM,IAAInH,MACR,+BAA+Ba,SAAM,iDACvC;EAAA;EAIN8F,MAAMlI,KAAK+E,WAAWZ,YAAY;EAClCmD,KAAKY,MAAMlI,IAAI;CACjB,CAAC;CAED,OAAOkI,MAAMpG;AACf"}
@@ -1,8 +1,5 @@
1
- import { SocketHostState } from "./socket.js";
2
- import { MAX_FRAME_BODY_BYTES } from "../wire/limits.js";
3
- //#region src/host/http.d.ts
4
- declare const stream: (h: SocketHostState, request: Request) => Promise<Response>;
5
- declare const frames: (h: SocketHostState, request: Request) => Promise<Response>;
6
- //#endregion
7
- export { MAX_FRAME_BODY_BYTES, frames, stream };
1
+ import type { SocketHostState } from "./socket.js";
2
+ export { MAX_FRAME_BODY_BYTES } from "../wire/limits.js";
3
+ export declare const stream: (h: SocketHostState, request: Request) => Promise<Response>;
4
+ export declare const frames: (h: SocketHostState, request: Request) => Promise<Response>;
8
5
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","names":[],"sources":["../../src/host/http.ts"],"mappings":";;;cAgUa,SACX,GAAG,iBACH,SAAS,YACR,QAAQ;cAkCE,SACX,GAAG,iBACH,SAAS,YACR,QAAQ"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/host/http.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAA6B,eAAe,EAAE,oBAAiB;AAK3E,OAAO,EAAE,oBAAoB,EAAE,0BAAuB;AAsTtD,eAAO,MAAM,MAAM,GACjB,GAAG,eAAe,EAClB,SAAS,OAAO,KACf,OAAO,CAAC,QAAQ,CAOlB,CAAC;AA2BF,eAAO,MAAM,MAAM,GACjB,GAAG,eAAe,EAClB,SAAS,OAAO,KACf,OAAO,CAAC,QAAQ,CAkElB,CAAC"}