@evolu/common 8.0.0-next.5 → 8.0.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 (236) hide show
  1. package/dist/src/Array.d.ts +279 -173
  2. package/dist/src/Array.d.ts.map +1 -1
  3. package/dist/src/Array.js +105 -101
  4. package/dist/src/Assert.d.ts +39 -44
  5. package/dist/src/Assert.d.ts.map +1 -1
  6. package/dist/src/Assert.js +38 -31
  7. package/dist/src/BigInt.d.ts +6 -3
  8. package/dist/src/BigInt.d.ts.map +1 -1
  9. package/dist/src/BigInt.js +5 -2
  10. package/dist/src/Brand.d.ts +27 -40
  11. package/dist/src/Brand.d.ts.map +1 -1
  12. package/dist/src/Buffer.d.ts +27 -11
  13. package/dist/src/Buffer.d.ts.map +1 -1
  14. package/dist/src/Cache.d.ts +9 -4
  15. package/dist/src/Cache.d.ts.map +1 -1
  16. package/dist/src/Cache.js +8 -3
  17. package/dist/src/Callbacks.d.ts +30 -19
  18. package/dist/src/Callbacks.d.ts.map +1 -1
  19. package/dist/src/Console.d.ts +145 -66
  20. package/dist/src/Console.d.ts.map +1 -1
  21. package/dist/src/Console.js +91 -43
  22. package/dist/src/Crypto.d.ts +85 -42
  23. package/dist/src/Crypto.d.ts.map +1 -1
  24. package/dist/src/Crypto.js +44 -20
  25. package/dist/src/Eq.d.ts +87 -21
  26. package/dist/src/Eq.d.ts.map +1 -1
  27. package/dist/src/Eq.js +67 -19
  28. package/dist/src/Error.d.ts +3 -3
  29. package/dist/src/Error.d.ts.map +1 -1
  30. package/dist/src/Function.d.ts +119 -58
  31. package/dist/src/Function.d.ts.map +1 -1
  32. package/dist/src/Function.js +86 -43
  33. package/dist/src/Http.d.ts +394 -0
  34. package/dist/src/Http.d.ts.map +1 -0
  35. package/dist/src/Http.js +102 -0
  36. package/dist/src/Identicon.d.ts +16 -7
  37. package/dist/src/Identicon.d.ts.map +1 -1
  38. package/dist/src/Identicon.js +14 -5
  39. package/dist/src/LeakDetector.d.ts +88 -0
  40. package/dist/src/LeakDetector.d.ts.map +1 -0
  41. package/dist/src/LeakDetector.js +86 -0
  42. package/dist/src/LockManager.d.ts +18 -9
  43. package/dist/src/LockManager.d.ts.map +1 -1
  44. package/dist/src/LockManager.js +7 -8
  45. package/dist/src/Lookup.d.ts +43 -13
  46. package/dist/src/Lookup.d.ts.map +1 -1
  47. package/dist/src/Lookup.js +28 -8
  48. package/dist/src/Microtask.d.ts +1 -1
  49. package/dist/src/Microtask.d.ts.map +1 -1
  50. package/dist/src/Microtask.js +3 -7
  51. package/dist/src/Number.d.ts +49 -13
  52. package/dist/src/Number.d.ts.map +1 -1
  53. package/dist/src/Number.js +34 -5
  54. package/dist/src/Object.d.ts +160 -40
  55. package/dist/src/Object.d.ts.map +1 -1
  56. package/dist/src/Object.js +92 -46
  57. package/dist/src/Option.d.ts +10 -7
  58. package/dist/src/Option.d.ts.map +1 -1
  59. package/dist/src/Option.js +9 -6
  60. package/dist/src/Order.d.ts +21 -21
  61. package/dist/src/Order.d.ts.map +1 -1
  62. package/dist/src/Order.js +18 -21
  63. package/dist/src/Platform.d.ts +31 -0
  64. package/dist/src/Platform.d.ts.map +1 -1
  65. package/dist/src/Platform.js +98 -0
  66. package/dist/src/Random.d.ts +32 -17
  67. package/dist/src/Random.d.ts.map +1 -1
  68. package/dist/src/Random.js +12 -8
  69. package/dist/src/Redacted.d.ts +43 -29
  70. package/dist/src/Redacted.d.ts.map +1 -1
  71. package/dist/src/Redacted.js +14 -3
  72. package/dist/src/Ref.d.ts +11 -3
  73. package/dist/src/Ref.d.ts.map +1 -1
  74. package/dist/src/Ref.js +2 -2
  75. package/dist/src/RefCount.d.ts +2 -6
  76. package/dist/src/RefCount.d.ts.map +1 -1
  77. package/dist/src/RefCount.js +33 -90
  78. package/dist/src/Relation.d.ts +70 -5
  79. package/dist/src/Relation.d.ts.map +1 -1
  80. package/dist/src/Relation.js +77 -2
  81. package/dist/src/Resource.d.ts +590 -155
  82. package/dist/src/Resource.d.ts.map +1 -1
  83. package/dist/src/Resource.js +592 -343
  84. package/dist/src/Result.d.ts +838 -191
  85. package/dist/src/Result.d.ts.map +1 -1
  86. package/dist/src/Result.js +163 -102
  87. package/dist/src/Schedule.d.ts +684 -231
  88. package/dist/src/Schedule.d.ts.map +1 -1
  89. package/dist/src/Schedule.js +766 -295
  90. package/dist/src/Set.d.ts +89 -40
  91. package/dist/src/Set.d.ts.map +1 -1
  92. package/dist/src/Set.js +50 -29
  93. package/dist/src/Sqlite.d.ts +29 -72
  94. package/dist/src/Sqlite.d.ts.map +1 -1
  95. package/dist/src/Sqlite.js +39 -45
  96. package/dist/src/StackTrace.d.ts +40 -0
  97. package/dist/src/StackTrace.d.ts.map +1 -0
  98. package/dist/src/StackTrace.js +140 -0
  99. package/dist/src/Store.d.ts +5 -4
  100. package/dist/src/Store.d.ts.map +1 -1
  101. package/dist/src/Store.js +5 -4
  102. package/dist/src/String.d.ts +7 -1
  103. package/dist/src/String.d.ts.map +1 -1
  104. package/dist/src/String.js +20 -7
  105. package/dist/src/Task.d.ts +3428 -1629
  106. package/dist/src/Task.d.ts.map +1 -1
  107. package/dist/src/Task.js +1876 -1279
  108. package/dist/src/Test.d.ts +17 -124
  109. package/dist/src/Test.d.ts.map +1 -1
  110. package/dist/src/Test.js +17 -68
  111. package/dist/src/Time.d.ts +108 -49
  112. package/dist/src/Time.d.ts.map +1 -1
  113. package/dist/src/Time.js +172 -73
  114. package/dist/src/Type.d.ts +3542 -1926
  115. package/dist/src/Type.d.ts.map +1 -1
  116. package/dist/src/Type.js +3070 -1784
  117. package/dist/src/Types.d.ts +200 -100
  118. package/dist/src/Types.d.ts.map +1 -1
  119. package/dist/src/Types.js +39 -8
  120. package/dist/src/WebSocket.d.ts +48 -23
  121. package/dist/src/WebSocket.d.ts.map +1 -1
  122. package/dist/src/WebSocket.js +15 -6
  123. package/dist/src/Worker.d.ts +94 -36
  124. package/dist/src/Worker.d.ts.map +1 -1
  125. package/dist/src/Worker.js +58 -24
  126. package/dist/src/index.d.ts +55 -52
  127. package/dist/src/index.d.ts.map +1 -1
  128. package/dist/src/index.js +3 -1
  129. package/dist/src/intl/cs.d.ts +94 -0
  130. package/dist/src/intl/cs.d.ts.map +1 -0
  131. package/dist/src/intl/cs.js +220 -0
  132. package/dist/src/intl/index.d.ts +7 -0
  133. package/dist/src/intl/index.d.ts.map +1 -0
  134. package/dist/src/intl/index.js +6 -0
  135. package/dist/src/local-first/Db.d.ts +12 -8
  136. package/dist/src/local-first/Db.d.ts.map +1 -1
  137. package/dist/src/local-first/Db.js +107 -130
  138. package/dist/src/local-first/Error.d.ts +4 -4
  139. package/dist/src/local-first/Evolu.d.ts +338 -92
  140. package/dist/src/local-first/Evolu.d.ts.map +1 -1
  141. package/dist/src/local-first/Evolu.js +47 -55
  142. package/dist/src/local-first/LocalAuth.d.ts +4 -4
  143. package/dist/src/local-first/LocalAuth.d.ts.map +1 -1
  144. package/dist/src/local-first/Owner.d.ts +61 -24
  145. package/dist/src/local-first/Owner.d.ts.map +1 -1
  146. package/dist/src/local-first/Owner.js +45 -8
  147. package/dist/src/local-first/Protocol.d.ts +44 -31
  148. package/dist/src/local-first/Protocol.d.ts.map +1 -1
  149. package/dist/src/local-first/Protocol.js +36 -13
  150. package/dist/src/local-first/Query.d.ts +147 -62
  151. package/dist/src/local-first/Query.d.ts.map +1 -1
  152. package/dist/src/local-first/Query.js +112 -58
  153. package/dist/src/local-first/Relay.d.ts +44 -14
  154. package/dist/src/local-first/Relay.d.ts.map +1 -1
  155. package/dist/src/local-first/Schema.d.ts +92 -41
  156. package/dist/src/local-first/Schema.d.ts.map +1 -1
  157. package/dist/src/local-first/Schema.js +25 -8
  158. package/dist/src/local-first/Shared.d.ts +23 -21
  159. package/dist/src/local-first/Shared.d.ts.map +1 -1
  160. package/dist/src/local-first/Shared.js +85 -42
  161. package/dist/src/local-first/Storage.d.ts +53 -32
  162. package/dist/src/local-first/Storage.d.ts.map +1 -1
  163. package/dist/src/local-first/Storage.js +194 -234
  164. package/dist/src/local-first/Timestamp.d.ts +21 -21
  165. package/dist/src/local-first/Timestamp.d.ts.map +1 -1
  166. package/dist/src/local-first/Timestamp.js +2 -2
  167. package/dist/src/local-first/index.d.ts +11 -11
  168. package/package.json +14 -13
  169. package/src/Array.ts +306 -205
  170. package/src/Assert.ts +48 -68
  171. package/src/BigInt.ts +6 -3
  172. package/src/Brand.ts +27 -40
  173. package/src/Buffer.ts +28 -12
  174. package/src/Cache.ts +9 -4
  175. package/src/Callbacks.ts +30 -19
  176. package/src/Console.ts +156 -84
  177. package/src/Crypto.ts +83 -41
  178. package/src/Eq.ts +95 -22
  179. package/src/Error.ts +5 -2
  180. package/src/Function.ts +167 -59
  181. package/src/Http.ts +549 -0
  182. package/src/Identicon.ts +16 -7
  183. package/src/LeakDetector.ts +182 -0
  184. package/src/LockManager.ts +43 -39
  185. package/src/Lookup.ts +62 -28
  186. package/src/Microtask.ts +19 -23
  187. package/src/Number.ts +64 -12
  188. package/src/Object.ts +173 -49
  189. package/src/Option.ts +10 -7
  190. package/src/Order.ts +23 -21
  191. package/src/Platform.ts +136 -0
  192. package/src/Polyfills.ts +6 -12
  193. package/src/Random.ts +32 -19
  194. package/src/Redacted.ts +44 -30
  195. package/src/Ref.ts +14 -6
  196. package/src/RefCount.ts +38 -80
  197. package/src/Relation.ts +202 -10
  198. package/src/Resource.ts +1199 -591
  199. package/src/Result.ts +930 -271
  200. package/src/Schedule.ts +859 -343
  201. package/src/Set.ts +89 -40
  202. package/src/Sqlite.ts +142 -137
  203. package/src/StackTrace.ts +230 -0
  204. package/src/Store.ts +8 -7
  205. package/src/String.ts +22 -5
  206. package/src/Task.ts +5109 -2845
  207. package/src/Test.ts +20 -167
  208. package/src/Time.ts +293 -90
  209. package/src/Type.ts +10034 -4117
  210. package/src/Types.ts +227 -101
  211. package/src/WebSocket.ts +64 -36
  212. package/src/Worker.ts +180 -72
  213. package/src/index.ts +55 -52
  214. package/src/intl/cs.ts +388 -0
  215. package/src/intl/index.ts +7 -0
  216. package/src/local-first/Db.ts +161 -190
  217. package/src/local-first/Error.ts +4 -4
  218. package/src/local-first/Evolu.ts +495 -250
  219. package/src/local-first/LocalAuth.ts +6 -12
  220. package/src/local-first/Owner.ts +58 -21
  221. package/src/local-first/Protocol.ts +49 -31
  222. package/src/local-first/Query.ts +146 -61
  223. package/src/local-first/Relay.ts +51 -21
  224. package/src/local-first/Schema.ts +109 -51
  225. package/src/local-first/Shared.ts +253 -214
  226. package/src/local-first/Storage.ts +266 -264
  227. package/src/local-first/Timestamp.ts +25 -18
  228. package/src/local-first/index.ts +11 -11
  229. package/dist/src/Skiplist.d.ts +0 -28
  230. package/dist/src/Skiplist.d.ts.map +0 -1
  231. package/dist/src/Skiplist.js +0 -64
  232. package/dist/src/Tracer.d.ts +0 -48
  233. package/dist/src/Tracer.d.ts.map +0 -1
  234. package/dist/src/Tracer.js +0 -6
  235. package/src/Skiplist.ts +0 -108
  236. package/src/Tracer.ts +0 -54
@@ -9,25 +9,29 @@ import {
9
9
  firstInArray,
10
10
  type NonEmptyArray,
11
11
  type NonEmptyReadonlyArray,
12
- } from "../Array.js";
13
- import { assert, assertNonEmptyReadonlyArray, assertType } from "../Assert.js";
14
- import type { ConsoleLevel } from "../Console.js";
12
+ } from "../Array.ts";
13
+ import {
14
+ assert,
15
+ assertNonEmptyReadonlyArray,
16
+ assertNonNullable,
17
+ } from "../Assert.ts";
18
+ import type { ConsoleLevel } from "../Console.ts";
15
19
  import {
16
20
  EncryptionKey,
17
21
  type DecryptWithXChaCha20Poly1305Error,
18
22
  type RandomBytesDep,
19
- } from "../Crypto.js";
20
- import { exhaustiveCheck, lazyFalse, lazyVoid } from "../Function.js";
21
- import type { LockManagerDep } from "../LockManager.js";
22
- import { acquireLeaderLock } from "../LockManager.js";
23
- import { createRecord, getProperty, objectToEntries } from "../Object.js";
24
- import { ok, type Result } from "../Result.js";
23
+ } from "../Crypto.ts";
24
+ import { constFalse, constVoid } from "../Function.ts";
25
+ import type { LockManagerDep } from "../LockManager.ts";
26
+ import { acquireLeaderLock } from "../LockManager.ts";
27
+ import { createMutableRecord, getOwnProp, objectToEntries } from "../Object.ts";
28
+ import { ok, type Result } from "../Result.ts";
25
29
  import type {
26
30
  CreateSqliteDriverDep,
27
31
  SqliteDep,
28
32
  SqliteRow,
29
33
  SqliteSchema,
30
- } from "../Sqlite.js";
34
+ } from "../Sqlite.ts";
31
35
  import {
32
36
  booleanToSqliteBoolean,
33
37
  createSqlite,
@@ -36,27 +40,28 @@ import {
36
40
  sqliteBooleanToBoolean,
37
41
  sqliteQueryStringToSqliteQuery,
38
42
  SqliteValue,
39
- } from "../Sqlite.js";
40
- import { callback, type Task } from "../Task.js";
41
- import { Millis, millisToDateIso, type TimeDep } from "../Time.js";
42
- import type { Name } from "../Type.js";
43
+ } from "../Sqlite.ts";
44
+ import { callback, type Run, type Task } from "../Task.ts";
45
+ import { Millis, millisToDateIso, type TimeDep } from "../Time.ts";
43
46
  import {
47
+ assertType,
48
+ type ExtractTyped,
44
49
  Id,
45
50
  IdBytes,
46
51
  idBytesToId,
47
52
  idToIdBytes,
53
+ type Name,
48
54
  onePositiveInt,
49
- } from "../Type.js";
50
- import type { ExtractType } from "../Types.js";
55
+ } from "../Type.ts";
51
56
  import type {
52
57
  CreateBroadcastChannelDep,
53
58
  NativeMessagePort,
54
59
  Worker,
55
60
  WorkerDeps,
56
61
  WorkerSelf,
57
- } from "../Worker.js";
58
- import type { OwnerId, OwnerIdBytes } from "./Owner.js";
59
- import { ownerIdBytesToOwnerId, ownerIdToOwnerIdBytes } from "./Owner.js";
62
+ } from "../Worker.ts";
63
+ import type { OwnerId, OwnerIdBytes } from "./Owner.ts";
64
+ import { ownerIdBytesToOwnerId, ownerIdToOwnerIdBytes } from "./Owner.ts";
60
65
  import {
61
66
  applyProtocolMessageAsClient,
62
67
  createProtocolMessageForSync,
@@ -67,22 +72,22 @@ import {
67
72
  type ProtocolInvalidDataError,
68
73
  type ProtocolMessage,
69
74
  type ProtocolTimestampMismatchError,
70
- } from "./Protocol.js";
71
- import type { Query, RowsByQueryMap } from "./Query.js";
72
- import type { MutationChange, SqliteSchemaDep } from "./Schema.js";
75
+ } from "./Protocol.ts";
76
+ import type { Query, RowsByQueryMap } from "./Query.ts";
77
+ import type { MutationChange, SqliteSchemaDep } from "./Schema.ts";
73
78
  import {
74
79
  ensureSqliteSchema,
75
80
  getEvoluSqliteSchema,
76
81
  systemColumns,
77
- } from "./Schema.js";
82
+ } from "./Schema.ts";
78
83
  import type {
79
84
  ConsoleEntryOrError,
80
85
  DbWorkerInput,
81
86
  DbWorkerOutput,
82
87
  DbWorkerQueuedResponse,
83
88
  DbWorkerRequest,
84
- } from "./Shared.js";
85
- import { consoleEntryOrErrorBroadcastChannelName } from "./Shared.js";
89
+ } from "./Shared.ts";
90
+ import { consoleEntryOrErrorBroadcastChannelName } from "./Shared.ts";
86
91
  import {
87
92
  createBaseSqliteStorage,
88
93
  createBaseSqliteStorageTables,
@@ -94,13 +99,13 @@ import {
94
99
  type BaseSqliteStorageDep,
95
100
  type CrdtMessage,
96
101
  type Storage,
97
- } from "./Storage.js";
102
+ } from "./Storage.ts";
98
103
  import type {
99
104
  Timestamp,
100
105
  TimestampCounterOverflowError,
101
106
  TimestampDriftError,
102
107
  TimestampTimeOutOfRangeError,
103
- } from "./Timestamp.js";
108
+ } from "./Timestamp.ts";
104
109
  import {
105
110
  createInitialTimestamp,
106
111
  defaultTimestampMaxDrift,
@@ -110,7 +115,7 @@ import {
110
115
  timestampBytesToTimestamp,
111
116
  timestampToTimestampBytes,
112
117
  type TimestampConfigDep,
113
- } from "./Timestamp.js";
118
+ } from "./Timestamp.ts";
114
119
 
115
120
  export type DbWorker = Worker<DbWorkerInit>;
116
121
 
@@ -135,6 +140,10 @@ export type DbWorkerDeps = WorkerDeps &
135
140
  LockManagerDep &
136
141
  CreateSqliteDriverDep;
137
142
 
143
+ /**
144
+ * Starts the platform-agnostic Evolu DbWorker and owns its resources until the
145
+ * worker receives a dispose message or its {@link Run} is aborted.
146
+ */
138
147
  export const startDbWorker =
139
148
  (self: WorkerSelf<DbWorkerInit>): Task<void, never, DbWorkerDeps> =>
140
149
  async (run) => {
@@ -142,21 +151,12 @@ export const startDbWorker =
142
151
  disposer.use(self);
143
152
  const { deps } = run;
144
153
 
145
- let initialized = false;
146
-
147
- const initMessage = await run.orThrow(
148
- callback<DbWorkerInit>(({ ok }) => {
149
- self.onMessage = (message) => {
150
- assert(!initialized, "DbWorker must be initialized only once");
151
- initialized = true;
152
- ok(message);
153
- };
154
+ const initMessage = await run.ok(
155
+ callback<DbWorkerInit>(({ resolve }) => {
156
+ self.onMessage = (message) => resolve(ok(message));
154
157
  }),
155
158
  );
156
159
 
157
- const console = deps.console.child(initMessage.name).child("DbWorker");
158
- console.setLevel(initMessage.consoleLevel);
159
-
160
160
  const port = disposer.use(
161
161
  deps.createMessagePort<DbWorkerOutput, DbWorkerInput>(initMessage.port),
162
162
  );
@@ -176,14 +176,11 @@ export const startDbWorker =
176
176
  });
177
177
  }),
178
178
  );
179
- console.debug("createDbWorker");
180
179
 
181
- disposer.use(await run.orThrow(acquireLeaderLock(initMessage.name)));
182
-
183
- port.postMessage({ type: "LeaderAcquired", name: initMessage.name });
180
+ disposer.use(await run.ok(acquireLeaderLock(initMessage.name)));
184
181
 
185
182
  const sqlite = disposer.use(
186
- await run.orThrow(
183
+ await run.ok(
187
184
  createSqlite(
188
185
  initMessage.name,
189
186
  initMessage.memoryOnly
@@ -192,13 +189,8 @@ export const startDbWorker =
192
189
  ),
193
190
  ),
194
191
  );
195
- console.debug("SQLite created");
196
-
197
- const baseSqliteStorage = createBaseSqliteStorage({
198
- sqlite,
199
- ...deps,
200
- });
201
192
 
193
+ const baseSqliteStorage = createBaseSqliteStorage({ sqlite, ...deps });
202
194
  const dbDeps = {
203
195
  ...deps,
204
196
  sqlite,
@@ -206,8 +198,6 @@ export const startDbWorker =
206
198
  baseSqliteStorage,
207
199
  timestampConfig: { maxDrift: defaultTimestampMaxDrift },
208
200
  };
209
- const dbWorkerRun = disposer.use(run.create());
210
-
211
201
  const currentSchema = getEvoluSqliteSchema(dbDeps)();
212
202
  const dbIsInitialized = "evolu_version" in currentSchema.tables;
213
203
  const clock = createClock(dbDeps)(dbIsInitialized);
@@ -226,156 +216,135 @@ export const startDbWorker =
226
216
  });
227
217
  },
228
218
  });
219
+ const dbWorkerRun = disposer.use(run.create({ storage }));
229
220
 
230
- const disposables = disposer.move();
221
+ port.postMessage({ type: "LeaderAcquired", name: initMessage.name });
231
222
 
232
- port.onMessage = (input) => {
233
- if (input.type === "Dispose") {
234
- if (!disposables.disposed) console.debug("disposeDbWorker");
235
- void disposables.disposeAsync();
236
- return;
237
- }
223
+ await run.ok(
224
+ callback<void>(({ resolve }) => {
225
+ port.onMessage = (input) => {
226
+ if (input.type === "Dispose") {
227
+ resolve(ok());
228
+ return;
229
+ }
238
230
 
239
- const { callbackId, request } = input;
231
+ const { callbackId, request } = input;
232
+ const postQueuedResponse = (
233
+ response: DbWorkerQueuedResponse,
234
+ ): void => {
235
+ port.postMessage(
236
+ {
237
+ type: "OnQueuedResponse",
238
+ callbackId,
239
+ response,
240
+ },
241
+ response.type === "ForEvolu" && response.message.type === "Export"
242
+ ? [response.message.file.buffer]
243
+ : undefined,
244
+ );
245
+ };
246
+
247
+ if (request.type === "ForSharedWorker") {
248
+ if (request.message.type === "ApplySyncMessage") {
249
+ const { owner, inputMessage } = request.message;
250
+
251
+ void dbWorkerRun(async (run) => {
252
+ storage.setRequestContext(owner.encryptionKey);
253
+
254
+ const result = await run.abortable(
255
+ applyProtocolMessageAsClient(inputMessage, {
256
+ writeKey: owner.writeKey,
257
+ }),
258
+ );
240
259
 
241
- const postQueuedResponse = (response: DbWorkerQueuedResponse): void => {
242
- port.postMessage(
243
- { type: "OnQueuedResponse", callbackId, response },
244
- response.type === "ForEvolu" && response.message.type === "Export"
245
- ? [response.message.file.buffer]
246
- : undefined,
247
- );
248
- };
249
-
250
- switch (request.type) {
251
- case "ForEvolu": {
252
- switch (request.message.type) {
253
- case "Mutate": {
254
- const result = handleMutation({ ...dbDeps, clock })(
255
- request.message,
256
- );
257
- if (!result.ok) {
258
- consoleEntryOrErrorBroadcastChannel.postMessage({
259
- type: "Error",
260
- error: result.error,
261
- });
262
- } else {
263
260
  postQueuedResponse({
264
- type: "ForEvolu",
265
- id: request.id,
266
- message: result.value,
261
+ type: "ForSharedWorker",
262
+ message: {
263
+ type: "ApplySyncMessage",
264
+ ownerId: owner.id,
265
+ didWriteMessages: storage.didWriteMessages(),
266
+ result,
267
+ },
267
268
  });
268
- }
269
- break;
270
- }
271
269
 
272
- case "Query":
273
- postQueuedResponse({
274
- type: "ForEvolu",
275
- id: request.id,
276
- message: {
277
- type: "Query",
278
- rowsByQuery: loadQueries(dbDeps)(request.message.queries),
279
- },
270
+ return ok();
280
271
  });
281
- break;
282
-
283
- case "Export":
284
- postQueuedResponse({
285
- type: "ForEvolu",
286
- id: request.id,
287
- message: {
288
- type: "Export",
289
- file: dbDeps.sqlite.export(),
290
- },
291
- });
292
- break;
293
-
294
- default:
295
- exhaustiveCheck(request.message);
296
- }
297
- break;
298
- }
272
+ return;
273
+ }
299
274
 
300
- case "ForSharedWorker": {
301
- switch (request.message.type) {
302
- case "CreateSyncMessages": {
303
- const protocolMessagesByOwnerId = new Map<
304
- OwnerId,
305
- ProtocolMessage
306
- >();
275
+ const protocolMessagesByOwnerId = new Map<
276
+ OwnerId,
277
+ ProtocolMessage
278
+ >();
307
279
 
308
- for (const owner of request.message.owners) {
309
- storage.setRequestContext(owner.encryptionKey);
310
- const protocolMessage = createProtocolMessageForSync({
280
+ for (const owner of request.message.owners) {
281
+ storage.setRequestContext(owner.encryptionKey);
282
+ protocolMessagesByOwnerId.set(
283
+ owner.id,
284
+ createProtocolMessageForSync({
311
285
  storage,
312
- console,
313
- })(owner.id, SubscriptionFlags.Subscribe);
314
- protocolMessagesByOwnerId.set(owner.id, protocolMessage);
315
- }
316
-
317
- postQueuedResponse({
318
- type: "ForSharedWorker",
319
- message: {
320
- type: "CreateSyncMessages",
321
- protocolMessagesByOwnerId,
322
- },
323
- });
324
- break;
286
+ console: deps.console,
287
+ })(owner.id, SubscriptionFlags.Subscribe),
288
+ );
325
289
  }
326
290
 
327
- case "ApplySyncMessage": {
328
- const { owner, inputMessage } = request.message;
291
+ postQueuedResponse({
292
+ type: "ForSharedWorker",
293
+ message: {
294
+ type: "CreateSyncMessages",
295
+ protocolMessagesByOwnerId,
296
+ },
297
+ });
298
+ return;
299
+ }
329
300
 
330
- dbWorkerRun<void, never, { readonly storage: ClientStorage }>(
331
- async (run) => {
332
- const { storage } = run.deps;
333
-
334
- storage.setRequestContext(owner.encryptionKey);
335
-
336
- const result = await run(
337
- applyProtocolMessageAsClient(inputMessage, {
338
- writeKey: owner.writeKey,
339
- }),
340
- );
341
-
342
- const didWriteMessages = storage.didWriteMessages();
343
-
344
- postQueuedResponse({
345
- type: "ForSharedWorker",
346
- message: {
347
- type: "ApplySyncMessage",
348
- ownerId: owner.id,
349
- didWriteMessages,
350
- result,
351
- },
352
- });
353
-
354
- return ok();
355
- },
356
- { storage },
357
- );
358
- break;
359
- }
301
+ if (request.message.type === "Query") {
302
+ postQueuedResponse({
303
+ type: "ForEvolu",
304
+ id: request.id,
305
+ message: {
306
+ type: "Query",
307
+ rowsByQuery: loadQueries(dbDeps)(request.message.queries),
308
+ },
309
+ });
310
+ return;
311
+ }
360
312
 
361
- default:
362
- exhaustiveCheck(request.message);
313
+ if (request.message.type === "Export") {
314
+ postQueuedResponse({
315
+ type: "ForEvolu",
316
+ id: request.id,
317
+ message: {
318
+ type: "Export",
319
+ file: sqlite.export(),
320
+ },
321
+ });
322
+ return;
363
323
  }
364
- break;
365
- }
366
324
 
367
- default:
368
- exhaustiveCheck(request);
369
- }
370
- };
325
+ const result = handleMutation({ ...dbDeps, clock })(request.message);
326
+ if (!result.ok) {
327
+ consoleEntryOrErrorBroadcastChannel.postMessage({
328
+ type: "Error",
329
+ error: result.error,
330
+ });
331
+ return;
332
+ }
371
333
 
372
- return ok();
334
+ postQueuedResponse({
335
+ type: "ForEvolu",
336
+ id: request.id,
337
+ message: result.value,
338
+ });
339
+ };
373
340
 
374
- // TODO: Add parallel stale-leader detection.
375
- // Heartbeat is emitted by the active DB worker and sent to
376
- // SharedWorker. SharedWorker tracks last-seen heartbeat per Evolu
377
- // name and if silent for 10 seconds, it waits for another DB worker
378
- // to announce itself alive and then routes requests to that worker.
341
+ return () => {
342
+ port.onMessage = null;
343
+ };
344
+ }),
345
+ );
346
+
347
+ return ok();
379
348
  };
380
349
 
381
350
  /**
@@ -567,7 +536,7 @@ const tryApplyQuarantinedMessages = (
567
536
  const validateColumnValue =
568
537
  (deps: SqliteSchemaDep) =>
569
538
  (table: string, column: string, _value: SqliteValue): boolean => {
570
- const schemaColumns = getProperty(deps.sqliteSchema.tables, table);
539
+ const schemaColumns = getOwnProp(deps.sqliteSchema.tables, table);
571
540
  return (
572
541
  schemaColumns != null &&
573
542
  (systemColumnsWithoutOwnerId.has(column) || schemaColumns.has(column))
@@ -684,8 +653,8 @@ const createClientStorage =
684
653
  didWriteMessages: () => didWriteMessages,
685
654
 
686
655
  // Not implemented yet.
687
- validateWriteKey: lazyFalse,
688
- setWriteKey: lazyVoid,
656
+ validateWriteKey: constFalse,
657
+ setWriteKey: constVoid,
689
658
 
690
659
  writeMessages: (ownerIdBytes, encryptedMessages) => () => {
691
660
  // TODO: Add quota checking for collaborative scenarios.
@@ -753,7 +722,7 @@ const createClientStorage =
753
722
  assertNonEmptyReadonlyArray(rows, "Every timestamp must have rows");
754
723
  const firstRow = firstInArray(rows);
755
724
 
756
- const values = createRecord<string, SqliteValue>();
725
+ const values = createMutableRecord<string, SqliteValue>();
757
726
  let isInsert: DbChange["isInsert"] = false;
758
727
  let isDelete: DbChange["isDelete"] = null;
759
728
 
@@ -801,8 +770,8 @@ const handleMutation =
801
770
  TimestampConfigDep,
802
771
  ) =>
803
772
  (
804
- message: ExtractType<
805
- ExtractType<DbWorkerRequest, "ForEvolu">["message"],
773
+ message: ExtractTyped<
774
+ ExtractTyped<DbWorkerRequest, "ForEvolu">["message"],
806
775
  "Mutate"
807
776
  >,
808
777
  ): Result<
@@ -872,6 +841,7 @@ const applyLocalOnlyChange =
872
841
  const columns = dbChangeToColumns(change, deps.time.now());
873
842
 
874
843
  for (const [column, value] of columns) {
844
+ assertNonNullable(value);
875
845
  deps.sqlite.exec(sql.prepared`
876
846
  insert into ${sql.identifier(change.table)}
877
847
  ("ownerId", "id", ${sql.identifier(column)})
@@ -901,6 +871,7 @@ const applyMessages =
901
871
  const timestampBytes = timestampToTimestampBytes(timestamp);
902
872
 
903
873
  for (const [column, value] of columns) {
874
+ assertNonNullable(value);
904
875
  if (validateColumnValue(deps)(change.table, column, value)) {
905
876
  applyColumnChange(deps)(
906
877
  ownerIdBytes,
@@ -4,10 +4,10 @@
4
4
  * @module
5
5
  */
6
6
 
7
- import type { DecryptWithXChaCha20Poly1305Error } from "../Crypto.js";
8
- import type { UnknownError } from "../Error.js";
9
- import type { ProtocolError } from "./Protocol.js";
10
- import type { TimestampError } from "./Timestamp.js";
7
+ import type { DecryptWithXChaCha20Poly1305Error } from "../Crypto.ts";
8
+ import type { UnknownError } from "../Error.ts";
9
+ import type { ProtocolError } from "./Protocol.ts";
10
+ import type { TimestampError } from "./Timestamp.ts";
11
11
 
12
12
  /** Represents errors that can occur in Evolu. */
13
13
  export type EvoluError =