@agentshouse/mdruntime 0.1.0-caee7332d2235 → 0.1.0-caf080a9a9c60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -16
- package/dist/acceptance.d.ts +3 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +318 -0
- package/dist/act-lanes.d.ts +29 -0
- package/dist/act-lanes.d.ts.map +1 -0
- package/dist/act-lanes.js +177 -0
- package/dist/actions.d.ts +25 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +261 -0
- package/dist/adapter.d.ts +162 -122
- 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 +30 -11
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +309 -113
- 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 +10 -16
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +17 -94
- 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 +33 -19
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +112 -21
- package/dist/collection.d.ts +29 -22
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +47 -354
- 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 +7 -137
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +111 -3623
- 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 +138 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +249 -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 +66 -49
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +962 -799
- 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 +153 -0
- package/dist/durability.d.ts +19 -4
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +5 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +33 -29
- 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 +20 -8
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +103 -45
- package/dist/identity.d.ts +0 -2
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -6
- package/dist/index.d.ts +39 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -4
- package/dist/install.d.ts +54 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +539 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +279 -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 +33 -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 +50 -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 +17 -7
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +272 -118
- package/dist/messages.d.ts +49 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +150 -0
- package/dist/model.d.ts +8 -11
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +6 -23
- package/dist/models.d.ts +10 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +156 -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 +15 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +98 -14
- 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 +59 -0
- package/dist/outcome.d.ts +47 -9
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +56 -2
- package/dist/overlay.d.ts +7 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +69 -169
- 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 +3 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +10 -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 +233 -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 +285 -0
- package/dist/query.d.ts +21 -207
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -493
- 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 +465 -0
- package/dist/reach.d.ts +20 -9
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +306 -111
- package/dist/react.d.ts +15 -2
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +33 -1
- 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 +13 -17
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +2 -8
- package/dist/reads.d.ts +38 -10
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +163 -83
- package/dist/recovery.d.ts +5 -2
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +65 -8
- package/dist/refresh.d.ts +18 -15
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +145 -79
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +57 -0
- package/dist/replica.d.ts +50 -39
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +319 -208
- 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 +28 -11
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +194 -117
- 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 +31 -31
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +60 -125
- package/dist/runtime.d.ts +36 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +43 -50
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +661 -228
- package/dist/saves.d.ts +32 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +413 -0
- package/dist/search.d.ts +12 -95
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +10 -266
- package/dist/seed.d.ts +11 -2
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +71 -1
- package/dist/shared.d.ts +4 -9
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +61 -120
- package/dist/shown.d.ts +32 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +290 -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 +21 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +80 -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 +68 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +171 -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 +4 -5
- 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 +212 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +430 -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 -166
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +158 -797
- package/dist/stored.d.ts +156 -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 +223 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +540 -0
- package/dist/tables.d.ts +412 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +737 -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 +1 -1
- package/dist/turn.d.ts.map +1 -1
- package/dist/turn.js +31 -20
- 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 +1 -16
- package/dist/windows.d.ts.map +1 -1
- package/dist/windows.js +2 -79
- package/dist/wire.d.ts +72 -8
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +24 -5
- package/package.json +19 -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 -70
- package/dist/chat/acts.d.ts +0 -33
- package/dist/chat/acts.d.ts.map +0 -1
- package/dist/chat/acts.js +0 -36
- package/dist/chat/context.d.ts +0 -3
- package/dist/chat/context.d.ts.map +0 -1
- package/dist/chat/earlier.d.ts +0 -10
- package/dist/chat/earlier.d.ts.map +0 -1
- package/dist/chat/earlier.js +0 -54
- package/dist/chat/input.d.ts +0 -9
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -99
- package/dist/chat/kit.d.ts +0 -61
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -27
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -99
- package/dist/chat/markdown.d.ts +0 -21
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -246
- package/dist/chat/message.d.ts +0 -6
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -192
- package/dist/chat/messages.d.ts +0 -22
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -171
- 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/pieces.d.ts +0 -62
- package/dist/chat/pieces.d.ts.map +0 -1
- package/dist/chat/pieces.js +0 -1110
- 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 -630
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -69
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/read.d.ts.map +0 -1
- package/dist/chat/ready.d.ts +0 -34
- package/dist/chat/ready.d.ts.map +0 -1
- package/dist/chat/ready.js +0 -91
- package/dist/chat/steady.d.ts +0 -3
- package/dist/chat/steady.d.ts.map +0 -1
- package/dist/chat/steady.js +0 -26
- package/dist/chat/style.d.ts +0 -4
- package/dist/chat/style.d.ts.map +0 -1
- package/dist/chat/style.js +0 -302
- package/dist/chat.d.ts +0 -14
- package/dist/chat.d.ts.map +0 -1
- package/dist/chat.js +0 -8
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- package/dist/read-side.d.ts +0 -27
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -826
package/dist/store.js
CHANGED
|
@@ -1,816 +1,177 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
[QUEUES, { keyPath: 'locator' }],
|
|
35
|
-
[PENDING_CHANGES, { keyPath: ['locator', 'id'] }],
|
|
36
|
-
[ROOM_DRAFTS, { keyPath: ['locator', 'path'] }],
|
|
37
|
-
[CHAT_DRAFTS, { keyPath: 'conversation' }],
|
|
38
|
-
[CALLS, { keyPath: 'operation' }],
|
|
39
|
-
[FACTS, undefined],
|
|
40
|
-
[FENCES, { keyPath: 'locator' }],
|
|
41
|
-
];
|
|
42
|
-
const REPLICA_STORES = [
|
|
43
|
-
[ROOMS, { keyPath: 'locator' }],
|
|
44
|
-
[DOCUMENTS, { keyPath: ['locator', 'transfer', 'path'] }],
|
|
45
|
-
[BINARY_FILES, { keyPath: ['locator', 'transfer', 'path'] }],
|
|
46
|
-
[TRANSFERS, { keyPath: 'locator' }],
|
|
47
|
-
[RECEIVED, { keyPath: 'key' }],
|
|
48
|
-
[RECEIVED_PARTS, { keyPath: ['key', 'index'] }],
|
|
49
|
-
[DECLARATIONS, undefined],
|
|
50
|
-
[PRESENTATION, { keyPath: 'app' }],
|
|
51
|
-
[CONVERSATIONS, { keyPath: 'conversation' }],
|
|
52
|
-
[MESSAGES, { keyPath: ['conversation', 'identity'] }],
|
|
53
|
-
];
|
|
54
|
-
const READ_BATCH = 256;
|
|
55
|
-
const MESSAGE_INDEXES = [
|
|
56
|
-
['conversation', 'conversation'],
|
|
57
|
-
['position', ['conversation', 'position']],
|
|
58
|
-
['turn', ['conversation', 'turn']],
|
|
59
|
-
];
|
|
60
|
-
function settled(request) {
|
|
61
|
-
return new Promise((resolve, reject) => {
|
|
62
|
-
request.onsuccess = () => resolve(request.result);
|
|
63
|
-
request.onerror = () => reject(request.error);
|
|
1
|
+
import { schemaTypes } from './attached-model.js';
|
|
2
|
+
import { createCell } from './cell.js';
|
|
3
|
+
import { openedFiles } from './opened.js';
|
|
4
|
+
import { compositionOf } from './replica.js';
|
|
5
|
+
import { STARTING } from './status.js';
|
|
6
|
+
import { createInstalls, NO_INSTALL } from './store/installs.js';
|
|
7
|
+
import { openRuntimeStore, } from './store/records.js';
|
|
8
|
+
import { createReadinessQueue } from './store/readiness.js';
|
|
9
|
+
import { createRoomHeld } from './store/room-held.js';
|
|
10
|
+
import { createSpace } from './store/space.js';
|
|
11
|
+
import { createWatchers } from './store/watchers.js';
|
|
12
|
+
import { createWrites } from './store/writes.js';
|
|
13
|
+
const OPENING = 'store';
|
|
14
|
+
export function createStore(options) {
|
|
15
|
+
const writes = createWrites();
|
|
16
|
+
const watchers = createWatchers(options.unpublished);
|
|
17
|
+
const { lost } = options;
|
|
18
|
+
const installs = createInstalls();
|
|
19
|
+
const seeds = new Map();
|
|
20
|
+
const landed = createRoomHeld();
|
|
21
|
+
const attached = createRoomHeld();
|
|
22
|
+
const typesHeld = new Map();
|
|
23
|
+
const device = createCell({
|
|
24
|
+
persistence: options.persistence,
|
|
25
|
+
storageLoss: null,
|
|
26
|
+
heldWhenOpened: false,
|
|
27
|
+
preparing: false,
|
|
28
|
+
sweeping: false,
|
|
29
|
+
unpreparedDemand: new Set(),
|
|
30
|
+
unpreparable: new Set(),
|
|
31
|
+
establishing: new Set(),
|
|
32
|
+
status: STARTING,
|
|
33
|
+
roomsShown: null,
|
|
64
34
|
});
|
|
65
|
-
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const before = idle(database);
|
|
76
|
-
const queued = before.then(() => turn);
|
|
77
|
-
turns.set(database.name, queued);
|
|
78
|
-
void queued.then(() => {
|
|
79
|
-
if (turns.get(database.name) === queued)
|
|
80
|
-
turns.delete(database.name);
|
|
81
|
-
});
|
|
82
|
-
return before.then(() => {
|
|
83
|
-
let transaction;
|
|
84
|
-
try {
|
|
85
|
-
transaction = database.transaction(stores, mode);
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
release();
|
|
35
|
+
const space = createSpace(options.database, options.spaceFreed);
|
|
36
|
+
const readiness = createReadinessQueue(options.deliverReadiness, options.unpublished);
|
|
37
|
+
let opening;
|
|
38
|
+
function open() {
|
|
39
|
+
opening ??= options.opening(openRuntimeStore(options.database)).then((opened) => {
|
|
40
|
+
options.retries.succeeded('database', OPENING);
|
|
41
|
+
return opened;
|
|
42
|
+
}, (error) => {
|
|
43
|
+
opening = undefined;
|
|
44
|
+
options.retries.failed('database', OPENING, error);
|
|
89
45
|
throw error;
|
|
90
|
-
}
|
|
91
|
-
const committed = new Promise((resolve, reject) => {
|
|
92
|
-
transaction.oncomplete = () => {
|
|
93
|
-
release();
|
|
94
|
-
resolve();
|
|
95
|
-
};
|
|
96
|
-
transaction.onabort = () => {
|
|
97
|
-
release();
|
|
98
|
-
reject(transaction.error);
|
|
99
|
-
};
|
|
100
|
-
transaction.onerror = () => reject(transaction.error);
|
|
101
46
|
});
|
|
102
|
-
|
|
103
|
-
try {
|
|
104
|
-
value = work(transaction);
|
|
105
|
-
}
|
|
106
|
-
catch (error) {
|
|
107
|
-
void committed.catch(() => { });
|
|
108
|
-
transaction.abort();
|
|
109
|
-
throw error;
|
|
110
|
-
}
|
|
111
|
-
return Promise.all([value, committed]).then(([held]) => held);
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
const EMPTY_DECLARATIONS = {
|
|
115
|
-
lastCompleted: null,
|
|
116
|
-
providerLimits: [],
|
|
117
|
-
capabilities: [],
|
|
118
|
-
};
|
|
119
|
-
function declaration(database) {
|
|
120
|
-
return transacted(database, DECLARATIONS, 'readonly', (transaction) => settled(transaction.objectStore(DECLARATIONS).get(CURRENT))).then((record) => record ?? EMPTY_DECLARATIONS);
|
|
121
|
-
}
|
|
122
|
-
function updateDeclaration(database, update) {
|
|
123
|
-
return transacted(database, DECLARATIONS, 'readwrite', (transaction) => {
|
|
124
|
-
const store = transaction.objectStore(DECLARATIONS);
|
|
125
|
-
const prior = store.get(CURRENT);
|
|
126
|
-
prior.onsuccess = () => {
|
|
127
|
-
store.put(update(prior.result ?? EMPTY_DECLARATIONS), CURRENT);
|
|
128
|
-
};
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
function amendPending(database, locator, id, amendment) {
|
|
132
|
-
return transacted(database, PENDING_CHANGES, 'readwrite', (transaction) => {
|
|
133
|
-
const pending = transaction.objectStore(PENDING_CHANGES);
|
|
134
|
-
const request = pending.get([locator, id]);
|
|
135
|
-
request.onsuccess = () => {
|
|
136
|
-
const record = request.result;
|
|
137
|
-
if (record !== undefined)
|
|
138
|
-
pending.put({ ...record, ...amendment });
|
|
139
|
-
};
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
function accepted({ conversation: _held, ...message }) {
|
|
143
|
-
return message;
|
|
144
|
-
}
|
|
145
|
-
function roomRecord(record) {
|
|
146
|
-
const { documents, binaries, revisions, fileIds, changes, written, ...room } = record;
|
|
147
|
-
return room;
|
|
148
|
-
}
|
|
149
|
-
function chatDraftRecord(record) {
|
|
150
|
-
return { ...record, revision: record.revision ?? '' };
|
|
151
|
-
}
|
|
152
|
-
function underTransfer(locator, transfer, after) {
|
|
153
|
-
return after === undefined
|
|
154
|
-
? IDBKeyRange.bound([locator, transfer], [locator, transfer, []])
|
|
155
|
-
: IDBKeyRange.bound([locator, transfer, after], [locator, transfer, []], true);
|
|
156
|
-
}
|
|
157
|
-
function underRoom(locator) {
|
|
158
|
-
return IDBKeyRange.bound([locator], [locator, []]);
|
|
159
|
-
}
|
|
160
|
-
async function readTransfer(store, locator, transfer, receive) {
|
|
161
|
-
let range = underTransfer(locator, transfer);
|
|
162
|
-
for (;;) {
|
|
163
|
-
const batch = await settled(store.getAll(range, READ_BATCH));
|
|
164
|
-
for (const record of batch)
|
|
165
|
-
receive(record);
|
|
166
|
-
if (batch.length < READ_BATCH)
|
|
167
|
-
return;
|
|
168
|
-
range = underTransfer(locator, transfer, batch[batch.length - 1].path);
|
|
47
|
+
return opening;
|
|
169
48
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
const head = (held) => {
|
|
177
|
-
if (held.revision !== null)
|
|
178
|
-
layer.revisions[held.path] = held.revision;
|
|
179
|
-
if (held.fileId !== null)
|
|
180
|
-
layer.fileIds[held.path] = held.fileId;
|
|
181
|
-
if (held.change !== null)
|
|
182
|
-
layer.changes[held.path] = held.change;
|
|
183
|
-
};
|
|
184
|
-
await readTransfer(transaction.objectStore(DOCUMENTS), locator, transfer, (document) => {
|
|
185
|
-
layer.documents[document.path] = document.content;
|
|
186
|
-
if (document.written !== null)
|
|
187
|
-
layer.written[document.path] = document.written;
|
|
188
|
-
head(document);
|
|
189
|
-
});
|
|
190
|
-
await readTransfer(transaction.objectStore(BINARY_FILES), locator, transfer, (file) => {
|
|
191
|
-
layer.binaries[file.path] = file.binary;
|
|
192
|
-
head(file);
|
|
193
|
-
});
|
|
194
|
-
return layer;
|
|
195
|
-
}
|
|
196
|
-
function documentRecord(locator, transfer, layer, path) {
|
|
197
|
-
return {
|
|
198
|
-
locator,
|
|
199
|
-
transfer,
|
|
200
|
-
path,
|
|
201
|
-
content: layer.documents[path],
|
|
202
|
-
revision: layer.revisions[path] ?? null,
|
|
203
|
-
fileId: layer.fileIds[path] ?? null,
|
|
204
|
-
change: layer.changes[path] ?? null,
|
|
205
|
-
written: layer.written[path] ?? null,
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
function binaryFileRecord(locator, transfer, layer, path) {
|
|
209
|
-
return {
|
|
210
|
-
locator,
|
|
211
|
-
transfer,
|
|
212
|
-
path,
|
|
213
|
-
revision: layer.revisions[path] ?? null,
|
|
214
|
-
fileId: layer.fileIds[path] ?? null,
|
|
215
|
-
change: layer.changes[path] ?? null,
|
|
216
|
-
binary: layer.binaries[path],
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
function* changedIn(next, base) {
|
|
220
|
-
if (base === null)
|
|
221
|
-
return new Set([...Object.keys(next.documents), ...Object.keys(next.binaries)]);
|
|
222
|
-
return new Set([
|
|
223
|
-
...(yield* differences(base.documents, next.documents)),
|
|
224
|
-
...(yield* differences(base.revisions, next.revisions)),
|
|
225
|
-
...(yield* differences(base.fileIds, next.fileIds)),
|
|
226
|
-
...(yield* differences(base.written, next.written)),
|
|
227
|
-
...(yield* differences(base.changes, next.changes, sameChange)),
|
|
228
|
-
...(yield* differences(base.binaries, next.binaries, sameBinary)),
|
|
229
|
-
]);
|
|
230
|
-
}
|
|
231
|
-
function writeLayer(transaction, locator, transfer, layer) {
|
|
232
|
-
const { next, base, paths } = layer;
|
|
233
|
-
const documents = transaction.objectStore(DOCUMENTS);
|
|
234
|
-
const files = transaction.objectStore(BINARY_FILES);
|
|
235
|
-
let last = null;
|
|
236
|
-
return inUnits(paths, (path) => {
|
|
237
|
-
if (next.documents[path] !== undefined) {
|
|
238
|
-
last = documents.put(documentRecord(locator, transfer, next, path));
|
|
239
|
-
}
|
|
240
|
-
else if (base?.documents[path] !== undefined) {
|
|
241
|
-
last = documents.delete([locator, transfer, path]);
|
|
242
|
-
}
|
|
243
|
-
if (next.binaries[path] !== undefined) {
|
|
244
|
-
last = files.put(binaryFileRecord(locator, transfer, next, path));
|
|
245
|
-
}
|
|
246
|
-
else if (base?.binaries[path] !== undefined) {
|
|
247
|
-
last = files.delete([locator, transfer, path]);
|
|
248
|
-
}
|
|
249
|
-
return ROW_WEIGHT + (next.documents[path]?.length ?? 0);
|
|
250
|
-
}, () => { }, () => {
|
|
251
|
-
const request = last;
|
|
252
|
-
last = null;
|
|
253
|
-
return request === null
|
|
254
|
-
? Promise.resolve()
|
|
255
|
-
: new Promise((resolve) => request.addEventListener('success', () => resolve()));
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
function removeRoomEntries(store, locator) {
|
|
259
|
-
const keys = store.getAllKeys();
|
|
260
|
-
keys.onsuccess = () => {
|
|
261
|
-
for (const key of keys.result) {
|
|
262
|
-
if (Array.isArray(key) && key[0] === locator)
|
|
263
|
-
store.delete(key);
|
|
264
|
-
}
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
function removeDatabase(name) {
|
|
268
|
-
return new Promise((resolve, reject) => {
|
|
269
|
-
const removal = indexedDB.deleteDatabase(name);
|
|
270
|
-
removal.onsuccess = () => resolve();
|
|
271
|
-
removal.onerror = () => reject(removal.error);
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
export async function authoredHolder() {
|
|
275
|
-
const authored = await openAuthored();
|
|
276
|
-
try {
|
|
277
|
-
const held = await transacted(authored, FACTS, 'readonly', (transaction) => settled(transaction.objectStore(FACTS).get(HOLDER)));
|
|
278
|
-
return typeof held === 'string' ? held : null;
|
|
279
|
-
}
|
|
280
|
-
finally {
|
|
281
|
-
authored.close();
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
export async function authoredBy(holder) {
|
|
285
|
-
const authored = await openAuthored();
|
|
286
|
-
try {
|
|
287
|
-
let owned = true;
|
|
288
|
-
await transacted(authored, FACTS, 'readwrite', (transaction) => {
|
|
289
|
-
const facts = transaction.objectStore(FACTS);
|
|
290
|
-
const held = facts.get(HOLDER);
|
|
291
|
-
held.onsuccess = () => {
|
|
292
|
-
if (held.result === undefined)
|
|
293
|
-
facts.put(holder, HOLDER);
|
|
294
|
-
else
|
|
295
|
-
owned = held.result === holder;
|
|
296
|
-
};
|
|
49
|
+
function prepareAgain(locator) {
|
|
50
|
+
const { unpreparable } = device.now();
|
|
51
|
+
device.set({
|
|
52
|
+
unpreparable: locator === undefined
|
|
53
|
+
? new Set()
|
|
54
|
+
: new Set([...unpreparable].filter((held) => held !== locator)),
|
|
297
55
|
});
|
|
298
|
-
return owned;
|
|
299
56
|
}
|
|
300
|
-
|
|
301
|
-
|
|
57
|
+
function typed(locator, persisted) {
|
|
58
|
+
if (persisted.status === 'unavailable')
|
|
59
|
+
return persisted;
|
|
60
|
+
const schema = persisted.snapshot.schema;
|
|
61
|
+
const held = typesHeld.get(locator);
|
|
62
|
+
if (held !== undefined && held.schema === schema)
|
|
63
|
+
return { ...persisted, types: held.types };
|
|
64
|
+
const types = schemaTypes(schema, options.roomTypes);
|
|
65
|
+
typesHeld.set(locator, { schema, types });
|
|
66
|
+
return { ...persisted, types };
|
|
302
67
|
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
const authored = await openAuthored();
|
|
306
|
-
try {
|
|
307
|
-
const held = await transacted(authored, FACTS, 'readonly', (transaction) => settled(transaction.objectStore(FACTS).get(BINDING)));
|
|
308
|
-
return typeof held === 'string' ? held : null;
|
|
68
|
+
function recordOf(stored) {
|
|
69
|
+
return { ...stored, model: typed(stored.locator, stored.model) };
|
|
309
70
|
}
|
|
310
|
-
|
|
311
|
-
|
|
71
|
+
async function rooms(locators) {
|
|
72
|
+
const held = await (await open()).rooms(locators);
|
|
73
|
+
return new Map(held
|
|
74
|
+
.filter(({ record }) => !lost(record.locator))
|
|
75
|
+
.map(({ record, indexed, documents }) => [
|
|
76
|
+
record.locator,
|
|
77
|
+
{ record: recordOf(record), indexed, documents },
|
|
78
|
+
]));
|
|
312
79
|
}
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
80
|
+
async function work(locator) {
|
|
81
|
+
if (lost(locator))
|
|
82
|
+
return { replica: undefined, queue: [], states: new Map() };
|
|
83
|
+
const { room, queue } = await (await open()).room(locator);
|
|
84
|
+
const batches = queue.map(({ batch }) => batch);
|
|
85
|
+
const states = new Map(queue.map(({ batch, state }) => [batch.id, state]));
|
|
86
|
+
return {
|
|
87
|
+
replica: room === null
|
|
88
|
+
? undefined
|
|
89
|
+
: { record: recordOf(room.record), queue: batches, states, overlaid: room.overlaid },
|
|
90
|
+
queue: batches,
|
|
91
|
+
states,
|
|
92
|
+
};
|
|
320
93
|
}
|
|
321
|
-
|
|
322
|
-
|
|
94
|
+
async function drafts(locator, paths) {
|
|
95
|
+
const held = await (await open()).roomDrafts(locator, paths);
|
|
96
|
+
return held.filter((record) => !lost(record.locator));
|
|
323
97
|
}
|
|
324
|
-
}
|
|
325
|
-
export async function removeRuntimeStore(holder) {
|
|
326
|
-
await removeDatabase(DATABASE);
|
|
327
|
-
if (holder !== undefined && (await authoredBy(holder)))
|
|
328
|
-
return true;
|
|
329
|
-
await removeDatabase(AUTHORED);
|
|
330
|
-
return false;
|
|
331
|
-
}
|
|
332
|
-
export function openDatabase(name, version, upgrade) {
|
|
333
|
-
return new Promise((resolve, reject) => {
|
|
334
|
-
const opening = indexedDB.open(name, version);
|
|
335
|
-
opening.onupgradeneeded = (event) => upgrade(opening, event.oldVersion);
|
|
336
|
-
opening.onsuccess = () => resolve(opening.result);
|
|
337
|
-
opening.onerror = () => {
|
|
338
|
-
if (opening.error?.name !== 'VersionError') {
|
|
339
|
-
reject(opening.error);
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
removeDatabase(name)
|
|
343
|
-
.then(() => openDatabase(name, version, upgrade))
|
|
344
|
-
.then(resolve, reject);
|
|
345
|
-
};
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
function openReplica() {
|
|
349
|
-
return openDatabase(DATABASE, STORE_SCHEMA, (opening, oldVersion) => {
|
|
350
|
-
const database = opening.result;
|
|
351
|
-
if (oldVersion < REPLICA_SHAPE) {
|
|
352
|
-
for (const name of [...database.objectStoreNames])
|
|
353
|
-
database.deleteObjectStore(name);
|
|
354
|
-
}
|
|
355
|
-
for (const [name, parameters] of REPLICA_STORES) {
|
|
356
|
-
if (database.objectStoreNames.contains(name))
|
|
357
|
-
continue;
|
|
358
|
-
database.createObjectStore(name, parameters);
|
|
359
|
-
}
|
|
360
|
-
const messages = opening.transaction.objectStore(MESSAGES);
|
|
361
|
-
for (const [name, keyPath] of MESSAGE_INDEXES) {
|
|
362
|
-
if (!messages.indexNames.contains(name))
|
|
363
|
-
messages.createIndex(name, keyPath);
|
|
364
|
-
}
|
|
365
|
-
});
|
|
366
|
-
}
|
|
367
|
-
function openAuthored() {
|
|
368
|
-
return openDatabase(AUTHORED, AUTHORED_SCHEMA, (opening) => {
|
|
369
|
-
const database = opening.result;
|
|
370
|
-
for (const [name, parameters] of AUTHORED_STORES) {
|
|
371
|
-
if (!database.objectStoreNames.contains(name))
|
|
372
|
-
database.createObjectStore(name, parameters);
|
|
373
|
-
}
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
export async function openRuntimeStore(fenced) {
|
|
377
|
-
const authored = await openAuthored();
|
|
378
|
-
const database = await openReplica().catch((error) => {
|
|
379
|
-
authored.close();
|
|
380
|
-
throw error;
|
|
381
|
-
});
|
|
382
98
|
return {
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
}
|
|
414
|
-
for (const batch of queue) {
|
|
415
|
-
if (!before.has(batch.id)) {
|
|
416
|
-
pending.put({
|
|
417
|
-
locator,
|
|
418
|
-
id: batch.id,
|
|
419
|
-
batch,
|
|
420
|
-
drafts: saved?.get(batch.id) ?? [],
|
|
421
|
-
submission: { state: 'waiting' },
|
|
422
|
-
lost: false,
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
for (const batch of founded ?? []) {
|
|
427
|
-
if (!before.has(batch.id))
|
|
428
|
-
continue;
|
|
429
|
-
const stored = pending.get([locator, batch.id]);
|
|
430
|
-
stored.onsuccess = () => {
|
|
431
|
-
const record = stored.result;
|
|
432
|
-
if (record !== undefined)
|
|
433
|
-
pending.put({ ...record, batch });
|
|
434
|
-
};
|
|
435
|
-
}
|
|
436
|
-
};
|
|
437
|
-
const draftStore = transaction.objectStore(ROOM_DRAFTS);
|
|
438
|
-
for (const path of consumedRoomDrafts ?? [])
|
|
439
|
-
draftStore.delete([locator, path]);
|
|
440
|
-
for (const record of roomDrafts ?? [])
|
|
441
|
-
draftStore.put(record);
|
|
442
|
-
});
|
|
443
|
-
},
|
|
444
|
-
async write({ next, previous, stored }) {
|
|
445
|
-
if (next === previous || fenced(next.locator))
|
|
446
|
-
return;
|
|
447
|
-
const moved = previous?.transfer !== next.transfer;
|
|
448
|
-
const base = moved ? (stored ?? null) : previous;
|
|
449
|
-
const paths = await stepped(changedIn(next, base));
|
|
450
|
-
if (fenced(next.locator))
|
|
451
|
-
return;
|
|
452
|
-
await transacted(database, [ROOMS, DOCUMENTS, BINARY_FILES, TRANSFERS], 'readwrite', (transaction) => {
|
|
453
|
-
transaction.objectStore(ROOMS).put(roomRecord(next));
|
|
454
|
-
if (moved && previous !== null) {
|
|
455
|
-
const range = underTransfer(previous.locator, previous.transfer);
|
|
456
|
-
transaction.objectStore(DOCUMENTS).delete(range);
|
|
457
|
-
transaction.objectStore(BINARY_FILES).delete(range);
|
|
458
|
-
}
|
|
459
|
-
if (moved)
|
|
460
|
-
transaction.objectStore(TRANSFERS).delete(next.locator);
|
|
461
|
-
return writeLayer(transaction, next.locator, next.transfer, { next, base, paths });
|
|
462
|
-
});
|
|
463
|
-
},
|
|
464
|
-
async revokeModels(records) {
|
|
465
|
-
await transacted(database, ROOMS, 'readwrite', (transaction) => {
|
|
466
|
-
const rooms = transaction.objectStore(ROOMS);
|
|
467
|
-
const revoked = { status: 'unavailable', reason: 'revoked' };
|
|
468
|
-
for (const record of records) {
|
|
469
|
-
if (fenced(record.locator))
|
|
470
|
-
continue;
|
|
471
|
-
rooms.put(roomRecord({ ...record, model: revoked, selectionModel: revoked }));
|
|
472
|
-
}
|
|
473
|
-
});
|
|
474
|
-
},
|
|
475
|
-
async lastCompleted() {
|
|
476
|
-
return (await declaration(database)).lastCompleted;
|
|
477
|
-
},
|
|
478
|
-
complete(at) {
|
|
479
|
-
return updateDeclaration(database, (record) => ({ ...record, lastCompleted: at }));
|
|
480
|
-
},
|
|
481
|
-
async providerLimits() {
|
|
482
|
-
return (await declaration(database)).providerLimits;
|
|
483
|
-
},
|
|
484
|
-
async capabilities() {
|
|
485
|
-
return (await declaration(database)).capabilities;
|
|
486
|
-
},
|
|
487
|
-
declare(limits, capabilities) {
|
|
488
|
-
return updateDeclaration(database, (record) => ({
|
|
489
|
-
...record,
|
|
490
|
-
providerLimits: limits,
|
|
491
|
-
capabilities,
|
|
492
|
-
}));
|
|
493
|
-
},
|
|
494
|
-
async member() {
|
|
495
|
-
const held = await transacted(database, DECLARATIONS, 'readonly', (transaction) => settled(transaction.objectStore(DECLARATIONS).get(MEMBER)));
|
|
496
|
-
return held ?? null;
|
|
497
|
-
},
|
|
498
|
-
async keepMember(member) {
|
|
499
|
-
await transacted(database, DECLARATIONS, 'readwrite', (transaction) => {
|
|
500
|
-
transaction.objectStore(DECLARATIONS).put(member, MEMBER);
|
|
501
|
-
});
|
|
502
|
-
},
|
|
503
|
-
async targets() {
|
|
504
|
-
const held = await transacted(database, DECLARATIONS, 'readonly', (transaction) => settled(transaction.objectStore(DECLARATIONS).get(TARGETS)));
|
|
505
|
-
return held ?? {};
|
|
506
|
-
},
|
|
507
|
-
async keepTargets(targets) {
|
|
508
|
-
await transacted(database, DECLARATIONS, 'readwrite', (transaction) => {
|
|
509
|
-
transaction.objectStore(DECLARATIONS).put(targets, TARGETS);
|
|
510
|
-
});
|
|
511
|
-
},
|
|
512
|
-
async queues() {
|
|
513
|
-
const [queues, pending] = await transacted(authored, [QUEUES, PENDING_CHANGES], 'readonly', (transaction) => Promise.all([
|
|
514
|
-
settled(transaction.objectStore(QUEUES).getAll()),
|
|
515
|
-
settled(transaction.objectStore(PENDING_CHANGES).getAll()),
|
|
516
|
-
]));
|
|
517
|
-
const byId = new Map(pending.map((record) => [`${record.locator}\0${record.id}`, record]));
|
|
518
|
-
return queues
|
|
519
|
-
.filter((queue) => !fenced(queue.locator))
|
|
520
|
-
.map((queue) => ({
|
|
521
|
-
locator: queue.locator,
|
|
522
|
-
pending: queue.order.map((id) => {
|
|
523
|
-
const record = byId.get(`${queue.locator}\0${id}`);
|
|
524
|
-
if (record === undefined)
|
|
525
|
-
throw new Error(`Missing Pending Change ${queue.locator}/${id}`);
|
|
526
|
-
const { batch, drafts, submission, lost, upload, accepted } = record;
|
|
527
|
-
return { batch, state: { drafts, submission, lost, upload, accepted } };
|
|
528
|
-
}),
|
|
529
|
-
}));
|
|
530
|
-
},
|
|
531
|
-
async submit(locator, id, submission, lost) {
|
|
532
|
-
if (!fenced(locator))
|
|
533
|
-
await amendPending(authored, locator, id, { submission, lost });
|
|
534
|
-
},
|
|
535
|
-
async accept(locator, id, roomVersion) {
|
|
536
|
-
if (!fenced(locator))
|
|
537
|
-
await amendPending(authored, locator, id, { accepted: roomVersion });
|
|
538
|
-
},
|
|
539
|
-
async keepUpload(locator, id, upload) {
|
|
540
|
-
if (!fenced(locator))
|
|
541
|
-
await amendPending(authored, locator, id, { upload });
|
|
542
|
-
},
|
|
543
|
-
async roomDrafts() {
|
|
544
|
-
const held = await transacted(authored, ROOM_DRAFTS, 'readonly', (transaction) => settled(transaction.objectStore(ROOM_DRAFTS).getAll()));
|
|
545
|
-
return held.filter((record) => !fenced(record.locator));
|
|
546
|
-
},
|
|
547
|
-
presentation() {
|
|
548
|
-
return transacted(database, PRESENTATION, 'readonly', (transaction) => settled(transaction.objectStore(PRESENTATION).getAll()));
|
|
549
|
-
},
|
|
550
|
-
async present(record) {
|
|
551
|
-
await transacted(database, PRESENTATION, 'readwrite', (transaction) => {
|
|
552
|
-
transaction.objectStore(PRESENTATION).put(record);
|
|
553
|
-
});
|
|
554
|
-
},
|
|
555
|
-
conversations() {
|
|
556
|
-
return transacted(database, [CONVERSATIONS, MESSAGES], 'readonly', async (transaction) => {
|
|
557
|
-
const records = await settled(transaction.objectStore(CONVERSATIONS).getAll());
|
|
558
|
-
const held = new Map(records.map(({ conversation, read, partial }) => [
|
|
559
|
-
conversation,
|
|
560
|
-
{ conversation, read, partial: partial === true },
|
|
561
|
-
]));
|
|
562
|
-
const keys = transaction.objectStore(MESSAGES).index('conversation');
|
|
563
|
-
await new Promise((resolve, reject) => {
|
|
564
|
-
const cursor = keys.openKeyCursor(null, 'nextunique');
|
|
565
|
-
cursor.onerror = () => reject(cursor.error);
|
|
566
|
-
cursor.onsuccess = () => {
|
|
567
|
-
const at = cursor.result;
|
|
568
|
-
if (at === null) {
|
|
569
|
-
resolve();
|
|
570
|
-
return;
|
|
571
|
-
}
|
|
572
|
-
const conversation = at.key;
|
|
573
|
-
if (!held.has(conversation)) {
|
|
574
|
-
held.set(conversation, { conversation, read: undefined, partial: true });
|
|
575
|
-
}
|
|
576
|
-
at.continue();
|
|
577
|
-
};
|
|
578
|
-
});
|
|
579
|
-
return [...held.values()];
|
|
580
|
-
});
|
|
581
|
-
},
|
|
582
|
-
async keepMessages({ conversation, messages, read }) {
|
|
583
|
-
await transacted(database, [CONVERSATIONS, MESSAGES], 'readwrite', (transaction) => {
|
|
584
|
-
const stored = transaction.objectStore(MESSAGES);
|
|
585
|
-
for (const message of messages) {
|
|
586
|
-
stored.put({ ...message, conversation });
|
|
587
|
-
}
|
|
588
|
-
if (read !== undefined) {
|
|
589
|
-
transaction.objectStore(CONVERSATIONS).put({
|
|
590
|
-
conversation,
|
|
591
|
-
read: read.at,
|
|
592
|
-
...(read.partial ? { partial: true } : {}),
|
|
593
|
-
});
|
|
594
|
-
}
|
|
595
|
-
});
|
|
596
|
-
},
|
|
597
|
-
messageWindow(conversation, limit, before) {
|
|
598
|
-
return transacted(database, MESSAGES, 'readonly', async (transaction) => {
|
|
599
|
-
const index = transaction.objectStore(MESSAGES).index('position');
|
|
600
|
-
const range = IDBKeyRange.bound([conversation], [conversation, before?.[0] ?? []]);
|
|
601
|
-
const latest = [];
|
|
602
|
-
let more = false;
|
|
603
|
-
await new Promise((resolve, reject) => {
|
|
604
|
-
const cursor = index.openCursor(range, 'prev');
|
|
605
|
-
cursor.onerror = () => reject(cursor.error);
|
|
606
|
-
cursor.onsuccess = () => {
|
|
607
|
-
const at = cursor.result;
|
|
608
|
-
if (at === null) {
|
|
609
|
-
resolve();
|
|
610
|
-
return;
|
|
611
|
-
}
|
|
612
|
-
const record = at.value;
|
|
613
|
-
if (!precedes(record, before)) {
|
|
614
|
-
at.continue();
|
|
615
|
-
return;
|
|
616
|
-
}
|
|
617
|
-
if (latest.length === limit) {
|
|
618
|
-
more = true;
|
|
619
|
-
resolve();
|
|
620
|
-
return;
|
|
621
|
-
}
|
|
622
|
-
latest.push(accepted(record));
|
|
623
|
-
at.continue();
|
|
624
|
-
};
|
|
625
|
-
});
|
|
626
|
-
return { messages: latest.reverse(), more };
|
|
627
|
-
});
|
|
628
|
-
},
|
|
629
|
-
messageCount(conversation) {
|
|
630
|
-
return transacted(database, MESSAGES, 'readonly', (transaction) => settled(transaction.objectStore(MESSAGES).index('conversation').count(conversation)));
|
|
631
|
-
},
|
|
632
|
-
async messagesAfter(conversation, identity) {
|
|
633
|
-
const range = identity === null
|
|
634
|
-
? IDBKeyRange.bound([conversation], [conversation, []])
|
|
635
|
-
: IDBKeyRange.bound([conversation, identity], [conversation, []], true);
|
|
636
|
-
const held = await transacted(database, MESSAGES, 'readonly', (transaction) => settled(transaction.objectStore(MESSAGES).getAll(range, READ_BATCH)));
|
|
637
|
-
return held.map(accepted);
|
|
638
|
-
},
|
|
639
|
-
async messageIdentities(conversation) {
|
|
640
|
-
const keys = await transacted(database, MESSAGES, 'readonly', (transaction) => settled(transaction.objectStore(MESSAGES).index('conversation').getAllKeys(conversation)));
|
|
641
|
-
return keys.map((key) => key[1]);
|
|
642
|
-
},
|
|
643
|
-
async turnArrived(conversation, turn) {
|
|
644
|
-
const held = await transacted(database, MESSAGES, 'readonly', (transaction) => settled(transaction.objectStore(MESSAGES).index('turn').count([conversation, turn])));
|
|
645
|
-
return held > 0;
|
|
646
|
-
},
|
|
647
|
-
async dropConversations(conversations) {
|
|
648
|
-
await transacted(authored, CHAT_DRAFTS, 'readwrite', (drafts) => {
|
|
649
|
-
for (const conversation of conversations)
|
|
650
|
-
drafts.objectStore(CHAT_DRAFTS).delete(conversation);
|
|
651
|
-
});
|
|
652
|
-
await transacted(database, [CONVERSATIONS, MESSAGES], 'readwrite', (transaction) => {
|
|
653
|
-
const messages = transaction.objectStore(MESSAGES);
|
|
654
|
-
for (const conversation of conversations) {
|
|
655
|
-
transaction.objectStore(CONVERSATIONS).delete(conversation);
|
|
656
|
-
const keys = messages.index('conversation').getAllKeys(conversation);
|
|
657
|
-
keys.onsuccess = () => {
|
|
658
|
-
for (const key of keys.result)
|
|
659
|
-
messages.delete(key);
|
|
660
|
-
};
|
|
661
|
-
}
|
|
662
|
-
});
|
|
663
|
-
},
|
|
664
|
-
async chatDrafts() {
|
|
665
|
-
const held = await transacted(authored, CHAT_DRAFTS, 'readonly', (transaction) => settled(transaction.objectStore(CHAT_DRAFTS).getAll()));
|
|
666
|
-
return held.map(chatDraftRecord);
|
|
667
|
-
},
|
|
668
|
-
async keepChatDrafts(records) {
|
|
669
|
-
await transacted(authored, CHAT_DRAFTS, 'readwrite', (transaction) => {
|
|
670
|
-
for (const record of records)
|
|
671
|
-
transaction.objectStore(CHAT_DRAFTS).put(record);
|
|
672
|
-
});
|
|
673
|
-
},
|
|
674
|
-
async dropChatDraft(conversation) {
|
|
675
|
-
await transacted(authored, CHAT_DRAFTS, 'readwrite', (transaction) => {
|
|
676
|
-
transaction.objectStore(CHAT_DRAFTS).delete(conversation);
|
|
677
|
-
});
|
|
678
|
-
},
|
|
679
|
-
calls() {
|
|
680
|
-
return transacted(authored, CALLS, 'readonly', (transaction) => settled(transaction.objectStore(CALLS).getAll()));
|
|
681
|
-
},
|
|
682
|
-
async keepCall(record) {
|
|
683
|
-
await transacted(authored, CALLS, 'readwrite', (transaction) => {
|
|
684
|
-
transaction.objectStore(CALLS).put(record);
|
|
685
|
-
});
|
|
686
|
-
},
|
|
687
|
-
async dropCall(operation) {
|
|
688
|
-
await transacted(authored, CALLS, 'readwrite', (transaction) => {
|
|
689
|
-
transaction.objectStore(CALLS).delete(operation);
|
|
690
|
-
});
|
|
691
|
-
},
|
|
692
|
-
async keepRoomDraft(record) {
|
|
693
|
-
if (fenced(record.locator))
|
|
694
|
-
return;
|
|
695
|
-
await transacted(authored, ROOM_DRAFTS, 'readwrite', (transaction) => {
|
|
696
|
-
transaction.objectStore(ROOM_DRAFTS).put(record);
|
|
697
|
-
});
|
|
698
|
-
},
|
|
699
|
-
async discardRoomDraft(locator, path) {
|
|
700
|
-
if (fenced(locator))
|
|
701
|
-
return;
|
|
702
|
-
await transacted(authored, ROOM_DRAFTS, 'readwrite', (transaction) => {
|
|
703
|
-
transaction.objectStore(ROOM_DRAFTS).delete([locator, path]);
|
|
704
|
-
});
|
|
705
|
-
},
|
|
706
|
-
async fences() {
|
|
707
|
-
const held = await transacted(authored, FENCES, 'readonly', (transaction) => settled(transaction.objectStore(FENCES).getAll()));
|
|
708
|
-
return held.map((fence) => fence.locator);
|
|
709
|
-
},
|
|
710
|
-
async erase(locators) {
|
|
711
|
-
await transacted(authored, [FENCES, QUEUES, PENDING_CHANGES, ROOM_DRAFTS], 'readwrite', (work) => {
|
|
712
|
-
for (const locator of locators) {
|
|
713
|
-
work.objectStore(FENCES).put({ locator });
|
|
714
|
-
work.objectStore(QUEUES).delete(locator);
|
|
715
|
-
for (const name of [PENDING_CHANGES, ROOM_DRAFTS]) {
|
|
716
|
-
removeRoomEntries(work.objectStore(name), locator);
|
|
717
|
-
}
|
|
718
|
-
}
|
|
719
|
-
});
|
|
720
|
-
await transacted(database, [ROOMS, DOCUMENTS, BINARY_FILES, TRANSFERS], 'readwrite', (transaction) => {
|
|
721
|
-
for (const locator of locators) {
|
|
722
|
-
transaction.objectStore(ROOMS).delete(locator);
|
|
723
|
-
transaction.objectStore(TRANSFERS).delete(locator);
|
|
724
|
-
transaction.objectStore(DOCUMENTS).delete(underRoom(locator));
|
|
725
|
-
transaction.objectStore(BINARY_FILES).delete(underRoom(locator));
|
|
726
|
-
}
|
|
727
|
-
});
|
|
728
|
-
await transacted(authored, FENCES, 'readwrite', (fences) => {
|
|
729
|
-
for (const locator of locators)
|
|
730
|
-
fences.objectStore(FENCES).delete(locator);
|
|
731
|
-
});
|
|
732
|
-
},
|
|
733
|
-
async discard(locator) {
|
|
734
|
-
await transacted(authored, [QUEUES, PENDING_CHANGES], 'readwrite', (transaction) => {
|
|
735
|
-
transaction.objectStore(QUEUES).delete(locator);
|
|
736
|
-
removeRoomEntries(transaction.objectStore(PENDING_CHANGES), locator);
|
|
737
|
-
});
|
|
738
|
-
},
|
|
739
|
-
async transfers() {
|
|
740
|
-
const held = await transacted(database, TRANSFERS, 'readonly', (transaction) => settled(transaction.objectStore(TRANSFERS).getAll()));
|
|
741
|
-
return held.filter((record) => !fenced(record.locator));
|
|
742
|
-
},
|
|
743
|
-
staged(record) {
|
|
744
|
-
return transacted(database, [DOCUMENTS, BINARY_FILES], 'readonly', (transaction) => readLayer(transaction, record.locator, record.transfer));
|
|
745
|
-
},
|
|
746
|
-
async stage(record, page) {
|
|
747
|
-
if (fenced(record.locator))
|
|
748
|
-
return;
|
|
749
|
-
const paths = await stepped(changedIn(page, null));
|
|
750
|
-
if (fenced(record.locator))
|
|
751
|
-
return;
|
|
752
|
-
await transacted(database, [TRANSFERS, DOCUMENTS, BINARY_FILES], 'readwrite', (transaction) => {
|
|
753
|
-
transaction.objectStore(TRANSFERS).put(record);
|
|
754
|
-
return writeLayer(transaction, record.locator, record.transfer, {
|
|
755
|
-
next: page,
|
|
756
|
-
base: null,
|
|
757
|
-
paths,
|
|
758
|
-
});
|
|
759
|
-
});
|
|
760
|
-
},
|
|
761
|
-
async abandon(locator) {
|
|
762
|
-
if (fenced(locator))
|
|
763
|
-
return;
|
|
764
|
-
await transacted(database, [TRANSFERS, DOCUMENTS, BINARY_FILES], 'readwrite', (transaction) => {
|
|
765
|
-
const transfers = transaction.objectStore(TRANSFERS);
|
|
766
|
-
const held = transfers.get(locator);
|
|
767
|
-
held.onsuccess = () => {
|
|
768
|
-
const record = held.result;
|
|
769
|
-
if (record === undefined)
|
|
770
|
-
return;
|
|
771
|
-
transfers.delete(locator);
|
|
772
|
-
const range = underTransfer(locator, record.transfer);
|
|
773
|
-
transaction.objectStore(DOCUMENTS).delete(range);
|
|
774
|
-
transaction.objectStore(BINARY_FILES).delete(range);
|
|
775
|
-
};
|
|
776
|
-
});
|
|
777
|
-
},
|
|
778
|
-
receivedHeads() {
|
|
779
|
-
return transacted(database, RECEIVED, 'readonly', (transaction) => settled(transaction.objectStore(RECEIVED).getAll()));
|
|
780
|
-
},
|
|
781
|
-
async receivedParts(key, count) {
|
|
782
|
-
const kept = await transacted(database, RECEIVED_PARTS, 'readonly', (transaction) => settled(transaction
|
|
783
|
-
.objectStore(RECEIVED_PARTS)
|
|
784
|
-
.getAll(IDBKeyRange.bound([key, 0], [key, count], false, true))));
|
|
785
|
-
return kept.map((part) => part.value);
|
|
786
|
-
},
|
|
787
|
-
async keepReceived(key, head, part) {
|
|
788
|
-
await transacted(database, [RECEIVED, RECEIVED_PARTS], 'readwrite', (transaction) => {
|
|
789
|
-
transaction.objectStore(RECEIVED).put({ key, head });
|
|
790
|
-
if (part !== undefined)
|
|
791
|
-
transaction.objectStore(RECEIVED_PARTS).put({ key, ...part });
|
|
792
|
-
});
|
|
793
|
-
},
|
|
794
|
-
async dropReceived(keys) {
|
|
795
|
-
await transacted(database, [RECEIVED, RECEIVED_PARTS], 'readwrite', (transaction) => {
|
|
796
|
-
for (const key of keys) {
|
|
797
|
-
transaction.objectStore(RECEIVED).delete(key);
|
|
798
|
-
transaction.objectStore(RECEIVED_PARTS).delete(IDBKeyRange.bound([key], [key, []]));
|
|
799
|
-
}
|
|
800
|
-
});
|
|
99
|
+
device,
|
|
100
|
+
space,
|
|
101
|
+
readiness,
|
|
102
|
+
ask: options.database.ask,
|
|
103
|
+
changed: options.changed,
|
|
104
|
+
open,
|
|
105
|
+
durably: (work) => writes.exclusive(async () => {
|
|
106
|
+
const local = await open();
|
|
107
|
+
return work(local);
|
|
108
|
+
}),
|
|
109
|
+
exclusive: writes.exclusive,
|
|
110
|
+
gathered: writes.gathered,
|
|
111
|
+
written: writes.written,
|
|
112
|
+
startingWrite: writes.startingWrite,
|
|
113
|
+
finishingWrite: writes.finishingWrite,
|
|
114
|
+
ahead: writes.ahead,
|
|
115
|
+
rederive: writes.rederive,
|
|
116
|
+
refreshPage: writes.refreshPage,
|
|
117
|
+
stageBytes: writes.stageBytes,
|
|
118
|
+
deriveBytes: writes.deriveBytes,
|
|
119
|
+
rooms,
|
|
120
|
+
record: async (locator) => (await rooms([locator])).get(locator)?.record,
|
|
121
|
+
work,
|
|
122
|
+
replica: async (locator) => (await work(locator)).replica,
|
|
123
|
+
async covering() {
|
|
124
|
+
const held = await (await open()).covering();
|
|
125
|
+
return {
|
|
126
|
+
rooms: new Map([...held.rooms].filter(([locator]) => !lost(locator))),
|
|
127
|
+
queues: new Map([...held.queues].filter(([locator]) => !lost(locator))),
|
|
128
|
+
};
|
|
801
129
|
},
|
|
802
|
-
async
|
|
803
|
-
const held = await
|
|
804
|
-
return
|
|
130
|
+
async status() {
|
|
131
|
+
const held = await (await open()).status();
|
|
132
|
+
return {
|
|
133
|
+
queued: held.queued.filter((locator) => !lost(locator)),
|
|
134
|
+
lastCompleted: held.lastCompleted,
|
|
135
|
+
unsent: held.unsent.filter(({ room }) => !lost(room)),
|
|
136
|
+
resets: held.resets.filter(({ locator }) => !lost(locator)),
|
|
137
|
+
returned: held.returned.filter(({ locator }) => !lost(locator)),
|
|
138
|
+
};
|
|
805
139
|
},
|
|
806
|
-
async
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
140
|
+
queued: async () => (await (await open()).queued()).filter((locator) => !lost(locator)),
|
|
141
|
+
drafts,
|
|
142
|
+
draft: async (locator, path) => (await drafts(locator, [path]))[0],
|
|
143
|
+
composed: ({ model, declaration }) => compositionOf(model, declaration.typedSelection, options.builtIn, options.typedPaths),
|
|
144
|
+
publication: watchers.publication,
|
|
145
|
+
owing: watchers.owing,
|
|
146
|
+
watch: watchers.watch,
|
|
147
|
+
watching: watchers.watching,
|
|
148
|
+
tell: watchers.tell,
|
|
149
|
+
installs,
|
|
150
|
+
seeds: {
|
|
151
|
+
of: (key) => seeds.get(key),
|
|
152
|
+
keep(key, seed) {
|
|
153
|
+
seeds.set(key, seed);
|
|
154
|
+
},
|
|
155
|
+
drop(key) {
|
|
156
|
+
seeds.delete(key);
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
landed,
|
|
160
|
+
attached,
|
|
161
|
+
opened: openedFiles(options.database, lost),
|
|
162
|
+
prepareAgain,
|
|
163
|
+
part: (file, part) => options.database.ask({ kind: 'file.part', key: file, part }),
|
|
164
|
+
forget(locator) {
|
|
165
|
+
typesHeld.delete(locator);
|
|
166
|
+
landed.forget(locator);
|
|
167
|
+
attached.forget(locator);
|
|
168
|
+
installs.change(locator, ({ installing }) => ({ ...NO_INSTALL, installing }));
|
|
169
|
+
prepareAgain(locator);
|
|
810
170
|
},
|
|
811
171
|
close() {
|
|
812
|
-
|
|
813
|
-
|
|
172
|
+
space.stop();
|
|
173
|
+
readiness.close();
|
|
174
|
+
watchers.close();
|
|
814
175
|
},
|
|
815
176
|
};
|
|
816
177
|
}
|