@agentshouse/mdruntime 0.1.0-cdb8840578a20 → 0.1.0-cdded6c080913
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -16
- package/dist/acceptance.d.ts +6 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +389 -0
- package/dist/actions.d.ts +20 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +250 -0
- package/dist/adapter.d.ts +151 -79
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +7 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +40 -41
- package/dist/binary.d.ts +0 -5
- package/dist/binary.d.ts.map +1 -1
- package/dist/binary.js +1 -1
- package/dist/bootstrap.d.ts +31 -11
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +319 -107
- package/dist/cell.d.ts +6 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +9 -0
- package/dist/chain.d.ts +12 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +64 -0
- package/dist/change-set.d.ts +9 -16
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +11 -88
- package/dist/change.d.ts +32 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +10 -1
- package/dist/chat-types.d.ts +5 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +13 -0
- package/dist/client.d.ts +33 -10
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +98 -11
- package/dist/collection.d.ts +11 -21
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +39 -291
- package/dist/compile.d.ts +16 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +717 -0
- package/dist/connection.d.ts +7 -129
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +97 -3359
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/{chat/context.js → context.js} +1 -4
- package/dist/conversation-row.d.ts +33 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +53 -0
- package/dist/conversation.d.ts +43 -18
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +718 -312
- package/dist/digest.d.ts +7 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +113 -0
- package/dist/discovery.d.ts +10 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +175 -0
- package/dist/durability.d.ts +16 -4
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +5 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +33 -28
- package/dist/figures.d.ts +48 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +197 -0
- package/dist/file.d.ts +2 -19
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +7 -122
- package/dist/holdings.d.ts +29 -0
- package/dist/holdings.d.ts.map +1 -0
- package/dist/holdings.js +95 -0
- package/dist/host.d.ts +7 -8
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +101 -24
- package/dist/identity.d.ts +0 -2
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -6
- package/dist/index.d.ts +32 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/install.d.ts +56 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +560 -0
- package/dist/job.d.ts +33 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +54 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +267 -0
- package/dist/listing.d.ts +53 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +175 -0
- package/dist/live.d.ts +23 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +165 -0
- package/dist/locks.d.ts +9 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +61 -0
- package/dist/log.d.ts +1 -0
- package/dist/log.d.ts.map +1 -1
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +61 -0
- package/dist/media.d.ts +8 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +218 -0
- package/dist/memory.d.ts +19 -7
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +248 -103
- package/dist/messages.d.ts +52 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +168 -0
- package/dist/model.d.ts +8 -10
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +6 -18
- package/dist/models.d.ts +14 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +193 -0
- package/dist/name.d.ts +4 -0
- package/dist/name.d.ts.map +1 -0
- package/dist/name.js +122 -0
- package/dist/observation.d.ts +17 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +100 -5
- package/dist/opened.d.ts +22 -0
- package/dist/opened.d.ts.map +1 -0
- package/dist/opened.js +107 -0
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +56 -0
- package/dist/outcome.d.ts +49 -8
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +42 -0
- package/dist/overlay.d.ts +4 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +106 -156
- package/dist/{chat/parts.d.ts → parts.d.ts} +11 -9
- package/dist/parts.d.ts.map +1 -0
- package/dist/{chat/parts.js → parts.js} +45 -46
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +4 -0
- package/dist/preparation.d.ts +20 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +226 -0
- package/dist/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +272 -0
- package/dist/query.d.ts +26 -185
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -464
- package/dist/{chat/questions.d.ts → questions.d.ts} +5 -2
- package/dist/questions.d.ts.map +1 -0
- package/dist/{chat/questions.js → questions.js} +12 -1
- package/dist/reach.d.ts +19 -9
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +287 -99
- package/dist/react.d.ts +12 -4
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +7 -17
- package/dist/{chat/read.d.ts → read.d.ts} +2 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/{chat/read.js → read.js} +4 -0
- package/dist/readiness.d.ts +14 -17
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +2 -8
- package/dist/reads.d.ts +36 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +150 -0
- package/dist/recovery.d.ts +3 -2
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +43 -8
- package/dist/refresh.d.ts +17 -14
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +143 -52
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +56 -0
- package/dist/replica.d.ts +55 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +331 -181
- package/dist/room-draft.d.ts +37 -6
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +161 -74
- package/dist/room-drafts.d.ts +24 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +216 -0
- package/dist/rows.d.ts +31 -29
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +59 -116
- package/dist/runtime.d.ts +42 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +53 -14
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +534 -187
- package/dist/saves.d.ts +70 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +1004 -0
- package/dist/search.d.ts +15 -78
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +10 -184
- package/dist/seed.d.ts +25 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +146 -0
- package/dist/shared.d.ts +7 -3
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +119 -66
- package/dist/shown.d.ts +31 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +294 -0
- package/dist/socket/admission.d.ts +7 -0
- package/dist/socket/admission.d.ts.map +1 -0
- package/dist/socket/admission.js +39 -0
- package/dist/socket/answers.d.ts +6 -0
- package/dist/socket/answers.d.ts.map +1 -0
- package/dist/socket/answers.js +20 -0
- package/dist/socket/lanes.d.ts +20 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +77 -0
- package/dist/socket/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket/rooms.d.ts +43 -0
- package/dist/socket/rooms.d.ts.map +1 -0
- package/dist/socket/rooms.js +90 -0
- package/dist/socket/session.d.ts +39 -0
- package/dist/socket/session.d.ts.map +1 -0
- package/dist/socket/session.js +23 -0
- package/dist/socket.d.ts +70 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +175 -0
- package/dist/source.d.ts +61 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +81 -0
- package/dist/status.d.ts +4 -5
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -7
- package/dist/store/fences.d.ts +16 -0
- package/dist/store/fences.d.ts.map +1 -0
- package/dist/store/fences.js +26 -0
- package/dist/store/installs.d.ts +30 -0
- package/dist/store/installs.d.ts.map +1 -0
- package/dist/store/installs.js +34 -0
- package/dist/store/readiness.d.ts +10 -0
- package/dist/store/readiness.d.ts.map +1 -0
- package/dist/store/readiness.js +52 -0
- package/dist/store/records.d.ts +212 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +408 -0
- package/dist/store/room-held.d.ts +8 -0
- package/dist/store/room-held.d.ts.map +1 -0
- package/dist/store/room-held.js +17 -0
- package/dist/store/space.d.ts +11 -0
- package/dist/store/space.d.ts.map +1 -0
- package/dist/store/space.js +43 -0
- package/dist/store/watchers.d.ts +17 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +57 -0
- package/dist/store/writes.d.ts +24 -0
- package/dist/store/writes.d.ts.map +1 -0
- package/dist/store/writes.js +125 -0
- package/dist/store.d.ts +106 -150
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +136 -713
- package/dist/stored.d.ts +156 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +637 -0
- package/dist/surface.d.ts +88 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +222 -0
- package/dist/sync.d.ts +20 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +531 -0
- package/dist/tables.d.ts +415 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +740 -0
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +129 -0
- package/dist/transfer.d.ts +0 -5
- package/dist/transfer.d.ts.map +1 -1
- package/dist/turn.d.ts +5 -3
- package/dist/turn.d.ts.map +1 -1
- package/dist/turn.js +51 -21
- package/dist/validation.d.ts +29 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +104 -0
- package/dist/windows.d.ts +11 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +16 -0
- package/dist/wire.d.ts +50 -6
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +16 -2
- package/package.json +18 -19
- package/AGENTS.md +0 -300
- package/dist/acquisition.d.ts +0 -14
- package/dist/acquisition.d.ts.map +0 -1
- package/dist/acquisition.js +0 -24
- package/dist/chat/acts.d.ts +0 -33
- package/dist/chat/acts.d.ts.map +0 -1
- package/dist/chat/acts.js +0 -36
- package/dist/chat/context.d.ts +0 -3
- package/dist/chat/context.d.ts.map +0 -1
- package/dist/chat/input.d.ts +0 -9
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -99
- package/dist/chat/kit.d.ts +0 -61
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -27
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -63
- package/dist/chat/markdown.d.ts +0 -20
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -188
- package/dist/chat/message.d.ts +0 -6
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -192
- package/dist/chat/messages.d.ts +0 -22
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -155
- package/dist/chat/name.d.ts +0 -6
- package/dist/chat/name.d.ts.map +0 -1
- package/dist/chat/name.js +0 -37
- package/dist/chat/opened.d.ts +0 -11
- package/dist/chat/opened.d.ts.map +0 -1
- package/dist/chat/opened.js +0 -17
- package/dist/chat/overlay.d.ts +0 -31
- package/dist/chat/overlay.d.ts.map +0 -1
- package/dist/chat/overlay.js +0 -97
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/process.d.ts +0 -20
- package/dist/chat/process.d.ts.map +0 -1
- package/dist/chat/process.js +0 -32
- package/dist/chat/provider.d.ts +0 -63
- package/dist/chat/provider.d.ts.map +0 -1
- package/dist/chat/provider.js +0 -629
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -80
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/read.d.ts.map +0 -1
- package/dist/chat/ready.d.ts +0 -34
- package/dist/chat/ready.d.ts.map +0 -1
- package/dist/chat/ready.js +0 -91
- package/dist/chat/style.d.ts +0 -4
- package/dist/chat/style.d.ts.map +0 -1
- package/dist/chat/style.js +0 -302
- package/dist/chat.d.ts +0 -14
- package/dist/chat.d.ts.map +0 -1
- package/dist/chat.js +0 -8
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- package/dist/read-side.d.ts +0 -25
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -639
package/dist/shared.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { finished, ROW_WEIGHT } from './turn.js';
|
|
1
2
|
const BITS = 5;
|
|
2
3
|
const MASK = (1 << BITS) - 1;
|
|
3
4
|
const roots = new WeakMap();
|
|
4
|
-
const tallies = new WeakMap();
|
|
5
5
|
function hashOf(key) {
|
|
6
6
|
let hash = 0x811c9dc5;
|
|
7
7
|
for (let index = 0; index < key.length; index += 1) {
|
|
@@ -179,33 +179,84 @@ function facade(root) {
|
|
|
179
179
|
roots.set(map, root);
|
|
180
180
|
return map;
|
|
181
181
|
}
|
|
182
|
-
function
|
|
182
|
+
export function* entriesIn(map) {
|
|
183
|
+
const root = roots.get(map);
|
|
184
|
+
if (root === undefined) {
|
|
185
|
+
for (const key of Object.keys(map))
|
|
186
|
+
yield [key, map[key]];
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
for (const leaf of leavesOf(root.node))
|
|
190
|
+
yield [leaf.key, leaf.value];
|
|
191
|
+
}
|
|
192
|
+
function* rooted(map) {
|
|
183
193
|
const held = roots.get(map);
|
|
184
194
|
if (held !== undefined)
|
|
185
195
|
return held;
|
|
186
196
|
let node;
|
|
187
197
|
let size = 0;
|
|
188
|
-
for (const [key, value] of
|
|
198
|
+
for (const [key, value] of entriesIn(map)) {
|
|
189
199
|
node = put(node, { key, hash: hashOf(key), value }, 0);
|
|
190
200
|
size += 1;
|
|
201
|
+
yield ROW_WEIGHT;
|
|
191
202
|
}
|
|
192
203
|
return { node, size };
|
|
193
204
|
}
|
|
205
|
+
const RUN = 1 << 10;
|
|
206
|
+
function* merged(left, right) {
|
|
207
|
+
const into = [];
|
|
208
|
+
let at = 0;
|
|
209
|
+
let from = 0;
|
|
210
|
+
while (at < left.length || from < right.length) {
|
|
211
|
+
into.push(from === right.length || (at < left.length && left[at] < right[from])
|
|
212
|
+
? left[at++]
|
|
213
|
+
: right[from++]);
|
|
214
|
+
yield ROW_WEIGHT;
|
|
215
|
+
}
|
|
216
|
+
return into;
|
|
217
|
+
}
|
|
218
|
+
function* pathsOf(map) {
|
|
219
|
+
for (const [key] of entriesIn(map))
|
|
220
|
+
yield key;
|
|
221
|
+
}
|
|
222
|
+
export function* sortedKeys(map) {
|
|
223
|
+
return yield* sorting(pathsOf(map));
|
|
224
|
+
}
|
|
225
|
+
export function* sorting(keys) {
|
|
226
|
+
let runs = [];
|
|
227
|
+
let run = [];
|
|
228
|
+
for (const key of keys) {
|
|
229
|
+
run.push(key);
|
|
230
|
+
yield ROW_WEIGHT;
|
|
231
|
+
if (run.length === RUN) {
|
|
232
|
+
runs.push(run.sort());
|
|
233
|
+
run = [];
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (run.length > 0)
|
|
237
|
+
runs.push(run.sort());
|
|
238
|
+
while (runs.length > 1) {
|
|
239
|
+
const next = [];
|
|
240
|
+
for (let at = 0; at < runs.length; at += 2) {
|
|
241
|
+
next.push(at + 1 === runs.length ? runs[at] : yield* merged(runs[at], runs[at + 1]));
|
|
242
|
+
}
|
|
243
|
+
runs = next;
|
|
244
|
+
}
|
|
245
|
+
return runs[0] ?? [];
|
|
246
|
+
}
|
|
247
|
+
export function* sharing(map) {
|
|
248
|
+
return roots.has(map) ? map : facade(yield* rooted(map));
|
|
249
|
+
}
|
|
194
250
|
export function shared(map) {
|
|
195
|
-
return
|
|
251
|
+
return finished(sharing(map));
|
|
196
252
|
}
|
|
197
253
|
export function patched(base, set, removed = []) {
|
|
198
|
-
|
|
199
|
-
|
|
254
|
+
return finished(patching(base, set, removed));
|
|
255
|
+
}
|
|
256
|
+
export function* patching(base, set, removed = []) {
|
|
257
|
+
const root = yield* rooted(base);
|
|
200
258
|
let node = root.node;
|
|
201
259
|
let size = root.size;
|
|
202
|
-
const shift = (key, before, after) => {
|
|
203
|
-
for (const entry of weighed) {
|
|
204
|
-
entry[1] +=
|
|
205
|
-
(after === undefined ? 0 : entry[0](key, after)) -
|
|
206
|
-
(before === undefined ? 0 : entry[0](key, before.value));
|
|
207
|
-
}
|
|
208
|
-
};
|
|
209
260
|
for (const key of removed) {
|
|
210
261
|
if (node === undefined)
|
|
211
262
|
break;
|
|
@@ -214,88 +265,86 @@ export function patched(base, set, removed = []) {
|
|
|
214
265
|
continue;
|
|
215
266
|
node = taken(node, before.hash, key, 0);
|
|
216
267
|
size -= 1;
|
|
217
|
-
|
|
268
|
+
yield ROW_WEIGHT;
|
|
218
269
|
}
|
|
219
270
|
for (const [key, value] of set) {
|
|
220
271
|
const before = lookup({ node, size }, key);
|
|
221
272
|
node = put(node, { key, hash: hashOf(key), value }, 0);
|
|
222
273
|
if (before === undefined)
|
|
223
274
|
size += 1;
|
|
224
|
-
|
|
275
|
+
yield ROW_WEIGHT;
|
|
225
276
|
}
|
|
226
277
|
if (node === root.node && roots.has(base))
|
|
227
278
|
return base;
|
|
228
|
-
|
|
229
|
-
if (weighed.length > 0)
|
|
230
|
-
tallies.set(map, new Map(weighed));
|
|
231
|
-
return map;
|
|
232
|
-
}
|
|
233
|
-
export function tally(map, weigh) {
|
|
234
|
-
const held = tallies.get(map);
|
|
235
|
-
const known = held?.get(weigh);
|
|
236
|
-
if (known !== undefined)
|
|
237
|
-
return known;
|
|
238
|
-
let total = 0;
|
|
239
|
-
for (const [key, value] of Object.entries(map))
|
|
240
|
-
total += weigh(key, value);
|
|
241
|
-
if (roots.has(map)) {
|
|
242
|
-
const kept = held ?? new Map();
|
|
243
|
-
kept.set(weigh, total);
|
|
244
|
-
tallies.set(map, kept);
|
|
245
|
-
}
|
|
246
|
-
return total;
|
|
279
|
+
return facade({ node, size });
|
|
247
280
|
}
|
|
248
281
|
export function sizeOf(map) {
|
|
249
282
|
return roots.get(map)?.size ?? Object.keys(map).length;
|
|
250
283
|
}
|
|
251
|
-
function
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
284
|
+
function* compared(left, right, same, into) {
|
|
285
|
+
const pending = [[left, right]];
|
|
286
|
+
for (let pair = pending.pop(); pair !== undefined; pair = pending.pop()) {
|
|
287
|
+
const [one, other] = pair;
|
|
288
|
+
if (one === other)
|
|
289
|
+
continue;
|
|
290
|
+
if (one !== undefined &&
|
|
291
|
+
other !== undefined &&
|
|
292
|
+
!isLeaf(one) &&
|
|
293
|
+
!isCollision(one) &&
|
|
294
|
+
!isLeaf(other) &&
|
|
295
|
+
!isCollision(other)) {
|
|
296
|
+
const children = [];
|
|
297
|
+
for (let remaining = one.bitmap | other.bitmap; remaining !== 0; remaining &= remaining - 1) {
|
|
298
|
+
const bit = remaining & -remaining;
|
|
299
|
+
children.push([
|
|
300
|
+
(one.bitmap & bit) === 0 ? undefined : one.children[slot(one.bitmap, bit)],
|
|
301
|
+
(other.bitmap & bit) === 0 ? undefined : other.children[slot(other.bitmap, bit)],
|
|
302
|
+
]);
|
|
303
|
+
}
|
|
304
|
+
pending.push(...children.reverse());
|
|
305
|
+
continue;
|
|
267
306
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
307
|
+
const before = new Map();
|
|
308
|
+
for (const leaf of leavesOf(one)) {
|
|
309
|
+
before.set(leaf.key, leaf.value);
|
|
310
|
+
yield ROW_WEIGHT;
|
|
311
|
+
}
|
|
312
|
+
for (const leaf of leavesOf(other)) {
|
|
313
|
+
const held = before.get(leaf.key);
|
|
314
|
+
before.delete(leaf.key);
|
|
315
|
+
if (held === undefined || !same(held, leaf.value))
|
|
316
|
+
into.add(leaf.key);
|
|
317
|
+
yield ROW_WEIGHT;
|
|
318
|
+
}
|
|
319
|
+
for (const key of before.keys())
|
|
320
|
+
into.add(key);
|
|
276
321
|
}
|
|
277
|
-
for (const key of before.keys())
|
|
278
|
-
into.add(key);
|
|
279
322
|
}
|
|
280
|
-
export function
|
|
323
|
+
export function* differences(left, right, same = Object.is) {
|
|
281
324
|
const into = new Set();
|
|
282
325
|
if (left === right)
|
|
283
326
|
return into;
|
|
284
327
|
const leftRoot = roots.get(left);
|
|
285
328
|
const rightRoot = roots.get(right);
|
|
286
329
|
if (leftRoot !== undefined && rightRoot !== undefined) {
|
|
287
|
-
compared(leftRoot.node, rightRoot.node,
|
|
330
|
+
yield* compared(leftRoot.node, rightRoot.node, same, into);
|
|
288
331
|
return into;
|
|
289
332
|
}
|
|
290
|
-
for (const key of
|
|
291
|
-
if (!Object.hasOwn(right, key) || !same(
|
|
333
|
+
for (const [key, value] of entriesIn(left)) {
|
|
334
|
+
if (!Object.hasOwn(right, key) || !same(value, right[key]))
|
|
292
335
|
into.add(key);
|
|
336
|
+
yield ROW_WEIGHT;
|
|
293
337
|
}
|
|
294
|
-
for (const key of
|
|
338
|
+
for (const [key] of entriesIn(right)) {
|
|
295
339
|
if (!Object.hasOwn(left, key))
|
|
296
340
|
into.add(key);
|
|
341
|
+
yield ROW_WEIGHT;
|
|
342
|
+
}
|
|
297
343
|
return into;
|
|
298
344
|
}
|
|
345
|
+
export function differing(left, right, same = Object.is) {
|
|
346
|
+
return finished(differences(left, right, same));
|
|
347
|
+
}
|
|
299
348
|
const drafts = new WeakMap();
|
|
300
349
|
const GONE = Symbol('gone');
|
|
301
350
|
export function drafted(base) {
|
|
@@ -355,6 +404,9 @@ export function drafted(base) {
|
|
|
355
404
|
return draft;
|
|
356
405
|
}
|
|
357
406
|
export function settled(draft) {
|
|
407
|
+
return finished(settling(draft));
|
|
408
|
+
}
|
|
409
|
+
export function* settling(draft) {
|
|
358
410
|
const held = drafts.get(draft);
|
|
359
411
|
const set = [];
|
|
360
412
|
const removed = [];
|
|
@@ -363,6 +415,7 @@ export function settled(draft) {
|
|
|
363
415
|
removed.push(key);
|
|
364
416
|
else
|
|
365
417
|
set.push([key, value]);
|
|
418
|
+
yield ROW_WEIGHT;
|
|
366
419
|
}
|
|
367
|
-
return
|
|
420
|
+
return yield* patching(held.base, set, removed);
|
|
368
421
|
}
|
package/dist/shown.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DiscoveredRoom, Member } from './adapter.js';
|
|
2
|
+
import type { ChangeSet } from './change-set.js';
|
|
3
|
+
import type { QueueEntry } from './outcome.js';
|
|
4
|
+
import type { Runtime } from './runtime.js';
|
|
5
|
+
import type { Live, Moving } from './socket.js';
|
|
6
|
+
import { type CycleProgress } from './status.js';
|
|
7
|
+
export declare const ROOMS_TOPIC = "rooms";
|
|
8
|
+
export declare const STATUS_TOPIC = "sync-status";
|
|
9
|
+
export declare const REFUSAL_TOPIC = "connection-refusal";
|
|
10
|
+
export declare const STORAGE_LOSS_TOPIC = "storage-loss";
|
|
11
|
+
export declare const SERVICE_MODE_TOPIC = "service-mode";
|
|
12
|
+
export declare const MEMBER_TOPIC = "member";
|
|
13
|
+
export declare const AUTHORITY_TOPIC = "authority-changes";
|
|
14
|
+
export declare const LOCKS_TOPIC = "locks";
|
|
15
|
+
export declare const queueTopic: (locator: string) => string;
|
|
16
|
+
export declare function recoverReads({ liveQueries, figures }: Runtime): void;
|
|
17
|
+
export declare function emitRooms(runtime: Runtime, changed?: readonly string[]): Promise<void>;
|
|
18
|
+
export declare function emitKnownRooms(runtime: Runtime): void;
|
|
19
|
+
export declare function emitRefusal(runtime: Runtime): void;
|
|
20
|
+
export declare function emitStorageLoss({ store }: Runtime): void;
|
|
21
|
+
export declare function emitMember({ store }: Runtime, member: Member | null): void;
|
|
22
|
+
export declare function show(runtime: Runtime): Promise<void>;
|
|
23
|
+
export declare function moveTo(runtime: Runtime, next: Moving): Promise<void>;
|
|
24
|
+
export declare function statusShown(runtime: Runtime): Promise<void>;
|
|
25
|
+
export declare function transferring({ socket }: Runtime): Moving;
|
|
26
|
+
export declare function pendingShown(runtime: Runtime): Promise<void>;
|
|
27
|
+
export declare function entriesOf(runtime: Runtime, locator: string): Promise<readonly QueueEntry[]>;
|
|
28
|
+
export declare function publishChangeSet(runtime: Runtime, set: ChangeSet): Promise<void>;
|
|
29
|
+
export declare function roomUnreadable(runtime: Runtime, room: DiscoveredRoom): void;
|
|
30
|
+
export declare function rest(runtime: Runtime, progress: CycleProgress | null, live?: Live): Promise<void>;
|
|
31
|
+
//# sourceMappingURL=shown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shown.d.ts","sourceRoot":"","sources":["../src/shown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAA6B,KAAK,aAAa,EAAmB,MAAM,aAAa,CAAC;AAiB7F,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAE1C,eAAO,MAAM,aAAa,uBAAuB,CAAC;AAElD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAEnD,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,eAAO,MAAM,UAAU,YAAa,MAAM,WAA4B,CAAC;AA0CvE,wBAAgB,YAAY,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,OAAO,QAG7D;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QAI9C;AA8ED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,QAK3C;AAED,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,QAGjD;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,QAEnE;AAsBD,wBAAgB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAepD;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,GAAG,MAAM,CAExD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5D;AAYD,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAKjG;AAcD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBhF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,QAIpE;AAED,wBAAsB,IAAI,CACxB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,aAAa,GAAG,IAAI,EAC9B,IAAI,GAAE,IAAqC,iBAgC5C"}
|
package/dist/shown.js
ADDED
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { listingNow, list, patchedListing, shownRooms } from './listing.js';
|
|
2
|
+
import { emitPresentation, publishRoomDrafts } from './room-drafts.js';
|
|
3
|
+
import { same } from './status.js';
|
|
4
|
+
export const ROOMS_TOPIC = 'rooms';
|
|
5
|
+
export const STATUS_TOPIC = 'sync-status';
|
|
6
|
+
export const REFUSAL_TOPIC = 'connection-refusal';
|
|
7
|
+
export const STORAGE_LOSS_TOPIC = 'storage-loss';
|
|
8
|
+
export const SERVICE_MODE_TOPIC = 'service-mode';
|
|
9
|
+
export const MEMBER_TOPIC = 'member';
|
|
10
|
+
export const AUTHORITY_TOPIC = 'authority-changes';
|
|
11
|
+
export const LOCKS_TOPIC = 'locks';
|
|
12
|
+
export const queueTopic = (locator) => `queue\u0000${locator}`;
|
|
13
|
+
async function attended({ store, localSaves }) {
|
|
14
|
+
const isFenced = store.fences.has;
|
|
15
|
+
const held = await (await store.open()).status();
|
|
16
|
+
const attentionRequired = held.returned.flatMap((record) => record.returned === null || isFenced(record.locator)
|
|
17
|
+
? []
|
|
18
|
+
: [{ room: record.locator, path: record.path, returned: structuredClone(record.returned) }]);
|
|
19
|
+
attentionRequired.sort((left, right) => {
|
|
20
|
+
if (left.room !== right.room)
|
|
21
|
+
return left.room < right.room ? -1 : 1;
|
|
22
|
+
if (left.path !== right.path)
|
|
23
|
+
return left.path < right.path ? -1 : 1;
|
|
24
|
+
return 0;
|
|
25
|
+
});
|
|
26
|
+
const changed = new Map();
|
|
27
|
+
if (!localSaves) {
|
|
28
|
+
for (const change of held.unsent) {
|
|
29
|
+
if (!isFenced(change.room))
|
|
30
|
+
changed.set(`${change.room}\u0000${change.path}`, change);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const unsent = [...changed]
|
|
34
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
35
|
+
.map(([, change]) => change);
|
|
36
|
+
return {
|
|
37
|
+
queued: !localSaves && held.queued.some((locator) => !isFenced(locator)),
|
|
38
|
+
lastCompleted: held.lastCompleted,
|
|
39
|
+
attentionRequired,
|
|
40
|
+
unsent,
|
|
41
|
+
reset: held.resets.reduce((earliest, { locator, reset }) => isFenced(locator) || (earliest !== null && earliest <= reset) ? earliest : reset, null),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async function queuedWork({ store, localSaves }) {
|
|
45
|
+
const held = await (await store.open()).queued();
|
|
46
|
+
return !localSaves && held.some((locator) => !store.fences.has(locator));
|
|
47
|
+
}
|
|
48
|
+
export function recoverReads({ liveQueries, figures }) {
|
|
49
|
+
liveQueries.recover();
|
|
50
|
+
figures.recover();
|
|
51
|
+
}
|
|
52
|
+
export function emitRooms(runtime, changed) {
|
|
53
|
+
recoverReads(runtime);
|
|
54
|
+
runtime.store.readiness.queue();
|
|
55
|
+
return changed === undefined
|
|
56
|
+
? publishRooms(runtime, 'all')
|
|
57
|
+
: publishRooms(runtime, 'changed', changed);
|
|
58
|
+
}
|
|
59
|
+
export function emitKnownRooms(runtime) {
|
|
60
|
+
runtime.conversations.learned();
|
|
61
|
+
if (runtime.store.watching(ROOMS_TOPIC, 'waiting').length === 0)
|
|
62
|
+
return;
|
|
63
|
+
void publishRooms(runtime, 'known');
|
|
64
|
+
}
|
|
65
|
+
function roomsOwedWith(held, mode, touched) {
|
|
66
|
+
if (held === undefined) {
|
|
67
|
+
return {
|
|
68
|
+
all: mode === 'all',
|
|
69
|
+
changed: new Set(mode === 'changed' ? touched : []),
|
|
70
|
+
counted: new Set(mode === 'changed' ? [] : touched),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
held.all ||= mode === 'all';
|
|
74
|
+
for (const locator of touched) {
|
|
75
|
+
(mode === 'changed' ? held.changed : held.counted).add(locator);
|
|
76
|
+
}
|
|
77
|
+
return held;
|
|
78
|
+
}
|
|
79
|
+
async function deliverRooms(runtime, owed) {
|
|
80
|
+
const { store, socket } = runtime;
|
|
81
|
+
const waiting = () => store.watching(ROOMS_TOPIC, 'waiting');
|
|
82
|
+
if (socket.closed() || store.watching(ROOMS_TOPIC).length === 0)
|
|
83
|
+
return;
|
|
84
|
+
const patched = owed.all || owed.changed.size === 0 || waiting().length > 0
|
|
85
|
+
? null
|
|
86
|
+
: await patchedListing(runtime, new Set([...owed.changed, ...owed.counted]));
|
|
87
|
+
if (patched === null && owed.changed.size > 0)
|
|
88
|
+
owed.all = true;
|
|
89
|
+
if (patched === null && !owed.all && owed.counted.size > 0) {
|
|
90
|
+
const held = await store.covering().catch(() => null);
|
|
91
|
+
if (held === null)
|
|
92
|
+
return;
|
|
93
|
+
const { roomsShown } = store.device.now();
|
|
94
|
+
owed.all = [...owed.counted].some((locator) => held.rooms.has(locator) &&
|
|
95
|
+
roomsShown?.get(locator)?.documents !== held.rooms.get(locator).documents);
|
|
96
|
+
if (owed.all) {
|
|
97
|
+
recoverReads(runtime);
|
|
98
|
+
store.readiness.queue();
|
|
99
|
+
}
|
|
100
|
+
else if (waiting().length === 0)
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const listing = patched ?? (await listingNow(runtime).catch(() => null));
|
|
104
|
+
if (listing === null || socket.closed())
|
|
105
|
+
return;
|
|
106
|
+
const value = shownRooms(runtime, listing);
|
|
107
|
+
const { roomsListed, refusal, moving } = socket.session.now();
|
|
108
|
+
const joining = waiting().length > 0 &&
|
|
109
|
+
(roomsListed || listing.size > 0 || refusal !== null || moving.providerUnreachable);
|
|
110
|
+
if (!owed.all && patched === null && !joining)
|
|
111
|
+
return;
|
|
112
|
+
const { roomsShown } = store.device.now();
|
|
113
|
+
const moved = owed.all ||
|
|
114
|
+
patched !== null ||
|
|
115
|
+
(roomsShown !== null &&
|
|
116
|
+
JSON.stringify(shownRooms(runtime, roomsShown)) !== JSON.stringify(value));
|
|
117
|
+
if (moved)
|
|
118
|
+
for (const watcher of store.watching(ROOMS_TOPIC, 'ready'))
|
|
119
|
+
watcher.answer(value);
|
|
120
|
+
if (joining)
|
|
121
|
+
for (const watcher of waiting())
|
|
122
|
+
watcher.answer(value);
|
|
123
|
+
store.device.set({
|
|
124
|
+
roomsShown: store.watching(ROOMS_TOPIC, 'ready').length === 0 ? null : listing,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function publishRooms(runtime, mode, touched = []) {
|
|
128
|
+
if (runtime.socket.closed())
|
|
129
|
+
return Promise.resolve();
|
|
130
|
+
return runtime.store.owing(ROOMS_TOPIC, (held) => roomsOwedWith(held, mode, touched), (owed) => deliverRooms(runtime, owed));
|
|
131
|
+
}
|
|
132
|
+
export function emitRefusal(runtime) {
|
|
133
|
+
const { store, socket } = runtime;
|
|
134
|
+
store.readiness.queue();
|
|
135
|
+
store.tell(REFUSAL_TOPIC, socket.session.now().refusal);
|
|
136
|
+
emitKnownRooms(runtime);
|
|
137
|
+
}
|
|
138
|
+
export function emitStorageLoss({ store }) {
|
|
139
|
+
store.readiness.queue();
|
|
140
|
+
store.tell(STORAGE_LOSS_TOPIC, store.device.now().storageLoss);
|
|
141
|
+
}
|
|
142
|
+
export function emitMember({ store }, member) {
|
|
143
|
+
store.tell(MEMBER_TOPIC, member);
|
|
144
|
+
}
|
|
145
|
+
async function deliverStatus(runtime, owed) {
|
|
146
|
+
const { store, socket } = runtime;
|
|
147
|
+
const held = await attended(runtime);
|
|
148
|
+
if (socket.closed())
|
|
149
|
+
return;
|
|
150
|
+
for (const { moving, current } of owed) {
|
|
151
|
+
const state = moving.resting && held.queued ? 'pending' : moving.state;
|
|
152
|
+
const next = {
|
|
153
|
+
state: state === 'synced' && !current ? 'syncing' : state,
|
|
154
|
+
lastCompleted: held.lastCompleted,
|
|
155
|
+
providerUnreachable: moving.providerUnreachable,
|
|
156
|
+
attentionRequired: held.attentionRequired,
|
|
157
|
+
unsent: held.unsent,
|
|
158
|
+
reset: held.reset,
|
|
159
|
+
};
|
|
160
|
+
if (same(store.device.now().status, next))
|
|
161
|
+
continue;
|
|
162
|
+
store.device.set({ status: next });
|
|
163
|
+
store.tell(STATUS_TOPIC, next);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
export function show(runtime) {
|
|
167
|
+
const { store, socket, conversations } = runtime;
|
|
168
|
+
if (socket.closed())
|
|
169
|
+
return Promise.resolve();
|
|
170
|
+
store.readiness.queue();
|
|
171
|
+
emitKnownRooms(runtime);
|
|
172
|
+
const moved = { moving: socket.session.now().moving, current: conversations.current() };
|
|
173
|
+
return store.owing(STATUS_TOPIC, (held) => {
|
|
174
|
+
if (held === undefined)
|
|
175
|
+
return [moved];
|
|
176
|
+
held.push(moved);
|
|
177
|
+
return held;
|
|
178
|
+
}, (owed) => deliverStatus(runtime, owed));
|
|
179
|
+
}
|
|
180
|
+
export function moveTo(runtime, next) {
|
|
181
|
+
if (runtime.socket.closed())
|
|
182
|
+
return Promise.resolve();
|
|
183
|
+
runtime.socket.session.set({ moving: next });
|
|
184
|
+
return show(runtime);
|
|
185
|
+
}
|
|
186
|
+
export function statusShown(runtime) {
|
|
187
|
+
return moveTo(runtime, runtime.socket.session.now().moving);
|
|
188
|
+
}
|
|
189
|
+
export function transferring({ socket }) {
|
|
190
|
+
return { ...socket.session.now().moving, state: 'syncing', resting: false };
|
|
191
|
+
}
|
|
192
|
+
export function pendingShown(runtime) {
|
|
193
|
+
const { socket, localSaves } = runtime;
|
|
194
|
+
if (!localSaves)
|
|
195
|
+
socket.session.set({ recorded: false });
|
|
196
|
+
const { moving } = socket.session.now();
|
|
197
|
+
return moveTo(runtime, localSaves ? moving : { ...moving, state: 'pending', resting: false });
|
|
198
|
+
}
|
|
199
|
+
function entryOf({ localSaves }, states, batch) {
|
|
200
|
+
if (localSaves)
|
|
201
|
+
return Object.freeze({ batch, state: 'local' });
|
|
202
|
+
const state = states.get(batch.id);
|
|
203
|
+
return Object.freeze({ batch, ...(state?.submission ?? { state: 'waiting' }) });
|
|
204
|
+
}
|
|
205
|
+
export async function entriesOf(runtime, locator) {
|
|
206
|
+
const { store } = runtime;
|
|
207
|
+
if (store.fences.has(locator))
|
|
208
|
+
return [];
|
|
209
|
+
const { queue, states } = await store.work(locator);
|
|
210
|
+
return queue.map((batch) => entryOf(runtime, states, batch));
|
|
211
|
+
}
|
|
212
|
+
function emitQueue(runtime, locator) {
|
|
213
|
+
const { store, socket } = runtime;
|
|
214
|
+
const listening = () => store.watching(queueTopic(locator));
|
|
215
|
+
if (socket.closed() || listening().length === 0)
|
|
216
|
+
return Promise.resolve();
|
|
217
|
+
return store.publication(async () => {
|
|
218
|
+
if (socket.closed() || listening().length === 0)
|
|
219
|
+
return;
|
|
220
|
+
const entries = await entriesOf(runtime, locator);
|
|
221
|
+
if (socket.closed())
|
|
222
|
+
return;
|
|
223
|
+
for (const watcher of listening())
|
|
224
|
+
watcher.answer(entries);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
export function publishChangeSet(runtime, set) {
|
|
228
|
+
const { store, liveQueries, figures, conversations } = runtime;
|
|
229
|
+
liveQueries.touched(set);
|
|
230
|
+
figures.touched(set);
|
|
231
|
+
for (const { locator, path } of set.documents) {
|
|
232
|
+
if (path !== null)
|
|
233
|
+
store.attached.drop(locator, path);
|
|
234
|
+
}
|
|
235
|
+
const shownNow = [];
|
|
236
|
+
if (set.queues.length > 0 || set.drafts.length > 0)
|
|
237
|
+
shownNow.push(show(runtime));
|
|
238
|
+
if (set.rooms.length > 0)
|
|
239
|
+
shownNow.push(emitRooms(runtime, set.rooms));
|
|
240
|
+
else if (set.documents.length > 0) {
|
|
241
|
+
shownNow.push(publishRooms(runtime, 'counted', [...new Set(set.documents.map(({ locator }) => locator))]));
|
|
242
|
+
}
|
|
243
|
+
for (const locator of set.queues)
|
|
244
|
+
shownNow.push(emitQueue(runtime, locator));
|
|
245
|
+
if (set.drafts.length > 0)
|
|
246
|
+
shownNow.push(publishRoomDrafts(runtime, false));
|
|
247
|
+
else if (set.documents.length > 0) {
|
|
248
|
+
shownNow.push(publishRoomDrafts(runtime, false, set.documents));
|
|
249
|
+
}
|
|
250
|
+
for (const app of set.presentations)
|
|
251
|
+
shownNow.push(emitPresentation(runtime, app));
|
|
252
|
+
conversations.changed(set);
|
|
253
|
+
return Promise.all(shownNow).then(() => undefined);
|
|
254
|
+
}
|
|
255
|
+
export function roomUnreadable(runtime, room) {
|
|
256
|
+
runtime.socket.rooms.stand(room.locator, { unreadable: true });
|
|
257
|
+
list(runtime, room, false);
|
|
258
|
+
emitRooms(runtime);
|
|
259
|
+
}
|
|
260
|
+
export async function rest(runtime, progress, live = () => !runtime.socket.closed()) {
|
|
261
|
+
const { store, socket } = runtime;
|
|
262
|
+
const { session, lanes, rooms } = socket;
|
|
263
|
+
if (!live())
|
|
264
|
+
return;
|
|
265
|
+
const settled = () => session.now().complete &&
|
|
266
|
+
lanes.roomWork() === 0 &&
|
|
267
|
+
!socket.naming() &&
|
|
268
|
+
rooms.standingWhere(({ stale }) => stale).length === 0;
|
|
269
|
+
let synced = settled();
|
|
270
|
+
if (synced && !session.now().recorded) {
|
|
271
|
+
const queued = await queuedWork(runtime).catch(() => true);
|
|
272
|
+
if (!live())
|
|
273
|
+
return;
|
|
274
|
+
synced = !queued && settled();
|
|
275
|
+
}
|
|
276
|
+
if (synced && !session.now().recorded) {
|
|
277
|
+
const completedAt = new Date().toISOString();
|
|
278
|
+
try {
|
|
279
|
+
await (await store.open()).fact('lastCompleted', completedAt);
|
|
280
|
+
if (!live())
|
|
281
|
+
return;
|
|
282
|
+
session.set({ recorded: true });
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
synced = false;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
const { complete, moving } = session.now();
|
|
289
|
+
moveTo(runtime, {
|
|
290
|
+
state: synced && complete && lanes.roomWork() === 0 && !socket.naming() ? 'synced' : 'syncing',
|
|
291
|
+
providerUnreachable: progress === null ? moving.providerUnreachable : !progress.reachable,
|
|
292
|
+
resting: true,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../../src/socket/admission.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;CAClC,CAAC;AAEF,wBAAgB,eAAe,IAAI,SAAS,CAmC3C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const STREAMS_HELD = 4;
|
|
2
|
+
const QUEUED_TEXT = 1 << 23;
|
|
3
|
+
export function createAdmission() {
|
|
4
|
+
let streamsFree = STREAMS_HELD;
|
|
5
|
+
let queuedText = 0;
|
|
6
|
+
const installWaiters = [];
|
|
7
|
+
function once(release) {
|
|
8
|
+
let released = false;
|
|
9
|
+
return () => {
|
|
10
|
+
if (released)
|
|
11
|
+
return;
|
|
12
|
+
released = true;
|
|
13
|
+
release();
|
|
14
|
+
for (const admit of installWaiters.splice(0))
|
|
15
|
+
admit();
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
async heldStream() {
|
|
20
|
+
while (streamsFree === 0)
|
|
21
|
+
await new Promise((admit) => installWaiters.push(admit));
|
|
22
|
+
streamsFree -= 1;
|
|
23
|
+
return once(() => {
|
|
24
|
+
streamsFree += 1;
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
async unqueued() {
|
|
28
|
+
while (queuedText >= QUEUED_TEXT) {
|
|
29
|
+
await new Promise((admit) => installWaiters.push(admit));
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
queued(text) {
|
|
33
|
+
queuedText += text;
|
|
34
|
+
return once(() => {
|
|
35
|
+
queuedText -= text;
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answers.d.ts","sourceRoot":"","sources":["../../src/socket/answers.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,OAAO,GAAG;IACpB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;CACtD,CAAC;AAEF,wBAAgB,aAAa,IAAI,OAAO,CAkBvC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function createAnswers() {
|
|
2
|
+
const answering = new Map();
|
|
3
|
+
return {
|
|
4
|
+
awaitingAnswer(locator) {
|
|
5
|
+
answering.get(locator)?.release();
|
|
6
|
+
let release = () => { };
|
|
7
|
+
const answered = new Promise((resolve) => {
|
|
8
|
+
release = resolve;
|
|
9
|
+
});
|
|
10
|
+
const awaited = { answered, release };
|
|
11
|
+
answering.set(locator, awaited);
|
|
12
|
+
return () => {
|
|
13
|
+
if (answering.get(locator) === awaited)
|
|
14
|
+
answering.delete(locator);
|
|
15
|
+
release();
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
answered: (locator) => answering.get(locator)?.answered,
|
|
19
|
+
};
|
|
20
|
+
}
|