@evolu/common 8.17.0 → 8.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/src/Bytes.d.ts +31 -14
  2. package/dist/src/Bytes.d.ts.map +1 -1
  3. package/dist/src/Bytes.js +48 -8
  4. package/dist/src/Error.d.ts.map +1 -1
  5. package/dist/src/Error.js +5 -1
  6. package/dist/src/Polyfills.d.ts.map +1 -1
  7. package/dist/src/Polyfills.js +3 -2
  8. package/dist/src/Task.d.ts +4 -3
  9. package/dist/src/Task.d.ts.map +1 -1
  10. package/dist/src/Task.js +4 -3
  11. package/dist/src/local-first/Db.d.ts.map +1 -1
  12. package/dist/src/local-first/Db.js +18 -7
  13. package/dist/src/local-first/Evolu.d.ts +10 -1
  14. package/dist/src/local-first/Evolu.d.ts.map +1 -1
  15. package/dist/src/local-first/Evolu.js +5 -1
  16. package/dist/src/local-first/Protocol.d.ts +215 -93
  17. package/dist/src/local-first/Protocol.d.ts.map +1 -1
  18. package/dist/src/local-first/Protocol.js +799 -489
  19. package/dist/src/local-first/Relay.d.ts +9 -1
  20. package/dist/src/local-first/Relay.d.ts.map +1 -1
  21. package/dist/src/local-first/Relay.js +41 -36
  22. package/dist/src/local-first/Shared.d.ts +75 -49
  23. package/dist/src/local-first/Shared.d.ts.map +1 -1
  24. package/dist/src/local-first/Shared.js +62 -42
  25. package/dist/src/local-first/Storage.d.ts +80 -18
  26. package/dist/src/local-first/Storage.d.ts.map +1 -1
  27. package/dist/src/local-first/Storage.js +20 -4
  28. package/package.json +1 -1
  29. package/src/Bytes.test.ts +212 -0
  30. package/src/Bytes.ts +67 -17
  31. package/src/Error.ts +5 -1
  32. package/src/Polyfills.ts +3 -2
  33. package/src/Task.ts +4 -3
  34. package/src/local-first/Db.ts +29 -14
  35. package/src/local-first/Evolu.test.ts +43 -12
  36. package/src/local-first/Evolu.ts +16 -2
  37. package/src/local-first/Protocol.test.ts +1541 -44
  38. package/src/local-first/Protocol.ts +1070 -605
  39. package/src/local-first/Relay.ts +80 -69
  40. package/src/local-first/Shared.ts +106 -67
  41. package/src/local-first/Storage.ts +100 -27
@@ -34,7 +34,15 @@ export interface RelayConfig extends StorageConfig {
34
34
  *
35
35
  * OwnerId is used rather than short-lived tokens because this only controls
36
36
  * relay access, not write permissions. Since all data is encrypted on the
37
- * relay, OwnerId exposure is safe.
37
+ * relay, OwnerId exposure reveals no data.
38
+ *
39
+ * It does allow write-key squatting. The relay stores the first write key
40
+ * presented for an owner, so anyone who learns an OwnerId before the owner's
41
+ * own write key reaches the relay can claim it. The owner then gets
42
+ * {@link ProtocolWriteKeyError} on this relay until the operator deletes the
43
+ * owner's row in `evolu_writeKey`. This callback does not prevent that: it
44
+ * receives only the OwnerId of a connection, which a squatter can name as
45
+ * well, and every message on the connection can name another owner.
38
46
  *
39
47
  * Owners specify which relays to connect to via `OwnerTransport`. In
40
48
  * WebSocket-based implementations, this check occurs before accepting the
@@ -1 +1 @@
1
- {"version":3,"file":"Relay.d.ts","sourceRoot":"","sources":["../../../src/local-first/Relay.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,IAAI,EAAyC,MAAM,YAAY,CAAC;AACzE,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EACL,OAAO,EAIR,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAEV,iBAAiB,EACjB,OAAO,EACP,aAAa,EAEd,MAAM,cAAc,CAAC;AAStB,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAErB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgFG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CACxB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE;QACP,iEAAiE;QACjE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;KAC9B,KACE,SAAS,CAAC,OAAO,CAAC,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,KAAM,SAAQ,eAAe;IAC5C,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,wBAAwB,SAC5B,iBAAiB,GAAG,kBAAkB,cACpC,aAAa,KAAG,OAyLxB,CAAC;AAEJ,eAAO,MAAM,wBAAwB,SAAU,SAAS,KAAG,IAuB1D,CAAC"}
1
+ {"version":3,"file":"Relay.d.ts","sourceRoot":"","sources":["../../../src/local-first/Relay.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,IAAI,EAAyC,MAAM,YAAY,CAAC;AACzE,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EACL,OAAO,EAIR,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAEV,iBAAiB,EACjB,OAAO,EACP,aAAa,EAEd,MAAM,cAAc,CAAC;AAStB,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAErB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwFG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CACxB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE;QACP,iEAAiE;QACjE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;KAC9B,KACE,SAAS,CAAC,OAAO,CAAC,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,KAAM,SAAQ,eAAe;IAC5C,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,wBAAwB,SAC5B,iBAAiB,GAAG,kBAAkB,cACpC,aAAa,KAAG,OA0LxB,CAAC;AAEJ,eAAO,MAAM,wBAAwB,SAAU,SAAS,KAAG,IAuB1D,CAAC"}
@@ -5,7 +5,8 @@
5
5
  */
6
6
  import { dedupeArray, filterArray, firstInArray, isNonEmptyArray, mapArray, } from "../Array.js";
7
7
  import { assert } from "../Assert.js";
8
- import { err, ok } from "../Result.js";
8
+ import { createUnknownError } from "../Error.js";
9
+ import { err, ok, trySync } from "../Result.js";
9
10
  import { sql } from "../Sqlite.js";
10
11
  import { createMutexByKey } from "../Task.js";
11
12
  import { Name, NonNegativeInt, uint8ArrayToBase64Url } from "../Type.js";
@@ -40,20 +41,15 @@ export const createRelaySqliteStorage = (deps) => (config) => {
40
41
  if (isNonEmptyArray(rows)) {
41
42
  return deps.timingSafeEqual(rows[0].writeKey, writeKey);
42
43
  }
44
+ // When SQLite fails this insert, for example on a full disk, the throw
45
+ // reaches the protocol, which logs it and answers with WriteError,
46
+ // because a boolean has no room for the error.
43
47
  deps.sqlite.exec(sql `
44
48
  insert into evolu_writeKey (ownerId, writeKey)
45
49
  values (${ownerId}, ${writeKey});
46
50
  `);
47
51
  return true;
48
52
  },
49
- setWriteKey: (ownerId, writeKey) => {
50
- deps.sqlite.exec(sql `
51
- insert into evolu_writeKey (ownerId, writeKey)
52
- values (${ownerId}, ${writeKey})
53
- on conflict (ownerId) do update
54
- set writeKey = excluded.writeKey;
55
- `);
56
- },
57
53
  writeMessages: (ownerIdBytes, messages) => async (run) => {
58
54
  const ownerId = ownerIdBytesToOwnerId(ownerIdBytes);
59
55
  const uniqueMessagesWithTimestampBytes = dedupeArray(mapArray(messages, (m) => ({
@@ -61,14 +57,23 @@ export const createRelaySqliteStorage = (deps) => (config) => {
61
57
  change: m.change,
62
58
  })), (message) => uint8ArrayToBase64Url(message.timestamp));
63
59
  return run(mutexByOwnerId.withLock(ownerId, async () => {
64
- const existingTimestampsResult = sqliteStorageBase.getExistingTimestamps(ownerIdBytes, mapArray(uniqueMessagesWithTimestampBytes, (m) => m.timestamp));
65
- const existingTimestampKeys = new Set(mapArray(existingTimestampsResult, uint8ArrayToBase64Url));
66
- const newMessages = filterArray(uniqueMessagesWithTimestampBytes, (message) => !existingTimestampKeys.has(uint8ArrayToBase64Url(message.timestamp)));
67
- // Nothing to write
68
- if (!isNonEmptyArray(newMessages)) {
60
+ // SQLite can fail these reads, for example on a corrupt page, and
61
+ // a throw would panic the relay's shared Run.
62
+ const readResult = trySync(() => {
63
+ const existingTimestampsResult = sqliteStorageBase.getExistingTimestamps(ownerIdBytes, mapArray(uniqueMessagesWithTimestampBytes, (m) => m.timestamp));
64
+ const existingTimestampKeys = new Set(mapArray(existingTimestampsResult, uint8ArrayToBase64Url));
65
+ const newMessages = filterArray(uniqueMessagesWithTimestampBytes, (message) => !existingTimestampKeys.has(uint8ArrayToBase64Url(message.timestamp)));
66
+ // Nothing to write
67
+ if (!isNonEmptyArray(newMessages))
68
+ return null;
69
+ const usage = readOwnerUsageOrDefault(deps)(ownerIdBytes, firstInArray(newMessages).timestamp);
70
+ return { newMessages, usage };
71
+ }, createUnknownError);
72
+ if (!readResult.ok)
73
+ return readResult;
74
+ if (readResult.value === null)
69
75
  return ok();
70
- }
71
- const usage = readOwnerUsageOrDefault(deps)(ownerIdBytes, firstInArray(newMessages).timestamp);
76
+ const { newMessages, usage } = readResult.value;
72
77
  const incomingBytes = newMessages.reduce((sum, m) => sum + m.change.length, 0);
73
78
  // A sum of lengths can be zero. Throwing here would panic the
74
79
  // relay's shared Run.
@@ -84,22 +89,26 @@ export const createRelaySqliteStorage = (deps) => (config) => {
84
89
  });
85
90
  }
86
91
  let { firstTimestamp, lastTimestamp } = usage;
87
- return deps.sqlite.transaction(() => {
88
- for (const { timestamp, change } of newMessages) {
89
- let strategy;
90
- [strategy, firstTimestamp, lastTimestamp] =
91
- getTimestampInsertStrategy(timestamp, firstTimestamp, lastTimestamp);
92
- sqliteStorageBase.insertTimestamp(ownerIdBytes, timestamp, strategy);
93
- deps.sqlite.exec(sql `
94
- insert into evolu_message
95
- ("ownerId", "timestamp", "change")
96
- values (${ownerIdBytes}, ${timestamp}, ${change})
97
- on conflict do nothing;
98
- `);
99
- }
100
- updateOwnerUsage(deps)(ownerIdBytes, newStoredBytes, firstTimestamp, lastTimestamp);
101
- return ok();
102
- });
92
+ // SQLite can fail the write, for example on a full disk. The
93
+ // transaction has rolled back, and a throw would panic the relay's
94
+ // shared Run.
95
+ return trySync(() => {
96
+ deps.sqlite.transaction(() => {
97
+ for (const { timestamp, change } of newMessages) {
98
+ let strategy;
99
+ [strategy, firstTimestamp, lastTimestamp] =
100
+ getTimestampInsertStrategy(timestamp, firstTimestamp, lastTimestamp);
101
+ sqliteStorageBase.insertTimestamp(ownerIdBytes, timestamp, strategy);
102
+ deps.sqlite.exec(sql `
103
+ insert into evolu_message
104
+ ("ownerId", "timestamp", "change")
105
+ values (${ownerIdBytes}, ${timestamp}, ${change})
106
+ on conflict do nothing;
107
+ `);
108
+ }
109
+ updateOwnerUsage(deps)(ownerIdBytes, newStoredBytes, firstTimestamp, lastTimestamp);
110
+ });
111
+ }, createUnknownError);
103
112
  }));
104
113
  },
105
114
  readDbChange: (ownerId, timestamp) => {
@@ -119,12 +128,8 @@ export const createRelaySqliteStorage = (deps) => (config) => {
119
128
  `);
120
129
  deps.sqlite.exec(sql `
121
130
  delete from evolu_message where ownerId = ${ownerId};
122
- `);
123
- deps.sqlite.exec(sql `
124
- delete from evolu_usage where ownerId = ${ownerId};
125
131
  `);
126
132
  sqliteStorageBase.deleteOwner(ownerId);
127
- return ok();
128
133
  });
129
134
  },
130
135
  };
@@ -111,10 +111,10 @@
111
111
  * whichever instance made it, even one disposed before the database worker
112
112
  * answered. When a relay frame stores new messages, the tenant requests a round
113
113
  * through each other transport claimed for the owner, so data learned from one
114
- * relay reaches the others, except through a route that skipped a message, as
115
- * described below. A closed transport reconciles when it opens, and a
116
- * replacement leader reconciles every transport again, because a response
117
- * reporting stored messages may have been lost.
114
+ * relay reaches the others, except through a route that skipped a message it
115
+ * received or could not send, as described below. A closed transport reconciles
116
+ * when it opens, and a replacement leader reconciles every transport again,
117
+ * because a response reporting stored messages may have been lost.
118
118
  *
119
119
  * Relays omit the sending socket when broadcasting an upload, so the uploader
120
120
  * also delivers it as local Broadcast frames to every other tenant with
@@ -178,17 +178,17 @@
178
178
  * request, a replacement leader, or storing messages from another transport,
179
179
  * unless the route skipped a message. No failed or aborted result has arrived
180
180
  * on the route since.
181
- * - No result that skipped a received message has arrived on the route since a
182
- * round was last requested through it, and since that request, no messages
183
- * have been stored from another transport, directly or through a sibling copy
184
- * uploaded outside this transport, and no sibling copy has failed to apply or
185
- * skipped a message.
181
+ * - No result that skipped a received message or a stored change too large to
182
+ * send has arrived on the route since a round was last requested through it,
183
+ * and since that request, no messages have been stored from another
184
+ * transport, directly or through a sibling copy uploaded outside this
185
+ * transport, and no sibling copy has failed to apply or skipped a message.
186
186
  *
187
187
  * A route is settled when every condition except the last holds, so a complete
188
188
  * route is settled too. A settled route that is incomplete has ended its
189
- * reconciliation, but its relay may offer a message the database skipped, or
190
- * messages stored elsewhere may not have reached it; it is published as
191
- * {@link SettledSyncRoute}.
189
+ * reconciliation, but its relay may offer a message the database skipped, the
190
+ * database may store a change too large to send, or messages stored elsewhere
191
+ * may not have reached it; it is published as {@link SettledSyncRoute}.
192
192
  *
193
193
  * A reconciliation chain ends only with a converged result, a failure, an
194
194
  * abort, a dropped frame, or a continuation that finds the socket closed, and
@@ -207,20 +207,34 @@
207
207
  * while the database worker creates a round is logged there and fails the
208
208
  * round's routes with `SyncFailed` without a retry. A mutation that throws is
209
209
  * rolled back and reported as an {@link UnknownError} to the tab that made it,
210
- * or to every tab when its Evolu instance was disposed first. Other unexpected
211
- * SQLite exceptions remain unsupported and can panic the database worker. A
212
- * frame the relay silently drops, such as invalid data, leaves the count above
213
- * zero until the liveness rule below replaces the socket.
214
- *
215
- * A result that skipped a received message the database could not decrypt,
216
- * verify, or decode records the error on the route as its `skippedError`,
217
- * without ending its chain, so it requests no round, and the relay offers the
218
- * message again in every round through the route until the database stores a
219
- * message with that timestamp. The messages received elsewhere that the last
220
- * condition names request no round through such a route, even while a requested
221
- * round checks it again, because each round would download every skipped
222
- * message again. The next round that an explicit request, a reopen, a
223
- * replacement leader, or a failure sends through the route reconciles them.
210
+ * or to every tab when its Evolu instance was disposed first. A received batch
211
+ * SQLite fails to store, for example on a full disk, is rolled back and fails
212
+ * its route with an `UnknownError`. Other unexpected SQLite exceptions remain
213
+ * unsupported and can panic the database worker. A frame the relay silently
214
+ * drops, such as invalid data, leaves the count above zero until the liveness
215
+ * rule below replaces the socket.
216
+ *
217
+ * A result that skipped a message records the error on the route as its
218
+ * `skippedError`, without ending its chain, so it requests no round. A message
219
+ * is skipped in two cases:
220
+ *
221
+ * - The relay offers a message the database could not decrypt, verify, or decode.
222
+ * The relay offers it again in every round through the route until the
223
+ * database stores a message with that timestamp.
224
+ * - The database stores a change it cannot send, a
225
+ * {@link ProtocolChangeTooLargeError}: one saved before `maxMutationSize`
226
+ * existed, or a crafted one received from a relay. Every route through a
227
+ * relay that lacks it skips it on every sync, so each such route stays
228
+ * settled.
229
+ *
230
+ * The messages received elsewhere that the last condition names request no
231
+ * round through such a route, even while a requested round checks it again,
232
+ * because each round would download every skipped message again, or skip again
233
+ * a change too large to send. The next round that an explicit request, a
234
+ * reopen, a replacement leader, or a failure sends through the route reconciles
235
+ * them. So while the database stores a change too large to send, messages from
236
+ * other relays reach a route only through such a round, for example after a
237
+ * reconnect or {@link Evolu.requestSync}.
224
238
  *
225
239
  * ### Liveness
226
240
  *
@@ -273,7 +287,7 @@ import type { BroadcastChannel, SharedWorker as CommonSharedWorker, CreateBroadc
273
287
  import type { DbWorkerInit, UnsupportedDbVersionError } from "./Db.ts";
274
288
  import type { DevicePersistence } from "./Evolu.ts";
275
289
  import type { Owner, OwnerId, SyncOwner } from "./Owner.ts";
276
- import { type ApplyProtocolMessageAsClientResult, type ProtocolError, type ProtocolInvalidDataError, type ProtocolMessage, type ProtocolTimestampMismatchError } from "./Protocol.ts";
290
+ import { type ApplyProtocolMessageAsClientResult, type ProtocolChangeTooLargeError, type ProtocolError, type ProtocolInvalidDataError, type ProtocolMessage, type ProtocolTimestampMismatchError } from "./Protocol.ts";
277
291
  import { type Patch, type Query, type RowsByQueryMap } from "./Query.ts";
278
292
  import { type MutationChange } from "./Schema.ts";
279
293
  import type { CrdtMessage, StorageWriteMessagesError } from "./Storage.ts";
@@ -499,8 +513,9 @@ export interface ReadonlySyncTenantOwner extends Typed<"Readonly"> {
499
513
  }
500
514
  /**
501
515
  * One database's use of one owner through one transport: `Pending` until its
502
- * reconciliation ends, then `Complete`, or `Settled` while its relay offers a
503
- * change the database skipped. See Synchronization completion in this module's
516
+ * reconciliation ends, then `Complete`, or `Settled` while it skips a change:
517
+ * one its relay offers that the database could not store, or one the database
518
+ * stores but cannot send. See Synchronization completion in this module's
504
519
  * documentation.
505
520
  */
506
521
  export type SyncRoute = PendingSyncRoute | SettledSyncRoute | CompleteSyncRoute;
@@ -519,9 +534,12 @@ export interface PendingSyncRoute extends Typed<"Pending"> {
519
534
  */
520
535
  readonly failure: SyncRouteError | null;
521
536
  /**
522
- * The first change skipped in the latest reply that skipped one, or null. The
523
- * relay offers it again in every round through the route until this database
524
- * stores a change with that timestamp.
537
+ * The first change skipped in the latest reply that skipped one, or null. A
538
+ * change the relay offers is offered again in every round through the route
539
+ * until this database stores a change with that timestamp. A
540
+ * {@link ProtocolChangeTooLargeError} is a change this database stores but
541
+ * cannot send, which every route through a relay that lacks it skips on every
542
+ * sync.
525
543
  */
526
544
  readonly skippedError: SyncRouteError | null;
527
545
  /** When the route last became complete, or null. */
@@ -535,10 +553,15 @@ export interface PendingSyncRoute extends Typed<"Pending"> {
535
553
  readonly lastReceivedAt: Millis | null;
536
554
  }
537
555
  /**
538
- * A route whose reconciliation ended while its relay offers a change the
539
- * database skipped, so it is incomplete. Changes stored from other relays
540
- * request no round through it; the next round requested through it, such as by
541
- * {@link Evolu.requestSync} or a reopen, checks it again.
556
+ * A route whose reconciliation ended with a skipped change, so it is
557
+ * incomplete: its relay offers a change the database could not store, or the
558
+ * database stores a change it cannot send, a
559
+ * {@link ProtocolChangeTooLargeError}. Changes stored from other relays request
560
+ * no round through it; the next round requested through it, such as by
561
+ * {@link Evolu.requestSync} or a reopen, checks it again. Every route through a
562
+ * relay that lacks a change too large to send skips it on every sync, so those
563
+ * routes stay settled, and messages from other relays reach them only through
564
+ * such rounds.
542
565
  */
543
566
  export interface SettledSyncRoute extends Typed<"Settled"> {
544
567
  readonly transportId: SyncTransportId;
@@ -570,17 +593,19 @@ export interface CompleteSyncRoute extends Typed<"Complete"> {
570
593
  *
571
594
  * It is the error itself, so it carries its details, such as the expected and
572
595
  * actual timestamps of a {@link ProtocolTimestampMismatchError}. A skipped
573
- * message adds {@link DecryptWithXChaCha20Poly1305Error}. A
574
- * {@link ProtocolInvalidDataError} leaves out its data, which can be a whole
575
- * frame. `WriteFailed` means a `writeMessages` call that threw, logged by the
576
- * protocol, and `SyncFailed` means a logged failure while creating a round or
577
- * reconciling ranges.
596
+ * message adds {@link DecryptWithXChaCha20Poly1305Error} and
597
+ * {@link ProtocolChangeTooLargeError}. A {@link ProtocolInvalidDataError} leaves
598
+ * out its data, which can be a whole frame. An {@link UnknownError} means SQLite
599
+ * failed to store received messages, for example on a full disk. `WriteFailed`
600
+ * means a `writeMessages` call that threw, logged by the protocol, and
601
+ * `SyncFailed` means a logged failure while creating a round or reconciling
602
+ * ranges.
578
603
  */
579
604
  export type SyncRouteError = (Exclude<ProtocolError, ProtocolInvalidDataError> | (Omit<ProtocolInvalidDataError, "data" | "error"> & {
580
605
  readonly error: UnknownError;
581
606
  }) | StorageWriteMessagesError | (Omit<DecryptWithXChaCha20Poly1305Error, "error"> & {
582
607
  readonly error: UnknownError;
583
- }) | Typed<"WriteFailed"> | Typed<"SyncFailed">) & {
608
+ }) | ProtocolChangeTooLargeError | Typed<"WriteFailed"> | Typed<"SyncFailed">) & {
584
609
  readonly at: Millis;
585
610
  };
586
611
  /**
@@ -608,10 +633,10 @@ export interface RelaySyncState {
608
633
  * - `Synced`: a relay is up to date, and none syncs.
609
634
  * - `Offline`: every relay is disconnected. Evolu keeps reconnecting, up to 30
610
635
  * seconds apart, so `Offline` can briefly outlast the outage.
611
- * - `Error`: a relay failed or offers a change this database skipped. `error` is
612
- * the newest failure, or without one, the newest skipped change: a failure
613
- * stops syncing through its relay, while a skipped change leaves out only
614
- * that change.
636
+ * - `Error`: a relay failed, a relay offers a change this database skipped, or
637
+ * this database stores a change too large to send. `error` is the newest
638
+ * failure, or without one, the newest skipped change: a failure stops syncing
639
+ * through its relay, while a skipped change leaves out only that change.
615
640
  *
616
641
  * Evolu stores changes in the local database before they sync, so sync needs no
617
642
  * UI while it works: show nothing for `NoRelays`, `Syncing`, and `Synced`. An
@@ -1037,10 +1062,11 @@ export type DbWorkerQueuedResponse = {
1037
1062
  readonly ownerId: OwnerId;
1038
1063
  readonly didWriteMessages: boolean;
1039
1064
  /**
1040
- * The first error of a received message the DbWorker skipped while
1041
- * storing the rest, or null. It does not end the round.
1065
+ * The first error of a message the DbWorker skipped, or null: a
1066
+ * received one it did not store while storing the rest, or a stored
1067
+ * change too large to send. It does not end the round.
1042
1068
  */
1043
- readonly skippedError: DecryptWithXChaCha20Poly1305Error | ProtocolInvalidDataError | ProtocolTimestampMismatchError | null;
1069
+ readonly skippedError: DecryptWithXChaCha20Poly1305Error | ProtocolInvalidDataError | ProtocolTimestampMismatchError | ProtocolChangeTooLargeError | null;
1044
1070
  readonly result: Result<ApplyProtocolMessageAsClientResult, ProtocolError | StorageWriteMessagesError | AbortError>;
1045
1071
  };
1046
1072
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Shared.d.ts","sourceRoot":"","sources":["../../../src/local-first/Shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Shared.d.ts","sourceRoot":"","sources":["../../../src/local-first/Shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+QG;AAEH,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,aAAa,CAAC;AAQrB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,KAAK,EACV,iCAAiC,EACjC,aAAa,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAgB3E,OAAO,EAAe,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAE,UAAU,EAA4B,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAGL,KAAK,MAAM,EAIZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,EAAE,EACP,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,IAAI,EACT,KAAK,UAAU,EACf,KAAK,KAAK,EACX,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EACV,kBAAkB,EAElB,cAAc,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,IAAI,kBAAkB,EAClC,yBAAyB,EACzB,uBAAuB,EAGvB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,KAAK,EACV,iBAAiB,EAIlB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAkB,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAML,KAAK,kCAAkC,EACvC,KAAK,2BAA2B,EAChC,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EAEpB,KAAK,8BAA8B,EACpC,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,KAAK,EAEV,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhE,MAAM,MAAM,YAAY,GAAG,kBAAkB,CAC3C,iBAAiB,EACjB,kBAAkB,CACnB,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;CACrC;AAED,MAAM,MAAM,iBAAiB,GACzB;IACE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;CACrC,GACD;IACE;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;CACnC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;CAChE,CAAC;AAEN,MAAM,MAAM,eAAe,GAAG,EAAE,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ;IACE;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EACZ,sBAAsB,GAAG,YAAY,GAAG,yBAAyB,CAAC;CACrE,GACD;IACE;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;CACnC,GACD;IACE;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC,CAAC;AAEN,MAAM,MAAM,mBAAmB,GAC3B;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC9B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC9B,CAAC;AAEN,eAAO,MAAM,uCAAuC,iCACpB,CAAC;AAEjC;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,YAClB,gBAAgB,CAAC,mBAAmB,CAAC,SACvC,YAAY,KAClB,IAmBF,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,cAAc,8CAAmC,CAAC;AAC/D,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,iBAAiB,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,UAAU,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,OAAO,cAAc,CAAC;CAC1C,CAGC,CAAC;AACH,MAAM,WAAW,YAAa,SAAQ,SAAS,CAAC,OAAO,YAAY,CAAC;CAAG;AAEvE;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAAU,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,qBAAqB,CAAC,CAAC;CACnD,CAEC,CAAC;AACH,MAAM,WAAW,mBAAoB,SAAQ,SAAS,CACpD,OAAO,mBAAmB,CAC3B;CAAG;AAEJ;;;;;;;;;GASG;AACH,MAAM,WAAW,sBAAuB,SAAQ,KAAK,CAAC,wBAAwB,CAAC;CAAG;AAElF;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC7C;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,sBAAsB,CAAC;AAEnD,yCAAyC;AACzC,MAAM,WAAW,sBAAuB,SAAQ,KAAK,CAAC,WAAW,CAAC;IAChE,yEAAyE;IACzE,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;CACrC;AAED,MAAM,MAAM,eAAe,GAAG,EAAE,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GACxB,wBAAwB,GAAG,kBAAkB,GAAG,0BAA0B,CAAC;AAE7E;;;;GAIG;AACH,MAAM,WAAW,wBAAyB,SAAQ,KAAK,CAAC,YAAY,CAAC;CAAG;AAExE,0BAA0B;AAC1B,MAAM,WAAW,kBAAmB,SAAQ,KAAK,CAAC,MAAM,CAAC;IACvD,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA2B,SAAQ,KAAK,CAAC,cAAc,CAAC;IACvE,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC3C;AAED,gFAAgF;AAChF,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,gBAAiB,SAAQ,KAAK,CAAC,QAAQ,CAAC;IACvD,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,KAAK,CAAC,SAAS,CAAC;IACzD,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,uBAAuB,GAAG,uBAAuB,CAAC;AAEhF;;;;GAIG;AACH,MAAM,WAAW,uBAAwB,SAAQ,KAAK,CAAC,UAAU,CAAC;IAChE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CAC3C;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAwB,SAAQ,KAAK,CAAC,UAAU,CAAC;IAChE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;CACvD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAEhF;;;;GAIG;AACH,MAAM,WAAW,gBAAiB,SAAQ,KAAK,CAAC,SAAS,CAAC;IACxD,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IACxC;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7C,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gBAAiB,SAAQ,KAAK,CAAC,SAAS,CAAC;IACxD,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,qEAAqE;IACrE,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC;IACtC,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,gEAAgE;IAChE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,gFAAgF;AAChF,MAAM,WAAW,iBAAkB,SAAQ,KAAK,CAAC,UAAU,CAAC;IAC1D,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,sCAAsC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,gEAAgE;IAChE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,cAAc,GAAG,CACzB,OAAO,CAAC,aAAa,EAAE,wBAAwB,CAAC,GAChD,CAAC,IAAI,CAAC,wBAAwB,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG;IAClD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC9B,CAAC,GACF,yBAAyB,GACzB,CAAC,IAAI,CAAC,iCAAiC,EAAE,OAAO,CAAC,GAAG;IAClD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC9B,CAAC,GACF,2BAA2B,GAC3B,KAAK,CAAC,aAAa,CAAC,GACpB,KAAK,CAAC,YAAY,CAAC,CACtB,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5B;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkGG;AACH,MAAM,MAAM,eAAe,GAAG,kBAAkB,GAAG,eAAe,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GACzB,iBAAiB,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAE7E,gEAAgE;AAChE,MAAM,WAAW,kBAAmB,SAAQ,KAAK,CAAC,UAAU,CAAC;CAAG;AAEhE,wDAAwD;AACxD,MAAM,WAAW,iBAAkB,SAAQ,KAAK,CAAC,SAAS,CAAC;CAAG;AAE9D,6DAA6D;AAC7D,MAAM,WAAW,gBAAiB,SAAQ,KAAK,CAAC,QAAQ,CAAC;CAAG;AAE5D,gFAAgF;AAChF,MAAM,WAAW,iBAAkB,SAAQ,KAAK,CAAC,SAAS,CAAC;CAAG;AAE9D,6DAA6D;AAC7D,MAAM,WAAW,eAAgB,SAAQ,KAAK,CAAC,OAAO,CAAC;IACrD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiIG;AACH,eAAO,MAAM,0BAA0B,UAC9B,SAAS,GAAG,IAAI,QACjB,IAAI,WACD,OAAO,KACf,eAkDF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,eAAO,MAAM,0BAA0B,UAC9B,SAAS,GAAG,IAAI,QACjB,IAAI,WACD,OAAO,KACf,aAAa,CAAC,cAAc,CAa9B,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,sBAAsB,0BAGhC,cAAc,KAAG,eAcnB,CAAC;AAuBF,MAAM,MAAM,UAAU,GAClB;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC,cAAc,CAAC,CAAC;IACxD,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;IAC1C,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;CAChD,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAC3B;QACE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;QAC1B,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC;KACnC,GACD;QACE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,CACJ,CAAC;CACH,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC;CAC9C,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CACzB,CAAC;AAEN,MAAM,MAAM,WAAW,GACnB;IACE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;CAC3C,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;CACjC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;CACxC,GACD;IACE,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;CAC3C,GACD;IACE,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;CAC/C,CAAC;AAEN,MAAM,MAAM,aAAa,GACrB,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAA;CAAE,GAAG,CAC3C;IACE,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,GACD;IAAE,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,CAC5C,CAAC,GACJ,KAAK,CAAC,SAAS,CAAC,CAAC;AAErB,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG,mBAAmB,CAAC;AAEzE,MAAM,MAAM,oBAAoB,GAC5B;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;CACtD,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;QAClC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;QACtB,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;KACnC,CAAC;CACH,CAAC;AAEN,MAAM,MAAM,mBAAmB,GAC3B;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,UAAU,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC;CAChE,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;QACpC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAC;KAC/C,CAAC;CACH,CAAC;AAEN,MAAM,MAAM,cAAc,GACtB;IACE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC3B,GACD;IACE,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;CAC3C,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;CAC3C,CAAC;AAEN,MAAM,MAAM,sBAAsB,GAC9B;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,OAAO,EACZ;QACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;QAC1B,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CACrC,OAAO,EACP,qBAAqB,CAAC,WAAW,CAAC,CACnC,CAAC;QACF,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;KACtC,GACD;QACE,oEAAoE;QACpE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;QAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;KAC9B,GACD;QACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;QACvB,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;KACtC,GACD;QACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QACxB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;KACxC,CAAC;CACP,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,OAAO,EACZ;QACE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;QACpC,QAAQ,CAAC,yBAAyB,EAAE,WAAW,CAC7C,OAAO,EACP,eAAe,CAChB,CAAC;QACF,mEAAmE;QACnE,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;KAC/C,GACD;QACE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;QAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;QAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;QACnC;;;;WAIG;QACH,QAAQ,CAAC,YAAY,EACjB,iCAAiC,GACjC,wBAAwB,GACxB,8BAA8B,GAC9B,2BAA2B,GAC3B,IAAI,CAAC;QACT,QAAQ,CAAC,MAAM,EAAE,MAAM,CACrB,kCAAkC,EAClC,aAAa,GAAG,yBAAyB,GAAG,UAAU,CACvD,CAAC;KACH,CAAC;CACP,CAAC;AAEN;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACjE;AAED,MAAM,MAAM,gBAAgB,GAAG,UAAU,GACvC,yBAAyB,GACzB,uBAAuB,GACvB,kBAAkB,GAClB,oBAAoB,GACpB,cAAc,CAAC;AAqRjB;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,SAEnB,gBAAgB,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,KAC5D,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,gBAAgB,CAygBpD,CAAC"}
@@ -111,10 +111,10 @@
111
111
  * whichever instance made it, even one disposed before the database worker
112
112
  * answered. When a relay frame stores new messages, the tenant requests a round
113
113
  * through each other transport claimed for the owner, so data learned from one
114
- * relay reaches the others, except through a route that skipped a message, as
115
- * described below. A closed transport reconciles when it opens, and a
116
- * replacement leader reconciles every transport again, because a response
117
- * reporting stored messages may have been lost.
114
+ * relay reaches the others, except through a route that skipped a message it
115
+ * received or could not send, as described below. A closed transport reconciles
116
+ * when it opens, and a replacement leader reconciles every transport again,
117
+ * because a response reporting stored messages may have been lost.
118
118
  *
119
119
  * Relays omit the sending socket when broadcasting an upload, so the uploader
120
120
  * also delivers it as local Broadcast frames to every other tenant with
@@ -178,17 +178,17 @@
178
178
  * request, a replacement leader, or storing messages from another transport,
179
179
  * unless the route skipped a message. No failed or aborted result has arrived
180
180
  * on the route since.
181
- * - No result that skipped a received message has arrived on the route since a
182
- * round was last requested through it, and since that request, no messages
183
- * have been stored from another transport, directly or through a sibling copy
184
- * uploaded outside this transport, and no sibling copy has failed to apply or
185
- * skipped a message.
181
+ * - No result that skipped a received message or a stored change too large to
182
+ * send has arrived on the route since a round was last requested through it,
183
+ * and since that request, no messages have been stored from another
184
+ * transport, directly or through a sibling copy uploaded outside this
185
+ * transport, and no sibling copy has failed to apply or skipped a message.
186
186
  *
187
187
  * A route is settled when every condition except the last holds, so a complete
188
188
  * route is settled too. A settled route that is incomplete has ended its
189
- * reconciliation, but its relay may offer a message the database skipped, or
190
- * messages stored elsewhere may not have reached it; it is published as
191
- * {@link SettledSyncRoute}.
189
+ * reconciliation, but its relay may offer a message the database skipped, the
190
+ * database may store a change too large to send, or messages stored elsewhere
191
+ * may not have reached it; it is published as {@link SettledSyncRoute}.
192
192
  *
193
193
  * A reconciliation chain ends only with a converged result, a failure, an
194
194
  * abort, a dropped frame, or a continuation that finds the socket closed, and
@@ -207,20 +207,34 @@
207
207
  * while the database worker creates a round is logged there and fails the
208
208
  * round's routes with `SyncFailed` without a retry. A mutation that throws is
209
209
  * rolled back and reported as an {@link UnknownError} to the tab that made it,
210
- * or to every tab when its Evolu instance was disposed first. Other unexpected
211
- * SQLite exceptions remain unsupported and can panic the database worker. A
212
- * frame the relay silently drops, such as invalid data, leaves the count above
213
- * zero until the liveness rule below replaces the socket.
210
+ * or to every tab when its Evolu instance was disposed first. A received batch
211
+ * SQLite fails to store, for example on a full disk, is rolled back and fails
212
+ * its route with an `UnknownError`. Other unexpected SQLite exceptions remain
213
+ * unsupported and can panic the database worker. A frame the relay silently
214
+ * drops, such as invalid data, leaves the count above zero until the liveness
215
+ * rule below replaces the socket.
214
216
  *
215
- * A result that skipped a received message the database could not decrypt,
216
- * verify, or decode records the error on the route as its `skippedError`,
217
- * without ending its chain, so it requests no round, and the relay offers the
218
- * message again in every round through the route until the database stores a
219
- * message with that timestamp. The messages received elsewhere that the last
220
- * condition names request no round through such a route, even while a requested
221
- * round checks it again, because each round would download every skipped
222
- * message again. The next round that an explicit request, a reopen, a
223
- * replacement leader, or a failure sends through the route reconciles them.
217
+ * A result that skipped a message records the error on the route as its
218
+ * `skippedError`, without ending its chain, so it requests no round. A message
219
+ * is skipped in two cases:
220
+ *
221
+ * - The relay offers a message the database could not decrypt, verify, or decode.
222
+ * The relay offers it again in every round through the route until the
223
+ * database stores a message with that timestamp.
224
+ * - The database stores a change it cannot send, a
225
+ * {@link ProtocolChangeTooLargeError}: one saved before `maxMutationSize`
226
+ * existed, or a crafted one received from a relay. Every route through a
227
+ * relay that lacks it skips it on every sync, so each such route stays
228
+ * settled.
229
+ *
230
+ * The messages received elsewhere that the last condition names request no
231
+ * round through such a route, even while a requested round checks it again,
232
+ * because each round would download every skipped message again, or skip again
233
+ * a change too large to send. The next round that an explicit request, a
234
+ * reopen, a replacement leader, or a failure sends through the route reconciles
235
+ * them. So while the database stores a change too large to send, messages from
236
+ * other relays reach a route only through such a round, for example after a
237
+ * reconnect or {@link Evolu.requestSync}.
224
238
  *
225
239
  * ### Liveness
226
240
  *
@@ -842,8 +856,9 @@ export const initSharedWorker = (self) => async (run) => {
842
856
  };
843
857
  // Held while this worker runs. Its DbWorkers stop once they can take it,
844
858
  // because a Dispose posted right before this worker closes can be lost, as
845
- // in Firefox. Taken before the build lock, so nothing delays the end of
846
- // starting once that lock is held.
859
+ // in Firefox (https://bugzilla.mozilla.org/show_bug.cgi?id=2077609). Taken
860
+ // before the build lock, so nothing delays the end of starting once that
861
+ // lock is held.
847
862
  disposer.use(await run.ok(acquireLeaderLock(workerId)));
848
863
  // Released after every tenant is disposed and has told its DbWorker to
849
864
  // stop. Earlier releases take the same lock in their leader tab; see
@@ -1588,7 +1603,8 @@ const createEvoluTenant = ({ name, consoleLevel, sqliteSchema, encryptionKey, },
1588
1603
  !hasQueuedWrite;
1589
1604
  // Settling drops the failure, so the next one requests a round
1590
1605
  // again. A route with a skip it is not rechecking settles without
1591
- // completing, because its relay may offer the skipped message or
1606
+ // completing, because its relay may offer the skipped message, the
1607
+ // database may store a change too large to send, or the relay may
1592
1608
  // lack messages stored elsewhere.
1593
1609
  const pending = routeToPending(route.progress);
1594
1610
  route.progress =
@@ -1684,11 +1700,12 @@ const createEvoluTenant = ({ name, consoleLevel, sqliteSchema, encryptionKey, },
1684
1700
  route.lastReceivedAt = now;
1685
1701
  // A skipped message is recorded as the route's skip, not a
1686
1702
  // failure, and does not end the round, whose response below is
1687
- // still sent, so it requests no round. The relay offers the
1688
- // message again in every later round, so the route stays
1689
- // incomplete until a round requested through it settles without
1690
- // skipping a message and without messages stored elsewhere since
1691
- // that request.
1703
+ // still sent, so it requests no round. The relay offers a message
1704
+ // the database could not store again in every later round, and
1705
+ // every round skips a stored change too large to send again, so
1706
+ // the route stays incomplete until a round requested through it
1707
+ // settles without skipping a message and without messages stored
1708
+ // elsewhere since that request.
1692
1709
  if (skippedError !== null)
1693
1710
  route.progress = {
1694
1711
  ...routeToPending(route.progress),
@@ -1712,12 +1729,14 @@ const createEvoluTenant = ({ name, consoleLevel, sqliteSchema, encryptionKey, },
1712
1729
  }
1713
1730
  else if (failure !== null || skippedError !== null) {
1714
1731
  // A sibling's copy comes from this worker, not from a relay, so no
1715
- // route shows its failure. It is a Broadcast, which carries no
1716
- // relay error, so an error or a skip means a bug, such as
1717
- // databases holding different keys for the owner, and is reported
1718
- // as an unexpected failure. A Failed result was logged, which
1719
- // reports it already. An error is the failure, which is never an
1720
- // abort, and like a route, the report leaves out its frame.
1732
+ // route shows its failure. SQLite can fail to store it, for example
1733
+ // on a full disk, which returns an UnknownError. It is a Broadcast,
1734
+ // which carries no relay error, so any other error or a skip means
1735
+ // a bug, such as databases holding different keys for the owner.
1736
+ // Each is reported as an unexpected failure. A Failed result was
1737
+ // logged, which reports it already. An error is the failure, which
1738
+ // is never an abort, and like a route, the report leaves out its
1739
+ // frame.
1721
1740
  const unexpected = error !== null ? failure : skippedError;
1722
1741
  if (unexpected !== null)
1723
1742
  deps.postConsoleEntryOrError({
@@ -1806,9 +1825,10 @@ const createEvoluTenant = ({ name, consoleLevel, sqliteSchema, encryptionKey, },
1806
1825
  * `except`, after messages from elsewhere were stored or a sibling copy was
1807
1826
  * not fully stored. Rounds toward the same transport coalesce whatever
1808
1827
  * their source. A route that skipped a message gets none, because its relay
1809
- * would offer that message again, and a route rechecking one stops
1810
- * rechecking, because its round may have read the database before this
1811
- * event. A later requested round through such a route reconciles it.
1828
+ * would offer that message again or the round would skip a stored change
1829
+ * too large to send again. A route rechecking one stops rechecking, because
1830
+ * its round may have read the database before this event. A later requested
1831
+ * round through such a route reconciles it.
1812
1832
  */
1813
1833
  const requestRoundsForReceivedMessages = (ownerId, { except, afterQueuedWrites, }) => {
1814
1834
  const keys = [];