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.
- package/dist/client/changes.d.ts +3 -6
- package/dist/client/changes.d.ts.map +1 -1
- package/dist/client/changes.js +1 -2
- package/dist/client/connection.d.ts +80 -83
- package/dist/client/connection.d.ts.map +1 -1
- package/dist/client/connection.js +20 -7
- package/dist/client/connection.js.map +1 -1
- package/dist/client/core.d.ts +39 -41
- package/dist/client/core.d.ts.map +1 -1
- package/dist/client/core.js +2 -3
- package/dist/client/session.d.ts +93 -93
- package/dist/client/session.d.ts.map +1 -1
- package/dist/client/session.js +47 -23
- package/dist/client/session.js.map +1 -1
- package/dist/client/sessionStore.d.ts +11 -14
- package/dist/client/sessionStore.d.ts.map +1 -1
- package/dist/client/sessionStore.js +1 -2
- package/dist/client/storageError.d.ts +2 -5
- package/dist/client/storageError.d.ts.map +1 -1
- package/dist/client/storageError.js +1 -2
- package/dist/client/timing.d.ts +11 -14
- package/dist/client/timing.d.ts.map +1 -1
- package/dist/client/timing.js +1 -2
- package/dist/document.d.ts +17 -20
- package/dist/document.d.ts.map +1 -1
- package/dist/document.js +1 -2
- package/dist/host/adapter.d.ts +4 -7
- package/dist/host/adapter.d.ts.map +1 -1
- package/dist/host/adapter.js +1 -2
- package/dist/host/draft.d.ts +13 -16
- package/dist/host/draft.d.ts.map +1 -1
- package/dist/host/draft.js +1 -2
- package/dist/host/engine.d.ts +7 -10
- package/dist/host/engine.d.ts.map +1 -1
- package/dist/host/engine.js +1 -2
- package/dist/host/host.d.ts +42 -45
- package/dist/host/host.d.ts.map +1 -1
- package/dist/host/host.js +15 -13
- package/dist/host/host.js.map +1 -1
- package/dist/host/http.d.ts +4 -7
- package/dist/host/http.d.ts.map +1 -1
- package/dist/host/http.js +15 -11
- package/dist/host/http.js.map +1 -1
- package/dist/host/socket.d.ts +145 -140
- package/dist/host/socket.d.ts.map +1 -1
- package/dist/host/socket.js +99 -17
- package/dist/host/socket.js.map +1 -1
- package/dist/host/synced.d.ts +3 -6
- package/dist/host/synced.d.ts.map +1 -1
- package/dist/host/synced.js +1 -2
- package/dist/host/work.d.ts +2 -5
- package/dist/host/work.d.ts.map +1 -1
- package/dist/host/work.js +1 -2
- package/dist/host-internal.d.ts +99 -90
- package/dist/host-internal.d.ts.map +1 -1
- package/dist/host.d.ts +90 -91
- package/dist/host.d.ts.map +1 -1
- package/dist/index.d.ts +11 -8
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -1
- package/dist/statewire.d.ts +265 -268
- package/dist/statewire.d.ts.map +1 -1
- package/dist/statewire.js +7 -7
- package/dist/statewire.js.map +1 -1
- package/dist/storage.d.ts +23 -26
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +1 -2
- package/dist/transports/fake-sse.d.ts +7 -10
- package/dist/transports/fake-sse.d.ts.map +1 -1
- package/dist/transports/fake-sse.js +1 -2
- package/dist/transports/fixtures.d.ts +19 -25
- package/dist/transports/fixtures.d.ts.map +1 -1
- package/dist/transports/fixtures.js +1 -2
- package/dist/transports/remote.d.ts +8 -11
- package/dist/transports/remote.d.ts.map +1 -1
- package/dist/transports/remote.js +1 -2
- package/dist/transports/sse-parser.d.ts +1 -4
- package/dist/transports/sse-parser.d.ts.map +1 -1
- package/dist/transports/sse-parser.js +1 -2
- package/dist/transports/sse.d.ts +50 -52
- package/dist/transports/sse.d.ts.map +1 -1
- package/dist/transports/sse.js +9 -3
- package/dist/transports/sse.js.map +1 -1
- package/dist/transports/testing.d.ts +31 -34
- package/dist/transports/testing.d.ts.map +1 -1
- package/dist/transports/testing.js +1 -2
- package/dist/transports/ws.d.ts +5 -7
- package/dist/transports/ws.d.ts.map +1 -1
- package/dist/transports/ws.js +3 -4
- package/dist/transports/ws.js.map +1 -1
- package/dist/types.d.ts +81 -78
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -2
- package/dist/util/draftTraps.d.ts +2 -4
- package/dist/util/draftTraps.d.ts.map +1 -1
- package/dist/util/draftTraps.js +1 -2
- package/dist/util/macrotask.d.ts +1 -4
- package/dist/util/macrotask.d.ts.map +1 -1
- package/dist/util/macrotask.js +1 -2
- package/dist/util/methodProxy.d.ts +1 -4
- package/dist/util/methodProxy.d.ts.map +1 -1
- package/dist/util/methodProxy.js +1 -2
- package/dist/util/randomId.d.ts +1 -4
- package/dist/util/randomId.d.ts.map +1 -1
- package/dist/util/randomId.js +1 -2
- package/dist/util/recordMutations.d.ts +5 -7
- package/dist/util/recordMutations.d.ts.map +1 -1
- package/dist/util/recordMutations.js +1 -2
- package/dist/util/statePath.d.ts +9 -12
- package/dist/util/statePath.d.ts.map +1 -1
- package/dist/util/statePath.js +1 -2
- package/dist/wire/context.d.ts +7 -12
- package/dist/wire/context.d.ts.map +1 -1
- package/dist/wire/context.js +2 -3
- package/dist/wire/documents.d.ts +36 -39
- package/dist/wire/documents.d.ts.map +1 -1
- package/dist/wire/documents.js +2 -3
- package/dist/wire/documents.js.map +1 -1
- package/dist/wire/limits.d.ts +7 -10
- package/dist/wire/limits.d.ts.map +1 -1
- package/dist/wire/limits.js +1 -2
- package/dist/wire/meta.d.ts +9 -11
- package/dist/wire/meta.d.ts.map +1 -1
- package/dist/wire/meta.js +1 -2
- package/dist/wire/meta.js.map +1 -1
- package/dist/wire/ops.d.ts +9 -12
- package/dist/wire/ops.d.ts.map +1 -1
- package/dist/wire/ops.js +1 -2
- package/dist/wire/protocol.d.ts +53 -56
- package/dist/wire/protocol.d.ts.map +1 -1
- package/dist/wire/protocol.js +1 -2
- package/dist/wire/version.d.ts +1 -4
- package/dist/wire/version.d.ts.map +1 -1
- package/dist/wire/version.js +1 -2
- package/package.json +6 -6
- package/src/client/connection.ts +25 -15
- package/src/client/session.ts +54 -15
- package/src/host/host.ts +9 -3
- package/src/host/http.ts +37 -5
- package/src/host/socket.ts +158 -9
- package/src/host-internal.ts +14 -0
- package/src/statewire.ts +11 -6
- package/src/transports/sse.ts +12 -0
package/dist/document.d.ts
CHANGED
|
@@ -1,25 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
21
|
-
|
|
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
|
package/dist/document.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.d.ts","
|
|
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
|
-
|
|
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
|
package/dist/host/adapter.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import { StatewireHostInternal } from "../host-internal.js";
|
|
2
|
-
|
|
3
|
-
declare const
|
|
4
|
-
declare const
|
|
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","
|
|
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"}
|
package/dist/host/adapter.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CLIENT_ID_RE } from "./socket.js";
|
|
2
|
-
|
|
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
|
package/dist/host/draft.d.ts
CHANGED
|
@@ -1,25 +1,22 @@
|
|
|
1
|
-
import { Statewire } from "../types.js";
|
|
2
|
-
import { StatewirePath } from "../wire/ops.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
package/dist/host/draft.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft.d.ts","
|
|
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"}
|
package/dist/host/draft.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/dist/host/engine.d.ts
CHANGED
|
@@ -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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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","
|
|
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"}
|
package/dist/host/engine.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
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
|
package/dist/host/host.d.ts
CHANGED
|
@@ -1,53 +1,50 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
18
|
-
|
|
15
|
+
export type CommandsOutcome = {
|
|
16
|
+
type: "accepted";
|
|
17
|
+
payload?: unknown;
|
|
19
18
|
} | {
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
type: "rejected";
|
|
20
|
+
error: unknown;
|
|
22
21
|
};
|
|
23
|
-
type CommandsListener = {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
package/dist/host/host.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/host/host.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAiB;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAgB;AAS7C,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,EAAE,MAAM,SAAS,MAAM,EAAE,WACjC,CAAC;AAE1C,mHAAmH;AACnH,eAAO,MAAM,YAAY,GACvB,OAAO,MAAM,KACZ,aAAa,CAAC,SAAS,GAAG,SAAkC,CAAC;AAehE,eAAO,MAAM,iBAAiB,GAAI,MAAM,EACtC,MAAM,MAAM,MAAM,KACjB,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CA6FlD,CAAC;AAQF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,SAAS,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,6EAA6E;IAC7E,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,QAAQ,EAAE,CAAC,GAAG,EAAE,kBAAkB,EAAE,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;CACvE,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,KAAK,IAAI,CAAC;IACzD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAIF,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,KAAG,YAAY,GAAG,SACrC,CAAC;AAE9B,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,EAAE,MAAM,YAAY,SAEpE,CAAC;AAwOF,eAAO,MAAM,oBAAoB,GAAI,SAAS,SAAS,SAAS,CAAC,QAAQ,EACvE,UACI,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,GACzC,SAAS,GACT,IAAI,GACJ,KAAK,EACT,UAAU,aAAa,CAAC,eAAe,KACtC,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAuGlE,CAAC"}
|
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
|
-
|
|
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) =>
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
package/dist/host/host.js.map
CHANGED
|
@@ -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":"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"}
|
package/dist/host/http.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import { SocketHostState } from "./socket.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
declare const
|
|
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
|
package/dist/host/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","
|
|
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"}
|