@evolu/common 6.0.1-preview.33 → 6.0.1-preview.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/src/Array.d.ts +3 -3
- package/dist/src/Array.js +3 -3
- package/dist/src/Crypto.d.ts +6 -8
- package/dist/src/Crypto.d.ts.map +1 -1
- package/dist/src/Crypto.js +9 -9
- package/dist/src/Evolu/Db.d.ts.map +1 -1
- package/dist/src/Evolu/Db.js +4 -4
- package/dist/src/Evolu/Evolu.d.ts +9 -4
- package/dist/src/Evolu/Evolu.d.ts.map +1 -1
- package/dist/src/Evolu/Evolu.js +14 -14
- package/dist/src/Evolu/Protocol.d.ts +27 -2
- package/dist/src/Evolu/Protocol.d.ts.map +1 -1
- package/dist/src/Evolu/Protocol.js +71 -31
- package/dist/src/Evolu/PublicKysely.d.ts.map +1 -1
- package/dist/src/Evolu/PublicKysely.js +0 -1
- package/dist/src/Evolu/Query.d.ts +1 -1
- package/dist/src/Evolu/Query.d.ts.map +1 -1
- package/dist/src/Evolu/Query.js +1 -1
- package/dist/src/Evolu/Schema.d.ts +28 -22
- package/dist/src/Evolu/Schema.d.ts.map +1 -1
- package/dist/src/Evolu/Schema.js +37 -32
- package/dist/src/Evolu/Storage.d.ts +11 -2
- package/dist/src/Evolu/Storage.d.ts.map +1 -1
- package/dist/src/Evolu/Storage.js +21 -3
- package/dist/src/Evolu/Sync.d.ts +4 -3
- package/dist/src/Evolu/Sync.d.ts.map +1 -1
- package/dist/src/Evolu/Sync.js +68 -40
- package/dist/src/Evolu/Timestamp.d.ts +10 -14
- package/dist/src/Evolu/Timestamp.d.ts.map +1 -1
- package/dist/src/Evolu/Timestamp.js +3 -16
- package/dist/src/Object.d.ts +10 -4
- package/dist/src/Object.d.ts.map +1 -1
- package/dist/src/Object.js +9 -3
- package/dist/src/Sqlite.d.ts +29 -3
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +29 -3
- package/dist/src/Type.d.ts +94 -47
- package/dist/src/Type.d.ts.map +1 -1
- package/dist/src/Type.js +110 -65
- package/package.json +2 -2
- package/src/Array.ts +3 -3
- package/src/Crypto.ts +11 -9
- package/src/Evolu/Db.ts +7 -7
- package/src/Evolu/Evolu.ts +31 -24
- package/src/Evolu/Protocol.ts +84 -37
- package/src/Evolu/PublicKysely.ts +1 -2
- package/src/Evolu/Query.ts +2 -2
- package/src/Evolu/Schema.ts +54 -50
- package/src/Evolu/Storage.ts +39 -2
- package/src/Evolu/Sync.ts +97 -43
- package/src/Evolu/Timestamp.ts +5 -25
- package/src/Object.ts +13 -5
- package/src/Sqlite.ts +33 -3
- package/src/Type.ts +124 -80
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Evolu
|
|
2
2
|
|
|
3
|
-
Evolu is TypeScript library and local-first
|
|
3
|
+
Evolu is TypeScript library and local-first platform.
|
|
4
4
|
|
|
5
5
|
## Documentation
|
|
6
6
|
|
|
@@ -24,7 +24,7 @@ The Evolu Relay source along with the Docker files can be in the [/apps/relay](/
|
|
|
24
24
|
|
|
25
25
|
Alternatively, a pre-built image `evoluhq/relay:latest` is hosted on [Docker Hub](https://hub.docker.com/r/evoluhq/relay).
|
|
26
26
|
|
|
27
|
-
For more information, reference the [Evolu Relay](https://www.evolu.dev/docs/
|
|
27
|
+
For more information, reference the [Evolu Relay](https://www.evolu.dev/docs/relay) documentation.
|
|
28
28
|
|
|
29
29
|
## Developing
|
|
30
30
|
|
package/dist/src/Array.d.ts
CHANGED
|
@@ -6,19 +6,19 @@
|
|
|
6
6
|
* Prepared for TC39 Hack pipes:
|
|
7
7
|
*
|
|
8
8
|
* ```ts
|
|
9
|
-
* // Problem: nested
|
|
9
|
+
* // Problem: nested functions can be hard to follow
|
|
10
10
|
* const result = firstInArray(
|
|
11
11
|
* mapArray(dedupeArray(appendToArray(value, 2)), (x) => x * 2),
|
|
12
12
|
* );
|
|
13
13
|
*
|
|
14
|
-
* // Ideal: TC39 Hack pipes (when available)
|
|
14
|
+
* // Ideal solution: TC39 Hack pipes (when available)
|
|
15
15
|
* // const result = value
|
|
16
16
|
* // |> appendToArray(%, 2)
|
|
17
17
|
* // |> dedupeArray(%)
|
|
18
18
|
* // |> mapArray(%, (x) => x * 2)
|
|
19
19
|
* // |> firstInArray(%);
|
|
20
20
|
*
|
|
21
|
-
* //
|
|
21
|
+
* // Current solution: name each step (or use p1, p2 if lazy)
|
|
22
22
|
* const p1 = appendToArray(value, 2);
|
|
23
23
|
* const p2 = dedupeArray(p1);
|
|
24
24
|
* const p3 = mapArray(p2, (x) => x * 2);
|
package/dist/src/Array.js
CHANGED
|
@@ -6,19 +6,19 @@
|
|
|
6
6
|
* Prepared for TC39 Hack pipes:
|
|
7
7
|
*
|
|
8
8
|
* ```ts
|
|
9
|
-
* // Problem: nested
|
|
9
|
+
* // Problem: nested functions can be hard to follow
|
|
10
10
|
* const result = firstInArray(
|
|
11
11
|
* mapArray(dedupeArray(appendToArray(value, 2)), (x) => x * 2),
|
|
12
12
|
* );
|
|
13
13
|
*
|
|
14
|
-
* // Ideal: TC39 Hack pipes (when available)
|
|
14
|
+
* // Ideal solution: TC39 Hack pipes (when available)
|
|
15
15
|
* // const result = value
|
|
16
16
|
* // |> appendToArray(%, 2)
|
|
17
17
|
* // |> dedupeArray(%)
|
|
18
18
|
* // |> mapArray(%, (x) => x * 2)
|
|
19
19
|
* // |> firstInArray(%);
|
|
20
20
|
*
|
|
21
|
-
* //
|
|
21
|
+
* // Current solution: name each step (or use p1, p2 if lazy)
|
|
22
22
|
* const p1 = appendToArray(value, 2);
|
|
23
23
|
* const p2 = dedupeArray(p1);
|
|
24
24
|
* const p3 = mapArray(p2, (x) => x * 2);
|
package/dist/src/Crypto.d.ts
CHANGED
|
@@ -85,15 +85,13 @@ export declare const createSymmetricCrypto: (deps: RandomBytesDep) => SymmetricC
|
|
|
85
85
|
* Returns the PADMÉ padded length for a given input length.
|
|
86
86
|
*
|
|
87
87
|
* PADMÉ limits information leakage about the length of the plain-text for a
|
|
88
|
-
* wide range of encrypted data sizes.
|
|
89
|
-
*
|
|
90
|
-
|
|
91
|
-
export declare const padmePaddedLength: (length: NonNegativeInt) => NonNegativeInt;
|
|
92
|
-
/**
|
|
93
|
-
* Returns the PADMÉ padding length for a given input length. Uses
|
|
94
|
-
* {@link padmePaddedLength}.
|
|
88
|
+
* wide range of encrypted data sizes.
|
|
89
|
+
*
|
|
90
|
+
* See the PURBs paper for details: https://bford.info/pub/sec/purb.pdf
|
|
95
91
|
*/
|
|
96
|
-
export declare const
|
|
92
|
+
export declare const createPadmePaddedLength: (length: NonNegativeInt) => NonNegativeInt;
|
|
93
|
+
/** Creates a PADMÉ padding array of zeros for the given input length. */
|
|
94
|
+
export declare const createPadmePadding: (length: NonNegativeInt) => Uint8Array;
|
|
97
95
|
/**
|
|
98
96
|
* Performs a timing-safe comparison of two Uint8Arrays. Returns true if they
|
|
99
97
|
* are equal, false otherwise. Takes constant time regardless of where the
|
package/dist/src/Crypto.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Crypto.d.ts","sourceRoot":"","sources":["../../src/Crypto.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAW,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAiB,cAAc,EAAc,MAAM,WAAW,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAED,QAAA,MAAM,OAAO,uVAA+B,CAAC;AAC7C,KAAK,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAC;AAEnC,eAAO,MAAM,SAAS,mbAAsB,CAAC;AAC7C,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAC;AAE9C,eAAO,MAAM,SAAS,mbAAsB,CAAC;AAC7C,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAC;AAE9C,eAAO,MAAM,SAAS,mbAAsB,CAAC;AAC7C,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAC;AAE9C,eAAO,MAAM,iBAAiB,QAAO,WAEnC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,EACvC,MAAM,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,KACnC,SAaF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,MAAM,EACb,YAAY,SAAS,KACpB,SAMF,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,aAAa,2qBAAoC,CAAC;AAC/D,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAC;AAEtD,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;IAErC,QAAQ,CAAC,OAAO,EAAE,CAChB,SAAS,EAAE,UAAU,EACrB,aAAa,EAAE,aAAa,KACzB;QACH,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;QAC3B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;KACjC,CAAC;IAEF,QAAQ,CAAC,OAAO,EAAE,CAChB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,UAAU,KACd,MAAM,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC3C;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,6BAA6B,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,cAAc,KACnB,eAyBF,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"Crypto.d.ts","sourceRoot":"","sources":["../../src/Crypto.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAW,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAiB,cAAc,EAAc,MAAM,WAAW,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAED,QAAA,MAAM,OAAO,uVAA+B,CAAC;AAC7C,KAAK,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAC;AAEnC,eAAO,MAAM,SAAS,mbAAsB,CAAC;AAC7C,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAC;AAE9C,eAAO,MAAM,SAAS,mbAAsB,CAAC;AAC7C,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAC;AAE9C,eAAO,MAAM,SAAS,mbAAsB,CAAC;AAC7C,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAC;AAE9C,eAAO,MAAM,iBAAiB,QAAO,WAEnC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,EACvC,MAAM,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,KACnC,SAaF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,MAAM,EACb,YAAY,SAAS,KACpB,SAMF,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,aAAa,2qBAAoC,CAAC;AAC/D,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAC;AAEtD,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;IAErC,QAAQ,CAAC,OAAO,EAAE,CAChB,SAAS,EAAE,UAAU,EACrB,aAAa,EAAE,aAAa,KACzB;QACH,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;QAC3B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;KACjC,CAAC;IAEF,QAAQ,CAAC,OAAO,EAAE,CAChB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,UAAU,KACd,MAAM,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC3C;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,6BAA6B,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,cAAc,KACnB,eAyBF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GAClC,QAAQ,cAAc,KACrB,cAOF,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,GAAI,QAAQ,cAAc,KAAG,UAI3D,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC;AAExE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC3C"}
|
package/dist/src/Crypto.js
CHANGED
|
@@ -68,10 +68,11 @@ export const createSymmetricCrypto = (deps) => {
|
|
|
68
68
|
* Returns the PADMÉ padded length for a given input length.
|
|
69
69
|
*
|
|
70
70
|
* PADMÉ limits information leakage about the length of the plain-text for a
|
|
71
|
-
* wide range of encrypted data sizes.
|
|
72
|
-
*
|
|
71
|
+
* wide range of encrypted data sizes.
|
|
72
|
+
*
|
|
73
|
+
* See the PURBs paper for details: https://bford.info/pub/sec/purb.pdf
|
|
73
74
|
*/
|
|
74
|
-
export const
|
|
75
|
+
export const createPadmePaddedLength = (length) => {
|
|
75
76
|
if (length <= 0)
|
|
76
77
|
return NonNegativeInt.orThrow(0);
|
|
77
78
|
const e = 31 - Math.clz32(length >>> 0);
|
|
@@ -80,10 +81,9 @@ export const padmePaddedLength = (length) => {
|
|
|
80
81
|
const mask = (1 << z) - 1;
|
|
81
82
|
return NonNegativeInt.orThrow((length + mask) & ~mask);
|
|
82
83
|
};
|
|
83
|
-
/**
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
return NonNegativeInt.orThrow(padmePaddedLength(length) - length);
|
|
84
|
+
/** Creates a PADMÉ padding array of zeros for the given input length. */
|
|
85
|
+
export const createPadmePadding = (length) => {
|
|
86
|
+
const paddedLength = createPadmePaddedLength(length);
|
|
87
|
+
const paddingLength = NonNegativeInt.orThrow(paddedLength - length);
|
|
88
|
+
return new globalThis.Uint8Array(paddingLength);
|
|
89
89
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAEL,aAAa,EACb,cAAc,EACd,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAEL,qBAAqB,EAIrB,WAAW,EACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAGL,MAAM,EACP,MAAM,cAAc,CAAC;AACtB,OAAO,EAAe,YAAY,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EACL,QAAQ,EAOR,cAAc,EAEf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAmB,MAAM,eAAe,CAAC;AAC/D,OAAO,EAIL,KAAK,EAEN,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,QAAQ,EAGR,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAML,SAAS,EACV,MAAM,WAAW,CAAC;AACnB,OAAO,
|
|
1
|
+
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Db.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Evolu/Db.js
CHANGED
|
@@ -11,7 +11,7 @@ import { createQueryRowsCache, deserializeQuery, emptyRows, } from "./Query.js";
|
|
|
11
11
|
import { ensureDbSchema, getDbSchema, } from "./Schema.js";
|
|
12
12
|
import { createBaseSqliteStorageTables } from "./Storage.js";
|
|
13
13
|
import { applyLocalOnlyChange, createClock, createSync, } from "./Sync.js";
|
|
14
|
-
import {
|
|
14
|
+
import { timestampBytesToTimestamp, timestampToTimestampBytes, } from "./Timestamp.js";
|
|
15
15
|
export const defaultDbConfig = {
|
|
16
16
|
name: SimpleName.orThrow("Evolu"),
|
|
17
17
|
transports: [{ type: "WebSocket", url: "wss://free.evoluhq.com" }],
|
|
@@ -70,7 +70,7 @@ const createDbWorkerDeps = (platformDeps) => async (initMessage, postMessage) =>
|
|
|
70
70
|
writeKey: config.appOwnerWriteKey,
|
|
71
71
|
mnemonic: config.appOwnerMnemonic,
|
|
72
72
|
};
|
|
73
|
-
clock = createClock({ ...platformDeps, sqlite })(
|
|
73
|
+
clock = createClock({ ...platformDeps, sqlite })(timestampBytesToTimestamp(config.clock));
|
|
74
74
|
}
|
|
75
75
|
else {
|
|
76
76
|
appOwner =
|
|
@@ -144,7 +144,7 @@ const initializeDb = (deps) => (initialAppOwner, initialClock) => {
|
|
|
144
144
|
`,
|
|
145
145
|
sql `
|
|
146
146
|
create table evolu_config (
|
|
147
|
-
"clock"
|
|
147
|
+
"clock" blob not null,
|
|
148
148
|
"appOwnerId" text not null,
|
|
149
149
|
"appOwnerEncryptionKey" blob not null,
|
|
150
150
|
"appOwnerWriteKey" blob not null,
|
|
@@ -163,7 +163,7 @@ const initializeDb = (deps) => (initialAppOwner, initialClock) => {
|
|
|
163
163
|
)
|
|
164
164
|
values
|
|
165
165
|
(
|
|
166
|
-
${
|
|
166
|
+
${timestampToTimestampBytes(initialClock)},
|
|
167
167
|
${initialAppOwner.id},
|
|
168
168
|
${initialAppOwner.encryptionKey},
|
|
169
169
|
${initialAppOwner.writeKey},
|
|
@@ -173,7 +173,7 @@ export interface Evolu<S extends EvoluSchema = EvoluSchema> extends Disposable {
|
|
|
173
173
|
*
|
|
174
174
|
* Evolu does not use SQL for mutations to ensure data can be safely and
|
|
175
175
|
* predictably merged without conflicts. Explicit mutations also allow Evolu
|
|
176
|
-
* to automatically
|
|
176
|
+
* to automatically update {@link SystemColumns}.
|
|
177
177
|
*
|
|
178
178
|
* ### Example
|
|
179
179
|
*
|
|
@@ -217,7 +217,7 @@ export interface Evolu<S extends EvoluSchema = EvoluSchema> extends Disposable {
|
|
|
217
217
|
*
|
|
218
218
|
* Evolu does not use SQL for mutations to ensure data can be safely and
|
|
219
219
|
* predictably merged without conflicts. Explicit mutations also allow Evolu
|
|
220
|
-
* to automatically
|
|
220
|
+
* to automatically update {@link SystemColumns}.
|
|
221
221
|
*
|
|
222
222
|
* ### Example
|
|
223
223
|
*
|
|
@@ -269,7 +269,7 @@ export interface Evolu<S extends EvoluSchema = EvoluSchema> extends Disposable {
|
|
|
269
269
|
*
|
|
270
270
|
* Evolu does not use SQL for mutations to ensure data can be safely and
|
|
271
271
|
* predictably merged without conflicts. Explicit mutations also allow Evolu
|
|
272
|
-
* to automatically
|
|
272
|
+
* to automatically update {@link SystemColumns}.
|
|
273
273
|
*
|
|
274
274
|
* ### Example
|
|
275
275
|
*
|
|
@@ -333,7 +333,12 @@ export interface Evolu<S extends EvoluSchema = EvoluSchema> extends Disposable {
|
|
|
333
333
|
* all tabs using Evolu. For native apps, it will restart the app.
|
|
334
334
|
*/
|
|
335
335
|
readonly reloadApp: () => void;
|
|
336
|
-
/**
|
|
336
|
+
/**
|
|
337
|
+
* Export SQLite database file as Uint8Array.
|
|
338
|
+
*
|
|
339
|
+
* In the future, it will be possible to import a database and export/import
|
|
340
|
+
* history for 1:1 migrations across owners.
|
|
341
|
+
*/
|
|
337
342
|
readonly exportDatabase: () => Promise<Uint8Array<ArrayBuffer>>;
|
|
338
343
|
/**
|
|
339
344
|
* Use an owner. Using an owner means syncing it and subscribing to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../../src/Evolu/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/Evolu/Evolu.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Evolu/Evolu.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { pack } from "msgpackr";
|
|
2
2
|
import { dedupeArray, isNonEmptyArray, isNonEmptyReadonlyArray, } from "../Array.js";
|
|
3
|
-
import {
|
|
3
|
+
import { 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 } from "../Sqlite.js";
|
|
9
|
+
import { isSqlMutation, SqliteBoolean, } from "../Sqlite.js";
|
|
10
10
|
import { createStore } from "../Store.js";
|
|
11
11
|
import { createId, } from "../Type.js";
|
|
12
12
|
import { defaultDbConfig } from "./Db.js";
|
|
@@ -192,18 +192,18 @@ const createEvoluInstance = (deps) => (schema, config) => {
|
|
|
192
192
|
mutateMicrotaskQueue.push([null, undefined]);
|
|
193
193
|
}
|
|
194
194
|
else {
|
|
195
|
-
const values =
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
195
|
+
const { id: _, isDeleted, ...values } = result.value;
|
|
196
|
+
const dbChange = DbChange.orThrow({
|
|
197
|
+
table,
|
|
198
|
+
id,
|
|
199
|
+
values,
|
|
200
|
+
isInsert: kind === "insert" || kind === "upsert",
|
|
201
|
+
isDelete: SqliteBoolean.is(isDeleted) ? Boolean(isDeleted) : null,
|
|
202
|
+
});
|
|
203
|
+
mutateMicrotaskQueue.push([
|
|
204
|
+
{ ...dbChange, ownerId: options?.ownerId },
|
|
205
|
+
options?.onComplete,
|
|
206
|
+
]);
|
|
207
207
|
}
|
|
208
208
|
if (mutateMicrotaskQueue.length === 1) {
|
|
209
209
|
queueMicrotask(processMutationQueue);
|
|
@@ -285,7 +285,9 @@ export interface ProtocolWriteError extends BaseOwnerError {
|
|
|
285
285
|
* excess local data is affected. Other devices that haven't exceeded quota can
|
|
286
286
|
* still sync normally.
|
|
287
287
|
*
|
|
288
|
-
* Clients should prompt the user to upgrade their
|
|
288
|
+
* Clients should prompt the user to contact the relay provider or upgrade their
|
|
289
|
+
* plan. Quota monitoring and management is the relay provider's
|
|
290
|
+
* responsibility.
|
|
289
291
|
*/
|
|
290
292
|
export interface ProtocolQuotaError extends BaseOwnerError {
|
|
291
293
|
readonly type: "ProtocolQuotaError";
|
|
@@ -305,7 +307,7 @@ export interface ProtocolSyncError extends BaseOwnerError {
|
|
|
305
307
|
export interface ProtocolTimestampMismatchError {
|
|
306
308
|
readonly type: "ProtocolTimestampMismatchError";
|
|
307
309
|
readonly expected: Timestamp;
|
|
308
|
-
readonly
|
|
310
|
+
readonly timestamp: Timestamp;
|
|
309
311
|
}
|
|
310
312
|
/**
|
|
311
313
|
* Creates a {@link ProtocolMessage} from CRDT messages.
|
|
@@ -408,6 +410,29 @@ version?: number & Brand<"Int"> & Brand<"NonNegative">) => Promise<Result<ApplyP
|
|
|
408
410
|
*/
|
|
409
411
|
export declare const encodeNumber: (buffer: Buffer, number: number) => void;
|
|
410
412
|
export declare const decodeNumber: (buffer: Buffer) => number;
|
|
413
|
+
/**
|
|
414
|
+
* Encodes an array of boolean flags into a single byte.
|
|
415
|
+
*
|
|
416
|
+
* Each element in the array corresponds to a bit (0-7). Array can have 0-8
|
|
417
|
+
* elements.
|
|
418
|
+
*
|
|
419
|
+
* ### Example
|
|
420
|
+
*
|
|
421
|
+
* ```ts
|
|
422
|
+
* encodeFlags(buffer, [true, false, true]); // Encodes bits 0, 1, 2
|
|
423
|
+
* ```
|
|
424
|
+
*/
|
|
425
|
+
export declare const encodeFlags: (buffer: Buffer, flags: ReadonlyArray<boolean>) => void;
|
|
426
|
+
/**
|
|
427
|
+
* Decodes a byte into an array of boolean flags.
|
|
428
|
+
*
|
|
429
|
+
* ### Example
|
|
430
|
+
*
|
|
431
|
+
* ```ts
|
|
432
|
+
* const flags = decodeFlags(buffer, 3); // Decode 3 flags
|
|
433
|
+
* ```
|
|
434
|
+
*/
|
|
435
|
+
export declare const decodeFlags: (buffer: Buffer, count: PositiveInt) => ReadonlyArray<boolean>;
|
|
411
436
|
/**
|
|
412
437
|
* Encodes and encrypts a {@link DbChange} using the provided owner's encryption
|
|
413
438
|
* key. Returns an encrypted binary representation as {@link EncryptedDbChange}.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgKG;
|
|
1
|
+
{"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../../src/Evolu/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,cAAc,EACd,KAAK,EACL,OAAO,EAGP,aAAa,EAEd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EAEjB,gBAAgB,EAIhB,SAAS,EAET,SAAS,EACT,UAAU,EAEX,MAAM,cAAc,CAAC;AACtB,OAAO,EAIL,MAAM,EACN,SAAS,EAKV,MAAM,gBAAgB,CAAC;AAaxB;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB,iUAG7B,CAAC;AAEP,MAAM,MAAM,sBAAsB,GAAG,OAAO,sBAAsB,CAAC,IAAI,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,EACX,sBAAsB,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,4BAA4B,qTAA+B,CAAC;AACzE,MAAM,MAAM,4BAA4B,GACtC,OAAO,4BAA4B,CAAC,IAAI,CAAC;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,mCAAmC,EACpC,4BAA4B,CAAC;AAEzC,8BAA8B;AAC9B,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAEpE,8BAA8B;AAC9B,eAAO,MAAM,eAAe,8CAA4B,CAAC;AAEzD,eAAO,MAAM,WAAW;IACtB,wEAAwE;;IAExE,yEAAyE;;IAEzE,0EAA0E;;CAElE,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;AAEzE,eAAO,MAAM,iBAAiB;IAC5B,8CAA8C;;IAE9C,2CAA2C;;IAE3C,+CAA+C;;CAEvC,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAC1B,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAE7D,eAAO,MAAM,iBAAiB;;IAE5B,gDAAgD;;IAEhD,6CAA6C;;IAE7C,6CAA6C;;IAE7C,4CAA4C;;CAEpC,CAAC;AAEX,KAAK,iBAAiB,GACpB,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAE7D,MAAM,MAAM,aAAa,GACrB,oBAAoB,GACpB,wBAAwB,GACxB,qBAAqB,GACrB,kBAAkB,GAClB,iBAAiB,GACjB,kBAAkB,GAClB,8BAA8B,CAAC;AAEnC;;;GAGG;AACH,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,4DAA4D;AAC5D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,mFAAmF;AACnF,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;CACxC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;CACrC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;CACpC;AAED;;;;GAIG;AACH,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,EAAE,gCAAgC,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qCAAqC,GAC/C,MAAM,cAAc,GAAG,kBAAkB,MAExC,OAAO,KAAK,EACZ,UAAU,qBAAqB,CAAC,WAAW,CAAC,EAC5C,UAAU,sBAAsB,KAC/B,eAoDF,CAAC;AAEJ,kDAAkD;AAClD,eAAO,MAAM,4BAA4B,GACtC,MAAM,UAAU,MAEf,SAAS,OAAO,EAChB,mBAAmB,gBAAgB,KAClC,eAAe,GAAG,IAoBpB,CAAC;AAEJ,eAAO,MAAM,mCAAmC,GAC9C,SAAS,OAAO,KACf,eAIU,CAAC;AAEd;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC;IAEnE,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAE7D,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC;IAEtC,QAAQ,CAAC,+BAA+B,EAAE,CACxC,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,oBAAoB,GAAG,IAAI,KACjC,OAAO,CAAC;IAEb,QAAQ,CAAC,QAAQ,EAAE,CACjB,KAAK,EAAE,SAAS,GAAG,gBAAgB,GAAG,mCAAmC,KACtE,IAAI,CAAC;IAEV,QAAQ,CAAC,MAAM,EAAE,MAAM,eAAe,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,WAAW,CAAC;CACrC;AAED,eAAO,MAAM,2BAA2B,GACtC,SAAS,OAAO,EAChB,SAAS;IACP,QAAQ,CAAC,YAAY,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAC3D,QAAQ,CAAC,aAAa,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;IAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;CACnC,GAAG,CACA;IACE,QAAQ,CAAC,WAAW,EAAE,OAAO,WAAW,CAAC,OAAO,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CAC9C,GACD;IACE,QAAQ,CAAC,WAAW,EAAE,OAAO,WAAW,CAAC,QAAQ,CAAC;IAClD,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;CACvC,GACD;IACE,QAAQ,CAAC,WAAW,EAAE,OAAO,WAAW,CAAC,SAAS,CAAC;CACpD,CACJ,KACA,qBAsLF,CAAC;AAEF,MAAM,WAAW,mCAAoC,SAAQ,SAAS;IACpE,QAAQ,CAAC,IAAI,EAAE,OAAO,SAAS,CAAC,UAAU,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,cAAc,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,eAAO,MAAM,sBAAsB,QAAO,gBAwDzC,CAAC;AAoCF,MAAM,WAAW,mCAAmC;IAClD,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,aAAa,GAAG,IAAI,CAAC;IAEzD,aAAa,CAAC,EAAE,4BAA4B,CAAC;IAE7C,sBAAsB;IACtB,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,MAAM,kCAAkC,GAC1C;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE,GAChC;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAEnC,eAAO,MAAM,4BAA4B,GACtC,MAAM,UAAU,MAEf,cAAc,UAAU,EACxB,UAAS,mCAAwC,KAChD,OAAO,CACR,MAAM,CACJ,kCAAkC,EAChC,wBAAwB,GACxB,iBAAiB,GACjB,oBAAoB,GACpB,kBAAkB,GAClB,qBAAqB,GACrB,kBAAkB,CACrB,CA4GF,CAAC;AAEJ,MAAM,WAAW,kCAAkC;IACjD,8CAA8C;IAC9C,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAEvC,iDAAiD;IACjD,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC,0DAA0D;IAC1D,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IAEjE,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,aAAa,CAAC,EAAE,4BAA4B,CAAC;CAC9C;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;CACnC;AAED,eAAO,MAAM,2BAA2B,GACrC,MAAM,UAAU,MAEf,cAAc,UAAU,EACxB,UAAS,kCAAuC;AAChD,sBAAsB;AACtB,sDAAyB,KACxB,OAAO,CACR,MAAM,CAAC,iCAAiC,EAAE,wBAAwB,CAAC,CAoJpE,CAAC;AA4aJ;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,KAAG,IAE7D,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,MAqB7C,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,EACd,OAAO,aAAa,CAAC,OAAO,CAAC,KAC5B,IAQF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,EACd,OAAO,WAAW,KACjB,aAAa,CAAC,OAAO,CAOvB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,GAClC,MAAM,kBAAkB,MACxB,SAAS,WAAW,EAAE,KAAK,aAAa,KAAG,iBAwC3C,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GAClC,MAAM,kBAAkB,MAEvB,SAAS,oBAAoB,EAC7B,KAAK,aAAa,KACjB,MAAM,CACP,QAAQ,EACN,2BAA2B,GAC3B,wBAAwB,GACxB,8BAA8B,CA8DjC,CAAC;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,MAAM,EACd,KAAK,cAAc,KAClB,IAoBF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,cAiBrD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,OAAO,SAAS,CAAC,GAAG,CAAC,KAAG,IAEpE,CAAC;AAEF,eAAO,MAAM,YAAY,WAvBoB,MAAM,KAAG,cAuBN,CAAC;AAEjD,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,OAAO,MAAM,KAAG,IAI5D,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,MAI7C,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,KAAG,IAE7D,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,MAG7C,CAAC;AAMF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;CA2BpB,CAAC;AAEX,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,OAAO,WAAW,KAAG,IAoFtE,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,WAyDlD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,2BAA2B,GACtC,kBAAkB,eAAe,EACjC,cAAc,OAAO,KACpB,OAOF,CAAC"}
|
|
@@ -169,20 +169,24 @@
|
|
|
169
169
|
* initiator/non-initiator terminology instead, and consolidate into a single
|
|
170
170
|
* `applyProtocolMessage` function with conditional arguments to reduce code
|
|
171
171
|
* duplication.
|
|
172
|
-
* -
|
|
172
|
+
* - Replace try-catch with Result + new Error (to preserve stacktraces). Measure
|
|
173
|
+
* Result overhead, it should be super small.
|
|
174
|
+
* - Allow clients to broadcast messages that are not persisted by relays. This
|
|
175
|
+
* would enable real-time ephemeral data (like cursor positions, typing
|
|
176
|
+
* indicators) to be forwarded by relays without storage overhead.
|
|
173
177
|
*/
|
|
174
178
|
import { Packr } from "msgpackr";
|
|
175
179
|
import { isNonEmptyReadonlyArray } from "../Array.js";
|
|
176
180
|
import { assert } from "../Assert.js";
|
|
177
181
|
import { bytesToHex, bytesToUtf8, createBuffer, hexToBytes, utf8ToBytes, } from "../Buffer.js";
|
|
178
|
-
import {
|
|
182
|
+
import { createPadmePadding, } from "../Crypto.js";
|
|
179
183
|
import { eqArrayNumber } from "../Eq.js";
|
|
180
184
|
import { computeBalancedBuckets } from "../Number.js";
|
|
181
185
|
import { objectToEntries } from "../Object.js";
|
|
182
186
|
import { err, ok } from "../Result.js";
|
|
183
187
|
import { Base64Url, base64UrlToUint8Array, between, DateIso, Id, idBytesToId, idBytesTypeValueLength, idToIdBytes, Int, Json, jsonToJsonValue, NonNegativeInt, Number, PositiveInt, uint8ArrayToBase64Url, } from "../Type.js";
|
|
184
188
|
import { ownerIdToOwnerIdBytes, ownerWriteKeyLength, } from "./Owner.js";
|
|
185
|
-
import { fingerprintSize, InfiniteUpperBound, RangeType, } from "./Storage.js";
|
|
189
|
+
import { DbChange, fingerprintSize, InfiniteUpperBound, RangeType, } from "./Storage.js";
|
|
186
190
|
import { Counter, eqTimestamp, Millis, timestampBytesLength, timestampBytesToTimestamp, timestampToTimestampBytes, } from "./Timestamp.js";
|
|
187
191
|
/**
|
|
188
192
|
* Evolu uses MessagePack for numbers and JSONs.
|
|
@@ -535,8 +539,6 @@ const createRunLengthEncoder = (encodeValue) => {
|
|
|
535
539
|
};
|
|
536
540
|
};
|
|
537
541
|
export const applyProtocolMessageAsClient = (deps) => async (inputMessage, options = {}) => {
|
|
538
|
-
// try-catch instead of Result for performance and stacktraces
|
|
539
|
-
// DEV: Measure it again, I think we should use Result with new Error.
|
|
540
542
|
try {
|
|
541
543
|
const input = createBuffer(inputMessage);
|
|
542
544
|
const [requestedVersion, ownerId] = decodeVersionAndOwner(input);
|
|
@@ -628,8 +630,6 @@ export const applyProtocolMessageAsClient = (deps) => async (inputMessage, optio
|
|
|
628
630
|
export const applyProtocolMessageAsRelay = (deps) => async (inputMessage, options = {},
|
|
629
631
|
/** For tests only. */
|
|
630
632
|
version = protocolVersion) => {
|
|
631
|
-
// try-catch instead of Result for performance and stacktraces
|
|
632
|
-
// DEV: Measure it again, I think we should use Result with new Error.
|
|
633
633
|
try {
|
|
634
634
|
const input = createBuffer(inputMessage);
|
|
635
635
|
const [requestedVersion, ownerId] = decodeVersionAndOwner(input);
|
|
@@ -1092,6 +1092,44 @@ export const decodeNumber = (buffer) => {
|
|
|
1092
1092
|
buffer.shiftN(endResult.value);
|
|
1093
1093
|
return numberResult.value;
|
|
1094
1094
|
};
|
|
1095
|
+
/**
|
|
1096
|
+
* Encodes an array of boolean flags into a single byte.
|
|
1097
|
+
*
|
|
1098
|
+
* Each element in the array corresponds to a bit (0-7). Array can have 0-8
|
|
1099
|
+
* elements.
|
|
1100
|
+
*
|
|
1101
|
+
* ### Example
|
|
1102
|
+
*
|
|
1103
|
+
* ```ts
|
|
1104
|
+
* encodeFlags(buffer, [true, false, true]); // Encodes bits 0, 1, 2
|
|
1105
|
+
* ```
|
|
1106
|
+
*/
|
|
1107
|
+
export const encodeFlags = (buffer, flags) => {
|
|
1108
|
+
let byte = 0;
|
|
1109
|
+
for (let i = 0; i < flags.length && i < 8; i++) {
|
|
1110
|
+
if (flags[i]) {
|
|
1111
|
+
byte |= 1 << i;
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
buffer.extend([byte]);
|
|
1115
|
+
};
|
|
1116
|
+
/**
|
|
1117
|
+
* Decodes a byte into an array of boolean flags.
|
|
1118
|
+
*
|
|
1119
|
+
* ### Example
|
|
1120
|
+
*
|
|
1121
|
+
* ```ts
|
|
1122
|
+
* const flags = decodeFlags(buffer, 3); // Decode 3 flags
|
|
1123
|
+
* ```
|
|
1124
|
+
*/
|
|
1125
|
+
export const decodeFlags = (buffer, count) => {
|
|
1126
|
+
const byte = buffer.shift();
|
|
1127
|
+
const flags = [];
|
|
1128
|
+
for (let i = 0; i < count && i < 8; i++) {
|
|
1129
|
+
flags.push((byte & (1 << i)) !== 0);
|
|
1130
|
+
}
|
|
1131
|
+
return flags;
|
|
1132
|
+
};
|
|
1095
1133
|
/**
|
|
1096
1134
|
* Encodes and encrypts a {@link DbChange} using the provided owner's encryption
|
|
1097
1135
|
* key. Returns an encrypted binary representation as {@link EncryptedDbChange}.
|
|
@@ -1101,26 +1139,26 @@ export const decodeNumber = (buffer) => {
|
|
|
1101
1139
|
* data.
|
|
1102
1140
|
*/
|
|
1103
1141
|
export const encodeAndEncryptDbChange = (deps) => (message, key) => {
|
|
1104
|
-
const change = message.change;
|
|
1105
1142
|
const buffer = createBuffer();
|
|
1106
|
-
// Encode protocol version first for backward compatibility
|
|
1107
1143
|
encodeNonNegativeInt(buffer, protocolVersion);
|
|
1108
|
-
// Encode the timestamp (
|
|
1109
|
-
|
|
1110
|
-
buffer.extend(
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1144
|
+
// Encode the timestamp to prevent tampering (e.g., a malicious relay
|
|
1145
|
+
// assigning this EncryptedDbChange to a different EncryptedCrdtMessage)
|
|
1146
|
+
buffer.extend(timestampToTimestampBytes(message.timestamp));
|
|
1147
|
+
encodeFlags(buffer, [
|
|
1148
|
+
message.change.isInsert,
|
|
1149
|
+
message.change.isDelete != null,
|
|
1150
|
+
message.change.isDelete ?? false,
|
|
1151
|
+
]);
|
|
1152
|
+
encodeString(buffer, message.change.table);
|
|
1153
|
+
buffer.extend(idToIdBytes(message.change.id));
|
|
1154
|
+
const entries = objectToEntries(message.change.values);
|
|
1116
1155
|
encodeLength(buffer, entries);
|
|
1117
1156
|
for (const [column, value] of entries) {
|
|
1118
1157
|
encodeString(buffer, column);
|
|
1119
1158
|
encodeSqliteValue(buffer, value);
|
|
1120
1159
|
}
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
buffer.extend(new Uint8Array(paddingLength));
|
|
1160
|
+
// Add PADMÉ padding (ignored during decoding)
|
|
1161
|
+
buffer.extend(createPadmePadding(buffer.getLength()));
|
|
1124
1162
|
const { nonce, ciphertext } = deps.symmetricCrypto.encrypt(buffer.unwrap(), key);
|
|
1125
1163
|
buffer.reset();
|
|
1126
1164
|
buffer.extend(nonce);
|
|
@@ -1134,30 +1172,26 @@ export const encodeAndEncryptDbChange = (deps) => (message, key) => {
|
|
|
1134
1172
|
* expected timestamp to ensure message integrity.
|
|
1135
1173
|
*/
|
|
1136
1174
|
export const decryptAndDecodeDbChange = (deps) => (message, key) => {
|
|
1137
|
-
// try-catch instead of Result for performance and stacktraces
|
|
1138
1175
|
try {
|
|
1139
1176
|
const buffer = createBuffer(message.change);
|
|
1140
1177
|
const nonce = buffer.shiftN(deps.symmetricCrypto.nonceLength);
|
|
1141
|
-
const
|
|
1142
|
-
const ciphertext = buffer.shiftN(ciphertextLength);
|
|
1178
|
+
const ciphertext = buffer.shiftN(decodeLength(buffer));
|
|
1143
1179
|
const plaintextBytes = deps.symmetricCrypto.decrypt(ciphertext, key, nonce);
|
|
1144
1180
|
if (!plaintextBytes.ok)
|
|
1145
1181
|
return plaintextBytes;
|
|
1146
1182
|
buffer.reset();
|
|
1147
1183
|
buffer.extend(plaintextBytes.value);
|
|
1148
|
-
// Decode version (for future compatibility,
|
|
1184
|
+
// Decode version (for future compatibility, not need yet)
|
|
1149
1185
|
decodeNonNegativeInt(buffer);
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
const embeddedTimestamp = timestampBytesToTimestamp(embeddedTimestampBytes);
|
|
1153
|
-
// Verify timestamp integrity
|
|
1154
|
-
if (!eqTimestamp(embeddedTimestamp, message.timestamp)) {
|
|
1186
|
+
const timestamp = timestampBytesToTimestamp(buffer.shiftN(timestampBytesLength));
|
|
1187
|
+
if (!eqTimestamp(timestamp, message.timestamp)) {
|
|
1155
1188
|
return err({
|
|
1156
1189
|
type: "ProtocolTimestampMismatchError",
|
|
1157
1190
|
expected: message.timestamp,
|
|
1158
|
-
|
|
1191
|
+
timestamp,
|
|
1159
1192
|
});
|
|
1160
1193
|
}
|
|
1194
|
+
const flags = decodeFlags(buffer, PositiveInt.orThrow(3));
|
|
1161
1195
|
const table = decodeString(buffer);
|
|
1162
1196
|
const id = decodeId(buffer);
|
|
1163
1197
|
const length = decodeLength(buffer);
|
|
@@ -1167,7 +1201,13 @@ export const decryptAndDecodeDbChange = (deps) => (message, key) => {
|
|
|
1167
1201
|
const value = decodeSqliteValue(buffer);
|
|
1168
1202
|
values[column] = value;
|
|
1169
1203
|
}
|
|
1170
|
-
const dbChange = {
|
|
1204
|
+
const dbChange = DbChange.orThrow({
|
|
1205
|
+
table,
|
|
1206
|
+
id,
|
|
1207
|
+
values,
|
|
1208
|
+
isInsert: flags[0],
|
|
1209
|
+
isDelete: flags[1] ? flags[2] : null,
|
|
1210
|
+
});
|
|
1171
1211
|
return ok(dbChange);
|
|
1172
1212
|
}
|
|
1173
1213
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PublicKysely.d.ts","sourceRoot":"","sources":["../../../src/Evolu/PublicKysely.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAGnB,UAAU,EAGV,UAAU,EAEV,eAAe,EACf,QAAQ,EAIT,MAAM,QAAQ,CAAC;AAGhB,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,YAAY,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAGH,wBAAgB,aAAa,CAAC,CAAC,EAC3B,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,GACpC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAIhC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAGH,wBAAgB,cAAc,CAAC,CAAC,EAC5B,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,GACpC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAIhC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAGH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,EACzE,GAAG,EAAE,CAAC,GACL,UAAU,CACX,QAAQ,CAAC;KACN,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAC7D,CAAC,CACH,CAIA;AAEH,UAAU,4BAA4B,CAAC,CAAC,CAAE,SAAQ,mBAAmB,CAAC,CAAC,CAAC;IACtE,IAAI,oBAAoB,IAAI,IAAI,CAAC;IACjC,eAAe,IAAI,eAAe,CAAC;CACpC;AAeD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,MAAM,GACZ,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"PublicKysely.d.ts","sourceRoot":"","sources":["../../../src/Evolu/PublicKysely.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAGnB,UAAU,EAGV,UAAU,EAEV,eAAe,EACf,QAAQ,EAIT,MAAM,QAAQ,CAAC;AAGhB,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,YAAY,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAGH,wBAAgB,aAAa,CAAC,CAAC,EAC3B,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,GACpC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAIhC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAGH,wBAAgB,cAAc,CAAC,CAAC,EAC5B,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,GACpC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAIhC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAGH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,EACzE,GAAG,EAAE,CAAC,GACL,UAAU,CACX,QAAQ,CAAC;KACN,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAC7D,CAAC,CACH,CAIA;AAEH,UAAU,4BAA4B,CAAC,CAAC,CAAE,SAAQ,mBAAmB,CAAC,CAAC,CAAC;IACtE,IAAI,oBAAoB,IAAI,IAAI,CAAC;IACjC,eAAe,IAAI,eAAe,CAAC;CACpC;AAeD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,MAAM,GACZ,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAmBrC"}
|
|
@@ -160,7 +160,6 @@ function getSqliteJsonObjectArgs(node, table) {
|
|
|
160
160
|
}
|
|
161
161
|
export function getJsonObjectArgs(node, table) {
|
|
162
162
|
const args = [];
|
|
163
|
-
args.push(kyselyJsonIdentifier, kyselyJsonIdentifier);
|
|
164
163
|
for (const { selection: s } of node.selections ?? []) {
|
|
165
164
|
if (ReferenceNode.is(s) && ColumnNode.is(s.column)) {
|
|
166
165
|
args.push(colName(s.column.column.name), colRef(table, s.column.column.name));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { Brand } from "../Brand.js";
|
|
1
2
|
import { SqliteQuery, SqliteRow, SqliteValue } from "../Sqlite.js";
|
|
2
3
|
import { Store, StoreSubscribe } from "../Store.js";
|
|
3
4
|
import { Simplify } from "../Types.js";
|
|
4
|
-
import { Brand } from "../Brand.js";
|
|
5
5
|
/**
|
|
6
6
|
* A type-safe SQL query.
|
|
7
7
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Query.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Query.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,OAAO,EAEL,WAAW,EAEX,SAAS,EACT,WAAW,EACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,MAAM,GAC7C,KAAK,CAAC,OAAO,CAAC,GAAG;IACf;;;;;;;;;;;OAWG;IACH,GAAG,EAAE,CAAC,CAAC;CACR,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,GAAG,EAAE,OAAO,WAAW,KAAG,KAAK,CAAC,CAAC,CAYzE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,GAAG,EAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,KACd,WAoBF,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAE7E,MAAM,WAAW,GAAG;IAClB,QAAQ,EAAE,GAAG,EAAE,MAAM,GACjB,WAAW,GACX,GAAG,GACH,aAAa,CAAC,GAAG,CAAC,CAAC;CACxB;AAGD,eAAO,MAAM,SAAS,EAAE,aAAa,CAAC,GAAG,CAAM,CAAC;AAEhD,gCAAgC;AAChC,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,aAAa,CACxD,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CACtB,CAAC;AAEF,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnE,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,OAAO,IAAI;KACjD,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK;CACnE,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,OAAO,IAAI;KACzD,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;CAC5E,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAElE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,CACZ,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,KACnE,IAAI,CAAC;IACV,QAAQ,CAAC,GAAG,EAAE,MAAM,YAAY,CAAC;CAClC;AAED,eAAO,MAAM,oBAAoB,QAAO,cAWvC,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,cAAc,CAAC;IAE5C,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC;IAE/B,GAAG,EAAE,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;CACjC;AAED,eAAO,MAAM,uBAAuB,GAClC,WAAW,KAAK,CAAC,YAAY,CAAC,KAC7B,iBAwBF,CAAC"}
|
package/dist/src/Evolu/Query.js
CHANGED
|
@@ -9,7 +9,7 @@ export const serializeQuery = (query) => {
|
|
|
9
9
|
? ["b", bytesToHex(v)]
|
|
10
10
|
: ["j", v]);
|
|
11
11
|
const options = query.options
|
|
12
|
-
? objectToEntries(query.options).
|
|
12
|
+
? objectToEntries(query.options).toSorted(([a], [b]) => a.localeCompare(b))
|
|
13
13
|
: [];
|
|
14
14
|
return JSON.stringify([query.sql, params, options]);
|
|
15
15
|
};
|