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/client/core.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import { createChanges } from "./changes.js";
|
|
1
2
|
import { recordMutations } from "../util/recordMutations.js";
|
|
2
3
|
import { createMethodProxy } from "../util/methodProxy.js";
|
|
3
4
|
import { StatewireSendError } from "../types.js";
|
|
4
5
|
import { getCommandsHost, getStateHost } from "../host/host.js";
|
|
5
6
|
import { createMacrotaskPoster } from "../util/macrotask.js";
|
|
6
|
-
import { createChanges } from "./changes.js";
|
|
7
7
|
import { useEffect, useState } from "@assistant-ui/tap/react-shim";
|
|
8
|
-
|
|
8
|
+
// src/client/core.ts
|
|
9
9
|
const CONNECTED_CONNECTION = {
|
|
10
10
|
status: "connected",
|
|
11
11
|
degraded: false,
|
|
@@ -281,7 +281,6 @@ const useStatewireCore = (getOptions, value) => {
|
|
|
281
281
|
useEffect(() => () => detach(core), [core]);
|
|
282
282
|
return core;
|
|
283
283
|
};
|
|
284
|
-
//#endregion
|
|
285
284
|
export { CONNECTED_CONNECTION, useStatewireCore };
|
|
286
285
|
|
|
287
286
|
//# sourceMappingURL=core.js.map
|
package/dist/client/session.d.ts
CHANGED
|
@@ -1,106 +1,106 @@
|
|
|
1
|
-
import { StatewireDocuments } from "../wire/documents.js";
|
|
2
|
-
import { CommandsInvocation, CommandsListener } from "../host/host.js";
|
|
3
|
-
import { StatewireProtocol } from "../wire/protocol.js";
|
|
4
|
-
import { RemoteLink, StatewireRemoteProps } from "../transports/sse.js";
|
|
5
|
-
import { StatewireClient } from "../statewire.js";
|
|
6
|
-
import { Statewire } from "../types.js";
|
|
7
|
-
import { StatewirePath } from "../wire/ops.js";
|
|
8
1
|
import { encodeContext } from "../wire/context.js";
|
|
9
|
-
|
|
2
|
+
import type { StatewireProtocol } from "../wire/protocol.js";
|
|
3
|
+
import type { StatewireDocuments } from "../wire/documents.js";
|
|
4
|
+
import type { StatewirePath } from "../wire/ops.js";
|
|
5
|
+
import type { CommandsInvocation, CommandsListener } from "../host/host.js";
|
|
6
|
+
import type { Statewire } from "../types.js";
|
|
7
|
+
import type { StatewireClient } from "../statewire.js";
|
|
8
|
+
import type { RemoteLink, StatewireRemoteProps } from "../transports/sse.js";
|
|
10
9
|
type WireCommand = {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
protocol: string;
|
|
11
|
+
produced?: NonNullable<StatewireClient.SessionCommand["produced"]>;
|
|
12
|
+
method: string;
|
|
13
|
+
params: unknown[];
|
|
14
|
+
meta?: unknown;
|
|
16
15
|
};
|
|
17
16
|
type Pending = {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
17
|
+
readonly seq: number;
|
|
18
|
+
readonly command: WireCommand;
|
|
19
|
+
readonly inv: CommandsInvocation;
|
|
20
|
+
/** A send carrying this statement may have reached the server. */
|
|
21
|
+
attempted: boolean;
|
|
22
|
+
/** In the resend queue when false. */
|
|
23
|
+
posted: boolean;
|
|
24
|
+
/** The server acknowledged admission; the terminal verdict is still due. */
|
|
25
|
+
applied: boolean;
|
|
26
|
+
resolve: (payload: unknown) => void;
|
|
27
|
+
reject: (error: unknown) => void;
|
|
29
28
|
};
|
|
30
29
|
type AttachState = "detached" | "attached" | "finished";
|
|
31
|
-
type StatewireSessionOptions = StatewireProtocol.Options & {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
export type StatewireSessionOptions = StatewireProtocol.Options & {
|
|
31
|
+
context?: Readonly<Record<string, Statewire.Context>>;
|
|
32
|
+
sessionStore?: StatewireClient.SessionStorage | undefined;
|
|
33
|
+
onSessionLost?: StatewireClient.OnSessionLost | undefined;
|
|
34
|
+
onDone?: (() => void) | undefined;
|
|
36
35
|
};
|
|
37
36
|
type Shared = {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
txq: Promise<void>;
|
|
38
|
+
syncQueued: boolean;
|
|
39
|
+
parked: {
|
|
40
|
+
protocol: string;
|
|
41
|
+
verdict: StatewireClient.SessionVerdict;
|
|
42
|
+
}[];
|
|
43
|
+
unsubscribe: (() => void) | null;
|
|
44
44
|
};
|
|
45
45
|
type Session = {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
46
|
+
options: StatewireSessionOptions;
|
|
47
|
+
configuredContext: StatewireSessionOptions["context"];
|
|
48
|
+
contexts: Map<string, ReturnType<typeof encodeContext>>;
|
|
49
|
+
dirtyContexts: Set<string>;
|
|
50
|
+
attachContexts: Map<string, ReturnType<typeof encodeContext>>;
|
|
51
|
+
selection: StatewireProtocol.Selection | undefined;
|
|
52
|
+
record: StatewireClient.SessionRecord;
|
|
53
|
+
ctx: StatewireRemoteProps;
|
|
54
|
+
recordPersisted: boolean;
|
|
55
|
+
hydrated: boolean;
|
|
56
|
+
ready: Promise<void> | undefined;
|
|
57
|
+
storageError: unknown;
|
|
58
|
+
persistedRecord: StatewireClient.SessionRecord | null;
|
|
59
|
+
store: StatewireClient.SessionStorage;
|
|
60
|
+
documentStore: StatewireDocuments.Storage | undefined;
|
|
61
|
+
shared: Shared | false;
|
|
62
|
+
/** Every selected lane is ephemeral: the record dies with the attach. */
|
|
63
|
+
ephemeral: boolean;
|
|
64
|
+
/** An ephemeral record died with its attach: the storage is off for good. */
|
|
65
|
+
deactivated: boolean;
|
|
66
|
+
sessionKnown: boolean;
|
|
67
|
+
durableSeq: Record<string, number>;
|
|
68
|
+
/** Ephemeral lane clocks: restart at 1 on every attach. */
|
|
69
|
+
ephemeralSeqs: Record<string, number>;
|
|
70
|
+
resumeAt: number;
|
|
71
|
+
idle: boolean;
|
|
72
|
+
onSessionLost: StatewireClient.OnSessionLost | undefined;
|
|
73
|
+
onDone: (() => void) | undefined;
|
|
74
|
+
lanesOnAttach: boolean;
|
|
75
|
+
attachEntries: ReadonlySet<Pending>;
|
|
76
|
+
frameFailures: number;
|
|
77
|
+
pending: Pending[];
|
|
78
|
+
failedList: readonly StatewireClient.FailedCommand[];
|
|
79
|
+
failedParts: readonly (readonly StatewireClient.FailedCommand[])[];
|
|
80
|
+
canonical: unknown;
|
|
81
|
+
documentListeners: Set<() => void>;
|
|
82
|
+
documents: StatewireDocuments.State;
|
|
83
|
+
lastPublished: unknown;
|
|
84
|
+
changed: StatewirePath[];
|
|
85
|
+
source: Statewire.StateSource;
|
|
86
|
+
attach: AttachState;
|
|
87
|
+
attachEpoch: number;
|
|
88
|
+
running: boolean;
|
|
89
|
+
pumping: boolean;
|
|
90
|
+
transport: RemoteLink | null;
|
|
91
|
+
waiters: (() => void)[];
|
|
92
|
+
lifecycle: CommandsListener | null;
|
|
93
|
+
notify: () => void;
|
|
94
|
+
commands: Record<string, (...params: unknown[]) => Promise<unknown>>;
|
|
95
95
|
};
|
|
96
|
-
declare const failedCommands: (s: Session) => readonly StatewireClient.FailedCommand[];
|
|
96
|
+
export declare const failedCommands: (s: Session) => readonly StatewireClient.FailedCommand[];
|
|
97
|
+
export declare const MAX_FAILED_RETAINED = 256;
|
|
97
98
|
declare const setTransport: (s: Session, transport: RemoteLink) => void;
|
|
98
|
-
declare const discardFailed: (s: Session, entry: StatewireClient.FailedCommand) => void;
|
|
99
|
-
declare const retryFailed: (s: Session, entry: StatewireClient.FailedCommand) => Promise<unknown>;
|
|
100
|
-
declare const documentSource: (s: Session) => StatewireDocuments.Source;
|
|
101
|
-
declare const invokeProtocol: (s: Session, protocol: string, method: string, params: readonly unknown[]) => Promise<unknown>;
|
|
102
|
-
declare const setContext: (s: Session, protocol: string, value: Statewire.Context) => void;
|
|
103
|
-
declare const useStatewireSession: (options: StatewireSessionOptions) => Session;
|
|
104
|
-
|
|
105
|
-
export { StatewireSessionOptions, discardFailed, documentSource, failedCommands, invokeProtocol, retryFailed, setContext, setTransport, useStatewireSession };
|
|
99
|
+
export declare const discardFailed: (s: Session, entry: StatewireClient.FailedCommand) => void;
|
|
100
|
+
export declare const retryFailed: (s: Session, entry: StatewireClient.FailedCommand) => Promise<unknown>;
|
|
101
|
+
export declare const documentSource: (s: Session) => StatewireDocuments.Source;
|
|
102
|
+
export declare const invokeProtocol: (s: Session, protocol: string, method: string, params: readonly unknown[]) => Promise<unknown>;
|
|
103
|
+
export declare const setContext: (s: Session, protocol: string, value: Statewire.Context) => void;
|
|
104
|
+
export declare const useStatewireSession: (options: StatewireSessionOptions) => Session;
|
|
105
|
+
export { setTransport };
|
|
106
106
|
//# sourceMappingURL=session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"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"}
|
package/dist/client/session.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
+
import { inRange, protocolOffers } from "../wire/protocol.js";
|
|
1
2
|
import { reviveDocumentValue } from "../document.js";
|
|
3
|
+
import { encodeParams, reviveResponse } from "../wire/meta.js";
|
|
4
|
+
import { backoff, retryHint } from "./timing.js";
|
|
5
|
+
import { wrapStorageError } from "./storageError.js";
|
|
6
|
+
import { TERMINAL } from "./connection.js";
|
|
2
7
|
import "../wire/limits.js";
|
|
3
|
-
import { inRange, protocolOffers } from "../wire/protocol.js";
|
|
4
8
|
import { encodeContext } from "../wire/context.js";
|
|
5
9
|
import { createMethodProxy } from "../util/methodProxy.js";
|
|
6
10
|
import { StatewireSendError } from "../types.js";
|
|
7
11
|
import { bindCommandsHost } from "../host/host.js";
|
|
8
|
-
import { encodeParams, reviveResponse } from "../wire/meta.js";
|
|
9
12
|
import { applyDocumentOps, findDocument, mainDocument, resolveDocumentKey } from "../wire/documents.js";
|
|
10
13
|
import { DocumentStorageContext, SessionStorageContext, createMemorySessionStore } from "./sessionStore.js";
|
|
11
|
-
import { backoff, retryHint } from "./timing.js";
|
|
12
|
-
import { wrapStorageError } from "./storageError.js";
|
|
13
|
-
import { TERMINAL } from "./connection.js";
|
|
14
14
|
import { randomId } from "../util/randomId.js";
|
|
15
15
|
import { useContext, useEffect, useState } from "@assistant-ui/tap/react-shim";
|
|
16
|
-
|
|
16
|
+
// src/client/session.ts
|
|
17
17
|
const protocolError = (message) => {
|
|
18
18
|
throw new Error(`statewire: protocol error: ${message}`);
|
|
19
19
|
};
|
|
@@ -66,13 +66,13 @@ const storageFailed = (s, cause) => {
|
|
|
66
66
|
s.transport?.storageFailed(error);
|
|
67
67
|
};
|
|
68
68
|
const setRecord = (s, record) => {
|
|
69
|
-
s.record = record;
|
|
70
69
|
if (!s.deactivated) try {
|
|
71
70
|
s.store.save(record);
|
|
72
71
|
} catch (cause) {
|
|
73
72
|
storageFailed(s, cause);
|
|
74
73
|
throw s.storageError;
|
|
75
74
|
}
|
|
75
|
+
s.record = record;
|
|
76
76
|
};
|
|
77
77
|
const toStored = (p) => {
|
|
78
78
|
const { protocol: _protocol, ...command } = p.command;
|
|
@@ -114,8 +114,16 @@ const syncBacklogInner = (s) => {
|
|
|
114
114
|
});
|
|
115
115
|
};
|
|
116
116
|
const syncBacklog = (s) => {
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
const shared = s.shared;
|
|
118
|
+
if (!shared) return syncBacklogInner(s);
|
|
119
|
+
if (shared.syncQueued) return;
|
|
120
|
+
shared.syncQueued = true;
|
|
121
|
+
transact(s, () => {
|
|
122
|
+
shared.syncQueued = false;
|
|
123
|
+
syncBacklogInner(s);
|
|
124
|
+
}).catch(() => {
|
|
125
|
+
shared.syncQueued = false;
|
|
126
|
+
});
|
|
119
127
|
};
|
|
120
128
|
const transact = (s, fn) => {
|
|
121
129
|
if (!s.shared || s.deactivated) {
|
|
@@ -126,7 +134,7 @@ const transact = (s, fn) => {
|
|
|
126
134
|
const result = shared.txq.then(() => s.store.lock(async () => {
|
|
127
135
|
const stored = s.store.load();
|
|
128
136
|
if (stored !== null && stored.clientId !== s.record.clientId) adoptReset(s, stored);
|
|
129
|
-
else if (stored !== null) s.record = stored;
|
|
137
|
+
else if (stored !== null) s.record = boundRecord(stored);
|
|
130
138
|
fn();
|
|
131
139
|
const persistence = s.store.flush?.();
|
|
132
140
|
if (persistence) await persistence;
|
|
@@ -160,11 +168,27 @@ const failedCommands = (s) => {
|
|
|
160
168
|
}
|
|
161
169
|
return s.failedList;
|
|
162
170
|
};
|
|
171
|
+
const MAX_FAILED_RETAINED = 256;
|
|
172
|
+
const boundFailed = (failed) => failed.length > 256 ? [...failed].sort((a, b) => a.ts - b.ts).slice(-256) : failed;
|
|
173
|
+
const boundRecord = (record) => {
|
|
174
|
+
let lanes = record.lanes;
|
|
175
|
+
for (const [protocol, lane] of Object.entries(lanes)) if (lane.failed !== void 0 && lane.failed.length > 256) lanes = {
|
|
176
|
+
...lanes,
|
|
177
|
+
[protocol]: {
|
|
178
|
+
...lane,
|
|
179
|
+
failed: boundFailed(lane.failed)
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
return lanes === record.lanes ? record : {
|
|
183
|
+
...record,
|
|
184
|
+
lanes
|
|
185
|
+
};
|
|
186
|
+
};
|
|
163
187
|
const retainFailedInner = (s, entry, failure) => {
|
|
164
188
|
const lane = laneOf(s.record, entry.command.protocol);
|
|
165
189
|
setRecord(s, withLane(s.record, entry.command.protocol, {
|
|
166
190
|
...lane,
|
|
167
|
-
failed: [...lane.failed ?? [], {
|
|
191
|
+
failed: boundFailed([...lane.failed ?? [], {
|
|
168
192
|
protocol: entry.command.protocol,
|
|
169
193
|
...entry.command.produced !== void 0 && { produced: entry.command.produced },
|
|
170
194
|
command: entry.command.method,
|
|
@@ -173,7 +197,7 @@ const retainFailedInner = (s, entry, failure) => {
|
|
|
173
197
|
failure,
|
|
174
198
|
ts: entry.inv.ts,
|
|
175
199
|
seq: entry.seq
|
|
176
|
-
}]
|
|
200
|
+
}])
|
|
177
201
|
}));
|
|
178
202
|
s.notify();
|
|
179
203
|
};
|
|
@@ -264,7 +288,7 @@ const rebaseRecord = (s, adopt) => {
|
|
|
264
288
|
...lanes,
|
|
265
289
|
[protocol]: {
|
|
266
290
|
...current,
|
|
267
|
-
failed: [...current.failed ?? [], ...failed]
|
|
291
|
+
failed: boundFailed([...current.failed ?? [], ...failed])
|
|
268
292
|
}
|
|
269
293
|
};
|
|
270
294
|
}
|
|
@@ -283,7 +307,7 @@ const resetRecord = (s, clientId) => rebaseRecord(s, () => setRecord(s, {
|
|
|
283
307
|
}));
|
|
284
308
|
const adoptReset = (s, stored) => {
|
|
285
309
|
rebaseRecord(s, () => {
|
|
286
|
-
s.record = stored;
|
|
310
|
+
s.record = boundRecord(stored);
|
|
287
311
|
});
|
|
288
312
|
if (s.attach === "attached") s.transport?.connection.reconnect();
|
|
289
313
|
};
|
|
@@ -520,7 +544,7 @@ const handleHello = (s, { ops, syn }) => {
|
|
|
520
544
|
const handleOps = (s, { ops, cmds }) => {
|
|
521
545
|
ingestOps(s, ops);
|
|
522
546
|
for (const cmd of cmds) handleCmd(s, cmd);
|
|
523
|
-
syncBacklog(s);
|
|
547
|
+
if (cmds.length > 0) syncBacklog(s);
|
|
524
548
|
publishIngested(s);
|
|
525
549
|
};
|
|
526
550
|
const handleRefusal = (s, syn) => {
|
|
@@ -656,7 +680,7 @@ const pump = async (s) => {
|
|
|
656
680
|
let result;
|
|
657
681
|
try {
|
|
658
682
|
const send = () => transport.send(lanes.frame);
|
|
659
|
-
result = await (s.shared && !s.deactivated ? s.store.lock(send) : send());
|
|
683
|
+
result = await (s.shared && !s.deactivated && lanes.entries.length > 0 ? s.store.lock(send) : send());
|
|
660
684
|
} catch {
|
|
661
685
|
if (!s.running || isFinished(s)) return;
|
|
662
686
|
if (lanes.frame.ctx?.length) {
|
|
@@ -807,7 +831,7 @@ const adoptStored = (s) => {
|
|
|
807
831
|
const known = new Set(laneEntries(s, protocol).map((p) => p.seq));
|
|
808
832
|
for (const { seq, ...command } of lane.commands) {
|
|
809
833
|
if (known.has(seq)) continue;
|
|
810
|
-
const params = command.meta === void 0 ? command.params : reviveDocumentValue(
|
|
834
|
+
const params = command.meta === void 0 ? command.params : reviveDocumentValue(structuredClone(command.params), command.meta);
|
|
811
835
|
const entry = {
|
|
812
836
|
seq,
|
|
813
837
|
command: {
|
|
@@ -905,7 +929,7 @@ const retryFailed = (s, entry) => {
|
|
|
905
929
|
});
|
|
906
930
|
const found = findFailed(s, entry);
|
|
907
931
|
if (found === void 0) throw unknownFailed(entry);
|
|
908
|
-
const params = found.meta === void 0 ? found.params : reviveDocumentValue(
|
|
932
|
+
const params = found.meta === void 0 ? found.params : reviveDocumentValue(structuredClone(found.params), found.meta);
|
|
909
933
|
const result = new Promise((resolve, reject) => {
|
|
910
934
|
const retry = () => {
|
|
911
935
|
if (!s.running) {
|
|
@@ -1005,11 +1029,11 @@ const loadSessionRecord = (store, options) => {
|
|
|
1005
1029
|
store.save(stored);
|
|
1006
1030
|
}
|
|
1007
1031
|
}
|
|
1008
|
-
const record = stored
|
|
1032
|
+
const record = stored === null ? {
|
|
1009
1033
|
clientId: randomId(),
|
|
1010
1034
|
lanes: {}
|
|
1011
|
-
};
|
|
1012
|
-
if (
|
|
1035
|
+
} : boundRecord(stored);
|
|
1036
|
+
if (record !== stored) store.save(record);
|
|
1013
1037
|
return record;
|
|
1014
1038
|
};
|
|
1015
1039
|
const setContext = (s, protocol, value) => {
|
|
@@ -1062,6 +1086,7 @@ const useStatewireSession = (options) => {
|
|
|
1062
1086
|
documentStore,
|
|
1063
1087
|
shared: store.lock !== void 0 ? {
|
|
1064
1088
|
txq: Promise.resolve(),
|
|
1089
|
+
syncQueued: false,
|
|
1065
1090
|
parked: [],
|
|
1066
1091
|
unsubscribe: null
|
|
1067
1092
|
} : false,
|
|
@@ -1157,7 +1182,6 @@ const useStatewireSession = (options) => {
|
|
|
1157
1182
|
}, [s]);
|
|
1158
1183
|
return s;
|
|
1159
1184
|
};
|
|
1160
|
-
|
|
1161
|
-
export { discardFailed, documentSource, failedCommands, invokeProtocol, retryFailed, setContext, setTransport, useStatewireSession };
|
|
1185
|
+
export { MAX_FAILED_RETAINED, discardFailed, documentSource, failedCommands, invokeProtocol, retryFailed, setContext, setTransport, useStatewireSession };
|
|
1162
1186
|
|
|
1163
1187
|
//# sourceMappingURL=session.js.map
|