@agentshouse/mdruntime 0.1.0-c6e4c19c13638 → 0.1.0-c6f02ec9468d4

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 (184) hide show
  1. package/README.md +23 -10
  2. package/dist/adapter.d.ts +156 -43
  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 +33 -5
  14. package/dist/bootstrap.d.ts.map +1 -1
  15. package/dist/bootstrap.js +201 -48
  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 +37 -16
  26. package/dist/client.d.ts.map +1 -1
  27. package/dist/client.js +156 -20
  28. package/dist/collection.d.ts +12 -14
  29. package/dist/collection.d.ts.map +1 -1
  30. package/dist/collection.js +52 -56
  31. package/dist/compile.d.ts +16 -0
  32. package/dist/compile.d.ts.map +1 -0
  33. package/dist/compile.js +786 -0
  34. package/dist/connection.d.ts +61 -20
  35. package/dist/connection.d.ts.map +1 -1
  36. package/dist/connection.js +3877 -885
  37. package/dist/conversation.d.ts +48 -19
  38. package/dist/conversation.d.ts.map +1 -1
  39. package/dist/conversation.js +723 -240
  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 +4 -1
  44. package/dist/durability.d.ts.map +1 -1
  45. package/dist/durability.js +5 -0
  46. package/dist/entry.d.ts +20 -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 +370 -0
  64. package/dist/host.d.ts +13 -2
  65. package/dist/host.d.ts.map +1 -1
  66. package/dist/host.js +134 -24
  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 +20 -9
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +9 -0
  73. package/dist/live.d.ts +22 -0
  74. package/dist/live.d.ts.map +1 -0
  75. package/dist/live.js +123 -0
  76. package/dist/media.d.ts +8 -0
  77. package/dist/media.d.ts.map +1 -0
  78. package/dist/media.js +218 -0
  79. package/dist/memory.d.ts +18 -7
  80. package/dist/memory.d.ts.map +1 -1
  81. package/dist/memory.js +252 -92
  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 +19 -4
  86. package/dist/model.d.ts.map +1 -1
  87. package/dist/model.js +10 -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 +72 -5
  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 -0
  107. package/dist/paths.d.ts.map +1 -1
  108. package/dist/paths.js +4 -0
  109. package/dist/query.d.ts +70 -4
  110. package/dist/query.d.ts.map +1 -1
  111. package/dist/query.js +53 -38
  112. package/dist/reach.d.ts +18 -4
  113. package/dist/reach.d.ts.map +1 -1
  114. package/dist/reach.js +235 -64
  115. package/dist/react.d.ts +32 -19
  116. package/dist/react.d.ts.map +1 -1
  117. package/dist/react.js +13 -21
  118. package/dist/readiness.d.ts +52 -0
  119. package/dist/readiness.d.ts.map +1 -0
  120. package/dist/readiness.js +27 -0
  121. package/dist/recovery.d.ts +26 -0
  122. package/dist/recovery.d.ts.map +1 -0
  123. package/dist/recovery.js +224 -0
  124. package/dist/refresh.d.ts +20 -7
  125. package/dist/refresh.d.ts.map +1 -1
  126. package/dist/refresh.js +148 -59
  127. package/dist/replica.d.ts +58 -33
  128. package/dist/replica.d.ts.map +1 -1
  129. package/dist/replica.js +320 -157
  130. package/dist/room-draft.d.ts +57 -10
  131. package/dist/room-draft.d.ts.map +1 -1
  132. package/dist/room-draft.js +222 -39
  133. package/dist/rows.d.ts +39 -35
  134. package/dist/rows.d.ts.map +1 -1
  135. package/dist/rows.js +176 -99
  136. package/dist/save.d.ts +73 -4
  137. package/dist/save.d.ts.map +1 -1
  138. package/dist/save.js +825 -150
  139. package/dist/search.d.ts +41 -29
  140. package/dist/search.d.ts.map +1 -1
  141. package/dist/search.js +37 -105
  142. package/dist/seed.d.ts +16 -0
  143. package/dist/seed.d.ts.map +1 -0
  144. package/dist/seed.js +75 -0
  145. package/dist/shared.d.ts +15 -0
  146. package/dist/shared.d.ts.map +1 -0
  147. package/dist/shared.js +421 -0
  148. package/dist/status.d.ts +7 -2
  149. package/dist/status.d.ts.map +1 -1
  150. package/dist/status.js +3 -9
  151. package/dist/store.d.ts +110 -59
  152. package/dist/store.d.ts.map +1 -1
  153. package/dist/store.js +324 -344
  154. package/dist/stored.d.ts +130 -0
  155. package/dist/stored.d.ts.map +1 -0
  156. package/dist/stored.js +560 -0
  157. package/dist/tables.d.ts +325 -0
  158. package/dist/tables.d.ts.map +1 -0
  159. package/dist/tables.js +578 -0
  160. package/dist/transfer.d.ts +0 -5
  161. package/dist/transfer.d.ts.map +1 -1
  162. package/dist/turn.d.ts +9 -0
  163. package/dist/turn.d.ts.map +1 -0
  164. package/dist/turn.js +75 -0
  165. package/dist/validation.d.ts +29 -0
  166. package/dist/validation.d.ts.map +1 -0
  167. package/dist/validation.js +101 -0
  168. package/dist/windows.d.ts +22 -0
  169. package/dist/windows.d.ts.map +1 -0
  170. package/dist/windows.js +89 -0
  171. package/dist/wire.d.ts +170 -33
  172. package/dist/wire.d.ts.map +1 -1
  173. package/dist/wire.js +69 -31
  174. package/dist/words.d.ts +19 -0
  175. package/dist/words.d.ts.map +1 -0
  176. package/dist/words.js +156 -0
  177. package/package.json +26 -15
  178. package/AGENTS.md +0 -241
  179. package/dist/attachment.d.ts +0 -3
  180. package/dist/attachment.d.ts.map +0 -1
  181. package/dist/attachment.js +0 -8
  182. package/dist/read-side.d.ts +0 -18
  183. package/dist/read-side.d.ts.map +0 -1
  184. package/dist/read-side.js +0 -433
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ const COMPLETE_ROOMS = new Set(['complete', 'unadmitted']);
2
+ export function readinessOf(facts) {
3
+ const { established, coverage: held, ...reported } = facts;
4
+ const settledConversations = held.conversations === 'complete' || held.conversations === 'undeclared';
5
+ const complete = held.listed &&
6
+ settledConversations &&
7
+ held.rooms.every((room) => COMPLETE_ROOMS.has(room.state));
8
+ const coverage = { ...held, complete };
9
+ const stored = facts.code === 'stored';
10
+ const ready = stored && complete;
11
+ const usable = stored && (ready || established);
12
+ const status = ready
13
+ ? 'ready'
14
+ : facts.space !== null
15
+ ? 'paused'
16
+ : facts.lost && !established
17
+ ? 'lost'
18
+ : 'preparing';
19
+ return {
20
+ ...reported,
21
+ coverage,
22
+ status,
23
+ ready,
24
+ usable,
25
+ durability: facts.persistence === 'granted' ? 'persistent' : 'best-effort',
26
+ };
27
+ }
@@ -0,0 +1,26 @@
1
+ export type Attempted = 'done' | 'again' | {
2
+ readonly at: number;
3
+ };
4
+ export type Attempt = (signal: AbortSignal) => Promise<Attempted>;
5
+ export type AttemptOptions = {
6
+ readonly at?: number;
7
+ readonly again?: boolean;
8
+ };
9
+ export type RecoveryOptions = {
10
+ readonly firstMs?: number;
11
+ readonly maxMs?: number;
12
+ readonly attempts?: number;
13
+ readonly inFlight?: number;
14
+ };
15
+ export type Recovery = {
16
+ attempt(intent: string, run: Attempt, options?: AttemptOptions): Promise<boolean>;
17
+ pending(intent: string): boolean;
18
+ resume(): void;
19
+ cancel(intent: string): void;
20
+ scope(inFlight?: number): Recovery;
21
+ retire(): Promise<void>;
22
+ };
23
+ export declare function retryDelay(tries: number, firstMs?: number, maxMs?: number): number;
24
+ export declare function untilAnswered<T>(ask: () => Promise<T>, signal: AbortSignal, answered?: (answer: T) => boolean): Promise<T>;
25
+ export declare function createRecovery(options?: RecoveryOptions): Recovery;
26
+ //# sourceMappingURL=recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACnC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB,CAAC;AAsBF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAW,EAAE,KAAK,SAAS,GAAG,MAAM,CAGpF;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACrB,MAAM,EAAE,WAAW,EACnB,QAAQ,GAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAoB,GAC5C,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAwKD,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAStE"}
@@ -0,0 +1,224 @@
1
+ // A first retry waits about a second, so a passing failure clears before the next attempt.
2
+ const FIRST_MS = 1_000;
3
+ // Waits stop doubling at half a minute, so work resumes soon after a long failure ends.
4
+ const MAX_MS = 30_000;
5
+ const ATTEMPTS = 8;
6
+ export function retryDelay(tries, firstMs = FIRST_MS, maxMs = MAX_MS) {
7
+ const longest = Math.min(maxMs, firstMs * 2 ** tries);
8
+ return longest / 2 + (Math.random() * longest) / 2;
9
+ }
10
+ export async function untilAnswered(ask, signal, answered = () => true) {
11
+ for (let tries = 0;; tries += 1) {
12
+ try {
13
+ const answer = await ask();
14
+ if (answered(answer) || signal.aborted)
15
+ return answer;
16
+ }
17
+ catch (error) {
18
+ if (signal.aborted)
19
+ throw error;
20
+ }
21
+ await new Promise((resume) => {
22
+ const stop = () => {
23
+ clearTimeout(again);
24
+ resume();
25
+ };
26
+ // A read that failed is asked again on the doubling backoff, so its asker is answered once the failure clears.
27
+ const again = setTimeout(() => {
28
+ signal.removeEventListener('abort', stop);
29
+ resume();
30
+ }, retryDelay(tries));
31
+ signal.addEventListener('abort', stop, { once: true });
32
+ });
33
+ signal.throwIfAborted();
34
+ }
35
+ }
36
+ function owner(backoff, inFlight, release = () => { }) {
37
+ const intents = new Map();
38
+ const children = new Set();
39
+ const running = new Set();
40
+ const queued = [];
41
+ let free = inFlight;
42
+ let retired = false;
43
+ function finish(key, intent, done) {
44
+ if (intents.get(key) === intent)
45
+ intents.delete(key);
46
+ if (intent.timer !== null)
47
+ clearTimeout(intent.timer);
48
+ intent.timer = null;
49
+ intent.end(done);
50
+ }
51
+ function wait(key, intent, at, guided) {
52
+ if (intent.timer !== null)
53
+ clearTimeout(intent.timer);
54
+ intent.due = at;
55
+ intent.guided = guided;
56
+ intent.timer = setTimeout(() => {
57
+ intent.timer = null;
58
+ launch(key, intent);
59
+ }, Math.max(0, at - Date.now()));
60
+ }
61
+ function launch(key, intent) {
62
+ intent.due = null;
63
+ intent.guided = false;
64
+ const controller = new AbortController();
65
+ intent.controller = controller;
66
+ const run = start(key, intent, controller);
67
+ running.add(run);
68
+ void run.finally(() => running.delete(run));
69
+ }
70
+ async function start(key, intent, controller) {
71
+ while (free === 0)
72
+ await new Promise((admit) => queued.push(admit));
73
+ if (controller.signal.aborted) {
74
+ queued.shift()?.();
75
+ return;
76
+ }
77
+ free -= 1;
78
+ const abandoned = new Promise((resolve) => {
79
+ controller.signal.addEventListener('abort', () => resolve(null), { once: true });
80
+ });
81
+ let result;
82
+ try {
83
+ result = await Promise.race([intent.run(controller.signal), abandoned]);
84
+ }
85
+ catch {
86
+ result = 'again';
87
+ }
88
+ finally {
89
+ free += 1;
90
+ queued.shift()?.();
91
+ }
92
+ if (result === null || controller.signal.aborted || intents.get(key) !== intent)
93
+ return;
94
+ intent.controller = null;
95
+ const again = intent.again;
96
+ intent.again = null;
97
+ if (result === 'done') {
98
+ intent.tries = 0;
99
+ if (again === null)
100
+ finish(key, intent, true);
101
+ else if (again === 'now')
102
+ launch(key, intent);
103
+ else
104
+ wait(key, intent, again, true);
105
+ return;
106
+ }
107
+ intent.tries += 1;
108
+ if (intent.tries >= backoff.attempts) {
109
+ finish(key, intent, false);
110
+ return;
111
+ }
112
+ if (result === 'again') {
113
+ // The next attempt waits the doubling backoff, up to its maximum.
114
+ const delay = retryDelay(intent.tries - 1, backoff.firstMs, backoff.maxMs);
115
+ wait(key, intent, Date.now() + delay, false);
116
+ }
117
+ else
118
+ wait(key, intent, result.at, true);
119
+ }
120
+ const recovery = {
121
+ attempt(key, run, options = {}) {
122
+ if (retired)
123
+ return Promise.resolve(false);
124
+ const held = intents.get(key);
125
+ if (held !== undefined) {
126
+ held.run = run;
127
+ if (held.controller !== null) {
128
+ const at = options.at;
129
+ held.again =
130
+ at === undefined || held.again === 'now'
131
+ ? 'now'
132
+ : Math.min(at, held.again ?? Number.POSITIVE_INFINITY);
133
+ }
134
+ else if (held.due !== null && held.due <= Date.now()) {
135
+ if (held.timer !== null)
136
+ clearTimeout(held.timer);
137
+ held.timer = null;
138
+ launch(key, held);
139
+ }
140
+ else if (options.at !== undefined && (held.due === null || options.at < held.due)) {
141
+ wait(key, held, options.at, true);
142
+ }
143
+ return held.ended;
144
+ }
145
+ let end = () => { };
146
+ const ended = new Promise((resolve) => {
147
+ end = resolve;
148
+ });
149
+ const intent = {
150
+ run,
151
+ tries: 0,
152
+ timer: null,
153
+ due: null,
154
+ guided: false,
155
+ controller: null,
156
+ again: null,
157
+ ended,
158
+ end,
159
+ };
160
+ intents.set(key, intent);
161
+ if (options.at !== undefined)
162
+ wait(key, intent, options.at, true);
163
+ else if (options.again === true) {
164
+ intent.tries = 1;
165
+ wait(key, intent, Date.now() + retryDelay(0, backoff.firstMs, backoff.maxMs), false);
166
+ }
167
+ else
168
+ launch(key, intent);
169
+ return ended;
170
+ },
171
+ pending(key) {
172
+ const intent = intents.get(key);
173
+ return intent !== undefined && intent.controller === null;
174
+ },
175
+ resume() {
176
+ if (retired)
177
+ return;
178
+ for (const [key, intent] of [...intents]) {
179
+ if (intent.guided && intent.due !== null && intent.due > Date.now())
180
+ continue;
181
+ if (intent.timer !== null)
182
+ clearTimeout(intent.timer);
183
+ intent.timer = null;
184
+ intent.controller?.abort();
185
+ intent.again = null;
186
+ intent.tries = 0;
187
+ launch(key, intent);
188
+ }
189
+ },
190
+ cancel(key) {
191
+ const intent = intents.get(key);
192
+ if (intent === undefined)
193
+ return;
194
+ intent.controller?.abort();
195
+ finish(key, intent, false);
196
+ },
197
+ scope(bound = Infinity) {
198
+ const child = owner(backoff, bound, () => children.delete(child));
199
+ if (retired)
200
+ void child.retire();
201
+ else
202
+ children.add(child);
203
+ return child;
204
+ },
205
+ async retire() {
206
+ retired = true;
207
+ release();
208
+ for (const [key, intent] of [...intents]) {
209
+ intent.controller?.abort();
210
+ finish(key, intent, false);
211
+ }
212
+ await Promise.all([...children].map((child) => child.retire()));
213
+ await Promise.all(running);
214
+ },
215
+ };
216
+ return recovery;
217
+ }
218
+ export function createRecovery(options = {}) {
219
+ return owner({
220
+ firstMs: options.firstMs ?? FIRST_MS,
221
+ maxMs: options.maxMs ?? MAX_MS,
222
+ attempts: options.attempts ?? ATTEMPTS,
223
+ }, options.inFlight ?? Infinity);
224
+ }
package/dist/refresh.d.ts CHANGED
@@ -1,14 +1,27 @@
1
- import type { Adapter, AdapterFailure, Authorization, RetryableRefusal } from './adapter.js';
1
+ import type { AdapterFailure, Authorization, RefreshPage, RefreshRequest, RefreshResult, RetryableRefusal } from './adapter.js';
2
2
  import type { Remodel } from './bootstrap.js';
3
- import { type ConfirmedLayer } from './replica.js';
4
- import { type Refused, type Unconfirmed } from './transfer.js';
5
- export type RefreshOutcome = {
3
+ import type { ReplicaRecord } from './replica.js';
4
+ import type { RefreshedPage } from './store.js';
5
+ import type { HeldEntry, StoredEntry } from './tables.js';
6
+ import { type Unconfirmed } from './transfer.js';
7
+ export type Advancement = {
6
8
  kind: 'still-current';
7
9
  } | {
8
10
  kind: 'advanced';
9
- confirmed: ConfirmedLayer;
11
+ record: ReplicaRecord;
12
+ changed: ReadonlySet<string>;
10
13
  } | {
11
14
  kind: 'beyond-horizon';
12
- } | RetryableRefusal | Unconfirmed | Refused | AdapterFailure;
13
- export declare function refreshRoom(adapter: Adapter, authorization: Authorization, confirmed: ConfirmedLayer, remodel: Remodel, continuing: () => boolean): Promise<RefreshOutcome>;
15
+ } | RetryableRefusal | Unconfirmed | AdapterFailure;
16
+ export type Refresher = (authorization: Authorization, request: RefreshRequest) => Promise<RefreshResult>;
17
+ export type Refreshing = {
18
+ turn(): void;
19
+ prior(paths: readonly string[]): Promise<ReadonlyMap<string, HeldEntry>>;
20
+ later(paths: readonly string[], roomVersion: string): Promise<ReadonlySet<string>>;
21
+ stage(page: RefreshedPage): Promise<boolean>;
22
+ };
23
+ type PageContent = Pick<RefreshPage, 'documents' | 'revisions' | 'fileIds' | 'changes' | 'binaryFiles'>;
24
+ export declare function pageEntries(page: PageContent, removals: readonly string[], roomVersion: string, prior: (paths: readonly string[]) => Promise<ReadonlyMap<string, HeldEntry>>): Promise<StoredEntry[]>;
25
+ export declare function advancement(refresh: Refresher, authorization: Authorization, held: ReplicaRecord, remodel: Remodel, continuing: () => boolean, staging: Refreshing): Promise<Advancement>;
26
+ export {};
14
27
  //# sourceMappingURL=refresh.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EAGb,gBAAgB,EAEjB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAe,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,OAAO,GACP,cAAc,CAAC;AAEnB,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,GACxB,OAAO,CAAC,cAAc,CAAC,CA8EzB"}
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACX,cAAc,EACd,aAAa,EACb,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAG9D,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,cAAc,CAAC;AAEnB,MAAM,MAAM,SAAS,GAAG,CACtB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF,KAAK,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C,CAAC;AASF,KAAK,WAAW,GAAG,IAAI,CACrB,WAAW,EACX,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAClE,CAAC;AAmFF,wBAAsB,WAAW,CAC/B,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,GAC3E,OAAO,CAAC,WAAW,EAAE,CAAC,CAKxB;AA8CD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,EACzB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,WAAW,CAAC,CA8CtB"}
package/dist/refresh.js CHANGED
@@ -1,61 +1,153 @@
1
- import { declaredAttachments } from './attachment.js';
2
- import { readStaged } from './replica.js';
3
1
  import { unconfirmed } from './transfer.js';
4
- export async function refreshRoom(adapter, authorization, confirmed, remodel, continuing) {
5
- const locator = confirmed.record.locator;
6
- const fromRoomVersion = confirmed.record.roomVersion;
7
- const first = await adapter.refresh(authorization, {
2
+ import { ROW_WEIGHT, stepped, yielded } from './turn.js';
3
+ function* listing(page, removals) {
4
+ const removed = new Set();
5
+ for (const path of removals) {
6
+ removed.add(path);
7
+ yield ROW_WEIGHT;
8
+ }
9
+ const documents = [];
10
+ const binaries = [];
11
+ const asked = [];
12
+ const written = new Set();
13
+ for (const [kept, named] of [
14
+ [documents, page.documents],
15
+ [binaries, page.binaryFiles],
16
+ ]) {
17
+ for (const path of Object.keys(named)) {
18
+ yield ROW_WEIGHT;
19
+ if (removed.has(path))
20
+ continue;
21
+ kept.push(path);
22
+ written.add(path);
23
+ if (page.revisions[path] === undefined)
24
+ asked.push(path);
25
+ }
26
+ }
27
+ const others = [];
28
+ const seen = new Set();
29
+ for (const named of [page.revisions, page.fileIds ?? {}, page.changes]) {
30
+ for (const path of Object.keys(named)) {
31
+ yield ROW_WEIGHT;
32
+ if (seen.has(path))
33
+ continue;
34
+ seen.add(path);
35
+ if (!written.has(path) && !removed.has(path))
36
+ others.push(path);
37
+ }
38
+ }
39
+ return { documents, binaries, others, asked: [...asked, ...others] };
40
+ }
41
+ function* entering(page, roomVersion, listed, prior) {
42
+ const entries = [];
43
+ for (const path of listed.documents) {
44
+ yield ROW_WEIGHT;
45
+ entries.push({
46
+ path,
47
+ content: page.documents[path],
48
+ binary: null,
49
+ revision: page.revisions[path] ?? prior.get(path)?.revision ?? null,
50
+ fileId: page.fileIds?.[path] ?? null,
51
+ change: page.changes[path] ?? null,
52
+ written: roomVersion,
53
+ });
54
+ }
55
+ for (const path of listed.binaries) {
56
+ yield ROW_WEIGHT;
57
+ entries.push({
58
+ path,
59
+ content: null,
60
+ binary: { state: 'accepted', ...page.binaryFiles[path] },
61
+ revision: page.revisions[path] ?? prior.get(path)?.revision ?? null,
62
+ fileId: page.fileIds?.[path] ?? null,
63
+ change: page.changes[path] ?? null,
64
+ written: null,
65
+ });
66
+ }
67
+ for (const path of listed.others) {
68
+ yield ROW_WEIGHT;
69
+ const held = prior.get(path);
70
+ if (held === undefined)
71
+ continue;
72
+ const { type: _type, ...kept } = held;
73
+ entries.push({
74
+ ...kept,
75
+ revision: page.revisions[path] ?? held.revision,
76
+ fileId: page.fileIds?.[path] ?? held.fileId,
77
+ change: page.changes[path] ?? held.change,
78
+ });
79
+ }
80
+ return entries;
81
+ }
82
+ export async function pageEntries(page, removals, roomVersion, prior) {
83
+ await yielded();
84
+ const listed = await stepped(listing(page, removals));
85
+ const held = listed.asked.length === 0 ? new Map() : await prior(listed.asked);
86
+ return stepped(entering(page, roomVersion, listed, held));
87
+ }
88
+ function without(named, kept) {
89
+ return Object.fromEntries(Object.entries(named).filter(([path]) => !kept.has(path)));
90
+ }
91
+ function unwritten(page, kept) {
92
+ if (kept.size === 0)
93
+ return page;
94
+ return {
95
+ ...page,
96
+ documents: without(page.documents, kept),
97
+ revisions: without(page.revisions, kept),
98
+ ...(page.fileIds === undefined ? {} : { fileIds: without(page.fileIds, kept) }),
99
+ changes: without(page.changes, kept),
100
+ binaryFiles: without(page.binaryFiles, kept),
101
+ removals: page.removals.filter((path) => !kept.has(path)),
102
+ };
103
+ }
104
+ async function pageOf(answered, roomVersion, staging) {
105
+ const page = unwritten(answered, await staging.later([
106
+ ...Object.keys(answered.documents),
107
+ ...Object.keys(answered.binaryFiles),
108
+ ...answered.removals,
109
+ ], roomVersion));
110
+ return {
111
+ entries: await pageEntries(page, page.removals, roomVersion, (paths) => staging.prior(paths)),
112
+ removals: page.removals,
113
+ folders: page.folders ?? [],
114
+ folderRemovals: page.folderRemovals ?? [],
115
+ };
116
+ }
117
+ export async function advancement(refresh, authorization, held, remodel, continuing, staging) {
118
+ const locator = held.locator;
119
+ const fromRoomVersion = held.roomVersion;
120
+ staging.turn();
121
+ if (!continuing())
122
+ return unconfirmed;
123
+ const first = await refresh(authorization, {
8
124
  locator,
9
- selection: confirmed.record.replica.selection,
125
+ selection: held.replica.selection,
10
126
  fromRoomVersion,
11
127
  });
12
128
  if (first.kind !== 'net-advancement')
13
129
  return first;
14
130
  const roomVersion = first.roomVersion;
15
- const models = remodel(first.models, {
16
- collection: confirmed.record.model,
17
- selection: confirmed.record.selectionModel,
18
- });
19
- const documents = { ...confirmed.record.documents };
20
- const revisions = { ...confirmed.record.revisions };
21
- const changes = { ...confirmed.record.changes };
22
- const written = { ...confirmed.record.written };
23
- const binaryTargets = new Set(confirmed.record.binaryTargets);
24
- const attachments = [];
25
- const stage = (page) => {
26
- if (page.attachments !== undefined)
27
- attachments.push(page.attachments);
28
- Object.assign(documents, page.documents);
29
- Object.assign(revisions, page.revisions);
30
- for (const path of Object.keys(page.documents)) {
31
- binaryTargets.delete(path);
32
- delete changes[path];
33
- written[path] = roomVersion;
34
- }
35
- for (const target of page.binaryTargets) {
36
- delete documents[target];
37
- delete revisions[target];
38
- delete changes[target];
39
- delete written[target];
40
- binaryTargets.add(target);
41
- }
42
- Object.assign(changes, page.changes);
43
- for (const path of page.removals) {
44
- delete documents[path];
45
- delete revisions[path];
46
- delete changes[path];
47
- delete written[path];
48
- binaryTargets.delete(path);
49
- }
131
+ const models = remodel(first.models, { collection: held.model });
132
+ const changed = new Set();
133
+ const staged = async (page) => {
134
+ const read = await pageOf(page, roomVersion, staging);
135
+ for (const { path } of read.entries)
136
+ changed.add(path);
137
+ for (const path of read.removals)
138
+ changed.add(path);
139
+ return staging.stage(read);
50
140
  };
51
- stage(first);
141
+ if (!(await staged(first)))
142
+ return unconfirmed;
52
143
  let pageToken = first.pageToken;
53
144
  while (pageToken !== undefined) {
145
+ await staging.turn();
54
146
  if (!continuing())
55
147
  return unconfirmed;
56
- const page = await adapter.refresh(authorization, {
148
+ const page = await refresh(authorization, {
57
149
  locator,
58
- selection: confirmed.record.replica.selection,
150
+ selection: held.replica.selection,
59
151
  fromRoomVersion,
60
152
  pageToken,
61
153
  });
@@ -65,20 +157,17 @@ export async function refreshRoom(adapter, authorization, confirmed, remodel, co
65
157
  return page;
66
158
  if (page.roomVersion !== roomVersion)
67
159
  return unconfirmed;
68
- stage(page);
160
+ if (!(await staged(page)))
161
+ return unconfirmed;
69
162
  pageToken = page.pageToken;
70
163
  }
71
- const staged = readStaged({
72
- ...confirmed.record,
73
- model: models.collection,
74
- selectionModel: models.selection,
75
- roomVersion,
76
- documents,
77
- binaryTargets: [...binaryTargets].sort(),
78
- revisions,
79
- changes,
80
- written,
81
- attachments: attachments.length === 0 ? confirmed.record.attachments : declaredAttachments(attachments),
82
- }, confirmed);
83
- return staged.kind === 'staged' ? { kind: 'advanced', confirmed: staged.confirmed } : staged;
164
+ return {
165
+ kind: 'advanced',
166
+ record: {
167
+ ...held,
168
+ model: models.collection,
169
+ roomVersion,
170
+ },
171
+ changed,
172
+ };
84
173
  }
package/dist/replica.d.ts CHANGED
@@ -1,43 +1,68 @@
1
- import { type ChangeBatch } from './change.js';
1
+ import type { BootstrapInventory, MutationResult, OperationScopes, ReplicaAdmission, TypedSelection } from './adapter.js';
2
+ import { type ChangeBatch, type Precondition } from './change.js';
2
3
  import { type Collection, type Composition } from './collection.js';
4
+ import { type ModelState } from './model.js';
3
5
  import { type Layer } from './overlay.js';
4
- import type { RoomAttachment } from './adapter.js';
5
- import type { ReplicaRecord } from './store.js';
6
- import type { Refused } from './transfer.js';
7
- export type ConfirmedLayer = {
8
- record: ReplicaRecord;
9
- collection: Collection;
6
+ import type { HeldEntry, OverlayEntry, StoredEntry } from './tables.js';
7
+ export type ReplicaRecord = {
8
+ readonly locator: string;
9
+ readonly name: string;
10
+ readonly handle: string;
11
+ readonly operations: OperationScopes;
12
+ readonly replica: ReplicaAdmission;
13
+ readonly model: ModelState;
14
+ readonly typedSelection: TypedSelection | null;
15
+ readonly providerOwnedPaths: readonly string[];
16
+ readonly roomVersion: string;
17
+ readonly transfer: string;
18
+ readonly inventory: BootstrapInventory;
19
+ readonly key: number;
20
+ };
21
+ export type HeldReplica = {
22
+ readonly record: ReplicaRecord;
23
+ readonly queue: readonly ChangeBatch[];
24
+ readonly overlaid: ReadonlySet<string>;
25
+ readonly count: number;
26
+ readonly confirmed: number;
27
+ readonly indexed: boolean;
10
28
  };
11
29
  export type VisibleLayer = Layer & {
12
- collection: Collection;
30
+ readonly collection: Collection;
31
+ };
32
+ export type Slice = Layer & {
33
+ readonly written: Readonly<Record<string, string>>;
34
+ readonly held: ReadonlySet<string>;
13
35
  };
14
- export type Staged = {
15
- kind: 'staged';
16
- confirmed: ConfirmedLayer;
17
- } | Refused;
18
- export type Replica = {
19
- confirmed: ConfirmedLayer;
20
- queue: readonly ChangeBatch[];
21
- visible: VisibleLayer;
22
- replay: readonly ReplayStep[];
36
+ export declare function compositionOf(record: Pick<ReplicaRecord, 'model' | 'typedSelection'>, builtIn: ModelState): Composition;
37
+ export declare function storedRecord(record: ReplicaRecord): string;
38
+ export declare function slicing(entries: readonly HeldEntry[], paths: Iterable<string>): Generator<number, Slice, void>;
39
+ export declare function entryAt(layer: Layer & {
40
+ readonly written?: Readonly<Record<string, string>>;
41
+ }, path: string): StoredEntry | null;
42
+ export declare function slicingWith(slice: Slice, set: readonly StoredEntry[], removed: readonly string[]): Generator<number, Slice, void>;
43
+ export declare function touchedBy(queue: readonly ChangeBatch[]): Set<string>;
44
+ export declare function movedBy(queue: readonly ChangeBatch[], locator: string): Set<string>;
45
+ export type Replayed = {
46
+ readonly visible: VisibleLayer;
47
+ readonly touched: ReadonlySet<string>;
23
48
  };
24
- type ReplayStep = {
25
- id: string;
26
- before: Layer;
27
- after: Layer;
28
- effective: ChangeBatch;
29
- collection?: Collection;
49
+ export declare function replaying(confirmed: Slice, queue: readonly ChangeBatch[], locator: string, composition: Composition): Generator<number, Replayed, void>;
50
+ export declare function overlayOf(visible: Layer, touched: Iterable<string>): Generator<number, OverlayEntry[], void>;
51
+ export declare function holds(layer: Layer, preconditions: readonly Precondition[]): boolean;
52
+ export declare function landed(batch: ChangeBatch, confirmed: Layer, current?: Readonly<Record<string, string>>): boolean;
53
+ export type Standing = {
54
+ readonly withdrawn: readonly ChangeBatch[];
55
+ readonly kept: readonly ChangeBatch[];
30
56
  };
31
- export declare function compositionOf(record: ReplicaRecord): Composition;
32
- export declare function readConfirmed(record: ReplicaRecord, previous?: ConfirmedLayer): Staged;
33
- export declare function sameMembership(record: ReplicaRecord, other: ReplicaRecord): boolean;
34
- export declare function readStaged(record: ReplicaRecord, previous?: ConfirmedLayer): Staged;
35
- export declare function readReclassified(record: ReplicaRecord, previous: ConfirmedLayer): Staged | {
36
- kind: 'deferred';
57
+ export declare function standing(confirmed: Slice, queue: readonly ChangeBatch[], withdrawable: (batch: ChangeBatch) => boolean, local: boolean, locator: string, composition: Composition): Generator<number, Standing, void>;
58
+ type Accepted = Extract<MutationResult, {
59
+ kind: 'accepted';
60
+ }>;
61
+ export type Returned = {
62
+ readonly set: readonly StoredEntry[];
63
+ readonly removed: readonly string[];
37
64
  };
38
- export declare function applyReturned(confirmed: ConfirmedLayer, documents: Readonly<Record<string, string>>, revisions: Readonly<Record<string, string>>, removals: readonly string[], attachments: readonly RoomAttachment[] | undefined, roomVersion: string, writtenAt: string): Staged;
39
- export declare function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[], previous?: Replica): Replica;
40
- export declare function landed(batch: ChangeBatch, confirmed: ConfirmedLayer): boolean;
41
- export declare function withdrawals(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[], withdrawable: (batch: ChangeBatch) => boolean): readonly ChangeBatch[];
65
+ export declare function returnedPaths(submitted: ChangeBatch, accepted: Accepted): Set<string>;
66
+ export declare function returning(confirmed: Slice, submitted: ChangeBatch, accepted: Accepted, writtenAt: string): Generator<number, Returned, void>;
42
67
  export {};
43
68
  //# sourceMappingURL=replica.d.ts.map