@agentshouse/mdruntime 0.1.0-c2aaa9c0e3ca4 → 0.1.0-c2af3ddcc243b
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 +23 -19
- package/dist/acceptance.d.ts +3 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +299 -0
- package/dist/act-lanes.d.ts +30 -0
- package/dist/act-lanes.d.ts.map +1 -0
- package/dist/act-lanes.js +225 -0
- package/dist/actions.d.ts +26 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +302 -0
- package/dist/adapter.d.ts +176 -97
- 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 +311 -89
- 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 +13 -14
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +17 -63
- package/dist/change.d.ts +32 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +14 -3
- 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 +46 -28
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +133 -27
- package/dist/collection.d.ts +31 -9
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +49 -80
- package/dist/compile.d.ts +18 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +724 -0
- package/dist/connection.d.ts +8 -116
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +111 -2412
- 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-live.d.ts +140 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +250 -0
- 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 +80 -45
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +1090 -588
- package/dist/declaration.d.ts +10 -0
- package/dist/declaration.d.ts.map +1 -0
- package/dist/declaration.js +24 -0
- 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 +150 -0
- package/dist/durability.d.ts +23 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +9 -0
- package/dist/entry.d.ts +20 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +161 -0
- package/dist/expectation.d.ts +26 -13
- package/dist/expectation.d.ts.map +1 -1
- package/dist/expectation.js +72 -19
- package/dist/failure.d.ts +3 -0
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +6 -0
- package/dist/figures.d.ts +49 -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 +28 -4
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +171 -27
- package/dist/index.d.ts +40 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -2
- package/dist/install.d.ts +54 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +530 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +277 -0
- package/dist/listing.d.ts +48 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +139 -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 +7 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +32 -0
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +49 -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 +22 -6
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +282 -101
- package/dist/messages.d.ts +56 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +158 -0
- package/dist/model.d.ts +11 -12
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +7 -15
- package/dist/models.d.ts +10 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +153 -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 +22 -4
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +127 -26
- 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 +53 -0
- package/dist/outcome.d.ts +56 -8
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +58 -0
- package/dist/overlay.d.ts +8 -4
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +136 -192
- package/dist/page-metadata.d.ts +8 -0
- package/dist/page-metadata.d.ts.map +1 -0
- package/dist/page-metadata.js +19 -0
- package/dist/parts.d.ts +4 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +13 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +26 -0
- package/dist/preparation.d.ts +20 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +227 -0
- package/dist/presence.d.ts +52 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +220 -0
- package/dist/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +282 -0
- package/dist/query.d.ts +49 -183
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -464
- package/dist/{chat/questions.d.ts → questions.d.ts} +5 -7
- package/dist/questions.d.ts.map +1 -0
- package/dist/{chat/questions.js → questions.js} +11 -7
- package/dist/queue.d.ts +40 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +450 -0
- package/dist/reach.d.ts +21 -7
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +343 -98
- package/dist/react.d.ts +21 -6
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +40 -18
- 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 +49 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +27 -0
- package/dist/reads.d.ts +39 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +178 -0
- package/dist/recovery.d.ts +28 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +254 -0
- package/dist/refresh.d.ts +17 -14
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +145 -53
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +55 -0
- package/dist/replica.d.ts +50 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +339 -162
- package/dist/retried.d.ts +30 -0
- package/dist/retried.d.ts.map +1 -0
- package/dist/retried.js +72 -0
- package/dist/room-draft.d.ts +39 -10
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +194 -118
- package/dist/room-drafts.d.ts +24 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +217 -0
- package/dist/rows.d.ts +30 -37
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +60 -128
- package/dist/runtime.d.ts +34 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +42 -43
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +800 -259
- package/dist/saves.d.ts +32 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +410 -0
- package/dist/search.d.ts +15 -55
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +10 -121
- package/dist/seed.d.ts +25 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +145 -0
- package/dist/shared.d.ts +10 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +339 -0
- package/dist/shown.d.ts +33 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +295 -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 +28 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +103 -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/session.d.ts +38 -0
- package/dist/socket/session.d.ts.map +1 -0
- package/dist/socket/session.js +23 -0
- package/dist/socket.d.ts +67 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +164 -0
- package/dist/source.d.ts +54 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +82 -0
- package/dist/status.d.ts +5 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -7
- 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 +214 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +438 -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 +41 -0
- package/dist/store/watchers.d.ts +17 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +56 -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 +111 -117
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +161 -488
- package/dist/stored.d.ts +157 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +649 -0
- package/dist/surface.d.ts +88 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +220 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +535 -0
- package/dist/tables.d.ts +415 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +761 -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 +9 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +75 -0
- 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 +228 -36
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +75 -33
- package/package.json +23 -19
- package/AGENTS.md +0 -299
- package/dist/attempt.d.ts +0 -16
- package/dist/attempt.d.ts.map +0 -1
- package/dist/attempt.js +0 -57
- package/dist/chat/acts.d.ts +0 -34
- 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 -60
- 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 -20
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -59
- package/dist/chat/markdown.d.ts +0 -19
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -187
- 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 -21
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -151
- 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 +0 -57
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/parts.js +0 -119
- 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 -645
- 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 -33
- 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/log.d.ts +0 -5
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js +0 -14
- package/dist/read-side.d.ts +0 -18
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -440
package/dist/recovery.js
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
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, owner) {
|
|
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 done = () => {
|
|
23
|
+
clearTimeout(again);
|
|
24
|
+
signal.removeEventListener('abort', done);
|
|
25
|
+
unheld();
|
|
26
|
+
resume();
|
|
27
|
+
};
|
|
28
|
+
// A read that failed is asked again on the doubling backoff, so its asker is answered once the failure clears.
|
|
29
|
+
const again = setTimeout(done, retryDelay(tries));
|
|
30
|
+
signal.addEventListener('abort', done, { once: true });
|
|
31
|
+
const unheld = owner?.waits(done) ?? (() => { });
|
|
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
|
+
const waiting = new Set();
|
|
42
|
+
let free = inFlight;
|
|
43
|
+
let retired = false;
|
|
44
|
+
function finish(key, intent, done) {
|
|
45
|
+
if (intents.get(key) === intent)
|
|
46
|
+
intents.delete(key);
|
|
47
|
+
if (intent.timer !== null)
|
|
48
|
+
clearTimeout(intent.timer);
|
|
49
|
+
intent.timer = null;
|
|
50
|
+
intent.end(done);
|
|
51
|
+
}
|
|
52
|
+
function wait(key, intent, at, guided) {
|
|
53
|
+
if (intent.timer !== null)
|
|
54
|
+
clearTimeout(intent.timer);
|
|
55
|
+
intent.due = at;
|
|
56
|
+
intent.guided = guided;
|
|
57
|
+
intent.timer = setTimeout(() => {
|
|
58
|
+
intent.timer = null;
|
|
59
|
+
launch(key, intent);
|
|
60
|
+
}, Math.max(0, at - Date.now()));
|
|
61
|
+
}
|
|
62
|
+
function launch(key, intent) {
|
|
63
|
+
intent.due = null;
|
|
64
|
+
intent.guided = false;
|
|
65
|
+
const controller = new AbortController();
|
|
66
|
+
intent.controller = controller;
|
|
67
|
+
const run = start(key, intent, controller);
|
|
68
|
+
running.add(run);
|
|
69
|
+
void run.finally(() => running.delete(run));
|
|
70
|
+
}
|
|
71
|
+
async function start(key, intent, controller) {
|
|
72
|
+
while (free === 0)
|
|
73
|
+
await new Promise((admit) => queued.push(admit));
|
|
74
|
+
if (controller.signal.aborted) {
|
|
75
|
+
queued.shift()?.();
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
free -= 1;
|
|
79
|
+
const abandoned = new Promise((resolve) => {
|
|
80
|
+
controller.signal.addEventListener('abort', () => resolve(null), { once: true });
|
|
81
|
+
});
|
|
82
|
+
let result;
|
|
83
|
+
try {
|
|
84
|
+
result = await Promise.race([intent.run(controller.signal), abandoned]);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
result = 'again';
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
free += 1;
|
|
91
|
+
queued.shift()?.();
|
|
92
|
+
}
|
|
93
|
+
if (result === null || controller.signal.aborted || intents.get(key) !== intent)
|
|
94
|
+
return;
|
|
95
|
+
intent.controller = null;
|
|
96
|
+
const again = intent.again;
|
|
97
|
+
intent.again = null;
|
|
98
|
+
if (result === 'done') {
|
|
99
|
+
intent.tries = 0;
|
|
100
|
+
if (again === null)
|
|
101
|
+
finish(key, intent, true);
|
|
102
|
+
else if (again === 'now')
|
|
103
|
+
launch(key, intent);
|
|
104
|
+
else
|
|
105
|
+
wait(key, intent, again, true);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
intent.tries += 1;
|
|
109
|
+
if (intent.tries >= backoff.attempts) {
|
|
110
|
+
if (again === null) {
|
|
111
|
+
finish(key, intent, false);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
intent.tries = 0;
|
|
115
|
+
if (again === 'now')
|
|
116
|
+
launch(key, intent);
|
|
117
|
+
else
|
|
118
|
+
wait(key, intent, again, true);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (result === 'again') {
|
|
122
|
+
// The next attempt waits the doubling backoff, up to its maximum.
|
|
123
|
+
const delay = retryDelay(intent.tries - 1, backoff.firstMs, backoff.maxMs);
|
|
124
|
+
wait(key, intent, Date.now() + delay, false);
|
|
125
|
+
}
|
|
126
|
+
else
|
|
127
|
+
wait(key, intent, result.at, true);
|
|
128
|
+
}
|
|
129
|
+
const recovery = {
|
|
130
|
+
attempt(key, run, options = {}) {
|
|
131
|
+
if (retired)
|
|
132
|
+
return Promise.resolve(false);
|
|
133
|
+
const held = intents.get(key);
|
|
134
|
+
if (held !== undefined) {
|
|
135
|
+
held.run = run;
|
|
136
|
+
if (held.controller !== null) {
|
|
137
|
+
const at = options.at;
|
|
138
|
+
held.again =
|
|
139
|
+
at === undefined || held.again === 'now'
|
|
140
|
+
? 'now'
|
|
141
|
+
: Math.min(at, held.again ?? Number.POSITIVE_INFINITY);
|
|
142
|
+
}
|
|
143
|
+
else if (held.due !== null && held.due <= Date.now()) {
|
|
144
|
+
if (held.timer !== null)
|
|
145
|
+
clearTimeout(held.timer);
|
|
146
|
+
held.timer = null;
|
|
147
|
+
launch(key, held);
|
|
148
|
+
}
|
|
149
|
+
else if (options.at !== undefined && (held.due === null || options.at < held.due)) {
|
|
150
|
+
wait(key, held, options.at, true);
|
|
151
|
+
}
|
|
152
|
+
return held.ended;
|
|
153
|
+
}
|
|
154
|
+
let end = () => { };
|
|
155
|
+
const ended = new Promise((resolve) => {
|
|
156
|
+
end = resolve;
|
|
157
|
+
});
|
|
158
|
+
const intent = {
|
|
159
|
+
run,
|
|
160
|
+
tries: 0,
|
|
161
|
+
timer: null,
|
|
162
|
+
due: null,
|
|
163
|
+
guided: false,
|
|
164
|
+
controller: null,
|
|
165
|
+
again: null,
|
|
166
|
+
ended,
|
|
167
|
+
end,
|
|
168
|
+
};
|
|
169
|
+
intents.set(key, intent);
|
|
170
|
+
if (options.at !== undefined)
|
|
171
|
+
wait(key, intent, options.at, true);
|
|
172
|
+
else if (options.again === true) {
|
|
173
|
+
intent.tries = 1;
|
|
174
|
+
wait(key, intent, Date.now() + retryDelay(0, backoff.firstMs, backoff.maxMs), false);
|
|
175
|
+
}
|
|
176
|
+
else
|
|
177
|
+
launch(key, intent);
|
|
178
|
+
return ended;
|
|
179
|
+
},
|
|
180
|
+
pending(key) {
|
|
181
|
+
const intent = intents.get(key);
|
|
182
|
+
return intent !== undefined && intent.controller === null;
|
|
183
|
+
},
|
|
184
|
+
resume() {
|
|
185
|
+
if (retired)
|
|
186
|
+
return;
|
|
187
|
+
for (const [key, intent] of [...intents]) {
|
|
188
|
+
if (intent.guided && intent.due !== null && intent.due > Date.now())
|
|
189
|
+
continue;
|
|
190
|
+
if (intent.timer !== null)
|
|
191
|
+
clearTimeout(intent.timer);
|
|
192
|
+
intent.timer = null;
|
|
193
|
+
intent.controller?.abort();
|
|
194
|
+
intent.again = null;
|
|
195
|
+
intent.tries = 0;
|
|
196
|
+
launch(key, intent);
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
again() {
|
|
200
|
+
if (retired)
|
|
201
|
+
return;
|
|
202
|
+
for (const [key, intent] of [...intents]) {
|
|
203
|
+
if (intent.timer === null || intent.guided)
|
|
204
|
+
continue;
|
|
205
|
+
clearTimeout(intent.timer);
|
|
206
|
+
intent.timer = null;
|
|
207
|
+
launch(key, intent);
|
|
208
|
+
}
|
|
209
|
+
for (const wake of [...waiting])
|
|
210
|
+
wake();
|
|
211
|
+
for (const child of [...children])
|
|
212
|
+
child.again();
|
|
213
|
+
},
|
|
214
|
+
waits(wake) {
|
|
215
|
+
waiting.add(wake);
|
|
216
|
+
return () => {
|
|
217
|
+
waiting.delete(wake);
|
|
218
|
+
};
|
|
219
|
+
},
|
|
220
|
+
cancel(key) {
|
|
221
|
+
const intent = intents.get(key);
|
|
222
|
+
if (intent === undefined)
|
|
223
|
+
return;
|
|
224
|
+
intent.controller?.abort();
|
|
225
|
+
finish(key, intent, false);
|
|
226
|
+
},
|
|
227
|
+
scope(bound = Infinity) {
|
|
228
|
+
const child = owner(backoff, bound, () => children.delete(child));
|
|
229
|
+
if (retired)
|
|
230
|
+
void child.retire();
|
|
231
|
+
else
|
|
232
|
+
children.add(child);
|
|
233
|
+
return child;
|
|
234
|
+
},
|
|
235
|
+
async retire() {
|
|
236
|
+
retired = true;
|
|
237
|
+
release();
|
|
238
|
+
for (const [key, intent] of [...intents]) {
|
|
239
|
+
intent.controller?.abort();
|
|
240
|
+
finish(key, intent, false);
|
|
241
|
+
}
|
|
242
|
+
await Promise.all([...children].map((child) => child.retire()));
|
|
243
|
+
await Promise.all(running);
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
return recovery;
|
|
247
|
+
}
|
|
248
|
+
export function createRecovery(options = {}) {
|
|
249
|
+
return owner({
|
|
250
|
+
firstMs: options.firstMs ?? FIRST_MS,
|
|
251
|
+
maxMs: options.maxMs ?? MAX_MS,
|
|
252
|
+
attempts: options.attempts ?? ATTEMPTS,
|
|
253
|
+
}, options.inFlight ?? Infinity);
|
|
254
|
+
}
|
package/dist/refresh.d.ts
CHANGED
|
@@ -1,24 +1,27 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AdapterFailure, Authorization, RefreshPage, RefreshRequest, RefreshResult, RetryableRefusal } from './adapter.js';
|
|
2
2
|
import type { Remodel } from './bootstrap.js';
|
|
3
|
-
import {
|
|
4
|
-
import type {
|
|
5
|
-
import {
|
|
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';
|
|
6
7
|
export type Advancement = {
|
|
7
8
|
kind: 'still-current';
|
|
8
9
|
} | {
|
|
9
10
|
kind: 'advanced';
|
|
10
11
|
record: ReplicaRecord;
|
|
12
|
+
changed: ReadonlySet<string>;
|
|
11
13
|
} | {
|
|
12
14
|
kind: 'beyond-horizon';
|
|
13
15
|
} | RetryableRefusal | Unconfirmed | AdapterFailure;
|
|
14
|
-
export type
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
export declare function
|
|
23
|
-
export declare function
|
|
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' | 'facts' | 'revisions' | 'fileIds' | 'created' | '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 {};
|
|
24
27
|
//# sourceMappingURL=refresh.d.ts.map
|
package/dist/refresh.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,
|
|
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,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CACxF,CAAC;AAwFF,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;AAgDD,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,57 +1,160 @@
|
|
|
1
|
-
import { acceptedBinaries } from './overlay.js';
|
|
2
|
-
import { readStaged } from './replica.js';
|
|
3
1
|
import { unconfirmed } from './transfer.js';
|
|
4
|
-
|
|
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
|
+
facts: page.facts[path] ?? null,
|
|
49
|
+
binary: null,
|
|
50
|
+
revision: page.revisions[path] ?? prior.get(path)?.revision ?? null,
|
|
51
|
+
fileId: page.fileIds?.[path] ?? null,
|
|
52
|
+
created: page.created?.[path] ?? null,
|
|
53
|
+
change: page.changes[path] ?? null,
|
|
54
|
+
written: roomVersion,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
for (const path of listed.binaries) {
|
|
58
|
+
yield ROW_WEIGHT;
|
|
59
|
+
entries.push({
|
|
60
|
+
path,
|
|
61
|
+
content: null,
|
|
62
|
+
facts: null,
|
|
63
|
+
binary: { state: 'accepted', ...page.binaryFiles[path] },
|
|
64
|
+
revision: page.revisions[path] ?? prior.get(path)?.revision ?? null,
|
|
65
|
+
fileId: page.fileIds?.[path] ?? null,
|
|
66
|
+
created: page.created?.[path] ?? null,
|
|
67
|
+
change: page.changes[path] ?? null,
|
|
68
|
+
written: null,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
for (const path of listed.others) {
|
|
72
|
+
yield ROW_WEIGHT;
|
|
73
|
+
const held = prior.get(path);
|
|
74
|
+
if (held === undefined)
|
|
75
|
+
continue;
|
|
76
|
+
const { type: _type, ...kept } = held;
|
|
77
|
+
entries.push({
|
|
78
|
+
...kept,
|
|
79
|
+
revision: page.revisions[path] ?? held.revision,
|
|
80
|
+
fileId: page.fileIds?.[path] ?? held.fileId,
|
|
81
|
+
created: page.created?.[path] ?? held.created,
|
|
82
|
+
change: page.changes[path] ?? held.change,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return entries;
|
|
86
|
+
}
|
|
87
|
+
export async function pageEntries(page, removals, roomVersion, prior) {
|
|
88
|
+
await yielded();
|
|
89
|
+
const listed = await stepped(listing(page, removals));
|
|
90
|
+
const held = listed.asked.length === 0 ? new Map() : await prior(listed.asked);
|
|
91
|
+
return stepped(entering(page, roomVersion, listed, held));
|
|
92
|
+
}
|
|
93
|
+
function without(named, kept) {
|
|
94
|
+
return Object.fromEntries(Object.entries(named).filter(([path]) => !kept.has(path)));
|
|
95
|
+
}
|
|
96
|
+
function unwritten(page, kept) {
|
|
97
|
+
if (kept.size === 0)
|
|
98
|
+
return page;
|
|
99
|
+
return {
|
|
100
|
+
...page,
|
|
101
|
+
documents: without(page.documents, kept),
|
|
102
|
+
facts: without(page.facts, kept),
|
|
103
|
+
revisions: without(page.revisions, kept),
|
|
104
|
+
...(page.fileIds === undefined ? {} : { fileIds: without(page.fileIds, kept) }),
|
|
105
|
+
...(page.created === undefined ? {} : { created: without(page.created, kept) }),
|
|
106
|
+
changes: without(page.changes, kept),
|
|
107
|
+
binaryFiles: without(page.binaryFiles, kept),
|
|
108
|
+
removals: page.removals.filter((path) => !kept.has(path)),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async function pageOf(answered, roomVersion, staging) {
|
|
112
|
+
const page = unwritten(answered, await staging.later([
|
|
113
|
+
...Object.keys(answered.documents),
|
|
114
|
+
...Object.keys(answered.binaryFiles),
|
|
115
|
+
...answered.removals,
|
|
116
|
+
], roomVersion));
|
|
117
|
+
return {
|
|
118
|
+
entries: await pageEntries(page, page.removals, roomVersion, (paths) => staging.prior(paths)),
|
|
119
|
+
removals: page.removals,
|
|
120
|
+
folders: page.folders ?? [],
|
|
121
|
+
folderRemovals: page.folderRemovals ?? [],
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
export async function advancement(refresh, authorization, held, remodel, continuing, staging) {
|
|
5
125
|
const locator = held.locator;
|
|
6
126
|
const fromRoomVersion = held.roomVersion;
|
|
7
|
-
|
|
127
|
+
staging.turn();
|
|
128
|
+
if (!continuing())
|
|
129
|
+
return unconfirmed;
|
|
130
|
+
const first = await refresh(authorization, {
|
|
8
131
|
locator,
|
|
9
|
-
selection: held.replica.selection,
|
|
132
|
+
selection: held.declaration.replica.selection,
|
|
10
133
|
fromRoomVersion,
|
|
11
134
|
});
|
|
12
135
|
if (first.kind !== 'net-advancement')
|
|
13
136
|
return first;
|
|
14
137
|
const roomVersion = first.roomVersion;
|
|
15
|
-
const models = remodel(first.models, {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const stage = (page) => {
|
|
25
|
-
for (const path of Object.keys(page.documents)) {
|
|
26
|
-
delete binaries[path];
|
|
27
|
-
delete changes[path];
|
|
28
|
-
written[path] = roomVersion;
|
|
29
|
-
}
|
|
30
|
-
for (const path of Object.keys(page.binaryFiles)) {
|
|
31
|
-
delete documents[path];
|
|
32
|
-
delete changes[path];
|
|
33
|
-
delete written[path];
|
|
34
|
-
}
|
|
35
|
-
Object.assign(documents, page.documents);
|
|
36
|
-
Object.assign(binaries, acceptedBinaries(page.binaryFiles));
|
|
37
|
-
Object.assign(revisions, page.revisions);
|
|
38
|
-
Object.assign(changes, page.changes);
|
|
39
|
-
for (const path of page.removals) {
|
|
40
|
-
delete documents[path];
|
|
41
|
-
delete revisions[path];
|
|
42
|
-
delete changes[path];
|
|
43
|
-
delete written[path];
|
|
44
|
-
delete binaries[path];
|
|
45
|
-
}
|
|
138
|
+
const models = remodel(first.models, { collection: held.model });
|
|
139
|
+
const changed = new Set();
|
|
140
|
+
const staged = async (page) => {
|
|
141
|
+
const read = await pageOf(page, roomVersion, staging);
|
|
142
|
+
for (const { path } of read.entries)
|
|
143
|
+
changed.add(path);
|
|
144
|
+
for (const path of read.removals)
|
|
145
|
+
changed.add(path);
|
|
146
|
+
return staging.stage(read);
|
|
46
147
|
};
|
|
47
|
-
|
|
148
|
+
if (!(await staged(first)))
|
|
149
|
+
return unconfirmed;
|
|
48
150
|
let pageToken = first.pageToken;
|
|
49
151
|
while (pageToken !== undefined) {
|
|
152
|
+
await staging.turn();
|
|
50
153
|
if (!continuing())
|
|
51
154
|
return unconfirmed;
|
|
52
|
-
const page = await
|
|
155
|
+
const page = await refresh(authorization, {
|
|
53
156
|
locator,
|
|
54
|
-
selection: held.replica.selection,
|
|
157
|
+
selection: held.declaration.replica.selection,
|
|
55
158
|
fromRoomVersion,
|
|
56
159
|
pageToken,
|
|
57
160
|
});
|
|
@@ -61,7 +164,8 @@ export async function advancement(adapter, authorization, held, remodel, continu
|
|
|
61
164
|
return page;
|
|
62
165
|
if (page.roomVersion !== roomVersion)
|
|
63
166
|
return unconfirmed;
|
|
64
|
-
|
|
167
|
+
if (!(await staged(page)))
|
|
168
|
+
return unconfirmed;
|
|
65
169
|
pageToken = page.pageToken;
|
|
66
170
|
}
|
|
67
171
|
return {
|
|
@@ -69,20 +173,8 @@ export async function advancement(adapter, authorization, held, remodel, continu
|
|
|
69
173
|
record: {
|
|
70
174
|
...held,
|
|
71
175
|
model: models.collection,
|
|
72
|
-
selectionModel: models.selection,
|
|
73
176
|
roomVersion,
|
|
74
|
-
documents,
|
|
75
|
-
binaries,
|
|
76
|
-
revisions,
|
|
77
|
-
changes,
|
|
78
|
-
written,
|
|
79
177
|
},
|
|
178
|
+
changed,
|
|
80
179
|
};
|
|
81
180
|
}
|
|
82
|
-
export async function refreshRoom(adapter, authorization, confirmed, remodel, continuing) {
|
|
83
|
-
const advanced = await advancement(adapter, authorization, confirmed.record, remodel, continuing);
|
|
84
|
-
if (advanced.kind !== 'advanced')
|
|
85
|
-
return advanced;
|
|
86
|
-
const staged = readStaged(advanced.record, confirmed);
|
|
87
|
-
return staged.kind === 'staged' ? { kind: 'advanced', confirmed: staged.confirmed } : staged;
|
|
88
|
-
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ProviderRefusal } from './adapter.js';
|
|
2
|
+
import type { Runtime } from './runtime.js';
|
|
3
|
+
import type { RefusalReason } from './socket.js';
|
|
4
|
+
export declare function refuse(runtime: Runtime, reason: RefusalReason, provider?: ProviderRefusal | null): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=refusal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAQpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,QAAQ,GAAE,eAAe,GAAG,IAAW,iBAiDxC"}
|
package/dist/refusal.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { changeSet, mergeChangeSets } from './change-set.js';
|
|
2
|
+
import { composedOf } from './collection.js';
|
|
3
|
+
import { uncaught } from './failure.js';
|
|
4
|
+
import { listedLocators } from './listing.js';
|
|
5
|
+
import { prepare } from './preparation.js';
|
|
6
|
+
import { storedRecord } from './replica.js';
|
|
7
|
+
import { emitRefusal } from './shown.js';
|
|
8
|
+
export async function refuse(runtime, reason, provider = null) {
|
|
9
|
+
const { store, socket, presence } = runtime;
|
|
10
|
+
socket.session.set({ paused: true });
|
|
11
|
+
socket.abortReads();
|
|
12
|
+
try {
|
|
13
|
+
if (reason === 'revoked-authorization') {
|
|
14
|
+
await store.exclusive(async () => {
|
|
15
|
+
const revoked = { status: 'unavailable', reason: 'revoked' };
|
|
16
|
+
let held = new Map();
|
|
17
|
+
try {
|
|
18
|
+
const local = await store.open();
|
|
19
|
+
held = await store.rooms();
|
|
20
|
+
await local.commit({
|
|
21
|
+
rooms: [...held.values()].map(({ record: kept }) => {
|
|
22
|
+
const record = { ...kept, model: revoked };
|
|
23
|
+
return {
|
|
24
|
+
locator: record.locator,
|
|
25
|
+
key: record.key,
|
|
26
|
+
record: storedRecord(record),
|
|
27
|
+
composed: composedOf(store.composed(record)),
|
|
28
|
+
};
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
uncaught(error);
|
|
34
|
+
}
|
|
35
|
+
const listedNow = listedLocators(runtime, held);
|
|
36
|
+
for (const locator of listedNow) {
|
|
37
|
+
if (!held.has(locator))
|
|
38
|
+
presence.modelled(locator, revoked);
|
|
39
|
+
}
|
|
40
|
+
store.changed(mergeChangeSets(listedNow.map((locator) => changeSet(locator, { documents: null, room: true }))));
|
|
41
|
+
prepare(runtime);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
socket.session.set({
|
|
47
|
+
refusal: {
|
|
48
|
+
code: reason,
|
|
49
|
+
reauthorizationOffered: reason === 'revoked-authorization',
|
|
50
|
+
refusal: provider,
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
emitRefusal(runtime);
|
|
54
|
+
}
|
|
55
|
+
}
|