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,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
- //#region src/client/core.ts
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
@@ -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
- //#region src/client/session.d.ts
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
- protocol: string;
12
- produced?: NonNullable<StatewireClient.SessionCommand["produced"]>;
13
- method: string;
14
- params: unknown[];
15
- meta?: unknown;
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
- readonly seq: number;
19
- readonly command: WireCommand;
20
- readonly inv: CommandsInvocation;
21
- /** A send carrying this statement may have reached the server. */
22
- attempted: boolean;
23
- /** In the resend queue when false. */
24
- posted: boolean;
25
- /** The server acknowledged admission; the terminal verdict is still due. */
26
- applied: boolean;
27
- resolve: (payload: unknown) => void;
28
- reject: (error: unknown) => void;
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
- context?: Readonly<Record<string, Statewire.Context>>;
33
- sessionStore?: StatewireClient.SessionStorage | undefined;
34
- onSessionLost?: StatewireClient.OnSessionLost | undefined;
35
- onDone?: (() => void) | undefined;
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
- txq: Promise<void>;
39
- parked: {
40
- protocol: string;
41
- verdict: StatewireClient.SessionVerdict;
42
- }[];
43
- unsubscribe: (() => void) | null;
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
- 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>>;
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
- //#endregion
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","names":[],"sources":["../../src/client/session.ts"],"mappings":";;;;;;;;;KA0CK;EACH;EACA,WAAW,YAAY,gBAAgB;EACvC;EACA;EACA;;KAGG;WACM;WACA,SAAS;WACT,KAAK;;EAEd;;EAEA;;EAEA;EACA,UAAU;EACV,SAAS;;KAeN;KAEO,0BAA0B,kBAAkB;EACtD,UAAU,SAAS,eAAe,UAAU;EAC5C,eAAe,gBAAgB;EAC/B,gBAAgB,gBAAgB;EAChC;;KAGG;EACH,KAAK;EACL;IAAU;IAAkB,SAAS,gBAAgB;;EACrD;;KAGG;EACH,SAAS;EACT,mBAAmB;EACnB,UAAU,YAAY,kBAAkB;EACxC,eAAe;EACf,gBAAgB,YAAY,kBAAkB;EAC9C,WAAW,kBAAkB;EAC7B,QAAQ,gBAAgB;EACxB,KAAK;EACL;EACA;EACA,OAAO;EACP;EACA,iBAAiB,gBAAgB;EACjC,OAAO,gBAAgB;EACvB,eAAe,mBAAmB;EAClC,QAAQ;;EAER;;EAEA;EACA;EACA,YAAY;;EAEZ,eAAe;EACf;EACA;EACA,eAAe,gBAAgB;EAC/B;EACA;EACA,eAAe,YAAY;EAC3B;EACA,SAAS;EACT,qBAAqB,gBAAgB;EACrC,gCAAgC,gBAAgB;EAChD;EACA,mBAAmB;EACnB,WAAW,mBAAmB;EAC9B;EACA,SAAS;EACT,QAAQ,UAAU;EAClB,QAAQ;EACR;EACA;EACA;EACA,WAAW;EACX;EACA,WAAW;EACX;EACA,UAAU,mBAAmB,sBAAsB;;cA2MxC,iBACX,GAAG,qBACO,gBAAgB;cA+wBtB,eAAgB,GAAG,SAAS,WAAW;cAiNhC,gBACX,GAAG,SACH,OAAO,gBAAgB;cAYZ,cACX,GAAG,SACH,OAAO,gBAAgB,kBACtB;cA4DU,iBAAkB,GAAG,YAAU,mBAAmB;cA+BlD,iBACX,GAAG,SACH,kBACA,gBACA,+BAA0B;cAoEf,aACX,GAAG,SACH,kBACA,OAAO,UAAU;cAcN,sBACX,SAAS,4BACR"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"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"}
@@ -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
- //#region src/client/session.ts
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
- if (!s.shared) return syncBacklogInner(s);
118
- transactBackground(s, () => syncBacklogInner(s));
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([...command.params], command.meta);
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([...found.params], found.meta);
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 (stored === null) store.save(record);
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
- //#endregion
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