@evolu/common 8.0.0-next.3 → 8.0.0-next.5

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 (81) hide show
  1. package/dist/src/Assert.d.ts +10 -5
  2. package/dist/src/Assert.d.ts.map +1 -1
  3. package/dist/src/Assert.js +10 -5
  4. package/dist/src/Error.d.ts +5 -3
  5. package/dist/src/Error.d.ts.map +1 -1
  6. package/dist/src/Error.js +16 -0
  7. package/dist/src/Identicon.js +4 -4
  8. package/dist/src/LockManager.d.ts +74 -0
  9. package/dist/src/LockManager.d.ts.map +1 -0
  10. package/dist/src/LockManager.js +103 -0
  11. package/dist/src/Microtask.d.ts.map +1 -1
  12. package/dist/src/Microtask.js +90 -26
  13. package/dist/src/Object.d.ts.map +1 -1
  14. package/dist/src/RefCount.d.ts.map +1 -1
  15. package/dist/src/RefCount.js +153 -68
  16. package/dist/src/Resource.d.ts +6 -6
  17. package/dist/src/Resource.d.ts.map +1 -1
  18. package/dist/src/Resource.js +211 -162
  19. package/dist/src/Schedule.d.ts +5 -5
  20. package/dist/src/Schedule.d.ts.map +1 -1
  21. package/dist/src/Schedule.js +53 -44
  22. package/dist/src/Sqlite.d.ts +2 -0
  23. package/dist/src/Sqlite.d.ts.map +1 -1
  24. package/dist/src/Sqlite.js +66 -41
  25. package/dist/src/Task.d.ts +99 -123
  26. package/dist/src/Task.d.ts.map +1 -1
  27. package/dist/src/Task.js +273 -256
  28. package/dist/src/Test.d.ts +14 -15
  29. package/dist/src/Test.d.ts.map +1 -1
  30. package/dist/src/Time.d.ts +5 -0
  31. package/dist/src/Time.d.ts.map +1 -1
  32. package/dist/src/Time.js +5 -0
  33. package/dist/src/Type.d.ts +7 -0
  34. package/dist/src/Type.d.ts.map +1 -1
  35. package/dist/src/Type.js +7 -0
  36. package/dist/src/Types.d.ts +0 -8
  37. package/dist/src/Types.d.ts.map +1 -1
  38. package/dist/src/WebSocket.d.ts.map +1 -1
  39. package/dist/src/WebSocket.js +7 -6
  40. package/dist/src/Worker.d.ts +42 -8
  41. package/dist/src/Worker.d.ts.map +1 -1
  42. package/dist/src/Worker.js +292 -112
  43. package/dist/src/index.d.ts +1 -0
  44. package/dist/src/index.d.ts.map +1 -1
  45. package/dist/src/index.js +1 -0
  46. package/dist/src/local-first/Db.d.ts +5 -4
  47. package/dist/src/local-first/Db.d.ts.map +1 -1
  48. package/dist/src/local-first/Db.js +43 -37
  49. package/dist/src/local-first/Evolu.d.ts +3 -2
  50. package/dist/src/local-first/Evolu.d.ts.map +1 -1
  51. package/dist/src/local-first/Evolu.js +90 -80
  52. package/dist/src/local-first/Owner.d.ts.map +1 -1
  53. package/dist/src/local-first/Shared.d.ts +65 -54
  54. package/dist/src/local-first/Shared.d.ts.map +1 -1
  55. package/dist/src/local-first/Shared.js +390 -376
  56. package/package.json +1 -1
  57. package/src/Array.ts +8 -8
  58. package/src/Assert.ts +11 -6
  59. package/src/Error.ts +5 -4
  60. package/src/Identicon.ts +4 -4
  61. package/src/LockManager.ts +181 -0
  62. package/src/Microtask.ts +17 -11
  63. package/src/Object.ts +3 -3
  64. package/src/RefCount.ts +25 -21
  65. package/src/Resource.ts +63 -56
  66. package/src/Schedule.ts +70 -48
  67. package/src/Set.ts +4 -4
  68. package/src/Sqlite.ts +43 -31
  69. package/src/Task.ts +392 -430
  70. package/src/Test.ts +14 -15
  71. package/src/Time.ts +7 -0
  72. package/src/Type.ts +9 -0
  73. package/src/Types.ts +0 -9
  74. package/src/WebSocket.ts +7 -6
  75. package/src/Worker.ts +195 -53
  76. package/src/index.ts +1 -0
  77. package/src/local-first/Db.ts +86 -61
  78. package/src/local-first/Evolu.ts +74 -68
  79. package/src/local-first/Owner.ts +1 -1
  80. package/src/local-first/Query.ts +1 -1
  81. package/src/local-first/Shared.ts +485 -476
@@ -3,10 +3,11 @@
3
3
  *
4
4
  * @module
5
5
  */
6
+ import { assertType } from "./Assert.js";
6
7
  import { fibonacciAt, FibonacciIndex, increment } from "./Number.js";
7
8
  import { done, err, ok } from "./Result.js";
8
- import { durationToMillis, Millis, minMillis, } from "./Time.js";
9
- import { onePositiveInt, PositiveInt } from "./Type.js";
9
+ import { durationToMillis, Millis, minMillis, saturateMillis, } from "./Time.js";
10
+ import { NonNegativeFiniteNumber, NonNegativeInt, onePositiveInt, PositiveInt, } from "./Type.js";
10
11
  /**
11
12
  * Creates an internal per-step metrics tracker.
12
13
  *
@@ -19,10 +20,10 @@ const createScheduleStepMetrics = (deps) => {
19
20
  return () => {
20
21
  const now = deps.time.now();
21
22
  const currentAttempt = attempt;
22
- attempt = increment(attempt);
23
+ attempt = PositiveInt.orThrow(increment(attempt));
23
24
  start ??= now;
24
- const elapsed = (now - start);
25
- const elapsedSincePrevious = previous === null ? 0 : (now - previous);
25
+ const elapsed = saturateMillis(now - start);
26
+ const elapsedSincePrevious = previous === null ? minMillis : saturateMillis(now - previous);
26
27
  previous = now;
27
28
  return { attempt: currentAttempt, elapsed, elapsedSincePrevious };
28
29
  };
@@ -134,14 +135,17 @@ export const spaced = (duration) => () => {
134
135
  *
135
136
  * @group Constructors
136
137
  */
137
- export const exponential = (base, factor = 2) => () => {
138
- const baseMs = durationToMillis(base);
139
- let attempt = 0;
138
+ export const exponential = (base, factor = 2) => {
139
+ assertType(NonNegativeFiniteNumber, factor, "Expected factor to be a non-negative finite number.");
140
140
  return () => {
141
- attempt++;
142
- const rawDelay = baseMs * Math.pow(factor, attempt - 1);
143
- const delay = Millis.orThrow(Math.max(0, Math.round(rawDelay)));
144
- return ok([delay, delay]);
141
+ const baseMs = durationToMillis(base);
142
+ let attempt = 0;
143
+ return () => {
144
+ attempt++;
145
+ const rawDelay = baseMs * Math.pow(factor, attempt - 1);
146
+ const delay = saturateMillis(rawDelay);
147
+ return ok([delay, delay]);
148
+ };
145
149
  };
146
150
  };
147
151
  /**
@@ -170,7 +174,7 @@ export const linear = (base) => () => {
170
174
  let attempt = 0;
171
175
  return () => {
172
176
  attempt++;
173
- const delay = Millis.orThrow(ms * attempt);
177
+ const delay = saturateMillis(ms * attempt);
174
178
  return ok([delay, delay]);
175
179
  };
176
180
  };
@@ -199,10 +203,10 @@ export const linear = (base) => () => {
199
203
  */
200
204
  export const fibonacci = (initial) => () => {
201
205
  const ms = durationToMillis(initial);
202
- let index = 1;
206
+ let index = FibonacciIndex.orThrow(1);
203
207
  return () => {
204
- const delay = Millis.orThrow(ms * fibonacciAt(FibonacciIndex.orThrow(index)));
205
- index++;
208
+ const delay = saturateMillis(ms * fibonacciAt(index));
209
+ index = FibonacciIndex.orNull(increment(index)) ?? index;
206
210
  return ok([delay, delay]);
207
211
  };
208
212
  };
@@ -242,7 +246,7 @@ export const fixed = (interval) => (deps) => {
242
246
  const remainder = intervalMs === 0 ? 0 : elapsed % intervalMs;
243
247
  const boundary = intervalMs - remainder;
244
248
  const delay = runningBehind ? 0 : boundary;
245
- return ok([count++, delay]);
249
+ return ok([count++, saturateMillis(delay)]);
246
250
  };
247
251
  };
248
252
  /**
@@ -271,7 +275,7 @@ export const windowed = (interval) => (deps) => {
271
275
  const { elapsed } = metrics();
272
276
  const remainder = intervalMs === 0 ? 0 : elapsed % intervalMs;
273
277
  const delay = intervalMs === 0 ? 0 : intervalMs - remainder;
274
- return ok([count++, delay]);
278
+ return ok([count++, saturateMillis(delay)]);
275
279
  };
276
280
  };
277
281
  /**
@@ -430,14 +434,17 @@ export const unfoldSchedule = (initial, next) => () => {
430
434
  *
431
435
  * @group Limiting
432
436
  */
433
- export const take = (n) => (schedule) => (deps) => {
434
- const step = schedule(deps);
435
- let attempt = 0;
436
- return (input) => {
437
- attempt++;
438
- if (attempt > n)
439
- return err(done());
440
- return step(input);
437
+ export const take = (n) => {
438
+ assertType(NonNegativeInt, n, "Expected n to be a non-negative integer.");
439
+ return (schedule) => (deps) => {
440
+ const step = schedule(deps);
441
+ let attempt = 0;
442
+ return (input) => {
443
+ attempt++;
444
+ if (attempt > n)
445
+ return err(done());
446
+ return step(input);
447
+ };
441
448
  };
442
449
  };
443
450
  /**
@@ -516,15 +523,18 @@ export const maxDelay = (max) => {
516
523
  *
517
524
  * @group Delay
518
525
  */
519
- export const jitter = (factor = 0.5) => (schedule) => (deps) => {
520
- const step = schedule(deps);
521
- return (input) => {
522
- const result = step(input);
523
- if (!result.ok)
524
- return result;
525
- const [output, delay] = result.value;
526
- const jittered = delay * (1 - factor + deps.random.next() * 2 * factor);
527
- return ok([output, Millis.orThrow(Math.max(0, Math.round(jittered)))]);
526
+ export const jitter = (factor = 0.5) => {
527
+ assertType(NonNegativeFiniteNumber, factor, "Expected factor to be a non-negative finite number.");
528
+ return (schedule) => (deps) => {
529
+ const step = schedule(deps);
530
+ return (input) => {
531
+ const result = step(input);
532
+ if (!result.ok)
533
+ return result;
534
+ const [output, delay] = result.value;
535
+ const jittered = delay * (1 - factor + deps.random.next() * 2 * factor);
536
+ return ok([output, saturateMillis(jittered)]);
537
+ };
528
538
  };
529
539
  };
530
540
  /**
@@ -599,7 +609,7 @@ export const modifyDelay = (f) => (schedule) => (deps) => {
599
609
  if (!result.ok)
600
610
  return result;
601
611
  const [output, delay] = result.value;
602
- return ok([output, Millis.orThrow(Math.max(0, Math.round(f(delay))))]);
612
+ return ok([output, saturateMillis(f(delay))]);
603
613
  };
604
614
  };
605
615
  /**
@@ -629,8 +639,7 @@ export const compensate = (schedule) => (deps) => {
629
639
  if (!result.ok)
630
640
  return result;
631
641
  const [output, delay] = result.value;
632
- const adjusted = Math.max(0, delay - elapsedSincePrevious);
633
- return ok([output, adjusted]);
642
+ return ok([output, saturateMillis(delay - elapsedSincePrevious)]);
634
643
  };
635
644
  };
636
645
  /**
@@ -833,15 +842,15 @@ export function passthrough(schedule) {
833
842
  * // Outputs: 100, 300, 700, 1500, ... (cumulative)
834
843
  *
835
844
  * // Collect all outputs
836
- * const collected = foldSchedule([] as Millis[], (acc, delay: Millis) => [
837
- * ...acc,
838
- * delay,
839
- * ])(take(3)(spaced("1s")));
845
+ * const collected = foldSchedule<ReadonlyArray<Millis>, Millis>(
846
+ * [],
847
+ * (acc, delay) => [...acc, delay],
848
+ * )(take(3)(spaced("1s")));
840
849
  * // Outputs: [1000], [1000, 1000], [1000, 1000, 1000]
841
850
  *
842
851
  * // Count attempts with custom output
843
852
  * const counted = foldSchedule(
844
- * { attempts: 0, lastDelay: 0 as Millis },
853
+ * { attempts: 0, lastDelay: minMillis },
845
854
  * (acc, delay: Millis) => ({
846
855
  * attempts: acc.attempts + 1,
847
856
  * lastDelay: delay,
@@ -1082,7 +1091,7 @@ export const unionSchedules = (a, b) => (deps) => {
1082
1091
  const [outputA, delayA] = resultA.value;
1083
1092
  const [outputB, delayB] = resultB.value;
1084
1093
  // Use minimum delay, output from the one with smaller delay
1085
- const minDelay = Math.min(delayA, delayB);
1094
+ const minDelay = Millis.orThrow(Math.min(delayA, delayB));
1086
1095
  return delayA <= delayB
1087
1096
  ? ok([outputA, minDelay])
1088
1097
  : ok([outputB, minDelay]);
@@ -110,6 +110,8 @@ export type SqliteRow = Record<string, SqliteValue>;
110
110
  */
111
111
  export interface SqliteDriver extends Disposable {
112
112
  readonly exec: (query: SqliteQuery) => SqliteExecResult;
113
+ /** Disposes this driver, then deletes its persistent database file. */
114
+ readonly deleteDatabase: () => void;
113
115
  /**
114
116
  * Returns bytes backed by {@link ArrayBuffer}.
115
117
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"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"}
@@ -105,16 +105,16 @@ export const createSqlite = (name, options) => async (run) => {
105
105
  try {
106
106
  const { createSqliteDriver } = run.deps;
107
107
  const console = run.deps.console.child("sql");
108
- const stack = __addDisposableResource(env_1, new AsyncDisposableStack(), true);
108
+ const disposer = __addDisposableResource(env_1, new AsyncDisposableStack(), true);
109
109
  const driverResult = await run(createSqliteDriver(name, options));
110
110
  if (!driverResult.ok)
111
111
  return driverResult;
112
- const driver = stack.use(driverResult.value);
112
+ const driver = disposer.use(driverResult.value);
113
113
  console.debug("SQLite driver created");
114
- const moved = stack.move();
114
+ const disposables = disposer.move();
115
115
  const sqlite = {
116
116
  exec: (query) => {
117
- assertNotDisposed(moved);
117
+ assertNotDisposed(disposables);
118
118
  console.debug({ query });
119
119
  const label = query.options?.logQueryExecutionTime &&
120
120
  `SqliteQueryExecutionTime ${query.sql}`;
@@ -137,18 +137,17 @@ export const createSqlite = (name, options) => async (run) => {
137
137
  transaction: ((callback) => {
138
138
  const env_2 = { stack: [], error: void 0, hasError: false };
139
139
  try {
140
- assertNotDisposed(moved);
140
+ assertNotDisposed(disposables);
141
141
  console.debug("begin");
142
142
  driver.exec(sql `begin;`);
143
+ const rollback = __addDisposableResource(env_2, new DisposableStack(), false);
143
144
  let shouldRollback = true;
144
- const _rollback = __addDisposableResource(env_2, {
145
- [Symbol.dispose]: () => {
146
- if (!shouldRollback)
147
- return;
148
- console.debug("rollback");
149
- driver.exec(sql `rollback;`);
150
- },
151
- }, false);
145
+ rollback.defer(() => {
146
+ if (!shouldRollback)
147
+ return;
148
+ console.debug("rollback");
149
+ driver.exec(sql `rollback;`);
150
+ });
152
151
  const result = callback();
153
152
  if (result != null && !result.ok)
154
153
  return result;
@@ -166,10 +165,10 @@ export const createSqlite = (name, options) => async (run) => {
166
165
  }
167
166
  }),
168
167
  export: () => {
169
- assertNotDisposed(moved);
168
+ assertNotDisposed(disposables);
170
169
  return driver.export();
171
170
  },
172
- [Symbol.asyncDispose]: () => moved.disposeAsync(),
171
+ [Symbol.asyncDispose]: () => disposables.disposeAsync(),
173
172
  };
174
173
  return ok(sqlite);
175
174
  }
@@ -187,14 +186,15 @@ export const createSqlite = (name, options) => async (run) => {
187
186
  export const testSetupSqlite = async (deps) => {
188
187
  const env_3 = { stack: [], error: void 0, hasError: false };
189
188
  try {
190
- const stack = __addDisposableResource(env_3, new AsyncDisposableStack(), true);
191
- const run = stack.use(testCreateRun(deps));
192
- const sqlite = stack.use(await run.orThrow(createSqlite(testName, { mode: "memory" })));
193
- const moved = stack.move();
189
+ const disposer = __addDisposableResource(env_3, new AsyncDisposableStack(), true);
190
+ const run = disposer.use(testCreateRun(deps));
191
+ const sqlite = disposer.use(await run.orThrow(createSqlite(testName, { mode: "memory" })));
192
+ const runWithSqlite = disposer.use(run.create({ ...run.deps, sqlite }));
193
+ const disposables = disposer.move();
194
194
  return {
195
- run: run.addDeps({ sqlite }),
195
+ run: runWithSqlite,
196
196
  sqlite,
197
- [Symbol.asyncDispose]: () => moved.disposeAsync(),
197
+ [Symbol.asyncDispose]: () => disposables.disposeAsync(),
198
198
  };
199
199
  }
200
200
  catch (e_3) {
@@ -227,27 +227,52 @@ const drawSqliteQueryPlan = (rows) => rows
227
227
  * dispose function.
228
228
  */
229
229
  export const createPreparedStatementsCache = (factory, disposeFn) => {
230
- let isDisposed = false;
231
- const cache = new Map();
232
- return {
233
- get: (query, alwaysPrepare) => {
234
- if (alwaysPrepare !== true && !query.options?.prepare)
235
- return null;
236
- let statement = cache.get(query.sql);
237
- if (!statement) {
238
- statement = factory(query.sql);
239
- cache.set(query.sql, statement);
230
+ const env_4 = { stack: [], error: void 0, hasError: false };
231
+ try {
232
+ const disposer = __addDisposableResource(env_4, new DisposableStack(), false);
233
+ const statementsBySql = new Map();
234
+ disposer.defer(() => {
235
+ const env_5 = { stack: [], error: void 0, hasError: false };
236
+ try {
237
+ const disposer = __addDisposableResource(env_5, new DisposableStack(), false);
238
+ disposer.defer(() => {
239
+ statementsBySql.clear();
240
+ });
241
+ for (const statement of statementsBySql.values()) {
242
+ disposer.adopt(statement, disposeFn);
243
+ }
240
244
  }
241
- return statement;
242
- },
243
- [Symbol.dispose]: () => {
244
- if (isDisposed)
245
- return;
246
- isDisposed = true;
247
- cache.forEach(disposeFn);
248
- cache.clear();
249
- },
250
- };
245
+ catch (e_5) {
246
+ env_5.error = e_5;
247
+ env_5.hasError = true;
248
+ }
249
+ finally {
250
+ __disposeResources(env_5);
251
+ }
252
+ });
253
+ const disposables = disposer.move();
254
+ return {
255
+ get: (query, alwaysPrepare) => {
256
+ assertNotDisposed(disposables);
257
+ if (alwaysPrepare !== true && !query.options?.prepare)
258
+ return null;
259
+ let statement = statementsBySql.get(query.sql);
260
+ if (!statement) {
261
+ statement = factory(query.sql);
262
+ statementsBySql.set(query.sql, statement);
263
+ }
264
+ return statement;
265
+ },
266
+ [Symbol.dispose]: () => disposables.dispose(),
267
+ };
268
+ }
269
+ catch (e_4) {
270
+ env_4.error = e_4;
271
+ env_4.hasError = true;
272
+ }
273
+ finally {
274
+ __disposeResources(env_4);
275
+ }
251
276
  };
252
277
  /**
253
278
  * Creates a safe SQL query using a tagged template literal.