@evolu/common 6.0.1-preview.2 → 6.0.1-preview.4
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/Evolu/Db.d.ts +21 -13
- package/dist/src/Evolu/Db.d.ts.map +1 -1
- package/dist/src/Evolu/Db.js +79 -63
- package/dist/src/Evolu/Evolu.d.ts +2 -2
- package/dist/src/Evolu/Evolu.d.ts.map +1 -1
- package/dist/src/Evolu/Evolu.js +19 -24
- package/dist/src/Evolu/Protocol.d.ts +12 -12
- package/dist/src/Evolu/Protocol.d.ts.map +1 -1
- package/dist/src/Evolu/Protocol.js +16 -6
- package/dist/src/Evolu/Schema.d.ts +24 -40
- package/dist/src/Evolu/Schema.d.ts.map +1 -1
- package/dist/src/Evolu/Schema.js +13 -72
- package/package.json +2 -2
- package/src/Evolu/Db.ts +90 -76
- package/src/Evolu/Evolu.ts +34 -31
- package/src/Evolu/Protocol.ts +16 -13
- package/src/Evolu/Schema.ts +102 -130
package/dist/src/Evolu/Db.d.ts
CHANGED
|
@@ -14,24 +14,32 @@ import { Worker } from "../Worker.js";
|
|
|
14
14
|
import { Config } from "./Config.js";
|
|
15
15
|
import { QueryPatches } from "./Diff.js";
|
|
16
16
|
import { AppOwner, OwnerRow } from "./Owner.js";
|
|
17
|
-
import {
|
|
17
|
+
import { BinaryOwnerId, CrdtMessage, DbChange, ProtocolError, Storage } from "./Protocol.js";
|
|
18
18
|
import { Query } from "./Query.js";
|
|
19
19
|
import { SqliteStorageBase } from "./Storage.js";
|
|
20
20
|
import { CreateSyncDep } from "./Sync.js";
|
|
21
21
|
import { Timestamp, TimestampError } from "./Timestamp.js";
|
|
22
|
-
export
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
export
|
|
27
|
-
readonly name: Base64Url256;
|
|
28
|
-
readonly columns: ReadonlyArray<Base64Url256>;
|
|
29
|
-
}
|
|
22
|
+
export declare const DbTable: import("../Type.js").ObjectType<{
|
|
23
|
+
name: import("../Type.js").BrandType<import("../Type.js").Type<"Brand", string & import("../Types.js").Brand<"Base64Url">, string, import("../Type.js").RegexError<"Base64Url">, string, import("../Type.js").StringError>, "MaxLength256", import("../Type.js").MaxLengthError<256>, import("../Type.js").StringError | import("../Type.js").RegexError<"Base64Url">>;
|
|
24
|
+
columns: import("../Type.js").ArrayType<import("../Type.js").BrandType<import("../Type.js").Type<"Brand", string & import("../Types.js").Brand<"Base64Url">, string, import("../Type.js").RegexError<"Base64Url">, string, import("../Type.js").StringError>, "MaxLength256", import("../Type.js").MaxLengthError<256>, import("../Type.js").StringError | import("../Type.js").RegexError<"Base64Url">>>;
|
|
25
|
+
}>;
|
|
26
|
+
export type DbTable = typeof DbTable.Type;
|
|
30
27
|
export declare const DbIndex: import("../Type.js").ObjectType<{
|
|
31
28
|
name: import("../Type.js").Type<"String", string, string, import("../Type.js").StringError, string, import("../Type.js").StringError>;
|
|
32
29
|
sql: import("../Type.js").Type<"String", string, string, import("../Type.js").StringError, string, import("../Type.js").StringError>;
|
|
33
30
|
}>;
|
|
34
31
|
export type DbIndex = typeof DbIndex.Type;
|
|
32
|
+
export declare const DbSchema: import("../Type.js").ObjectType<{
|
|
33
|
+
tables: import("../Type.js").ArrayType<import("../Type.js").ObjectType<{
|
|
34
|
+
name: import("../Type.js").BrandType<import("../Type.js").Type<"Brand", string & import("../Types.js").Brand<"Base64Url">, string, import("../Type.js").RegexError<"Base64Url">, string, import("../Type.js").StringError>, "MaxLength256", import("../Type.js").MaxLengthError<256>, import("../Type.js").StringError | import("../Type.js").RegexError<"Base64Url">>;
|
|
35
|
+
columns: import("../Type.js").ArrayType<import("../Type.js").BrandType<import("../Type.js").Type<"Brand", string & import("../Types.js").Brand<"Base64Url">, string, import("../Type.js").RegexError<"Base64Url">, string, import("../Type.js").StringError>, "MaxLength256", import("../Type.js").MaxLengthError<256>, import("../Type.js").StringError | import("../Type.js").RegexError<"Base64Url">>>;
|
|
36
|
+
}>>;
|
|
37
|
+
indexes: import("../Type.js").ArrayType<import("../Type.js").ObjectType<{
|
|
38
|
+
name: import("../Type.js").Type<"String", string, string, import("../Type.js").StringError, string, import("../Type.js").StringError>;
|
|
39
|
+
sql: import("../Type.js").Type<"String", string, string, import("../Type.js").StringError, string, import("../Type.js").StringError>;
|
|
40
|
+
}>>;
|
|
41
|
+
}>;
|
|
42
|
+
export type DbSchema = typeof DbSchema.Type;
|
|
35
43
|
export type DbWorker = Worker<DbWorkerInput, DbWorkerOutput>;
|
|
36
44
|
export type CreateDbWorker = (name: SimpleName) => DbWorker;
|
|
37
45
|
export interface CreateDbWorkerDep {
|
|
@@ -105,14 +113,14 @@ export declare const getDbSchema: (deps: SqliteDep) => ({ allIndexes }?: {
|
|
|
105
113
|
}) => Result<DbSchema, SqliteError>;
|
|
106
114
|
export interface DbSnapshot {
|
|
107
115
|
readonly schema: DbSchema;
|
|
108
|
-
readonly
|
|
109
|
-
rows: ReadonlyArray<SqliteRow>;
|
|
116
|
+
readonly tables: Array<{
|
|
110
117
|
name: string;
|
|
118
|
+
rows: ReadonlyArray<SqliteRow>;
|
|
111
119
|
}>;
|
|
112
120
|
}
|
|
113
|
-
export declare const getDbSnapshot: (deps: SqliteDep) =>
|
|
121
|
+
export declare const getDbSnapshot: (deps: SqliteDep) => DbSnapshot;
|
|
114
122
|
export declare const createAppTable: (tableName: string, columns: ReadonlyArray<string>) => SafeSql;
|
|
115
|
-
export declare const applyMessageToTimestampAndHistoryTables: (deps: SqliteDep &
|
|
123
|
+
export declare const applyMessageToTimestampAndHistoryTables: (deps: SqliteDep & ClientStorageDep) => (ownerId: BinaryOwnerId, message: CrdtMessage) => Result<void, SqliteError>;
|
|
116
124
|
export declare const maybeMigrateToVersion0: (deps: SqliteDep) => (schema: DbSchema) => Result<{
|
|
117
125
|
readonly messages: ReadonlyArray<CrdtMessage>;
|
|
118
126
|
readonly mnemonic: Mnemonic;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Db.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EAEpB,2BAA2B,EAE5B,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAa,GAAG,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAW,MAAM,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAEL,qBAAqB,EAErB,OAAO,EAEP,SAAS,EACT,WAAW,EAEX,SAAS,EAEV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,
|
|
1
|
+
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Db.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EAEpB,2BAA2B,EAE5B,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAa,GAAG,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAW,MAAM,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAEL,qBAAqB,EAErB,OAAO,EAEP,SAAS,EACT,WAAW,EAEX,SAAS,EAEV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAS,EAAE,EAAE,QAAQ,EAAU,UAAU,EAAU,MAAM,YAAY,CAAC;AAC7E,OAAO,EAEL,MAAM,EAEP,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAe,YAAY,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EACL,QAAQ,EAGR,QAAQ,EAET,MAAM,YAAY,CAAC;AACpB,OAAO,EAKL,aAAa,EACb,WAAW,EAGX,QAAQ,EAKR,aAAa,EAEb,OAAO,EAER,MAAM,eAAe,CAAC;AACvB,OAAO,EAIL,KAAK,EAEN,MAAM,YAAY,CAAC;AACpB,OAAO,EAGL,iBAAiB,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAuB,MAAM,WAAW,CAAC;AAC/D,OAAO,EAIL,SAAS,EAIT,cAAc,EAMf,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,OAAO;;;EAGlB,CAAC;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAC;AAE1C,eAAO,MAAM,OAAO;;;EAAwC,CAAC;AAC7D,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAC;AAE1C,eAAO,MAAM,QAAQ;;;;;;;;;EAGnB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAC;AAE5C,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;AAE7D,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,UAAU,KAAK,QAAQ,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;CACzC;AAED,MAAM,MAAM,aAAa,GACrB;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;CAC/C,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAClD,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAClD,QAAQ,CAAC,iBAAiB,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;CAClD,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAC;CAChD,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;KAC7B,CAAC;CACH,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;CACnC,CAAC;AAEN,MAAM,MAAM,cAAc,GACtB;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;CAC1B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EACV,WAAW,GACX,iBAAiB,GACjB,cAAc,GACd,aAAa,GACb,2BAA2B,CAAC;CACjC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC9C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CACnD,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;CACrB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B,CAAC;AAEN,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,GACtD,aAAa,GACb,UAAU,GACV,OAAO,GACP,SAAS,GACT,YAAY,GACZ,iBAAiB,GACjB,oBAAoB,CAAC;AAkBvB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;CACrC;AAMD,eAAO,MAAM,yBAAyB,GACpC,cAAc,oBAAoB,KACjC,QA8TF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACrB,MAAM,SAAS,MACf,iBAAwB;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,KAAG,MAAM,CAC7D,QAAQ,EACR,WAAW,CA4DZ,CAAC;AAKJ,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;KAChC,CAAC,CAAC;CACJ;AAGD,eAAO,MAAM,aAAa,GAAI,MAAM,SAAS,KAAG,UAmB/C,CAAC;AAiEF,eAAO,MAAM,cAAc,GACzB,WAAW,MAAM,EACjB,SAAS,aAAa,CAAC,MAAM,CAAC,KAC7B,OAcW,CAAC;AAyPf,eAAO,MAAM,uCAAuC,GACjD,MAAM,SAAS,GAAG,gBAAgB,MAClC,SAAS,aAAa,EAAE,SAAS,WAAW,KAAG,MAAM,CAAC,IAAI,EAAE,WAAW,CA0BvE,CAAC;AAwCJ,eAAO,MAAM,sBAAsB,GAChC,MAAM,SAAS,MAEd,QAAQ,QAAQ,KACf,MAAM,CACP;IACE,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC;CACnC,GAAG,IAAI,EACR,WAAW,CAmDZ,CAAC;AAuDJ,MAAM,WAAW,aAAc,SAAQ,iBAAiB,EAAE,OAAO;CAAG;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;CACjC"}
|
package/dist/src/Evolu/Db.js
CHANGED
|
@@ -7,15 +7,23 @@ import { objectToEntries } from "../Object.js";
|
|
|
7
7
|
import { createRef } from "../Ref.js";
|
|
8
8
|
import { err, ok } from "../Result.js";
|
|
9
9
|
import { createSqlite, explainSqliteQueryPlan, sql, } from "../Sqlite.js";
|
|
10
|
-
import { object, String } from "../Type.js";
|
|
10
|
+
import { array, object, String } from "../Type.js";
|
|
11
11
|
import { createInitializedWorker, } from "../Worker.js";
|
|
12
12
|
import { makePatches } from "./Diff.js";
|
|
13
13
|
import { createAppOwner, createOwnerRow, } from "./Owner.js";
|
|
14
|
-
import { applyProtocolMessageAsClient, binaryIdToId, createProtocolMessageForSync, createProtocolMessageFromCrdtMessages, decryptAndDecodeDbChange, encodeAndEncryptDbChange, idToBinaryId, ownerIdToBinaryOwnerId, protocolVersion, } from "./Protocol.js";
|
|
14
|
+
import { applyProtocolMessageAsClient, Base64Url256, binaryIdToId, createProtocolMessageForSync, createProtocolMessageFromCrdtMessages, decryptAndDecodeDbChange, encodeAndEncryptDbChange, idToBinaryId, ownerIdToBinaryOwnerId, protocolVersion, } from "./Protocol.js";
|
|
15
15
|
import { createQueryRowsCache, deserializeQuery, emptyRows, } from "./Query.js";
|
|
16
16
|
import { createSqliteStorageBase, } from "./Storage.js";
|
|
17
17
|
import { Millis, receiveTimestamp, sendTimestamp, timestampStringToTimestamp, timestampToBinaryTimestamp, timestampToTimestampString, } from "./Timestamp.js";
|
|
18
|
+
export const DbTable = object({
|
|
19
|
+
name: Base64Url256,
|
|
20
|
+
columns: array(Base64Url256),
|
|
21
|
+
});
|
|
18
22
|
export const DbIndex = object({ name: String, sql: String });
|
|
23
|
+
export const DbSchema = object({
|
|
24
|
+
tables: array(DbTable),
|
|
25
|
+
indexes: array(DbIndex),
|
|
26
|
+
});
|
|
19
27
|
export const createDbWorkerForPlatform = (platformDeps) => {
|
|
20
28
|
const tabQueryRowsCacheMap = new Map();
|
|
21
29
|
const getQueryRowsCache = (tabId) => {
|
|
@@ -232,7 +240,6 @@ export const createDbWorkerForPlatform = (platformDeps) => {
|
|
|
232
240
|
onCompleteId: message.onCompleteId,
|
|
233
241
|
reload: message.reload,
|
|
234
242
|
});
|
|
235
|
-
deps.sqlite[Symbol.dispose]();
|
|
236
243
|
break;
|
|
237
244
|
}
|
|
238
245
|
case "ensureDbSchema": {
|
|
@@ -324,24 +331,22 @@ export const getDbSchema = (deps) => ({ allIndexes = false } = {}) => {
|
|
|
324
331
|
return ok({ tables, indexes });
|
|
325
332
|
};
|
|
326
333
|
const indexesAreEqual = (self, that) => self.name === that.name && self.sql === that.sql;
|
|
327
|
-
// TODO: Move
|
|
334
|
+
// TODO: Move to test helpers.
|
|
328
335
|
export const getDbSnapshot = (deps) => {
|
|
329
336
|
const schema = getDbSchema(deps)({ allIndexes: true });
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
const rows = [];
|
|
337
|
+
assert(schema.ok, "bug");
|
|
338
|
+
const tables = [];
|
|
333
339
|
for (const table of schema.value.tables) {
|
|
334
340
|
const result = deps.sqlite.exec(sql `
|
|
335
341
|
select * from ${sql.identifier(table.name)};
|
|
336
342
|
`);
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
rows.push({
|
|
340
|
-
rows: result.value.rows,
|
|
343
|
+
assert(result.ok, "bug");
|
|
344
|
+
tables.push({
|
|
341
345
|
name: table.name,
|
|
346
|
+
rows: result.value.rows,
|
|
342
347
|
});
|
|
343
348
|
}
|
|
344
|
-
return
|
|
349
|
+
return { schema: schema.value, tables };
|
|
345
350
|
};
|
|
346
351
|
const ensureDbSchema = (deps) => (newSchema, currentSchema, options) => {
|
|
347
352
|
const queries = [];
|
|
@@ -434,39 +439,37 @@ const initializeDb = (deps) => (mnemonic) => {
|
|
|
434
439
|
values ('protocolVersion', ${protocolVersion});
|
|
435
440
|
`,
|
|
436
441
|
/**
|
|
437
|
-
* The History table stores all values per timestamp, table,
|
|
438
|
-
* column
|
|
439
|
-
*
|
|
440
|
-
*
|
|
441
|
-
*
|
|
442
|
-
* and DbChange to leverage a covering index. Hence, every value change
|
|
443
|
-
* has its timestamp, table, row, and column. In the future, we will
|
|
444
|
-
* rethink that and store history more efficiently.
|
|
445
|
-
*
|
|
446
|
-
* There is no need to use `OwnerId` on the client, because timestamps
|
|
447
|
-
* (which include a `NodeId`) are globally unique. The relay needs
|
|
448
|
-
* `OwnerId` because it hosts multiple apps/owners, but client storage
|
|
449
|
-
* represents one DB, and even when it hosts multiple owners, their
|
|
450
|
-
* timestamps remain unique.
|
|
442
|
+
* The History table stores all values per ownerId, timestamp, table, id,
|
|
443
|
+
* and column for conflict-free merging using last-write-win CRDT.
|
|
444
|
+
* Denormalizes Timestamp and DbChange for covering index performance.
|
|
445
|
+
* Time travel is available when last-write-win isn't desired. Future
|
|
446
|
+
* optimization will store history more efficiently.
|
|
451
447
|
*/
|
|
452
448
|
sql `
|
|
453
449
|
create table evolu_history (
|
|
454
|
-
"
|
|
450
|
+
"ownerId" blob not null,
|
|
455
451
|
"table" text not null,
|
|
456
|
-
"
|
|
452
|
+
"id" blob not null,
|
|
457
453
|
"column" text not null,
|
|
454
|
+
"timestamp" blob not null,
|
|
458
455
|
"value" any
|
|
459
456
|
)
|
|
460
457
|
strict;
|
|
461
458
|
`,
|
|
459
|
+
// Index for reading database changes by owner and timestamp.
|
|
460
|
+
// Timestamp always corresponds to a DbChange.
|
|
462
461
|
sql `
|
|
463
|
-
create index
|
|
462
|
+
create index evolu_history_ownerId_timestamp on evolu_history (
|
|
463
|
+
"ownerId",
|
|
464
|
+
"timestamp"
|
|
465
|
+
);
|
|
464
466
|
`,
|
|
465
467
|
sql `
|
|
466
|
-
create unique index
|
|
467
|
-
"
|
|
468
|
-
"column",
|
|
468
|
+
create unique index evolu_history_ownerId_table_id_column_timestampDesc on evolu_history (
|
|
469
|
+
"ownerId",
|
|
469
470
|
"table",
|
|
471
|
+
"id",
|
|
472
|
+
"column",
|
|
470
473
|
"timestamp" desc
|
|
471
474
|
);
|
|
472
475
|
`,
|
|
@@ -490,7 +493,14 @@ const initializeDb = (deps) => (mnemonic) => {
|
|
|
490
493
|
const ownerRow = createOwnerRow(deps)(appOwner);
|
|
491
494
|
const result = deps.sqlite.exec(sql `
|
|
492
495
|
insert into evolu_owner
|
|
493
|
-
(
|
|
496
|
+
(
|
|
497
|
+
"mnemonic",
|
|
498
|
+
"id",
|
|
499
|
+
"encryptionKey",
|
|
500
|
+
"createdAt",
|
|
501
|
+
"writeKey",
|
|
502
|
+
"timestamp"
|
|
503
|
+
)
|
|
494
504
|
values
|
|
495
505
|
(
|
|
496
506
|
${ownerRow.mnemonic},
|
|
@@ -523,16 +533,15 @@ const applyChanges = (deps) => (changes, onChange) => {
|
|
|
523
533
|
assertNonEmptyReadonlyArray(messages);
|
|
524
534
|
return ok(messages);
|
|
525
535
|
};
|
|
526
|
-
const applyMessages = (deps) => (messages, lastTimestamp
|
|
536
|
+
const applyMessages = (deps) => (messages, lastTimestamp) => {
|
|
537
|
+
const ownerId = ownerIdToBinaryOwnerId(deps.ownerRowRef.get().id);
|
|
527
538
|
for (const message of messages) {
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
if (!apply2.ok)
|
|
535
|
-
return apply2;
|
|
539
|
+
const result1 = applyMessageToAppTable(deps)(ownerId, message);
|
|
540
|
+
if (!result1.ok)
|
|
541
|
+
return result1;
|
|
542
|
+
const result2 = applyMessageToTimestampAndHistoryTables(deps)(ownerId, message);
|
|
543
|
+
if (!result2.ok)
|
|
544
|
+
return result2;
|
|
536
545
|
}
|
|
537
546
|
const timestamp = timestampToTimestampString(lastTimestamp);
|
|
538
547
|
deps.ownerRowRef.modify((owner) => ({ ...owner, timestamp }));
|
|
@@ -543,44 +552,44 @@ const applyMessages = (deps) => (messages, lastTimestamp, options = {}) => {
|
|
|
543
552
|
return saveTimestamp;
|
|
544
553
|
return ok();
|
|
545
554
|
};
|
|
546
|
-
const applyMessageToAppTable = (deps) => (message) => {
|
|
555
|
+
const applyMessageToAppTable = (deps) => (ownerId, message) => {
|
|
547
556
|
const date = new Date(message.timestamp.millis).toISOString();
|
|
548
557
|
const timestamp = timestampToBinaryTimestamp(message.timestamp);
|
|
549
558
|
for (const [column, value] of objectToEntries(message.change.values)) {
|
|
550
559
|
const result = deps.sqlite.exec(sql.prepared `
|
|
551
560
|
with
|
|
552
561
|
lastTimestamp as (
|
|
553
|
-
select timestamp
|
|
562
|
+
select "timestamp"
|
|
554
563
|
from evolu_history
|
|
555
564
|
where
|
|
556
|
-
"
|
|
557
|
-
and "column" = ${column}
|
|
565
|
+
"ownerId" = ${ownerId}
|
|
558
566
|
and "table" = ${message.change.table}
|
|
559
|
-
|
|
567
|
+
and "id" = ${message.change.id}
|
|
568
|
+
and "column" = ${column}
|
|
569
|
+
order by "timestamp" desc
|
|
560
570
|
limit 1
|
|
561
571
|
)
|
|
562
572
|
insert into ${sql.identifier(message.change.table)}
|
|
563
573
|
("id", ${sql.identifier(column)}, createdAt, updatedAt)
|
|
564
574
|
select ${message.change.id}, ${value}, ${date}, ${date}
|
|
565
575
|
where
|
|
566
|
-
(select timestamp from lastTimestamp) is null
|
|
567
|
-
or (select timestamp from lastTimestamp) < ${timestamp}
|
|
576
|
+
(select "timestamp" from lastTimestamp) is null
|
|
577
|
+
or (select "timestamp" from lastTimestamp) < ${timestamp}
|
|
568
578
|
on conflict ("id") do update
|
|
569
579
|
set
|
|
570
580
|
${sql.identifier(column)} = ${value},
|
|
571
581
|
updatedAt = ${date}
|
|
572
582
|
where
|
|
573
|
-
(select timestamp from lastTimestamp) is null
|
|
574
|
-
or (select timestamp from lastTimestamp) < ${timestamp};
|
|
583
|
+
(select "timestamp" from lastTimestamp) is null
|
|
584
|
+
or (select "timestamp" from lastTimestamp) < ${timestamp};
|
|
575
585
|
`);
|
|
576
586
|
if (!result.ok)
|
|
577
587
|
return result;
|
|
578
588
|
}
|
|
579
589
|
return ok();
|
|
580
590
|
};
|
|
581
|
-
export const applyMessageToTimestampAndHistoryTables = (deps) => (message) => {
|
|
591
|
+
export const applyMessageToTimestampAndHistoryTables = (deps) => (ownerId, message) => {
|
|
582
592
|
const timestamp = timestampToBinaryTimestamp(message.timestamp);
|
|
583
|
-
const ownerId = ownerIdToBinaryOwnerId(deps.ownerRowRef.get().id);
|
|
584
593
|
const id = idToBinaryId(message.change.id);
|
|
585
594
|
const result = deps.storage.insertTimestamp(ownerId, timestamp);
|
|
586
595
|
if (!result.ok)
|
|
@@ -588,9 +597,16 @@ export const applyMessageToTimestampAndHistoryTables = (deps) => (message) => {
|
|
|
588
597
|
for (const [column, value] of Object.entries(message.change.values)) {
|
|
589
598
|
const result = deps.sqlite.exec(sql.prepared `
|
|
590
599
|
insert into evolu_history
|
|
591
|
-
("
|
|
600
|
+
("ownerId", "table", "id", "column", "value", "timestamp")
|
|
592
601
|
values
|
|
593
|
-
(
|
|
602
|
+
(
|
|
603
|
+
${ownerId},
|
|
604
|
+
${message.change.table},
|
|
605
|
+
${id},
|
|
606
|
+
${column},
|
|
607
|
+
${value},
|
|
608
|
+
${timestamp}
|
|
609
|
+
)
|
|
594
610
|
on conflict do nothing;
|
|
595
611
|
`);
|
|
596
612
|
if (!result.ok)
|
|
@@ -631,7 +647,7 @@ export const maybeMigrateToVersion0 = (deps) => (schema) => {
|
|
|
631
647
|
if (!mnemonicAndLastTimestamp.ok)
|
|
632
648
|
return mnemonicAndLastTimestamp;
|
|
633
649
|
const messagesRows = deps.sqlite.exec(sql `
|
|
634
|
-
select "timestamp", "table", "
|
|
650
|
+
select "timestamp", "table", "id", "column", "value" from evolu_message;
|
|
635
651
|
`);
|
|
636
652
|
if (!messagesRows.ok)
|
|
637
653
|
return messagesRows;
|
|
@@ -646,7 +662,7 @@ export const maybeMigrateToVersion0 = (deps) => (schema) => {
|
|
|
646
662
|
const messages = messagesRows.value.rows.map((message) => ({
|
|
647
663
|
timestamp: timestampStringToTimestamp(message.timestamp),
|
|
648
664
|
change: {
|
|
649
|
-
id: message.
|
|
665
|
+
id: message.id,
|
|
650
666
|
table: message.table,
|
|
651
667
|
values: { [message.column]: message.value },
|
|
652
668
|
},
|
|
@@ -742,11 +758,11 @@ const createClientStorage = (deps) => (options) => {
|
|
|
742
758
|
deps.postMessage({ type: "onReceive" });
|
|
743
759
|
return true;
|
|
744
760
|
},
|
|
745
|
-
readDbChange: (
|
|
761
|
+
readDbChange: (ownerId, timestamp) => {
|
|
746
762
|
const result = deps.sqlite.exec(sql `
|
|
747
|
-
select "table", "
|
|
763
|
+
select "table", "id", "column", "value"
|
|
748
764
|
from evolu_history
|
|
749
|
-
where "timestamp" = ${timestamp};
|
|
765
|
+
where "ownerId" = ${ownerId} and "timestamp" = ${timestamp};
|
|
750
766
|
`);
|
|
751
767
|
if (!result.ok) {
|
|
752
768
|
deps.postMessage({ type: "onError", error: result.error });
|
|
@@ -754,16 +770,16 @@ const createClientStorage = (deps) => (options) => {
|
|
|
754
770
|
}
|
|
755
771
|
const { rows } = result.value;
|
|
756
772
|
assert(rows.length > 0, "Rows must not be empty");
|
|
757
|
-
const { table,
|
|
773
|
+
const { table, id } = rows[0];
|
|
758
774
|
const values = {};
|
|
759
775
|
for (const r of rows) {
|
|
760
776
|
assert(r.table === table, "All rows must have the same table");
|
|
761
|
-
assert(eqArrayNumber(r.
|
|
777
|
+
assert(eqArrayNumber(r.id, id), "All rows must have the same Id");
|
|
762
778
|
values[r.column] = r.value;
|
|
763
779
|
}
|
|
764
780
|
const change = {
|
|
765
781
|
table: rows[0].table,
|
|
766
|
-
id: binaryIdToId(rows[0].
|
|
782
|
+
id: binaryIdToId(rows[0].id),
|
|
767
783
|
values,
|
|
768
784
|
};
|
|
769
785
|
const { encryptionKey } = deps.ownerRowRef.get();
|
|
@@ -12,7 +12,7 @@ import { AppOwner } from "./Owner.js";
|
|
|
12
12
|
import { CreateAppStateDep, FlushSyncDep } from "./Platform.js";
|
|
13
13
|
import { ProtocolError, ProtocolUnsupportedVersionError } from "./Protocol.js";
|
|
14
14
|
import { Queries, QueriesToQueryRowsPromises, Query, QueryRows, Row } from "./Query.js";
|
|
15
|
-
import { CreateQuery, EvoluSchema, Mutation } from "./Schema.js";
|
|
15
|
+
import { CreateQuery, EvoluSchema, Mutation, ValidateSchema } from "./Schema.js";
|
|
16
16
|
import { SyncState } from "./Sync.js";
|
|
17
17
|
import { TimestampError } from "./Timestamp.js";
|
|
18
18
|
export interface Evolu<S extends EvoluSchema = EvoluSchema> {
|
|
@@ -329,6 +329,6 @@ export interface EvoluForInitialData<S extends EvoluSchema = EvoluSchema> {
|
|
|
329
329
|
* const evolu = createEvolu(evoluReactDeps)(Schema);
|
|
330
330
|
* ```
|
|
331
331
|
*/
|
|
332
|
-
export declare const createEvolu: (deps: EvoluDeps) => <S extends EvoluSchema>(schema: S
|
|
332
|
+
export declare const createEvolu: (deps: EvoluDeps) => <S extends EvoluSchema>(schema: ValidateSchema<S> extends never ? S : ValidateSchema<S>, partialConfig?: Partial<EvoluConfigWithInitialData<S>>) => Evolu<S>;
|
|
333
333
|
export declare const createNamespaceName: (config: Config) => (name: string) => string;
|
|
334
334
|
//# sourceMappingURL=Evolu.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Evolu.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAA0B,WAAW,EAAe,MAAM,cAAc,CAAC;AAChF,OAAO,EAAe,cAAc,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAML,QAAQ,EAET,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAEL,aAAa,EACb,+BAA+B,EAChC,MAAM,eAAe,CAAC;AACvB,OAAO,EAGL,OAAO,EACP,0BAA0B,EAC1B,KAAK,EACL,SAAS,EAET,GAAG,EAGJ,MAAM,YAAY,CAAC;AACpB,OAAO,
|
|
1
|
+
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Evolu.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Evolu/Evolu.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isNonEmptyArray, isNonEmptyReadonlyArray } from "../Array.js";
|
|
2
|
-
import { assertNonEmptyArray } from "../Assert.js";
|
|
2
|
+
import { assert, assertNonEmptyArray } from "../Assert.js";
|
|
3
3
|
import { createCallbacks } from "../Callbacks.js";
|
|
4
4
|
import { exhaustiveCheck } from "../Function.js";
|
|
5
5
|
import { err, ok } from "../Result.js";
|
|
@@ -9,8 +9,9 @@ import { createId, } from "../Type.js";
|
|
|
9
9
|
import { defaultConfig } from "./Config.js";
|
|
10
10
|
import { applyPatches } from "./Diff.js";
|
|
11
11
|
import { kysely } from "./Kysely.js";
|
|
12
|
+
import { DbChange, } from "./Protocol.js";
|
|
12
13
|
import { createSubscribedQueries, emptyRows, serializeQuery, } from "./Query.js";
|
|
13
|
-
import {
|
|
14
|
+
import { evoluSchemaToDbSchema, insertable, updateable, upsertable, } from "./Schema.js";
|
|
14
15
|
import { initialSyncState } from "./Sync.js";
|
|
15
16
|
// For hot reloading and Evolu multitenancy.
|
|
16
17
|
const evoluInstances = new Map();
|
|
@@ -62,10 +63,7 @@ let tabId = null;
|
|
|
62
63
|
* const evolu = createEvolu(evoluReactDeps)(Schema);
|
|
63
64
|
* ```
|
|
64
65
|
*/
|
|
65
|
-
export const createEvolu = (deps) => (
|
|
66
|
-
// TODO: Validate missing Id, unsupported types, used default types via TS types
|
|
67
|
-
// with type errors messages as we had it in the old Evolu.
|
|
68
|
-
schema, partialConfig = {}) => {
|
|
66
|
+
export const createEvolu = (deps) => (schema, partialConfig = {}) => {
|
|
69
67
|
const config = { ...defaultConfig, ...partialConfig };
|
|
70
68
|
let evolu = evoluInstances.get(config.name);
|
|
71
69
|
if (evolu == null) {
|
|
@@ -159,7 +157,7 @@ const createEvoluInstance = (deps) => (schema, evoluConfig) => {
|
|
|
159
157
|
exhaustiveCheck(message);
|
|
160
158
|
}
|
|
161
159
|
});
|
|
162
|
-
const dbSchema =
|
|
160
|
+
const dbSchema = evoluSchemaToDbSchema(schema, indexes);
|
|
163
161
|
const mutationTypesCache = new Map();
|
|
164
162
|
// Lazy create mutation Types like this: `insertable(Schema.todo)`
|
|
165
163
|
const getMutationType = (table, kind) => {
|
|
@@ -185,18 +183,15 @@ const createEvoluInstance = (deps) => (schema, evoluConfig) => {
|
|
|
185
183
|
if (initialData)
|
|
186
184
|
initialData({
|
|
187
185
|
insert: (table, props) => {
|
|
188
|
-
const Type = getMutationType(table, "insert");
|
|
189
186
|
const id = createId(deps);
|
|
190
|
-
const
|
|
191
|
-
if (
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
values: result.value,
|
|
196
|
-
});
|
|
187
|
+
const values = getMutationType(table, "insert").fromUnknown(props);
|
|
188
|
+
if (values.ok) {
|
|
189
|
+
const dbChange = { table, id, values: values.value };
|
|
190
|
+
assertValidDbChange(dbChange);
|
|
191
|
+
initialDataDbChanges.push(dbChange);
|
|
197
192
|
return ok({ id });
|
|
198
193
|
}
|
|
199
|
-
return
|
|
194
|
+
return values;
|
|
200
195
|
},
|
|
201
196
|
});
|
|
202
197
|
dbWorker.postMessage({
|
|
@@ -222,9 +217,9 @@ const createEvoluInstance = (deps) => (schema, evoluConfig) => {
|
|
|
222
217
|
else {
|
|
223
218
|
// Remove `id` from values.
|
|
224
219
|
const { id: _id, ...values } = result.value;
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
mutateMicrotaskQueue.push([
|
|
220
|
+
const dbChange = { table, id, values };
|
|
221
|
+
assertValidDbChange(dbChange);
|
|
222
|
+
mutateMicrotaskQueue.push([dbChange, options?.onComplete]);
|
|
228
223
|
}
|
|
229
224
|
if (mutateMicrotaskQueue.length === 1)
|
|
230
225
|
queueMicrotask(() => {
|
|
@@ -350,11 +345,8 @@ const createEvoluInstance = (deps) => (schema, evoluConfig) => {
|
|
|
350
345
|
},
|
|
351
346
|
ensureSchema: (schema) => {
|
|
352
347
|
mutationTypesCache.clear();
|
|
353
|
-
const
|
|
354
|
-
dbWorker.postMessage({
|
|
355
|
-
type: "ensureDbSchema",
|
|
356
|
-
dbSchema: validEvoluSchemaToDbSchema(validSchema),
|
|
357
|
-
});
|
|
348
|
+
const dbSchema = evoluSchemaToDbSchema(schema);
|
|
349
|
+
dbWorker.postMessage({ type: "ensureDbSchema", dbSchema });
|
|
358
350
|
},
|
|
359
351
|
exportDatabase: () => {
|
|
360
352
|
const { promise, resolve } = Promise.withResolvers();
|
|
@@ -432,3 +424,6 @@ const createLoadingPromises = (subscribedQueries) => {
|
|
|
432
424
|
};
|
|
433
425
|
return loadingPromises;
|
|
434
426
|
};
|
|
427
|
+
const assertValidDbChange = (dbChange) => {
|
|
428
|
+
assert(DbChange.is(dbChange), `Failed to create DbChange for table "${dbChange.table}". If you see this message, you either disabled EvoluSchema validation or Evolu has a bug - please report it.`);
|
|
429
|
+
};
|
|
@@ -123,7 +123,6 @@
|
|
|
123
123
|
import { NonEmptyReadonlyArray } from "../Array.js";
|
|
124
124
|
import { Buffer } from "../Buffer.js";
|
|
125
125
|
import { CreateRandomBytesDep, EncryptionKey, SymmetricCryptoDecryptError, SymmetricCryptoDep } from "../Crypto.js";
|
|
126
|
-
import { ReadonlyRecord } from "../Object.js";
|
|
127
126
|
import { Result } from "../Result.js";
|
|
128
127
|
import { SqliteValue } from "../Sqlite.js";
|
|
129
128
|
import { Id, NanoId, NonNegativeInt, PositiveInt } from "../Type.js";
|
|
@@ -199,15 +198,22 @@ export interface CrdtMessage {
|
|
|
199
198
|
readonly timestamp: Timestamp;
|
|
200
199
|
readonly change: DbChange;
|
|
201
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* Base64Url string with maximum length of 256 characters. Encoding strings as
|
|
203
|
+
* Base64UrlString saves up to 25% in size compared to regular strings.
|
|
204
|
+
*/
|
|
205
|
+
export declare const Base64Url256: import("../Type.js").BrandType<import("../Type.js").Type<"Brand", string & Brand<"Base64Url">, string, import("../Type.js").RegexError<"Base64Url">, string, import("../Type.js").StringError>, "MaxLength256", import("../Type.js").MaxLengthError<256>, import("../Type.js").StringError | import("../Type.js").RegexError<"Base64Url">>;
|
|
206
|
+
export type Base64Url256 = typeof Base64Url256.Type;
|
|
202
207
|
/**
|
|
203
208
|
* A DbChange is a change to a table row. Together with a unique
|
|
204
209
|
* {@link Timestamp}, it forms a {@link CrdtMessage}.
|
|
205
210
|
*/
|
|
206
|
-
export
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
+
export declare const DbChange: import("../Type.js").ObjectType<{
|
|
212
|
+
table: import("../Type.js").BrandType<import("../Type.js").Type<"Brand", string & Brand<"Base64Url">, string, import("../Type.js").RegexError<"Base64Url">, string, import("../Type.js").StringError>, "MaxLength256", import("../Type.js").MaxLengthError<256>, import("../Type.js").StringError | import("../Type.js").RegexError<"Base64Url">>;
|
|
213
|
+
id: import("../Type.js").BrandType<import("../Type.js").Type<"String", string, string, import("../Type.js").StringError, string, import("../Type.js").StringError>, "Id", import("../Type.js").RegexError<"Id">, import("../Type.js").StringError>;
|
|
214
|
+
values: import("../Type.js").RecordType<"Brand", string & Brand<"Base64Url"> & Brand<"MaxLength256">, string, import("../Type.js").MaxLengthError<256>, string & Brand<"Base64Url">, import("../Type.js").StringError | import("../Type.js").RegexError<"Base64Url">, import("../Type.js").UnionType<[import("../Type.js").Type<"Null", null, null, import("../Type.js").NullError, null, import("../Type.js").NullError>, import("../Type.js").Type<"String", string, string, import("../Type.js").StringError, string, import("../Type.js").StringError>, import("../Type.js").Type<"Number", number, number, import("../Type.js").NumberError, number, import("../Type.js").NumberError>, import("../Type.js").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("../Type.js").Uint8ArrayError, Uint8Array<ArrayBufferLike>, import("../Type.js").Uint8ArrayError>]>>;
|
|
215
|
+
}>;
|
|
216
|
+
export type DbChange = typeof DbChange.Type;
|
|
211
217
|
export declare const RangeType: {
|
|
212
218
|
readonly Fingerprint: 1;
|
|
213
219
|
readonly Skip: 0;
|
|
@@ -356,12 +362,6 @@ export declare const binaryIdToId: (binaryId: BinaryId) => Id;
|
|
|
356
362
|
export type BinaryOwnerId = Uint8Array & Brand<"BinaryOwnerId">;
|
|
357
363
|
export declare const ownerIdToBinaryOwnerId: (ownerId: OwnerId) => BinaryOwnerId;
|
|
358
364
|
export declare const binaryOwnerIdToOwnerId: (binaryOwnerId: BinaryOwnerId) => OwnerId;
|
|
359
|
-
/**
|
|
360
|
-
* Base64Url string with maximum length of 256 characters. Encoding strings as
|
|
361
|
-
* Base64UrlString saves up to 25% in size compared to regular strings.
|
|
362
|
-
*/
|
|
363
|
-
export declare const Base64Url256: import("../Type.js").BrandType<import("../Type.js").Type<"Brand", string & Brand<"Base64Url">, string, import("../Type.js").RegexError<"Base64Url">, string, import("../Type.js").StringError>, "MaxLength256", import("../Type.js").MaxLengthError<256>, import("../Type.js").StringError | import("../Type.js").RegexError<"Base64Url">>;
|
|
364
|
-
export type Base64Url256 = typeof Base64Url256.Type;
|
|
365
365
|
/**
|
|
366
366
|
* Union type for all variants of Base64Url strings with limited length. All
|
|
367
367
|
* these types use Base64Url alphabet and are < 256 characters.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyHG;AAIH,OAAO,EAA2B,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE7E,OAAO,EACL,MAAM,EAQP,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,oBAAoB,EACpB,aAAa,EAEb,2BAA2B,EAC3B,kBAAkB,EACnB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Protocol.ts"],"names":[],"mappings":"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"}
|