@agentshouse/mdruntime 0.1.0-cf6041a06849c → 0.1.0-cf6e25bcd52f6

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 (185) hide show
  1. package/README.md +23 -10
  2. package/dist/adapter.d.ts +144 -29
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/attached-model.d.ts +5 -1
  5. package/dist/attached-model.d.ts.map +1 -1
  6. package/dist/attached-model.js +53 -6
  7. package/dist/attempt.d.ts +16 -0
  8. package/dist/attempt.d.ts.map +1 -0
  9. package/dist/attempt.js +70 -0
  10. package/dist/binary.d.ts +18 -0
  11. package/dist/binary.d.ts.map +1 -0
  12. package/dist/binary.js +8 -0
  13. package/dist/bootstrap.d.ts +41 -6
  14. package/dist/bootstrap.d.ts.map +1 -1
  15. package/dist/bootstrap.js +224 -45
  16. package/dist/chain.d.ts +11 -0
  17. package/dist/chain.d.ts.map +1 -0
  18. package/dist/chain.js +64 -0
  19. package/dist/change-set.d.ts +9 -14
  20. package/dist/change-set.d.ts.map +1 -1
  21. package/dist/change-set.js +11 -56
  22. package/dist/change.d.ts +45 -0
  23. package/dist/change.d.ts.map +1 -1
  24. package/dist/change.js +34 -0
  25. package/dist/client.d.ts +35 -14
  26. package/dist/client.d.ts.map +1 -1
  27. package/dist/client.js +156 -19
  28. package/dist/collection.d.ts +14 -13
  29. package/dist/collection.d.ts.map +1 -1
  30. package/dist/collection.js +66 -54
  31. package/dist/compile.d.ts +16 -0
  32. package/dist/compile.d.ts.map +1 -0
  33. package/dist/compile.js +765 -0
  34. package/dist/connection.d.ts +63 -20
  35. package/dist/connection.d.ts.map +1 -1
  36. package/dist/connection.js +3889 -743
  37. package/dist/conversation.d.ts +42 -12
  38. package/dist/conversation.d.ts.map +1 -1
  39. package/dist/conversation.js +642 -188
  40. package/dist/digest.d.ts +7 -0
  41. package/dist/digest.d.ts.map +1 -0
  42. package/dist/digest.js +113 -0
  43. package/dist/durability.d.ts +5 -1
  44. package/dist/durability.d.ts.map +1 -1
  45. package/dist/durability.js +5 -0
  46. package/dist/entry.d.ts +19 -0
  47. package/dist/entry.d.ts.map +1 -0
  48. package/dist/entry.js +151 -0
  49. package/dist/expectation.d.ts +21 -0
  50. package/dist/expectation.d.ts.map +1 -0
  51. package/dist/expectation.js +70 -0
  52. package/dist/failure.d.ts +13 -0
  53. package/dist/failure.d.ts.map +1 -0
  54. package/dist/failure.js +19 -0
  55. package/dist/fence.d.ts +6 -0
  56. package/dist/fence.d.ts.map +1 -0
  57. package/dist/fence.js +10 -0
  58. package/dist/file.d.ts +2 -19
  59. package/dist/file.d.ts.map +1 -1
  60. package/dist/file.js +7 -122
  61. package/dist/fulltext.d.ts +27 -0
  62. package/dist/fulltext.d.ts.map +1 -0
  63. package/dist/fulltext.js +368 -0
  64. package/dist/host.d.ts +15 -2
  65. package/dist/host.d.ts.map +1 -1
  66. package/dist/host.js +134 -21
  67. package/dist/identity.d.ts +4 -0
  68. package/dist/identity.d.ts.map +1 -1
  69. package/dist/identity.js +16 -1
  70. package/dist/index.d.ts +19 -9
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +8 -0
  73. package/dist/live.d.ts +22 -0
  74. package/dist/live.d.ts.map +1 -0
  75. package/dist/live.js +124 -0
  76. package/dist/media.d.ts +8 -0
  77. package/dist/media.d.ts.map +1 -0
  78. package/dist/media.js +208 -0
  79. package/dist/memory.d.ts +13 -5
  80. package/dist/memory.d.ts.map +1 -1
  81. package/dist/memory.js +140 -31
  82. package/dist/messages.d.ts +28 -0
  83. package/dist/messages.d.ts.map +1 -0
  84. package/dist/messages.js +90 -0
  85. package/dist/model.d.ts +20 -4
  86. package/dist/model.d.ts.map +1 -1
  87. package/dist/model.js +19 -2
  88. package/dist/name.d.ts +4 -0
  89. package/dist/name.d.ts.map +1 -0
  90. package/dist/name.js +122 -0
  91. package/dist/observation.d.ts +20 -2
  92. package/dist/observation.d.ts.map +1 -1
  93. package/dist/observation.js +113 -12
  94. package/dist/open.d.ts +2 -0
  95. package/dist/open.d.ts.map +1 -0
  96. package/dist/open.js +1 -0
  97. package/dist/opened.d.ts +22 -0
  98. package/dist/opened.d.ts.map +1 -0
  99. package/dist/opened.js +107 -0
  100. package/dist/outcome.d.ts +73 -3
  101. package/dist/outcome.d.ts.map +1 -1
  102. package/dist/outcome.js +81 -1
  103. package/dist/overlay.d.ts +15 -5
  104. package/dist/overlay.d.ts.map +1 -1
  105. package/dist/overlay.js +136 -180
  106. package/dist/paths.d.ts +1 -1
  107. package/dist/paths.d.ts.map +1 -1
  108. package/dist/paths.js +4 -16
  109. package/dist/query.d.ts +71 -5
  110. package/dist/query.d.ts.map +1 -1
  111. package/dist/query.js +100 -26
  112. package/dist/reach.d.ts +18 -4
  113. package/dist/reach.d.ts.map +1 -1
  114. package/dist/reach.js +247 -84
  115. package/dist/react.d.ts +31 -19
  116. package/dist/react.d.ts.map +1 -1
  117. package/dist/react.js +13 -21
  118. package/dist/readiness.d.ts +64 -0
  119. package/dist/readiness.d.ts.map +1 -0
  120. package/dist/readiness.js +33 -0
  121. package/dist/reads.d.ts +11 -0
  122. package/dist/reads.d.ts.map +1 -0
  123. package/dist/reads.js +100 -0
  124. package/dist/recovery.d.ts +25 -0
  125. package/dist/recovery.d.ts.map +1 -0
  126. package/dist/recovery.js +198 -0
  127. package/dist/refresh.d.ts +19 -8
  128. package/dist/refresh.d.ts.map +1 -1
  129. package/dist/refresh.js +125 -57
  130. package/dist/replica.d.ts +59 -33
  131. package/dist/replica.d.ts.map +1 -1
  132. package/dist/replica.js +322 -155
  133. package/dist/room-draft.d.ts +41 -9
  134. package/dist/room-draft.d.ts.map +1 -1
  135. package/dist/room-draft.js +186 -37
  136. package/dist/rows.d.ts +39 -34
  137. package/dist/rows.d.ts.map +1 -1
  138. package/dist/rows.js +197 -80
  139. package/dist/save.d.ts +74 -4
  140. package/dist/save.d.ts.map +1 -1
  141. package/dist/save.js +900 -178
  142. package/dist/search.d.ts +41 -29
  143. package/dist/search.d.ts.map +1 -1
  144. package/dist/search.js +37 -105
  145. package/dist/seed.d.ts +16 -0
  146. package/dist/seed.d.ts.map +1 -0
  147. package/dist/seed.js +75 -0
  148. package/dist/shared.d.ts +16 -0
  149. package/dist/shared.d.ts.map +1 -0
  150. package/dist/shared.js +431 -0
  151. package/dist/status.d.ts +11 -2
  152. package/dist/status.d.ts.map +1 -1
  153. package/dist/status.js +3 -9
  154. package/dist/store.d.ts +132 -58
  155. package/dist/store.d.ts.map +1 -1
  156. package/dist/store.js +379 -344
  157. package/dist/stored.d.ts +154 -0
  158. package/dist/stored.d.ts.map +1 -0
  159. package/dist/stored.js +578 -0
  160. package/dist/tables.d.ts +362 -0
  161. package/dist/tables.d.ts.map +1 -0
  162. package/dist/tables.js +627 -0
  163. package/dist/turn.d.ts +9 -0
  164. package/dist/turn.d.ts.map +1 -0
  165. package/dist/turn.js +75 -0
  166. package/dist/validation.d.ts +30 -0
  167. package/dist/validation.d.ts.map +1 -0
  168. package/dist/validation.js +162 -0
  169. package/dist/windows.d.ts +22 -0
  170. package/dist/windows.d.ts.map +1 -0
  171. package/dist/windows.js +89 -0
  172. package/dist/wire.d.ts +173 -33
  173. package/dist/wire.d.ts.map +1 -1
  174. package/dist/wire.js +69 -31
  175. package/dist/words.d.ts +19 -0
  176. package/dist/words.d.ts.map +1 -0
  177. package/dist/words.js +156 -0
  178. package/package.json +26 -15
  179. package/AGENTS.md +0 -231
  180. package/dist/attachment.d.ts +0 -3
  181. package/dist/attachment.d.ts.map +0 -1
  182. package/dist/attachment.js +0 -8
  183. package/dist/read-side.d.ts +0 -18
  184. package/dist/read-side.d.ts.map +0 -1
  185. package/dist/read-side.js +0 -377
@@ -0,0 +1,18 @@
1
+ import type { HeldBinary } from './overlay.js';
2
+ export type BinaryFileRecord = {
3
+ readonly state: 'accepted';
4
+ readonly revision: string;
5
+ readonly path: string;
6
+ readonly byteLength: number;
7
+ readonly mediaType: string;
8
+ readonly sha256: string;
9
+ } | {
10
+ readonly state: 'pending';
11
+ readonly localId: string;
12
+ readonly path: string;
13
+ readonly byteLength: number;
14
+ readonly mediaType: string;
15
+ readonly sha256: string;
16
+ };
17
+ export declare function binaryRecord(path: string, held: HeldBinary, revision: string | undefined): BinaryFileRecord;
18
+ //# sourceMappingURL=binary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../src/binary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GACxB;IACE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,gBAAgB,CAKlB"}
package/dist/binary.js ADDED
@@ -0,0 +1,8 @@
1
+ export function binaryRecord(path, held, revision) {
2
+ const facts = { byteLength: held.byteLength, mediaType: held.mediaType, sha256: held.sha256 };
3
+ if (held.state === 'pending')
4
+ return { state: 'pending', localId: held.localId, path, ...facts };
5
+ if (revision === undefined)
6
+ throw new Error(`the accepted binary file ${path} has no revision`);
7
+ return { state: 'accepted', revision, path, ...facts };
8
+ }
@@ -1,12 +1,47 @@
1
1
  import type { ModelState } from './model.js';
2
- import type { Adapter, AdapterFailure, Authorization, DiscoveredRoom, RoomModels } from './adapter.js';
3
- import { type Staged } from './replica.js';
4
- import { type Unconfirmed } from './transfer.js';
5
- export type BootstrapOutcome = Staged | Unconfirmed | AdapterFailure;
2
+ import type { Adapter, AdapterFailure, Authorization, DiscoveredRoom, HeldContent, RetryableRefusal, RoomModels } from './adapter.js';
3
+ import type { Composition } from './collection.js';
4
+ import type { InstallationStep } from './readiness.js';
5
+ import { type Refreshing } from './refresh.js';
6
+ import type { ReplicaRecord } from './replica.js';
7
+ import type { StagedPage, TransferRecord } from './store.js';
8
+ import type { View } from './tables.js';
9
+ import { type Refused, type Unconfirmed } from './transfer.js';
10
+ export type Bootstrapped = {
11
+ kind: 'staged';
12
+ record: ReplicaRecord;
13
+ refreshed: boolean;
14
+ };
15
+ export type BootstrapOutcome = Bootstrapped | Refused | Unconfirmed | RetryableRefusal | AdapterFailure;
6
16
  export type HeldModels = {
7
17
  collection: ModelState;
8
- selection: ModelState;
9
18
  };
10
19
  export type Remodel = (models: RoomModels | undefined, held: HeldModels) => HeldModels;
11
- export declare function bootstrapRoom(adapter: Adapter, authorization: Authorization, room: DiscoveredRoom, held: HeldModels, remodel: Remodel, continuing: () => boolean): Promise<BootstrapOutcome>;
20
+ export type Reads = Pick<Adapter, 'bootstrap' | 'refresh' | 'reached'>;
21
+ export type Arriving = {
22
+ at(token: string, bytes: number): void;
23
+ end(): void;
24
+ };
25
+ export type Staging = {
26
+ held(locator: string): TransferRecord | null;
27
+ turn(locator: string, step: InstallationStep): Promise<() => void>;
28
+ queued(bytes: number): () => void;
29
+ arriving(locator: string): Arriving;
30
+ received(locator: string, token: string): Promise<Uint8Array | null>;
31
+ keep(locator: string, token: string, received: Uint8Array): Promise<void>;
32
+ announced(locator: string): readonly string[];
33
+ stage(record: TransferRecord, page: StagedPage, composition: Composition, written: string | null): Promise<TransferRecord | null>;
34
+ derive(locator: string, key: number, composition: Composition): Promise<boolean>;
35
+ refreshing(locator: string, key: number, composition: Composition): Promise<Refreshing>;
36
+ abandon(locator: string): Promise<void>;
37
+ setAside(locator: string): Promise<void>;
38
+ release(key: number): Promise<void>;
39
+ content(key: number): HeldContent;
40
+ validate(record: ReplicaRecord, view: View): Promise<Refused | null>;
41
+ };
42
+ export declare const NOTHING_DONE: {
43
+ readonly parts: 0;
44
+ readonly bytes: 0;
45
+ };
46
+ export declare function bootstrapRoom(adapter: Reads, authorization: Authorization, room: DiscoveredRoom, held: HeldModels, builtIn: ModelState, remodel: Remodel, continuing: () => boolean, staging: Staging, reuse: HeldContent | null): Promise<BootstrapOutcome>;
12
47
  //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EACb,cAAc,EAGd,UAAU,EACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,WAAW,GAAG,cAAc,CAAC;AAErE,MAAM,MAAM,UAAU,GAAG;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,UAAU,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,KAAK,UAAU,CAAC;AAEvF,wBAAsB,aAAa,CACjC,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,GACxB,OAAO,CAAC,gBAAgB,CAAC,CA+C3B"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
package/dist/bootstrap.js CHANGED
@@ -1,56 +1,235 @@
1
- import { declaredAttachments } from './attachment.js';
2
- import { readStaged } from './replica.js';
1
+ import { transferIdentity } from './identity.js';
2
+ import { advancement, pageEntries } from './refresh.js';
3
3
  import { unconfirmed } from './transfer.js';
4
- export async function bootstrapRoom(adapter, authorization, room, held, remodel, continuing) {
5
- const first = await adapter.bootstrap(authorization, {
6
- locator: room.locator,
7
- selection: room.replica.selection,
8
- });
9
- if (first.kind !== 'bootstrap')
4
+ export const NOTHING_DONE = { parts: 0, bytes: 0 };
5
+ const RESUMABLE = new Set([
6
+ 'transport-uncertainty',
7
+ 'retryable-refusal',
8
+ 'unconfirmed',
9
+ ]);
10
+ const NOTHING_PRIOR = () => Promise.resolve(new Map());
11
+ async function pageOf(page) {
12
+ return {
13
+ entries: await pageEntries(page, [], page.roomVersion, NOTHING_PRIOR),
14
+ folders: page.folders ?? [],
15
+ };
16
+ }
17
+ function heldTogether(first, second) {
18
+ if (first === null)
19
+ return second;
20
+ return {
21
+ async files(after, limit) {
22
+ const [left, right] = await Promise.all([
23
+ first.files(after, limit),
24
+ second.files(after, limit),
25
+ ]);
26
+ const merged = new Map([...left, ...right].map((file) => [file.path, file]));
27
+ return [...merged.values()]
28
+ .sort((one, other) => (one.path < other.path ? -1 : one.path > other.path ? 1 : 0))
29
+ .slice(0, limit);
30
+ },
31
+ async contents(paths) {
32
+ const [left, right] = await Promise.all([first.contents(paths), second.contents(paths)]);
33
+ return new Map([...left, ...right]);
34
+ },
35
+ };
36
+ }
37
+ const NO_CONTENT = {
38
+ files: () => Promise.resolve([]),
39
+ contents: () => Promise.resolve(new Map()),
40
+ };
41
+ export async function bootstrapRoom(adapter, authorization, room, held, builtIn, remodel, continuing, staging, reuse) {
42
+ const kept = staging.held(room.locator);
43
+ const resumed = kept !== null && kept.selection === room.replica.selection ? kept : null;
44
+ if (kept !== null && resumed === null)
45
+ await staging.abandon(room.locator);
46
+ const first = await bundle(adapter, authorization, room, held, builtIn, remodel, continuing, staging, resumed, reuse);
47
+ if (first.kind !== 'expired')
10
48
  return first;
11
- const roomVersion = first.roomVersion;
12
- const models = remodel(first.models, held);
13
- const documents = { ...first.documents };
14
- const revisions = { ...first.revisions };
15
- const changes = { ...first.changes };
16
- const binaryTargets = new Set(first.binaryTargets);
17
- const attachments = [first.attachments ?? []];
18
- let pageToken = first.pageToken;
19
- while (pageToken !== undefined) {
20
- if (!continuing())
21
- return unconfirmed;
49
+ await staging.setAside(room.locator);
50
+ try {
51
+ const replacement = await bundle(adapter, authorization, room, held, builtIn, remodel, continuing, staging, null, heldTogether(reuse, first.held));
52
+ if (replacement.kind !== 'expired')
53
+ return replacement;
54
+ await staging.abandon(room.locator);
55
+ return unconfirmed;
56
+ }
57
+ finally {
58
+ if (first.key !== null)
59
+ await staging.release(first.key);
60
+ }
61
+ }
62
+ const UNASKED = { page: unconfirmed, reused: false };
63
+ const NOTHING_KEPT = Promise.resolve();
64
+ function dropped(ahead) {
65
+ void ahead?.fetched.then(({ next, written }) => {
66
+ written();
67
+ dropped(next);
68
+ }, () => { });
69
+ }
70
+ function compositionFor(room, models, builtIn) {
71
+ return {
72
+ model: models.collection,
73
+ selection: room.typedSelection === undefined
74
+ ? null
75
+ : { roots: room.typedSelection.roots, model: builtIn },
76
+ };
77
+ }
78
+ async function bundle(adapter, authorization, room, held, builtIn, remodel, continuing, staging, kept, pool) {
79
+ const locator = room.locator;
80
+ const selection = room.replica.selection;
81
+ let transfer = kept;
82
+ let looking = kept !== null;
83
+ let stopped = false;
84
+ let begin = () => { };
85
+ const begun = kept === null
86
+ ? new Promise((resolve) => {
87
+ begin = resolve;
88
+ })
89
+ : NOTHING_KEPT;
90
+ const arriving = staging.arriving(locator);
91
+ const asking = async (token) => {
92
+ const received = token !== null && looking ? await staging.received(locator, token) : null;
93
+ if (received === null)
94
+ looking = false;
22
95
  const page = await adapter.bootstrap(authorization, {
23
- locator: room.locator,
24
- selection: room.replica.selection,
25
- pageToken,
96
+ locator,
97
+ selection,
98
+ ...(token === null
99
+ ? {}
100
+ : { pageToken: token, arriving: (bytes) => arriving.at(token, bytes) }),
101
+ ...(pool === null ? {} : { held: pool }),
102
+ ...(received === null ? {} : { received }),
26
103
  });
27
- if (page.kind !== 'bootstrap')
28
- return page;
29
- if (page.roomVersion !== roomVersion)
30
- return unconfirmed;
31
- Object.assign(documents, page.documents);
32
- Object.assign(revisions, page.revisions);
33
- Object.assign(changes, page.changes);
34
- for (const target of page.binaryTargets)
35
- binaryTargets.add(target);
36
- attachments.push(page.attachments ?? []);
37
- pageToken = page.pageToken;
104
+ return { page, reused: received !== null };
105
+ };
106
+ const fetching = (token) => {
107
+ const fetched = (async () => {
108
+ const release = await staging.turn(locator, token === null ? 'listing' : 'downloading');
109
+ let asked;
110
+ try {
111
+ asked = stopped || !continuing() ? UNASKED : await asking(token);
112
+ }
113
+ finally {
114
+ release();
115
+ }
116
+ const { page, reused } = asked;
117
+ if (page.kind !== 'bootstrap') {
118
+ return { page, kept: NOTHING_KEPT, next: null, written: () => { } };
119
+ }
120
+ const received = page.received;
121
+ const written = staging.queued(received?.byteLength ?? 0);
122
+ let kept = NOTHING_KEPT;
123
+ if (token !== null && received !== undefined && !reused) {
124
+ kept = begun.then(() => staging.keep(locator, token, received));
125
+ kept.catch(() => { });
126
+ }
127
+ const later = page.pageToken;
128
+ const next = later === undefined || stopped || !continuing() ? null : fetching(later);
129
+ return { page, kept, next, written };
130
+ })();
131
+ fetched.catch(() => { });
132
+ return { token, fetched };
133
+ };
134
+ let ahead = null;
135
+ try {
136
+ while (transfer === null || transfer.pageToken !== null) {
137
+ if (!continuing())
138
+ return unconfirmed;
139
+ const asked = transfer?.pageToken ?? null;
140
+ const current = ahead !== null && ahead.token === asked ? ahead : fetching(asked);
141
+ if (ahead !== current)
142
+ dropped(ahead);
143
+ ahead = null;
144
+ const fetched = await current.fetched;
145
+ ahead = fetched.next;
146
+ try {
147
+ if (!continuing())
148
+ return unconfirmed;
149
+ const page = fetched.page;
150
+ if (page.kind === 'beyond-horizon') {
151
+ const key = transfer?.key ?? null;
152
+ return { kind: 'expired', held: key === null ? NO_CONTENT : staging.content(key), key };
153
+ }
154
+ if (page.kind !== 'bootstrap') {
155
+ if (!RESUMABLE.has(page.kind))
156
+ await staging.abandon(locator);
157
+ return page;
158
+ }
159
+ await fetched.kept;
160
+ const done = transfer?.done ?? NOTHING_DONE;
161
+ const part = page.received?.byteLength;
162
+ const next = {
163
+ locator,
164
+ transfer: transfer?.transfer ?? transferIdentity(),
165
+ selection,
166
+ from: transfer !== null && adapter.reached(locator, page.roomVersion, transfer.from)
167
+ ? transfer.from
168
+ : page.roomVersion,
169
+ last: transfer !== null && !adapter.reached(locator, page.roomVersion, transfer.last)
170
+ ? transfer.last
171
+ : page.roomVersion,
172
+ pageToken: page.pageToken ?? null,
173
+ inventory: page.inventory ?? transfer?.inventory ?? null,
174
+ done: part === undefined ? done : { parts: done.parts + 1, bytes: done.bytes + part },
175
+ models: remodel(page.models, transfer?.models ?? held),
176
+ key: transfer?.key ?? null,
177
+ };
178
+ const staged = await staging.stage(next, await pageOf(page), compositionFor(room, next.models, builtIn), part === undefined ? null : asked);
179
+ if (staged === null)
180
+ return unconfirmed;
181
+ transfer = staged;
182
+ begin();
183
+ }
184
+ finally {
185
+ fetched.written();
186
+ }
187
+ }
188
+ }
189
+ finally {
190
+ stopped = true;
191
+ dropped(ahead);
192
+ arriving.end();
38
193
  }
39
- return readStaged({
40
- locator: room.locator,
194
+ const composition = compositionFor(room, transfer.models, builtIn);
195
+ if (!(await staging.derive(locator, transfer.key, composition)))
196
+ return unconfirmed;
197
+ await staging.turn(locator, 'replaying');
198
+ if (!continuing())
199
+ return unconfirmed;
200
+ const record = {
201
+ locator,
41
202
  name: room.name,
203
+ handle: room.handle,
42
204
  operations: room.operations,
43
205
  replica: room.replica,
44
- model: models.collection,
206
+ model: transfer.models.collection,
45
207
  typedSelection: room.typedSelection ?? null,
46
- selectionModel: models.selection,
47
208
  providerOwnedPaths: room.providerOwnedPaths,
48
- roomVersion,
49
- documents,
50
- binaryTargets: [...binaryTargets].sort(),
51
- revisions,
52
- changes,
53
- written: Object.fromEntries(Object.keys(documents).map((path) => [path, roomVersion])),
54
- attachments: declaredAttachments(attachments),
55
- });
209
+ roomVersion: transfer.from,
210
+ transfer: transfer.transfer,
211
+ inventory: transfer.inventory,
212
+ key: transfer.key,
213
+ };
214
+ const due = [room.roomVersion, ...staging.announced(locator)];
215
+ const last = transfer.last;
216
+ const reconciled = last === transfer.from && due.every((version) => adapter.reached(locator, last, version))
217
+ ? { kind: 'still-current' }
218
+ : await advancement(adapter, authorization, record, remodel, continuing, await staging.refreshing(locator, record.key, composition));
219
+ if (reconciled.kind === 'advanced' || reconciled.kind === 'still-current') {
220
+ const refreshed = reconciled.kind === 'advanced';
221
+ const result = refreshed ? reconciled.record : record;
222
+ const refused = await staging.validate(result, refreshed ? 'refreshed' : 'confirmed');
223
+ if (refused !== null) {
224
+ await staging.abandon(locator);
225
+ return refused;
226
+ }
227
+ return { kind: 'staged', record: result, refreshed };
228
+ }
229
+ if (reconciled.kind === 'beyond-horizon') {
230
+ return { kind: 'expired', held: staging.content(record.key), key: record.key };
231
+ }
232
+ if (!RESUMABLE.has(reconciled.kind))
233
+ await staging.abandon(locator);
234
+ return reconciled;
56
235
  }
@@ -0,0 +1,11 @@
1
+ import type { MdRuntimeClient } from './client.js';
2
+ import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult, PendingResult } from './query.js';
3
+ type Rows = DocumentResult | GroupResult;
4
+ export type WindowAnswer = Rows | PendingResult;
5
+ export type WindowChain = {
6
+ want(count: number): void;
7
+ close(): void;
8
+ };
9
+ export declare function chainedWindows(runtime: MdRuntimeClient, query: DocumentQuery | GroupQuery, count: number, publish: (answers: readonly (WindowAnswer | null)[], settled: boolean) => void): WindowChain;
10
+ export {};
11
+ //# sourceMappingURL=chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,UAAU,EACV,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,KAAK,IAAI,GAAG,cAAc,GAAG,WAAW,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,aAAa,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAaF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,aAAa,GAAG,UAAU,EACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAC7E,WAAW,CAkEb"}
package/dist/chain.js ADDED
@@ -0,0 +1,64 @@
1
+ function answered(answer) {
2
+ return answer !== null && !('pending' in answer);
3
+ }
4
+ export function chainedWindows(runtime, query, count, publish) {
5
+ let links = [];
6
+ let wanted = count;
7
+ let closed = false;
8
+ const observe = runtime.observe;
9
+ const open = (after, shown) => {
10
+ const link = { after, observation: null, value: shown, fresh: false };
11
+ void observe('query', after === undefined ? query : { ...query, after }).then((observation) => {
12
+ if (closed || !links.includes(link)) {
13
+ observation.close();
14
+ return;
15
+ }
16
+ link.observation = observation;
17
+ const take = (value) => {
18
+ link.value = value;
19
+ link.fresh = true;
20
+ settle();
21
+ };
22
+ observation.subscribe(take);
23
+ take(observation.current());
24
+ }, () => { });
25
+ return link;
26
+ };
27
+ const settle = () => {
28
+ if (closed)
29
+ return;
30
+ const next = [];
31
+ for (let at = 0; at < wanted; at += 1) {
32
+ const before = next[at - 1];
33
+ if (before !== undefined && !before.fresh) {
34
+ next.push(...links.slice(at, wanted));
35
+ break;
36
+ }
37
+ if (before !== undefined && (!answered(before.value) || before.value.next === undefined)) {
38
+ break;
39
+ }
40
+ const after = before === undefined ? undefined : before.value.next;
41
+ const held = links[at];
42
+ next.push(held !== undefined && held.after === after ? held : open(after, held?.value ?? null));
43
+ }
44
+ for (const link of links)
45
+ if (!next.includes(link))
46
+ link.observation?.close();
47
+ links = next;
48
+ publish(links.map((link) => link.value), links.every((link) => link.fresh));
49
+ };
50
+ settle();
51
+ return {
52
+ want(count) {
53
+ if (count === wanted)
54
+ return;
55
+ wanted = count;
56
+ settle();
57
+ },
58
+ close() {
59
+ closed = true;
60
+ for (const link of links)
61
+ link.observation?.close();
62
+ },
63
+ };
64
+ }
@@ -1,14 +1,6 @@
1
- import { type Replica } from './replica.js';
2
- import { type Row } from './rows.js';
3
1
  export type DocumentChange = {
4
- locator: string;
5
- path: string;
6
- before: readonly Row[];
7
- after: readonly Row[];
8
- };
9
- export type MessageChange = {
10
- conversation: string;
11
- identity: string;
2
+ readonly locator: string;
3
+ readonly path: string | null;
12
4
  };
13
5
  export type ChangeSet = {
14
6
  documents: readonly DocumentChange[];
@@ -19,15 +11,18 @@ export type ChangeSet = {
19
11
  rooms: readonly string[];
20
12
  queues: readonly string[];
21
13
  presentations: readonly string[];
22
- messages: readonly MessageChange[];
23
14
  conversations: readonly string[];
24
15
  };
25
- export declare function changeSet(locator: string, before: Replica | null, after: Replica | null, changed?: {
16
+ type Changed = {
17
+ documents?: readonly string[] | null;
26
18
  drafts?: readonly string[];
27
19
  room?: boolean;
28
20
  queue?: boolean;
29
21
  presentation?: string;
30
- }): ChangeSet;
31
- export declare function conversationChangeSet(messages: readonly MessageChange[], conversations: readonly string[]): ChangeSet;
22
+ };
23
+ export declare function changeSet(locator: string, changed?: Changed): ChangeSet;
24
+ export declare function conversationChangeSet(conversations: readonly string[]): ChangeSet;
32
25
  export declare function mergeChangeSets(sets: readonly ChangeSet[]): ChangeSet;
26
+ export declare function touches(set: ChangeSet, locator: string, path: string): boolean;
27
+ export {};
33
28
  //# sourceMappingURL=change-set.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"change-set.d.ts","sourceRoot":"","sources":["../src/change-set.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiC,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAU,KAAK,GAAG,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,EAAE,CAAC;IACvB,KAAK,EAAE,SAAS,GAAG,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,SAAS;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAAC;AAqBF,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GAAG,IAAI,EACtB,KAAK,EAAE,OAAO,GAAG,IAAI,EACrB,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,SAAS,CAiDX;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,SAAS,CAUX;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAUrE"}
1
+ {"version":3,"file":"change-set.d.ts","sourceRoot":"","sources":["../src/change-set.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAExF,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,SAAS;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY,GAAG,SAAS,CAe3E;AAED,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CASjF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CASrE;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAI9E"}
@@ -1,72 +1,25 @@
1
- import { sameChange } from './overlay.js';
2
- import { beneath } from './paths.js';
3
- import { compositionOf, sameMembership } from './replica.js';
4
- import { rowsOf } from './rows.js';
5
- function rowsAt(locator, replica, path) {
6
- if (replica === null)
7
- return [];
8
- const document = replica.visible.collection.documents[path];
9
- if (document === undefined && !replica.visible.binaryTargets.includes(path)) {
10
- return [];
11
- }
12
- return rowsOf(locator, path, document ?? null, compositionOf(replica.confirmed.record), replica.visible.changes[path] ?? null);
13
- }
14
- function modelShape(model) {
15
- return model.status === 'unavailable' ? 'unavailable' : JSON.stringify(model.types);
16
- }
17
- export function changeSet(locator, before, after, changed = {}) {
18
- const paths = new Set([
19
- ...Object.keys(before?.visible.documents ?? {}),
20
- ...Object.keys(after?.visible.documents ?? {}),
21
- ...(before?.visible.binaryTargets ?? []),
22
- ...(after?.visible.binaryTargets ?? []),
23
- ]);
24
- const documents = [];
25
- const oldRoom = before?.confirmed.record;
26
- const newRoom = after?.confirmed.record;
27
- const collectionChanged = oldRoom !== undefined &&
28
- newRoom !== undefined &&
29
- modelShape(oldRoom.model) !== modelShape(newRoom.model);
30
- const selectionChanged = oldRoom !== undefined &&
31
- newRoom !== undefined &&
32
- modelShape(oldRoom.selectionModel) !== modelShape(newRoom.selectionModel);
33
- const reclassified = oldRoom !== undefined && newRoom !== undefined && !sameMembership(oldRoom, newRoom);
34
- for (const path of paths) {
35
- const selected = newRoom?.typedSelection?.roots.some((root) => beneath(root, path)) ?? false;
36
- const retyped = selected ? selectionChanged : collectionChanged;
37
- if (before?.visible.documents[path] === after?.visible.documents[path] &&
38
- before?.visible.binaryTargets.includes(path) ===
39
- after?.visible.binaryTargets.includes(path) &&
40
- before?.visible.revisions[path] === after?.visible.revisions[path] &&
41
- sameChange(before?.visible.changes[path], after?.visible.changes[path]) &&
42
- !retyped &&
43
- !reclassified)
44
- continue;
45
- documents.push({
46
- locator,
47
- path,
48
- before: rowsAt(locator, before, path),
49
- after: rowsAt(locator, after, path),
50
- });
51
- }
1
+ export function changeSet(locator, changed = {}) {
2
+ const documents = changed.documents;
52
3
  return {
53
- documents,
4
+ documents: documents === undefined
5
+ ? []
6
+ : documents === null
7
+ ? [{ locator, path: null }]
8
+ : documents.map((path) => ({ locator, path })),
54
9
  drafts: (changed.drafts ?? []).map((path) => ({ locator, path })),
55
10
  rooms: changed.room ? [locator] : [],
56
11
  queues: changed.queue ? [locator] : [],
57
12
  presentations: changed.presentation === undefined ? [] : [changed.presentation],
58
- messages: [],
59
13
  conversations: [],
60
14
  };
61
15
  }
62
- export function conversationChangeSet(messages, conversations) {
16
+ export function conversationChangeSet(conversations) {
63
17
  return {
64
18
  documents: [],
65
19
  drafts: [],
66
20
  rooms: [],
67
21
  queues: [],
68
22
  presentations: [],
69
- messages,
70
23
  conversations: [...new Set(conversations)],
71
24
  };
72
25
  }
@@ -77,7 +30,9 @@ export function mergeChangeSets(sets) {
77
30
  rooms: [...new Set(sets.flatMap((set) => set.rooms))],
78
31
  queues: [...new Set(sets.flatMap((set) => set.queues))],
79
32
  presentations: [...new Set(sets.flatMap((set) => set.presentations))],
80
- messages: sets.flatMap((set) => set.messages),
81
33
  conversations: [...new Set(sets.flatMap((set) => set.conversations))],
82
34
  };
83
35
  }
36
+ export function touches(set, locator, path) {
37
+ return set.documents.some((change) => change.locator === locator && (change.path === null || change.path === path));
38
+ }