@agentshouse/mdruntime 0.1.0-ce531b51ff088 → 0.1.0-ce6bc9239a3ee
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 +25 -12
- package/dist/acceptance.d.ts +26 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +384 -0
- package/dist/adapter.d.ts +218 -62
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +1 -9
- package/dist/attached-model.d.ts +8 -0
- package/dist/attached-model.d.ts.map +1 -0
- package/dist/attached-model.js +46 -0
- package/dist/attempt.d.ts +16 -0
- package/dist/attempt.d.ts.map +1 -0
- package/dist/attempt.js +70 -0
- package/dist/binary.d.ts +18 -0
- package/dist/binary.d.ts.map +1 -0
- package/dist/binary.js +8 -0
- package/dist/bootstrap.d.ts +40 -6
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +336 -51
- 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 +9 -14
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +11 -56
- package/dist/change.d.ts +46 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +34 -0
- package/dist/chat-types.d.ts +3 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +2 -0
- package/dist/client.d.ts +50 -18
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +162 -30
- package/dist/collection.d.ts +13 -14
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +52 -56
- package/dist/compile.d.ts +16 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +717 -0
- package/dist/connection.d.ts +63 -48
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +2487 -1575
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +7 -0
- package/dist/conversation-row.d.ts +33 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +47 -0
- package/dist/conversation.d.ts +72 -22
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +1008 -273
- 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 +10 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +20 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +161 -0
- package/dist/expectation.d.ts +21 -0
- package/dist/expectation.d.ts.map +1 -0
- package/dist/expectation.js +70 -0
- package/dist/failure.d.ts +13 -0
- package/dist/failure.d.ts.map +1 -0
- package/dist/failure.js +19 -0
- package/dist/figures.d.ts +48 -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/host.d.ts +18 -2
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +164 -50
- package/dist/identity.d.ts +3 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +13 -1
- package/dist/index.d.ts +31 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/install.d.ts +86 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +537 -0
- package/dist/job.d.ts +33 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +54 -0
- package/dist/live.d.ts +23 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +165 -0
- package/dist/log.d.ts +1 -0
- package/dist/log.d.ts.map +1 -1
- 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 +30 -9
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +337 -86
- package/dist/messages.d.ts +52 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +168 -0
- package/dist/model.d.ts +17 -16
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +9 -9
- package/dist/name.d.ts +4 -0
- package/dist/name.d.ts.map +1 -0
- package/dist/name.js +122 -0
- package/dist/observation.d.ts +22 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +133 -17
- package/dist/open.d.ts +2 -0
- package/dist/open.d.ts.map +1 -0
- package/dist/open.js +1 -0
- 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 +73 -5
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +84 -1
- package/dist/overlay.d.ts +16 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +147 -180
- package/dist/parts.d.ts +59 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +118 -0
- package/dist/paths.d.ts +1 -1
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +4 -16
- package/dist/query.d.ts +56 -180
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -422
- package/dist/questions.d.ts +32 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +118 -0
- package/dist/reach.d.ts +54 -0
- package/dist/reach.d.ts.map +1 -0
- package/dist/reach.js +494 -0
- package/dist/react.d.ts +46 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +54 -0
- package/dist/read.d.ts +7 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +17 -0
- package/dist/readiness.d.ts +50 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +27 -0
- package/dist/reads.d.ts +36 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +136 -0
- package/dist/recovery.d.ts +26 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +232 -0
- package/dist/refresh.d.ts +21 -7
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +155 -55
- package/dist/replica.d.ts +58 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +355 -158
- package/dist/room-draft.d.ts +62 -11
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +281 -83
- package/dist/room-drafts.d.ts +29 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +216 -0
- package/dist/rows.d.ts +32 -34
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +65 -87
- package/dist/save.d.ts +74 -6
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +902 -182
- package/dist/saves.d.ts +96 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +999 -0
- package/dist/search.d.ts +15 -54
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +10 -121
- package/dist/seed.d.ts +30 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +141 -0
- package/dist/shared.d.ts +15 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +421 -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/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket.d.ts +43 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +96 -0
- package/dist/source.d.ts +61 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +81 -0
- package/dist/status.d.ts +7 -4
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -15
- package/dist/store/fences.d.ts +16 -0
- package/dist/store/fences.d.ts.map +1 -0
- package/dist/store/fences.js +26 -0
- package/dist/store/installs.d.ts +30 -0
- package/dist/store/installs.d.ts.map +1 -0
- package/dist/store/installs.js +34 -0
- package/dist/store/records.d.ts +212 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +408 -0
- package/dist/store/room-held.d.ts +8 -0
- package/dist/store/room-held.d.ts.map +1 -0
- package/dist/store/room-held.js +17 -0
- package/dist/store/watchers.d.ts +15 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +36 -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 +77 -94
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +118 -389
- package/dist/stored.d.ts +156 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +637 -0
- package/dist/tables.d.ts +407 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +724 -0
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +129 -0
- package/dist/transfer.d.ts +0 -5
- package/dist/transfer.d.ts.map +1 -1
- package/dist/turn.d.ts +9 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +75 -0
- package/dist/validation.d.ts +29 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +104 -0
- package/dist/windows.d.ts +11 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +16 -0
- package/dist/wire.d.ts +205 -19
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +95 -61
- package/package.json +33 -10
- package/AGENTS.md +0 -207
- package/dist/attachment.d.ts +0 -3
- package/dist/attachment.d.ts.map +0 -1
- package/dist/attachment.js +0 -8
- package/dist/read-side.d.ts +0 -14
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -371
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stored.d.ts","sourceRoot":"","sources":["../src/stored.ts"],"names":[],"mappings":"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"}
|
package/dist/stored.js
ADDED
|
@@ -0,0 +1,637 @@
|
|
|
1
|
+
import { instantKey, sql } from '@agentshouse/mdmodel';
|
|
2
|
+
import { composedOf } from './collection.js';
|
|
3
|
+
import { described, derived, heldOf } from './rows.js';
|
|
4
|
+
export const REPLICA_TABLES = [
|
|
5
|
+
'CREATE TABLE replica_keys (key INTEGER PRIMARY KEY AUTOINCREMENT, locator TEXT NOT NULL, transfer TEXT NOT NULL, fingerprint TEXT NOT NULL, rederiving INTEGER)',
|
|
6
|
+
'CREATE TABLE replica_rooms (locator TEXT PRIMARY KEY, key INTEGER NOT NULL, record TEXT NOT NULL, documents INTEGER NOT NULL DEFAULT 0) WITHOUT ROWID',
|
|
7
|
+
'CREATE TABLE replica_models (identity TEXT NOT NULL, version TEXT NOT NULL, schema TEXT NOT NULL, PRIMARY KEY (identity, version)) WITHOUT ROWID',
|
|
8
|
+
"CREATE TABLE replica_entries (id INTEGER PRIMARY KEY, key INTEGER NOT NULL, layer INTEGER NOT NULL, path TEXT NOT NULL, visible INTEGER NOT NULL, present INTEGER NOT NULL, queried INTEGER NOT NULL, binary TEXT, revision TEXT, file_id TEXT, change TEXT, written TEXT, type TEXT, declared TEXT, folder TEXT NOT NULL, fields TEXT, links TEXT, part TEXT, created TEXT, created_instant TEXT, changed_instant TEXT, bytes INTEGER GENERATED ALWAYS AS (CASE WHEN binary IS NULL THEN length(CAST(content AS BLOB)) ELSE binary ->> '$.byteLength' END) STORED, content TEXT)",
|
|
9
|
+
'CREATE UNIQUE INDEX replica_entries_path ON replica_entries (key, layer, path)',
|
|
10
|
+
'CREATE INDEX replica_entries_visible ON replica_entries (key, visible, present, path, binary)',
|
|
11
|
+
'CREATE INDEX replica_entries_folder ON replica_entries (key, folder, path)',
|
|
12
|
+
'CREATE INDEX replica_entries_type ON replica_entries (key, type, visible, present, queried, folder)',
|
|
13
|
+
'CREATE INDEX replica_entries_key ON replica_entries (key)',
|
|
14
|
+
sql.VALUE_TABLE,
|
|
15
|
+
'CREATE TABLE replica_links (doc INTEGER NOT NULL, key INTEGER NOT NULL, kind TEXT NOT NULL, keys TEXT NOT NULL, places TEXT NOT NULL, target TEXT NOT NULL, field TEXT NOT NULL, PRIMARY KEY (doc, kind, keys, places, target)) WITHOUT ROWID',
|
|
16
|
+
'CREATE INDEX replica_links_target ON replica_links (key, target, kind, keys)',
|
|
17
|
+
'CREATE TABLE replica_folders (key INTEGER NOT NULL, layer INTEGER NOT NULL, path TEXT NOT NULL, present INTEGER NOT NULL, part TEXT, PRIMARY KEY (key, layer, path)) WITHOUT ROWID',
|
|
18
|
+
'CREATE TABLE replica_erasing (key INTEGER PRIMARY KEY, locator TEXT NOT NULL)',
|
|
19
|
+
'CREATE TABLE replica_facts (name TEXT PRIMARY KEY, value TEXT NOT NULL) WITHOUT ROWID',
|
|
20
|
+
'CREATE TABLE replica_presentation (app TEXT PRIMARY KEY, value TEXT NOT NULL) WITHOUT ROWID',
|
|
21
|
+
];
|
|
22
|
+
const CONFIRMED = 0;
|
|
23
|
+
const OVERLAY = 1;
|
|
24
|
+
const REFRESHED = 2;
|
|
25
|
+
const DERIVED_ROWS = 64;
|
|
26
|
+
const ENTRY_WEIGHT = 256;
|
|
27
|
+
const ABSENT = {
|
|
28
|
+
type: null,
|
|
29
|
+
declared: null,
|
|
30
|
+
queried: false,
|
|
31
|
+
folder: '',
|
|
32
|
+
fields: null,
|
|
33
|
+
links: null,
|
|
34
|
+
};
|
|
35
|
+
function text(value) {
|
|
36
|
+
return typeof value === 'string' ? value : null;
|
|
37
|
+
}
|
|
38
|
+
function number(value) {
|
|
39
|
+
return typeof value === 'bigint' ? Number(value) : value;
|
|
40
|
+
}
|
|
41
|
+
function json(value) {
|
|
42
|
+
return typeof value === 'string' ? JSON.parse(value) : null;
|
|
43
|
+
}
|
|
44
|
+
function flag(value) {
|
|
45
|
+
return value ? 1 : 0;
|
|
46
|
+
}
|
|
47
|
+
function paths(list) {
|
|
48
|
+
return JSON.stringify(list);
|
|
49
|
+
}
|
|
50
|
+
function dropDerived(connection, doc) {
|
|
51
|
+
connection.run('DELETE FROM replica_values WHERE doc = ?', [doc]);
|
|
52
|
+
connection.run('DELETE FROM replica_links WHERE doc = ?', [doc]);
|
|
53
|
+
}
|
|
54
|
+
function writeDerived(connection, doc, key, path, held, composition) {
|
|
55
|
+
const made = derived(path, held, composition);
|
|
56
|
+
if (made.values.length > 0) {
|
|
57
|
+
const inserted = sql.insertedValues(doc, made.values);
|
|
58
|
+
connection.run(inserted.sql, inserted.bind);
|
|
59
|
+
}
|
|
60
|
+
if (made.links.length > 0) {
|
|
61
|
+
connection.run('INSERT OR IGNORE INTO replica_links (doc, key, kind, keys, places, target, field) SELECT ?, ?, value ->> 0, value ->> 1, value ->> 2, value ->> 3, value ->> 4 FROM json_each(?)', [
|
|
62
|
+
doc,
|
|
63
|
+
key,
|
|
64
|
+
JSON.stringify(made.links.map((link) => [link.kind, link.keys, link.places, link.target, link.field])),
|
|
65
|
+
]);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function entryId(connection, key, layer, path) {
|
|
69
|
+
const [row] = connection.rows('SELECT id FROM replica_entries WHERE key = ? AND layer = ? AND path = ?', [key, layer, path]);
|
|
70
|
+
return row === undefined ? null : number(row.id);
|
|
71
|
+
}
|
|
72
|
+
function removeEntry(connection, key, layer, path) {
|
|
73
|
+
const id = entryId(connection, key, layer, path);
|
|
74
|
+
if (id === null)
|
|
75
|
+
return;
|
|
76
|
+
dropDerived(connection, id);
|
|
77
|
+
connection.run('DELETE FROM replica_entries WHERE id = ?', [id]);
|
|
78
|
+
}
|
|
79
|
+
function insertEntry(connection, key, layer, entry, present, made, part = null) {
|
|
80
|
+
connection.run('INSERT INTO replica_entries (key, layer, path, visible, present, queried, content, binary, revision, file_id, created, created_instant, change, changed_instant, written, type, declared, folder, fields, links, part) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [
|
|
81
|
+
key,
|
|
82
|
+
layer,
|
|
83
|
+
entry.path,
|
|
84
|
+
flag(present && layer !== REFRESHED),
|
|
85
|
+
flag(present),
|
|
86
|
+
flag(made.queried),
|
|
87
|
+
entry.binary === null ? entry.content : null,
|
|
88
|
+
entry.binary === null ? null : JSON.stringify(entry.binary),
|
|
89
|
+
entry.revision,
|
|
90
|
+
entry.fileId,
|
|
91
|
+
entry.created,
|
|
92
|
+
instantKey(entry.created),
|
|
93
|
+
entry.change === null ? null : JSON.stringify(entry.change),
|
|
94
|
+
instantKey(entry.change?.time),
|
|
95
|
+
entry.written,
|
|
96
|
+
made.type,
|
|
97
|
+
made.declared,
|
|
98
|
+
made.folder,
|
|
99
|
+
made.fields,
|
|
100
|
+
made.links,
|
|
101
|
+
part,
|
|
102
|
+
]);
|
|
103
|
+
}
|
|
104
|
+
function textOf(entry) {
|
|
105
|
+
return entry.binary === null ? entry.content : null;
|
|
106
|
+
}
|
|
107
|
+
function putEntry(connection, key, layer, entry, present, composition) {
|
|
108
|
+
removeEntry(connection, key, layer, entry.path);
|
|
109
|
+
const content = textOf(entry);
|
|
110
|
+
insertEntry(connection, key, layer, entry, present, present ? described(entry.path, content, entry.facts) : ABSENT);
|
|
111
|
+
if (!present)
|
|
112
|
+
return;
|
|
113
|
+
const id = entryId(connection, key, layer, entry.path);
|
|
114
|
+
writeDerived(connection, id, key, entry.path, heldOf(entry.path, content, entry.facts), composition);
|
|
115
|
+
}
|
|
116
|
+
function placeEntry(connection, key, entry, part) {
|
|
117
|
+
removeEntry(connection, key, CONFIRMED, entry.path);
|
|
118
|
+
insertEntry(connection, key, CONFIRMED, entry, true, described(entry.path, textOf(entry), entry.facts), part);
|
|
119
|
+
}
|
|
120
|
+
function revealed(connection, key, touched) {
|
|
121
|
+
if (touched.length === 0)
|
|
122
|
+
return;
|
|
123
|
+
connection.run(`UPDATE replica_entries SET visible = CASE WHEN layer = ${OVERLAY} THEN present ELSE NOT EXISTS (SELECT 1 FROM replica_entries o WHERE o.key = replica_entries.key AND o.layer = ${OVERLAY} AND o.path = replica_entries.path) END WHERE key = ? AND layer IN (${CONFIRMED}, ${OVERLAY}) AND path IN (SELECT value FROM json_each(?))`, [key, paths(touched)]);
|
|
124
|
+
}
|
|
125
|
+
function newKey(connection, locator, transfer, fingerprint, built) {
|
|
126
|
+
const owed = built ? null : 0;
|
|
127
|
+
connection.run('INSERT INTO replica_keys (locator, transfer, fingerprint, rederiving) VALUES (?, ?, ?, ?)', [locator, transfer, fingerprint, owed]);
|
|
128
|
+
const [row] = connection.rows('SELECT last_insert_rowid() AS key');
|
|
129
|
+
return number(row.key);
|
|
130
|
+
}
|
|
131
|
+
function recomposed(connection, key, fingerprint) {
|
|
132
|
+
const [row] = connection.rows('SELECT fingerprint FROM replica_keys WHERE key = ?', [key]);
|
|
133
|
+
if (row === undefined || text(row.fingerprint) === fingerprint)
|
|
134
|
+
return;
|
|
135
|
+
const held = connection.rows('SELECT 1 FROM replica_entries WHERE key = ? LIMIT 1', [key]);
|
|
136
|
+
connection.run(`UPDATE replica_keys SET fingerprint = ?${held.length === 0 ? '' : ', rederiving = 0'} WHERE key = ?`, [fingerprint, key]);
|
|
137
|
+
}
|
|
138
|
+
export function entered(connection, locator, composition, rows) {
|
|
139
|
+
const key = newKey(connection, locator, '', composedOf(composition).fingerprint, true);
|
|
140
|
+
for (const entry of rows)
|
|
141
|
+
putEntry(connection, key, CONFIRMED, entry, true, composition);
|
|
142
|
+
return key;
|
|
143
|
+
}
|
|
144
|
+
export function stage(connection, request) {
|
|
145
|
+
if (request.key === null) {
|
|
146
|
+
for (const row of connection.rows(STAGED_KEYS, [request.locator])) {
|
|
147
|
+
erasing(connection, number(row.key), request.locator);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const key = request.key ??
|
|
151
|
+
newKey(connection, request.locator, request.transfer, request.fingerprint, false);
|
|
152
|
+
recomposed(connection, key, request.fingerprint);
|
|
153
|
+
owing(connection, key);
|
|
154
|
+
for (const entry of request.entries)
|
|
155
|
+
placeEntry(connection, key, entry, request.part);
|
|
156
|
+
for (const path of request.folders) {
|
|
157
|
+
connection.run('INSERT OR REPLACE INTO replica_folders (key, layer, path, present, part) VALUES (?, ?, ?, 1, ?)', [key, CONFIRMED, path, request.part]);
|
|
158
|
+
}
|
|
159
|
+
return key;
|
|
160
|
+
}
|
|
161
|
+
function owing(connection, key) {
|
|
162
|
+
connection.run('UPDATE replica_keys SET rederiving = coalesce(rederiving, last) FROM (SELECT coalesce(max(id), 0) AS last FROM replica_entries) WHERE key = ?', [key]);
|
|
163
|
+
}
|
|
164
|
+
const STAGED_KEYS = `SELECT k.key, k.transfer FROM replica_keys k WHERE k.locator = ?
|
|
165
|
+
AND NOT EXISTS (SELECT 1 FROM replica_rooms r WHERE r.key = k.key)
|
|
166
|
+
AND NOT EXISTS (SELECT 1 FROM replica_erasing e WHERE e.key = k.key)
|
|
167
|
+
ORDER BY k.key DESC`;
|
|
168
|
+
const UNPARTED = `EXISTS (SELECT 1 FROM replica_entries e WHERE e.key = k.key AND e.part IS NULL)
|
|
169
|
+
OR EXISTS (SELECT 1 FROM replica_folders f WHERE f.key = k.key AND f.part IS NULL)`;
|
|
170
|
+
function partsOf(connection, key, layer) {
|
|
171
|
+
const scoped = layer === null ? '' : ` AND layer = ${layer}`;
|
|
172
|
+
return new Set(connection
|
|
173
|
+
.rows(`SELECT part FROM replica_entries WHERE key = ?${scoped} AND part IS NOT NULL UNION SELECT part FROM replica_folders WHERE key = ?${scoped} AND part IS NOT NULL`, [key, key])
|
|
174
|
+
.map((row) => text(row.part)));
|
|
175
|
+
}
|
|
176
|
+
function resumable(connection, locator) {
|
|
177
|
+
let kept = null;
|
|
178
|
+
for (const row of connection.rows(STAGED_KEYS, [locator])) {
|
|
179
|
+
const key = number(row.key);
|
|
180
|
+
const parted = kept === null &&
|
|
181
|
+
connection.rows(`SELECT 1 FROM replica_keys k WHERE k.key = ? AND NOT (${UNPARTED})`, [key])
|
|
182
|
+
.length > 0;
|
|
183
|
+
if (parted)
|
|
184
|
+
kept = { key, transfer: text(row.transfer) };
|
|
185
|
+
else
|
|
186
|
+
erasing(connection, key, locator);
|
|
187
|
+
}
|
|
188
|
+
return kept;
|
|
189
|
+
}
|
|
190
|
+
export function resume(connection, request) {
|
|
191
|
+
const wanted = new Set(request.parts);
|
|
192
|
+
const held = resumable(connection, request.locator);
|
|
193
|
+
const staged = held === null ? new Set() : partsOf(connection, held.key, null);
|
|
194
|
+
const dropped = [...staged].filter((part) => !wanted.has(part));
|
|
195
|
+
if (held !== null && dropped.length > 0) {
|
|
196
|
+
const named = JSON.stringify(dropped);
|
|
197
|
+
const rows = `SELECT id FROM replica_entries WHERE key = ? AND part IN (SELECT value FROM json_each(?))`;
|
|
198
|
+
for (const table of ['replica_values', 'replica_links']) {
|
|
199
|
+
connection.run(`DELETE FROM ${table} WHERE doc IN (${rows})`, [held.key, named]);
|
|
200
|
+
}
|
|
201
|
+
connection.run(`DELETE FROM replica_entries WHERE id IN (${rows})`, [held.key, named]);
|
|
202
|
+
connection.run('DELETE FROM replica_folders WHERE key = ? AND part IN (SELECT value FROM json_each(?))', [held.key, named]);
|
|
203
|
+
}
|
|
204
|
+
const kept = [...staged].filter((part) => wanted.has(part));
|
|
205
|
+
const publishedParts = request.published === null
|
|
206
|
+
? new Set()
|
|
207
|
+
: partsOf(connection, request.published, CONFIRMED);
|
|
208
|
+
const copied = request.parts.filter((part) => !staged.has(part) && publishedParts.has(part));
|
|
209
|
+
if (held === null && copied.length === 0) {
|
|
210
|
+
return { key: null, transfer: request.transfer, staged: [] };
|
|
211
|
+
}
|
|
212
|
+
const key = held?.key ?? newKey(connection, request.locator, request.transfer, request.fingerprint, false);
|
|
213
|
+
recomposed(connection, key, request.fingerprint);
|
|
214
|
+
if (copied.length > 0 && request.published !== null) {
|
|
215
|
+
owing(connection, key);
|
|
216
|
+
const named = JSON.stringify(copied);
|
|
217
|
+
connection.run(`INSERT INTO replica_entries (key, layer, path, visible, present, queried, content, binary, revision, file_id, created, created_instant, change, changed_instant, written, type, declared, folder, fields, links, part) SELECT ?, ${CONFIRMED}, path, 1, 1, queried, content, binary, revision, file_id, created, created_instant, change, changed_instant, written, type, declared, folder, fields, links, part FROM replica_entries WHERE key = ? AND layer = ${CONFIRMED} AND present = 1 AND part IN (SELECT value FROM json_each(?)) ORDER BY path`, [key, request.published, named]);
|
|
218
|
+
connection.run(`INSERT OR REPLACE INTO replica_folders (key, layer, path, present, part) SELECT ?, ${CONFIRMED}, path, 1, part FROM replica_folders WHERE key = ? AND layer = ${CONFIRMED} AND present = 1 AND part IN (SELECT value FROM json_each(?))`, [key, request.published, named]);
|
|
219
|
+
}
|
|
220
|
+
return { key, transfer: held?.transfer ?? request.transfer, staged: [...kept, ...copied] };
|
|
221
|
+
}
|
|
222
|
+
export function refreshing(connection, request) {
|
|
223
|
+
const held = connection.rows('SELECT 1 FROM replica_keys k WHERE k.key = ? AND NOT EXISTS (SELECT 1 FROM replica_erasing e WHERE e.key = k.key)', [request.key]);
|
|
224
|
+
if (held.length === 0)
|
|
225
|
+
return null;
|
|
226
|
+
recomposed(connection, request.key, request.composed.fingerprint);
|
|
227
|
+
const composition = request.composed.composition;
|
|
228
|
+
for (const entry of request.entries) {
|
|
229
|
+
putEntry(connection, request.key, REFRESHED, entry, true, composition);
|
|
230
|
+
}
|
|
231
|
+
for (const path of request.removals) {
|
|
232
|
+
putEntry(connection, request.key, REFRESHED, {
|
|
233
|
+
path,
|
|
234
|
+
content: null,
|
|
235
|
+
binary: null,
|
|
236
|
+
revision: null,
|
|
237
|
+
fileId: null,
|
|
238
|
+
created: null,
|
|
239
|
+
change: null,
|
|
240
|
+
written: null,
|
|
241
|
+
facts: null,
|
|
242
|
+
}, false, composition);
|
|
243
|
+
}
|
|
244
|
+
for (const [list, present] of [
|
|
245
|
+
[request.folders, 1],
|
|
246
|
+
[request.folderRemovals, 0],
|
|
247
|
+
]) {
|
|
248
|
+
for (const path of list) {
|
|
249
|
+
connection.run('INSERT OR REPLACE INTO replica_folders (key, layer, path, present) VALUES (?, ?, ?, ?)', [request.key, REFRESHED, path, present]);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
function dropLayer(connection, key, layer) {
|
|
255
|
+
for (const table of ['replica_values', 'replica_links']) {
|
|
256
|
+
connection.run(`DELETE FROM ${table} WHERE doc IN (SELECT id FROM replica_entries WHERE key = ? AND layer = ?)`, [key, layer]);
|
|
257
|
+
}
|
|
258
|
+
connection.run('DELETE FROM replica_entries WHERE key = ? AND layer = ?', [key, layer]);
|
|
259
|
+
connection.run('DELETE FROM replica_folders WHERE key = ? AND layer = ?', [key, layer]);
|
|
260
|
+
}
|
|
261
|
+
export function unrefresh(connection, key) {
|
|
262
|
+
dropLayer(connection, key, REFRESHED);
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
function refreshedPaths(connection, key) {
|
|
266
|
+
return connection
|
|
267
|
+
.rows('SELECT path FROM replica_entries WHERE key = ? AND layer = ?', [key, REFRESHED])
|
|
268
|
+
.map((row) => text(row.path));
|
|
269
|
+
}
|
|
270
|
+
function applyRefresh(connection, key) {
|
|
271
|
+
const touched = refreshedPaths(connection, key);
|
|
272
|
+
const replaced = `SELECT c.id FROM replica_entries c JOIN replica_entries r ON r.key = c.key AND r.layer = ${REFRESHED} AND r.path = c.path WHERE c.key = ? AND c.layer = ${CONFIRMED}`;
|
|
273
|
+
for (const table of ['replica_values', 'replica_links']) {
|
|
274
|
+
connection.run(`DELETE FROM ${table} WHERE doc IN (${replaced})`, [key]);
|
|
275
|
+
}
|
|
276
|
+
connection.run(`DELETE FROM replica_entries WHERE id IN (${replaced})`, [key]);
|
|
277
|
+
connection.run('DELETE FROM replica_entries WHERE key = ? AND layer = ? AND present = 0', [
|
|
278
|
+
key,
|
|
279
|
+
REFRESHED,
|
|
280
|
+
]);
|
|
281
|
+
connection.run('UPDATE replica_entries SET layer = ? WHERE key = ? AND layer = ?', [
|
|
282
|
+
CONFIRMED,
|
|
283
|
+
key,
|
|
284
|
+
REFRESHED,
|
|
285
|
+
]);
|
|
286
|
+
connection.run(`DELETE FROM replica_folders WHERE key = ? AND layer = ${CONFIRMED} AND path IN (SELECT path FROM replica_folders WHERE key = ? AND layer = ${REFRESHED})`, [key, key]);
|
|
287
|
+
connection.run(`UPDATE replica_folders SET layer = ${CONFIRMED} WHERE key = ? AND layer = ${REFRESHED} AND present = 1`, [key]);
|
|
288
|
+
connection.run('DELETE FROM replica_folders WHERE key = ? AND layer = ?', [key, REFRESHED]);
|
|
289
|
+
return touched;
|
|
290
|
+
}
|
|
291
|
+
function beneathRoots(path) {
|
|
292
|
+
return `EXISTS (SELECT 1 FROM json_each(?) r WHERE ${path} = r.value OR (${path} >= r.value || '/' AND ${path} < r.value || '0'))`;
|
|
293
|
+
}
|
|
294
|
+
function counted(connection, key, roots) {
|
|
295
|
+
const [row] = connection.rows(`SELECT count(*) AS held FROM replica_entries WHERE key = ? AND visible = 1 AND present = 1 AND (binary IS NOT NULL OR substr(path, -3) = '.md') AND NOT ${beneathRoots('replica_entries.path')}`, [key, JSON.stringify(roots)]);
|
|
296
|
+
return number(row.held);
|
|
297
|
+
}
|
|
298
|
+
function erasing(connection, key, locator) {
|
|
299
|
+
connection.run('INSERT OR REPLACE INTO replica_erasing (key, locator) VALUES (?, ?)', [
|
|
300
|
+
key,
|
|
301
|
+
locator,
|
|
302
|
+
]);
|
|
303
|
+
}
|
|
304
|
+
function saved(connection, key, entry, at) {
|
|
305
|
+
if (!entry.present || entry.created !== null)
|
|
306
|
+
return entry;
|
|
307
|
+
const [held] = connection.rows(`SELECT created FROM replica_entries WHERE key = ? AND layer = ${OVERLAY} AND path = ? AND present = 1`, [key, entry.path]);
|
|
308
|
+
return { ...entry, created: text(held?.created) ?? at };
|
|
309
|
+
}
|
|
310
|
+
function commitRoom(connection, room) {
|
|
311
|
+
const touched = new Set();
|
|
312
|
+
recomposed(connection, room.key, room.composed.fingerprint);
|
|
313
|
+
const composition = room.composed.composition;
|
|
314
|
+
if (room.published !== undefined &&
|
|
315
|
+
room.published.from !== null &&
|
|
316
|
+
room.published.from !== room.key) {
|
|
317
|
+
erasing(connection, room.published.from, room.locator);
|
|
318
|
+
}
|
|
319
|
+
if (room.refreshed === true) {
|
|
320
|
+
for (const path of applyRefresh(connection, room.key))
|
|
321
|
+
touched.add(path);
|
|
322
|
+
}
|
|
323
|
+
for (const entry of room.confirmed?.set ?? []) {
|
|
324
|
+
putEntry(connection, room.key, CONFIRMED, entry, true, composition);
|
|
325
|
+
touched.add(entry.path);
|
|
326
|
+
}
|
|
327
|
+
for (const path of room.confirmed?.removed ?? []) {
|
|
328
|
+
removeEntry(connection, room.key, CONFIRMED, path);
|
|
329
|
+
touched.add(path);
|
|
330
|
+
}
|
|
331
|
+
const savedAt = new Date().toISOString();
|
|
332
|
+
for (const entry of room.overlay?.set ?? []) {
|
|
333
|
+
putEntry(connection, room.key, OVERLAY, saved(connection, room.key, entry, savedAt), entry.present, composition);
|
|
334
|
+
touched.add(entry.path);
|
|
335
|
+
}
|
|
336
|
+
for (const path of room.overlay?.cleared ?? []) {
|
|
337
|
+
removeEntry(connection, room.key, OVERLAY, path);
|
|
338
|
+
touched.add(path);
|
|
339
|
+
}
|
|
340
|
+
const changed = [...touched];
|
|
341
|
+
revealed(connection, room.key, changed);
|
|
342
|
+
if (room.record !== undefined) {
|
|
343
|
+
connection.run(KEEP_MODEL, [room.record, room.record, room.record, room.record]);
|
|
344
|
+
connection.run(`INSERT OR REPLACE INTO replica_rooms (locator, key, record) VALUES (?, ?, ${MODEL_LEFT})`, [room.locator, room.key, room.record, room.record, room.record]);
|
|
345
|
+
}
|
|
346
|
+
return room.published === undefined ? changed : null;
|
|
347
|
+
}
|
|
348
|
+
const SCHEMA = '$.model.snapshot.schema';
|
|
349
|
+
const KEEP_MODEL = `INSERT OR IGNORE INTO replica_models (identity, version, schema)
|
|
350
|
+
SELECT json_extract(?, '$.model.snapshot.identity'), json_extract(?, '$.model.snapshot.version'),
|
|
351
|
+
json_extract(?, '${SCHEMA}')
|
|
352
|
+
WHERE json_type(?, '${SCHEMA}') = 'text'`;
|
|
353
|
+
const MODEL_LEFT = `CASE WHEN json_type(?, '${SCHEMA}') = 'text' THEN json_set(?, '${SCHEMA}', json('null')) ELSE ? END`;
|
|
354
|
+
const UNHELD_MODELS = `DELETE FROM replica_models WHERE NOT EXISTS (
|
|
355
|
+
SELECT 1 FROM replica_rooms r
|
|
356
|
+
WHERE json_extract(r.record, '$.model.snapshot.identity') = replica_models.identity
|
|
357
|
+
AND json_extract(r.record, '$.model.snapshot.version') = replica_models.version
|
|
358
|
+
)`;
|
|
359
|
+
const HELD_RECORDS = `SELECT r.locator, r.key, CASE WHEN m.schema IS NULL THEN r.record
|
|
360
|
+
ELSE json_set(r.record, '${SCHEMA}', m.schema) END AS record
|
|
361
|
+
FROM replica_rooms r
|
|
362
|
+
LEFT JOIN replica_models m
|
|
363
|
+
ON m.identity = json_extract(r.record, '$.model.snapshot.identity')
|
|
364
|
+
AND m.version = json_extract(r.record, '$.model.snapshot.version')`;
|
|
365
|
+
export function commit(connection, rooms) {
|
|
366
|
+
const changed = {};
|
|
367
|
+
const indexed = {};
|
|
368
|
+
for (const room of rooms) {
|
|
369
|
+
changed[room.locator] = commitRoom(connection, room);
|
|
370
|
+
connection.run('UPDATE replica_rooms SET documents = ? WHERE locator = ? AND key = ?', [
|
|
371
|
+
counted(connection, room.key, room.roots ?? rootsOf(connection, room.locator)),
|
|
372
|
+
room.locator,
|
|
373
|
+
room.key,
|
|
374
|
+
]);
|
|
375
|
+
const [held] = connection.rows('SELECT rederiving FROM replica_keys WHERE key = ?', [room.key]);
|
|
376
|
+
indexed[room.locator] = held !== undefined && held.rederiving === null;
|
|
377
|
+
}
|
|
378
|
+
if (rooms.some((room) => room.record !== undefined))
|
|
379
|
+
connection.run(UNHELD_MODELS);
|
|
380
|
+
return { changed, indexed };
|
|
381
|
+
}
|
|
382
|
+
function rootsOf(connection, locator) {
|
|
383
|
+
const [row] = connection.rows('SELECT record FROM replica_rooms WHERE locator = ?', [locator]);
|
|
384
|
+
const record = json(row?.record);
|
|
385
|
+
return record?.typedSelection?.roots ?? [];
|
|
386
|
+
}
|
|
387
|
+
export function fenceRooms(connection, locators) {
|
|
388
|
+
for (const locator of locators) {
|
|
389
|
+
for (const row of connection.rows('SELECT key FROM replica_keys WHERE locator = ? UNION SELECT key FROM replica_rooms WHERE locator = ?', [locator, locator])) {
|
|
390
|
+
erasing(connection, number(row.key), locator);
|
|
391
|
+
}
|
|
392
|
+
connection.run('DELETE FROM replica_rooms WHERE locator = ?', [locator]);
|
|
393
|
+
}
|
|
394
|
+
connection.run(UNHELD_MODELS);
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
export function abandon(connection, locator) {
|
|
398
|
+
for (const row of connection.rows(`SELECT k.key FROM replica_keys k WHERE k.locator = ?
|
|
399
|
+
AND NOT EXISTS (SELECT 1 FROM replica_rooms r WHERE r.key = k.key)
|
|
400
|
+
AND NOT EXISTS (SELECT 1 FROM replica_erasing e WHERE e.key = k.key)`, [locator])) {
|
|
401
|
+
erasing(connection, number(row.key), locator);
|
|
402
|
+
}
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
export function release(connection, key) {
|
|
406
|
+
const [held] = connection.rows(`SELECT k.locator FROM replica_keys k WHERE k.key = ?
|
|
407
|
+
AND NOT EXISTS (SELECT 1 FROM replica_rooms r WHERE r.key = k.key)`, [key]);
|
|
408
|
+
if (held !== undefined)
|
|
409
|
+
erasing(connection, key, text(held.locator));
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
412
|
+
export function erase(connection, locator, limit) {
|
|
413
|
+
const [held] = connection.rows(`SELECT key FROM replica_erasing${locator === null ? '' : ' WHERE locator = ?'} ORDER BY key LIMIT 1`, locator === null ? [] : [locator]);
|
|
414
|
+
if (held === undefined)
|
|
415
|
+
return { remaining: false };
|
|
416
|
+
const key = number(held.key);
|
|
417
|
+
const batch = 'SELECT id FROM replica_entries WHERE key = ? ORDER BY id LIMIT ?';
|
|
418
|
+
for (const table of ['replica_values', 'replica_links']) {
|
|
419
|
+
connection.run(`DELETE FROM ${table} WHERE doc IN (${batch})`, [key, limit]);
|
|
420
|
+
}
|
|
421
|
+
connection.run(`DELETE FROM replica_entries WHERE id IN (${batch})`, [key, limit]);
|
|
422
|
+
const left = connection.rows('SELECT 1 FROM replica_entries WHERE key = ? LIMIT 1', [key]).length > 0;
|
|
423
|
+
if (!left) {
|
|
424
|
+
connection.run('DELETE FROM replica_folders WHERE key = ?', [key]);
|
|
425
|
+
connection.run('DELETE FROM replica_erasing WHERE key = ?', [key]);
|
|
426
|
+
connection.run('DELETE FROM replica_keys WHERE key = ?', [key]);
|
|
427
|
+
}
|
|
428
|
+
const [more] = connection.rows(`SELECT 1 FROM replica_erasing${locator === null ? '' : ' WHERE locator = ?'} LIMIT 1`, locator === null ? [] : [locator]);
|
|
429
|
+
return { remaining: more !== undefined };
|
|
430
|
+
}
|
|
431
|
+
function cursor(value) {
|
|
432
|
+
return value === null || value === undefined ? null : number(value);
|
|
433
|
+
}
|
|
434
|
+
export function rederive(connection, key, composed, bytes, ms, floor) {
|
|
435
|
+
const started = performance.now();
|
|
436
|
+
recomposed(connection, key, composed.fingerprint);
|
|
437
|
+
const [held] = connection.rows('SELECT rederiving FROM replica_keys WHERE key = ?', [key]);
|
|
438
|
+
const deriving = cursor(held?.rederiving);
|
|
439
|
+
if (deriving === null)
|
|
440
|
+
return { done: true, text: 0 };
|
|
441
|
+
const composition = composed.composition;
|
|
442
|
+
let last = deriving;
|
|
443
|
+
let spent = 0;
|
|
444
|
+
let built = 0;
|
|
445
|
+
let read = false;
|
|
446
|
+
reading: for (;;) {
|
|
447
|
+
const rows = connection.rows('SELECT id, path, type, fields, links, octet_length(content) AS size FROM replica_entries WHERE key = ? AND present = 1 AND id > ? ORDER BY id LIMIT ?', [key, last, DERIVED_ROWS]);
|
|
448
|
+
for (const row of rows) {
|
|
449
|
+
const id = number(row.id);
|
|
450
|
+
const path = text(row.path);
|
|
451
|
+
const size = row.size === null ? 0 : number(row.size);
|
|
452
|
+
dropDerived(connection, id);
|
|
453
|
+
writeDerived(connection, id, key, path, {
|
|
454
|
+
type: text(row.type),
|
|
455
|
+
fields: json(row.fields),
|
|
456
|
+
links: json(row.links) ?? [],
|
|
457
|
+
}, composition);
|
|
458
|
+
built += size;
|
|
459
|
+
last = id;
|
|
460
|
+
spent += ENTRY_WEIGHT + size;
|
|
461
|
+
if (spent >= bytes || (spent >= floor && performance.now() - started >= ms))
|
|
462
|
+
break reading;
|
|
463
|
+
}
|
|
464
|
+
if (rows.length < DERIVED_ROWS) {
|
|
465
|
+
read = true;
|
|
466
|
+
break;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
connection.run('UPDATE replica_keys SET rederiving = ? WHERE key = ?', [read ? null : last, key]);
|
|
470
|
+
return { done: read, text: built };
|
|
471
|
+
}
|
|
472
|
+
function heldEntry(row) {
|
|
473
|
+
return {
|
|
474
|
+
path: text(row.path),
|
|
475
|
+
content: text(row.content),
|
|
476
|
+
binary: json(row.binary),
|
|
477
|
+
revision: text(row.revision),
|
|
478
|
+
fileId: text(row.file_id),
|
|
479
|
+
created: text(row.created),
|
|
480
|
+
change: json(row.change),
|
|
481
|
+
written: text(row.written),
|
|
482
|
+
type: text(row.type),
|
|
483
|
+
facts: factsHeld(row),
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
function factsHeld(row) {
|
|
487
|
+
const type = text(row.declared);
|
|
488
|
+
if (type === null)
|
|
489
|
+
return null;
|
|
490
|
+
return {
|
|
491
|
+
type,
|
|
492
|
+
fields: json(row.fields) ?? {},
|
|
493
|
+
links: json(row.links) ?? [],
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
const ENTRY_COLUMNS = 'e.path, e.content, e.binary, e.revision, e.file_id, e.created, e.change, e.written, e.type, e.declared, e.fields, e.links';
|
|
497
|
+
function unrefreshed(alias) {
|
|
498
|
+
return `NOT EXISTS (SELECT 1 FROM replica_entries r WHERE r.key = ${alias}.key AND r.layer = ${REFRESHED} AND r.path = ${alias}.path)`;
|
|
499
|
+
}
|
|
500
|
+
function viewed(view, alias) {
|
|
501
|
+
if (view === 'visible')
|
|
502
|
+
return `${alias}.visible = 1 AND ${alias}.present = 1`;
|
|
503
|
+
if (view === 'confirmed')
|
|
504
|
+
return `${alias}.layer = ${CONFIRMED}`;
|
|
505
|
+
return `${alias}.present = 1 AND (${alias}.layer = ${REFRESHED} OR (${alias}.layer = ${CONFIRMED} AND ${unrefreshed(alias)}))`;
|
|
506
|
+
}
|
|
507
|
+
export function entries(connection, key, view, list) {
|
|
508
|
+
if (list.length === 0)
|
|
509
|
+
return [];
|
|
510
|
+
return connection
|
|
511
|
+
.rows(`SELECT ${ENTRY_COLUMNS} FROM replica_entries e WHERE e.key = ? AND ${viewed(view, 'e')} AND e.path IN (SELECT value FROM json_each(?))`, [key, paths(list)])
|
|
512
|
+
.map(heldEntry);
|
|
513
|
+
}
|
|
514
|
+
export function typed(connection, key, view, list) {
|
|
515
|
+
if (list.length === 0)
|
|
516
|
+
return [];
|
|
517
|
+
return connection
|
|
518
|
+
.rows(`SELECT e.path, e.declared, e.binary IS NOT NULL AS binary FROM replica_entries e WHERE e.key = ? AND ${viewed(view, 'e')} AND e.path IN (SELECT value FROM json_each(?))`, [key, paths(list)])
|
|
519
|
+
.map((row) => ({
|
|
520
|
+
path: text(row.path),
|
|
521
|
+
type: text(row.declared),
|
|
522
|
+
binary: number(row.binary) === 1,
|
|
523
|
+
}));
|
|
524
|
+
}
|
|
525
|
+
export function referrers(connection, key, view, targets) {
|
|
526
|
+
if (targets.length === 0)
|
|
527
|
+
return [];
|
|
528
|
+
return connection
|
|
529
|
+
.rows(`SELECT DISTINCT e.path, l.target FROM replica_links l JOIN replica_entries e ON e.id = l.doc WHERE l.key = ? AND l.target IN (SELECT value FROM json_each(?)) AND ${viewed(view, 'e')}`, [key, paths(targets)])
|
|
530
|
+
.map((row) => ({ path: text(row.path), target: text(row.target) }));
|
|
531
|
+
}
|
|
532
|
+
export function folders(connection, key, view, list) {
|
|
533
|
+
return list.filter((path) => connection.rows(`SELECT 1 FROM replica_folders f WHERE f.key = ? AND f.layer = ${CONFIRMED} AND f.present = 1 AND f.path = ? UNION ALL SELECT 1 FROM replica_entries e WHERE e.key = ? AND ${viewed(view, 'e')} AND e.path >= ? AND e.path < ? LIMIT 1`, [key, path, key, `${path}/`, `${path}0`]).length > 0);
|
|
534
|
+
}
|
|
535
|
+
export function typedWithin(connection, key, view, roots, within) {
|
|
536
|
+
return (connection.rows(`SELECT 1 FROM replica_entries e WHERE e.key = ? AND ${viewed(view, 'e')} AND e.declared IS NOT NULL AND e.declared <> 'any' AND ${within ? '' : 'NOT '}${beneathRoots('e.path')} LIMIT 1`, [key, JSON.stringify(roots)]).length > 0);
|
|
537
|
+
}
|
|
538
|
+
const ORPHANS = `SELECT k.key FROM replica_keys k
|
|
539
|
+
WHERE NOT EXISTS (SELECT 1 FROM replica_rooms r WHERE r.key = k.key)
|
|
540
|
+
AND NOT EXISTS (SELECT 1 FROM replica_erasing e WHERE e.key = k.key)
|
|
541
|
+
AND (${UNPARTED} OR NOT EXISTS (
|
|
542
|
+
SELECT 1 FROM replica_entries e WHERE e.key = k.key
|
|
543
|
+
UNION ALL SELECT 1 FROM replica_folders f WHERE f.key = k.key
|
|
544
|
+
))`;
|
|
545
|
+
const STAGED = `SELECT DISTINCT k.locator FROM replica_keys k
|
|
546
|
+
WHERE NOT EXISTS (SELECT 1 FROM replica_rooms r WHERE r.key = k.key)
|
|
547
|
+
AND NOT EXISTS (SELECT 1 FROM replica_erasing e WHERE e.key = k.key)
|
|
548
|
+
AND k.key NOT IN (${ORPHANS})`;
|
|
549
|
+
export function opened(connection) {
|
|
550
|
+
return {
|
|
551
|
+
orphans: connection.rows(ORPHANS).map((row) => number(row.key)),
|
|
552
|
+
erasing: connection.rows('SELECT 1 FROM replica_erasing LIMIT 1').length > 0,
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
const ROOM_ROWS = `SELECT h.locator, h.key, h.record, r.documents, k.rederiving IS NULL AS indexed
|
|
556
|
+
FROM (${HELD_RECORDS}) h
|
|
557
|
+
JOIN replica_rooms r ON r.locator = h.locator
|
|
558
|
+
LEFT JOIN replica_keys k ON k.key = h.key`;
|
|
559
|
+
function roomRow(row) {
|
|
560
|
+
return {
|
|
561
|
+
locator: text(row.locator),
|
|
562
|
+
key: number(row.key),
|
|
563
|
+
record: text(row.record),
|
|
564
|
+
indexed: number(row.indexed) === 1,
|
|
565
|
+
documents: number(row.documents),
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
export function heldRooms(connection, locators) {
|
|
569
|
+
return (locators === null
|
|
570
|
+
? connection.rows(`${ROOM_ROWS} ORDER BY h.locator`)
|
|
571
|
+
: connection.rows(`${ROOM_ROWS} WHERE h.locator IN (SELECT value FROM json_each(?)) ORDER BY h.locator`, [JSON.stringify(locators)])).map(roomRow);
|
|
572
|
+
}
|
|
573
|
+
export function heldRoom(connection, locator) {
|
|
574
|
+
return heldRooms(connection, [locator])[0] ?? null;
|
|
575
|
+
}
|
|
576
|
+
export function overlaid(connection, key) {
|
|
577
|
+
return connection
|
|
578
|
+
.rows(`SELECT path FROM replica_entries WHERE key = ? AND layer = ${OVERLAY}`, [key])
|
|
579
|
+
.map((row) => text(row.path));
|
|
580
|
+
}
|
|
581
|
+
export function covering(connection) {
|
|
582
|
+
return connection
|
|
583
|
+
.rows(`SELECT r.locator, r.key, r.documents, json_extract(r.record, '$.transfer') AS transfer,
|
|
584
|
+
json_extract(r.record, '$.roomVersion') AS room_version,
|
|
585
|
+
coalesce(json_extract(r.record, '$.inventory.bytes'), 0) AS bytes,
|
|
586
|
+
json_extract(r.record, '$.replica.offline') AS offline,
|
|
587
|
+
k.rederiving IS NULL AS indexed
|
|
588
|
+
FROM replica_rooms r LEFT JOIN replica_keys k ON k.key = r.key ORDER BY r.locator`)
|
|
589
|
+
.map((row) => ({
|
|
590
|
+
locator: text(row.locator),
|
|
591
|
+
key: number(row.key),
|
|
592
|
+
transfer: text(row.transfer),
|
|
593
|
+
roomVersion: text(row.room_version),
|
|
594
|
+
indexed: number(row.indexed) === 1,
|
|
595
|
+
documents: number(row.documents),
|
|
596
|
+
bytes: number(row.bytes),
|
|
597
|
+
offline: text(row.offline),
|
|
598
|
+
}));
|
|
599
|
+
}
|
|
600
|
+
export function offlineMode(connection, locator) {
|
|
601
|
+
const [held] = connection.rows("SELECT json_extract(record, '$.replica.offline') AS offline FROM replica_rooms WHERE locator = ?", [locator]);
|
|
602
|
+
return text(held?.offline);
|
|
603
|
+
}
|
|
604
|
+
export function stagedLocators(connection) {
|
|
605
|
+
return connection.rows(STAGED).map((row) => text(row.locator));
|
|
606
|
+
}
|
|
607
|
+
export function heldLocators(connection) {
|
|
608
|
+
return connection
|
|
609
|
+
.rows(`SELECT locator FROM replica_rooms
|
|
610
|
+
UNION SELECT locator FROM authored_room_drafts
|
|
611
|
+
UNION SELECT locator FROM authored_queues
|
|
612
|
+
UNION ${STAGED}`)
|
|
613
|
+
.map((row) => text(row.locator));
|
|
614
|
+
}
|
|
615
|
+
export function demoted(connection) {
|
|
616
|
+
connection.run(`UPDATE replica_rooms SET record = json_set(record, '$.model.status', 'cached')
|
|
617
|
+
WHERE json_extract(record, '$.model.status') = 'current'`);
|
|
618
|
+
return null;
|
|
619
|
+
}
|
|
620
|
+
export function facts(connection) {
|
|
621
|
+
const held = {};
|
|
622
|
+
for (const row of connection.rows('SELECT name, value FROM replica_facts')) {
|
|
623
|
+
held[text(row.name)] = text(row.value);
|
|
624
|
+
}
|
|
625
|
+
return held;
|
|
626
|
+
}
|
|
627
|
+
export function presentation(connection, app) {
|
|
628
|
+
const [held] = connection.rows('SELECT value FROM replica_presentation WHERE app = ?', [app]);
|
|
629
|
+
return text(held?.value);
|
|
630
|
+
}
|
|
631
|
+
export function ended(connection) {
|
|
632
|
+
for (const statement of REPLICA_TABLES) {
|
|
633
|
+
const table = /^CREATE TABLE (\w+)/u.exec(statement)?.[1];
|
|
634
|
+
if (table !== undefined)
|
|
635
|
+
connection.run(`DELETE FROM ${table}`);
|
|
636
|
+
}
|
|
637
|
+
}
|