@evolu/common 8.10.0 → 8.12.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.
- package/dist/src/Bytes.d.ts +39 -2
- package/dist/src/Bytes.d.ts.map +1 -1
- package/dist/src/Bytes.js +50 -2
- package/dist/src/Config.d.ts +22 -22
- package/dist/src/Config.d.ts.map +1 -1
- package/dist/src/Console.d.ts +62 -7
- package/dist/src/Console.d.ts.map +1 -1
- package/dist/src/Console.js +20 -4
- package/dist/src/Crypto.d.ts +76 -4
- package/dist/src/Crypto.d.ts.map +1 -1
- package/dist/src/Crypto.js +55 -4
- package/dist/src/Error.d.ts +45 -0
- package/dist/src/Error.d.ts.map +1 -1
- package/dist/src/Error.js +69 -0
- package/dist/src/Fs.d.ts +92 -18
- package/dist/src/Fs.d.ts.map +1 -1
- package/dist/src/Fs.js +2 -0
- package/dist/src/Identicon.d.ts +2 -2
- package/dist/src/Identicon.js +2 -2
- package/dist/src/LeakDetector.d.ts +22 -3
- package/dist/src/LeakDetector.d.ts.map +1 -1
- package/dist/src/LeakDetector.js +12 -2
- package/dist/src/LockManager.d.ts +8 -0
- package/dist/src/LockManager.d.ts.map +1 -1
- package/dist/src/LockManager.js +6 -0
- package/dist/src/Object.d.ts.map +1 -1
- package/dist/src/Object.js +5 -0
- package/dist/src/Platform.d.ts +47 -7
- package/dist/src/Platform.d.ts.map +1 -1
- package/dist/src/Platform.js +24 -5
- package/dist/src/Random.d.ts +25 -2
- package/dist/src/Random.d.ts.map +1 -1
- package/dist/src/Random.js +14 -2
- package/dist/src/Resource.d.ts +156 -1
- package/dist/src/Resource.d.ts.map +1 -1
- package/dist/src/Resource.js +201 -72
- package/dist/src/Schedule.d.ts +11 -10
- package/dist/src/Schedule.d.ts.map +1 -1
- package/dist/src/Schedule.js +1 -1
- package/dist/src/Sqlite.d.ts +132 -16
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +63 -9
- package/dist/src/Task.d.ts +15 -4
- package/dist/src/Task.d.ts.map +1 -1
- package/dist/src/Task.js +41 -15
- package/dist/src/Test.d.ts +9 -0
- package/dist/src/Test.d.ts.map +1 -1
- package/dist/src/Test.js +4 -0
- package/dist/src/Time.d.ts +106 -9
- package/dist/src/Time.d.ts.map +1 -1
- package/dist/src/Time.js +55 -4
- package/dist/src/Type.d.ts +1455 -1310
- package/dist/src/Type.d.ts.map +1 -1
- package/dist/src/Type.js +1274 -517
- package/dist/src/WebSocket.d.ts +164 -13
- package/dist/src/WebSocket.d.ts.map +1 -1
- package/dist/src/WebSocket.js +133 -24
- package/dist/src/Worker.d.ts +90 -8
- package/dist/src/Worker.d.ts.map +1 -1
- package/dist/src/Worker.js +28 -2
- package/dist/src/index.d.ts +6 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -3
- package/dist/src/local-first/Db.d.ts +52 -3
- package/dist/src/local-first/Db.d.ts.map +1 -1
- package/dist/src/local-first/Db.js +412 -137
- package/dist/src/local-first/Evolu.d.ts +412 -213
- package/dist/src/local-first/Evolu.d.ts.map +1 -1
- package/dist/src/local-first/Evolu.js +181 -18
- package/dist/src/local-first/Owner.d.ts +13 -30
- package/dist/src/local-first/Owner.d.ts.map +1 -1
- package/dist/src/local-first/Owner.js +13 -30
- package/dist/src/local-first/Protocol.d.ts +106 -19
- package/dist/src/local-first/Protocol.d.ts.map +1 -1
- package/dist/src/local-first/Protocol.js +162 -60
- package/dist/src/local-first/Query.d.ts +8 -15
- package/dist/src/local-first/Query.d.ts.map +1 -1
- package/dist/src/local-first/Relay.d.ts.map +1 -1
- package/dist/src/local-first/Relay.js +4 -2
- package/dist/src/local-first/Schema.d.ts +346 -23
- package/dist/src/local-first/Schema.d.ts.map +1 -1
- package/dist/src/local-first/Schema.js +214 -17
- package/dist/src/local-first/Shared.d.ts +537 -22
- package/dist/src/local-first/Shared.d.ts.map +1 -1
- package/dist/src/local-first/Shared.js +1437 -234
- package/dist/src/local-first/Storage.d.ts +195 -17
- package/dist/src/local-first/Storage.d.ts.map +1 -1
- package/dist/src/local-first/Storage.js +85 -22
- package/dist/src/local-first/Timestamp.d.ts +392 -41
- package/dist/src/local-first/Timestamp.d.ts.map +1 -1
- package/dist/src/local-first/Timestamp.js +403 -81
- package/dist/src/local-first/index.d.ts +0 -1
- package/dist/src/local-first/index.d.ts.map +1 -1
- package/dist/src/local-first/index.js +0 -1
- package/package.json +1 -1
- package/src/Assert.test.ts +2 -5
- package/src/Bytes.test.ts +27 -0
- package/src/Bytes.ts +58 -2
- package/src/Config.test.ts +2 -6
- package/src/Config.ts +133 -133
- package/src/Console.ts +62 -7
- package/src/Crypto.ts +76 -4
- package/src/Eq.test.ts +2 -3
- package/src/Error.test.ts +76 -3
- package/src/Error.ts +71 -0
- package/src/Fs.ts +92 -18
- package/src/Identicon.ts +2 -2
- package/src/LeakDetector.ts +22 -3
- package/src/LockManager.ts +8 -0
- package/src/Object.test.ts +27 -12
- package/src/Object.ts +5 -0
- package/src/Platform.ts +50 -8
- package/src/Random.ts +25 -2
- package/src/Resource.test.ts +837 -0
- package/src/Resource.ts +235 -15
- package/src/Schedule.test.ts +50 -12
- package/src/Schedule.ts +24 -14
- package/src/Sqlite.ts +137 -17
- package/src/Task.test.ts +189 -8
- package/src/Task.ts +56 -17
- package/src/Test.ts +9 -0
- package/src/Time.ts +106 -9
- package/src/Type.test.ts +946 -1028
- package/src/Type.ts +4195 -3136
- package/src/Types.test.ts +4 -14
- package/src/WebSocket.ts +313 -40
- package/src/Worker.ts +90 -8
- package/src/index.ts +20 -6
- package/src/local-first/Db.ts +644 -339
- package/src/local-first/Evolu.test.ts +994 -22
- package/src/local-first/Evolu.ts +625 -232
- package/src/local-first/Owner.ts +13 -30
- package/src/local-first/Protocol.test.ts +634 -10
- package/src/local-first/Protocol.ts +255 -109
- package/src/local-first/Query.ts +8 -15
- package/src/local-first/Relay.ts +4 -2
- package/src/local-first/Schema.test.ts +143 -0
- package/src/local-first/Schema.ts +376 -26
- package/src/local-first/Shared.test.ts +7731 -559
- package/src/local-first/Shared.ts +2036 -267
- package/src/local-first/Storage.ts +224 -36
- package/src/local-first/Timestamp.test.ts +344 -70
- package/src/local-first/Timestamp.ts +434 -118
- package/src/local-first/index.ts +0 -1
- package/dist/src/local-first/Error.d.ts +0 -12
- package/dist/src/local-first/Error.d.ts.map +0 -1
- package/dist/src/local-first/Error.js +0 -6
- package/dist/src/local-first/LocalAuth.d.ts +0 -150
- package/dist/src/local-first/LocalAuth.d.ts.map +0 -1
- package/dist/src/local-first/LocalAuth.js +0 -179
- package/src/local-first/Error.ts +0 -17
- package/src/local-first/LocalAuth.ts +0 -457
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../../src/local-first/Evolu.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../../src/local-first/Evolu.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,23 +57,27 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
|
|
|
57
57
|
});
|
|
58
58
|
import { emptyArray, isNonEmptyArray, mapArray, } from "../Array.js";
|
|
59
59
|
import { assert, assertNonEmptyReadonlyArray, assertNotUndefined, } from "../Assert.js";
|
|
60
|
+
import { createBuffer } from "../Bytes.js";
|
|
60
61
|
import { createCallbacks } from "../Callbacks.js";
|
|
61
62
|
import { createConsole } from "../Console.js";
|
|
62
63
|
import { createUnknownError } from "../Error.js";
|
|
63
64
|
import { disposable, exhaustiveCheck, todo } from "../Function.js";
|
|
64
65
|
import { acquireLeaderLock, acquireLeaderLockCallback, } from "../LockManager.js";
|
|
65
66
|
import { createMicrotaskBatch } from "../Microtask.js";
|
|
67
|
+
import { createMutableRecord, objectToEntries, } from "../Object.js";
|
|
66
68
|
import { createRefCountByKey } from "../RefCount.js";
|
|
67
69
|
import { err, ok } from "../Result.js";
|
|
68
70
|
import { isNonEmptySet } from "../Set.js";
|
|
69
|
-
import { SqliteBoolean, sqliteBooleanToBoolean } from "../Sqlite.js";
|
|
71
|
+
import { SqliteBoolean, sqliteBooleanToBoolean, } from "../Sqlite.js";
|
|
70
72
|
import { createStore } from "../Store.js";
|
|
71
|
-
import { brand, createId, createIdFromString, Name, UrlSafeString, } from "../Type.js";
|
|
73
|
+
import { brand, createId, createIdFromString, Id, Name, PositiveInt, UrlSafeString, } from "../Type.js";
|
|
72
74
|
import { createOwnerWebSocketTransport } from "./Owner.js";
|
|
75
|
+
import { encodeDbChange, } from "./Protocol.js";
|
|
73
76
|
import { applyPatches } from "./Query.js";
|
|
74
|
-
import { evoluSchemaToSqliteSchema } from "./Schema.js";
|
|
77
|
+
import { evoluSchemaToSqliteSchema, isLocalOnlyTable } from "./Schema.js";
|
|
75
78
|
import { consoleEntryOrErrorBroadcastChannelName } from "./Shared.js";
|
|
76
79
|
import { DbChange } from "./Storage.js";
|
|
80
|
+
import { createTimestamp } from "./Timestamp.js";
|
|
77
81
|
/**
|
|
78
82
|
* Application name.
|
|
79
83
|
*
|
|
@@ -83,42 +87,104 @@ import { DbChange } from "./Storage.js";
|
|
|
83
87
|
*
|
|
84
88
|
* Uses the same safe alphabet as {@link UrlSafeString} (letters, digits, `-`,
|
|
85
89
|
* `_`) and must be between 1 and 41 characters.
|
|
90
|
+
*
|
|
91
|
+
* @group Configuration
|
|
86
92
|
*/
|
|
87
93
|
export const AppName = /*#__PURE__*/ brand("AppName", UrlSafeString, (value) => value.length >= 1 && value.length <= 41
|
|
88
94
|
? ok()
|
|
89
95
|
: err({ type: "AppName", value }), (error) => `The value ${JSON.stringify(error.value)} is not between 1 and 41 characters.`);
|
|
96
|
+
/**
|
|
97
|
+
* Stable valid {@link AppName} for tests and examples.
|
|
98
|
+
*
|
|
99
|
+
* @group Testing
|
|
100
|
+
*/
|
|
90
101
|
export const testAppName = /*#__PURE__*/ AppName.orThrow("AppName");
|
|
102
|
+
/**
|
|
103
|
+
* The largest {@link Mutation}, in bytes.
|
|
104
|
+
*
|
|
105
|
+
* A mutation's size is its change as encoded for sync: the table name, the ID,
|
|
106
|
+
* and every column name and value, with a few bytes of overhead. A string takes
|
|
107
|
+
* at most three bytes per UTF-16 code unit. Every mutation within the limit
|
|
108
|
+
* fits one protocol message, so it can always sync. A larger mutation throws
|
|
109
|
+
* and is not saved. Mutations of local-only tables are exempt, because they
|
|
110
|
+
* never sync. Measure a mutation in advance with {@link Evolu.getMutationSize}.
|
|
111
|
+
*
|
|
112
|
+
* @group Core
|
|
113
|
+
*/
|
|
114
|
+
export const maxMutationSize =
|
|
115
|
+
/*#__PURE__*/ PositiveInt.orThrow(640_000);
|
|
116
|
+
/** Measures a mutation as {@link maxMutationSize} describes. */
|
|
117
|
+
const measureMutation = (table, values) => {
|
|
118
|
+
const columns = createMutableRecord();
|
|
119
|
+
for (const [column, value] of objectToEntries(values)) {
|
|
120
|
+
if (value !== undefined && column !== "id" && column !== "isDeleted") {
|
|
121
|
+
columns[column] = value;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Measuring with the protocol's encoding keeps the limit and the message size
|
|
125
|
+
// from disagreeing. A separate formula would save the tab about 3 KB
|
|
126
|
+
// compressed, but it would be a second encoding to keep in sync, and it
|
|
127
|
+
// would have to overcount.
|
|
128
|
+
const buffer = createBuffer();
|
|
129
|
+
encodeDbChange(buffer, {
|
|
130
|
+
// Every timestamp and ID takes 16 bytes, and the flags always take one.
|
|
131
|
+
timestamp: createTimestamp(),
|
|
132
|
+
change: DbChange.orThrow({
|
|
133
|
+
table,
|
|
134
|
+
id: mutationSizeId,
|
|
135
|
+
values: columns,
|
|
136
|
+
isInsert: true,
|
|
137
|
+
isDelete: null,
|
|
138
|
+
}),
|
|
139
|
+
});
|
|
140
|
+
return buffer.getLength();
|
|
141
|
+
};
|
|
142
|
+
const mutationSizeId = /*#__PURE__*/ Id.orThrow("A".repeat(22));
|
|
91
143
|
/**
|
|
92
144
|
* Creates shared dependencies used by all {@link createEvolu} instances on a
|
|
93
145
|
* platform.
|
|
94
146
|
*
|
|
95
147
|
* Call this once per platform and reuse the returned deps when creating
|
|
96
148
|
* multiple Evolu instances. The returned deps object owns long-lived resources
|
|
97
|
-
* such as worker channels and the shared {@link EvoluErrorDep.evoluError}
|
|
98
|
-
*
|
|
149
|
+
* such as worker channels and the shared {@link EvoluErrorDep.evoluError} and
|
|
150
|
+
* {@link SyncStateDep.syncState} stores.
|
|
99
151
|
*
|
|
100
152
|
* Dispose it only during app shutdown.
|
|
153
|
+
*
|
|
154
|
+
* @group Construction
|
|
101
155
|
*/
|
|
102
156
|
export const createEvoluDeps = (deps) => {
|
|
103
157
|
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
104
158
|
try {
|
|
105
159
|
const { createBroadcastChannel, sharedWorker } = deps;
|
|
106
160
|
const console = deps.console ?? createConsole();
|
|
161
|
+
// Opened when the worker connects.
|
|
162
|
+
let syncStateBroadcastChannel = null;
|
|
163
|
+
let tabLeaderElection = null;
|
|
107
164
|
const disposer = __addDisposableResource(env_1, new DisposableStack(), false);
|
|
108
165
|
disposer.use(sharedWorker);
|
|
109
166
|
const evoluError = disposer.use(createStore(null));
|
|
167
|
+
const syncState = disposer.use(createStore(null));
|
|
168
|
+
disposer.defer(() => {
|
|
169
|
+
syncStateBroadcastChannel?.[Symbol.dispose]();
|
|
170
|
+
});
|
|
110
171
|
const consoleEntryOrErrorBroadcastChannel = disposer.use(createBroadcastChannel(consoleEntryOrErrorBroadcastChannelName));
|
|
172
|
+
const setEvoluError = (error) => {
|
|
173
|
+
if (evoluError.get()?.type === "UnsupportedDbVersionError")
|
|
174
|
+
return;
|
|
175
|
+
evoluError.set(error);
|
|
176
|
+
};
|
|
111
177
|
consoleEntryOrErrorBroadcastChannel.onMessage = (message) => {
|
|
112
178
|
switch (message.type) {
|
|
113
179
|
case "ConsoleEntry":
|
|
114
180
|
console.write(message.entry);
|
|
115
181
|
// Fallback channel for unexpected errors without EvoluError typing.
|
|
116
182
|
if (message.entry.method === "error") {
|
|
117
|
-
|
|
183
|
+
setEvoluError(createUnknownError(message.entry.args));
|
|
118
184
|
}
|
|
119
185
|
break;
|
|
120
186
|
case "Error":
|
|
121
|
-
|
|
187
|
+
setEvoluError(message.error);
|
|
122
188
|
// Keep typed errors visible in logs as operational failures.
|
|
123
189
|
console.error(message.error);
|
|
124
190
|
break;
|
|
@@ -127,18 +193,57 @@ export const createEvoluDeps = (deps) => {
|
|
|
127
193
|
}
|
|
128
194
|
};
|
|
129
195
|
sharedWorker.port.onMessage = (message) => {
|
|
130
|
-
|
|
196
|
+
switch (message.type) {
|
|
197
|
+
case "DbWorkerInit":
|
|
198
|
+
deps.createDbWorker().postMessage(message, [message.port]);
|
|
199
|
+
break;
|
|
200
|
+
case "Error":
|
|
201
|
+
// Sent to this tab only: its database refused startup, or its worker
|
|
202
|
+
// still waits for another build.
|
|
203
|
+
setEvoluError(message.error);
|
|
204
|
+
console.error(message.error);
|
|
205
|
+
break;
|
|
206
|
+
case "Waiting":
|
|
207
|
+
case "StorageUnavailable":
|
|
208
|
+
// Platform adapters act on these; see Builds and Storage in the Shared
|
|
209
|
+
// module.
|
|
210
|
+
break;
|
|
211
|
+
case "Connected": {
|
|
212
|
+
assert(!syncStateBroadcastChannel, "The shared worker connects once.");
|
|
213
|
+
// The wait the error reported is over.
|
|
214
|
+
if (evoluError.get()?.type === "OtherBuildRunningError") {
|
|
215
|
+
evoluError.set(null);
|
|
216
|
+
}
|
|
217
|
+
// The worker is the channel's only sender, and one sender's messages
|
|
218
|
+
// arrive in order, so the last one is current.
|
|
219
|
+
syncStateBroadcastChannel = createBroadcastChannel(message.syncStateChannelName);
|
|
220
|
+
syncStateBroadcastChannel.onMessage = (state) => {
|
|
221
|
+
syncState.set(state);
|
|
222
|
+
};
|
|
223
|
+
// Asking only after listening misses no snapshot.
|
|
224
|
+
sharedWorker.port.postMessage({ type: "RequestSyncState" });
|
|
225
|
+
// Only this worker's tabs compete, so a tab of another worker never
|
|
226
|
+
// hosts its DbWorkers.
|
|
227
|
+
tabLeaderElection = acquireLeaderLockCallback(deps)(`tab-${message.workerId}`, () => {
|
|
228
|
+
sharedWorker.port.postMessage({
|
|
229
|
+
type: "AnnounceTabLeader",
|
|
230
|
+
consoleLevel: console.getLevel(),
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
default:
|
|
236
|
+
exhaustiveCheck(message);
|
|
237
|
+
}
|
|
131
238
|
};
|
|
132
|
-
disposer.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
consoleLevel: console.getLevel(),
|
|
136
|
-
});
|
|
137
|
-
}));
|
|
239
|
+
disposer.defer(() => {
|
|
240
|
+
tabLeaderElection?.[Symbol.dispose]();
|
|
241
|
+
});
|
|
138
242
|
return disposable({
|
|
139
243
|
...deps,
|
|
140
244
|
console,
|
|
141
245
|
evoluError,
|
|
246
|
+
syncState,
|
|
142
247
|
}, disposer);
|
|
143
248
|
}
|
|
144
249
|
catch (e_1) {
|
|
@@ -152,6 +257,8 @@ export const createEvoluDeps = (deps) => {
|
|
|
152
257
|
/**
|
|
153
258
|
* Creates an {@link Evolu} instance from {@link EvoluSchema} and
|
|
154
259
|
* {@link EvoluConfig}.
|
|
260
|
+
*
|
|
261
|
+
* @group Construction
|
|
155
262
|
*/
|
|
156
263
|
export const createEvolu = (schema, config) => async (run) => {
|
|
157
264
|
const env_2 = { stack: [], error: void 0, hasError: false };
|
|
@@ -269,10 +376,7 @@ export const createEvolu = (schema, config) => async (run) => {
|
|
|
269
376
|
}
|
|
270
377
|
case "RefreshQueries": {
|
|
271
378
|
releaseUnsubscribedLoadingPromises();
|
|
272
|
-
const queries = new Set(
|
|
273
|
-
...loadingPromisesByQuery.keys(),
|
|
274
|
-
...subscribedQueriesRefCount.keys(),
|
|
275
|
-
]);
|
|
379
|
+
const queries = new Set(subscribedQueriesRefCount.keys());
|
|
276
380
|
if (isNonEmptySet(queries))
|
|
277
381
|
postMessage({ type: "Query", queries });
|
|
278
382
|
break;
|
|
@@ -338,6 +442,36 @@ export const createEvolu = (schema, config) => async (run) => {
|
|
|
338
442
|
: null,
|
|
339
443
|
};
|
|
340
444
|
assert(DbChange.is(dbChange), `Invalid DbChange for table '${String(table)}'.`);
|
|
445
|
+
// Copy binary values, so what is saved is what was passed: the caller
|
|
446
|
+
// can change a Uint8Array before the batch is sent, a view of a
|
|
447
|
+
// resizable buffer can grow, and a view of a shared buffer cannot be
|
|
448
|
+
// sent to a SharedWorker at all. Node's Buffer passes validation and
|
|
449
|
+
// its slice shares memory, so only the constructor copies reliably.
|
|
450
|
+
for (const [column, value] of objectToEntries(dbChange.values)) {
|
|
451
|
+
if (typeof value === "object" && value !== null) {
|
|
452
|
+
changeValues[column] = new Uint8Array(value);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
// A change over maxMutationSize could never sync, and a shared worker
|
|
456
|
+
// hosting two databases would stop all work of that database. Correct
|
|
457
|
+
// apps bound column Types, so it is a programmer error and throws like
|
|
458
|
+
// the DbChange check above, before batching: it gets no timestamp, the
|
|
459
|
+
// database worker never sees it, and the code after the call does not
|
|
460
|
+
// run, so a form keeps its input and no row refers to the missing one.
|
|
461
|
+
//
|
|
462
|
+
// Rejected: reporting it through evoluError, which lets that code run
|
|
463
|
+
// as if the mutation was saved; checking in the database worker, which
|
|
464
|
+
// gets it already batched and cannot reach the call site; quarantine,
|
|
465
|
+
// which holds changes stored for sync; and skipping it in sync, which
|
|
466
|
+
// keeps range fingerprints disagreeing. Received changes are not
|
|
467
|
+
// checked, and oversized changes stored before this limit are not
|
|
468
|
+
// recovered, which needs a history-aware design.
|
|
469
|
+
//
|
|
470
|
+
// Local-only tables never sync, so they have no limit.
|
|
471
|
+
if (!isLocalOnlyTable(dbChange.table)) {
|
|
472
|
+
const size = measureMutation(dbChange.table, dbChange.values);
|
|
473
|
+
assert(size <= maxMutationSize, `The mutation of table '${dbChange.table}' is ${size} bytes, over maxMutationSize (${maxMutationSize}). Bound the Types of its columns or check it with evolu.getMutationSize.`);
|
|
474
|
+
}
|
|
341
475
|
mutateBatch.push({
|
|
342
476
|
change: { ...dbChange, ownerId: options?.ownerId ?? appOwner.id },
|
|
343
477
|
onComplete: options?.onComplete,
|
|
@@ -399,6 +533,7 @@ export const createEvolu = (schema, config) => async (run) => {
|
|
|
399
533
|
insert: createMutation("insert"),
|
|
400
534
|
update: createMutation("update"),
|
|
401
535
|
upsert: createMutation("upsert"),
|
|
536
|
+
getMutationSize: (table, values) => measureMutation(String(table), values),
|
|
402
537
|
loadQuery,
|
|
403
538
|
loadQueries: (queries) => queries.map((query) => loadQuery(query)),
|
|
404
539
|
subscribeQuery: (query) => (listener) => {
|
|
@@ -412,6 +547,27 @@ export const createEvolu = (schema, config) => async (run) => {
|
|
|
412
547
|
previousRows = rows;
|
|
413
548
|
listener();
|
|
414
549
|
});
|
|
550
|
+
// Invalidation can happen after loading but before a framework
|
|
551
|
+
// subscribes. Register first so subsequent invalidations also
|
|
552
|
+
// refresh this query.
|
|
553
|
+
const loadingPromise = loadingPromisesByQuery.get(query);
|
|
554
|
+
if (loadingPromise?.releaseOnResolve) {
|
|
555
|
+
// Retain the pending promise for its awaiters, but queue a read
|
|
556
|
+
// after the mutation or sync that invalidated its result.
|
|
557
|
+
loadingPromise.releaseOnResolve = false;
|
|
558
|
+
queryBatch.push(query);
|
|
559
|
+
}
|
|
560
|
+
else if (!loadingPromise) {
|
|
561
|
+
const rows = rowsByQueryMapStore.get().get(query);
|
|
562
|
+
if (rows) {
|
|
563
|
+
// Queue a read, but keep cached rows available to React use()
|
|
564
|
+
// so a render before the worker responds does not suspend.
|
|
565
|
+
void loadQuery(query);
|
|
566
|
+
const entry = loadingPromisesByQuery.get(query);
|
|
567
|
+
assertNotUndefined(entry);
|
|
568
|
+
fulfillLoadingPromise(entry, rows);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
415
571
|
return () => {
|
|
416
572
|
assert(isSubscribed, "subscribeQuery unsubscribe can be called only once.");
|
|
417
573
|
isSubscribed = false;
|
|
@@ -439,6 +595,13 @@ export const createEvolu = (schema, config) => async (run) => {
|
|
|
439
595
|
todo();
|
|
440
596
|
},
|
|
441
597
|
useOwner,
|
|
598
|
+
requestSync: (ownerId) => {
|
|
599
|
+
// Do not let the forced mutation flush overtake pending owner actions.
|
|
600
|
+
useOwnerBatch.flushNow();
|
|
601
|
+
// Queue preceding mutations before the reconciliation request.
|
|
602
|
+
mutateBatch.flushNow();
|
|
603
|
+
useOwnerBatch.push({ action: "sync", ownerId });
|
|
604
|
+
},
|
|
442
605
|
}, disposer));
|
|
443
606
|
}
|
|
444
607
|
catch (e_2) {
|
|
@@ -337,38 +337,27 @@ export interface OwnerWebSocketTransport extends Typed<"WebSocket"> {
|
|
|
337
337
|
*
|
|
338
338
|
* ```ts
|
|
339
339
|
* import {
|
|
340
|
-
* AppName,
|
|
341
340
|
* assertEqual,
|
|
342
|
-
* assertTrue,
|
|
343
|
-
* createAppOwner,
|
|
344
341
|
* createEvolu,
|
|
345
342
|
* createOwnerWebSocketTransport,
|
|
346
|
-
*
|
|
347
|
-
*
|
|
348
|
-
*
|
|
343
|
+
* testAppName,
|
|
344
|
+
* testAppOwner,
|
|
345
|
+
* testEvoluSchema,
|
|
349
346
|
* } from "@evolu/common";
|
|
350
347
|
*
|
|
351
|
-
* // Create once, persist the mnemonic securely, and restore it on later runs.
|
|
352
|
-
* const appOwner = createAppOwner(
|
|
353
|
-
* createOwnerSecret({ randomBytes: createRandomBytes() }),
|
|
354
|
-
* );
|
|
355
348
|
* const transport = createOwnerWebSocketTransport({
|
|
356
349
|
* url: "wss://relay.evolu.dev",
|
|
357
|
-
* ownerId:
|
|
350
|
+
* ownerId: testAppOwner.id,
|
|
351
|
+
* });
|
|
352
|
+
* const _createTodoEvolu = createEvolu(testEvoluSchema, {
|
|
353
|
+
* appName: testAppName,
|
|
354
|
+
* appOwner: testAppOwner,
|
|
355
|
+
* transports: [transport],
|
|
358
356
|
* });
|
|
359
|
-
* const createTodoEvolu = createEvolu(
|
|
360
|
-
* { todo: { id: id("Todo") } },
|
|
361
|
-
* {
|
|
362
|
-
* appName: AppName.orThrow("OwnerTransportExample"),
|
|
363
|
-
* appOwner,
|
|
364
|
-
* transports: [transport],
|
|
365
|
-
* },
|
|
366
|
-
* );
|
|
367
357
|
*
|
|
368
|
-
* assertTrue(typeof createTodoEvolu === "function");
|
|
369
358
|
* assertEqual(transport, {
|
|
370
359
|
* type: "WebSocket",
|
|
371
|
-
* url: `wss://relay.evolu.dev?ownerId=${
|
|
360
|
+
* url: `wss://relay.evolu.dev?ownerId=${testAppOwner.id}`,
|
|
372
361
|
* });
|
|
373
362
|
* ```
|
|
374
363
|
*
|
|
@@ -390,21 +379,15 @@ export declare const createOwnerWebSocketTransport: (config: {
|
|
|
390
379
|
* ```ts
|
|
391
380
|
* import {
|
|
392
381
|
* assertEqual,
|
|
393
|
-
* createAppOwner,
|
|
394
|
-
* createOwnerSecret,
|
|
395
|
-
* createRandomBytes,
|
|
396
382
|
* parseOwnerIdFromOwnerWebSocketTransportUrl,
|
|
383
|
+
* testAppOwner,
|
|
397
384
|
* } from "@evolu/common";
|
|
398
385
|
*
|
|
399
|
-
*
|
|
400
|
-
* const appOwner = createAppOwner(
|
|
401
|
-
* createOwnerSecret({ randomBytes: createRandomBytes() }),
|
|
402
|
-
* );
|
|
403
|
-
* const url = `/sync?ownerId=${appOwner.id}`;
|
|
386
|
+
* const url = `/sync?ownerId=${testAppOwner.id}`;
|
|
404
387
|
*
|
|
405
388
|
* assertEqual(
|
|
406
389
|
* parseOwnerIdFromOwnerWebSocketTransportUrl(url),
|
|
407
|
-
*
|
|
390
|
+
* testAppOwner.id,
|
|
408
391
|
* );
|
|
409
392
|
* assertEqual(
|
|
410
393
|
* parseOwnerIdFromOwnerWebSocketTransportUrl("/sync?ownerId=invalid"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Owner.d.ts","sourceRoot":"","sources":["../../../src/local-first/Owner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Owner.d.ts","sourceRoot":"","sources":["../../../src/local-first/Owner.ts"],"names":[],"mappings":"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"}
|
|
@@ -222,38 +222,27 @@ export const createSharedReadonlyOwner = (sharedOwner) => ({
|
|
|
222
222
|
*
|
|
223
223
|
* ```ts
|
|
224
224
|
* import {
|
|
225
|
-
* AppName,
|
|
226
225
|
* assertEqual,
|
|
227
|
-
* assertTrue,
|
|
228
|
-
* createAppOwner,
|
|
229
226
|
* createEvolu,
|
|
230
227
|
* createOwnerWebSocketTransport,
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
228
|
+
* testAppName,
|
|
229
|
+
* testAppOwner,
|
|
230
|
+
* testEvoluSchema,
|
|
234
231
|
* } from "@evolu/common";
|
|
235
232
|
*
|
|
236
|
-
* // Create once, persist the mnemonic securely, and restore it on later runs.
|
|
237
|
-
* const appOwner = createAppOwner(
|
|
238
|
-
* createOwnerSecret({ randomBytes: createRandomBytes() }),
|
|
239
|
-
* );
|
|
240
233
|
* const transport = createOwnerWebSocketTransport({
|
|
241
234
|
* url: "wss://relay.evolu.dev",
|
|
242
|
-
* ownerId:
|
|
235
|
+
* ownerId: testAppOwner.id,
|
|
236
|
+
* });
|
|
237
|
+
* const _createTodoEvolu = createEvolu(testEvoluSchema, {
|
|
238
|
+
* appName: testAppName,
|
|
239
|
+
* appOwner: testAppOwner,
|
|
240
|
+
* transports: [transport],
|
|
243
241
|
* });
|
|
244
|
-
* const createTodoEvolu = createEvolu(
|
|
245
|
-
* { todo: { id: id("Todo") } },
|
|
246
|
-
* {
|
|
247
|
-
* appName: AppName.orThrow("OwnerTransportExample"),
|
|
248
|
-
* appOwner,
|
|
249
|
-
* transports: [transport],
|
|
250
|
-
* },
|
|
251
|
-
* );
|
|
252
242
|
*
|
|
253
|
-
* assertTrue(typeof createTodoEvolu === "function");
|
|
254
243
|
* assertEqual(transport, {
|
|
255
244
|
* type: "WebSocket",
|
|
256
|
-
* url: `wss://relay.evolu.dev?ownerId=${
|
|
245
|
+
* url: `wss://relay.evolu.dev?ownerId=${testAppOwner.id}`,
|
|
257
246
|
* });
|
|
258
247
|
* ```
|
|
259
248
|
*
|
|
@@ -275,21 +264,15 @@ export const createOwnerWebSocketTransport = (config) => ({
|
|
|
275
264
|
* ```ts
|
|
276
265
|
* import {
|
|
277
266
|
* assertEqual,
|
|
278
|
-
* createAppOwner,
|
|
279
|
-
* createOwnerSecret,
|
|
280
|
-
* createRandomBytes,
|
|
281
267
|
* parseOwnerIdFromOwnerWebSocketTransportUrl,
|
|
268
|
+
* testAppOwner,
|
|
282
269
|
* } from "@evolu/common";
|
|
283
270
|
*
|
|
284
|
-
*
|
|
285
|
-
* const appOwner = createAppOwner(
|
|
286
|
-
* createOwnerSecret({ randomBytes: createRandomBytes() }),
|
|
287
|
-
* );
|
|
288
|
-
* const url = `/sync?ownerId=${appOwner.id}`;
|
|
271
|
+
* const url = `/sync?ownerId=${testAppOwner.id}`;
|
|
289
272
|
*
|
|
290
273
|
* assertEqual(
|
|
291
274
|
* parseOwnerIdFromOwnerWebSocketTransportUrl(url),
|
|
292
|
-
*
|
|
275
|
+
* testAppOwner.id,
|
|
293
276
|
* );
|
|
294
277
|
* assertEqual(
|
|
295
278
|
* parseOwnerIdFromOwnerWebSocketTransportUrl("/sync?ownerId=invalid"),
|