@evolu/common 7.2.2 → 7.3.0
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/dist/src/Function.d.ts +61 -0
- package/dist/src/Function.d.ts.map +1 -1
- package/dist/src/Function.js +19 -0
- package/dist/src/Object.d.ts +32 -1
- package/dist/src/Object.d.ts.map +1 -1
- package/dist/src/Object.js +32 -1
- package/dist/src/Order.d.ts +2 -1
- package/dist/src/Order.d.ts.map +1 -1
- package/dist/src/Order.js +1 -0
- package/dist/src/Result.d.ts +36 -29
- package/dist/src/Result.d.ts.map +1 -1
- package/dist/src/Sqlite.d.ts +9 -7
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +8 -0
- package/dist/src/Task.d.ts.map +1 -1
- package/dist/src/Task.js +6 -4
- package/dist/src/Type.d.ts +30 -2
- package/dist/src/Type.d.ts.map +1 -1
- package/dist/src/Type.js +82 -0
- package/dist/src/local-first/Db.d.ts +1 -5
- package/dist/src/local-first/Db.d.ts.map +1 -1
- package/dist/src/local-first/Db.js +112 -117
- package/dist/src/local-first/Evolu.d.ts +3 -0
- package/dist/src/local-first/Evolu.d.ts.map +1 -1
- package/dist/src/local-first/Evolu.js +14 -12
- package/dist/src/local-first/LocalAuth.d.ts +2 -2
- package/dist/src/local-first/Owner.d.ts +3 -0
- package/dist/src/local-first/Owner.d.ts.map +1 -1
- package/dist/src/local-first/Protocol.d.ts +1 -1
- package/dist/src/local-first/Protocol.d.ts.map +1 -1
- package/dist/src/local-first/Protocol.js +12 -12
- package/dist/src/local-first/PublicKysely.js +1 -1
- package/dist/src/local-first/Query.d.ts +54 -6
- package/dist/src/local-first/Query.d.ts.map +1 -1
- package/dist/src/local-first/Query.js +130 -11
- package/dist/src/local-first/Relay.d.ts.map +1 -1
- package/dist/src/local-first/Relay.js +17 -18
- package/dist/src/local-first/Schema.d.ts +15 -14
- package/dist/src/local-first/Schema.d.ts.map +1 -1
- package/dist/src/local-first/Schema.js +43 -51
- package/dist/src/local-first/Storage.d.ts +2 -2
- package/dist/src/local-first/Storage.d.ts.map +1 -1
- package/dist/src/local-first/Storage.js +2 -6
- package/dist/src/local-first/Sync.d.ts +10 -7
- package/dist/src/local-first/Sync.d.ts.map +1 -1
- package/dist/src/local-first/Sync.js +154 -103
- package/dist/src/local-first/Timestamp.d.ts +13 -0
- package/dist/src/local-first/Timestamp.d.ts.map +1 -1
- package/dist/src/local-first/Timestamp.js +14 -1
- package/dist/src/local-first/index.d.ts +0 -1
- package/dist/src/local-first/index.d.ts.map +1 -1
- package/dist/src/local-first/index.js +0 -1
- package/package.json +1 -1
- package/src/Function.ts +74 -0
- package/src/Object.ts +40 -1
- package/src/Order.ts +2 -1
- package/src/Result.ts +38 -29
- package/src/Sqlite.ts +18 -7
- package/src/Task.ts +6 -4
- package/src/Type.ts +134 -1
- package/src/local-first/Db.ts +182 -217
- package/src/local-first/Evolu.ts +21 -10
- package/src/local-first/LocalAuth.ts +2 -2
- package/src/local-first/Owner.ts +4 -0
- package/src/local-first/Protocol.ts +13 -19
- package/src/local-first/PublicKysely.ts +1 -1
- package/src/local-first/Query.ts +216 -21
- package/src/local-first/Relay.ts +20 -24
- package/src/local-first/Schema.ts +83 -70
- package/src/local-first/Storage.ts +3 -8
- package/src/local-first/Sync.ts +215 -135
- package/src/local-first/Timestamp.ts +14 -1
- package/src/local-first/index.ts +0 -1
- package/dist/src/local-first/Diff.d.ts +0 -43
- package/dist/src/local-first/Diff.d.ts.map +0 -1
- package/dist/src/local-first/Diff.js +0 -97
- package/src/local-first/Diff.ts +0 -144
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { isNonEmptyArray } from "../Array.js";
|
|
1
|
+
import { firstInArray, isNonEmptyArray, } from "../Array.js";
|
|
2
|
+
import { assertNonEmptyReadonlyArray } from "../Assert.js";
|
|
2
3
|
import { createSymmetricCrypto, } from "../Crypto.js";
|
|
3
4
|
import { ok } from "../Result.js";
|
|
4
|
-
import { createSqlite,
|
|
5
|
+
import { createSqlite, sql, } from "../Sqlite.js";
|
|
5
6
|
import { SimpleName } from "../Type.js";
|
|
6
7
|
import { createInitializedWorkerWithHandlers, } from "../Worker.js";
|
|
7
|
-
import { makePatches } from "./Diff.js";
|
|
8
8
|
import { createAppOwner, createOwnerSecret, mnemonicToOwnerSecret, } from "./Owner.js";
|
|
9
9
|
import { protocolVersion } from "./Protocol.js";
|
|
10
|
-
import {
|
|
10
|
+
import { createGetQueryRowsCache, loadQueries, } from "./Query.js";
|
|
11
11
|
import { ensureDbSchema, getDbSchema, } from "./Schema.js";
|
|
12
12
|
import { createBaseSqliteStorageTables } from "./Storage.js";
|
|
13
|
-
import { applyLocalOnlyChange, createClock, createSync, } from "./Sync.js";
|
|
13
|
+
import { applyLocalOnlyChange, createClock, createSync, tryApplyQuarantinedMessages, } from "./Sync.js";
|
|
14
14
|
import { timestampBytesToTimestamp, timestampToTimestampBytes, } from "./Timestamp.js";
|
|
15
15
|
export const defaultDbConfig = {
|
|
16
16
|
name: SimpleName.orThrow("Evolu"),
|
|
@@ -18,51 +18,51 @@ export const defaultDbConfig = {
|
|
|
18
18
|
maxDrift: 5 * 60 * 1000,
|
|
19
19
|
enableLogging: false,
|
|
20
20
|
};
|
|
21
|
-
export const createDbWorkerForPlatform = (platformDeps) => createInitializedWorkerWithHandlers({
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
export const createDbWorkerForPlatform = (platformDeps) => createInitializedWorkerWithHandlers({
|
|
22
|
+
init: async (initMessage, postMessage) => {
|
|
23
|
+
platformDeps.console.enabled = initMessage.config.enableLogging ?? false;
|
|
24
|
+
const deps = await createDbWorkerDeps(platformDeps, initMessage, postMessage);
|
|
25
|
+
if (!deps.ok) {
|
|
26
|
+
postMessage({ type: "onError", error: deps.error });
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return deps.value;
|
|
30
|
+
},
|
|
31
|
+
handlers,
|
|
32
|
+
});
|
|
33
|
+
const createDbWorkerDeps = async (platformDeps, initMessage, postMessage) => {
|
|
34
|
+
const sqlite = await createSqlite(platformDeps)(initMessage.config.name, {
|
|
25
35
|
memory: initMessage.config.inMemory ?? false,
|
|
26
36
|
encryptionKey: initMessage.config.encryptionKey ?? undefined,
|
|
27
37
|
});
|
|
28
|
-
if (!
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return currentDbSchema;
|
|
38
|
+
if (!sqlite.ok)
|
|
39
|
+
return sqlite;
|
|
40
|
+
const deps = { ...platformDeps, sqlite: sqlite.value };
|
|
41
|
+
return deps.sqlite.transaction(() => {
|
|
42
|
+
const dbSchema = getDbSchema(deps)();
|
|
43
|
+
if (!dbSchema.ok)
|
|
44
|
+
return dbSchema;
|
|
45
|
+
const dbIsInitialized = "evolu_version" in dbSchema.value.tables;
|
|
37
46
|
let appOwner;
|
|
38
47
|
let clock;
|
|
39
|
-
const dbIsInitialized = currentDbSchema.value.tables.some((table) => table.name === "evolu_version");
|
|
40
48
|
if (dbIsInitialized) {
|
|
41
|
-
const currentVersion = sqlite.exec(sql `select protocolVersion from evolu_version limit 1;`);
|
|
49
|
+
const currentVersion = deps.sqlite.exec(sql `select protocolVersion from evolu_version limit 1;`);
|
|
42
50
|
if (!currentVersion.ok)
|
|
43
51
|
return currentVersion;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
select
|
|
55
|
-
clock,
|
|
56
|
-
appOwnerId,
|
|
57
|
-
appOwnerEncryptionKey,
|
|
58
|
-
appOwnerWriteKey,
|
|
59
|
-
appOwnerMnemonic
|
|
60
|
-
from evolu_config
|
|
61
|
-
limit 1;
|
|
62
|
-
`);
|
|
52
|
+
const configResult = deps.sqlite.exec(sql `
|
|
53
|
+
select
|
|
54
|
+
clock,
|
|
55
|
+
appOwnerId,
|
|
56
|
+
appOwnerEncryptionKey,
|
|
57
|
+
appOwnerWriteKey,
|
|
58
|
+
appOwnerMnemonic
|
|
59
|
+
from evolu_config
|
|
60
|
+
limit 1;
|
|
61
|
+
`);
|
|
63
62
|
if (!configResult.ok)
|
|
64
63
|
return configResult;
|
|
65
|
-
|
|
64
|
+
assertNonEmptyReadonlyArray(configResult.value.rows);
|
|
65
|
+
const config = firstInArray(configResult.value.rows);
|
|
66
66
|
appOwner = {
|
|
67
67
|
type: "AppOwner",
|
|
68
68
|
id: config.appOwnerId,
|
|
@@ -70,27 +70,33 @@ const createDbWorkerDeps = (platformDeps) => async (initMessage, postMessage) =>
|
|
|
70
70
|
writeKey: config.appOwnerWriteKey,
|
|
71
71
|
mnemonic: config.appOwnerMnemonic,
|
|
72
72
|
};
|
|
73
|
-
clock = createClock(
|
|
73
|
+
clock = createClock(deps)(timestampBytesToTimestamp(config.clock));
|
|
74
74
|
}
|
|
75
75
|
else {
|
|
76
76
|
appOwner =
|
|
77
77
|
initMessage.config.externalAppOwner ??
|
|
78
78
|
createAppOwner(createOwnerSecret(platformDeps));
|
|
79
|
-
clock = createClock(
|
|
80
|
-
const result = initializeDb(
|
|
79
|
+
clock = createClock(deps)();
|
|
80
|
+
const result = initializeDb(deps)(appOwner, clock.get());
|
|
81
|
+
if (!result.ok)
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
{
|
|
85
|
+
const result = ensureDbSchema(deps)(initMessage.dbSchema, dbSchema.value);
|
|
86
|
+
if (!result.ok)
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
{
|
|
90
|
+
const result = ensureMessageQuarantineTable(deps);
|
|
81
91
|
if (!result.ok)
|
|
82
92
|
return result;
|
|
83
93
|
}
|
|
84
|
-
const result = ensureDbSchema({ sqlite })(initMessage.dbSchema, currentDbSchema.value);
|
|
85
|
-
if (!result.ok)
|
|
86
|
-
return result;
|
|
87
94
|
const sync = createSync({
|
|
88
|
-
...
|
|
95
|
+
...deps,
|
|
89
96
|
clock,
|
|
90
|
-
sqlite,
|
|
91
97
|
symmetricCrypto: createSymmetricCrypto(platformDeps),
|
|
92
98
|
timestampConfig: initMessage.config,
|
|
93
|
-
|
|
99
|
+
dbSchema: initMessage.dbSchema,
|
|
94
100
|
})({
|
|
95
101
|
appOwner,
|
|
96
102
|
transports: initMessage.config.transports,
|
|
@@ -103,31 +109,23 @@ const createDbWorkerDeps = (platformDeps) => async (initMessage, postMessage) =>
|
|
|
103
109
|
});
|
|
104
110
|
if (!sync.ok)
|
|
105
111
|
return sync;
|
|
112
|
+
{
|
|
113
|
+
const result = tryApplyQuarantinedMessages({
|
|
114
|
+
...deps,
|
|
115
|
+
dbSchema: initMessage.dbSchema,
|
|
116
|
+
})();
|
|
117
|
+
if (!result.ok)
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
106
120
|
sync.value.useOwner(true, appOwner);
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
if (!cache) {
|
|
111
|
-
cache = createQueryRowsCache();
|
|
112
|
-
tabQueryRowsCacheMap.set(tabId, cache);
|
|
113
|
-
}
|
|
114
|
-
return cache;
|
|
115
|
-
};
|
|
116
|
-
const deps = {
|
|
117
|
-
...platformDeps,
|
|
118
|
-
getQueryRowsCache,
|
|
121
|
+
return ok({
|
|
122
|
+
...deps,
|
|
123
|
+
getQueryRowsCache: createGetQueryRowsCache(),
|
|
119
124
|
postMessage,
|
|
120
|
-
sqlite,
|
|
121
125
|
sync: sync.value,
|
|
122
126
|
appOwner,
|
|
123
|
-
};
|
|
124
|
-
return ok(deps);
|
|
127
|
+
});
|
|
125
128
|
});
|
|
126
|
-
if (!deps.ok) {
|
|
127
|
-
postMessage({ type: "onError", error: deps.error });
|
|
128
|
-
return null;
|
|
129
|
-
}
|
|
130
|
-
return deps.value;
|
|
131
129
|
};
|
|
132
130
|
const initializeDb = (deps) => (initialAppOwner, initialClock) => {
|
|
133
131
|
for (const query of [
|
|
@@ -189,7 +187,6 @@ const initializeDb = (deps) => (initialAppOwner, initialClock) => {
|
|
|
189
187
|
strict;
|
|
190
188
|
`,
|
|
191
189
|
// Index for reading database changes by owner and timestamp.
|
|
192
|
-
// Timestamp always corresponds to a DbChange.
|
|
193
190
|
sql `
|
|
194
191
|
create index evolu_history_ownerId_timestamp on evolu_history (
|
|
195
192
|
"ownerId",
|
|
@@ -215,6 +212,39 @@ const initializeDb = (deps) => (initialAppOwner, initialClock) => {
|
|
|
215
212
|
return result;
|
|
216
213
|
return ok();
|
|
217
214
|
};
|
|
215
|
+
/**
|
|
216
|
+
* Ensures the quarantine table exists for storing messages with unknown schema.
|
|
217
|
+
*
|
|
218
|
+
* When a device receives sync messages containing tables or columns that don't
|
|
219
|
+
* exist in its current schema (e.g., from a newer app version), those messages
|
|
220
|
+
* are stored here instead of being discarded. This enables forward
|
|
221
|
+
* compatibility:
|
|
222
|
+
*
|
|
223
|
+
* 1. Unknown data is preserved and can be applied when the app is updated
|
|
224
|
+
* 2. Messages are still propagated to other devices that may understand them
|
|
225
|
+
* 3. Partial messages work - known columns go to app tables, unknown to quarantine
|
|
226
|
+
*
|
|
227
|
+
* The `union all` query in `readDbChange` combines `evolu_history` and this
|
|
228
|
+
* table, ensuring all data (known and unknown) is included when syncing to
|
|
229
|
+
* other devices.
|
|
230
|
+
*/
|
|
231
|
+
const ensureMessageQuarantineTable = (deps) => {
|
|
232
|
+
const result = deps.sqlite.exec(sql `
|
|
233
|
+
create table if not exists evolu_message_quarantine (
|
|
234
|
+
"ownerId" blob not null,
|
|
235
|
+
"timestamp" blob not null,
|
|
236
|
+
"table" text not null,
|
|
237
|
+
"id" blob not null,
|
|
238
|
+
"column" text not null,
|
|
239
|
+
"value" any,
|
|
240
|
+
primary key ("ownerId", "timestamp", "table", "id", "column")
|
|
241
|
+
)
|
|
242
|
+
strict;
|
|
243
|
+
`);
|
|
244
|
+
if (!result.ok)
|
|
245
|
+
return result;
|
|
246
|
+
return ok();
|
|
247
|
+
};
|
|
218
248
|
const handlers = {
|
|
219
249
|
getAppOwner: (deps) => () => {
|
|
220
250
|
deps.postMessage({
|
|
@@ -275,11 +305,11 @@ const handlers = {
|
|
|
275
305
|
});
|
|
276
306
|
},
|
|
277
307
|
reset: (deps) => (message) => {
|
|
278
|
-
const
|
|
308
|
+
const result = deps.sqlite.transaction(() => {
|
|
279
309
|
const dbSchema = getDbSchema(deps)();
|
|
280
310
|
if (!dbSchema.ok)
|
|
281
311
|
return dbSchema;
|
|
282
|
-
for (const
|
|
312
|
+
for (const tableName in dbSchema.value.tables) {
|
|
283
313
|
/**
|
|
284
314
|
* The dropped table is completely removed from the database schema and
|
|
285
315
|
* the disk file. The table can not be recovered. All indices and
|
|
@@ -287,29 +317,24 @@ const handlers = {
|
|
|
287
317
|
* https://sqlite.org/lang_droptable.html
|
|
288
318
|
*/
|
|
289
319
|
const result = deps.sqlite.exec(sql `
|
|
290
|
-
drop table ${sql.identifier(
|
|
320
|
+
drop table ${sql.identifier(tableName)};
|
|
291
321
|
`);
|
|
292
322
|
if (!result.ok)
|
|
293
323
|
return result;
|
|
294
324
|
}
|
|
295
325
|
if (message.restore) {
|
|
296
|
-
const
|
|
297
|
-
if (!
|
|
298
|
-
return
|
|
299
|
-
const ensureDbSchemaResult = ensureDbSchema(deps)(message.restore.dbSchema, dbSchema.value);
|
|
300
|
-
if (!ensureDbSchemaResult.ok)
|
|
301
|
-
return ensureDbSchemaResult;
|
|
326
|
+
const result = ensureDbSchema(deps)(message.restore.dbSchema);
|
|
327
|
+
if (!result.ok)
|
|
328
|
+
return result;
|
|
302
329
|
const secret = mnemonicToOwnerSecret(message.restore.mnemonic);
|
|
303
330
|
const appOwner = createAppOwner(secret);
|
|
304
331
|
const clock = createClock(deps)();
|
|
305
|
-
|
|
306
|
-
if (!initializeDbResult.ok)
|
|
307
|
-
return initializeDbResult;
|
|
332
|
+
return initializeDb(deps)(appOwner, clock.get());
|
|
308
333
|
}
|
|
309
334
|
return ok();
|
|
310
335
|
});
|
|
311
|
-
if (!
|
|
312
|
-
deps.postMessage({ type: "onError", error:
|
|
336
|
+
if (!result.ok) {
|
|
337
|
+
deps.postMessage({ type: "onError", error: result.error });
|
|
313
338
|
return;
|
|
314
339
|
}
|
|
315
340
|
deps.postMessage({
|
|
@@ -319,17 +344,9 @@ const handlers = {
|
|
|
319
344
|
});
|
|
320
345
|
},
|
|
321
346
|
ensureDbSchema: (deps) => (message) => {
|
|
322
|
-
const
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
return dbSchema;
|
|
326
|
-
const ensureDbSchemaResult = ensureDbSchema(deps)(message.dbSchema, dbSchema.value);
|
|
327
|
-
if (!ensureDbSchemaResult.ok)
|
|
328
|
-
return ensureDbSchemaResult;
|
|
329
|
-
return ok();
|
|
330
|
-
});
|
|
331
|
-
if (!ensureSchema.ok) {
|
|
332
|
-
deps.postMessage({ type: "onError", error: ensureSchema.error });
|
|
347
|
+
const result = deps.sqlite.transaction(() => ensureDbSchema(deps)(message.dbSchema));
|
|
348
|
+
if (!result.ok) {
|
|
349
|
+
deps.postMessage({ type: "onError", error: result.error });
|
|
333
350
|
return;
|
|
334
351
|
}
|
|
335
352
|
},
|
|
@@ -349,25 +366,3 @@ const handlers = {
|
|
|
349
366
|
deps.sync.useOwner(message.use, message.owner);
|
|
350
367
|
},
|
|
351
368
|
};
|
|
352
|
-
const loadQueries = (deps) => (tabId, queries) => {
|
|
353
|
-
const queriesRows = [];
|
|
354
|
-
for (const query of queries) {
|
|
355
|
-
const sqlQuery = deserializeQuery(query);
|
|
356
|
-
const result = deps.sqlite.exec(sqlQuery);
|
|
357
|
-
if (!result.ok)
|
|
358
|
-
return result;
|
|
359
|
-
queriesRows.push([query, result.value.rows]);
|
|
360
|
-
if (sqlQuery.options?.logExplainQueryPlan) {
|
|
361
|
-
explainSqliteQueryPlan(deps)(sqlQuery);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
const queryRowsCache = deps.getQueryRowsCache(tabId);
|
|
365
|
-
const previousState = queryRowsCache.get();
|
|
366
|
-
queryRowsCache.set(queriesRows);
|
|
367
|
-
const currentState = queryRowsCache.get();
|
|
368
|
-
const queryPatchesArray = queries.map((query) => ({
|
|
369
|
-
query,
|
|
370
|
-
patches: makePatches(previousState.get(query), currentState.get(query) ?? emptyRows),
|
|
371
|
-
}));
|
|
372
|
-
return ok(queryPatchesArray);
|
|
373
|
-
};
|
|
@@ -39,6 +39,9 @@ export interface EvoluConfig extends Partial<DbConfig> {
|
|
|
39
39
|
* URL to reload browser tabs after reset or restore.
|
|
40
40
|
*
|
|
41
41
|
* The default value is `/`.
|
|
42
|
+
*
|
|
43
|
+
* Note: This option will be moved to web platform deps in the next major
|
|
44
|
+
* version.
|
|
42
45
|
*/
|
|
43
46
|
readonly reloadUrl?: string;
|
|
44
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../../src/local-first/Evolu.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAE3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIhD,OAAO,
|
|
1
|
+
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../../src/local-first/Evolu.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import { pack } from "msgpackr";
|
|
2
2
|
import { dedupeArray, isNonEmptyArray, isNonEmptyReadonlyArray, } from "../Array.js";
|
|
3
|
-
import { assertNonEmptyReadonlyArray } from "../Assert.js";
|
|
3
|
+
import { assert, assertNonEmptyReadonlyArray } from "../Assert.js";
|
|
4
4
|
import { createCallbacks } from "../Callbacks.js";
|
|
5
5
|
import { eqArrayNumber } from "../Eq.js";
|
|
6
6
|
import { exhaustiveCheck } from "../Function.js";
|
|
7
7
|
import { createInstances } from "../Instances.js";
|
|
8
8
|
import { err, ok } from "../Result.js";
|
|
9
|
-
import { isSqlMutation, SqliteBoolean, } from "../Sqlite.js";
|
|
9
|
+
import { isSqlMutation, SqliteBoolean, sqliteBooleanToBoolean, } from "../Sqlite.js";
|
|
10
10
|
import { createStore } from "../Store.js";
|
|
11
11
|
import { createId, } from "../Type.js";
|
|
12
12
|
import { defaultDbConfig } from "./Db.js";
|
|
13
|
-
import { applyPatches } from "./
|
|
14
|
-
import { createSubscribedQueries, emptyRows, serializeQuery, } from "./Query.js";
|
|
13
|
+
import { applyPatches, createSubscribedQueries, emptyRows, serializeQuery, } from "./Query.js";
|
|
15
14
|
import { evoluSchemaToDbSchema, insertable, kysely, updateable, upsertable, } from "./Schema.js";
|
|
16
15
|
import { DbChange } from "./Storage.js";
|
|
17
16
|
import { initialSyncState } from "./Sync.js";
|
|
@@ -193,13 +192,16 @@ const createEvoluInstance = (deps) => (schema, config) => {
|
|
|
193
192
|
}
|
|
194
193
|
else {
|
|
195
194
|
const { id: _, isDeleted, ...values } = result.value;
|
|
196
|
-
const dbChange =
|
|
195
|
+
const dbChange = {
|
|
197
196
|
table,
|
|
198
197
|
id,
|
|
199
198
|
values,
|
|
200
199
|
isInsert: kind === "insert" || kind === "upsert",
|
|
201
|
-
isDelete: SqliteBoolean.is(isDeleted)
|
|
202
|
-
|
|
200
|
+
isDelete: SqliteBoolean.is(isDeleted)
|
|
201
|
+
? sqliteBooleanToBoolean(isDeleted)
|
|
202
|
+
: null,
|
|
203
|
+
};
|
|
204
|
+
assert(DbChange.is(dbChange), `Invalid DbChange for table '${table}': Please check schema type errors.`);
|
|
203
205
|
mutateMicrotaskQueue.push([
|
|
204
206
|
{ ...dbChange, ownerId: options?.ownerId },
|
|
205
207
|
options?.onComplete,
|
|
@@ -268,16 +270,16 @@ const createEvoluInstance = (deps) => (schema, config) => {
|
|
|
268
270
|
loadQueries: (queries) => queries.map(evolu.loadQuery),
|
|
269
271
|
subscribeQuery: (query) => (listener) => {
|
|
270
272
|
// Call the listener only if the result has been changed.
|
|
271
|
-
let
|
|
273
|
+
let previousRows = null;
|
|
272
274
|
const unsubscribe = subscribedQueries.subscribe(query)(() => {
|
|
273
|
-
const
|
|
274
|
-
if (
|
|
275
|
+
const rows = evolu.getQueryRows(query);
|
|
276
|
+
if (previousRows === rows)
|
|
275
277
|
return;
|
|
276
|
-
|
|
278
|
+
previousRows = rows;
|
|
277
279
|
listener();
|
|
278
280
|
});
|
|
279
281
|
return () => {
|
|
280
|
-
|
|
282
|
+
previousRows = null;
|
|
281
283
|
unsubscribe();
|
|
282
284
|
};
|
|
283
285
|
},
|
|
@@ -27,9 +27,9 @@ export interface LocalAuthDep {
|
|
|
27
27
|
readonly localAuth: LocalAuth;
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
* - **⚠️
|
|
31
|
-
*
|
|
32
30
|
* Secure storage interface that must be implemented by each platform.
|
|
31
|
+
*
|
|
32
|
+
* @experimental
|
|
33
33
|
*/
|
|
34
34
|
export interface SecureStorage {
|
|
35
35
|
setItem: (key: string, value: string, options?: LocalAuthOptions) => Promise<MutationResult>;
|
|
@@ -127,6 +127,9 @@ export interface AppOwner extends Owner {
|
|
|
127
127
|
*/
|
|
128
128
|
readonly mnemonic?: Mnemonic | null;
|
|
129
129
|
}
|
|
130
|
+
export interface AppOwnerDep {
|
|
131
|
+
readonly appOwner: AppOwner;
|
|
132
|
+
}
|
|
130
133
|
/** Creates an {@link AppOwner} from an {@link OwnerSecret}. */
|
|
131
134
|
export declare const createAppOwner: (secret: OwnerSecret) => AppOwner;
|
|
132
135
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Owner.d.ts","sourceRoot":"","sources":["../../../src/local-first/Owner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Owner.d.ts","sourceRoot":"","sources":["../../../src/local-first/Owner.ts"],"names":[],"mappings":"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"}
|
|
@@ -166,7 +166,7 @@ import { EncryptionKey, RandomBytesDep, SymmetricCryptoDecryptError, SymmetricCr
|
|
|
166
166
|
import { Result } from "../Result.js";
|
|
167
167
|
import { SqliteValue } from "../Sqlite.js";
|
|
168
168
|
import { NonNegativeInt, PositiveInt } from "../Type.js";
|
|
169
|
-
import {
|
|
169
|
+
import { Owner, OwnerError, OwnerId, OwnerWriteKey } from "./Owner.js";
|
|
170
170
|
import { BaseRange, CrdtMessage, DbChange, EncryptedCrdtMessage, EncryptedDbChange, FingerprintRange, RangeType, SkipRange, StorageDep } from "./Storage.js";
|
|
171
171
|
import { NodeId, Timestamp } from "./Timestamp.js";
|
|
172
172
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../../src/local-first/Protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgKG;AAoBH,OAAO,EAA2B,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE7E,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EACL,MAAM,EAMP,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,aAAa,EACb,cAAc,EACd,2BAA2B,EAC3B,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAItB,OAAO,EAAW,MAAM,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAaL,cAAc,EAEd,WAAW,EAEZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,UAAU,EACV,
|
|
1
|
+
{"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../../src/local-first/Protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -182,7 +182,7 @@ import { bytesToHex, bytesToUtf8, createBuffer, hexToBytes, utf8ToBytes, } from
|
|
|
182
182
|
import { createPadmePadding, } from "../Crypto.js";
|
|
183
183
|
import { eqArrayNumber } from "../Eq.js";
|
|
184
184
|
import { computeBalancedBuckets } from "../Number.js";
|
|
185
|
-
import { objectToEntries } from "../Object.js";
|
|
185
|
+
import { createRecord, objectToEntries } from "../Object.js";
|
|
186
186
|
import { err, ok } from "../Result.js";
|
|
187
187
|
import { Base64Url, base64UrlToUint8Array, between, DateIso, Id, idBytesToId, idBytesTypeValueLength, idToIdBytes, Int, Json, jsonToJsonValue, NonNegativeInt, Number, PositiveInt, uint8ArrayToBase64Url, } from "../Type.js";
|
|
188
188
|
import { ownerIdToOwnerIdBytes, ownerWriteKeyLength, } from "./Owner.js";
|
|
@@ -586,9 +586,9 @@ export const applyProtocolMessageAsClient = (deps) => async (inputMessage, optio
|
|
|
586
586
|
const messages = decodeMessages(input);
|
|
587
587
|
const ownerIdBytes = ownerIdToOwnerIdBytes(ownerId);
|
|
588
588
|
if (isNonEmptyReadonlyArray(messages)) {
|
|
589
|
-
const
|
|
589
|
+
const result = await deps.storage.writeMessages(ownerIdBytes, messages);
|
|
590
590
|
// Errors are handled by the Storage. Here we just stop syncing.
|
|
591
|
-
if (!
|
|
591
|
+
if (!result.ok)
|
|
592
592
|
return ok({ type: "no-response" });
|
|
593
593
|
}
|
|
594
594
|
// Now: No writeKey, no sync.
|
|
@@ -612,9 +612,9 @@ export const applyProtocolMessageAsClient = (deps) => async (inputMessage, optio
|
|
|
612
612
|
writeKey,
|
|
613
613
|
rangesMaxSize: options.rangesMaxSize,
|
|
614
614
|
});
|
|
615
|
-
const
|
|
615
|
+
const result = sync(deps)(ranges, output, ownerIdBytes);
|
|
616
616
|
// Client sync error (handled via Storage) or no changes.
|
|
617
|
-
if (!
|
|
617
|
+
if (!result.ok || !result.value) {
|
|
618
618
|
return ok({ type: "no-response" });
|
|
619
619
|
}
|
|
620
620
|
return ok({ type: "response", message: output.unwrap() });
|
|
@@ -685,9 +685,9 @@ version = protocolVersion) => {
|
|
|
685
685
|
}).unwrap(),
|
|
686
686
|
});
|
|
687
687
|
}
|
|
688
|
-
const
|
|
689
|
-
if (!
|
|
690
|
-
const errorCode =
|
|
688
|
+
const result = await deps.storage.writeMessages(ownerIdBytes, messages);
|
|
689
|
+
if (!result.ok) {
|
|
690
|
+
const errorCode = result.error.type === "StorageWriteError"
|
|
691
691
|
? ProtocolErrorCode.WriteError
|
|
692
692
|
: ProtocolErrorCode.QuotaError;
|
|
693
693
|
const message = createProtocolMessageBuffer(ownerId, {
|
|
@@ -738,12 +738,12 @@ version = protocolVersion) => {
|
|
|
738
738
|
if (!isNonEmptyReadonlyArray(ranges)) {
|
|
739
739
|
return ok({ type: "response", message: output.unwrap() });
|
|
740
740
|
}
|
|
741
|
-
const
|
|
742
|
-
const message =
|
|
741
|
+
const result = sync(deps)(ranges, output, ownerIdBytes);
|
|
742
|
+
const message = result.ok
|
|
743
743
|
? output.unwrap()
|
|
744
744
|
: createProtocolMessageBuffer(ownerId, {
|
|
745
745
|
messageType: MessageType.Response,
|
|
746
|
-
errorCode:
|
|
746
|
+
errorCode: result.error,
|
|
747
747
|
}).unwrap();
|
|
748
748
|
// Non-initiators always respond to provide sync completion feedback,
|
|
749
749
|
return ok({ type: "response", message });
|
|
@@ -1195,7 +1195,7 @@ export const decryptAndDecodeDbChange = (deps) => (message, key) => {
|
|
|
1195
1195
|
const table = decodeString(buffer);
|
|
1196
1196
|
const id = decodeId(buffer);
|
|
1197
1197
|
const length = decodeLength(buffer);
|
|
1198
|
-
const values =
|
|
1198
|
+
const values = createRecord();
|
|
1199
1199
|
for (let i = 0; i < length; i++) {
|
|
1200
1200
|
const column = decodeString(buffer);
|
|
1201
1201
|
const value = decodeSqliteValue(buffer);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AliasNode, ColumnNode, ExpressionWrapper, IdentifierNode, ReferenceNode, sql, TableNode, ValueNode, } from "kysely";
|
|
2
|
-
import { kyselyJsonIdentifier } from "./
|
|
2
|
+
import { kyselyJsonIdentifier } from "./Query.js";
|
|
3
3
|
export { sql } from "kysely";
|
|
4
4
|
/**
|
|
5
5
|
* A SQLite helper for aggregating a subquery into a JSON array.
|