@evolu/common 8.11.0 → 8.12.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/Bytes.d.ts +39 -2
- package/dist/src/Bytes.d.ts.map +1 -1
- package/dist/src/Bytes.js +50 -2
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/local-first/Evolu.d.ts +77 -3
- package/dist/src/local-first/Evolu.d.ts.map +1 -1
- package/dist/src/local-first/Evolu.js +79 -3
- package/dist/src/local-first/Protocol.d.ts +12 -3
- package/dist/src/local-first/Protocol.d.ts.map +1 -1
- package/dist/src/local-first/Protocol.js +44 -22
- package/dist/src/local-first/Relay.d.ts.map +1 -1
- package/dist/src/local-first/Relay.js +4 -2
- package/dist/src/local-first/Schema.d.ts +11 -2
- package/dist/src/local-first/Schema.d.ts.map +1 -1
- package/dist/src/local-first/Storage.d.ts +3 -3
- package/dist/src/local-first/Storage.d.ts.map +1 -1
- package/dist/src/local-first/Storage.js +4 -2
- package/package.json +1 -1
- package/src/Bytes.test.ts +27 -0
- package/src/Bytes.ts +58 -2
- package/src/index.ts +6 -1
- package/src/local-first/Evolu.test.ts +308 -1
- package/src/local-first/Evolu.ts +176 -5
- package/src/local-first/Protocol.test.ts +17 -0
- package/src/local-first/Protocol.ts +60 -38
- package/src/local-first/Relay.ts +4 -2
- package/src/local-first/Schema.ts +13 -2
- package/src/local-first/Storage.ts +6 -4
package/dist/src/Bytes.d.ts
CHANGED
|
@@ -19,10 +19,47 @@
|
|
|
19
19
|
*
|
|
20
20
|
* @module
|
|
21
21
|
*/
|
|
22
|
-
import { bytesToUtf8, utf8ToBytes } from "@noble/ciphers/utils.js";
|
|
22
|
+
import { bytesToUtf8, concatBytes as nobleConcatBytes, utf8ToBytes } from "@noble/ciphers/utils.js";
|
|
23
23
|
import { Digit, Digit1To9, type FiniteNumber, type JsonValue, NonNegativeInt, type PositiveInt, type TemplateLiteralType, type LiteralType, type UnionType, type Type, type TypeError, type UnionError } from "./Type.ts";
|
|
24
|
-
export { bytesToHex,
|
|
24
|
+
export { bytesToHex, hexToBytes } from "@noble/ciphers/utils.js";
|
|
25
25
|
export { bytesToUtf8, utf8ToBytes };
|
|
26
|
+
/**
|
|
27
|
+
* Copies several Uint8Arrays into one.
|
|
28
|
+
*
|
|
29
|
+
* Each array is a separate argument, so it is meant for a few arrays. Spreading
|
|
30
|
+
* many arrays into it overflows the call stack; use {@link concatByteArrays}
|
|
31
|
+
* when their count is not bounded.
|
|
32
|
+
*
|
|
33
|
+
* ### Example
|
|
34
|
+
*
|
|
35
|
+
* ```ts
|
|
36
|
+
* import { assertEqual, concatBytes } from "@evolu/common";
|
|
37
|
+
*
|
|
38
|
+
* assertEqual(
|
|
39
|
+
* concatBytes(new Uint8Array([1]), new Uint8Array([2, 3])),
|
|
40
|
+
* new Uint8Array([1, 2, 3]),
|
|
41
|
+
* );
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare const concatBytes: typeof nobleConcatBytes;
|
|
45
|
+
/**
|
|
46
|
+
* Copies an array of Uint8Arrays into one.
|
|
47
|
+
*
|
|
48
|
+
* Unlike {@link concatBytes}, it takes the arrays as one array, so it works for
|
|
49
|
+
* any number of them, such as the timestamps of a batch received from a peer.
|
|
50
|
+
*
|
|
51
|
+
* ### Example
|
|
52
|
+
*
|
|
53
|
+
* ```ts
|
|
54
|
+
* import { assertEqual, concatByteArrays } from "@evolu/common";
|
|
55
|
+
*
|
|
56
|
+
* assertEqual(
|
|
57
|
+
* concatByteArrays([new Uint8Array([1]), new Uint8Array([2, 3])]),
|
|
58
|
+
* new Uint8Array([1, 2, 3]),
|
|
59
|
+
* );
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export declare const concatByteArrays: (arrays: ReadonlyArray<Uint8Array>) => Uint8Array;
|
|
26
63
|
/**
|
|
27
64
|
* Custom error for {@link Buffer}-related failures like premature end of data.
|
|
28
65
|
* Provides better stack traces for debugging binary protocol issues.
|
package/dist/src/Bytes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bytes.d.ts","sourceRoot":"","sources":["../../src/Bytes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"Bytes.d.ts","sourceRoot":"","sources":["../../src/Bytes.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Bytes.js
CHANGED
|
@@ -19,13 +19,61 @@
|
|
|
19
19
|
*
|
|
20
20
|
* @module
|
|
21
21
|
*/
|
|
22
|
-
import { bytesToUtf8, utf8ToBytes } from "@noble/ciphers/utils.js";
|
|
22
|
+
import { bytesToUtf8, concatBytes as nobleConcatBytes, utf8ToBytes, } from "@noble/ciphers/utils.js";
|
|
23
23
|
import { assert } from "./Assert.js";
|
|
24
24
|
import { err, ok } from "./Result.js";
|
|
25
25
|
import { safelyStringifyUnknownValue } from "./String.js";
|
|
26
26
|
import { brand, createTypeWithError, Digit, Digit1To9, NonNegativeInt, String, templateLiteral, transform, union, } from "./Type.js";
|
|
27
|
-
export { bytesToHex,
|
|
27
|
+
export { bytesToHex, hexToBytes } from "@noble/ciphers/utils.js";
|
|
28
28
|
export { bytesToUtf8, utf8ToBytes };
|
|
29
|
+
/**
|
|
30
|
+
* Copies several Uint8Arrays into one.
|
|
31
|
+
*
|
|
32
|
+
* Each array is a separate argument, so it is meant for a few arrays. Spreading
|
|
33
|
+
* many arrays into it overflows the call stack; use {@link concatByteArrays}
|
|
34
|
+
* when their count is not bounded.
|
|
35
|
+
*
|
|
36
|
+
* ### Example
|
|
37
|
+
*
|
|
38
|
+
* ```ts
|
|
39
|
+
* import { assertEqual, concatBytes } from "@evolu/common";
|
|
40
|
+
*
|
|
41
|
+
* assertEqual(
|
|
42
|
+
* concatBytes(new Uint8Array([1]), new Uint8Array([2, 3])),
|
|
43
|
+
* new Uint8Array([1, 2, 3]),
|
|
44
|
+
* );
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export const concatBytes = nobleConcatBytes;
|
|
48
|
+
/**
|
|
49
|
+
* Copies an array of Uint8Arrays into one.
|
|
50
|
+
*
|
|
51
|
+
* Unlike {@link concatBytes}, it takes the arrays as one array, so it works for
|
|
52
|
+
* any number of them, such as the timestamps of a batch received from a peer.
|
|
53
|
+
*
|
|
54
|
+
* ### Example
|
|
55
|
+
*
|
|
56
|
+
* ```ts
|
|
57
|
+
* import { assertEqual, concatByteArrays } from "@evolu/common";
|
|
58
|
+
*
|
|
59
|
+
* assertEqual(
|
|
60
|
+
* concatByteArrays([new Uint8Array([1]), new Uint8Array([2, 3])]),
|
|
61
|
+
* new Uint8Array([1, 2, 3]),
|
|
62
|
+
* );
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export const concatByteArrays = (arrays) => {
|
|
66
|
+
let length = 0;
|
|
67
|
+
for (const array of arrays)
|
|
68
|
+
length += array.length;
|
|
69
|
+
const result = new Uint8Array(length);
|
|
70
|
+
let offset = 0;
|
|
71
|
+
for (const array of arrays) {
|
|
72
|
+
result.set(array, offset);
|
|
73
|
+
offset += array.length;
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
};
|
|
29
77
|
/**
|
|
30
78
|
* Custom error for {@link Buffer}-related failures like premature end of data.
|
|
31
79
|
* Provides better stack traces for debugging binary protocol issues.
|
package/dist/src/index.d.ts
CHANGED
|
@@ -49,7 +49,7 @@ export * from "./Types.ts";
|
|
|
49
49
|
export * from "./WebSocket.ts";
|
|
50
50
|
export * from "./Worker.ts";
|
|
51
51
|
export type { UnsupportedDbVersionError } from "./local-first/Db.ts";
|
|
52
|
-
export { AppName, createEvolu, testAppName } from "./local-first/Evolu.ts";
|
|
52
|
+
export { AppName, createEvolu, maxMutationSize, testAppName, } from "./local-first/Evolu.ts";
|
|
53
53
|
export type { AppNameError, Evolu, EvoluConfig, EvoluDeps, EvoluError, UnuseOwner, } from "./local-first/Evolu.ts";
|
|
54
54
|
export * from "./local-first/Owner.ts";
|
|
55
55
|
export type { SyncOwner } from "./local-first/Owner.ts";
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAG5B,YAAY,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAG5B,YAAY,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EACL,OAAO,EACP,WAAW,EACX,eAAe,EACf,WAAW,GACZ,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,YAAY,EACZ,KAAK,EACL,WAAW,EACX,SAAS,EACT,UAAU,EACV,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,SAAS,EACT,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,GAAG,GACT,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,aAAa,EACb,aAAa,EACb,UAAU,EACV,UAAU,GACX,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,cAAc,EACd,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,YAAY,EACZ,YAAY,GACb,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAIV,SAAS,GACV,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,SAAS,EACT,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,4BAA4B,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -47,7 +47,7 @@ export * from "./Type.js";
|
|
|
47
47
|
export * from "./Types.js";
|
|
48
48
|
export * from "./WebSocket.js";
|
|
49
49
|
export * from "./Worker.js";
|
|
50
|
-
export { AppName, createEvolu, testAppName } from "./local-first/Evolu.js";
|
|
50
|
+
export { AppName, createEvolu, maxMutationSize, testAppName, } from "./local-first/Evolu.js";
|
|
51
51
|
export * from "./local-first/Owner.js";
|
|
52
52
|
export { evoluJsonArrayFrom, evoluJsonBuildObject, evoluJsonObjectFrom, getJsonObjectArgs, kyselySql, } from "./local-first/Query.js";
|
|
53
53
|
export { createQueryBuilder, QuarantineOrigin, QuarantineReason, testEvoluSchema, testLocalOnlyEvoluSchema, TestProjectId, testProjectId, TestTodoId, testTodoId, } from "./local-first/Schema.js";
|
|
@@ -11,13 +11,13 @@ import { type LockManagerDep } from "../LockManager.ts";
|
|
|
11
11
|
import type { FlushSyncDep, ReloadAppDep } from "../Platform.ts";
|
|
12
12
|
import type { Listener, ReadonlyStore, Unsubscribe } from "../Store.ts";
|
|
13
13
|
import type { Task } from "../Task.ts";
|
|
14
|
-
import { Name, type TypeError, UrlSafeString } from "../Type.ts";
|
|
14
|
+
import { Name, PositiveInt, type TypeError, UrlSafeString } from "../Type.ts";
|
|
15
15
|
import type { CreateBroadcastChannelDep, CreateMessageChannelDep } from "../Worker.ts";
|
|
16
16
|
import type { CreateDbWorkerDep, UnsupportedDbVersionError } from "./Db.ts";
|
|
17
17
|
import type { AppOwner, Owner, OwnerId, OwnerTransport, ReadonlyOwner } from "./Owner.ts";
|
|
18
|
-
import type
|
|
18
|
+
import { type ProtocolError } from "./Protocol.ts";
|
|
19
19
|
import type { Queries, QueriesToQueryRowsPromises, Query, QueryRows, Row } from "./Query.ts";
|
|
20
|
-
import type { EvoluSchema, IndexesConfig, Mutation, ValidateSchema } from "./Schema.ts";
|
|
20
|
+
import type { EvoluSchema, IndexesConfig, Mutation, MutationValues, ValidateSchema } from "./Schema.ts";
|
|
21
21
|
import type { OtherBuildRunningError, SharedWorkerDep, SyncState } from "./Shared.ts";
|
|
22
22
|
import { type StorageQuotaError } from "./Storage.ts";
|
|
23
23
|
/**
|
|
@@ -394,6 +394,37 @@ export interface Evolu<S extends EvoluSchema = EvoluSchema> extends AsyncDisposa
|
|
|
394
394
|
* @see {@link Mutation}
|
|
395
395
|
*/
|
|
396
396
|
readonly upsert: Mutation<S, "upsert">;
|
|
397
|
+
/**
|
|
398
|
+
* Returns the size of a mutation of `table` with `values`, measured as
|
|
399
|
+
* {@link maxMutationSize} describes.
|
|
400
|
+
*
|
|
401
|
+
* Use it to check values that column Types do not bound before mutating, or
|
|
402
|
+
* to show how much of the limit a mutation uses. It accepts any of the
|
|
403
|
+
* table's columns, so the values of an insert, update, or upsert fit, and it
|
|
404
|
+
* ignores `id` and `isDeleted`, which are not columns. Mutations of
|
|
405
|
+
* local-only tables are measured too, although they are exempt from the
|
|
406
|
+
* limit.
|
|
407
|
+
*
|
|
408
|
+
* ### Example
|
|
409
|
+
*
|
|
410
|
+
* ```ts
|
|
411
|
+
* import {
|
|
412
|
+
* assertType,
|
|
413
|
+
* type Evolu,
|
|
414
|
+
* maxMutationSize,
|
|
415
|
+
* type NonEmptyTrimmedString100,
|
|
416
|
+
* type TestEvoluSchema,
|
|
417
|
+
* } from "@evolu/common";
|
|
418
|
+
*
|
|
419
|
+
* const fitsTodo = (
|
|
420
|
+
* evolu: Evolu<TestEvoluSchema>,
|
|
421
|
+
* title: NonEmptyTrimmedString100,
|
|
422
|
+
* ) => evolu.getMutationSize("todo", { title }) <= maxMutationSize;
|
|
423
|
+
*
|
|
424
|
+
* assertType<ReturnType<typeof fitsTodo>, boolean>();
|
|
425
|
+
* ```
|
|
426
|
+
*/
|
|
427
|
+
readonly getMutationSize: <TableName extends keyof S>(table: TableName, values: Partial<MutationValues<S[TableName], "update">>) => PositiveInt;
|
|
397
428
|
/**
|
|
398
429
|
* Load {@link Query} and return a promise with {@link QueryRows}.
|
|
399
430
|
*
|
|
@@ -689,9 +720,52 @@ export type UnuseOwner = () => void;
|
|
|
689
720
|
/**
|
|
690
721
|
* Represents errors that can occur in {@link Evolu}.
|
|
691
722
|
*
|
|
723
|
+
* Apps show them from {@link EvoluErrorDep.evoluError}.
|
|
724
|
+
*
|
|
725
|
+
* An error that leaves the app unusable deserves a modal dialog, which moves
|
|
726
|
+
* focus into itself and restores it when closed. Any other error is a status
|
|
727
|
+
* message: show it in a region with `role="alert"`, which screen readers
|
|
728
|
+
* announce without moving focus, so the user keeps working and a background tab
|
|
729
|
+
* shows it when the user returns. Avoid `alert()`, which blocks the page, once
|
|
730
|
+
* in every open tab.
|
|
731
|
+
*
|
|
732
|
+
* - {@link UnsupportedDbVersionError} blocks the app: the local data needs a newer
|
|
733
|
+
* version of it. Ask the user to update the app or close all its tabs.
|
|
734
|
+
* - {@link OtherBuildRunningError} blocks the app while it lasts: another version
|
|
735
|
+
* of the app holds the local data. Ask the user to close the app's other
|
|
736
|
+
* tabs. It clears when the wait ends.
|
|
737
|
+
* - {@link ProtocolError} does not block the app: sync with a relay failed for an
|
|
738
|
+
* owner, because the relay rejected or failed a request, or sent data that
|
|
739
|
+
* could not be decoded or verified; sync state shows the affected routes. A
|
|
740
|
+
* {@link ProtocolQuotaError} needs more relay quota, then
|
|
741
|
+
* {@link Evolu.requestSync}; a {@link ProtocolVersionError} needs an app or
|
|
742
|
+
* relay update.
|
|
743
|
+
* - {@link StorageQuotaError} does not block the app: a storage or billing quota
|
|
744
|
+
* was exceeded, so a batch of an owner's changes was not stored. The built-in
|
|
745
|
+
* client storage does not report it yet; a relay's quota arrives as
|
|
746
|
+
* {@link ProtocolQuotaError}.
|
|
747
|
+
* - {@link DecryptWithXChaCha20Poly1305Error} does not block the app: changes
|
|
748
|
+
* received for an owner could not be decrypted, so none of their batch was
|
|
749
|
+
* stored.
|
|
750
|
+
* - {@link UnknownError} does not block the app: Evolu logged an unexpected
|
|
751
|
+
* failure. Show a generic message.
|
|
752
|
+
*
|
|
692
753
|
* @group Core
|
|
693
754
|
*/
|
|
694
755
|
export type EvoluError = DecryptWithXChaCha20Poly1305Error | OtherBuildRunningError | ProtocolError | StorageQuotaError | UnknownError | UnsupportedDbVersionError;
|
|
756
|
+
/**
|
|
757
|
+
* The largest {@link Mutation}, in bytes.
|
|
758
|
+
*
|
|
759
|
+
* A mutation's size is its change as encoded for sync: the table name, the ID,
|
|
760
|
+
* and every column name and value, with a few bytes of overhead. A string takes
|
|
761
|
+
* at most three bytes per UTF-16 code unit. Every mutation within the limit
|
|
762
|
+
* fits one protocol message, so it can always sync. A larger mutation throws
|
|
763
|
+
* and is not saved. Mutations of local-only tables are exempt, because they
|
|
764
|
+
* never sync. Measure a mutation in advance with {@link Evolu.getMutationSize}.
|
|
765
|
+
*
|
|
766
|
+
* @group Core
|
|
767
|
+
*/
|
|
768
|
+
export declare const maxMutationSize: PositiveInt;
|
|
695
769
|
/**
|
|
696
770
|
* Dependency wrapper for the shared {@link EvoluError} store.
|
|
697
771
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../../src/local-first/Evolu.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../../src/local-first/Evolu.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,23 +57,27 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
|
|
|
57
57
|
});
|
|
58
58
|
import { emptyArray, isNonEmptyArray, mapArray, } from "../Array.js";
|
|
59
59
|
import { assert, assertNonEmptyReadonlyArray, assertNotUndefined, } from "../Assert.js";
|
|
60
|
+
import { createBuffer } from "../Bytes.js";
|
|
60
61
|
import { createCallbacks } from "../Callbacks.js";
|
|
61
62
|
import { createConsole } from "../Console.js";
|
|
62
63
|
import { createUnknownError } from "../Error.js";
|
|
63
64
|
import { disposable, exhaustiveCheck, todo } from "../Function.js";
|
|
64
65
|
import { acquireLeaderLock, acquireLeaderLockCallback, } from "../LockManager.js";
|
|
65
66
|
import { createMicrotaskBatch } from "../Microtask.js";
|
|
67
|
+
import { createMutableRecord, objectToEntries, } from "../Object.js";
|
|
66
68
|
import { createRefCountByKey } from "../RefCount.js";
|
|
67
69
|
import { err, ok } from "../Result.js";
|
|
68
70
|
import { isNonEmptySet } from "../Set.js";
|
|
69
|
-
import { SqliteBoolean, sqliteBooleanToBoolean } from "../Sqlite.js";
|
|
71
|
+
import { SqliteBoolean, sqliteBooleanToBoolean, } from "../Sqlite.js";
|
|
70
72
|
import { createStore } from "../Store.js";
|
|
71
|
-
import { brand, createId, createIdFromString, Name, UrlSafeString, } from "../Type.js";
|
|
73
|
+
import { brand, createId, createIdFromString, Id, Name, PositiveInt, UrlSafeString, } from "../Type.js";
|
|
72
74
|
import { createOwnerWebSocketTransport } from "./Owner.js";
|
|
75
|
+
import { encodeDbChange, } from "./Protocol.js";
|
|
73
76
|
import { applyPatches } from "./Query.js";
|
|
74
|
-
import { evoluSchemaToSqliteSchema } from "./Schema.js";
|
|
77
|
+
import { evoluSchemaToSqliteSchema, isLocalOnlyTable } from "./Schema.js";
|
|
75
78
|
import { consoleEntryOrErrorBroadcastChannelName } from "./Shared.js";
|
|
76
79
|
import { DbChange } from "./Storage.js";
|
|
80
|
+
import { createTimestamp } from "./Timestamp.js";
|
|
77
81
|
/**
|
|
78
82
|
* Application name.
|
|
79
83
|
*
|
|
@@ -95,6 +99,47 @@ export const AppName = /*#__PURE__*/ brand("AppName", UrlSafeString, (value) =>
|
|
|
95
99
|
* @group Testing
|
|
96
100
|
*/
|
|
97
101
|
export const testAppName = /*#__PURE__*/ AppName.orThrow("AppName");
|
|
102
|
+
/**
|
|
103
|
+
* The largest {@link Mutation}, in bytes.
|
|
104
|
+
*
|
|
105
|
+
* A mutation's size is its change as encoded for sync: the table name, the ID,
|
|
106
|
+
* and every column name and value, with a few bytes of overhead. A string takes
|
|
107
|
+
* at most three bytes per UTF-16 code unit. Every mutation within the limit
|
|
108
|
+
* fits one protocol message, so it can always sync. A larger mutation throws
|
|
109
|
+
* and is not saved. Mutations of local-only tables are exempt, because they
|
|
110
|
+
* never sync. Measure a mutation in advance with {@link Evolu.getMutationSize}.
|
|
111
|
+
*
|
|
112
|
+
* @group Core
|
|
113
|
+
*/
|
|
114
|
+
export const maxMutationSize =
|
|
115
|
+
/*#__PURE__*/ PositiveInt.orThrow(640_000);
|
|
116
|
+
/** Measures a mutation as {@link maxMutationSize} describes. */
|
|
117
|
+
const measureMutation = (table, values) => {
|
|
118
|
+
const columns = createMutableRecord();
|
|
119
|
+
for (const [column, value] of objectToEntries(values)) {
|
|
120
|
+
if (value !== undefined && column !== "id" && column !== "isDeleted") {
|
|
121
|
+
columns[column] = value;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Measuring with the protocol's encoding keeps the limit and the message size
|
|
125
|
+
// from disagreeing. A separate formula would save the tab about 3 KB
|
|
126
|
+
// compressed, but it would be a second encoding to keep in sync, and it
|
|
127
|
+
// would have to overcount.
|
|
128
|
+
const buffer = createBuffer();
|
|
129
|
+
encodeDbChange(buffer, {
|
|
130
|
+
// Every timestamp and ID takes 16 bytes, and the flags always take one.
|
|
131
|
+
timestamp: createTimestamp(),
|
|
132
|
+
change: DbChange.orThrow({
|
|
133
|
+
table,
|
|
134
|
+
id: mutationSizeId,
|
|
135
|
+
values: columns,
|
|
136
|
+
isInsert: true,
|
|
137
|
+
isDelete: null,
|
|
138
|
+
}),
|
|
139
|
+
});
|
|
140
|
+
return buffer.getLength();
|
|
141
|
+
};
|
|
142
|
+
const mutationSizeId = /*#__PURE__*/ Id.orThrow("A".repeat(22));
|
|
98
143
|
/**
|
|
99
144
|
* Creates shared dependencies used by all {@link createEvolu} instances on a
|
|
100
145
|
* platform.
|
|
@@ -397,6 +442,36 @@ export const createEvolu = (schema, config) => async (run) => {
|
|
|
397
442
|
: null,
|
|
398
443
|
};
|
|
399
444
|
assert(DbChange.is(dbChange), `Invalid DbChange for table '${String(table)}'.`);
|
|
445
|
+
// Copy binary values, so what is saved is what was passed: the caller
|
|
446
|
+
// can change a Uint8Array before the batch is sent, a view of a
|
|
447
|
+
// resizable buffer can grow, and a view of a shared buffer cannot be
|
|
448
|
+
// sent to a SharedWorker at all. Node's Buffer passes validation and
|
|
449
|
+
// its slice shares memory, so only the constructor copies reliably.
|
|
450
|
+
for (const [column, value] of objectToEntries(dbChange.values)) {
|
|
451
|
+
if (typeof value === "object" && value !== null) {
|
|
452
|
+
changeValues[column] = new Uint8Array(value);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
// A change over maxMutationSize could never sync, and a shared worker
|
|
456
|
+
// hosting two databases would stop all work of that database. Correct
|
|
457
|
+
// apps bound column Types, so it is a programmer error and throws like
|
|
458
|
+
// the DbChange check above, before batching: it gets no timestamp, the
|
|
459
|
+
// database worker never sees it, and the code after the call does not
|
|
460
|
+
// run, so a form keeps its input and no row refers to the missing one.
|
|
461
|
+
//
|
|
462
|
+
// Rejected: reporting it through evoluError, which lets that code run
|
|
463
|
+
// as if the mutation was saved; checking in the database worker, which
|
|
464
|
+
// gets it already batched and cannot reach the call site; quarantine,
|
|
465
|
+
// which holds changes stored for sync; and skipping it in sync, which
|
|
466
|
+
// keeps range fingerprints disagreeing. Received changes are not
|
|
467
|
+
// checked, and oversized changes stored before this limit are not
|
|
468
|
+
// recovered, which needs a history-aware design.
|
|
469
|
+
//
|
|
470
|
+
// Local-only tables never sync, so they have no limit.
|
|
471
|
+
if (!isLocalOnlyTable(dbChange.table)) {
|
|
472
|
+
const size = measureMutation(dbChange.table, dbChange.values);
|
|
473
|
+
assert(size <= maxMutationSize, `The mutation of table '${dbChange.table}' is ${size} bytes, over maxMutationSize (${maxMutationSize}). Bound the Types of its columns or check it with evolu.getMutationSize.`);
|
|
474
|
+
}
|
|
400
475
|
mutateBatch.push({
|
|
401
476
|
change: { ...dbChange, ownerId: options?.ownerId ?? appOwner.id },
|
|
402
477
|
onComplete: options?.onComplete,
|
|
@@ -458,6 +533,7 @@ export const createEvolu = (schema, config) => async (run) => {
|
|
|
458
533
|
insert: createMutation("insert"),
|
|
459
534
|
update: createMutation("update"),
|
|
460
535
|
upsert: createMutation("upsert"),
|
|
536
|
+
getMutationSize: (table, values) => measureMutation(String(table), values),
|
|
461
537
|
loadQuery,
|
|
462
538
|
loadQueries: (queries) => queries.map((query) => loadQuery(query)),
|
|
463
539
|
subscribeQuery: (query) => (listener) => {
|
|
@@ -103,9 +103,9 @@
|
|
|
103
103
|
* fit within the limit, the protocol automatically continues synchronization in
|
|
104
104
|
* subsequent rounds using range-based reconciliation.
|
|
105
105
|
*
|
|
106
|
-
*
|
|
107
|
-
* message
|
|
108
|
-
*
|
|
106
|
+
* Each mutation is limited to {@link maxMutationSize}, so every change fits one
|
|
107
|
+
* message of {@link defaultProtocolMessageMaxSize} next to the largest ranges
|
|
108
|
+
* section.
|
|
109
109
|
*
|
|
110
110
|
* ## Why Binary?
|
|
111
111
|
*
|
|
@@ -512,6 +512,15 @@ version?: NonNegativeInt) => Task<ApplyProtocolMessageAsRelayResult, ProtocolInv
|
|
|
512
512
|
* data.
|
|
513
513
|
*/
|
|
514
514
|
export declare const encodeAndEncryptDbChange: (deps: RandomBytesDep) => (message: CrdtMessage, key: EncryptionKey) => EncryptedDbChange;
|
|
515
|
+
/**
|
|
516
|
+
* Encodes a {@link CrdtMessage} as {@link encodeAndEncryptDbChange} does before
|
|
517
|
+
* padding and encryption.
|
|
518
|
+
*
|
|
519
|
+
* {@link Evolu.getMutationSize} measures mutations with this encoding, so
|
|
520
|
+
* {@link maxMutationSize} limits exactly what is encoded, and every change
|
|
521
|
+
* within it fits one protocol message.
|
|
522
|
+
*/
|
|
523
|
+
export declare const encodeDbChange: (buffer: Buffer, message: CrdtMessage) => void;
|
|
515
524
|
/**
|
|
516
525
|
* Decrypts and decodes an {@link EncryptedCrdtMessage} using the provided
|
|
517
526
|
* owner's encryption key. Verifies that the embedded timestamp matches the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../../src/local-first/Protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgKG;AAEH;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,aAAa,CAAC;AAQrB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../../src/local-first/Protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -103,9 +103,9 @@
|
|
|
103
103
|
* fit within the limit, the protocol automatically continues synchronization in
|
|
104
104
|
* subsequent rounds using range-based reconciliation.
|
|
105
105
|
*
|
|
106
|
-
*
|
|
107
|
-
* message
|
|
108
|
-
*
|
|
106
|
+
* Each mutation is limited to {@link maxMutationSize}, so every change fits one
|
|
107
|
+
* message of {@link defaultProtocolMessageMaxSize} next to the largest ranges
|
|
108
|
+
* section.
|
|
109
109
|
*
|
|
110
110
|
* ## Why Binary?
|
|
111
111
|
*
|
|
@@ -175,7 +175,7 @@
|
|
|
175
175
|
*/
|
|
176
176
|
import { createMutableArray, isNonEmptyArray, } from "../Array.js";
|
|
177
177
|
import { assert, assertNonEmptyArray, assertNonNullable, assertNotUndefined, assertSame, } from "../Assert.js";
|
|
178
|
-
import { createBuffer, createRunLengthEncoder, decodeFlags, decodeJsonValue, decodeLength, decodeNonNegativeInt, decodeNumber, decodeRle, decodeString, encodeFlags, encodeJsonValue, encodeLength, encodeNonNegativeInt, encodeNumber, encodeString, } from "../Bytes.js";
|
|
178
|
+
import { BufferError, createBuffer, createRunLengthEncoder, decodeFlags, decodeJsonValue, decodeLength, decodeNonNegativeInt, decodeNumber, decodeRle, decodeString, encodeFlags, encodeJsonValue, encodeLength, encodeNonNegativeInt, encodeNumber, encodeString, } from "../Bytes.js";
|
|
179
179
|
import { createPadmePadding, decryptWithXChaCha20Poly1305, EncryptionKey, encryptWithXChaCha20Poly1305, Entropy24, XChaCha20Poly1305Ciphertext, xChaCha20Poly1305NonceLength, } from "../Crypto.js";
|
|
180
180
|
import { eqArrayNumber } from "../Eq.js";
|
|
181
181
|
import { computeBalancedBuckets } from "../Number.js";
|
|
@@ -1210,6 +1210,25 @@ const decodeId = (buffer) => {
|
|
|
1210
1210
|
*/
|
|
1211
1211
|
export const encodeAndEncryptDbChange = (deps) => (message, key) => {
|
|
1212
1212
|
const buffer = createBuffer();
|
|
1213
|
+
encodeDbChange(buffer, message);
|
|
1214
|
+
// Add PADMÉ padding (ignored during decoding)
|
|
1215
|
+
buffer.extend(createPadmePadding(buffer.getLength()));
|
|
1216
|
+
const [ciphertext, nonce] = encryptWithXChaCha20Poly1305(deps)(buffer.unwrap(), key);
|
|
1217
|
+
buffer.reset();
|
|
1218
|
+
buffer.extend(nonce);
|
|
1219
|
+
encodeLength(buffer, ciphertext);
|
|
1220
|
+
buffer.extend(ciphertext);
|
|
1221
|
+
return buffer.unwrap();
|
|
1222
|
+
};
|
|
1223
|
+
/**
|
|
1224
|
+
* Encodes a {@link CrdtMessage} as {@link encodeAndEncryptDbChange} does before
|
|
1225
|
+
* padding and encryption.
|
|
1226
|
+
*
|
|
1227
|
+
* {@link Evolu.getMutationSize} measures mutations with this encoding, so
|
|
1228
|
+
* {@link maxMutationSize} limits exactly what is encoded, and every change
|
|
1229
|
+
* within it fits one protocol message.
|
|
1230
|
+
*/
|
|
1231
|
+
export const encodeDbChange = (buffer, message) => {
|
|
1213
1232
|
encodeNonNegativeInt(buffer, protocolVersion);
|
|
1214
1233
|
// Encode the timestamp to prevent tampering (e.g., a malicious relay
|
|
1215
1234
|
// assigning this EncryptedDbChange to a different EncryptedCrdtMessage)
|
|
@@ -1229,14 +1248,6 @@ export const encodeAndEncryptDbChange = (deps) => (message, key) => {
|
|
|
1229
1248
|
encodeString(buffer, column);
|
|
1230
1249
|
encodeSqliteValue(buffer, value);
|
|
1231
1250
|
}
|
|
1232
|
-
// Add PADMÉ padding (ignored during decoding)
|
|
1233
|
-
buffer.extend(createPadmePadding(buffer.getLength()));
|
|
1234
|
-
const [ciphertext, nonce] = encryptWithXChaCha20Poly1305(deps)(buffer.unwrap(), key);
|
|
1235
|
-
buffer.reset();
|
|
1236
|
-
buffer.extend(nonce);
|
|
1237
|
-
encodeLength(buffer, ciphertext);
|
|
1238
|
-
buffer.extend(ciphertext);
|
|
1239
|
-
return buffer.unwrap();
|
|
1240
1251
|
};
|
|
1241
1252
|
/**
|
|
1242
1253
|
* Decrypts and decodes an {@link EncryptedCrdtMessage} using the provided
|
|
@@ -1368,22 +1379,33 @@ export const encodeSqliteValue = (buffer, value) => {
|
|
|
1368
1379
|
return;
|
|
1369
1380
|
}
|
|
1370
1381
|
const json = Json.from.parent(value);
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
// which would cause data corruption if we don't verify round-trip safety.
|
|
1374
|
-
if (json.ok && JSON.stringify(jsonToJsonValue(json.value)) === value) {
|
|
1382
|
+
if (json.ok) {
|
|
1383
|
+
const jsonValue = jsonToJsonValue(json.value);
|
|
1375
1384
|
jsonBuffer.reset();
|
|
1376
1385
|
try {
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1386
|
+
// Encoding first rejects nesting deeper than decoding allows, before
|
|
1387
|
+
// the recursive JSON.stringify below could overflow the stack. Such
|
|
1388
|
+
// a value is encoded as a plain string.
|
|
1389
|
+
encodeJsonValue(jsonBuffer, jsonValue);
|
|
1390
|
+
// Only encode as Json if it survives JSON.parse/JSON.stringify
|
|
1391
|
+
// round-trip. Some valid JSON strings like "-0E0" get normalized to
|
|
1392
|
+
// "0" during parsing, which would cause data corruption if we don't
|
|
1393
|
+
// verify round-trip safety.
|
|
1394
|
+
if (JSON.stringify(jsonValue) === value) {
|
|
1395
|
+
const jsonBytes = jsonBuffer.unwrap();
|
|
1396
|
+
encodeNonNegativeInt(buffer, ProtocolValueType.Json);
|
|
1397
|
+
encodeLength(buffer, jsonBytes);
|
|
1398
|
+
buffer.extend(jsonBytes);
|
|
1399
|
+
return;
|
|
1400
|
+
}
|
|
1401
|
+
}
|
|
1402
|
+
catch (error) {
|
|
1403
|
+
if (!(error instanceof BufferError))
|
|
1404
|
+
throw error;
|
|
1382
1405
|
}
|
|
1383
1406
|
finally {
|
|
1384
1407
|
jsonBuffer.reset();
|
|
1385
1408
|
}
|
|
1386
|
-
return;
|
|
1387
1409
|
}
|
|
1388
1410
|
const base64Url = Base64Url.from.parent(value);
|
|
1389
1411
|
if (base64Url.ok) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Relay.d.ts","sourceRoot":"","sources":["../../../src/local-first/Relay.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"Relay.d.ts","sourceRoot":"","sources":["../../../src/local-first/Relay.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,IAAI,EAAyC,MAAM,YAAY,CAAC;AACzE,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EACL,OAAO,EAIR,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAEV,iBAAiB,EACjB,OAAO,EACP,aAAa,EAEd,MAAM,cAAc,CAAC;AAStB,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAErB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgFG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CACxB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE;QACP,iEAAiE;QACjE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;KAC9B,KACE,SAAS,CAAC,OAAO,CAAC,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,KAAM,SAAQ,eAAe;IAC5C,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,wBAAwB,SAC5B,iBAAiB,GAAG,kBAAkB,cACpC,aAAa,KAAG,OAyLxB,CAAC;AAEJ,eAAO,MAAM,wBAAwB,SAAU,SAAS,KAAG,IAuB1D,CAAC"}
|