@agentshouse/mdruntime 0.1.0-cde2b99d2fcbc → 0.1.0-cdf06805b9658
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/AGENTS.md +286 -292
- package/README.md +16 -14
- package/dist/adapter.d.ts +99 -36
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +5 -1
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +21 -4
- package/dist/attempt.d.ts.map +1 -1
- package/dist/attempt.js +14 -1
- 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 +27 -9
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +155 -64
- package/dist/chain.d.ts +11 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +64 -0
- package/dist/change-set.d.ts +9 -14
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +11 -63
- package/dist/change.d.ts +31 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +10 -1
- package/dist/client.d.ts +24 -12
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +49 -9
- package/dist/collection.d.ts +7 -6
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +30 -77
- package/dist/compile.d.ts +16 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +721 -0
- package/dist/connection.d.ts +42 -15
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +3397 -804
- package/dist/conversation.d.ts +30 -9
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +549 -181
- package/dist/digest.d.ts +7 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +113 -0
- package/dist/durability.d.ts +5 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +19 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +151 -0
- package/dist/fence.d.ts +6 -0
- package/dist/fence.d.ts.map +1 -0
- package/dist/fence.js +10 -0
- package/dist/file.d.ts +2 -10
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +3 -120
- package/dist/fulltext.d.ts +27 -0
- package/dist/fulltext.d.ts.map +1 -0
- package/dist/fulltext.js +368 -0
- package/dist/host.d.ts +15 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +126 -16
- package/dist/identity.d.ts +1 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +3 -0
- package/dist/index.d.ts +15 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/live.d.ts +22 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +123 -0
- package/dist/memory.d.ts +10 -3
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +54 -26
- package/dist/messages.d.ts +28 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +90 -0
- package/dist/model.d.ts +4 -2
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +11 -2
- 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 +19 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +113 -12
- package/dist/opened.d.ts +22 -0
- package/dist/opened.d.ts.map +1 -0
- package/dist/opened.js +107 -0
- package/dist/outcome.d.ts +38 -4
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +26 -0
- package/dist/overlay.d.ts +3 -4
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +100 -182
- package/dist/query.d.ts +60 -4
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +48 -7
- package/dist/reach.d.ts +11 -6
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +182 -62
- package/dist/react.d.ts +8 -6
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +7 -17
- package/dist/readiness.d.ts +64 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +33 -0
- package/dist/reads.d.ts +11 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +100 -0
- package/dist/recovery.d.ts +25 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +198 -0
- package/dist/refresh.d.ts +16 -15
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +113 -49
- package/dist/replica.d.ts +56 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +297 -162
- package/dist/room-draft.d.ts +17 -2
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +65 -25
- package/dist/rows.d.ts +28 -37
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +113 -72
- package/dist/save.d.ts +50 -9
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +528 -166
- package/dist/search.d.ts +39 -28
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +37 -105
- package/dist/seed.d.ts +16 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +75 -0
- package/dist/shared.d.ts +16 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +431 -0
- package/dist/status.d.ts +4 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/store.d.ts +118 -76
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +355 -444
- package/dist/stored.d.ts +145 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +567 -0
- package/dist/tables.d.ts +354 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +624 -0
- package/dist/turn.d.ts +9 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +75 -0
- package/dist/validation.d.ts +30 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +162 -0
- package/dist/windows.d.ts +22 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +89 -0
- package/dist/wire.d.ts +164 -32
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +55 -31
- package/dist/words.d.ts +19 -0
- package/dist/words.d.ts.map +1 -0
- package/dist/words.js +150 -0
- package/package.json +27 -23
- package/dist/chat/acts.d.ts +0 -34
- package/dist/chat/acts.d.ts.map +0 -1
- package/dist/chat/acts.js +0 -36
- package/dist/chat/context.d.ts +0 -3
- package/dist/chat/context.d.ts.map +0 -1
- package/dist/chat/context.js +0 -10
- package/dist/chat/input.d.ts +0 -9
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -99
- package/dist/chat/kit.d.ts +0 -60
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -20
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -59
- package/dist/chat/markdown.d.ts +0 -19
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -187
- package/dist/chat/message.d.ts +0 -6
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -192
- package/dist/chat/messages.d.ts +0 -21
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -151
- package/dist/chat/name.d.ts +0 -6
- package/dist/chat/name.d.ts.map +0 -1
- package/dist/chat/name.js +0 -37
- package/dist/chat/opened.d.ts +0 -11
- package/dist/chat/opened.d.ts.map +0 -1
- package/dist/chat/opened.js +0 -17
- package/dist/chat/overlay.d.ts +0 -31
- package/dist/chat/overlay.d.ts.map +0 -1
- package/dist/chat/overlay.js +0 -97
- package/dist/chat/parts.d.ts +0 -57
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/parts.js +0 -119
- package/dist/chat/process.d.ts +0 -20
- package/dist/chat/process.d.ts.map +0 -1
- package/dist/chat/process.js +0 -32
- package/dist/chat/provider.d.ts +0 -63
- package/dist/chat/provider.d.ts.map +0 -1
- package/dist/chat/provider.js +0 -645
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -80
- package/dist/chat/questions.d.ts +0 -31
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/questions.js +0 -111
- package/dist/chat/read.d.ts +0 -5
- package/dist/chat/read.d.ts.map +0 -1
- package/dist/chat/read.js +0 -13
- package/dist/chat/ready.d.ts +0 -33
- package/dist/chat/ready.d.ts.map +0 -1
- package/dist/chat/ready.js +0 -91
- package/dist/chat/style.d.ts +0 -4
- package/dist/chat/style.d.ts.map +0 -1
- package/dist/chat/style.js +0 -302
- package/dist/chat.d.ts +0 -14
- package/dist/chat.d.ts.map +0 -1
- package/dist/chat.js +0 -8
- package/dist/read-side.d.ts +0 -18
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -440
package/dist/store.js
CHANGED
|
@@ -1,499 +1,410 @@
|
|
|
1
|
-
import {
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const BINARY_FILES = 'binaryFiles';
|
|
6
|
-
const TRANSFERS = 'transfers';
|
|
7
|
-
const PENDING_CHANGES = 'pendingChanges';
|
|
8
|
-
const DECLARATIONS = 'declarations';
|
|
9
|
-
const ROOM_DRAFTS = 'roomDrafts';
|
|
10
|
-
const PRESENTATION = 'presentation';
|
|
11
|
-
const CONVERSATIONS = 'conversations';
|
|
12
|
-
const MESSAGES = 'messages';
|
|
13
|
-
const CHAT_DRAFTS = 'chatDrafts';
|
|
14
|
-
const CURRENT = 'current';
|
|
15
|
-
const MEMBER = 'member';
|
|
16
|
-
export const STORE_SCHEMA = 22;
|
|
17
|
-
const ATTACHMENT_SCHEMA = 21;
|
|
18
|
-
const ATTACHMENT_REFERENCE = /at_[1-9a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]*\.[0-9a-hjkmnp-tv-z]/u;
|
|
19
|
-
const READ_BATCH = 256;
|
|
20
|
-
function settled(request) {
|
|
21
|
-
return new Promise((resolve, reject) => {
|
|
22
|
-
request.onsuccess = () => resolve(request.result);
|
|
23
|
-
request.onerror = () => reject(request.error);
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
function completed(transaction) {
|
|
27
|
-
return new Promise((resolve, reject) => {
|
|
28
|
-
transaction.oncomplete = () => resolve();
|
|
29
|
-
transaction.onerror = () => reject(transaction.error);
|
|
30
|
-
transaction.onabort = () => reject(transaction.error);
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
const EMPTY_DECLARATIONS = {
|
|
34
|
-
lastCompleted: null,
|
|
35
|
-
generation: null,
|
|
36
|
-
providerLimits: [],
|
|
37
|
-
capabilities: [],
|
|
38
|
-
};
|
|
39
|
-
function declaration(database) {
|
|
40
|
-
const transaction = database.transaction(DECLARATIONS, 'readonly');
|
|
41
|
-
return settled(transaction.objectStore(DECLARATIONS).get(CURRENT)).then((record) => record ?? EMPTY_DECLARATIONS);
|
|
42
|
-
}
|
|
43
|
-
function updateDeclaration(database, update) {
|
|
44
|
-
const transaction = database.transaction(DECLARATIONS, 'readwrite');
|
|
45
|
-
const store = transaction.objectStore(DECLARATIONS);
|
|
46
|
-
const prior = store.get(CURRENT);
|
|
47
|
-
prior.onsuccess = () => {
|
|
48
|
-
store.put(update(prior.result ?? EMPTY_DECLARATIONS), CURRENT);
|
|
49
|
-
};
|
|
50
|
-
return completed(transaction);
|
|
51
|
-
}
|
|
52
|
-
function amendPending(database, locator, id, amendment) {
|
|
53
|
-
const transaction = database.transaction(PENDING_CHANGES, 'readwrite');
|
|
54
|
-
const pending = transaction.objectStore(PENDING_CHANGES);
|
|
55
|
-
const request = pending.get([locator, id]);
|
|
56
|
-
request.onsuccess = () => {
|
|
57
|
-
const record = request.result;
|
|
58
|
-
if (record !== undefined)
|
|
59
|
-
pending.put({ ...record, ...amendment });
|
|
60
|
-
};
|
|
61
|
-
return completed(transaction);
|
|
1
|
+
import { binaryLocalId } from './identity.js';
|
|
2
|
+
const FILE = '\u0000file';
|
|
3
|
+
function batchFiles(batch) {
|
|
4
|
+
return batch.changes.flatMap((change) => (change.kind === 'binary' ? [change.localId] : []));
|
|
62
5
|
}
|
|
63
|
-
function
|
|
64
|
-
|
|
65
|
-
return { ...room, order: queue.map((batch) => batch.id) };
|
|
6
|
+
function draftFiles(drafts) {
|
|
7
|
+
return drafts.flatMap(({ parts }) => (parts.file === undefined ? [] : [parts.file.localId]));
|
|
66
8
|
}
|
|
67
|
-
function
|
|
68
|
-
return
|
|
69
|
-
? IDBKeyRange.bound([locator, transfer], [locator, transfer, []])
|
|
70
|
-
: IDBKeyRange.bound([locator, transfer, after], [locator, transfer, []], true);
|
|
9
|
+
function roomDraftRow(record) {
|
|
10
|
+
return { path: record.path, record: JSON.stringify(record), files: draftFiles([record]) };
|
|
71
11
|
}
|
|
72
|
-
function
|
|
73
|
-
return IDBKeyRange.bound([locator], [locator, []]);
|
|
74
|
-
}
|
|
75
|
-
async function readTransfer(store, locator, transfer, receive) {
|
|
76
|
-
let range = underTransfer(locator, transfer);
|
|
77
|
-
for (;;) {
|
|
78
|
-
const batch = await settled(store.getAll(range, READ_BATCH));
|
|
79
|
-
for (const record of batch)
|
|
80
|
-
receive(record);
|
|
81
|
-
if (batch.length < READ_BATCH)
|
|
82
|
-
return;
|
|
83
|
-
range = underTransfer(locator, transfer, batch[batch.length - 1].path);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
function emptyLayer() {
|
|
87
|
-
return { documents: {}, binaries: {}, revisions: {}, changes: {}, written: {} };
|
|
88
|
-
}
|
|
89
|
-
async function readLayer(transaction, locator, transfer) {
|
|
90
|
-
const layer = emptyLayer();
|
|
91
|
-
const head = (held) => {
|
|
92
|
-
if (held.revision !== null)
|
|
93
|
-
layer.revisions[held.path] = held.revision;
|
|
94
|
-
if (held.change !== null)
|
|
95
|
-
layer.changes[held.path] = held.change;
|
|
96
|
-
};
|
|
97
|
-
await readTransfer(transaction.objectStore(DOCUMENTS), locator, transfer, (document) => {
|
|
98
|
-
layer.documents[document.path] = document.content;
|
|
99
|
-
if (document.written !== null)
|
|
100
|
-
layer.written[document.path] = document.written;
|
|
101
|
-
head(document);
|
|
102
|
-
});
|
|
103
|
-
await readTransfer(transaction.objectStore(BINARY_FILES), locator, transfer, (file) => {
|
|
104
|
-
layer.binaries[file.path] = file.binary;
|
|
105
|
-
head(file);
|
|
106
|
-
});
|
|
107
|
-
return layer;
|
|
108
|
-
}
|
|
109
|
-
function documentRecord(locator, transfer, layer, path) {
|
|
12
|
+
function authoredRows({ locator, queue, founded, saved, roomDrafts, consumedRoomDrafts, accepted }, held) {
|
|
110
13
|
return {
|
|
111
14
|
locator,
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
15
|
+
...(queue === undefined
|
|
16
|
+
? {}
|
|
17
|
+
: {
|
|
18
|
+
order: queue.map(({ id }) => id),
|
|
19
|
+
added: queue
|
|
20
|
+
.filter(({ id }) => held?.has(id) !== true)
|
|
21
|
+
.map((batch) => {
|
|
22
|
+
const drafts = saved?.get(batch.id) ?? [];
|
|
23
|
+
return {
|
|
24
|
+
id: batch.id,
|
|
25
|
+
batch: JSON.stringify(batch),
|
|
26
|
+
state: JSON.stringify({
|
|
27
|
+
drafts,
|
|
28
|
+
submission: { state: 'waiting' },
|
|
29
|
+
lost: false,
|
|
30
|
+
}),
|
|
31
|
+
files: [...batchFiles(batch), ...draftFiles(drafts)],
|
|
32
|
+
};
|
|
33
|
+
}),
|
|
34
|
+
}),
|
|
35
|
+
...(founded === undefined
|
|
36
|
+
? {}
|
|
37
|
+
: {
|
|
38
|
+
founded: founded.map((batch) => ({
|
|
39
|
+
id: batch.id,
|
|
40
|
+
batch: JSON.stringify(batch),
|
|
41
|
+
files: batchFiles(batch),
|
|
42
|
+
})),
|
|
43
|
+
}),
|
|
44
|
+
...(roomDrafts === undefined ? {} : { roomDrafts: roomDrafts.map(roomDraftRow) }),
|
|
45
|
+
...(consumedRoomDrafts === undefined ? {} : { consumedRoomDrafts }),
|
|
46
|
+
...(accepted === undefined
|
|
47
|
+
? {}
|
|
48
|
+
: {
|
|
49
|
+
amendments: accepted.map(({ id, roomVersion }) => ({
|
|
50
|
+
id,
|
|
51
|
+
amendment: JSON.stringify({ accepted: roomVersion }),
|
|
52
|
+
})),
|
|
53
|
+
}),
|
|
118
54
|
};
|
|
119
55
|
}
|
|
120
|
-
function
|
|
121
|
-
return
|
|
122
|
-
locator,
|
|
123
|
-
transfer,
|
|
124
|
-
path,
|
|
125
|
-
revision: layer.revisions[path] ?? null,
|
|
126
|
-
change: layer.changes[path] ?? null,
|
|
127
|
-
binary: layer.binaries[path],
|
|
128
|
-
};
|
|
56
|
+
function marked(value) {
|
|
57
|
+
return typeof value === 'object' && value !== null && FILE in value;
|
|
129
58
|
}
|
|
130
|
-
function
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
if (
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
sameChange(base.changes[path], next.changes[path]))
|
|
141
|
-
continue;
|
|
142
|
-
documents.put(documentRecord(locator, transfer, next, path));
|
|
143
|
-
}
|
|
144
|
-
const files = transaction.objectStore(BINARY_FILES);
|
|
145
|
-
for (const path of Object.keys(base?.binaries ?? {})) {
|
|
146
|
-
if (next.binaries[path] === undefined)
|
|
147
|
-
files.delete([locator, transfer, path]);
|
|
148
|
-
}
|
|
149
|
-
for (const path of Object.keys(next.binaries)) {
|
|
150
|
-
if (!sameBinary(base?.binaries[path], next.binaries[path]) ||
|
|
151
|
-
base?.revisions[path] !== next.revisions[path] ||
|
|
152
|
-
!sameChange(base?.changes[path], next.changes[path])) {
|
|
153
|
-
files.put(binaryFileRecord(locator, transfer, next, path));
|
|
59
|
+
function keyed(keys, value) {
|
|
60
|
+
const stored = [];
|
|
61
|
+
const files = [];
|
|
62
|
+
const record = JSON.stringify(value, (_name, held) => {
|
|
63
|
+
if (!(held instanceof Blob))
|
|
64
|
+
return held;
|
|
65
|
+
let key = keys.get(held);
|
|
66
|
+
if (key === undefined) {
|
|
67
|
+
key = binaryLocalId();
|
|
68
|
+
keys.set(held, key);
|
|
154
69
|
}
|
|
155
|
-
|
|
70
|
+
stored.push({ key, blob: held });
|
|
71
|
+
files.push(key);
|
|
72
|
+
return { [FILE]: key, type: held.type };
|
|
73
|
+
});
|
|
74
|
+
return { record, files, stored };
|
|
156
75
|
}
|
|
157
|
-
function
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
};
|
|
76
|
+
async function filed(value, read) {
|
|
77
|
+
if (Array.isArray(value))
|
|
78
|
+
return Promise.all(value.map((item) => filed(item, read)));
|
|
79
|
+
if (marked(value))
|
|
80
|
+
return read(value[FILE], value.type);
|
|
81
|
+
if (typeof value !== 'object' || value === null)
|
|
82
|
+
return value;
|
|
83
|
+
const restored = {};
|
|
84
|
+
for (const [name, item] of Object.entries(value))
|
|
85
|
+
restored[name] = await filed(item, read);
|
|
86
|
+
return restored;
|
|
165
87
|
}
|
|
166
|
-
|
|
167
|
-
return
|
|
168
|
-
const removal = indexedDB.deleteDatabase(DATABASE);
|
|
169
|
-
removal.onsuccess = () => resolve();
|
|
170
|
-
removal.onerror = () => reject(removal.error);
|
|
171
|
-
});
|
|
88
|
+
function json(value, fallback) {
|
|
89
|
+
return value === undefined ? fallback : JSON.parse(value);
|
|
172
90
|
}
|
|
173
|
-
function
|
|
174
|
-
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const documents = upgrade.objectStore(DOCUMENTS);
|
|
180
|
-
const dropped = new Set();
|
|
181
|
-
const kept = new Map();
|
|
182
|
-
const pending = upgrade.objectStore(PENDING_CHANGES).openCursor();
|
|
183
|
-
pending.onsuccess = () => {
|
|
184
|
-
const entry = pending.result;
|
|
185
|
-
if (entry !== null) {
|
|
186
|
-
const record = entry.value;
|
|
187
|
-
if (ATTACHMENT_REFERENCE.test(JSON.stringify(record.batch))) {
|
|
188
|
-
dropped.add(`${record.locator}\0${record.id}`);
|
|
189
|
-
entry.delete();
|
|
190
|
-
}
|
|
191
|
-
entry.continue();
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
const rooms = upgrade.objectStore(ROOMS).openCursor();
|
|
195
|
-
rooms.onsuccess = () => {
|
|
196
|
-
const room = rooms.result;
|
|
197
|
-
if (room !== null) {
|
|
198
|
-
const record = room.value;
|
|
199
|
-
const order = record.order.filter((id) => !dropped.has(`${record.locator}\0${id}`));
|
|
200
|
-
if (order.length === 0) {
|
|
201
|
-
room.delete();
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
204
|
-
kept.set(record.locator, record.transfer);
|
|
205
|
-
room.update({ ...record, roomVersion: '', order });
|
|
206
|
-
}
|
|
207
|
-
room.continue();
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
const staged = documents.openCursor();
|
|
211
|
-
staged.onsuccess = () => {
|
|
212
|
-
const document = staged.result;
|
|
213
|
-
if (document === null)
|
|
214
|
-
return;
|
|
215
|
-
const record = document.value;
|
|
216
|
-
if (kept.get(record.locator) !== record.transfer)
|
|
217
|
-
document.delete();
|
|
218
|
-
document.continue();
|
|
219
|
-
};
|
|
220
|
-
};
|
|
91
|
+
export function openRuntimeStore(fenced, authored) {
|
|
92
|
+
const keys = new WeakMap();
|
|
93
|
+
const read = async (key, type) => {
|
|
94
|
+
const blob = await authored.ask({ kind: 'authored.file', key, type });
|
|
95
|
+
keys.set(blob, key);
|
|
96
|
+
return blob;
|
|
221
97
|
};
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
opening.onupgradeneeded = (event) => {
|
|
226
|
-
const database = opening.result;
|
|
227
|
-
if (event.oldVersion === ATTACHMENT_SCHEMA && opening.transaction !== null) {
|
|
228
|
-
withoutAttachments(database, opening.transaction);
|
|
98
|
+
const restored = async (records) => Promise.all(records.map(async (record) => (await filed(JSON.parse(record), read))));
|
|
99
|
+
const amend = async (locator, id, amendment) => {
|
|
100
|
+
if (fenced(locator))
|
|
229
101
|
return;
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
database.createObjectStore(BINARY_FILES, { keyPath: ['locator', 'transfer', 'path'] });
|
|
236
|
-
database.createObjectStore(TRANSFERS, { keyPath: 'locator' });
|
|
237
|
-
database.createObjectStore(PENDING_CHANGES, { keyPath: ['locator', 'id'] });
|
|
238
|
-
database.createObjectStore(DECLARATIONS);
|
|
239
|
-
database.createObjectStore(ROOM_DRAFTS, { keyPath: ['locator', 'path'] });
|
|
240
|
-
database.createObjectStore(PRESENTATION, { keyPath: 'app' });
|
|
241
|
-
database.createObjectStore(CONVERSATIONS, { keyPath: 'conversation' });
|
|
242
|
-
const messages = database.createObjectStore(MESSAGES, {
|
|
243
|
-
keyPath: ['conversation', 'identity'],
|
|
102
|
+
await authored.ask({
|
|
103
|
+
kind: 'authored.amend',
|
|
104
|
+
locator,
|
|
105
|
+
id,
|
|
106
|
+
amendment: JSON.stringify(amendment),
|
|
244
107
|
});
|
|
245
|
-
messages.createIndex('conversation', 'conversation');
|
|
246
|
-
database.createObjectStore(CHAT_DRAFTS, { keyPath: 'conversation' });
|
|
247
108
|
};
|
|
248
|
-
const
|
|
109
|
+
const fact = (name) => authored.ask({ kind: 'authored.fact', name });
|
|
110
|
+
const queued = new Map();
|
|
111
|
+
const changed = new Map();
|
|
112
|
+
const change = (key) => changed.set(key, (changed.get(key) ?? 0) + 1);
|
|
113
|
+
const rows = (writes) => writes.map((write) => authoredRows(write, queued.get(write.locator)));
|
|
114
|
+
const noted = (writes) => {
|
|
115
|
+
for (const { locator, queue } of writes) {
|
|
116
|
+
if (queue !== undefined)
|
|
117
|
+
queued.set(locator, new Set(queue.map(({ id }) => id)));
|
|
118
|
+
}
|
|
119
|
+
};
|
|
249
120
|
return {
|
|
250
|
-
async
|
|
251
|
-
const
|
|
252
|
-
const
|
|
253
|
-
const
|
|
254
|
-
for (const {
|
|
255
|
-
|
|
121
|
+
async opened() {
|
|
122
|
+
const held = await authored.ask({ kind: 'replica.open' });
|
|
123
|
+
const unindexed = new Set(held.keys.flatMap(({ key, rederiving }) => (rederiving === null ? [] : [key])));
|
|
124
|
+
const overlaid = new Map();
|
|
125
|
+
for (const { key, path } of held.overlaid) {
|
|
126
|
+
const paths = overlaid.get(key) ?? new Set();
|
|
127
|
+
paths.add(path);
|
|
128
|
+
overlaid.set(key, paths);
|
|
256
129
|
}
|
|
257
|
-
return
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
batch,
|
|
285
|
-
drafts: saved?.get(batch.id) ?? [],
|
|
286
|
-
submission: { state: 'waiting' },
|
|
287
|
-
lost: false,
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
const draftStore = transaction.objectStore(ROOM_DRAFTS);
|
|
293
|
-
for (const path of consumedRoomDrafts ?? [])
|
|
294
|
-
draftStore.delete([next.locator, path]);
|
|
295
|
-
for (const record of roomDrafts ?? [])
|
|
296
|
-
draftStore.put(record);
|
|
297
|
-
await completed(transaction);
|
|
298
|
-
},
|
|
299
|
-
async revokeModels(records) {
|
|
300
|
-
const transaction = database.transaction(ROOMS, 'readwrite');
|
|
301
|
-
const rooms = transaction.objectStore(ROOMS);
|
|
302
|
-
const revoked = { status: 'unavailable', reason: 'revoked' };
|
|
303
|
-
for (const { record, queue } of records) {
|
|
304
|
-
rooms.put(roomRecord({ ...record, model: revoked, selectionModel: revoked }, queue));
|
|
305
|
-
}
|
|
306
|
-
await completed(transaction);
|
|
130
|
+
return {
|
|
131
|
+
rooms: new Map(held.rooms
|
|
132
|
+
.filter(({ locator }) => !fenced(locator))
|
|
133
|
+
.map(({ locator, key, record }) => [
|
|
134
|
+
locator,
|
|
135
|
+
{ ...JSON.parse(record), key },
|
|
136
|
+
])),
|
|
137
|
+
transfers: new Map(held.transfers
|
|
138
|
+
.filter(({ locator }) => !fenced(locator))
|
|
139
|
+
.map(({ locator, key, record }) => [
|
|
140
|
+
locator,
|
|
141
|
+
{ ...JSON.parse(record), key },
|
|
142
|
+
])),
|
|
143
|
+
unindexed,
|
|
144
|
+
overlaid,
|
|
145
|
+
erasing: held.erasing.length > 0,
|
|
146
|
+
orphans: held.orphans,
|
|
147
|
+
lastCompleted: json(held.facts.lastCompleted, null),
|
|
148
|
+
providerLimits: json(held.facts.providerLimits, []),
|
|
149
|
+
capabilities: json(held.facts.capabilities, []),
|
|
150
|
+
member: json(held.facts.member, null),
|
|
151
|
+
targets: json(held.facts.targets, {}),
|
|
152
|
+
presentation: held.presentation.map(({ app, value }) => ({
|
|
153
|
+
app,
|
|
154
|
+
value: JSON.parse(value),
|
|
155
|
+
})),
|
|
156
|
+
};
|
|
307
157
|
},
|
|
308
|
-
|
|
309
|
-
return (
|
|
158
|
+
counts(rooms) {
|
|
159
|
+
return authored.ask({ kind: 'replica.counts', rooms });
|
|
310
160
|
},
|
|
311
|
-
|
|
312
|
-
return
|
|
161
|
+
query(plan, rooms, budget) {
|
|
162
|
+
return authored.ask({ kind: 'replica.query', plan, rooms, budget });
|
|
313
163
|
},
|
|
314
|
-
|
|
315
|
-
return (
|
|
164
|
+
changes(keys) {
|
|
165
|
+
return keys.reduce((total, key) => total + (changed.get(key) ?? 0), 0);
|
|
316
166
|
},
|
|
317
|
-
|
|
318
|
-
return (
|
|
167
|
+
entries(key, view, paths) {
|
|
168
|
+
return authored.ask({ kind: 'replica.entries', key, view, paths });
|
|
319
169
|
},
|
|
320
|
-
|
|
321
|
-
return
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
170
|
+
typed(key, view, paths) {
|
|
171
|
+
return authored.ask({ kind: 'replica.typed', key, view, paths });
|
|
172
|
+
},
|
|
173
|
+
referrers(key, view, targets, kinds) {
|
|
174
|
+
return authored.ask({ kind: 'replica.referrers', key, view, targets, kinds });
|
|
175
|
+
},
|
|
176
|
+
walk(key, view, after, bytes) {
|
|
177
|
+
return authored.ask({ kind: 'replica.walk', key, view, after, bytes });
|
|
178
|
+
},
|
|
179
|
+
files(key, view, after, limit) {
|
|
180
|
+
return authored.ask({ kind: 'replica.files', key, view, after, limit });
|
|
181
|
+
},
|
|
182
|
+
typedWithin(key, view, roots, within) {
|
|
183
|
+
return authored.ask({ kind: 'replica.typedWithin', key, view, roots, within });
|
|
184
|
+
},
|
|
185
|
+
search(ask) {
|
|
186
|
+
return authored.ask({ kind: 'replica.search', ...ask });
|
|
326
187
|
},
|
|
327
|
-
async
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
188
|
+
async stage(record, composition, page, written) {
|
|
189
|
+
if (fenced(record.locator))
|
|
190
|
+
return null;
|
|
191
|
+
const { key, ...kept } = record;
|
|
192
|
+
return authored.ask({
|
|
193
|
+
kind: 'replica.stage',
|
|
194
|
+
locator: record.locator,
|
|
195
|
+
transfer: record.transfer,
|
|
196
|
+
record: JSON.stringify(kept),
|
|
197
|
+
key,
|
|
198
|
+
composition,
|
|
199
|
+
entries: page.entries,
|
|
200
|
+
folders: page.folders,
|
|
201
|
+
...(written === undefined ? {} : { written }),
|
|
202
|
+
});
|
|
331
203
|
},
|
|
332
|
-
async
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
204
|
+
async transferPart(locator, token) {
|
|
205
|
+
if (fenced(locator))
|
|
206
|
+
return null;
|
|
207
|
+
return authored.ask({ kind: 'replica.transferPart', locator, token });
|
|
208
|
+
},
|
|
209
|
+
async keepPart(locator, token, part) {
|
|
210
|
+
if (fenced(locator))
|
|
211
|
+
return;
|
|
212
|
+
await authored.ask({ kind: 'replica.keepPart', locator, token, part });
|
|
213
|
+
},
|
|
214
|
+
async refresh(key, page) {
|
|
215
|
+
await authored.ask({
|
|
216
|
+
kind: 'replica.refresh',
|
|
217
|
+
key,
|
|
218
|
+
entries: page.entries,
|
|
219
|
+
removals: page.removals,
|
|
220
|
+
folders: page.folders,
|
|
221
|
+
folderRemovals: page.folderRemovals,
|
|
222
|
+
});
|
|
223
|
+
},
|
|
224
|
+
async unrefresh(key) {
|
|
225
|
+
await authored.ask({ kind: 'replica.unrefresh', key });
|
|
226
|
+
},
|
|
227
|
+
async commit({ rooms, writes = [], files = [], whole = false, discards = [] }) {
|
|
228
|
+
const kept = whole ? writes : writes.filter(({ locator }) => !fenced(locator));
|
|
229
|
+
const refused = whole ? kept.find(({ locator }) => fenced(locator)) : undefined;
|
|
230
|
+
if (refused !== undefined) {
|
|
231
|
+
return { fenced: refused.locator, counts: {}, changed: {}, indexed: {} };
|
|
232
|
+
}
|
|
233
|
+
for (const room of rooms)
|
|
234
|
+
change(room.key);
|
|
235
|
+
const committed = await authored.ask({
|
|
236
|
+
kind: 'replica.commit',
|
|
237
|
+
...(kept.length === 0 && files.length === 0 && discards.length === 0
|
|
238
|
+
? {}
|
|
239
|
+
: { authored: { writes: rows(kept), files, whole, discards } }),
|
|
240
|
+
rooms: rooms.filter(({ locator }) => !fenced(locator)),
|
|
241
|
+
});
|
|
242
|
+
if (committed.fenced === null || !whole)
|
|
243
|
+
noted(kept);
|
|
244
|
+
for (const locator of discards)
|
|
245
|
+
queued.delete(locator);
|
|
246
|
+
return committed;
|
|
247
|
+
},
|
|
248
|
+
async fence(locators) {
|
|
249
|
+
await authored.ask({ kind: 'replica.fence', locators });
|
|
250
|
+
for (const locator of locators)
|
|
251
|
+
queued.delete(locator);
|
|
252
|
+
},
|
|
253
|
+
async erase(locator, limit) {
|
|
254
|
+
return (await authored.ask({ kind: 'replica.erase', locator, limit })).remaining;
|
|
255
|
+
},
|
|
256
|
+
async abandon(locator, kept = false) {
|
|
257
|
+
if (fenced(locator))
|
|
258
|
+
return null;
|
|
259
|
+
return authored.ask({ kind: 'replica.abandon', locator, kept });
|
|
260
|
+
},
|
|
261
|
+
async release(key) {
|
|
262
|
+
await authored.ask({ kind: 'replica.release', key });
|
|
263
|
+
},
|
|
264
|
+
async rederive(key, limit) {
|
|
265
|
+
change(key);
|
|
266
|
+
return (await authored.ask({ kind: 'replica.rederive', key, limit })).done;
|
|
267
|
+
},
|
|
268
|
+
async fact(name, value) {
|
|
269
|
+
await authored.ask({ kind: 'replica.fact', name, value: JSON.stringify(value) });
|
|
336
270
|
},
|
|
337
271
|
async queues() {
|
|
338
|
-
const
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
]);
|
|
272
|
+
const { queues, pending } = await authored.ask({ kind: 'authored.queues' });
|
|
273
|
+
queued.clear();
|
|
274
|
+
for (const queue of queues)
|
|
275
|
+
queued.set(queue.locator, new Set(queue.ids));
|
|
343
276
|
const byId = new Map(pending.map((record) => [`${record.locator}\0${record.id}`, record]));
|
|
344
|
-
return
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
277
|
+
return queues
|
|
278
|
+
.filter((queue) => !fenced(queue.locator))
|
|
279
|
+
.map((queue) => ({
|
|
280
|
+
locator: queue.locator,
|
|
281
|
+
pending: queue.ids.map((id) => {
|
|
282
|
+
const record = byId.get(`${queue.locator}\0${id}`);
|
|
348
283
|
if (record === undefined)
|
|
349
|
-
throw new Error(`Missing Pending Change ${
|
|
350
|
-
|
|
351
|
-
|
|
284
|
+
throw new Error(`Missing Pending Change ${queue.locator}/${id}`);
|
|
285
|
+
return {
|
|
286
|
+
batch: JSON.parse(record.batch),
|
|
287
|
+
state: JSON.parse(record.state),
|
|
288
|
+
};
|
|
352
289
|
}),
|
|
353
290
|
}));
|
|
354
291
|
},
|
|
355
292
|
submit(locator, id, submission, lost) {
|
|
356
|
-
return
|
|
357
|
-
},
|
|
358
|
-
accept(locator, id, roomVersion) {
|
|
359
|
-
return amendPending(database, locator, id, { accepted: roomVersion });
|
|
293
|
+
return amend(locator, id, { submission, lost });
|
|
360
294
|
},
|
|
361
295
|
keepUpload(locator, id, upload) {
|
|
362
|
-
return
|
|
296
|
+
return amend(locator, id, { upload });
|
|
363
297
|
},
|
|
364
298
|
async roomDrafts() {
|
|
365
|
-
const
|
|
366
|
-
return
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
const transaction = database.transaction(PRESENTATION, 'readonly');
|
|
370
|
-
return settled(transaction.objectStore(PRESENTATION).getAll());
|
|
299
|
+
const held = await authored.ask({ kind: 'authored.roomDrafts' });
|
|
300
|
+
return held
|
|
301
|
+
.map((record) => JSON.parse(record))
|
|
302
|
+
.filter((record) => !fenced(record.locator));
|
|
371
303
|
},
|
|
372
304
|
async present(record) {
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
const transaction = database.transaction([CONVERSATIONS, MESSAGES], 'readonly');
|
|
379
|
-
const [reads, messages] = await Promise.all([
|
|
380
|
-
settled(transaction.objectStore(CONVERSATIONS).getAll()),
|
|
381
|
-
settled(transaction.objectStore(MESSAGES).getAll()),
|
|
382
|
-
]);
|
|
383
|
-
const held = new Map();
|
|
384
|
-
for (const { conversation, read } of reads) {
|
|
385
|
-
held.set(conversation, { conversation, read, messages: [] });
|
|
386
|
-
}
|
|
387
|
-
for (const { conversation, ...message } of messages) {
|
|
388
|
-
const entry = held.get(conversation) ?? { conversation, read: undefined, messages: [] };
|
|
389
|
-
entry.messages.push(message);
|
|
390
|
-
held.set(conversation, entry);
|
|
391
|
-
}
|
|
392
|
-
return [...held.values()];
|
|
305
|
+
await authored.ask({
|
|
306
|
+
kind: 'replica.present',
|
|
307
|
+
app: record.app,
|
|
308
|
+
value: JSON.stringify(record.value ?? null),
|
|
309
|
+
});
|
|
393
310
|
},
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
311
|
+
conversations() {
|
|
312
|
+
return authored.ask({ kind: 'conversation.held' });
|
|
313
|
+
},
|
|
314
|
+
async keepMessages(write) {
|
|
315
|
+
await authored.ask({ kind: 'conversation.keep', ...write });
|
|
316
|
+
},
|
|
317
|
+
messageWindow(conversation, limit, before) {
|
|
318
|
+
return authored.ask({ kind: 'conversation.window', conversation, limit, before });
|
|
319
|
+
},
|
|
320
|
+
messageCount(conversation) {
|
|
321
|
+
return authored.ask({ kind: 'conversation.count', conversation });
|
|
322
|
+
},
|
|
323
|
+
turnArrived(conversation, turn) {
|
|
324
|
+
return authored.ask({ kind: 'conversation.turn', conversation, turn });
|
|
408
325
|
},
|
|
409
326
|
async dropConversations(conversations) {
|
|
410
|
-
|
|
411
|
-
const messages = transaction.objectStore(MESSAGES);
|
|
412
|
-
for (const conversation of conversations) {
|
|
413
|
-
transaction.objectStore(CONVERSATIONS).delete(conversation);
|
|
414
|
-
transaction.objectStore(CHAT_DRAFTS).delete(conversation);
|
|
415
|
-
const keys = messages.index('conversation').getAllKeys(conversation);
|
|
416
|
-
keys.onsuccess = () => {
|
|
417
|
-
for (const key of keys.result)
|
|
418
|
-
messages.delete(key);
|
|
419
|
-
};
|
|
420
|
-
}
|
|
421
|
-
await completed(transaction);
|
|
327
|
+
await authored.ask({ kind: 'conversation.drop', conversations });
|
|
422
328
|
},
|
|
423
329
|
async chatDrafts() {
|
|
424
|
-
const
|
|
425
|
-
return
|
|
426
|
-
},
|
|
427
|
-
async
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
330
|
+
const records = await authored.ask({ kind: 'authored.chatDrafts' });
|
|
331
|
+
return records.map((record) => JSON.parse(record));
|
|
332
|
+
},
|
|
333
|
+
async keepChatDrafts(records) {
|
|
334
|
+
await authored.ask({
|
|
335
|
+
kind: 'authored.chatDraft',
|
|
336
|
+
kept: records.map((record) => ({
|
|
337
|
+
conversation: record.conversation,
|
|
338
|
+
record: JSON.stringify(record),
|
|
339
|
+
})),
|
|
340
|
+
dropped: [],
|
|
341
|
+
});
|
|
431
342
|
},
|
|
432
343
|
async dropChatDraft(conversation) {
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
344
|
+
await authored.ask({ kind: 'authored.chatDraft', kept: [], dropped: [conversation] });
|
|
345
|
+
},
|
|
346
|
+
async calls() {
|
|
347
|
+
return restored(await authored.ask({ kind: 'authored.calls' }));
|
|
348
|
+
},
|
|
349
|
+
async keepCall(record) {
|
|
350
|
+
const { stored, ...kept } = keyed(keys, record);
|
|
351
|
+
await authored.ask({
|
|
352
|
+
kind: 'authored.call',
|
|
353
|
+
operation: record.operation,
|
|
354
|
+
kept,
|
|
355
|
+
files: stored,
|
|
356
|
+
});
|
|
357
|
+
},
|
|
358
|
+
async dropCall(operation) {
|
|
359
|
+
await authored.ask({ kind: 'authored.call', operation, kept: null, files: [] });
|
|
436
360
|
},
|
|
437
|
-
async keepRoomDraft(record) {
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
361
|
+
async keepRoomDraft(record, files) {
|
|
362
|
+
if (fenced(record.locator))
|
|
363
|
+
return;
|
|
364
|
+
const { path, ...kept } = roomDraftRow(record);
|
|
365
|
+
await authored.ask({
|
|
366
|
+
kind: 'authored.roomDraft',
|
|
367
|
+
locator: record.locator,
|
|
368
|
+
path,
|
|
369
|
+
kept,
|
|
370
|
+
files,
|
|
371
|
+
});
|
|
441
372
|
},
|
|
442
373
|
async discardRoomDraft(locator, path) {
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
await
|
|
446
|
-
},
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
async stage(record, page) {
|
|
469
|
-
const transaction = database.transaction([TRANSFERS, DOCUMENTS, BINARY_FILES], 'readwrite');
|
|
470
|
-
writeLayer(transaction, record.locator, record.transfer, page, null);
|
|
471
|
-
transaction.objectStore(TRANSFERS).put(record);
|
|
472
|
-
await completed(transaction);
|
|
473
|
-
},
|
|
474
|
-
async abandon(locator) {
|
|
475
|
-
const transaction = database.transaction([TRANSFERS, DOCUMENTS, BINARY_FILES], 'readwrite');
|
|
476
|
-
const transfers = transaction.objectStore(TRANSFERS);
|
|
477
|
-
const held = transfers.get(locator);
|
|
478
|
-
held.onsuccess = () => {
|
|
479
|
-
const record = held.result;
|
|
480
|
-
if (record === undefined)
|
|
481
|
-
return;
|
|
482
|
-
transfers.delete(locator);
|
|
483
|
-
const range = underTransfer(locator, record.transfer);
|
|
484
|
-
transaction.objectStore(DOCUMENTS).delete(range);
|
|
485
|
-
transaction.objectStore(BINARY_FILES).delete(range);
|
|
486
|
-
};
|
|
487
|
-
await completed(transaction);
|
|
374
|
+
if (fenced(locator))
|
|
375
|
+
return;
|
|
376
|
+
await authored.ask({ kind: 'authored.roomDraft', locator, path, kept: null, files: [] });
|
|
377
|
+
},
|
|
378
|
+
fences() {
|
|
379
|
+
return authored.ask({ kind: 'authored.fences' });
|
|
380
|
+
},
|
|
381
|
+
receivedHeads() {
|
|
382
|
+
return authored.ask({ kind: 'replica.received' });
|
|
383
|
+
},
|
|
384
|
+
receivedParts(key, count) {
|
|
385
|
+
return authored.ask({ kind: 'replica.receivedParts', key, count });
|
|
386
|
+
},
|
|
387
|
+
async keepReceived(key, head, part) {
|
|
388
|
+
await authored.ask({
|
|
389
|
+
kind: 'replica.receive',
|
|
390
|
+
key,
|
|
391
|
+
head: JSON.stringify(head),
|
|
392
|
+
...(part === undefined
|
|
393
|
+
? {}
|
|
394
|
+
: { part: { index: part.index, value: JSON.stringify(part.value) } }),
|
|
395
|
+
});
|
|
396
|
+
},
|
|
397
|
+
async dropReceived(keys) {
|
|
398
|
+
await authored.ask({ kind: 'replica.unreceive', keys });
|
|
488
399
|
},
|
|
489
|
-
|
|
490
|
-
return (
|
|
400
|
+
generation() {
|
|
401
|
+
return fact('generation');
|
|
491
402
|
},
|
|
492
|
-
rememberGeneration(value) {
|
|
493
|
-
|
|
403
|
+
async rememberGeneration(value) {
|
|
404
|
+
await authored.ask({ kind: 'authored.remember', name: 'generation', value });
|
|
494
405
|
},
|
|
495
|
-
|
|
496
|
-
|
|
406
|
+
file(key, type) {
|
|
407
|
+
return authored.ask({ kind: 'authored.file', key, type });
|
|
497
408
|
},
|
|
498
409
|
};
|
|
499
410
|
}
|