@evolu/common 6.0.1-preview.33 → 6.0.1-preview.34
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 +11 -11
- package/dist/src/Evolu/Protocol.d.ts +24 -1
- package/dist/src/Evolu/Protocol.d.ts.map +1 -1
- package/dist/src/Evolu/Protocol.js +59 -30
- 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 +24 -20
- package/dist/src/Evolu/Schema.d.ts.map +1 -1
- package/dist/src/Evolu/Schema.js +36 -27
- package/dist/src/Evolu/Storage.d.ts +10 -2
- package/dist/src/Evolu/Storage.d.ts.map +1 -1
- package/dist/src/Evolu/Storage.js +18 -4
- package/dist/src/Evolu/Sync.d.ts +2 -1
- package/dist/src/Evolu/Sync.d.ts.map +1 -1
- package/dist/src/Evolu/Sync.js +45 -33
- 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/Type.d.ts +56 -14
- package/dist/src/Type.d.ts.map +1 -1
- package/dist/src/Type.js +57 -31
- 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 +21 -20
- package/src/Evolu/Protocol.ts +70 -35
- package/src/Evolu/Query.ts +2 -2
- package/src/Evolu/Schema.ts +44 -32
- package/src/Evolu/Storage.ts +40 -2
- package/src/Evolu/Sync.ts +54 -32
- package/src/Evolu/Timestamp.ts +5 -25
- package/src/Object.ts +13 -5
- package/src/Type.ts +57 -35
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 add and update {@link
|
|
176
|
+
* to automatically add and 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 add and update {@link
|
|
220
|
+
* to automatically add and 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 add and update {@link
|
|
272
|
+
* to automatically add and 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,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,EAKT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAmB,MAAM,SAAS,CAAC;AAEvE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAGL,OAAO,EACP,0BAA0B,EAC1B,KAAK,EACL,SAAS,EAET,GAAG,EAGJ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,WAAW,
|
|
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,6 +1,6 @@
|
|
|
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";
|
|
@@ -194,16 +194,16 @@ const createEvoluInstance = (deps) => (schema, config) => {
|
|
|
194
194
|
else {
|
|
195
195
|
const values = { ...result.value };
|
|
196
196
|
delete values.id;
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
197
|
+
const dbChange = DbChange.orThrow({
|
|
198
|
+
table,
|
|
199
|
+
id,
|
|
200
|
+
values,
|
|
201
|
+
isInsert: kind === "insert" || kind === "upsert",
|
|
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);
|
|
@@ -305,7 +305,7 @@ export interface ProtocolSyncError extends BaseOwnerError {
|
|
|
305
305
|
export interface ProtocolTimestampMismatchError {
|
|
306
306
|
readonly type: "ProtocolTimestampMismatchError";
|
|
307
307
|
readonly expected: Timestamp;
|
|
308
|
-
readonly
|
|
308
|
+
readonly timestamp: Timestamp;
|
|
309
309
|
}
|
|
310
310
|
/**
|
|
311
311
|
* Creates a {@link ProtocolMessage} from CRDT messages.
|
|
@@ -408,6 +408,29 @@ version?: number & Brand<"Int"> & Brand<"NonNegative">) => Promise<Result<ApplyP
|
|
|
408
408
|
*/
|
|
409
409
|
export declare const encodeNumber: (buffer: Buffer, number: number) => void;
|
|
410
410
|
export declare const decodeNumber: (buffer: Buffer) => number;
|
|
411
|
+
/**
|
|
412
|
+
* Encodes an array of boolean flags into a single byte.
|
|
413
|
+
*
|
|
414
|
+
* Each element in the array corresponds to a bit (0-7). Array can have 0-8
|
|
415
|
+
* elements.
|
|
416
|
+
*
|
|
417
|
+
* ### Example
|
|
418
|
+
*
|
|
419
|
+
* ```ts
|
|
420
|
+
* encodeFlags(buffer, [true, false, true]); // Encodes bits 0, 1, 2
|
|
421
|
+
* ```
|
|
422
|
+
*/
|
|
423
|
+
export declare const encodeFlags: (buffer: Buffer, flags: ReadonlyArray<boolean>) => void;
|
|
424
|
+
/**
|
|
425
|
+
* Decodes a byte into an array of boolean flags.
|
|
426
|
+
*
|
|
427
|
+
* ### Example
|
|
428
|
+
*
|
|
429
|
+
* ```ts
|
|
430
|
+
* const flags = decodeFlags(buffer, 3); // Decode 3 flags
|
|
431
|
+
* ```
|
|
432
|
+
*/
|
|
433
|
+
export declare const decodeFlags: (buffer: Buffer, count: PositiveInt) => ReadonlyArray<boolean>;
|
|
411
434
|
/**
|
|
412
435
|
* Encodes and encrypts a {@link DbChange} using the provided owner's encryption
|
|
413
436
|
* 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":"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"}
|
|
@@ -170,19 +170,21 @@
|
|
|
170
170
|
* `applyProtocolMessage` function with conditional arguments to reduce code
|
|
171
171
|
* duplication.
|
|
172
172
|
* - ProtocolQuotaError should return storedBytes and actual quota.
|
|
173
|
+
* - Replace try-catch with Result + new Error (to preserve stacktraces). Measure
|
|
174
|
+
* Result overhead, it should be super small.
|
|
173
175
|
*/
|
|
174
176
|
import { Packr } from "msgpackr";
|
|
175
177
|
import { isNonEmptyReadonlyArray } from "../Array.js";
|
|
176
178
|
import { assert } from "../Assert.js";
|
|
177
179
|
import { bytesToHex, bytesToUtf8, createBuffer, hexToBytes, utf8ToBytes, } from "../Buffer.js";
|
|
178
|
-
import {
|
|
180
|
+
import { createPadmePadding, } from "../Crypto.js";
|
|
179
181
|
import { eqArrayNumber } from "../Eq.js";
|
|
180
182
|
import { computeBalancedBuckets } from "../Number.js";
|
|
181
183
|
import { objectToEntries } from "../Object.js";
|
|
182
184
|
import { err, ok } from "../Result.js";
|
|
183
185
|
import { Base64Url, base64UrlToUint8Array, between, DateIso, Id, idBytesToId, idBytesTypeValueLength, idToIdBytes, Int, Json, jsonToJsonValue, NonNegativeInt, Number, PositiveInt, uint8ArrayToBase64Url, } from "../Type.js";
|
|
184
186
|
import { ownerIdToOwnerIdBytes, ownerWriteKeyLength, } from "./Owner.js";
|
|
185
|
-
import { fingerprintSize, InfiniteUpperBound, RangeType, } from "./Storage.js";
|
|
187
|
+
import { DbChange, fingerprintSize, InfiniteUpperBound, RangeType, } from "./Storage.js";
|
|
186
188
|
import { Counter, eqTimestamp, Millis, timestampBytesLength, timestampBytesToTimestamp, timestampToTimestampBytes, } from "./Timestamp.js";
|
|
187
189
|
/**
|
|
188
190
|
* Evolu uses MessagePack for numbers and JSONs.
|
|
@@ -535,8 +537,6 @@ const createRunLengthEncoder = (encodeValue) => {
|
|
|
535
537
|
};
|
|
536
538
|
};
|
|
537
539
|
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
540
|
try {
|
|
541
541
|
const input = createBuffer(inputMessage);
|
|
542
542
|
const [requestedVersion, ownerId] = decodeVersionAndOwner(input);
|
|
@@ -628,8 +628,6 @@ export const applyProtocolMessageAsClient = (deps) => async (inputMessage, optio
|
|
|
628
628
|
export const applyProtocolMessageAsRelay = (deps) => async (inputMessage, options = {},
|
|
629
629
|
/** For tests only. */
|
|
630
630
|
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
631
|
try {
|
|
634
632
|
const input = createBuffer(inputMessage);
|
|
635
633
|
const [requestedVersion, ownerId] = decodeVersionAndOwner(input);
|
|
@@ -1092,6 +1090,44 @@ export const decodeNumber = (buffer) => {
|
|
|
1092
1090
|
buffer.shiftN(endResult.value);
|
|
1093
1091
|
return numberResult.value;
|
|
1094
1092
|
};
|
|
1093
|
+
/**
|
|
1094
|
+
* Encodes an array of boolean flags into a single byte.
|
|
1095
|
+
*
|
|
1096
|
+
* Each element in the array corresponds to a bit (0-7). Array can have 0-8
|
|
1097
|
+
* elements.
|
|
1098
|
+
*
|
|
1099
|
+
* ### Example
|
|
1100
|
+
*
|
|
1101
|
+
* ```ts
|
|
1102
|
+
* encodeFlags(buffer, [true, false, true]); // Encodes bits 0, 1, 2
|
|
1103
|
+
* ```
|
|
1104
|
+
*/
|
|
1105
|
+
export const encodeFlags = (buffer, flags) => {
|
|
1106
|
+
let byte = 0;
|
|
1107
|
+
for (let i = 0; i < flags.length && i < 8; i++) {
|
|
1108
|
+
if (flags[i]) {
|
|
1109
|
+
byte |= 1 << i;
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
buffer.extend([byte]);
|
|
1113
|
+
};
|
|
1114
|
+
/**
|
|
1115
|
+
* Decodes a byte into an array of boolean flags.
|
|
1116
|
+
*
|
|
1117
|
+
* ### Example
|
|
1118
|
+
*
|
|
1119
|
+
* ```ts
|
|
1120
|
+
* const flags = decodeFlags(buffer, 3); // Decode 3 flags
|
|
1121
|
+
* ```
|
|
1122
|
+
*/
|
|
1123
|
+
export const decodeFlags = (buffer, count) => {
|
|
1124
|
+
const byte = buffer.shift();
|
|
1125
|
+
const flags = [];
|
|
1126
|
+
for (let i = 0; i < count && i < 8; i++) {
|
|
1127
|
+
flags.push((byte & (1 << i)) !== 0);
|
|
1128
|
+
}
|
|
1129
|
+
return flags;
|
|
1130
|
+
};
|
|
1095
1131
|
/**
|
|
1096
1132
|
* Encodes and encrypts a {@link DbChange} using the provided owner's encryption
|
|
1097
1133
|
* key. Returns an encrypted binary representation as {@link EncryptedDbChange}.
|
|
@@ -1101,26 +1137,22 @@ export const decodeNumber = (buffer) => {
|
|
|
1101
1137
|
* data.
|
|
1102
1138
|
*/
|
|
1103
1139
|
export const encodeAndEncryptDbChange = (deps) => (message, key) => {
|
|
1104
|
-
const change = message.change;
|
|
1105
1140
|
const buffer = createBuffer();
|
|
1106
|
-
// Encode protocol version first for backward compatibility
|
|
1107
1141
|
encodeNonNegativeInt(buffer, protocolVersion);
|
|
1108
|
-
// Encode the timestamp (
|
|
1109
|
-
|
|
1110
|
-
buffer.extend(
|
|
1111
|
-
|
|
1112
|
-
buffer.
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
});
|
|
1142
|
+
// Encode the timestamp to prevent tampering (e.g., a malicious relay
|
|
1143
|
+
// assigning this EncryptedDbChange to a different EncryptedCrdtMessage)
|
|
1144
|
+
buffer.extend(timestampToTimestampBytes(message.timestamp));
|
|
1145
|
+
encodeFlags(buffer, [message.change.isInsert]);
|
|
1146
|
+
encodeString(buffer, message.change.table);
|
|
1147
|
+
buffer.extend(idToIdBytes(message.change.id));
|
|
1148
|
+
const entries = objectToEntries(message.change.values);
|
|
1116
1149
|
encodeLength(buffer, entries);
|
|
1117
1150
|
for (const [column, value] of entries) {
|
|
1118
1151
|
encodeString(buffer, column);
|
|
1119
1152
|
encodeSqliteValue(buffer, value);
|
|
1120
1153
|
}
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
buffer.extend(new Uint8Array(paddingLength));
|
|
1154
|
+
// Add PADMÉ padding (ignored during decoding)
|
|
1155
|
+
buffer.extend(createPadmePadding(buffer.getLength()));
|
|
1124
1156
|
const { nonce, ciphertext } = deps.symmetricCrypto.encrypt(buffer.unwrap(), key);
|
|
1125
1157
|
buffer.reset();
|
|
1126
1158
|
buffer.extend(nonce);
|
|
@@ -1134,30 +1166,27 @@ export const encodeAndEncryptDbChange = (deps) => (message, key) => {
|
|
|
1134
1166
|
* expected timestamp to ensure message integrity.
|
|
1135
1167
|
*/
|
|
1136
1168
|
export const decryptAndDecodeDbChange = (deps) => (message, key) => {
|
|
1137
|
-
// try-catch instead of Result for performance and stacktraces
|
|
1138
1169
|
try {
|
|
1139
1170
|
const buffer = createBuffer(message.change);
|
|
1140
1171
|
const nonce = buffer.shiftN(deps.symmetricCrypto.nonceLength);
|
|
1141
|
-
const
|
|
1142
|
-
const ciphertext = buffer.shiftN(ciphertextLength);
|
|
1172
|
+
const ciphertext = buffer.shiftN(decodeLength(buffer));
|
|
1143
1173
|
const plaintextBytes = deps.symmetricCrypto.decrypt(ciphertext, key, nonce);
|
|
1144
1174
|
if (!plaintextBytes.ok)
|
|
1145
1175
|
return plaintextBytes;
|
|
1146
1176
|
buffer.reset();
|
|
1147
1177
|
buffer.extend(plaintextBytes.value);
|
|
1148
|
-
// Decode version (for future compatibility,
|
|
1178
|
+
// Decode version (for future compatibility, not need yet)
|
|
1149
1179
|
decodeNonNegativeInt(buffer);
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
const embeddedTimestamp = timestampBytesToTimestamp(embeddedTimestampBytes);
|
|
1153
|
-
// Verify timestamp integrity
|
|
1154
|
-
if (!eqTimestamp(embeddedTimestamp, message.timestamp)) {
|
|
1180
|
+
const timestamp = timestampBytesToTimestamp(buffer.shiftN(timestampBytesLength));
|
|
1181
|
+
if (!eqTimestamp(timestamp, message.timestamp)) {
|
|
1155
1182
|
return err({
|
|
1156
1183
|
type: "ProtocolTimestampMismatchError",
|
|
1157
1184
|
expected: message.timestamp,
|
|
1158
|
-
|
|
1185
|
+
timestamp,
|
|
1159
1186
|
});
|
|
1160
1187
|
}
|
|
1188
|
+
const flags = decodeFlags(buffer, PositiveInt.orThrow(1));
|
|
1189
|
+
const isInsert = flags[0];
|
|
1161
1190
|
const table = decodeString(buffer);
|
|
1162
1191
|
const id = decodeId(buffer);
|
|
1163
1192
|
const length = decodeLength(buffer);
|
|
@@ -1167,7 +1196,7 @@ export const decryptAndDecodeDbChange = (deps) => (message, key) => {
|
|
|
1167
1196
|
const value = decodeSqliteValue(buffer);
|
|
1168
1197
|
values[column] = value;
|
|
1169
1198
|
}
|
|
1170
|
-
const dbChange = { table, id, values };
|
|
1199
|
+
const dbChange = DbChange.orThrow({ table, id, values, isInsert });
|
|
1171
1200
|
return ok(dbChange);
|
|
1172
1201
|
}
|
|
1173
1202
|
catch (error) {
|
|
@@ -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
|
};
|