@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
package/dist/search.d.ts
CHANGED
|
@@ -1,73 +1,22 @@
|
|
|
1
|
-
import type { ProviderRefusal } from './adapter.js';
|
|
2
|
-
import
|
|
3
|
-
import type { Open } from './open.js';
|
|
4
|
-
export type DocumentPart = Open<'fields' | 'sections' | 'preamble' | 'path'>;
|
|
1
|
+
import type { ProviderRefusal, SearchHit } from './adapter.js';
|
|
2
|
+
import type { Failure, Offline } from './outcome.js';
|
|
5
3
|
export type SearchRequest = {
|
|
6
4
|
text: string;
|
|
7
|
-
|
|
8
|
-
collection?: true;
|
|
9
|
-
conversations?: readonly string[];
|
|
10
|
-
limit?: number;
|
|
11
|
-
after?: string;
|
|
12
|
-
total?: true;
|
|
5
|
+
rooms?: readonly string[];
|
|
13
6
|
};
|
|
14
|
-
export type
|
|
15
|
-
export type
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
at: readonly [number, number];
|
|
19
|
-
};
|
|
20
|
-
export type DocumentHit = {
|
|
21
|
-
room: string;
|
|
22
|
-
path: string;
|
|
23
|
-
type: string;
|
|
24
|
-
score: number;
|
|
25
|
-
matches: Readonly<Record<string, readonly DocumentPart[]>>;
|
|
26
|
-
snippet?: Snippet<DocumentPart>;
|
|
27
|
-
};
|
|
28
|
-
export type MessageHit = {
|
|
29
|
-
conversation: string;
|
|
30
|
-
identity: string;
|
|
31
|
-
score: number;
|
|
32
|
-
matches: Readonly<Record<string, readonly MessagePart[]>>;
|
|
33
|
-
snippet?: Snippet<MessagePart>;
|
|
34
|
-
};
|
|
35
|
-
export type SearchCoverage = {
|
|
36
|
-
rooms: readonly CoveredRoom[];
|
|
37
|
-
conversations: readonly string[];
|
|
38
|
-
overlay: readonly string[];
|
|
7
|
+
export type { SearchHit } from './adapter.js';
|
|
8
|
+
export type SearchFound = {
|
|
9
|
+
kind: 'found';
|
|
10
|
+
documents: readonly SearchHit[];
|
|
39
11
|
};
|
|
40
|
-
export type
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
};
|
|
44
|
-
export type SearchWindow = SearchHits & {
|
|
45
|
-
next?: string;
|
|
46
|
-
total?: {
|
|
47
|
-
documents: number;
|
|
48
|
-
messages: number;
|
|
49
|
-
};
|
|
50
|
-
};
|
|
51
|
-
export type SearchPending = SearchHits & {
|
|
52
|
-
pending: readonly PendingRoom[];
|
|
53
|
-
coverage: SearchCoverage;
|
|
54
|
-
};
|
|
55
|
-
export type SearchUndeclared = ProviderRefusal & {
|
|
12
|
+
export type SearchResult = SearchFound | Offline | (ProviderRefusal & {
|
|
13
|
+
kind: 'rejected';
|
|
14
|
+
}) | (ProviderRefusal & {
|
|
56
15
|
kind: 'undeclared';
|
|
57
|
-
};
|
|
58
|
-
export type SearchResult = (SearchWindow & {
|
|
59
|
-
coverage: SearchCoverage;
|
|
60
|
-
}) | SearchPending | SearchUndeclared;
|
|
61
|
-
export declare function undeclaredSearch(): SearchUndeclared;
|
|
62
|
-
export type HitCursor = readonly [number, string, string] | readonly [] | null;
|
|
16
|
+
}) | Failure;
|
|
63
17
|
export type SearchPlan = {
|
|
64
18
|
text: string;
|
|
65
|
-
|
|
66
|
-
collection: boolean;
|
|
67
|
-
conversations: readonly string[] | null;
|
|
68
|
-
limit: number | null;
|
|
69
|
-
after: readonly [HitCursor, HitCursor] | null;
|
|
70
|
-
total: boolean;
|
|
19
|
+
rooms: readonly string[] | null;
|
|
71
20
|
};
|
|
72
21
|
export declare function searchPlanOf(input: unknown): SearchPlan;
|
|
73
22
|
//# sourceMappingURL=search.d.ts.map
|
package/dist/search.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAExE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,CAAC;AAE7E,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,OAAO,GACP,CAAC,eAAe,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,GACxC,CAAC,eAAe,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,GAC1C,OAAO,CAAC;AAEZ,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;CAAE,CAAC;AAE3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAYvD"}
|
package/dist/search.js
CHANGED
|
@@ -1,57 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { decodedCursor } from './windows.js';
|
|
3
|
-
export function undeclaredSearch() {
|
|
4
|
-
return {
|
|
5
|
-
kind: 'undeclared',
|
|
6
|
-
code: 'search-undeclared',
|
|
7
|
-
fields: { name: 'local_search' },
|
|
8
|
-
retryable: false,
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
function hitCursor(input) {
|
|
12
|
-
if (input === null)
|
|
13
|
-
return null;
|
|
14
|
-
if (!Array.isArray(input))
|
|
15
|
-
return undefined;
|
|
16
|
-
if (input.length === 0)
|
|
17
|
-
return [];
|
|
18
|
-
const [score, first, second] = input;
|
|
19
|
-
return input.length === 3 &&
|
|
20
|
-
typeof score === 'number' &&
|
|
21
|
-
typeof first === 'string' &&
|
|
22
|
-
typeof second === 'string'
|
|
23
|
-
? [score, first, second]
|
|
24
|
-
: undefined;
|
|
25
|
-
}
|
|
26
|
-
function searchAfter(input) {
|
|
27
|
-
if (input === undefined)
|
|
28
|
-
return null;
|
|
29
|
-
const decoded = typeof input === 'string' ? decodedCursor(input) : null;
|
|
30
|
-
const documents = decoded?.length === 2 ? hitCursor(decoded[0]) : undefined;
|
|
31
|
-
const messages = decoded?.length === 2 ? hitCursor(decoded[1]) : undefined;
|
|
32
|
-
if (documents === undefined || messages === undefined) {
|
|
33
|
-
invalid('after', 'expects the next an earlier search returned');
|
|
34
|
-
}
|
|
35
|
-
return [documents, messages];
|
|
36
|
-
}
|
|
1
|
+
import { invalid, known, plain } from '@agentshouse/mdmodel';
|
|
37
2
|
export function searchPlanOf(input) {
|
|
38
3
|
if (!plain(input))
|
|
39
4
|
invalid('search', 'expects a search object');
|
|
40
|
-
known(input, ['text', '
|
|
41
|
-
if (typeof input.text !== 'string')
|
|
42
|
-
invalid('text', 'expects
|
|
43
|
-
const
|
|
44
|
-
if (
|
|
45
|
-
(!Array.isArray(
|
|
46
|
-
invalid('
|
|
5
|
+
known(input, ['text', 'rooms'], '');
|
|
6
|
+
if (typeof input.text !== 'string' || input.text.trim() === '')
|
|
7
|
+
invalid('text', 'expects words');
|
|
8
|
+
const rooms = input.rooms;
|
|
9
|
+
if (rooms !== undefined &&
|
|
10
|
+
(!Array.isArray(rooms) || rooms.some((named) => typeof named !== 'string'))) {
|
|
11
|
+
invalid('rooms', 'expects a list of Rooms');
|
|
47
12
|
}
|
|
48
|
-
return {
|
|
49
|
-
text: input.text,
|
|
50
|
-
documents: input.documents,
|
|
51
|
-
collection: flag(input.collection, 'collection'),
|
|
52
|
-
conversations: conversations ?? null,
|
|
53
|
-
limit: limitOf(input.limit),
|
|
54
|
-
after: searchAfter(input.after),
|
|
55
|
-
total: flag(input.total, 'total'),
|
|
56
|
-
};
|
|
13
|
+
return { text: input.text, rooms: rooms ?? null };
|
|
57
14
|
}
|
package/dist/seed.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type
|
|
1
|
+
import type { Cover } from './live.js';
|
|
2
|
+
import { type KeyedResult } from './observation.js';
|
|
3
|
+
import type { Plan, QueryRows } from './query.js';
|
|
4
|
+
import type { Deliver } from './reach.js';
|
|
5
|
+
import type { Runtime } from './runtime.js';
|
|
6
|
+
import type { HeldCover, Store } from './store.js';
|
|
3
7
|
export type EntrySeed = {
|
|
4
8
|
readonly at: Readonly<Record<string, string>>;
|
|
5
9
|
readonly queries: readonly {
|
|
@@ -11,6 +15,11 @@ export type Seeded = {
|
|
|
11
15
|
readonly rows: QueryRows;
|
|
12
16
|
readonly at: Readonly<Record<string, string>>;
|
|
13
17
|
};
|
|
18
|
+
type SeededWatch = (coverOf: (cover: Cover, held: HeldCover) => Cover, deliver: (message: unknown) => void) => () => void;
|
|
14
19
|
export declare function entrySeedOf(value: unknown): EntrySeed | null;
|
|
15
20
|
export declare function seededResult(seed: Seeded): KeyedResult;
|
|
21
|
+
export declare function seedApplies(runtime: Runtime, plan: Plan, held: HeldCover): Seeded | null;
|
|
22
|
+
export declare function keepEntrySeed(store: Store, entry: EntrySeed): void;
|
|
23
|
+
export declare function watchSeeded(runtime: Runtime, plan: Plan, deliver: Deliver, watch: SeededWatch): () => void;
|
|
24
|
+
export {};
|
|
16
25
|
//# sourceMappingURL=seed.d.ts.map
|
package/dist/seed.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../src/seed.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../src/seed.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAS,KAAK,WAAW,EAAqB,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,IAAI,EAA4C,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;CACpF,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC;AAEjG,KAAK,WAAW,GAAG,CACjB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,KAAK,KAAK,EACjD,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAChC,MAAM,IAAI,CAAC;AA0ChB,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAe5D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAoBtD;AA+BD,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAOxF;AAYD,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAMlE;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,GACjB,MAAM,IAAI,CA4BZ"}
|
package/dist/seed.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { queryKey } from '@agentshouse/mdmodel';
|
|
2
|
+
import { whole } from './observation.js';
|
|
1
3
|
import { documentKey } from './rows.js';
|
|
4
|
+
const seedTopic = (key) => `seed\u0000${key}`;
|
|
2
5
|
function plain(value) {
|
|
3
6
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
4
7
|
}
|
|
@@ -73,3 +76,71 @@ export function seededResult(seed) {
|
|
|
73
76
|
keys: seed.rows.documents.map((document) => documentKey(document.room, document.path)),
|
|
74
77
|
};
|
|
75
78
|
}
|
|
79
|
+
function seedRoomHeld({ socket }, room, version, held) {
|
|
80
|
+
const stored = held.rooms.get(room);
|
|
81
|
+
return (stored !== undefined &&
|
|
82
|
+
stored.indexed &&
|
|
83
|
+
socket.reads.reached(room, stored.roomVersion, version));
|
|
84
|
+
}
|
|
85
|
+
function seedHeld(runtime, at, held) {
|
|
86
|
+
const { socket } = runtime;
|
|
87
|
+
return Object.entries(at).every(([room, version]) => (socket.session.now().roomsListed &&
|
|
88
|
+
socket.rooms.declared(room) === undefined &&
|
|
89
|
+
!held.rooms.has(room)) ||
|
|
90
|
+
seedRoomHeld(runtime, room, version, held));
|
|
91
|
+
}
|
|
92
|
+
export function seedApplies(runtime, plan, held) {
|
|
93
|
+
const { seeds } = runtime.store;
|
|
94
|
+
const seed = seeds.of(plan.key);
|
|
95
|
+
if (seed === undefined)
|
|
96
|
+
return null;
|
|
97
|
+
if (!seedHeld(runtime, seed.at, held))
|
|
98
|
+
return seed;
|
|
99
|
+
seeds.drop(plan.key);
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
function seedBehind(runtime, plan, cover, held) {
|
|
103
|
+
const seed = seedApplies(runtime, plan, held);
|
|
104
|
+
if (seed === null || 'pending' in cover)
|
|
105
|
+
return cover;
|
|
106
|
+
return {
|
|
107
|
+
pending: Object.entries(seed.at)
|
|
108
|
+
.filter(([room, version]) => !seedRoomHeld(runtime, room, version, held))
|
|
109
|
+
.map(([room]) => ({ room, awaits: 'acquisition' })),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export function keepEntrySeed(store, entry) {
|
|
113
|
+
for (const { query, rows } of entry.queries) {
|
|
114
|
+
const key = queryKey(query);
|
|
115
|
+
store.seeds.keep(key, { rows, at: entry.at });
|
|
116
|
+
for (const watcher of store.watching(seedTopic(key)))
|
|
117
|
+
watcher.answer(null);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export function watchSeeded(runtime, plan, deliver, watch) {
|
|
121
|
+
const { store } = runtime;
|
|
122
|
+
let seeded = false;
|
|
123
|
+
let pending = true;
|
|
124
|
+
const shown = () => {
|
|
125
|
+
const seed = store.seeds.of(plan.key);
|
|
126
|
+
if (seed === undefined || seeded || !pending)
|
|
127
|
+
return;
|
|
128
|
+
seeded = true;
|
|
129
|
+
deliver(seededResult(seed));
|
|
130
|
+
};
|
|
131
|
+
const watcher = store.watch(seedTopic(plan.key), shown);
|
|
132
|
+
const stop = watch((cover, held) => seedBehind(runtime, plan, cover, held), (message) => {
|
|
133
|
+
const answered = message;
|
|
134
|
+
pending = whole(answered) && 'pending' in answered.result;
|
|
135
|
+
if (pending && store.seeds.of(plan.key) !== undefined) {
|
|
136
|
+
shown();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
seeded = false;
|
|
140
|
+
deliver(message);
|
|
141
|
+
});
|
|
142
|
+
return () => {
|
|
143
|
+
watcher.stop();
|
|
144
|
+
stop();
|
|
145
|
+
};
|
|
146
|
+
}
|
package/dist/shared.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export type Paths<V> = Readonly<Record<string, V>>;
|
|
2
|
+
export declare function guarding<V>(values: Paths<V>, handler: ProxyHandler<Paths<V>>): Paths<V>;
|
|
2
3
|
export declare function entriesIn<V>(map: Paths<V>): Generator<readonly [string, V]>;
|
|
3
4
|
export declare function sortedKeys(map: Paths<unknown>): Generator<number, readonly string[], void>;
|
|
4
5
|
export declare function sorting(keys: Iterable<string>): Generator<number, readonly string[], void>;
|
|
@@ -6,7 +7,6 @@ export declare function sharing<V>(map: Paths<V>): Generator<number, Paths<V>, v
|
|
|
6
7
|
export declare function shared<V>(map: Paths<V>): Paths<V>;
|
|
7
8
|
export declare function patched<V>(base: Paths<V>, set: Iterable<readonly [string, V]>, removed?: Iterable<string>): Paths<V>;
|
|
8
9
|
export declare function patching<V>(base: Paths<V>, set: Iterable<readonly [string, V]>, removed?: Iterable<string>): Generator<number, Paths<V>, void>;
|
|
9
|
-
export declare function sizeOf<V>(map: Paths<V>): number;
|
|
10
10
|
export declare function differences<V>(left: Paths<V>, right: Paths<V>, same?: (left: V, right: V) => boolean): Generator<number, ReadonlySet<string>, void>;
|
|
11
11
|
export declare function differing<V>(left: Paths<V>, right: Paths<V>, same?: (left: V, right: V) => boolean): ReadonlySet<string>;
|
|
12
12
|
export declare function drafted<V>(base: Paths<V>): Record<string, V>;
|
package/dist/shared.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AAiMnD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAIvF;AAED,wBAAiB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAQ5E;AAuCD,wBAAiB,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,CAE3F;AAED,wBAAiB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,CAoB3F;AAED,wBAAiB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAE5E;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAEjD;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EACd,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EACnC,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAM,GAC7B,KAAK,CAAC,CAAC,CAAC,CAEV;AAED,wBAAiB,QAAQ,CAAC,CAAC,EACzB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EACd,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EACnC,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAM,GAC7B,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAoBnC;AA8CD,wBAAiB,WAAW,CAAC,CAAC,EAC5B,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EACd,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,IAAI,GAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,OAAmB,GAC/C,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAkB9C;AAED,wBAAgB,SAAS,CAAC,CAAC,EACzB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EACd,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,IAAI,GAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,OAAmB,GAC/C,WAAW,CAAC,MAAM,CAAC,CAErB;AAMD,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAiD5D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAE7D;AAED,wBAAiB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAUxF"}
|
package/dist/shared.js
CHANGED
|
@@ -179,11 +179,18 @@ function facade(root) {
|
|
|
179
179
|
roots.set(map, root);
|
|
180
180
|
return map;
|
|
181
181
|
}
|
|
182
|
+
const guarded = new WeakMap();
|
|
183
|
+
export function guarding(values, handler) {
|
|
184
|
+
const map = new Proxy(values, handler);
|
|
185
|
+
guarded.set(map, values);
|
|
186
|
+
return map;
|
|
187
|
+
}
|
|
182
188
|
export function* entriesIn(map) {
|
|
183
189
|
const root = roots.get(map);
|
|
184
190
|
if (root === undefined) {
|
|
185
|
-
|
|
186
|
-
|
|
191
|
+
const values = guarded.get(map) ?? map;
|
|
192
|
+
for (const key of Object.keys(values))
|
|
193
|
+
yield [key, values[key]];
|
|
187
194
|
return;
|
|
188
195
|
}
|
|
189
196
|
for (const leaf of leavesOf(root.node))
|
|
@@ -278,9 +285,6 @@ export function* patching(base, set, removed = []) {
|
|
|
278
285
|
return base;
|
|
279
286
|
return facade({ node, size });
|
|
280
287
|
}
|
|
281
|
-
export function sizeOf(map) {
|
|
282
|
-
return roots.get(map)?.size ?? Object.keys(map).length;
|
|
283
|
-
}
|
|
284
288
|
function* compared(left, right, same, into) {
|
|
285
289
|
const pending = [[left, right]];
|
|
286
290
|
for (let pair = pending.pop(); pair !== undefined; pair = pending.pop()) {
|
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;AAGjD,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,295 @@
|
|
|
1
|
+
import { conversationsChanged, conversationsLearned } from './conversation.js';
|
|
2
|
+
import { listingNow, list, patchedListing, shownRooms } from './listing.js';
|
|
3
|
+
import { emitPresentation, publishRoomDrafts } from './room-drafts.js';
|
|
4
|
+
import { same } from './status.js';
|
|
5
|
+
export const ROOMS_TOPIC = 'rooms';
|
|
6
|
+
export const STATUS_TOPIC = 'sync-status';
|
|
7
|
+
export const REFUSAL_TOPIC = 'connection-refusal';
|
|
8
|
+
export const STORAGE_LOSS_TOPIC = 'storage-loss';
|
|
9
|
+
export const SERVICE_MODE_TOPIC = 'service-mode';
|
|
10
|
+
export const MEMBER_TOPIC = 'member';
|
|
11
|
+
export const AUTHORITY_TOPIC = 'authority-changes';
|
|
12
|
+
export const LOCKS_TOPIC = 'locks';
|
|
13
|
+
export const queueTopic = (locator) => `queue\u0000${locator}`;
|
|
14
|
+
async function attended({ store, localSaves }) {
|
|
15
|
+
const isFenced = store.fences.has;
|
|
16
|
+
const held = await (await store.open()).status();
|
|
17
|
+
const attentionRequired = held.returned.flatMap((record) => record.returned === null || isFenced(record.locator)
|
|
18
|
+
? []
|
|
19
|
+
: [{ room: record.locator, path: record.path, returned: structuredClone(record.returned) }]);
|
|
20
|
+
attentionRequired.sort((left, right) => {
|
|
21
|
+
if (left.room !== right.room)
|
|
22
|
+
return left.room < right.room ? -1 : 1;
|
|
23
|
+
if (left.path !== right.path)
|
|
24
|
+
return left.path < right.path ? -1 : 1;
|
|
25
|
+
return 0;
|
|
26
|
+
});
|
|
27
|
+
const changed = new Map();
|
|
28
|
+
if (!localSaves) {
|
|
29
|
+
for (const change of held.unsent) {
|
|
30
|
+
if (!isFenced(change.room))
|
|
31
|
+
changed.set(`${change.room}\u0000${change.path}`, change);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const unsent = [...changed]
|
|
35
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
36
|
+
.map(([, change]) => change);
|
|
37
|
+
return {
|
|
38
|
+
queued: !localSaves && held.queued.some((locator) => !isFenced(locator)),
|
|
39
|
+
lastCompleted: held.lastCompleted,
|
|
40
|
+
attentionRequired,
|
|
41
|
+
unsent,
|
|
42
|
+
reset: held.resets.reduce((earliest, { locator, reset }) => isFenced(locator) || (earliest !== null && earliest <= reset) ? earliest : reset, null),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async function queuedWork({ store, localSaves }) {
|
|
46
|
+
const held = await (await store.open()).queued();
|
|
47
|
+
return !localSaves && held.some((locator) => !store.fences.has(locator));
|
|
48
|
+
}
|
|
49
|
+
export function recoverReads({ liveQueries, figures }) {
|
|
50
|
+
liveQueries.recover();
|
|
51
|
+
figures.recover();
|
|
52
|
+
}
|
|
53
|
+
export function emitRooms(runtime, changed) {
|
|
54
|
+
recoverReads(runtime);
|
|
55
|
+
runtime.store.readiness.queue();
|
|
56
|
+
return changed === undefined
|
|
57
|
+
? publishRooms(runtime, 'all')
|
|
58
|
+
: publishRooms(runtime, 'changed', changed);
|
|
59
|
+
}
|
|
60
|
+
export function emitKnownRooms(runtime) {
|
|
61
|
+
conversationsLearned(runtime.conversations);
|
|
62
|
+
if (runtime.store.watching(ROOMS_TOPIC, 'waiting').length === 0)
|
|
63
|
+
return;
|
|
64
|
+
void publishRooms(runtime, 'known');
|
|
65
|
+
}
|
|
66
|
+
function roomsOwedWith(held, mode, touched) {
|
|
67
|
+
if (held === undefined) {
|
|
68
|
+
return {
|
|
69
|
+
all: mode === 'all',
|
|
70
|
+
changed: new Set(mode === 'changed' ? touched : []),
|
|
71
|
+
counted: new Set(mode === 'changed' ? [] : touched),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
held.all ||= mode === 'all';
|
|
75
|
+
for (const locator of touched) {
|
|
76
|
+
(mode === 'changed' ? held.changed : held.counted).add(locator);
|
|
77
|
+
}
|
|
78
|
+
return held;
|
|
79
|
+
}
|
|
80
|
+
async function deliverRooms(runtime, owed) {
|
|
81
|
+
const { store, socket } = runtime;
|
|
82
|
+
const waiting = () => store.watching(ROOMS_TOPIC, 'waiting');
|
|
83
|
+
if (socket.closed() || store.watching(ROOMS_TOPIC).length === 0)
|
|
84
|
+
return;
|
|
85
|
+
const patched = owed.all || owed.changed.size === 0 || waiting().length > 0
|
|
86
|
+
? null
|
|
87
|
+
: await patchedListing(runtime, new Set([...owed.changed, ...owed.counted]));
|
|
88
|
+
if (patched === null && owed.changed.size > 0)
|
|
89
|
+
owed.all = true;
|
|
90
|
+
if (patched === null && !owed.all && owed.counted.size > 0) {
|
|
91
|
+
const held = await store.covering().catch(() => null);
|
|
92
|
+
if (held === null)
|
|
93
|
+
return;
|
|
94
|
+
const { roomsShown } = store.device.now();
|
|
95
|
+
owed.all = [...owed.counted].some((locator) => held.rooms.has(locator) &&
|
|
96
|
+
roomsShown?.get(locator)?.documents !== held.rooms.get(locator).documents);
|
|
97
|
+
if (owed.all) {
|
|
98
|
+
recoverReads(runtime);
|
|
99
|
+
store.readiness.queue();
|
|
100
|
+
}
|
|
101
|
+
else if (waiting().length === 0)
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const listing = patched ?? (await listingNow(runtime).catch(() => null));
|
|
105
|
+
if (listing === null || socket.closed())
|
|
106
|
+
return;
|
|
107
|
+
const value = shownRooms(runtime, listing);
|
|
108
|
+
const { roomsListed, refusal, moving } = socket.session.now();
|
|
109
|
+
const joining = waiting().length > 0 &&
|
|
110
|
+
(roomsListed || listing.size > 0 || refusal !== null || moving.providerUnreachable);
|
|
111
|
+
if (!owed.all && patched === null && !joining)
|
|
112
|
+
return;
|
|
113
|
+
const { roomsShown } = store.device.now();
|
|
114
|
+
const moved = owed.all ||
|
|
115
|
+
patched !== null ||
|
|
116
|
+
(roomsShown !== null &&
|
|
117
|
+
JSON.stringify(shownRooms(runtime, roomsShown)) !== JSON.stringify(value));
|
|
118
|
+
if (moved)
|
|
119
|
+
for (const watcher of store.watching(ROOMS_TOPIC, 'ready'))
|
|
120
|
+
watcher.answer(value);
|
|
121
|
+
if (joining)
|
|
122
|
+
for (const watcher of waiting())
|
|
123
|
+
watcher.answer(value);
|
|
124
|
+
store.device.set({
|
|
125
|
+
roomsShown: store.watching(ROOMS_TOPIC, 'ready').length === 0 ? null : listing,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
function publishRooms(runtime, mode, touched = []) {
|
|
129
|
+
if (runtime.socket.closed())
|
|
130
|
+
return Promise.resolve();
|
|
131
|
+
return runtime.store.owing(ROOMS_TOPIC, (held) => roomsOwedWith(held, mode, touched), (owed) => deliverRooms(runtime, owed));
|
|
132
|
+
}
|
|
133
|
+
export function emitRefusal(runtime) {
|
|
134
|
+
const { store, socket } = runtime;
|
|
135
|
+
store.readiness.queue();
|
|
136
|
+
store.tell(REFUSAL_TOPIC, socket.session.now().refusal);
|
|
137
|
+
emitKnownRooms(runtime);
|
|
138
|
+
}
|
|
139
|
+
export function emitStorageLoss({ store }) {
|
|
140
|
+
store.readiness.queue();
|
|
141
|
+
store.tell(STORAGE_LOSS_TOPIC, store.device.now().storageLoss);
|
|
142
|
+
}
|
|
143
|
+
export function emitMember({ store }, member) {
|
|
144
|
+
store.tell(MEMBER_TOPIC, member);
|
|
145
|
+
}
|
|
146
|
+
async function deliverStatus(runtime, owed) {
|
|
147
|
+
const { store, socket } = runtime;
|
|
148
|
+
const held = await attended(runtime);
|
|
149
|
+
if (socket.closed())
|
|
150
|
+
return;
|
|
151
|
+
for (const { moving, current } of owed) {
|
|
152
|
+
const state = moving.resting && held.queued ? 'pending' : moving.state;
|
|
153
|
+
const next = {
|
|
154
|
+
state: state === 'synced' && !current ? 'syncing' : state,
|
|
155
|
+
lastCompleted: held.lastCompleted,
|
|
156
|
+
providerUnreachable: moving.providerUnreachable,
|
|
157
|
+
attentionRequired: held.attentionRequired,
|
|
158
|
+
unsent: held.unsent,
|
|
159
|
+
reset: held.reset,
|
|
160
|
+
};
|
|
161
|
+
if (same(store.device.now().status, next))
|
|
162
|
+
continue;
|
|
163
|
+
store.device.set({ status: next });
|
|
164
|
+
store.tell(STATUS_TOPIC, next);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
export function show(runtime) {
|
|
168
|
+
const { store, socket, conversations } = runtime;
|
|
169
|
+
if (socket.closed())
|
|
170
|
+
return Promise.resolve();
|
|
171
|
+
store.readiness.queue();
|
|
172
|
+
emitKnownRooms(runtime);
|
|
173
|
+
const moved = { moving: socket.session.now().moving, current: conversations.current() };
|
|
174
|
+
return store.owing(STATUS_TOPIC, (held) => {
|
|
175
|
+
if (held === undefined)
|
|
176
|
+
return [moved];
|
|
177
|
+
held.push(moved);
|
|
178
|
+
return held;
|
|
179
|
+
}, (owed) => deliverStatus(runtime, owed));
|
|
180
|
+
}
|
|
181
|
+
export function moveTo(runtime, next) {
|
|
182
|
+
if (runtime.socket.closed())
|
|
183
|
+
return Promise.resolve();
|
|
184
|
+
runtime.socket.session.set({ moving: next });
|
|
185
|
+
return show(runtime);
|
|
186
|
+
}
|
|
187
|
+
export function statusShown(runtime) {
|
|
188
|
+
return moveTo(runtime, runtime.socket.session.now().moving);
|
|
189
|
+
}
|
|
190
|
+
export function transferring({ socket }) {
|
|
191
|
+
return { ...socket.session.now().moving, state: 'syncing', resting: false };
|
|
192
|
+
}
|
|
193
|
+
export function pendingShown(runtime) {
|
|
194
|
+
const { socket, localSaves } = runtime;
|
|
195
|
+
if (!localSaves)
|
|
196
|
+
socket.session.set({ recorded: false });
|
|
197
|
+
const { moving } = socket.session.now();
|
|
198
|
+
return moveTo(runtime, localSaves ? moving : { ...moving, state: 'pending', resting: false });
|
|
199
|
+
}
|
|
200
|
+
function entryOf({ localSaves }, states, batch) {
|
|
201
|
+
if (localSaves)
|
|
202
|
+
return Object.freeze({ batch, state: 'local' });
|
|
203
|
+
const state = states.get(batch.id);
|
|
204
|
+
return Object.freeze({ batch, ...(state?.submission ?? { state: 'waiting' }) });
|
|
205
|
+
}
|
|
206
|
+
export async function entriesOf(runtime, locator) {
|
|
207
|
+
const { store } = runtime;
|
|
208
|
+
if (store.fences.has(locator))
|
|
209
|
+
return [];
|
|
210
|
+
const { queue, states } = await store.work(locator);
|
|
211
|
+
return queue.map((batch) => entryOf(runtime, states, batch));
|
|
212
|
+
}
|
|
213
|
+
function emitQueue(runtime, locator) {
|
|
214
|
+
const { store, socket } = runtime;
|
|
215
|
+
const listening = () => store.watching(queueTopic(locator));
|
|
216
|
+
if (socket.closed() || listening().length === 0)
|
|
217
|
+
return Promise.resolve();
|
|
218
|
+
return store.publication(async () => {
|
|
219
|
+
if (socket.closed() || listening().length === 0)
|
|
220
|
+
return;
|
|
221
|
+
const entries = await entriesOf(runtime, locator);
|
|
222
|
+
if (socket.closed())
|
|
223
|
+
return;
|
|
224
|
+
for (const watcher of listening())
|
|
225
|
+
watcher.answer(entries);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
export function publishChangeSet(runtime, set) {
|
|
229
|
+
const { store, liveQueries, figures, conversations } = runtime;
|
|
230
|
+
liveQueries.touched(set);
|
|
231
|
+
figures.touched(set);
|
|
232
|
+
for (const { locator, path } of set.documents) {
|
|
233
|
+
if (path !== null)
|
|
234
|
+
store.attached.drop(locator, path);
|
|
235
|
+
}
|
|
236
|
+
const shownNow = [];
|
|
237
|
+
if (set.queues.length > 0 || set.drafts.length > 0)
|
|
238
|
+
shownNow.push(show(runtime));
|
|
239
|
+
if (set.rooms.length > 0)
|
|
240
|
+
shownNow.push(emitRooms(runtime, set.rooms));
|
|
241
|
+
else if (set.documents.length > 0) {
|
|
242
|
+
shownNow.push(publishRooms(runtime, 'counted', [...new Set(set.documents.map(({ locator }) => locator))]));
|
|
243
|
+
}
|
|
244
|
+
for (const locator of set.queues)
|
|
245
|
+
shownNow.push(emitQueue(runtime, locator));
|
|
246
|
+
if (set.drafts.length > 0)
|
|
247
|
+
shownNow.push(publishRoomDrafts(runtime, false));
|
|
248
|
+
else if (set.documents.length > 0) {
|
|
249
|
+
shownNow.push(publishRoomDrafts(runtime, false, set.documents));
|
|
250
|
+
}
|
|
251
|
+
for (const app of set.presentations)
|
|
252
|
+
shownNow.push(emitPresentation(runtime, app));
|
|
253
|
+
conversationsChanged(conversations, set);
|
|
254
|
+
return Promise.all(shownNow).then(() => undefined);
|
|
255
|
+
}
|
|
256
|
+
export function roomUnreadable(runtime, room) {
|
|
257
|
+
runtime.socket.rooms.stand(room.locator, { unreadable: true });
|
|
258
|
+
list(runtime, room, false);
|
|
259
|
+
emitRooms(runtime);
|
|
260
|
+
}
|
|
261
|
+
export async function rest(runtime, progress, live = () => !runtime.socket.closed()) {
|
|
262
|
+
const { store, socket } = runtime;
|
|
263
|
+
const { session, lanes, rooms } = socket;
|
|
264
|
+
if (!live())
|
|
265
|
+
return;
|
|
266
|
+
const settled = () => session.now().complete &&
|
|
267
|
+
lanes.roomWork() === 0 &&
|
|
268
|
+
!socket.naming() &&
|
|
269
|
+
rooms.standingWhere(({ stale }) => stale).length === 0;
|
|
270
|
+
let synced = settled();
|
|
271
|
+
if (synced && !session.now().recorded) {
|
|
272
|
+
const queued = await queuedWork(runtime).catch(() => true);
|
|
273
|
+
if (!live())
|
|
274
|
+
return;
|
|
275
|
+
synced = !queued && settled();
|
|
276
|
+
}
|
|
277
|
+
if (synced && !session.now().recorded) {
|
|
278
|
+
const completedAt = new Date().toISOString();
|
|
279
|
+
try {
|
|
280
|
+
await (await store.open()).fact('lastCompleted', completedAt);
|
|
281
|
+
if (!live())
|
|
282
|
+
return;
|
|
283
|
+
session.set({ recorded: true });
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
synced = false;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
const { complete, moving } = session.now();
|
|
290
|
+
moveTo(runtime, {
|
|
291
|
+
state: synced && complete && lanes.roomWork() === 0 && !socket.naming() ? 'synced' : 'syncing',
|
|
292
|
+
providerUnreachable: progress === null ? moving.providerUnreachable : !progress.reachable,
|
|
293
|
+
resting: true,
|
|
294
|
+
});
|
|
295
|
+
}
|