@interocitor/core 0.0.0-beta.2
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/LICENSE +21 -0
- package/README.md +178 -0
- package/dist/adapters/cloudflare.d.ts +72 -0
- package/dist/adapters/cloudflare.d.ts.map +1 -0
- package/dist/adapters/cloudflare.js +227 -0
- package/dist/adapters/cloudflare.js.map +1 -0
- package/dist/adapters/google-drive.d.ts +64 -0
- package/dist/adapters/google-drive.d.ts.map +1 -0
- package/dist/adapters/google-drive.js +340 -0
- package/dist/adapters/google-drive.js.map +1 -0
- package/dist/adapters/memory.d.ts +45 -0
- package/dist/adapters/memory.d.ts.map +1 -0
- package/dist/adapters/memory.js +129 -0
- package/dist/adapters/memory.js.map +1 -0
- package/dist/adapters/webdav.d.ts +59 -0
- package/dist/adapters/webdav.d.ts.map +1 -0
- package/dist/adapters/webdav.js +247 -0
- package/dist/adapters/webdav.js.map +1 -0
- package/dist/core/codec.d.ts +20 -0
- package/dist/core/codec.d.ts.map +1 -0
- package/dist/core/codec.js +66 -0
- package/dist/core/codec.js.map +1 -0
- package/dist/core/compaction.d.ts +37 -0
- package/dist/core/compaction.d.ts.map +1 -0
- package/dist/core/compaction.js +134 -0
- package/dist/core/compaction.js.map +1 -0
- package/dist/core/crdt.d.ts +33 -0
- package/dist/core/crdt.d.ts.map +1 -0
- package/dist/core/crdt.js +188 -0
- package/dist/core/crdt.js.map +1 -0
- package/dist/core/flush.d.ts +9 -0
- package/dist/core/flush.d.ts.map +1 -0
- package/dist/core/flush.js +41 -0
- package/dist/core/flush.js.map +1 -0
- package/dist/core/hlc.d.ts +25 -0
- package/dist/core/hlc.d.ts.map +1 -0
- package/dist/core/hlc.js +76 -0
- package/dist/core/hlc.js.map +1 -0
- package/dist/core/internals.d.ts +25 -0
- package/dist/core/internals.d.ts.map +1 -0
- package/dist/core/internals.js +54 -0
- package/dist/core/internals.js.map +1 -0
- package/dist/core/manifest.d.ts +31 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +111 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/pull.d.ts +26 -0
- package/dist/core/pull.d.ts.map +1 -0
- package/dist/core/pull.js +98 -0
- package/dist/core/pull.js.map +1 -0
- package/dist/core/row-id.d.ts +12 -0
- package/dist/core/row-id.d.ts.map +1 -0
- package/dist/core/row-id.js +12 -0
- package/dist/core/row-id.js.map +1 -0
- package/dist/core/schema-types.d.ts +13 -0
- package/dist/core/schema-types.d.ts.map +1 -0
- package/dist/core/schema-types.js +18 -0
- package/dist/core/schema-types.js.map +1 -0
- package/dist/core/schema-types.type-test.d.ts +2 -0
- package/dist/core/schema-types.type-test.d.ts.map +1 -0
- package/dist/core/schema-types.type-test.js +149 -0
- package/dist/core/schema-types.type-test.js.map +1 -0
- package/dist/core/sync-engine.d.ts +158 -0
- package/dist/core/sync-engine.d.ts.map +1 -0
- package/dist/core/sync-engine.js +714 -0
- package/dist/core/sync-engine.js.map +1 -0
- package/dist/core/table.d.ts +60 -0
- package/dist/core/table.d.ts.map +1 -0
- package/dist/core/table.js +106 -0
- package/dist/core/table.js.map +1 -0
- package/dist/core/types.d.ts +478 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/crypto/encryption.d.ts +57 -0
- package/dist/crypto/encryption.d.ts.map +1 -0
- package/dist/crypto/encryption.js +195 -0
- package/dist/crypto/encryption.js.map +1 -0
- package/dist/crypto/keys.d.ts +48 -0
- package/dist/crypto/keys.d.ts.map +1 -0
- package/dist/crypto/keys.js +55 -0
- package/dist/crypto/keys.js.map +1 -0
- package/dist/handshake/channel.d.ts +117 -0
- package/dist/handshake/channel.d.ts.map +1 -0
- package/dist/handshake/channel.js +246 -0
- package/dist/handshake/channel.js.map +1 -0
- package/dist/handshake/index.d.ts +213 -0
- package/dist/handshake/index.d.ts.map +1 -0
- package/dist/handshake/index.js +182 -0
- package/dist/handshake/index.js.map +1 -0
- package/dist/handshake/qr.d.ts +100 -0
- package/dist/handshake/qr.d.ts.map +1 -0
- package/dist/handshake/qr.js +103 -0
- package/dist/handshake/qr.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/storage/credential-store.d.ts +99 -0
- package/dist/storage/credential-store.d.ts.map +1 -0
- package/dist/storage/credential-store.js +309 -0
- package/dist/storage/credential-store.js.map +1 -0
- package/dist/storage/local-store.d.ts +56 -0
- package/dist/storage/local-store.d.ts.map +1 -0
- package/dist/storage/local-store.js +411 -0
- package/dist/storage/local-store.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local storage layer — IndexedDB
|
|
3
|
+
*
|
|
4
|
+
* This is a cache, not the source of truth.
|
|
5
|
+
* If cleared, the app rehydrates from cloud.
|
|
6
|
+
*
|
|
7
|
+
* Stores:
|
|
8
|
+
* - rows: the current merged state of all tables
|
|
9
|
+
* - outbox: change entries pending upload
|
|
10
|
+
* - cursors: byte offsets into each device's change log
|
|
11
|
+
* - meta: device ID, last snapshot epoch, etc.
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_DB_NAME = 'interocitor';
|
|
14
|
+
const DEFAULT_DB_VERSION = 1;
|
|
15
|
+
const STORES = {
|
|
16
|
+
rows: 'rows', // key: "{table}/{rowId}"
|
|
17
|
+
outbox: 'outbox', // key: auto-increment
|
|
18
|
+
cursors: 'cursors', // key: deviceId
|
|
19
|
+
meta: 'meta', // key: string
|
|
20
|
+
};
|
|
21
|
+
const SCHEMA_INDEX_PREFIX = 'idx:';
|
|
22
|
+
function schemaIndexName(table, indexName) {
|
|
23
|
+
return `${SCHEMA_INDEX_PREFIX}${table}:${indexName}`;
|
|
24
|
+
}
|
|
25
|
+
function schemaIndexKeyPath(field) {
|
|
26
|
+
return ['_table', `${field}.value`];
|
|
27
|
+
}
|
|
28
|
+
function normalizeSchema(schema) {
|
|
29
|
+
if (!schema)
|
|
30
|
+
return undefined;
|
|
31
|
+
if (!Number.isInteger(schema.version) || schema.version < 1) {
|
|
32
|
+
throw new Error('Schema version must be an integer >= 1');
|
|
33
|
+
}
|
|
34
|
+
return schema;
|
|
35
|
+
}
|
|
36
|
+
function domStringListToArray(list) {
|
|
37
|
+
const out = [];
|
|
38
|
+
for (let i = 0; i < list.length; i++) {
|
|
39
|
+
const item = list.item(i);
|
|
40
|
+
if (item)
|
|
41
|
+
out.push(item);
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
function expectedSchemaIndexes(schema) {
|
|
46
|
+
const expected = new Map();
|
|
47
|
+
if (!schema)
|
|
48
|
+
return expected;
|
|
49
|
+
for (const [table, def] of Object.entries(schema.tables)) {
|
|
50
|
+
const fieldEntries = Object.entries(def.fields ?? {});
|
|
51
|
+
for (const [fieldName, input] of fieldEntries) {
|
|
52
|
+
const fieldDef = normalizeFieldInput(input);
|
|
53
|
+
if (!fieldDef.index && !fieldDef.unique)
|
|
54
|
+
continue;
|
|
55
|
+
expected.set(schemaIndexName(table, `by_${fieldName}`), {
|
|
56
|
+
keyPath: schemaIndexKeyPath(fieldName),
|
|
57
|
+
unique: fieldDef.unique ?? false,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
for (const index of def.indexes ?? []) {
|
|
61
|
+
expected.set(schemaIndexName(table, index.name), {
|
|
62
|
+
keyPath: schemaIndexKeyPath(index.field),
|
|
63
|
+
unique: index.unique ?? false,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return expected;
|
|
68
|
+
}
|
|
69
|
+
function normalizeFieldInput(input) {
|
|
70
|
+
return {
|
|
71
|
+
index: input.index ?? false,
|
|
72
|
+
unique: input.unique ?? false,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function readColumnValue(row, field) {
|
|
76
|
+
const raw = row[field];
|
|
77
|
+
if (raw !== null && raw !== undefined && typeof raw === 'object' && 'value' in raw) {
|
|
78
|
+
return raw.value;
|
|
79
|
+
}
|
|
80
|
+
return raw;
|
|
81
|
+
}
|
|
82
|
+
function compare(a, b) {
|
|
83
|
+
const av = a instanceof Date ? a.getTime() : a;
|
|
84
|
+
const bv = b instanceof Date ? b.getTime() : b;
|
|
85
|
+
if (av < bv)
|
|
86
|
+
return -1;
|
|
87
|
+
if (av > bv)
|
|
88
|
+
return 1;
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
function matchesClause(value, clause) {
|
|
92
|
+
if (value === undefined || value === null)
|
|
93
|
+
return false;
|
|
94
|
+
switch (clause.op) {
|
|
95
|
+
case 'equals':
|
|
96
|
+
return compare(value, clause.value) === 0;
|
|
97
|
+
case 'above':
|
|
98
|
+
return compare(value, clause.value) > 0;
|
|
99
|
+
case 'aboveOrEqual':
|
|
100
|
+
return compare(value, clause.value) >= 0;
|
|
101
|
+
case 'below':
|
|
102
|
+
return compare(value, clause.value) < 0;
|
|
103
|
+
case 'belowOrEqual':
|
|
104
|
+
return compare(value, clause.value) <= 0;
|
|
105
|
+
case 'between': {
|
|
106
|
+
const lowerCmp = compare(value, clause.lower);
|
|
107
|
+
const upperCmp = compare(value, clause.upper);
|
|
108
|
+
const lowerOk = clause.lowerOpen ? lowerCmp > 0 : lowerCmp >= 0;
|
|
109
|
+
const upperOk = clause.upperOpen ? upperCmp < 0 : upperCmp <= 0;
|
|
110
|
+
return lowerOk && upperOk;
|
|
111
|
+
}
|
|
112
|
+
case 'startsWith':
|
|
113
|
+
return typeof value === 'string' && value.startsWith(String(clause.value));
|
|
114
|
+
case 'anyOf':
|
|
115
|
+
return (clause.values ?? []).some(v => compare(value, v) === 0);
|
|
116
|
+
default:
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function hasSchemaIndex(schema, table, field) {
|
|
121
|
+
const tableSchema = schema?.tables[table];
|
|
122
|
+
if (!tableSchema)
|
|
123
|
+
return undefined;
|
|
124
|
+
const legacy = tableSchema.indexes?.find(index => index.field === field);
|
|
125
|
+
if (legacy)
|
|
126
|
+
return legacy;
|
|
127
|
+
const fromField = tableSchema.fields?.[field];
|
|
128
|
+
if (!fromField)
|
|
129
|
+
return undefined;
|
|
130
|
+
const fieldDef = normalizeFieldInput(fromField);
|
|
131
|
+
if (!fieldDef.index && !fieldDef.unique)
|
|
132
|
+
return undefined;
|
|
133
|
+
return {
|
|
134
|
+
name: `by_${field}`,
|
|
135
|
+
field,
|
|
136
|
+
unique: fieldDef.unique,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function rangeForClause(table, clause) {
|
|
140
|
+
switch (clause.op) {
|
|
141
|
+
case 'equals':
|
|
142
|
+
return IDBKeyRange.only([table, clause.value]);
|
|
143
|
+
case 'above':
|
|
144
|
+
return IDBKeyRange.lowerBound([table, clause.value], true);
|
|
145
|
+
case 'aboveOrEqual':
|
|
146
|
+
return IDBKeyRange.lowerBound([table, clause.value], false);
|
|
147
|
+
case 'below':
|
|
148
|
+
return IDBKeyRange.upperBound([table, clause.value], true);
|
|
149
|
+
case 'belowOrEqual':
|
|
150
|
+
return IDBKeyRange.upperBound([table, clause.value], false);
|
|
151
|
+
case 'between':
|
|
152
|
+
return IDBKeyRange.bound([table, clause.lower], [table, clause.upper], clause.lowerOpen ?? false, clause.upperOpen ?? false);
|
|
153
|
+
case 'startsWith': {
|
|
154
|
+
const prefix = String(clause.value ?? '');
|
|
155
|
+
return IDBKeyRange.bound([table, prefix], [table, `${prefix}\uFFFF`], false, false);
|
|
156
|
+
}
|
|
157
|
+
case 'anyOf':
|
|
158
|
+
return null;
|
|
159
|
+
default:
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function openDB(dbName, dbVersion, schema) {
|
|
164
|
+
return new Promise((resolve, reject) => {
|
|
165
|
+
const req = indexedDB.open(dbName, dbVersion);
|
|
166
|
+
req.onupgradeneeded = () => {
|
|
167
|
+
const db = req.result;
|
|
168
|
+
if (!db.objectStoreNames.contains(STORES.rows)) {
|
|
169
|
+
const rows = db.createObjectStore(STORES.rows, { keyPath: '_key' });
|
|
170
|
+
rows.createIndex('by_table', '_table', { unique: false });
|
|
171
|
+
}
|
|
172
|
+
if (!db.objectStoreNames.contains(STORES.outbox)) {
|
|
173
|
+
db.createObjectStore(STORES.outbox, { autoIncrement: true });
|
|
174
|
+
}
|
|
175
|
+
if (!db.objectStoreNames.contains(STORES.cursors)) {
|
|
176
|
+
db.createObjectStore(STORES.cursors);
|
|
177
|
+
}
|
|
178
|
+
if (!db.objectStoreNames.contains(STORES.meta)) {
|
|
179
|
+
db.createObjectStore(STORES.meta);
|
|
180
|
+
}
|
|
181
|
+
const rowsStore = req.transaction?.objectStore(STORES.rows);
|
|
182
|
+
if (rowsStore) {
|
|
183
|
+
const expected = expectedSchemaIndexes(schema);
|
|
184
|
+
const existing = domStringListToArray(rowsStore.indexNames).filter(name => name.startsWith(SCHEMA_INDEX_PREFIX));
|
|
185
|
+
for (const indexName of existing) {
|
|
186
|
+
if (!expected.has(indexName)) {
|
|
187
|
+
rowsStore.deleteIndex(indexName);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
for (const [indexName, def] of expected.entries()) {
|
|
191
|
+
if (!rowsStore.indexNames.contains(indexName)) {
|
|
192
|
+
rowsStore.createIndex(indexName, def.keyPath, { unique: def.unique });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
req.onsuccess = () => resolve(req.result);
|
|
198
|
+
req.onerror = () => reject(req.error);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
function tx(db, stores, mode) {
|
|
202
|
+
return db.transaction(stores, mode);
|
|
203
|
+
}
|
|
204
|
+
function reqToPromise(req) {
|
|
205
|
+
return new Promise((resolve, reject) => {
|
|
206
|
+
req.onsuccess = () => resolve(req.result);
|
|
207
|
+
req.onerror = () => reject(req.error);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
function txComplete(transaction) {
|
|
211
|
+
return new Promise((resolve, reject) => {
|
|
212
|
+
transaction.oncomplete = () => resolve();
|
|
213
|
+
transaction.onerror = () => reject(transaction.error);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
// ─── Public API ──────────────────────────────────────────────────────
|
|
217
|
+
/**
|
|
218
|
+
* Default IndexedDB-backed local persistence layer used by {@link SyncEngine}.
|
|
219
|
+
*
|
|
220
|
+
* Most applications do not need to interact with this class directly unless
|
|
221
|
+
* they are supplying a custom `localStoreFactory` or swapping local storage at
|
|
222
|
+
* runtime for testing or advanced integrations.
|
|
223
|
+
*/
|
|
224
|
+
export class LocalStore {
|
|
225
|
+
/**
|
|
226
|
+
* @param dbName IndexedDB database name. Use distinct names to isolate
|
|
227
|
+
* multiple engine instances on the same origin.
|
|
228
|
+
* Default: "interocitor"
|
|
229
|
+
* @param dbVersion IndexedDB schema version. Default: 1
|
|
230
|
+
*/
|
|
231
|
+
constructor(dbName, dbVersion, schema) {
|
|
232
|
+
this.db = null;
|
|
233
|
+
this.schema = normalizeSchema(schema);
|
|
234
|
+
const schemaVersionBump = this.schema?.version ?? 0;
|
|
235
|
+
this.dbName = dbName ?? DEFAULT_DB_NAME;
|
|
236
|
+
this.dbVersion = dbVersion ?? (DEFAULT_DB_VERSION + schemaVersionBump);
|
|
237
|
+
}
|
|
238
|
+
async open() {
|
|
239
|
+
this.db = await openDB(this.dbName, this.dbVersion, this.schema);
|
|
240
|
+
}
|
|
241
|
+
close() {
|
|
242
|
+
this.db?.close();
|
|
243
|
+
this.db = null;
|
|
244
|
+
}
|
|
245
|
+
ensureDB() {
|
|
246
|
+
if (!this.db)
|
|
247
|
+
throw new Error('LocalStore not opened');
|
|
248
|
+
return this.db;
|
|
249
|
+
}
|
|
250
|
+
// ── Rows ─────────────────────────────────────────────────────────
|
|
251
|
+
rowKey(table, rowId) {
|
|
252
|
+
return `${table}/${rowId}`;
|
|
253
|
+
}
|
|
254
|
+
async getRow(table, rowId) {
|
|
255
|
+
const db = this.ensureDB();
|
|
256
|
+
const t = tx(db, STORES.rows, 'readonly');
|
|
257
|
+
const store = t.objectStore(STORES.rows);
|
|
258
|
+
const result = await reqToPromise(store.get(this.rowKey(table, rowId)));
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
async putRow(row) {
|
|
262
|
+
const db = this.ensureDB();
|
|
263
|
+
const t = tx(db, STORES.rows, 'readwrite');
|
|
264
|
+
const store = t.objectStore(STORES.rows);
|
|
265
|
+
const record = { ...row, _key: this.rowKey(row._table, row._rowId) };
|
|
266
|
+
store.put(record);
|
|
267
|
+
await txComplete(t);
|
|
268
|
+
}
|
|
269
|
+
async putRows(rows) {
|
|
270
|
+
if (rows.length === 0)
|
|
271
|
+
return;
|
|
272
|
+
const db = this.ensureDB();
|
|
273
|
+
const t = tx(db, STORES.rows, 'readwrite');
|
|
274
|
+
const store = t.objectStore(STORES.rows);
|
|
275
|
+
for (const row of rows) {
|
|
276
|
+
const record = { ...row, _key: this.rowKey(row._table, row._rowId) };
|
|
277
|
+
store.put(record);
|
|
278
|
+
}
|
|
279
|
+
await txComplete(t);
|
|
280
|
+
}
|
|
281
|
+
async getTable(table) {
|
|
282
|
+
const db = this.ensureDB();
|
|
283
|
+
const t = tx(db, STORES.rows, 'readonly');
|
|
284
|
+
const store = t.objectStore(STORES.rows);
|
|
285
|
+
const index = store.index('by_table');
|
|
286
|
+
const results = await reqToPromise(index.getAll(table));
|
|
287
|
+
return results.filter(r => !r._deleted);
|
|
288
|
+
}
|
|
289
|
+
async queryWhere(table, clause) {
|
|
290
|
+
const db = this.ensureDB();
|
|
291
|
+
const indexDef = hasSchemaIndex(this.schema, table, clause.field);
|
|
292
|
+
if (!indexDef) {
|
|
293
|
+
const rows = await this.getTable(table);
|
|
294
|
+
return rows.filter(row => matchesClause(readColumnValue(row, clause.field), clause));
|
|
295
|
+
}
|
|
296
|
+
const t = tx(db, STORES.rows, 'readonly');
|
|
297
|
+
const store = t.objectStore(STORES.rows);
|
|
298
|
+
const index = store.index(schemaIndexName(table, indexDef.name));
|
|
299
|
+
if (clause.op === 'anyOf') {
|
|
300
|
+
const values = clause.values ?? [];
|
|
301
|
+
const merged = new Map();
|
|
302
|
+
for (const value of values) {
|
|
303
|
+
const matches = await reqToPromise(index.getAll(IDBKeyRange.only([table, value])));
|
|
304
|
+
for (const row of matches) {
|
|
305
|
+
if (!row._deleted) {
|
|
306
|
+
merged.set(`${row._table}/${row._rowId}`, row);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return Array.from(merged.values());
|
|
311
|
+
}
|
|
312
|
+
const range = rangeForClause(table, clause);
|
|
313
|
+
const results = await reqToPromise(index.getAll(range ?? undefined));
|
|
314
|
+
return results.filter(row => !row._deleted);
|
|
315
|
+
}
|
|
316
|
+
async getTableNames() {
|
|
317
|
+
const db = this.ensureDB();
|
|
318
|
+
// Intentionally avoids openKeyCursor: Safari rejects null as a key range
|
|
319
|
+
// argument in some IDB versions. A full-store getAll() is safe everywhere
|
|
320
|
+
// and acceptable here — called once at init on an otherwise-empty DB.
|
|
321
|
+
const t = tx(db, STORES.rows, 'readonly');
|
|
322
|
+
const store = t.objectStore(STORES.rows);
|
|
323
|
+
const all = await reqToPromise(store.getAll());
|
|
324
|
+
const names = new Set();
|
|
325
|
+
for (const row of all) {
|
|
326
|
+
if (row._table)
|
|
327
|
+
names.add(row._table);
|
|
328
|
+
}
|
|
329
|
+
return Array.from(names);
|
|
330
|
+
}
|
|
331
|
+
async getAllRows() {
|
|
332
|
+
const db = this.ensureDB();
|
|
333
|
+
const t = tx(db, STORES.rows, 'readonly');
|
|
334
|
+
const store = t.objectStore(STORES.rows);
|
|
335
|
+
return reqToPromise(store.getAll());
|
|
336
|
+
}
|
|
337
|
+
async clearRows() {
|
|
338
|
+
const db = this.ensureDB();
|
|
339
|
+
const t = tx(db, STORES.rows, 'readwrite');
|
|
340
|
+
t.objectStore(STORES.rows).clear();
|
|
341
|
+
await txComplete(t);
|
|
342
|
+
}
|
|
343
|
+
// ── Outbox ───────────────────────────────────────────────────────
|
|
344
|
+
async pushOutbox(entry) {
|
|
345
|
+
const db = this.ensureDB();
|
|
346
|
+
const t = tx(db, STORES.outbox, 'readwrite');
|
|
347
|
+
t.objectStore(STORES.outbox).add(entry);
|
|
348
|
+
await txComplete(t);
|
|
349
|
+
}
|
|
350
|
+
async drainOutbox() {
|
|
351
|
+
const db = this.ensureDB();
|
|
352
|
+
const t = tx(db, STORES.outbox, 'readwrite');
|
|
353
|
+
const store = t.objectStore(STORES.outbox);
|
|
354
|
+
const entries = await reqToPromise(store.getAll());
|
|
355
|
+
store.clear();
|
|
356
|
+
await txComplete(t);
|
|
357
|
+
return entries;
|
|
358
|
+
}
|
|
359
|
+
async outboxSize() {
|
|
360
|
+
const db = this.ensureDB();
|
|
361
|
+
const t = tx(db, STORES.outbox, 'readonly');
|
|
362
|
+
return reqToPromise(t.objectStore(STORES.outbox).count());
|
|
363
|
+
}
|
|
364
|
+
// ── Cursors ──────────────────────────────────────────────────────
|
|
365
|
+
async getCursor(deviceId) {
|
|
366
|
+
const db = this.ensureDB();
|
|
367
|
+
const t = tx(db, STORES.cursors, 'readonly');
|
|
368
|
+
const result = await reqToPromise(t.objectStore(STORES.cursors).get(deviceId));
|
|
369
|
+
return result || 0;
|
|
370
|
+
}
|
|
371
|
+
async setCursor(deviceId, offset) {
|
|
372
|
+
const db = this.ensureDB();
|
|
373
|
+
const t = tx(db, STORES.cursors, 'readwrite');
|
|
374
|
+
t.objectStore(STORES.cursors).put(offset, deviceId);
|
|
375
|
+
await txComplete(t);
|
|
376
|
+
}
|
|
377
|
+
async getAllCursors() {
|
|
378
|
+
const db = this.ensureDB();
|
|
379
|
+
const t = tx(db, STORES.cursors, 'readonly');
|
|
380
|
+
const store = t.objectStore(STORES.cursors);
|
|
381
|
+
const keys = await reqToPromise(store.getAllKeys());
|
|
382
|
+
const values = await reqToPromise(store.getAll());
|
|
383
|
+
const cursors = {};
|
|
384
|
+
for (let i = 0; i < keys.length; i++) {
|
|
385
|
+
cursors[keys[i]] = values[i];
|
|
386
|
+
}
|
|
387
|
+
return cursors;
|
|
388
|
+
}
|
|
389
|
+
// ── Meta ─────────────────────────────────────────────────────────
|
|
390
|
+
async getMeta(key) {
|
|
391
|
+
const db = this.ensureDB();
|
|
392
|
+
const t = tx(db, STORES.meta, 'readonly');
|
|
393
|
+
return reqToPromise(t.objectStore(STORES.meta).get(key));
|
|
394
|
+
}
|
|
395
|
+
async setMeta(key, value) {
|
|
396
|
+
const db = this.ensureDB();
|
|
397
|
+
const t = tx(db, STORES.meta, 'readwrite');
|
|
398
|
+
t.objectStore(STORES.meta).put(value, key);
|
|
399
|
+
await txComplete(t);
|
|
400
|
+
}
|
|
401
|
+
/** Nuke everything. Used before full rehydration. */
|
|
402
|
+
async clearAll() {
|
|
403
|
+
const db = this.ensureDB();
|
|
404
|
+
const t = tx(db, Object.values(STORES), 'readwrite');
|
|
405
|
+
for (const name of Object.values(STORES)) {
|
|
406
|
+
t.objectStore(name).clear();
|
|
407
|
+
}
|
|
408
|
+
await txComplete(t);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=local-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-store.js","sourceRoot":"","sources":["../../src/storage/local-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@interocitor/core",
|
|
3
|
+
"version": "0.0.0-beta.2",
|
|
4
|
+
"description": "Encrypted local-first CRDT database that syncs over cloud storage without a purpose-built backend.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./adapters/google-drive": {
|
|
14
|
+
"import": "./dist/adapters/google-drive.js",
|
|
15
|
+
"types": "./dist/adapters/google-drive.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./adapters/webdav": {
|
|
18
|
+
"import": "./dist/adapters/webdav.js",
|
|
19
|
+
"types": "./dist/adapters/webdav.d.ts"
|
|
20
|
+
},
|
|
21
|
+
"./adapters/cloudflare": {
|
|
22
|
+
"import": "./dist/adapters/cloudflare.js",
|
|
23
|
+
"types": "./dist/adapters/cloudflare.d.ts"
|
|
24
|
+
},
|
|
25
|
+
"./adapters/memory": {
|
|
26
|
+
"import": "./dist/adapters/memory.js",
|
|
27
|
+
"types": "./dist/adapters/memory.d.ts"
|
|
28
|
+
},
|
|
29
|
+
"./storage/local-store": {
|
|
30
|
+
"import": "./dist/storage/local-store.js",
|
|
31
|
+
"types": "./dist/storage/local-store.d.ts"
|
|
32
|
+
},
|
|
33
|
+
"./crypto/keys": {
|
|
34
|
+
"import": "./dist/crypto/keys.js",
|
|
35
|
+
"types": "./dist/crypto/keys.d.ts"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist",
|
|
40
|
+
"README.md",
|
|
41
|
+
"LICENSE"
|
|
42
|
+
],
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "rm -rf ./dist && tsc -p tsconfig.json",
|
|
45
|
+
"validate": "node ./dist/index.js",
|
|
46
|
+
"test:e2e": "yarn exec playwright test -c ./playwright.config.ts",
|
|
47
|
+
"test:e2e:todo": "yarn exec playwright test -c ./playwright.config.ts tests/e2e/todo-webdav.spec.ts"
|
|
48
|
+
},
|
|
49
|
+
"keywords": [
|
|
50
|
+
"local-first",
|
|
51
|
+
"crdt",
|
|
52
|
+
"sync",
|
|
53
|
+
"offline-first",
|
|
54
|
+
"google-drive",
|
|
55
|
+
"webdav",
|
|
56
|
+
"encrypted",
|
|
57
|
+
"mesh",
|
|
58
|
+
"indexeddb"
|
|
59
|
+
],
|
|
60
|
+
"license": "MIT",
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@playwright/test": "^1.54.2",
|
|
63
|
+
"typescript": "^6.0.0"
|
|
64
|
+
},
|
|
65
|
+
"engines": {
|
|
66
|
+
"node": ">=18.0.0"
|
|
67
|
+
}
|
|
68
|
+
}
|