@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.
- package/dist/src/Assert.d.ts +10 -5
- package/dist/src/Assert.d.ts.map +1 -1
- package/dist/src/Assert.js +10 -5
- package/dist/src/Error.d.ts +5 -3
- package/dist/src/Error.d.ts.map +1 -1
- package/dist/src/Error.js +16 -0
- package/dist/src/Identicon.js +4 -4
- package/dist/src/LockManager.d.ts +74 -0
- package/dist/src/LockManager.d.ts.map +1 -0
- package/dist/src/LockManager.js +103 -0
- package/dist/src/Microtask.d.ts.map +1 -1
- package/dist/src/Microtask.js +90 -26
- package/dist/src/Object.d.ts.map +1 -1
- package/dist/src/RefCount.d.ts.map +1 -1
- package/dist/src/RefCount.js +153 -68
- package/dist/src/Resource.d.ts +6 -6
- package/dist/src/Resource.d.ts.map +1 -1
- package/dist/src/Resource.js +211 -162
- package/dist/src/Schedule.d.ts +5 -5
- package/dist/src/Schedule.d.ts.map +1 -1
- package/dist/src/Schedule.js +53 -44
- package/dist/src/Sqlite.d.ts +2 -0
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +66 -41
- package/dist/src/Task.d.ts +99 -123
- package/dist/src/Task.d.ts.map +1 -1
- package/dist/src/Task.js +273 -256
- package/dist/src/Test.d.ts +14 -15
- package/dist/src/Test.d.ts.map +1 -1
- package/dist/src/Time.d.ts +5 -0
- package/dist/src/Time.d.ts.map +1 -1
- package/dist/src/Time.js +5 -0
- package/dist/src/Type.d.ts +7 -0
- package/dist/src/Type.d.ts.map +1 -1
- package/dist/src/Type.js +7 -0
- package/dist/src/Types.d.ts +0 -8
- package/dist/src/Types.d.ts.map +1 -1
- package/dist/src/WebSocket.d.ts.map +1 -1
- package/dist/src/WebSocket.js +7 -6
- package/dist/src/Worker.d.ts +42 -8
- package/dist/src/Worker.d.ts.map +1 -1
- package/dist/src/Worker.js +292 -112
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/local-first/Db.d.ts +5 -4
- package/dist/src/local-first/Db.d.ts.map +1 -1
- package/dist/src/local-first/Db.js +43 -37
- package/dist/src/local-first/Evolu.d.ts +3 -2
- package/dist/src/local-first/Evolu.d.ts.map +1 -1
- package/dist/src/local-first/Evolu.js +90 -80
- package/dist/src/local-first/Owner.d.ts.map +1 -1
- package/dist/src/local-first/Shared.d.ts +65 -54
- package/dist/src/local-first/Shared.d.ts.map +1 -1
- package/dist/src/local-first/Shared.js +390 -376
- package/package.json +1 -1
- package/src/Array.ts +8 -8
- package/src/Assert.ts +11 -6
- package/src/Error.ts +5 -4
- package/src/Identicon.ts +4 -4
- package/src/LockManager.ts +181 -0
- package/src/Microtask.ts +17 -11
- package/src/Object.ts +3 -3
- package/src/RefCount.ts +25 -21
- package/src/Resource.ts +63 -56
- package/src/Schedule.ts +70 -48
- package/src/Set.ts +4 -4
- package/src/Sqlite.ts +43 -31
- package/src/Task.ts +392 -430
- package/src/Test.ts +14 -15
- package/src/Time.ts +7 -0
- package/src/Type.ts +9 -0
- package/src/Types.ts +0 -9
- package/src/WebSocket.ts +7 -6
- package/src/Worker.ts +195 -53
- package/src/index.ts +1 -0
- package/src/local-first/Db.ts +86 -61
- package/src/local-first/Evolu.ts +74 -68
- package/src/local-first/Owner.ts +1 -1
- package/src/local-first/Query.ts +1 -1
- package/src/local-first/Shared.ts +485 -476
package/dist/src/Schedule.js
CHANGED
|
@@ -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 ?
|
|
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
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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 =
|
|
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 =
|
|
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) =>
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
attempt
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
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) =>
|
|
520
|
-
|
|
521
|
-
return (
|
|
522
|
-
const
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
837
|
-
*
|
|
838
|
-
* delay,
|
|
839
|
-
*
|
|
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:
|
|
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]);
|
package/dist/src/Sqlite.d.ts
CHANGED
|
@@ -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
|
*
|
package/dist/src/Sqlite.d.ts.map
CHANGED
|
@@ -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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"}
|
package/dist/src/Sqlite.js
CHANGED
|
@@ -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
|
|
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 =
|
|
112
|
+
const driver = disposer.use(driverResult.value);
|
|
113
113
|
console.debug("SQLite driver created");
|
|
114
|
-
const
|
|
114
|
+
const disposables = disposer.move();
|
|
115
115
|
const sqlite = {
|
|
116
116
|
exec: (query) => {
|
|
117
|
-
assertNotDisposed(
|
|
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(
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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(
|
|
168
|
+
assertNotDisposed(disposables);
|
|
170
169
|
return driver.export();
|
|
171
170
|
},
|
|
172
|
-
[Symbol.asyncDispose]: () =>
|
|
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
|
|
191
|
-
const run =
|
|
192
|
-
const sqlite =
|
|
193
|
-
const
|
|
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:
|
|
195
|
+
run: runWithSqlite,
|
|
196
196
|
sqlite,
|
|
197
|
-
[Symbol.asyncDispose]: () =>
|
|
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
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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.
|