@evolu/common 7.2.1 → 7.2.3
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/Object.d.ts +16 -1
- package/dist/src/Object.d.ts.map +1 -1
- package/dist/src/Object.js +16 -1
- package/dist/src/Order.d.ts +2 -1
- package/dist/src/Order.d.ts.map +1 -1
- package/dist/src/Order.js +1 -0
- package/dist/src/WebSocket.d.ts.map +1 -1
- package/dist/src/WebSocket.js +4 -1
- package/dist/src/local-first/Db.d.ts.map +1 -1
- package/dist/src/local-first/Db.js +5 -11
- package/dist/src/local-first/Diff.js +2 -2
- package/dist/src/local-first/Evolu.d.ts +14 -11
- package/dist/src/local-first/Evolu.d.ts.map +1 -1
- package/dist/src/local-first/Evolu.js +8 -5
- package/dist/src/local-first/Owner.d.ts +39 -42
- package/dist/src/local-first/Owner.d.ts.map +1 -1
- package/dist/src/local-first/Owner.js +22 -29
- package/dist/src/local-first/Protocol.d.ts +6 -6
- package/dist/src/local-first/Protocol.d.ts.map +1 -1
- package/dist/src/local-first/Protocol.js +2 -2
- package/dist/src/local-first/Public.d.ts +1 -0
- package/dist/src/local-first/Public.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/Sync.d.ts +10 -17
- package/dist/src/local-first/Sync.d.ts.map +1 -1
- package/dist/src/local-first/Sync.js +108 -130
- package/dist/src/local-first/Timestamp.d.ts +13 -0
- package/dist/src/local-first/Timestamp.d.ts.map +1 -1
- package/dist/src/local-first/Timestamp.js +14 -1
- package/package.json +1 -1
- package/src/Object.ts +20 -1
- package/src/Order.ts +2 -1
- package/src/WebSocket.ts +6 -1
- package/src/local-first/Db.ts +5 -12
- package/src/local-first/Diff.ts +2 -2
- package/src/local-first/Evolu.ts +27 -15
- package/src/local-first/Owner.ts +47 -57
- package/src/local-first/Protocol.ts +8 -8
- package/src/local-first/Public.ts +1 -0
- package/src/local-first/Storage.ts +3 -3
- package/src/local-first/Sync.ts +123 -175
- package/src/local-first/Timestamp.ts +14 -1
|
@@ -166,7 +166,7 @@ import { EncryptionKey, RandomBytesDep, SymmetricCryptoDecryptError, SymmetricCr
|
|
|
166
166
|
import { Result } from "../Result.js";
|
|
167
167
|
import { SqliteValue } from "../Sqlite.js";
|
|
168
168
|
import { NonNegativeInt, PositiveInt } from "../Type.js";
|
|
169
|
-
import {
|
|
169
|
+
import { Owner, OwnerError, OwnerId, OwnerWriteKey } from "./Owner.js";
|
|
170
170
|
import { BaseRange, CrdtMessage, DbChange, EncryptedCrdtMessage, EncryptedDbChange, FingerprintRange, RangeType, SkipRange, StorageDep } from "./Storage.js";
|
|
171
171
|
import { NodeId, Timestamp } from "./Timestamp.js";
|
|
172
172
|
/**
|
|
@@ -253,7 +253,7 @@ export type ProtocolError = ProtocolVersionError | ProtocolInvalidDataError | Pr
|
|
|
253
253
|
* Represents a version mismatch in the Evolu Protocol. Occurs when the
|
|
254
254
|
* initiator and non-initiator are using incompatible protocol versions.
|
|
255
255
|
*/
|
|
256
|
-
export interface ProtocolVersionError extends
|
|
256
|
+
export interface ProtocolVersionError extends OwnerError {
|
|
257
257
|
readonly type: "ProtocolVersionError";
|
|
258
258
|
readonly version: NonNegativeInt;
|
|
259
259
|
/** Indicates which side is obsolete and should update. */
|
|
@@ -266,14 +266,14 @@ export interface ProtocolInvalidDataError {
|
|
|
266
266
|
readonly error: unknown;
|
|
267
267
|
}
|
|
268
268
|
/** Error when a {@link OwnerWriteKey} is invalid, missing, or fails validation. */
|
|
269
|
-
export interface ProtocolWriteKeyError extends
|
|
269
|
+
export interface ProtocolWriteKeyError extends OwnerError {
|
|
270
270
|
readonly type: "ProtocolWriteKeyError";
|
|
271
271
|
}
|
|
272
272
|
/**
|
|
273
273
|
* Error indicating a serious relay-side write failure. Clients should log this
|
|
274
274
|
* error and show a generic sync error to the user.
|
|
275
275
|
*/
|
|
276
|
-
export interface ProtocolWriteError extends
|
|
276
|
+
export interface ProtocolWriteError extends OwnerError {
|
|
277
277
|
readonly type: "ProtocolWriteError";
|
|
278
278
|
}
|
|
279
279
|
/**
|
|
@@ -289,14 +289,14 @@ export interface ProtocolWriteError extends BaseOwnerError {
|
|
|
289
289
|
* plan. Quota monitoring and management is the relay provider's
|
|
290
290
|
* responsibility.
|
|
291
291
|
*/
|
|
292
|
-
export interface ProtocolQuotaError extends
|
|
292
|
+
export interface ProtocolQuotaError extends OwnerError {
|
|
293
293
|
readonly type: "ProtocolQuotaError";
|
|
294
294
|
}
|
|
295
295
|
/**
|
|
296
296
|
* Error indicating a serious relay-side synchronization failure. Clients should
|
|
297
297
|
* log this error and show a generic sync error to the user.
|
|
298
298
|
*/
|
|
299
|
-
export interface ProtocolSyncError extends
|
|
299
|
+
export interface ProtocolSyncError extends OwnerError {
|
|
300
300
|
readonly type: "ProtocolSyncError";
|
|
301
301
|
}
|
|
302
302
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../../src/local-first/Protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgKG;AAoBH,OAAO,EAA2B,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE7E,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EACL,MAAM,EAMP,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,aAAa,EACb,cAAc,EACd,2BAA2B,EAC3B,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAItB,OAAO,EAAW,MAAM,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAaL,cAAc,EAEd,WAAW,EAEZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../../src/local-first/Protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -182,7 +182,7 @@ import { bytesToHex, bytesToUtf8, createBuffer, hexToBytes, utf8ToBytes, } from
|
|
|
182
182
|
import { createPadmePadding, } from "../Crypto.js";
|
|
183
183
|
import { eqArrayNumber } from "../Eq.js";
|
|
184
184
|
import { computeBalancedBuckets } from "../Number.js";
|
|
185
|
-
import { objectToEntries } from "../Object.js";
|
|
185
|
+
import { createRecord, objectToEntries } from "../Object.js";
|
|
186
186
|
import { err, ok } from "../Result.js";
|
|
187
187
|
import { Base64Url, base64UrlToUint8Array, between, DateIso, Id, idBytesToId, idBytesTypeValueLength, idToIdBytes, Int, Json, jsonToJsonValue, NonNegativeInt, Number, PositiveInt, uint8ArrayToBase64Url, } from "../Type.js";
|
|
188
188
|
import { ownerIdToOwnerIdBytes, ownerWriteKeyLength, } from "./Owner.js";
|
|
@@ -1195,7 +1195,7 @@ export const decryptAndDecodeDbChange = (deps) => (message, key) => {
|
|
|
1195
1195
|
const table = decodeString(buffer);
|
|
1196
1196
|
const id = decodeId(buffer);
|
|
1197
1197
|
const length = decodeLength(buffer);
|
|
1198
|
-
const values =
|
|
1198
|
+
const values = createRecord();
|
|
1199
1199
|
for (let i = 0; i < length; i++) {
|
|
1200
1200
|
const column = decodeString(buffer);
|
|
1201
1201
|
const value = decodeSqliteValue(buffer);
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export { createEvolu } from "./Evolu.js";
|
|
7
7
|
export type { Evolu, EvoluConfig, EvoluDeps, EvoluError } from "./Evolu.js";
|
|
8
|
+
export type { UnuseOwner } from "./Evolu.js";
|
|
8
9
|
export * from "./LocalAuth.js";
|
|
9
10
|
export * from "./Owner.js";
|
|
10
11
|
export * as kysely from "./PublicKysely.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Public.d.ts","sourceRoot":"","sources":["../../../src/local-first/Public.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5E,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAClE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,WAAW,EACX,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,SAAS,EACT,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,cAAc,EACd,6BAA6B,EAC7B,mBAAmB,EACnB,cAAc,EACd,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"Public.d.ts","sourceRoot":"","sources":["../../../src/local-first/Public.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5E,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAClE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,WAAW,EACX,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,SAAS,EACT,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,cAAc,EACd,6BAA6B,EAC7B,mBAAmB,EACnB,cAAc,EACd,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC"}
|
|
@@ -5,7 +5,7 @@ import { Result } from "../Result.js";
|
|
|
5
5
|
import { SqliteDep, SqliteError } from "../Sqlite.js";
|
|
6
6
|
import { MaybeAsync } from "../Task.js";
|
|
7
7
|
import { NonNegativeInt, PositiveInt, TypeError } from "../Type.js";
|
|
8
|
-
import {
|
|
8
|
+
import { OwnerError, OwnerId, OwnerIdBytes, OwnerWriteKey } from "./Owner.js";
|
|
9
9
|
import { Timestamp, TimestampBytes } from "./Timestamp.js";
|
|
10
10
|
export interface StorageConfig {
|
|
11
11
|
/**
|
|
@@ -99,11 +99,11 @@ export interface StorageDep {
|
|
|
99
99
|
readonly storage: Storage;
|
|
100
100
|
}
|
|
101
101
|
/** Error indicating a serious write failure. */
|
|
102
|
-
export interface StorageWriteError extends
|
|
102
|
+
export interface StorageWriteError extends OwnerError {
|
|
103
103
|
readonly type: "StorageWriteError";
|
|
104
104
|
}
|
|
105
105
|
/** Error when storage or billing quota is exceeded. */
|
|
106
|
-
export interface StorageQuotaError extends
|
|
106
|
+
export interface StorageQuotaError extends OwnerError {
|
|
107
107
|
readonly type: "StorageQuotaError";
|
|
108
108
|
}
|
|
109
109
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Storage.d.ts","sourceRoot":"","sources":["../../../src/local-first/Storage.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAW,MAAM,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAO,SAAS,EAAE,WAAW,EAAe,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAKL,cAAc,EAGd,WAAW,EAGX,SAAS,EACV,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"Storage.d.ts","sourceRoot":"","sources":["../../../src/local-first/Storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,21 +6,20 @@ import { RandomDep } from "../Random.js";
|
|
|
6
6
|
import { Result } from "../Result.js";
|
|
7
7
|
import { SqliteDep, SqliteError } from "../Sqlite.js";
|
|
8
8
|
import { TimeDep } from "../Time.js";
|
|
9
|
-
import { DateIso } from "../Type.js";
|
|
10
9
|
import { CreateWebSocketDep } from "../WebSocket.js";
|
|
11
10
|
import type { AppOwnerDep, PostMessageDep } from "./Db.js";
|
|
12
|
-
import { AppOwner,
|
|
11
|
+
import { AppOwner, Owner, OwnerTransport, ReadonlyOwner } from "./Owner.js";
|
|
13
12
|
import { ProtocolError, ProtocolInvalidDataError, ProtocolTimestampMismatchError } from "./Protocol.js";
|
|
14
13
|
import { MutationChange } from "./Schema.js";
|
|
15
|
-
import { BaseSqliteStorage,
|
|
14
|
+
import { BaseSqliteStorage, Storage } from "./Storage.js";
|
|
16
15
|
import { Millis, Timestamp, TimestampConfigDep, TimestampCounterOverflowError, TimestampDriftError, TimestampTimeOutOfRangeError } from "./Timestamp.js";
|
|
17
16
|
export interface Sync extends Disposable {
|
|
18
17
|
/**
|
|
19
18
|
* Assigns or removes an owner to/from transports with reference counting.
|
|
20
19
|
*
|
|
21
|
-
* Owners are only
|
|
22
|
-
* `owner.transports` or falls back to
|
|
23
|
-
* increment/decrement reference counts (useful for React Hooks).
|
|
20
|
+
* Owners are only synced if assigned to at least one transport. Uses
|
|
21
|
+
* `owner.transports` or falls back to {@link SyncConfig} transports. Multiple
|
|
22
|
+
* calls increment/decrement reference counts (useful for React Hooks).
|
|
24
23
|
*/
|
|
25
24
|
readonly useOwner: (use: boolean, owner: SyncOwner) => void;
|
|
26
25
|
readonly applyChanges: (changes: NonEmptyReadonlyArray<MutationChange>) => Result<void, SqliteError | TimestampCounterOverflowError | TimestampDriftError | TimestampTimeOutOfRangeError>;
|
|
@@ -29,18 +28,13 @@ export interface SyncDep {
|
|
|
29
28
|
readonly sync: Sync;
|
|
30
29
|
}
|
|
31
30
|
/**
|
|
32
|
-
* Represents an owner for sync operations.
|
|
33
|
-
* abstracts over the specific owner types ({@link ShardOwner},
|
|
34
|
-
* {@link SharedOwner}, {@link SharedReadonlyOwner}) for the sync layer.
|
|
31
|
+
* Represents an owner for sync operations.
|
|
35
32
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
33
|
+
* Includes readonly owner fields plus optional write key (for clients that
|
|
34
|
+
* write) and optional transports to override SyncConfig transports per owner.
|
|
38
35
|
*/
|
|
39
|
-
export interface SyncOwner {
|
|
40
|
-
readonly
|
|
41
|
-
readonly encryptionKey: OwnerEncryptionKey;
|
|
42
|
-
/** Optional for read-only owners like {@link SharedReadonlyOwner}. */
|
|
43
|
-
readonly writeKey?: OwnerWriteKey;
|
|
36
|
+
export interface SyncOwner extends ReadonlyOwner {
|
|
37
|
+
readonly writeKey?: Owner["writeKey"];
|
|
44
38
|
readonly transports?: ReadonlyArray<OwnerTransport>;
|
|
45
39
|
}
|
|
46
40
|
export interface SyncConfig {
|
|
@@ -69,7 +63,6 @@ export interface ClientStorageDep {
|
|
|
69
63
|
readonly storage: ClientStorage;
|
|
70
64
|
}
|
|
71
65
|
export declare const applyLocalOnlyChange: (deps: SqliteDep & TimeDep & AppOwnerDep) => (change: MutationChange) => Result<void, SqliteError>;
|
|
72
|
-
export declare const applyMessageToTimestampAndHistoryTables: (deps: ClientStorageDep & SqliteDep) => (ownerId: OwnerIdBytes, message: CrdtMessage, strategy: StorageInsertTimestampStrategy, date: DateIso) => Result<void, SqliteError>;
|
|
73
66
|
/**
|
|
74
67
|
* TODO: Rework for the new owners API.
|
|
75
68
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sync.d.ts","sourceRoot":"","sources":["../../../src/local-first/Sync.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Sync.d.ts","sourceRoot":"","sources":["../../../src/local-first/Sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { firstInArray, isNonEmptyReadonlyArray, } from "../Array.js";
|
|
2
|
-
import { assert } from "../Assert.js";
|
|
1
|
+
import { appendToArray, firstInArray, isNonEmptyReadonlyArray, } from "../Array.js";
|
|
2
|
+
import { assert, assertNonEmptyReadonlyArray } from "../Assert.js";
|
|
3
3
|
import { eqArrayNumber } from "../Eq.js";
|
|
4
4
|
import { createTransferableError } from "../Error.js";
|
|
5
5
|
import { constFalse, constTrue } from "../Function.js";
|
|
6
|
-
import { objectToEntries } from "../Object.js";
|
|
6
|
+
import { createRecord, objectToEntries } from "../Object.js";
|
|
7
7
|
import { createResources } from "../Resources.js";
|
|
8
8
|
import { err, ok } from "../Result.js";
|
|
9
|
-
import { booleanToSqliteBoolean, sql, SqliteBoolean, sqliteBooleanToBoolean,
|
|
9
|
+
import { booleanToSqliteBoolean, sql, SqliteBoolean, sqliteBooleanToBoolean, } from "../Sqlite.js";
|
|
10
10
|
import { createMutex } from "../Task.js";
|
|
11
|
-
import { idBytesToId, idToIdBytes, } from "../Type.js";
|
|
11
|
+
import { Boolean, idBytesToId, idToIdBytes, } from "../Type.js";
|
|
12
12
|
import { ownerIdBytesToOwnerId, ownerIdToOwnerIdBytes, } from "./Owner.js";
|
|
13
13
|
import { applyProtocolMessageAsClient, createProtocolMessageForSync, createProtocolMessageForUnsubscribe, createProtocolMessageFromCrdtMessages, decryptAndDecodeDbChange, encodeAndEncryptDbChange, SubscriptionFlags, } from "./Protocol.js";
|
|
14
14
|
import { createBaseSqliteStorage, DbChange, getOwnerUsage, getTimestampInsertStrategy, updateOwnerUsage, } from "./Storage.js";
|
|
@@ -19,7 +19,7 @@ export const createSync = (deps) => (config) => {
|
|
|
19
19
|
const getSyncOwner = (ownerId) => {
|
|
20
20
|
if (isDisposed)
|
|
21
21
|
return null;
|
|
22
|
-
return
|
|
22
|
+
return resources.getConsumer(ownerId);
|
|
23
23
|
};
|
|
24
24
|
const storageResult = createClientStorage({
|
|
25
25
|
...deps,
|
|
@@ -28,21 +28,21 @@ export const createSync = (deps) => (config) => {
|
|
|
28
28
|
if (!storageResult.ok)
|
|
29
29
|
return storageResult;
|
|
30
30
|
const storage = storageResult.value;
|
|
31
|
-
const createResource = (
|
|
32
|
-
const transportKey = createTransportKey(
|
|
31
|
+
const createResource = (transport) => {
|
|
32
|
+
const transportKey = createTransportKey(transport);
|
|
33
33
|
deps.console.log("[sync]", "createWebSocket", {
|
|
34
34
|
transportKey,
|
|
35
|
-
url:
|
|
35
|
+
url: transport.url,
|
|
36
36
|
});
|
|
37
|
-
return deps.createWebSocket(
|
|
37
|
+
return deps.createWebSocket(transport.url, {
|
|
38
38
|
binaryType: "arraybuffer",
|
|
39
39
|
onOpen: () => {
|
|
40
40
|
if (isDisposed)
|
|
41
41
|
return;
|
|
42
|
-
const webSocket =
|
|
42
|
+
const webSocket = resources.getResource(transportKey);
|
|
43
43
|
if (!webSocket)
|
|
44
44
|
return;
|
|
45
|
-
const ownerIds =
|
|
45
|
+
const ownerIds = resources.getConsumersForResource(transportKey);
|
|
46
46
|
deps.console.log("[sync]", "onOpen", { transportKey, ownerIds });
|
|
47
47
|
for (const ownerId of ownerIds) {
|
|
48
48
|
const message = createProtocolMessageForSync({ storage })(ownerId, SubscriptionFlags.Subscribe);
|
|
@@ -67,7 +67,7 @@ export const createSync = (deps) => (config) => {
|
|
|
67
67
|
// Only handle ArrayBuffer data for sync messages
|
|
68
68
|
if (isDisposed || !(data instanceof ArrayBuffer))
|
|
69
69
|
return;
|
|
70
|
-
const webSocket =
|
|
70
|
+
const webSocket = resources.getResource(transportKey);
|
|
71
71
|
if (!webSocket)
|
|
72
72
|
return;
|
|
73
73
|
const input = new Uint8Array(data);
|
|
@@ -102,7 +102,7 @@ export const createSync = (deps) => (config) => {
|
|
|
102
102
|
},
|
|
103
103
|
});
|
|
104
104
|
};
|
|
105
|
-
const
|
|
105
|
+
const resources = createResources({
|
|
106
106
|
createResource,
|
|
107
107
|
getResourceKey: createTransportKey,
|
|
108
108
|
getConsumerId: (owner) => owner.id,
|
|
@@ -135,15 +135,15 @@ export const createSync = (deps) => (config) => {
|
|
|
135
135
|
return;
|
|
136
136
|
}
|
|
137
137
|
deps.console.log("[sync]", "useOwner", { use, owner });
|
|
138
|
-
const
|
|
138
|
+
const transports = owner.transports ?? config.transports;
|
|
139
139
|
if (use) {
|
|
140
|
-
|
|
140
|
+
resources.addConsumer(owner, transports);
|
|
141
141
|
}
|
|
142
142
|
else {
|
|
143
|
-
const result =
|
|
143
|
+
const result = resources.removeConsumer(owner, transports);
|
|
144
144
|
if (!result.ok) {
|
|
145
145
|
deps.console.warn("[sync]", "Failed to remove consumer", {
|
|
146
|
-
|
|
146
|
+
transports,
|
|
147
147
|
ownerId: owner.id,
|
|
148
148
|
error: result.error,
|
|
149
149
|
});
|
|
@@ -182,11 +182,11 @@ export const createSync = (deps) => (config) => {
|
|
|
182
182
|
encryptionKey: owner.encryptionKey,
|
|
183
183
|
writeKey: owner.writeKey,
|
|
184
184
|
}, messages);
|
|
185
|
-
const
|
|
185
|
+
const transports = owner.transports ?? config.transports;
|
|
186
186
|
// Send message to all transports for this owner
|
|
187
|
-
for (const
|
|
188
|
-
const transportKey = createTransportKey(
|
|
189
|
-
const webSocket =
|
|
187
|
+
for (const transport of transports) {
|
|
188
|
+
const transportKey = createTransportKey(transport);
|
|
189
|
+
const webSocket = resources.getResource(transportKey);
|
|
190
190
|
if (!webSocket)
|
|
191
191
|
continue;
|
|
192
192
|
if (webSocket.isOpen()) {
|
|
@@ -201,7 +201,7 @@ export const createSync = (deps) => (config) => {
|
|
|
201
201
|
if (isDisposed)
|
|
202
202
|
return;
|
|
203
203
|
isDisposed = true;
|
|
204
|
-
|
|
204
|
+
resources[Symbol.dispose]();
|
|
205
205
|
},
|
|
206
206
|
};
|
|
207
207
|
return ok(sync);
|
|
@@ -271,11 +271,6 @@ const createClientStorage = (deps) => (config) => {
|
|
|
271
271
|
if (!applyMessagesResult.ok)
|
|
272
272
|
return applyMessagesResult;
|
|
273
273
|
}
|
|
274
|
-
// // Apply local mutations atomically with approved messages
|
|
275
|
-
// for (const change of localMutations) {
|
|
276
|
-
// const result = applyLocalOnlyChange(deps)(change);
|
|
277
|
-
// if (!result.ok) return result;
|
|
278
|
-
// }
|
|
279
274
|
return deps.clock.save(clockTimestamp);
|
|
280
275
|
});
|
|
281
276
|
if (!transaction.ok)
|
|
@@ -306,10 +301,10 @@ const createClientStorage = (deps) => (config) => {
|
|
|
306
301
|
return null;
|
|
307
302
|
}
|
|
308
303
|
const { rows } = result.value;
|
|
309
|
-
|
|
310
|
-
const { table, id } = rows
|
|
311
|
-
const values =
|
|
312
|
-
let isInsert
|
|
304
|
+
assertNonEmptyReadonlyArray(rows, "Every timestamp must have rows");
|
|
305
|
+
const { table, id } = firstInArray(rows);
|
|
306
|
+
const values = createRecord();
|
|
307
|
+
let isInsert;
|
|
313
308
|
let isDelete = null;
|
|
314
309
|
for (const r of rows) {
|
|
315
310
|
assert(r.table === table, "All rows must have the same table");
|
|
@@ -318,14 +313,18 @@ const createClientStorage = (deps) => (config) => {
|
|
|
318
313
|
case "createdAt":
|
|
319
314
|
isInsert = true;
|
|
320
315
|
break;
|
|
316
|
+
case "updatedAt":
|
|
317
|
+
isInsert = false;
|
|
318
|
+
break;
|
|
321
319
|
case "isDeleted":
|
|
322
|
-
assert(SqliteBoolean.is(r.value), "isDeleted column must contain a valid SqliteBoolean
|
|
320
|
+
assert(SqliteBoolean.is(r.value), "isDeleted column must contain a valid SqliteBoolean");
|
|
323
321
|
isDelete = sqliteBooleanToBoolean(r.value);
|
|
324
322
|
break;
|
|
325
323
|
default:
|
|
326
324
|
values[r.column] = r.value;
|
|
327
325
|
}
|
|
328
326
|
}
|
|
327
|
+
assert(Boolean.is(isInsert), "isInsert must be in evolu_history");
|
|
329
328
|
const message = {
|
|
330
329
|
timestamp: timestampBytesToTimestamp(timestamp),
|
|
331
330
|
change: DbChange.orThrow({
|
|
@@ -341,9 +340,24 @@ const createClientStorage = (deps) => (config) => {
|
|
|
341
340
|
};
|
|
342
341
|
return ok(storage);
|
|
343
342
|
};
|
|
344
|
-
/** Creates a unique identifier for a
|
|
345
|
-
const createTransportKey = (
|
|
346
|
-
return `${
|
|
343
|
+
/** Creates a unique identifier for a {@link OwnerTransport}. */
|
|
344
|
+
const createTransportKey = (transport) => {
|
|
345
|
+
return `${transport.type}:${transport.url}`;
|
|
346
|
+
};
|
|
347
|
+
const dbChangeToColumns = (change, now) => {
|
|
348
|
+
let values = objectToEntries(change.values);
|
|
349
|
+
// SystemColumns are not encoded in change.values.
|
|
350
|
+
values = appendToArray(values, [
|
|
351
|
+
change.isInsert ? "createdAt" : "updatedAt",
|
|
352
|
+
now,
|
|
353
|
+
]);
|
|
354
|
+
if (change.isDelete != null) {
|
|
355
|
+
values = appendToArray(values, [
|
|
356
|
+
"isDeleted",
|
|
357
|
+
booleanToSqliteBoolean(change.isDelete),
|
|
358
|
+
]);
|
|
359
|
+
}
|
|
360
|
+
return values;
|
|
347
361
|
};
|
|
348
362
|
export const applyLocalOnlyChange = (deps) => (change) => {
|
|
349
363
|
if (change.isDelete) {
|
|
@@ -355,21 +369,15 @@ export const applyLocalOnlyChange = (deps) => (change) => {
|
|
|
355
369
|
return result;
|
|
356
370
|
}
|
|
357
371
|
else {
|
|
358
|
-
const now = deps.time.nowIso();
|
|
359
372
|
const ownerId = deps.appOwner.id;
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
entries = [...entries, ["isDeleted", sqliteFalse]];
|
|
363
|
-
}
|
|
364
|
-
for (const [column, value] of entries) {
|
|
373
|
+
const columns = dbChangeToColumns(change, deps.time.nowIso());
|
|
374
|
+
for (const [column, value] of columns) {
|
|
365
375
|
const result = deps.sqlite.exec(sql.prepared `
|
|
366
376
|
insert into ${sql.identifier(change.table)}
|
|
367
|
-
("ownerId", "id", ${sql.identifier(column)}
|
|
368
|
-
values (${ownerId}, ${change.id}, ${value}
|
|
377
|
+
("ownerId", "id", ${sql.identifier(column)})
|
|
378
|
+
values (${ownerId}, ${change.id}, ${value})
|
|
369
379
|
on conflict ("ownerId", "id") do update
|
|
370
|
-
set
|
|
371
|
-
${sql.identifier(column)} = ${value},
|
|
372
|
-
updatedAt = ${now};
|
|
380
|
+
set ${sql.identifier(column)} = ${value};
|
|
373
381
|
`);
|
|
374
382
|
if (!result.ok)
|
|
375
383
|
return result;
|
|
@@ -379,21 +387,60 @@ export const applyLocalOnlyChange = (deps) => (change) => {
|
|
|
379
387
|
};
|
|
380
388
|
const applyMessages = (deps) => (ownerId, messages) => {
|
|
381
389
|
const ownerIdBytes = ownerIdToOwnerIdBytes(ownerId);
|
|
382
|
-
const
|
|
383
|
-
if (!
|
|
384
|
-
return
|
|
385
|
-
let { firstTimestamp, lastTimestamp } =
|
|
386
|
-
for (const
|
|
387
|
-
const
|
|
388
|
-
const
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
390
|
+
const usage = getOwnerUsage(deps)(ownerIdBytes, timestampToTimestampBytes(firstInArray(messages).timestamp));
|
|
391
|
+
if (!usage.ok)
|
|
392
|
+
return usage;
|
|
393
|
+
let { firstTimestamp, lastTimestamp } = usage.value;
|
|
394
|
+
for (const { timestamp, change } of messages) {
|
|
395
|
+
const timestampBytes = timestampToTimestampBytes(timestamp);
|
|
396
|
+
const idBytes = idToIdBytes(change.id);
|
|
397
|
+
const columns = dbChangeToColumns(change, timestampToDateIso(timestamp));
|
|
398
|
+
for (const [column, value] of columns) {
|
|
399
|
+
const updateAppTable = deps.sqlite.exec(sql.prepared `
|
|
400
|
+
with
|
|
401
|
+
existingTimestamp as (
|
|
402
|
+
select 1
|
|
403
|
+
from evolu_history
|
|
404
|
+
where
|
|
405
|
+
"ownerId" = ${ownerIdBytes}
|
|
406
|
+
and "table" = ${change.table}
|
|
407
|
+
and "id" = ${idBytes}
|
|
408
|
+
and "column" = ${column}
|
|
409
|
+
and "timestamp" >= ${timestampBytes}
|
|
410
|
+
limit 1
|
|
411
|
+
)
|
|
412
|
+
insert into ${sql.identifier(change.table)}
|
|
413
|
+
("ownerId", "id", ${sql.identifier(column)})
|
|
414
|
+
select ${ownerId}, ${change.id}, ${value}
|
|
415
|
+
where not exists (select 1 from existingTimestamp)
|
|
416
|
+
on conflict ("ownerId", "id") do update
|
|
417
|
+
set ${sql.identifier(column)} = ${value}
|
|
418
|
+
where not exists (select 1 from existingTimestamp);
|
|
419
|
+
`);
|
|
420
|
+
if (!updateAppTable.ok)
|
|
421
|
+
return updateAppTable;
|
|
422
|
+
const insertHistory = deps.sqlite.exec(sql.prepared `
|
|
423
|
+
insert into evolu_history
|
|
424
|
+
("ownerId", "table", "id", "column", "value", "timestamp")
|
|
425
|
+
values
|
|
426
|
+
(
|
|
427
|
+
${ownerIdBytes},
|
|
428
|
+
${change.table},
|
|
429
|
+
${idBytes},
|
|
430
|
+
${column},
|
|
431
|
+
${value},
|
|
432
|
+
${timestampBytes}
|
|
433
|
+
)
|
|
434
|
+
on conflict do nothing;
|
|
435
|
+
`);
|
|
436
|
+
if (!insertHistory.ok)
|
|
437
|
+
return insertHistory;
|
|
438
|
+
}
|
|
392
439
|
let strategy;
|
|
393
|
-
[strategy, firstTimestamp, lastTimestamp] = getTimestampInsertStrategy(
|
|
394
|
-
const
|
|
395
|
-
if (!
|
|
396
|
-
return
|
|
440
|
+
[strategy, firstTimestamp, lastTimestamp] = getTimestampInsertStrategy(timestampBytes, firstTimestamp, lastTimestamp);
|
|
441
|
+
const insertTimestamp = deps.storage.insertTimestamp(ownerIdBytes, timestampBytes, strategy);
|
|
442
|
+
if (!insertTimestamp.ok)
|
|
443
|
+
return insertTimestamp;
|
|
397
444
|
}
|
|
398
445
|
/**
|
|
399
446
|
* TODO: Implement proper storedBytes tracking for client using encrypted
|
|
@@ -406,73 +453,4 @@ const applyMessages = (deps) => (ownerId, messages) => {
|
|
|
406
453
|
return updateUsage;
|
|
407
454
|
return ok();
|
|
408
455
|
};
|
|
409
|
-
const applyMessageToAppTable = (deps) => (ownerIdBytes, message, date) => {
|
|
410
|
-
const ownerId = ownerIdBytesToOwnerId(ownerIdBytes);
|
|
411
|
-
const columns = dbChangeToColumns(message.change, date);
|
|
412
|
-
for (const [column, value] of columns) {
|
|
413
|
-
const result = deps.sqlite.exec(sql.prepared `
|
|
414
|
-
with
|
|
415
|
-
existingTimestamp as (
|
|
416
|
-
select 1
|
|
417
|
-
from evolu_history
|
|
418
|
-
where
|
|
419
|
-
"ownerId" = ${ownerIdBytes}
|
|
420
|
-
and "table" = ${message.change.table}
|
|
421
|
-
and "id" = ${idToIdBytes(message.change.id)}
|
|
422
|
-
and "column" = ${column}
|
|
423
|
-
and "timestamp" >= ${timestampToTimestampBytes(message.timestamp)}
|
|
424
|
-
limit 1
|
|
425
|
-
)
|
|
426
|
-
insert into ${sql.identifier(message.change.table)}
|
|
427
|
-
("ownerId", "id", ${sql.identifier(column)}, updatedAt)
|
|
428
|
-
select ${ownerId}, ${message.change.id}, ${value}, ${date}
|
|
429
|
-
where not exists (select 1 from existingTimestamp)
|
|
430
|
-
on conflict ("ownerId", "id") do update
|
|
431
|
-
set
|
|
432
|
-
${sql.identifier(column)} = ${value},
|
|
433
|
-
updatedAt = ${date}
|
|
434
|
-
where not exists (select 1 from existingTimestamp);
|
|
435
|
-
`);
|
|
436
|
-
if (!result.ok)
|
|
437
|
-
return result;
|
|
438
|
-
}
|
|
439
|
-
return ok();
|
|
440
|
-
};
|
|
441
|
-
export const applyMessageToTimestampAndHistoryTables = (deps) => (ownerId, message, strategy, date) => {
|
|
442
|
-
const timestamp = timestampToTimestampBytes(message.timestamp);
|
|
443
|
-
const id = idToIdBytes(message.change.id);
|
|
444
|
-
const result = deps.storage.insertTimestamp(ownerId, timestamp, strategy);
|
|
445
|
-
if (!result.ok)
|
|
446
|
-
return result;
|
|
447
|
-
const columns = dbChangeToColumns(message.change, date);
|
|
448
|
-
for (const [column, value] of columns) {
|
|
449
|
-
const result = deps.sqlite.exec(sql.prepared `
|
|
450
|
-
insert into evolu_history
|
|
451
|
-
("ownerId", "table", "id", "column", "value", "timestamp")
|
|
452
|
-
values
|
|
453
|
-
(
|
|
454
|
-
${ownerId},
|
|
455
|
-
${message.change.table},
|
|
456
|
-
${id},
|
|
457
|
-
${column},
|
|
458
|
-
${value},
|
|
459
|
-
${timestamp}
|
|
460
|
-
)
|
|
461
|
-
on conflict do nothing;
|
|
462
|
-
`);
|
|
463
|
-
if (!result.ok)
|
|
464
|
-
return result;
|
|
465
|
-
}
|
|
466
|
-
return ok();
|
|
467
|
-
};
|
|
468
|
-
const dbChangeToColumns = (change, date) => {
|
|
469
|
-
const entries = [...objectToEntries(change.values)];
|
|
470
|
-
if (change.isInsert) {
|
|
471
|
-
entries.push(["createdAt", date]);
|
|
472
|
-
}
|
|
473
|
-
if (change.isDelete !== null) {
|
|
474
|
-
entries.push(["isDeleted", booleanToSqliteBoolean(change.isDelete)]);
|
|
475
|
-
}
|
|
476
|
-
return entries;
|
|
477
|
-
};
|
|
478
456
|
export const initialSyncState = { type: "SyncStateInitial" };
|
|
@@ -154,6 +154,19 @@ export type TimestampBytes = typeof TimestampBytes.Type;
|
|
|
154
154
|
export declare const timestampBytesLength: number & import("../Brand.js").Brand<"Int"> & import("../Brand.js").Brand<"NonNegative">;
|
|
155
155
|
export declare const timestampToTimestampBytes: (timestamp: Timestamp) => TimestampBytes;
|
|
156
156
|
export declare const timestampBytesToTimestamp: (timestamp: TimestampBytes) => Timestamp;
|
|
157
|
+
/**
|
|
158
|
+
* An {@link Order} for {@link TimestampBytes}.
|
|
159
|
+
*
|
|
160
|
+
* This `Order` uses lexicographic byte order to compare serialized
|
|
161
|
+
* {@link TimestampBytes} produced by {@link timestampToTimestampBytes}. See
|
|
162
|
+
* {@link orderUint8Array} for the underlying implementation.
|
|
163
|
+
*/
|
|
157
164
|
export declare const orderTimestampBytes: Order<TimestampBytes>;
|
|
165
|
+
/**
|
|
166
|
+
* Convert a {@link Timestamp} to an ISO 8601 {@link DateIso} string.
|
|
167
|
+
*
|
|
168
|
+
* The conversion uses the timestamp's `millis` (a {@link Millis} value) and
|
|
169
|
+
* `Date.prototype.toISOString()` to produce a `DateIso`.
|
|
170
|
+
*/
|
|
158
171
|
export declare const timestampToDateIso: (timestamp: Timestamp) => DateIso;
|
|
159
172
|
//# sourceMappingURL=Timestamp.d.ts.map
|