@agentshouse/mdruntime 0.1.0-ce41fec66d91b → 0.1.0-ce5b3c1e6ea87
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 +2 -2
- 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 +251 -0
- package/dist/adapter.d.ts +44 -25
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +3 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +21 -56
- package/dist/bootstrap.d.ts +8 -4
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +209 -78
- 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 +2 -1
- package/dist/chain.d.ts.map +1 -1
- package/dist/change.d.ts +1 -0
- package/dist/change.d.ts.map +1 -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 +20 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -0
- package/dist/collection.d.ts +2 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/compile.d.ts +6 -6
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +231 -300
- package/dist/connection.d.ts +5 -141
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +101 -5058
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +7 -0
- package/dist/conversation-live.d.ts +136 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +248 -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 +34 -38
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +856 -850
- 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 +15 -0
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.d.ts +2 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +17 -7
- package/dist/figures.d.ts +48 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +197 -0
- 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 +4 -5
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +23 -22
- package/dist/identity.d.ts +0 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -3
- package/dist/index.d.ts +23 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -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 +268 -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 +5 -4
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +62 -20
- 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/memory.d.ts +5 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +47 -8
- package/dist/messages.d.ts +27 -3
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +97 -19
- package/dist/model.d.ts +2 -9
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -9
- package/dist/models.d.ts +14 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +193 -0
- package/dist/observation.d.ts +2 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +7 -2
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +57 -0
- package/dist/outcome.d.ts +4 -1
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +3 -0
- package/dist/overlay.d.ts +1 -0
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +11 -0
- package/dist/parts.d.ts +59 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +118 -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 +13 -208
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -505
- package/dist/questions.d.ts +34 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +122 -0
- package/dist/reach.d.ts +14 -12
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +167 -114
- package/dist/react.d.ts +10 -2
- package/dist/react.d.ts.map +1 -1
- package/dist/read.d.ts +7 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +17 -0
- package/dist/readiness.d.ts +0 -2
- package/dist/readiness.d.ts.map +1 -1
- package/dist/reads.d.ts +37 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +171 -0
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +9 -1
- package/dist/refresh.d.ts +1 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +7 -0
- 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 +8 -8
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +52 -16
- package/dist/room-draft.d.ts +4 -3
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +65 -52
- 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 +14 -21
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +48 -184
- package/dist/runtime.d.ts +43 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +3 -1
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +16 -11
- package/dist/saves.d.ts +70 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +1006 -0
- package/dist/search.d.ts +12 -63
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +9 -52
- package/dist/seed.d.ts +11 -2
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +71 -0
- package/dist/shared.d.ts +1 -1
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +9 -5
- package/dist/shown.d.ts +31 -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 +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 +0 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +0 -6
- 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 +107 -145
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +143 -366
- package/dist/stored.d.ts +58 -32
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +264 -187
- package/dist/surface.d.ts +88 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +223 -0
- package/dist/sync.d.ts +20 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +532 -0
- package/dist/tables.d.ts +117 -27
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +211 -49
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +129 -0
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +7 -4
- package/dist/windows.d.ts +1 -12
- package/dist/windows.d.ts.map +1 -1
- package/dist/windows.js +2 -75
- package/dist/wire.d.ts +17 -1
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +7 -0
- package/package.json +2 -2
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- package/dist/fulltext.d.ts +0 -27
- package/dist/fulltext.d.ts.map +0 -1
- package/dist/fulltext.js +0 -370
- package/dist/words.d.ts +0 -19
- package/dist/words.d.ts.map +0 -1
- package/dist/words.js +0 -156
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { PlanReach } from './query.js';
|
|
2
|
+
import { type PortReach } from './reach.js';
|
|
3
|
+
import { type CodeAvailability, type ConnectionAvailability, type Readiness } from './readiness.js';
|
|
4
|
+
import type { Runtime } from './runtime.js';
|
|
5
|
+
export type ReadinessPort = {
|
|
6
|
+
readonly target: string;
|
|
7
|
+
readonly code: CodeAvailability;
|
|
8
|
+
};
|
|
9
|
+
export type ReadinessWatch = {
|
|
10
|
+
readonly port: ReadinessPort;
|
|
11
|
+
readonly reach: PortReach | null;
|
|
12
|
+
readonly deliver: (readiness: Readiness) => void;
|
|
13
|
+
};
|
|
14
|
+
export declare function prepare(runtime: Runtime, locators?: readonly string[]): void;
|
|
15
|
+
export declare function roomsOfReach(reach: PlanReach): ReadonlySet<string>;
|
|
16
|
+
export declare function connectionNow(runtime: Runtime): Promise<ConnectionAvailability>;
|
|
17
|
+
export declare function deliverOwedReadiness(runtime: Runtime, owed: readonly ReadinessWatch[]): Promise<void>;
|
|
18
|
+
export declare function watchReadiness({ store }: Runtime, port: ReadinessPort, reach: PortReach | null, deliver: (readiness: Readiness) => void): () => void;
|
|
19
|
+
export declare function filled(runtime: Runtime): void;
|
|
20
|
+
//# sourceMappingURL=preparation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preparation.d.ts","sourceRoot":"","sources":["../src/preparation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAE3B,KAAK,SAAS,EAEf,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAK5C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CAClD,CAAC;AAuCF,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAE,SAAS,MAAM,EAAO,QA8BzE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAElE;AAmDD,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAMrF;AAkFD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,cAAc,EAAE,iBAI3F;AAED,wBAAgB,cAAc,CAC5B,EAAE,KAAK,EAAE,EAAE,OAAO,EAClB,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,SAAS,GAAG,IAAI,EACvB,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,GACtC,MAAM,IAAI,CAQZ;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,QAMtC"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { changeSet } from './change-set.js';
|
|
2
|
+
import { installationOf } from './install.js';
|
|
3
|
+
import { listedLocators } from './listing.js';
|
|
4
|
+
import { planReach } from './reach.js';
|
|
5
|
+
import { readinessOf, } from './readiness.js';
|
|
6
|
+
import { roomOfKey } from './rows.js';
|
|
7
|
+
import { recoverReads } from './shown.js';
|
|
8
|
+
import { yielded } from './turn.js';
|
|
9
|
+
async function prepareReplica(runtime, locator) {
|
|
10
|
+
const { store, socket } = runtime;
|
|
11
|
+
for (;;) {
|
|
12
|
+
const held = (await store.rooms([locator])).get(locator);
|
|
13
|
+
if (held === undefined || socket.closed() || held.indexed)
|
|
14
|
+
return;
|
|
15
|
+
const key = held.record.key;
|
|
16
|
+
const done = await store.exclusive(async () => {
|
|
17
|
+
const local = await store.open();
|
|
18
|
+
return store.rederive(local, key, store.composed(held.record));
|
|
19
|
+
});
|
|
20
|
+
if (!done.done)
|
|
21
|
+
continue;
|
|
22
|
+
if ((await store.rooms([locator])).get(locator)?.record.key !== key)
|
|
23
|
+
continue;
|
|
24
|
+
store.changed(changeSet(locator, { documents: null }));
|
|
25
|
+
recoverReads(runtime);
|
|
26
|
+
store.readiness.queue();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function unprepared({ store, socket }) {
|
|
31
|
+
const held = (await store.covering()).rooms;
|
|
32
|
+
return [...store.device.now().unpreparedDemand, ...held.keys()].find((locator) => !(held.get(locator)?.indexed ?? false) && !socket.rooms.standing(locator).unpreparable);
|
|
33
|
+
}
|
|
34
|
+
function unpreparedBy({ store, socket, journal }, locator, error) {
|
|
35
|
+
socket.rooms.stand(locator, { unpreparable: true });
|
|
36
|
+
journal.record(`preparation failed ${locator} ${error instanceof Error ? error.name : 'unknown'}`);
|
|
37
|
+
store.readiness.queue();
|
|
38
|
+
}
|
|
39
|
+
export function prepare(runtime, locators = []) {
|
|
40
|
+
const { store, socket, journal } = runtime;
|
|
41
|
+
const { device } = store;
|
|
42
|
+
if (locators.length > 0) {
|
|
43
|
+
device.set({ unpreparedDemand: new Set([...device.now().unpreparedDemand, ...locators]) });
|
|
44
|
+
}
|
|
45
|
+
if (device.now().preparing)
|
|
46
|
+
return;
|
|
47
|
+
device.set({ preparing: true });
|
|
48
|
+
void (async () => {
|
|
49
|
+
try {
|
|
50
|
+
for (let waiting = await unprepared(runtime); waiting !== undefined; waiting = await unprepared(runtime)) {
|
|
51
|
+
await yielded();
|
|
52
|
+
if (socket.closed())
|
|
53
|
+
return;
|
|
54
|
+
const demand = new Set(device.now().unpreparedDemand);
|
|
55
|
+
demand.delete(waiting);
|
|
56
|
+
device.set({ unpreparedDemand: demand });
|
|
57
|
+
await prepareReplica(runtime, waiting).catch((error) => unpreparedBy(runtime, waiting, error));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
journal.record('preparation failed');
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
device.set({ preparing: false });
|
|
65
|
+
}
|
|
66
|
+
})();
|
|
67
|
+
}
|
|
68
|
+
export function roomsOfReach(reach) {
|
|
69
|
+
return new Set([...reach.rooms, ...reach.documents.map(roomOfKey)]);
|
|
70
|
+
}
|
|
71
|
+
function requiredRooms(runtime, given, held) {
|
|
72
|
+
const { roomsListed } = runtime.socket.session.now();
|
|
73
|
+
const reach = planReach(given);
|
|
74
|
+
const listed = new Set(listedLocators(runtime, held));
|
|
75
|
+
if (reach === null)
|
|
76
|
+
return { listed: roomsListed, rooms: [...listed].sort() };
|
|
77
|
+
const named = [...roomsOfReach(reach)].sort();
|
|
78
|
+
if (roomsListed)
|
|
79
|
+
return { listed: true, rooms: named.filter((room) => listed.has(room)) };
|
|
80
|
+
return { listed: named.every((room) => held.has(room)), rooms: named };
|
|
81
|
+
}
|
|
82
|
+
function roomState({ socket }, locator, held) {
|
|
83
|
+
const listedRoom = socket.rooms.discovered(locator);
|
|
84
|
+
if (socket.session.now().roomsListed &&
|
|
85
|
+
(listedRoom === undefined ||
|
|
86
|
+
listedRoom.replica.admission !== 'admitted' ||
|
|
87
|
+
socket.rooms.standing(locator).unreadable))
|
|
88
|
+
return 'unadmitted';
|
|
89
|
+
const stored = held.get(locator);
|
|
90
|
+
if (stored === undefined)
|
|
91
|
+
return 'acquiring';
|
|
92
|
+
if (!stored.indexed)
|
|
93
|
+
return 'preparing';
|
|
94
|
+
return 'complete';
|
|
95
|
+
}
|
|
96
|
+
function conversationCoverage({ socket, conversations }, reach) {
|
|
97
|
+
const declaredConversations = reach === null || reach.conversations;
|
|
98
|
+
if (!declaredConversations || socket.conversations() === undefined)
|
|
99
|
+
return 'undeclared';
|
|
100
|
+
if (!conversations.known() || !conversations.current())
|
|
101
|
+
return 'acquiring';
|
|
102
|
+
return 'complete';
|
|
103
|
+
}
|
|
104
|
+
function connectionOf({ socket }, lastCompleted) {
|
|
105
|
+
if (socket.isOpen())
|
|
106
|
+
return 'connected';
|
|
107
|
+
if (socket.session.now().moving.providerUnreachable)
|
|
108
|
+
return 'unreachable';
|
|
109
|
+
return !socket.streamed && lastCompleted !== null ? 'connected' : 'connecting';
|
|
110
|
+
}
|
|
111
|
+
export async function connectionNow(runtime) {
|
|
112
|
+
const { store, socket } = runtime;
|
|
113
|
+
if (socket.isOpen() || socket.session.now().moving.providerUnreachable || socket.streamed) {
|
|
114
|
+
return connectionOf(runtime, null);
|
|
115
|
+
}
|
|
116
|
+
return connectionOf(runtime, (await (await store.open()).facts()).lastCompleted);
|
|
117
|
+
}
|
|
118
|
+
async function readinessHeld({ store }) {
|
|
119
|
+
const local = await store.open();
|
|
120
|
+
const [held, facts] = await Promise.all([store.covering(), local.facts()]);
|
|
121
|
+
return { held: held.rooms, facts };
|
|
122
|
+
}
|
|
123
|
+
function readinessFor(runtime, port, reach, { held, facts }) {
|
|
124
|
+
const { store, socket, usableWhenHeld } = runtime;
|
|
125
|
+
const required = requiredRooms(runtime, reach, held);
|
|
126
|
+
const coverage = required.rooms.map((room) => ({ room, state: roomState(runtime, room, held) }));
|
|
127
|
+
const preparing = coverage
|
|
128
|
+
.filter((room) => room.state === 'preparing' && !socket.rooms.standing(room.room).unpreparable)
|
|
129
|
+
.map(({ room }) => room);
|
|
130
|
+
if (preparing.length > 0)
|
|
131
|
+
prepare(runtime, preparing);
|
|
132
|
+
const { persistence, storageLoss, heldWhenOpened } = store.device.now();
|
|
133
|
+
return readinessOf({
|
|
134
|
+
code: port.code,
|
|
135
|
+
coverage: {
|
|
136
|
+
listed: required.listed,
|
|
137
|
+
rooms: coverage,
|
|
138
|
+
conversations: conversationCoverage(runtime, reach),
|
|
139
|
+
},
|
|
140
|
+
persistence,
|
|
141
|
+
connection: connectionOf(runtime, facts.lastCompleted),
|
|
142
|
+
house: socket.session.now().refusal !== null
|
|
143
|
+
? 'refused'
|
|
144
|
+
: socket.writesHeld()
|
|
145
|
+
? 'write-halted'
|
|
146
|
+
: 'open',
|
|
147
|
+
space: store.space.full() ? 'full' : null,
|
|
148
|
+
installation: installationOf(store, coverage, held),
|
|
149
|
+
lost: storageLoss !== null,
|
|
150
|
+
established: facts.targets[port.target]?.established === true ||
|
|
151
|
+
(heldWhenOpened && usableWhenHeld.includes(port.target)),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
function establish(runtime, name) {
|
|
155
|
+
const { store, journal } = runtime;
|
|
156
|
+
const { device } = store;
|
|
157
|
+
if (device.now().establishing.has(name))
|
|
158
|
+
return;
|
|
159
|
+
device.set({ establishing: new Set([...device.now().establishing, name]) });
|
|
160
|
+
void store
|
|
161
|
+
.durably(async (local) => {
|
|
162
|
+
const { targets } = await local.facts();
|
|
163
|
+
await local.fact('targets', { ...targets, [name]: { established: true } });
|
|
164
|
+
})
|
|
165
|
+
.then(() => {
|
|
166
|
+
store.readiness.queue();
|
|
167
|
+
void probeEachMinute(runtime);
|
|
168
|
+
}, () => {
|
|
169
|
+
journal.record(`target record failed ${name}`);
|
|
170
|
+
})
|
|
171
|
+
.finally(() => {
|
|
172
|
+
const establishing = new Set(device.now().establishing);
|
|
173
|
+
establishing.delete(name);
|
|
174
|
+
device.set({ establishing });
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
function deliverReadiness(runtime, watch, held) {
|
|
178
|
+
if (!runtime.store.readiness.held(watch))
|
|
179
|
+
return;
|
|
180
|
+
const readiness = readinessFor(runtime, watch.port, watch.reach, held);
|
|
181
|
+
if (readiness.ready && held.facts.targets[watch.port.target]?.established !== true) {
|
|
182
|
+
establish(runtime, watch.port.target);
|
|
183
|
+
}
|
|
184
|
+
if (!runtime.store.readiness.changed(watch, JSON.stringify(readiness)))
|
|
185
|
+
return;
|
|
186
|
+
watch.deliver(structuredClone(readiness));
|
|
187
|
+
}
|
|
188
|
+
export async function deliverOwedReadiness(runtime, owed) {
|
|
189
|
+
const held = await readinessHeld(runtime);
|
|
190
|
+
if (runtime.socket.closed())
|
|
191
|
+
return;
|
|
192
|
+
for (const watch of owed)
|
|
193
|
+
deliverReadiness(runtime, watch, held);
|
|
194
|
+
}
|
|
195
|
+
export function watchReadiness({ store }, port, reach, deliver) {
|
|
196
|
+
const watch = { port, reach, deliver };
|
|
197
|
+
const stop = store.readiness.add(watch);
|
|
198
|
+
void store.open().then(() => store.readiness.owe([watch]), () => store.readiness.owe([watch]));
|
|
199
|
+
return stop;
|
|
200
|
+
}
|
|
201
|
+
export function filled(runtime) {
|
|
202
|
+
const { store, socket, journal } = runtime;
|
|
203
|
+
if (socket.closed() || !store.space.fill())
|
|
204
|
+
return;
|
|
205
|
+
journal.record('space full');
|
|
206
|
+
store.readiness.queue();
|
|
207
|
+
void probeEachMinute(runtime);
|
|
208
|
+
}
|
|
209
|
+
async function installedTarget({ store, usableWhenHeld }) {
|
|
210
|
+
if (store.device.now().heldWhenOpened && usableWhenHeld.length > 0)
|
|
211
|
+
return true;
|
|
212
|
+
const { targets } = await (await store.open()).facts();
|
|
213
|
+
return Object.values(targets).some((target) => target.established);
|
|
214
|
+
}
|
|
215
|
+
async function probeEachMinute(runtime) {
|
|
216
|
+
const { store, socket } = runtime;
|
|
217
|
+
const { space } = store;
|
|
218
|
+
const idle = () => !space.full() || space.probing() || socket.closed();
|
|
219
|
+
if (idle())
|
|
220
|
+
return;
|
|
221
|
+
if (!(await installedTarget(runtime).catch(() => false)))
|
|
222
|
+
return;
|
|
223
|
+
if (idle())
|
|
224
|
+
return;
|
|
225
|
+
space.probeEachMinute();
|
|
226
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type FiguresCover } from './figures.js';
|
|
2
|
+
import type { Cover, Ran } from './live.js';
|
|
3
|
+
import { type Plan, type QueryResult } from './query.js';
|
|
4
|
+
import { type Deliver, type Fail, type PortReach } from './reach.js';
|
|
5
|
+
import type { Runtime } from './runtime.js';
|
|
6
|
+
import { type SearchResult } from './search.js';
|
|
7
|
+
import type { QueryRoom } from './store.js';
|
|
8
|
+
export declare function figuresCover(runtime: Runtime): Promise<FiguresCover>;
|
|
9
|
+
export declare function answeredPlan(runtime: Runtime, plan: Plan, cover: () => Promise<Cover>): Promise<Ran>;
|
|
10
|
+
export declare function rowsQuery(runtime: Runtime, plan: Plan): Promise<QueryResult>;
|
|
11
|
+
export declare function planned(runtime: Runtime, input: unknown, reach: PortReach | null): Promise<Plan>;
|
|
12
|
+
export declare function roomTallies(runtime: Runtime, rooms: readonly QueryRoom[], since: string): Promise<readonly import("./tallies.js").RoomTally[]>;
|
|
13
|
+
export declare function watchPlan(runtime: Runtime, plan: Plan, deliver: Deliver, fail: Fail): () => void;
|
|
14
|
+
export declare function watchPlanned(runtime: Runtime, planning: Promise<Plan>, deliver: Deliver, fail: Fail): () => void;
|
|
15
|
+
export declare function searched(runtime: Runtime, input: unknown, reach: PortReach | null): Promise<SearchResult>;
|
|
16
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAK5C,OAAO,EAIL,KAAK,IAAI,EACT,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAa,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAGhF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,KAAK,EAAa,SAAS,EAAgB,MAAM,YAAY,CAAC;AAuFrE,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAa1E;AA2ED,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAC1B,OAAO,CAAC,GAAG,CAAC,CAQd;AAQD,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAWlF;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,wDAO7F;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,IAAI,CAchG;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,GACT,MAAM,IAAI,CAeZ;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,OAAO,CAAC,YAAY,CAAC,CAqDvB"}
|
package/dist/queries.js
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { identityOf } from '@agentshouse/mdmodel';
|
|
2
|
+
import { ROOM_TOTALS } from './figures.js';
|
|
3
|
+
import { roomInFlight } from './install.js';
|
|
4
|
+
import { roomFacts } from './listing.js';
|
|
5
|
+
import { lockedRooms } from './locks.js';
|
|
6
|
+
import { OFFLINE, UNCERTAIN, failure } from './outcome.js';
|
|
7
|
+
import { connectionNow, prepare, roomsOfReach } from './preparation.js';
|
|
8
|
+
import { planWithin, } from './query.js';
|
|
9
|
+
import { planReach } from './reach.js';
|
|
10
|
+
import { refuse } from './refusal.js';
|
|
11
|
+
import { documentKey } from './rows.js';
|
|
12
|
+
import { searchPlanOf } from './search.js';
|
|
13
|
+
import { seedApplies, seededResult, watchSeeded } from './seed.js';
|
|
14
|
+
import { capped, MAXIMUM_WINDOW } from './windows.js';
|
|
15
|
+
const QUERY_BYTES = 1 << 20;
|
|
16
|
+
function everyRoom({ socket }, held) {
|
|
17
|
+
return [
|
|
18
|
+
...new Set([
|
|
19
|
+
...socket.rooms.declarations().keys(),
|
|
20
|
+
...held.rooms.keys(),
|
|
21
|
+
...held.queues.keys(),
|
|
22
|
+
]),
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
function reachedRooms(runtime, plan, held) {
|
|
26
|
+
const reached = plan.reach === null ? null : roomsOfReach(plan.reach);
|
|
27
|
+
const named = plan.rooms ?? (reached === null ? everyRoom(runtime, held) : [...reached]);
|
|
28
|
+
return [...new Set(named)]
|
|
29
|
+
.filter((locator) => (reached === null || reached.has(locator)) && !plan.locked.includes(locator))
|
|
30
|
+
.sort();
|
|
31
|
+
}
|
|
32
|
+
function awaited({ socket }, locator) {
|
|
33
|
+
return (!socket.session.now().roomsListed ||
|
|
34
|
+
(socket.rooms.declared(locator) !== undefined &&
|
|
35
|
+
socket.rooms.discovered(locator)?.replica.admission === 'admitted'));
|
|
36
|
+
}
|
|
37
|
+
function coveredRooms(runtime, locators, whole, held) {
|
|
38
|
+
const { store, socket } = runtime;
|
|
39
|
+
if (locators.length === 0 && whole && !socket.session.now().roomsListed)
|
|
40
|
+
return { pending: [] };
|
|
41
|
+
const pending = [];
|
|
42
|
+
const coverage = [];
|
|
43
|
+
const overlay = [];
|
|
44
|
+
const read = [];
|
|
45
|
+
for (const locator of locators) {
|
|
46
|
+
const replica = held.rooms.get(locator);
|
|
47
|
+
if (replica === undefined) {
|
|
48
|
+
if (awaited(runtime, locator))
|
|
49
|
+
pending.push({ room: locator, awaits: 'acquisition' });
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (!replica.indexed) {
|
|
53
|
+
pending.push({ room: locator, awaits: 'preparation' });
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
coverage.push({
|
|
57
|
+
room: locator,
|
|
58
|
+
generation: replica.transfer,
|
|
59
|
+
current: !roomInFlight(store, locator),
|
|
60
|
+
});
|
|
61
|
+
read.push({ locator, key: replica.key });
|
|
62
|
+
for (const id of held.queues.get(locator) ?? [])
|
|
63
|
+
overlay.push(id);
|
|
64
|
+
}
|
|
65
|
+
if (pending.length > 0)
|
|
66
|
+
return { pending };
|
|
67
|
+
return { coverage: { rooms: coverage, indexes: [], overlay }, rooms: read };
|
|
68
|
+
}
|
|
69
|
+
function covered(runtime, plan, held) {
|
|
70
|
+
return coveredRooms(runtime, reachedRooms(runtime, plan, held), plan.rooms === null && plan.reach === null, held);
|
|
71
|
+
}
|
|
72
|
+
function awaitPreparation(runtime, cover) {
|
|
73
|
+
if (!('pending' in cover))
|
|
74
|
+
return;
|
|
75
|
+
const waiting = cover.pending.filter(({ awaits }) => awaits === 'preparation');
|
|
76
|
+
if (waiting.length > 0) {
|
|
77
|
+
prepare(runtime, waiting.map(({ room }) => room));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export async function figuresCover(runtime) {
|
|
81
|
+
const held = await runtime.store.covering();
|
|
82
|
+
const locked = await lockedRooms(runtime);
|
|
83
|
+
const cover = coveredRooms(runtime, everyRoom(runtime, held)
|
|
84
|
+
.filter((locator) => !locked.includes(locator))
|
|
85
|
+
.sort(), true, held);
|
|
86
|
+
awaitPreparation(runtime, cover);
|
|
87
|
+
return 'pending' in cover ? cover : { rooms: cover.rooms };
|
|
88
|
+
}
|
|
89
|
+
function sameCover(left, right) {
|
|
90
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
91
|
+
}
|
|
92
|
+
async function windowRows(local, plan, rooms, unchanged) {
|
|
93
|
+
const first = await local.query(plan, rooms, QUERY_BYTES);
|
|
94
|
+
if (first.more === undefined || !('documents' in first)) {
|
|
95
|
+
const { more: _more, ...rows } = first;
|
|
96
|
+
return rows;
|
|
97
|
+
}
|
|
98
|
+
const documents = [...first.documents];
|
|
99
|
+
for (let more = first.more; more !== undefined;) {
|
|
100
|
+
if (!unchanged())
|
|
101
|
+
return null;
|
|
102
|
+
const page = await local.query({
|
|
103
|
+
...plan,
|
|
104
|
+
after: { text: more, values: JSON.parse(more) },
|
|
105
|
+
limit: plan.limit === null ? null : plan.limit - documents.length,
|
|
106
|
+
total: false,
|
|
107
|
+
}, rooms, QUERY_BYTES);
|
|
108
|
+
if (!('documents' in page))
|
|
109
|
+
return null;
|
|
110
|
+
documents.push(...page.documents);
|
|
111
|
+
more = page.more;
|
|
112
|
+
if (more === undefined) {
|
|
113
|
+
return {
|
|
114
|
+
documents,
|
|
115
|
+
...(page.next === undefined ? {} : { next: page.next }),
|
|
116
|
+
...(first.total === undefined ? {} : { total: first.total }),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
async function coveredRows({ store }, plan, cover) {
|
|
123
|
+
for (;;) {
|
|
124
|
+
const before = await cover();
|
|
125
|
+
if ('pending' in before)
|
|
126
|
+
return { pending: before };
|
|
127
|
+
const local = await store.open();
|
|
128
|
+
const keys = before.rooms.map(({ key }) => key);
|
|
129
|
+
const changes = local.changes(keys);
|
|
130
|
+
const current = () => local.changes(keys) === changes;
|
|
131
|
+
const rows = await windowRows(local, plan, before.rooms, current);
|
|
132
|
+
const after = await cover();
|
|
133
|
+
if (rows !== null && sameCover(before, after))
|
|
134
|
+
return { rows, cover: before, current };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function keyedOf(rows, coverage) {
|
|
138
|
+
if ('groups' in rows) {
|
|
139
|
+
return {
|
|
140
|
+
result: { ...rows, coverage },
|
|
141
|
+
keys: rows.groups.map((group) => JSON.stringify(group.key)),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
result: { ...rows, coverage },
|
|
146
|
+
keys: rows.documents.map((document) => documentKey(document.room, document.path)),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
export async function answeredPlan(runtime, plan, cover) {
|
|
150
|
+
const answered = await coveredRows(runtime, plan, cover);
|
|
151
|
+
if ('pending' in answered) {
|
|
152
|
+
const pending = answered.pending;
|
|
153
|
+
return { result: pending, keys: [], current: () => true };
|
|
154
|
+
}
|
|
155
|
+
const held = answered.cover;
|
|
156
|
+
return { ...keyedOf(answered.rows, held.coverage), current: answered.current };
|
|
157
|
+
}
|
|
158
|
+
async function coverNow(runtime, plan) {
|
|
159
|
+
const cover = covered(runtime, plan, await runtime.store.covering());
|
|
160
|
+
awaitPreparation(runtime, cover);
|
|
161
|
+
return cover;
|
|
162
|
+
}
|
|
163
|
+
export async function rowsQuery(runtime, plan) {
|
|
164
|
+
const held = await runtime.store.covering();
|
|
165
|
+
const before = covered(runtime, plan, held);
|
|
166
|
+
awaitPreparation(runtime, before);
|
|
167
|
+
const seeded = seedApplies(runtime, plan, held);
|
|
168
|
+
if (seeded !== null)
|
|
169
|
+
return seededResult(seeded).result;
|
|
170
|
+
if ('pending' in before)
|
|
171
|
+
return before;
|
|
172
|
+
const answered = await coveredRows(runtime, plan, () => coverNow(runtime, plan));
|
|
173
|
+
if ('pending' in answered)
|
|
174
|
+
return answered.pending;
|
|
175
|
+
const shownCover = answered.cover;
|
|
176
|
+
return { ...answered.rows, coverage: shownCover.coverage };
|
|
177
|
+
}
|
|
178
|
+
export async function planned(runtime, input, reach) {
|
|
179
|
+
const plan = planWithin(input, await roomFacts(runtime, reach), planReach(reach));
|
|
180
|
+
const named = plan.paths !== null &&
|
|
181
|
+
plan.rooms !== null &&
|
|
182
|
+
plan.paths.length * plan.rooms.length <= MAXIMUM_WINDOW;
|
|
183
|
+
return plan.limit === null && named ? plan : { ...plan, limit: capped(plan.limit) };
|
|
184
|
+
}
|
|
185
|
+
export async function roomTallies(runtime, rooms, since) {
|
|
186
|
+
return runtime.store.ask({
|
|
187
|
+
kind: 'replica.tallies',
|
|
188
|
+
totals: { ...(await planned(runtime, ROOM_TOTALS, null)), limit: null },
|
|
189
|
+
rooms,
|
|
190
|
+
since,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
export function watchPlan(runtime, plan, deliver, fail) {
|
|
194
|
+
return watchSeeded(runtime, plan, deliver, (behind, answered) => runtime.liveQueries.watch(plan, identityOf(plan), (held) => {
|
|
195
|
+
const cover = covered(runtime, plan, held);
|
|
196
|
+
awaitPreparation(runtime, cover);
|
|
197
|
+
return behind(cover, held);
|
|
198
|
+
}, answered, fail));
|
|
199
|
+
}
|
|
200
|
+
export function watchPlanned(runtime, planning, deliver, fail) {
|
|
201
|
+
let stop = null;
|
|
202
|
+
let stopped = false;
|
|
203
|
+
planning.then((plan) => {
|
|
204
|
+
if (!stopped)
|
|
205
|
+
stop = watchPlan(runtime, plan, deliver, fail);
|
|
206
|
+
}, (error) => {
|
|
207
|
+
if (!stopped)
|
|
208
|
+
fail(error);
|
|
209
|
+
});
|
|
210
|
+
return () => {
|
|
211
|
+
stopped = true;
|
|
212
|
+
stop?.();
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
export async function searched(runtime, input, reach) {
|
|
216
|
+
const { store, socket, journal } = runtime;
|
|
217
|
+
const { session } = socket;
|
|
218
|
+
const asked = searchPlanOf(input);
|
|
219
|
+
await socket.ready;
|
|
220
|
+
const search = socket.search();
|
|
221
|
+
if (search === undefined) {
|
|
222
|
+
return {
|
|
223
|
+
kind: 'undeclared',
|
|
224
|
+
code: 'action-undeclared',
|
|
225
|
+
fields: { name: 'search' },
|
|
226
|
+
retryable: false,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
if (socket.closed() ||
|
|
230
|
+
session.now().refusal !== null ||
|
|
231
|
+
(await connectionNow(runtime)) !== 'connected')
|
|
232
|
+
return OFFLINE;
|
|
233
|
+
const reached = reach === null ? null : new Set(reach.rooms);
|
|
234
|
+
const named = asked.rooms === null
|
|
235
|
+
? reached === null
|
|
236
|
+
? null
|
|
237
|
+
: [...reached]
|
|
238
|
+
: asked.rooms.filter((room) => reached === null || reached.has(room));
|
|
239
|
+
const held = named === null ? null : await store.rooms(named);
|
|
240
|
+
const rooms = named === null ? null : named.filter((room) => held.has(room)).sort();
|
|
241
|
+
if (rooms !== null && rooms.length === 0)
|
|
242
|
+
return { kind: 'found', documents: [] };
|
|
243
|
+
try {
|
|
244
|
+
await socket.authorize();
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return UNCERTAIN;
|
|
248
|
+
}
|
|
249
|
+
const { closed, authorization, refusal } = session.now();
|
|
250
|
+
if (closed || authorization === undefined || refusal !== null)
|
|
251
|
+
return UNCERTAIN;
|
|
252
|
+
journal.record('transfer search');
|
|
253
|
+
try {
|
|
254
|
+
const result = await search(authorization, { text: asked.text, rooms });
|
|
255
|
+
if (result.kind === 'revoked-authorization')
|
|
256
|
+
await refuse(runtime, 'revoked-authorization');
|
|
257
|
+
journal.record(`outcome search ${result.kind}`);
|
|
258
|
+
if (result.kind === 'rejected')
|
|
259
|
+
return result;
|
|
260
|
+
if (result.kind !== 'found')
|
|
261
|
+
return failure(result);
|
|
262
|
+
const kept = rooms === null ? null : new Set(rooms);
|
|
263
|
+
return {
|
|
264
|
+
kind: 'found',
|
|
265
|
+
documents: result.documents.filter((hit) => kept === null || kept.has(hit.room)),
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
journal.record('outcome search transport-uncertainty');
|
|
270
|
+
return UNCERTAIN;
|
|
271
|
+
}
|
|
272
|
+
}
|