orez 0.5.16 → 0.5.18
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/README.md +4 -0
- package/dist/cf-do/worker.d.ts.map +1 -1
- package/dist/cf-do/worker.js +89 -14
- package/dist/cf-do/worker.js.map +1 -1
- package/dist/sync-browser-host/generated/sqlite3-browser.wasm +0 -0
- package/dist/sync-browser-host/generated/sync_wasm.js +921 -0
- package/dist/sync-browser-host/generated/sync_wasm_bg.wasm +0 -0
- package/dist/sync-browser-host/host.d.ts +8 -0
- package/dist/sync-browser-host/host.d.ts.map +1 -0
- package/dist/sync-browser-host/host.js +435 -0
- package/dist/sync-browser-host/host.js.map +1 -0
- package/dist/sync-browser-host/idb-snapshot.d.ts +10 -0
- package/dist/sync-browser-host/idb-snapshot.d.ts.map +1 -0
- package/dist/sync-browser-host/idb-snapshot.js +109 -0
- package/dist/sync-browser-host/idb-snapshot.js.map +1 -0
- package/dist/sync-browser-host/index.d.ts +4 -0
- package/dist/sync-browser-host/index.d.ts.map +1 -0
- package/dist/sync-browser-host/index.js +4 -0
- package/dist/sync-browser-host/index.js.map +1 -0
- package/dist/sync-browser-host/message-port.d.ts +6 -0
- package/dist/sync-browser-host/message-port.d.ts.map +1 -0
- package/dist/sync-browser-host/message-port.js +182 -0
- package/dist/sync-browser-host/message-port.js.map +1 -0
- package/dist/sync-browser-host/sqlite-adapter.d.ts +66 -0
- package/dist/sync-browser-host/sqlite-adapter.d.ts.map +1 -0
- package/dist/sync-browser-host/sqlite-adapter.js +135 -0
- package/dist/sync-browser-host/sqlite-adapter.js.map +1 -0
- package/dist/sync-browser-host/types.d.ts +88 -0
- package/dist/sync-browser-host/types.d.ts.map +1 -0
- package/dist/sync-browser-host/types.js +12 -0
- package/dist/sync-browser-host/types.js.map +1 -0
- package/dist/test-setup.d.ts +2 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +35 -0
- package/dist/test-setup.js.map +1 -0
- package/dist/zero-http/test-harness.d.ts +2 -6
- package/dist/zero-http/test-harness.d.ts.map +1 -1
- package/dist/zero-http/test-harness.js +4 -2
- package/dist/zero-http/test-harness.js.map +1 -1
- package/dist/zero-http/transport.d.ts +30 -4
- package/dist/zero-http/transport.d.ts.map +1 -1
- package/dist/zero-http/transport.js +411 -44
- package/dist/zero-http/transport.js.map +1 -1
- package/package.json +15 -5
|
Binary file
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { BrowserSyncHost, BrowserSyncHostConfig } from './types.js';
|
|
2
|
+
export type BrowserHostTestFaultPoint = 'before_mutation' | 'after_app_write_before_sqlite_commit' | 'after_sqlite_commit_before_idb_commit' | 'after_idb_commit_before_response' | 'during_response_delivery';
|
|
3
|
+
export type BrowserHostTestHooks = {
|
|
4
|
+
reach(point: BrowserHostTestFaultPoint): void | Promise<void>;
|
|
5
|
+
};
|
|
6
|
+
export declare function createBrowserSyncHostInternal(config: BrowserSyncHostConfig, hooks?: BrowserHostTestHooks): Promise<BrowserSyncHost>;
|
|
7
|
+
export declare function createBrowserSyncHost(config: BrowserSyncHostConfig): Promise<BrowserSyncHost>;
|
|
8
|
+
//# sourceMappingURL=host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../packages/sync-browser-host/src/host.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EAKtB,MAAM,YAAY,CAAA;AA0BnB,MAAM,MAAM,yBAAyB,GACjC,iBAAiB,GACjB,sCAAsC,GACtC,uCAAuC,GACvC,kCAAkC,GAClC,0BAA0B,CAAA;AAE9B,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9D,CAAA;AAufD,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,qBAAqB,EAC7B,KAAK,CAAC,EAAE,oBAAoB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAE1B"}
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
import createSqliteModule from 'bedrock-sqlite/browser';
|
|
2
|
+
import { engine_assemble_push_response, engine_compile_query, engine_finalize, engine_handle_pull, engine_handle_query_pull, engine_init_query_schema, engine_init_schema, engine_preflight, engine_prune, engine_push_validate, engine_record_app_error, } from './generated/sync_wasm.js';
|
|
3
|
+
import initSyncWasm from './generated/sync_wasm.js';
|
|
4
|
+
import { IndexedDbSnapshotStore } from './idb-snapshot.js';
|
|
5
|
+
import { BedrockDirectSql, BedrockMutatorSql, BedrockSyncDb, } from './sqlite-adapter.js';
|
|
6
|
+
import { MutationApplicationError } from './types.js';
|
|
7
|
+
const DEFAULT_CAPS = {
|
|
8
|
+
maxChangeRows: 10_000,
|
|
9
|
+
maxChangeBytes: 2_000_000,
|
|
10
|
+
};
|
|
11
|
+
let syncWasmReady;
|
|
12
|
+
function initializeSyncWasm(url) {
|
|
13
|
+
syncWasmReady ??= initSyncWasm({ module_or_path: url }).then(() => undefined);
|
|
14
|
+
return syncWasmReady;
|
|
15
|
+
}
|
|
16
|
+
function json(value, status = 200) {
|
|
17
|
+
return Response.json(value, {
|
|
18
|
+
status,
|
|
19
|
+
headers: { 'cache-control': 'no-store' },
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function errorMessage(error) {
|
|
23
|
+
return error instanceof Error ? error.message : String(error);
|
|
24
|
+
}
|
|
25
|
+
function statusOf(error) {
|
|
26
|
+
if (typeof error === 'object' && error !== null && 'status' in error) {
|
|
27
|
+
const status = Number(error.status);
|
|
28
|
+
if (Number.isInteger(status) && status >= 400 && status <= 599)
|
|
29
|
+
return status;
|
|
30
|
+
}
|
|
31
|
+
return 500;
|
|
32
|
+
}
|
|
33
|
+
function requestError(message, status = 400) {
|
|
34
|
+
return Object.assign(new Error(message), { status });
|
|
35
|
+
}
|
|
36
|
+
async function requestObject(request) {
|
|
37
|
+
let value;
|
|
38
|
+
try {
|
|
39
|
+
value = await request.json();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw requestError('invalid JSON request body');
|
|
43
|
+
}
|
|
44
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
45
|
+
throw requestError('request body must be a JSON object');
|
|
46
|
+
}
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
function validateConfig(config) {
|
|
50
|
+
if (!config.storageKey)
|
|
51
|
+
throw new TypeError('storageKey must not be empty');
|
|
52
|
+
if (!config.mutators)
|
|
53
|
+
throw new TypeError('mutators are required');
|
|
54
|
+
if (config.queryAware && !config.resolveQuery) {
|
|
55
|
+
throw new TypeError('queryAware requires resolveQuery');
|
|
56
|
+
}
|
|
57
|
+
const caps = { ...DEFAULT_CAPS, ...config.caps };
|
|
58
|
+
for (const [name, value] of Object.entries(caps)) {
|
|
59
|
+
if (!Number.isSafeInteger(value) || value < 1) {
|
|
60
|
+
throw new TypeError(`caps.${name} must be a positive safe integer`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const retainChanges = config.retainChanges ?? 4_096;
|
|
64
|
+
if (!Number.isSafeInteger(retainChanges) || retainChanges < 0) {
|
|
65
|
+
throw new TypeError('retainChanges must be a non-negative safe integer');
|
|
66
|
+
}
|
|
67
|
+
return caps;
|
|
68
|
+
}
|
|
69
|
+
class OperationQueue {
|
|
70
|
+
#tail = Promise.resolve();
|
|
71
|
+
run(operation) {
|
|
72
|
+
const result = this.#tail.then(operation);
|
|
73
|
+
this.#tail = result.then(() => undefined, () => undefined);
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
async drain() {
|
|
77
|
+
await this.#tail;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
class BrowserSyncHostImpl {
|
|
81
|
+
config;
|
|
82
|
+
caps;
|
|
83
|
+
module;
|
|
84
|
+
db;
|
|
85
|
+
snapshots;
|
|
86
|
+
hooks;
|
|
87
|
+
#queue = new OperationQueue();
|
|
88
|
+
#listeners = new Set();
|
|
89
|
+
#directSql;
|
|
90
|
+
#engineDb;
|
|
91
|
+
#mutatorSql;
|
|
92
|
+
#retainChanges;
|
|
93
|
+
#fatalError;
|
|
94
|
+
#closed = false;
|
|
95
|
+
#closePromise;
|
|
96
|
+
constructor(config, caps, module, db, snapshots, hooks) {
|
|
97
|
+
this.config = config;
|
|
98
|
+
this.caps = caps;
|
|
99
|
+
this.module = module;
|
|
100
|
+
this.db = db;
|
|
101
|
+
this.snapshots = snapshots;
|
|
102
|
+
this.hooks = hooks;
|
|
103
|
+
this.#directSql = new BedrockDirectSql(db);
|
|
104
|
+
this.#engineDb = new BedrockSyncDb(db);
|
|
105
|
+
this.#mutatorSql = new BedrockMutatorSql(this.#directSql, (ast) => engine_compile_query(config.schema, ast));
|
|
106
|
+
this.#retainChanges = String(config.retainChanges ?? 4_096);
|
|
107
|
+
}
|
|
108
|
+
static async create(config, hooks) {
|
|
109
|
+
const caps = validateConfig(config);
|
|
110
|
+
const sqliteWasmUrl = config.assets?.sqliteWasmUrl ??
|
|
111
|
+
new URL('./generated/sqlite3-browser.wasm', import.meta.url);
|
|
112
|
+
const syncWasmUrl = config.assets?.syncWasmUrl ??
|
|
113
|
+
new URL('./generated/sync_wasm_bg.wasm', import.meta.url);
|
|
114
|
+
await initializeSyncWasm(syncWasmUrl);
|
|
115
|
+
const module = (await createSqliteModule({
|
|
116
|
+
locateFile: (path) => path.endsWith('.wasm') ? String(sqliteWasmUrl) : path,
|
|
117
|
+
}));
|
|
118
|
+
if (!module._memfs?.files) {
|
|
119
|
+
throw new Error('Bedrock browser build does not expose its VFS snapshot surface');
|
|
120
|
+
}
|
|
121
|
+
const snapshots = new IndexedDbSnapshotStore(config.storageKey);
|
|
122
|
+
await snapshots.restore(module);
|
|
123
|
+
const db = new module.Database('/project.db');
|
|
124
|
+
const journalMode = String(db.pragma('journal_mode = DELETE', { simple: true }));
|
|
125
|
+
if (journalMode.toLowerCase() !== 'delete') {
|
|
126
|
+
db.close();
|
|
127
|
+
await snapshots.close();
|
|
128
|
+
throw new Error(`Bedrock SQLite did not enter DELETE journal mode: ${journalMode}`);
|
|
129
|
+
}
|
|
130
|
+
db.pragma('foreign_keys = ON');
|
|
131
|
+
const host = new BrowserSyncHostImpl(config, caps, module, db, snapshots, hooks);
|
|
132
|
+
try {
|
|
133
|
+
await host.#writeTransaction('bootstrap', async () => {
|
|
134
|
+
config.initialize(host.#directSql);
|
|
135
|
+
engine_init_schema(host.#engineDb, config.schema);
|
|
136
|
+
if (config.queryAware || config.resolveQuery) {
|
|
137
|
+
engine_init_query_schema(host.#engineDb);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
return host;
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
await host.#closeResources();
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
#assertAvailable() {
|
|
148
|
+
if (this.#fatalError)
|
|
149
|
+
throw this.#fatalError;
|
|
150
|
+
if (this.#closed)
|
|
151
|
+
throw new Error('browser sync host is closed');
|
|
152
|
+
}
|
|
153
|
+
#assertAccepting() {
|
|
154
|
+
if (this.#closePromise)
|
|
155
|
+
throw new Error('browser sync host is closed');
|
|
156
|
+
this.#assertAvailable();
|
|
157
|
+
}
|
|
158
|
+
async #reach(point) {
|
|
159
|
+
await this.hooks?.reach(point);
|
|
160
|
+
}
|
|
161
|
+
async #checkpoint() {
|
|
162
|
+
try {
|
|
163
|
+
await this.snapshots.checkpoint(this.module);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
const fatal = new Error(`browser database checkpoint failed; host terminated: ${errorMessage(error)}`, { cause: error });
|
|
167
|
+
this.#fatalError = fatal;
|
|
168
|
+
this.db.close();
|
|
169
|
+
throw fatal;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async #writeTransaction(kind, operation) {
|
|
173
|
+
this.#assertAvailable();
|
|
174
|
+
this.db.exec('BEGIN');
|
|
175
|
+
let value;
|
|
176
|
+
try {
|
|
177
|
+
value = await operation();
|
|
178
|
+
this.db.exec('COMMIT');
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (this.db.inTransaction)
|
|
182
|
+
this.db.exec('ROLLBACK');
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
if (kind === 'mutation') {
|
|
186
|
+
await this.#reach('after_sqlite_commit_before_idb_commit');
|
|
187
|
+
}
|
|
188
|
+
await this.#checkpoint();
|
|
189
|
+
return value;
|
|
190
|
+
}
|
|
191
|
+
async #claims(request) {
|
|
192
|
+
const claims = await this.config.authenticate(request);
|
|
193
|
+
if (!claims || typeof claims.userID !== 'string' || claims.userID.length === 0) {
|
|
194
|
+
throw requestError('missing authentication', 401);
|
|
195
|
+
}
|
|
196
|
+
return claims;
|
|
197
|
+
}
|
|
198
|
+
async #runEffects(effects) {
|
|
199
|
+
for (const effect of effects) {
|
|
200
|
+
try {
|
|
201
|
+
await effect();
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
console.error('browser sync deferred effect failed', error);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
#visibility(claims) {
|
|
209
|
+
if (!this.config.visibility)
|
|
210
|
+
return null;
|
|
211
|
+
return {
|
|
212
|
+
rowLocal: typeof this.config.visibility.rowLocal === 'function'
|
|
213
|
+
? this.config.visibility.rowLocal(claims)
|
|
214
|
+
: this.config.visibility.rowLocal,
|
|
215
|
+
filters: Object.keys(this.config.schema.tables).flatMap((table) => {
|
|
216
|
+
const filter = this.config.visibility?.filter(table, claims);
|
|
217
|
+
return filter
|
|
218
|
+
? [{ table, sql: filter.sql, params: [...(filter.params ?? [])] }]
|
|
219
|
+
: [];
|
|
220
|
+
}),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
async #resolvePullQueries(body, claims, queryAware, transformVersion) {
|
|
224
|
+
if (!queryAware || !body.queries)
|
|
225
|
+
return body;
|
|
226
|
+
const queries = body.queries;
|
|
227
|
+
if (!Array.isArray(queries.patch))
|
|
228
|
+
return body;
|
|
229
|
+
const patch = [];
|
|
230
|
+
for (const operation of queries.patch) {
|
|
231
|
+
if (!operation || typeof operation !== 'object') {
|
|
232
|
+
patch.push(operation);
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const entry = operation;
|
|
236
|
+
if (entry.op !== 'put') {
|
|
237
|
+
patch.push(operation);
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
if (!this.config.resolveQuery || typeof entry.name !== 'string') {
|
|
241
|
+
throw requestError('query put requires a server-resolved named query');
|
|
242
|
+
}
|
|
243
|
+
if (!Array.isArray(entry.args)) {
|
|
244
|
+
throw requestError('named query args must be an array');
|
|
245
|
+
}
|
|
246
|
+
let ast;
|
|
247
|
+
try {
|
|
248
|
+
ast = await this.config.resolveQuery(entry.name, entry.args, claims);
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
throw requestError(`unknown or unsupported named query: ${entry.name}`);
|
|
252
|
+
}
|
|
253
|
+
patch.push({ op: 'put', hash: entry.hash, ast, transformVersion });
|
|
254
|
+
}
|
|
255
|
+
return { ...body, queries: { ...queries, patch } };
|
|
256
|
+
}
|
|
257
|
+
async handlePull(request) {
|
|
258
|
+
try {
|
|
259
|
+
this.#assertAccepting();
|
|
260
|
+
const claims = await this.#claims(request);
|
|
261
|
+
const input = await requestObject(request);
|
|
262
|
+
return await this.#queue.run(async () => {
|
|
263
|
+
this.#assertAvailable();
|
|
264
|
+
const queryAware = typeof this.config.queryAware === 'function'
|
|
265
|
+
? this.config.queryAware(claims)
|
|
266
|
+
: (this.config.queryAware ?? Boolean(this.config.resolveQuery));
|
|
267
|
+
const transformVersion = queryAware
|
|
268
|
+
? typeof this.config.queryTransformVersion === 'function'
|
|
269
|
+
? this.config.queryTransformVersion(claims)
|
|
270
|
+
: (this.config.queryTransformVersion ?? 0)
|
|
271
|
+
: 0;
|
|
272
|
+
if (!Number.isSafeInteger(transformVersion) || transformVersion < 0) {
|
|
273
|
+
throw new TypeError('queryTransformVersion must be a non-negative safe integer');
|
|
274
|
+
}
|
|
275
|
+
let body = await this.#resolvePullQueries(input, claims, queryAware, transformVersion);
|
|
276
|
+
if (queryAware) {
|
|
277
|
+
body = { ...body, _serverQueryTransformVersion: transformVersion };
|
|
278
|
+
}
|
|
279
|
+
const response = await this.#writeTransaction('pull', () => queryAware
|
|
280
|
+
? engine_handle_query_pull(this.#engineDb, this.config.schema, this.#retainChanges, body, claims.userID)
|
|
281
|
+
: engine_handle_pull(this.#engineDb, this.config.schema, this.#visibility(claims), this.caps, this.#retainChanges, body, claims.userID));
|
|
282
|
+
return json(response);
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
return json({ error: errorMessage(error) }, statusOf(error));
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
async handlePush(request) {
|
|
290
|
+
try {
|
|
291
|
+
this.#assertAccepting();
|
|
292
|
+
const claims = await this.#claims(request);
|
|
293
|
+
const body = await requestObject(request);
|
|
294
|
+
return await this.#queue.run(async () => {
|
|
295
|
+
this.#assertAvailable();
|
|
296
|
+
const plan = engine_push_validate(body);
|
|
297
|
+
if (plan.kind === 'respond')
|
|
298
|
+
return json(plan.response);
|
|
299
|
+
const results = [];
|
|
300
|
+
let changed = false;
|
|
301
|
+
for (const mutation of plan.mutations) {
|
|
302
|
+
const deferred = [];
|
|
303
|
+
try {
|
|
304
|
+
await this.#reach('before_mutation');
|
|
305
|
+
const preflight = await this.#writeTransaction('mutation', async () => {
|
|
306
|
+
const decision = engine_preflight(this.#engineDb, plan.clientGroupID, mutation.clientID, mutation.id, claims.userID);
|
|
307
|
+
if (decision.kind === 'replay')
|
|
308
|
+
return decision;
|
|
309
|
+
const mutator = this.config.mutators[mutation.name];
|
|
310
|
+
if (!mutator)
|
|
311
|
+
throw new Error(`unknown mutator: ${mutation.name}`);
|
|
312
|
+
await mutator(this.#mutatorSql, mutation.args[0] ?? null, {
|
|
313
|
+
claims,
|
|
314
|
+
clientID: mutation.clientID,
|
|
315
|
+
mutationID: mutation.id,
|
|
316
|
+
defer(effect) {
|
|
317
|
+
deferred.push(effect);
|
|
318
|
+
},
|
|
319
|
+
});
|
|
320
|
+
engine_finalize(this.#engineDb, plan.clientGroupID, mutation.clientID, mutation.id);
|
|
321
|
+
await this.#reach('after_app_write_before_sqlite_commit');
|
|
322
|
+
return decision;
|
|
323
|
+
});
|
|
324
|
+
if (preflight.kind === 'replay') {
|
|
325
|
+
results.push({
|
|
326
|
+
clientID: mutation.clientID,
|
|
327
|
+
id: mutation.id,
|
|
328
|
+
result: {
|
|
329
|
+
error: 'alreadyProcessed',
|
|
330
|
+
details: `Ignoring mutation from ${mutation.clientID} with ID ${mutation.id} as it was already processed. Expected: ${preflight.expected}`,
|
|
331
|
+
},
|
|
332
|
+
});
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
changed = true;
|
|
336
|
+
results.push({ clientID: mutation.clientID, id: mutation.id, result: {} });
|
|
337
|
+
await this.#runEffects(deferred);
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
if (!(error instanceof MutationApplicationError))
|
|
341
|
+
throw error;
|
|
342
|
+
await this.#writeTransaction('mutation', () => engine_record_app_error(this.#engineDb, plan.clientGroupID, mutation.clientID, mutation.id, claims.userID));
|
|
343
|
+
changed = true;
|
|
344
|
+
results.push({
|
|
345
|
+
clientID: mutation.clientID,
|
|
346
|
+
id: mutation.id,
|
|
347
|
+
result: {
|
|
348
|
+
error: 'app',
|
|
349
|
+
message: error.message,
|
|
350
|
+
details: error.details,
|
|
351
|
+
},
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (plan.mutations.length > 0) {
|
|
356
|
+
await this.#writeTransaction('maintenance', () => engine_prune(this.#engineDb, this.#retainChanges));
|
|
357
|
+
}
|
|
358
|
+
if (changed)
|
|
359
|
+
this.#notifyDataChanged();
|
|
360
|
+
await this.#reach('after_idb_commit_before_response');
|
|
361
|
+
return json(engine_assemble_push_response(results));
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
return json({ error: errorMessage(error) }, statusOf(error));
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
fetch(request) {
|
|
369
|
+
const pathname = new URL(request.url).pathname;
|
|
370
|
+
if (pathname === '/pull' && request.method === 'POST') {
|
|
371
|
+
return this.handlePull(request);
|
|
372
|
+
}
|
|
373
|
+
if (pathname === '/push' && request.method === 'POST') {
|
|
374
|
+
return this.handlePush(request);
|
|
375
|
+
}
|
|
376
|
+
return Promise.resolve(json({ error: 'not found' }, 404));
|
|
377
|
+
}
|
|
378
|
+
async query(sql, params = []) {
|
|
379
|
+
this.#assertAccepting();
|
|
380
|
+
return await this.#queue.run(() => {
|
|
381
|
+
this.#assertAvailable();
|
|
382
|
+
return this.#directSql.query(sql, params);
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
async exec(sql, params = []) {
|
|
386
|
+
this.#assertAccepting();
|
|
387
|
+
await this.#queue.run(async () => {
|
|
388
|
+
await this.#writeTransaction('direct', () => this.#directSql.exec(sql, params));
|
|
389
|
+
this.#notifyDataChanged();
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
subscribe(listener) {
|
|
393
|
+
this.#assertAccepting();
|
|
394
|
+
this.#listeners.add(listener);
|
|
395
|
+
return () => this.#listeners.delete(listener);
|
|
396
|
+
}
|
|
397
|
+
#notifyDataChanged() {
|
|
398
|
+
try {
|
|
399
|
+
this.config.onDataChanged?.();
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
console.error('browser sync data-changed callback failed', error);
|
|
403
|
+
}
|
|
404
|
+
for (const listener of this.#listeners) {
|
|
405
|
+
try {
|
|
406
|
+
listener();
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
console.error('browser sync data-changed listener failed', error);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
async #closeResources() {
|
|
414
|
+
this.#listeners.clear();
|
|
415
|
+
if (this.db.open)
|
|
416
|
+
this.db.close();
|
|
417
|
+
await this.snapshots.close();
|
|
418
|
+
}
|
|
419
|
+
async #finishClose() {
|
|
420
|
+
await this.#queue.drain();
|
|
421
|
+
this.#closed = true;
|
|
422
|
+
await this.#closeResources();
|
|
423
|
+
}
|
|
424
|
+
close() {
|
|
425
|
+
this.#closePromise ??= this.#finishClose();
|
|
426
|
+
return this.#closePromise;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
export function createBrowserSyncHostInternal(config, hooks) {
|
|
430
|
+
return BrowserSyncHostImpl.create(config, hooks);
|
|
431
|
+
}
|
|
432
|
+
export function createBrowserSyncHost(config) {
|
|
433
|
+
return createBrowserSyncHostInternal(config);
|
|
434
|
+
}
|
|
435
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../packages/sync-browser-host/src/host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BedrockBrowserModule } from './sqlite-adapter.js';
|
|
2
|
+
export declare class IndexedDbSnapshotStore {
|
|
3
|
+
#private;
|
|
4
|
+
readonly storageKey: string;
|
|
5
|
+
constructor(storageKey: string);
|
|
6
|
+
restore(module: BedrockBrowserModule): Promise<boolean>;
|
|
7
|
+
checkpoint(module: BedrockBrowserModule): Promise<void>;
|
|
8
|
+
close(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=idb-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idb-snapshot.d.ts","sourceRoot":"","sources":["../../packages/sync-browser-host/src/idb-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AA0F/D,qBAAa,sBAAsB;;IAGrB,QAAQ,CAAC,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM;IAKjC,OAAO,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBvD,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
const DATABASE_NAME = 'orez-sync-browser-host';
|
|
2
|
+
const DATABASE_VERSION = 1;
|
|
3
|
+
const STORE_NAME = 'snapshots';
|
|
4
|
+
const SNAPSHOT_FORMAT_VERSION = 1;
|
|
5
|
+
function requestResult(request) {
|
|
6
|
+
return new Promise((resolve, reject) => {
|
|
7
|
+
request.addEventListener('success', () => resolve(request.result), { once: true });
|
|
8
|
+
request.addEventListener('error', () => reject(request.error ?? new Error('IndexedDB request failed')), { once: true });
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function transactionDone(transaction) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
transaction.addEventListener('complete', () => resolve(), { once: true });
|
|
14
|
+
transaction.addEventListener('abort', () => reject(transaction.error ?? new Error('IndexedDB transaction aborted')), { once: true });
|
|
15
|
+
transaction.addEventListener('error', () => reject(transaction.error ?? new Error('IndexedDB transaction failed')), { once: true });
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async function openSnapshotDatabase() {
|
|
19
|
+
const request = indexedDB.open(DATABASE_NAME, DATABASE_VERSION);
|
|
20
|
+
request.addEventListener('upgradeneeded', () => {
|
|
21
|
+
if (!request.result.objectStoreNames.contains(STORE_NAME)) {
|
|
22
|
+
request.result.createObjectStore(STORE_NAME, { keyPath: 'storageKey' });
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
return requestResult(request);
|
|
26
|
+
}
|
|
27
|
+
function validateSnapshot(value, storageKey) {
|
|
28
|
+
if (!value || typeof value !== 'object') {
|
|
29
|
+
throw new Error(`invalid browser database snapshot for ${storageKey}`);
|
|
30
|
+
}
|
|
31
|
+
const record = value;
|
|
32
|
+
if (record.storageKey !== storageKey) {
|
|
33
|
+
throw new Error(`browser database snapshot key mismatch for ${storageKey}`);
|
|
34
|
+
}
|
|
35
|
+
if (record.formatVersion !== SNAPSHOT_FORMAT_VERSION) {
|
|
36
|
+
throw new Error(`unsupported browser database snapshot format ${String(record.formatVersion)}`);
|
|
37
|
+
}
|
|
38
|
+
if (!Array.isArray(record.files)) {
|
|
39
|
+
throw new Error(`browser database snapshot has no files for ${storageKey}`);
|
|
40
|
+
}
|
|
41
|
+
const paths = new Set();
|
|
42
|
+
for (const file of record.files) {
|
|
43
|
+
if (!file ||
|
|
44
|
+
typeof file.path !== 'string' ||
|
|
45
|
+
!Number.isSafeInteger(file.size) ||
|
|
46
|
+
file.size < 0 ||
|
|
47
|
+
!(file.data instanceof ArrayBuffer) ||
|
|
48
|
+
file.size > file.data.byteLength ||
|
|
49
|
+
paths.has(file.path)) {
|
|
50
|
+
throw new Error(`invalid browser database snapshot file for ${storageKey}`);
|
|
51
|
+
}
|
|
52
|
+
paths.add(file.path);
|
|
53
|
+
}
|
|
54
|
+
return record;
|
|
55
|
+
}
|
|
56
|
+
export class IndexedDbSnapshotStore {
|
|
57
|
+
storageKey;
|
|
58
|
+
#database;
|
|
59
|
+
constructor(storageKey) {
|
|
60
|
+
this.storageKey = storageKey;
|
|
61
|
+
if (!storageKey)
|
|
62
|
+
throw new TypeError('storageKey must not be empty');
|
|
63
|
+
this.#database = openSnapshotDatabase();
|
|
64
|
+
}
|
|
65
|
+
async restore(module) {
|
|
66
|
+
const database = await this.#database;
|
|
67
|
+
const transaction = database.transaction(STORE_NAME, 'readonly');
|
|
68
|
+
const value = await requestResult(transaction.objectStore(STORE_NAME).get(this.storageKey));
|
|
69
|
+
await transactionDone(transaction);
|
|
70
|
+
if (value === undefined)
|
|
71
|
+
return false;
|
|
72
|
+
const snapshot = validateSnapshot(value, this.storageKey);
|
|
73
|
+
const files = {};
|
|
74
|
+
for (const file of snapshot.files) {
|
|
75
|
+
const data = new Uint8Array(file.data.slice(0));
|
|
76
|
+
files[file.path] = { data, size: file.size };
|
|
77
|
+
}
|
|
78
|
+
module._memfs.files = files;
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
async checkpoint(module) {
|
|
82
|
+
const files = Object.entries(module._memfs.files).map(([path, file]) => {
|
|
83
|
+
if (!Number.isSafeInteger(file.size) ||
|
|
84
|
+
file.size < 0 ||
|
|
85
|
+
file.size > file.data.length) {
|
|
86
|
+
throw new Error(`invalid Bedrock VFS file ${path}`);
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
path,
|
|
90
|
+
size: file.size,
|
|
91
|
+
data: file.data.slice(0, file.size).buffer,
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
const record = {
|
|
95
|
+
storageKey: this.storageKey,
|
|
96
|
+
formatVersion: SNAPSHOT_FORMAT_VERSION,
|
|
97
|
+
files,
|
|
98
|
+
};
|
|
99
|
+
const database = await this.#database;
|
|
100
|
+
const transaction = database.transaction(STORE_NAME, 'readwrite');
|
|
101
|
+
transaction.objectStore(STORE_NAME).put(record);
|
|
102
|
+
await transactionDone(transaction);
|
|
103
|
+
}
|
|
104
|
+
async close() {
|
|
105
|
+
;
|
|
106
|
+
(await this.#database).close();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=idb-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idb-snapshot.js","sourceRoot":"","sources":["../../packages/sync-browser-host/src/idb-snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createBrowserSyncHost } from './host.js';
|
|
2
|
+
export { createBrowserSyncHostPortClient, serveBrowserSyncHostPort, } from './message-port.js';
|
|
3
|
+
export { MutationApplicationError, registerMutators, type BrowserSyncHost, type BrowserSyncHostAssets, type BrowserSyncHostConfig, type BrowserSyncHostPortClient, type DeferredEffect, type JsonPrimitive, type JsonValue, type MutatorContext, type MutatorRegistry, type MutatorSql, type NormalizedClaims, type PullCaps, type QueryResolver, type RegisteredMutator, type SyncSql, type VisibilityConfig, type VisibilityFilter, type ZeroSchemaConfig, } from './types.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/sync-browser-host/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EACL,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../packages/sync-browser-host/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EACL,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,wBAAwB,EACxB,gBAAgB,GAmBjB,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { BrowserHostTestHooks } from './host.js';
|
|
2
|
+
import type { BrowserSyncHost, BrowserSyncHostPortClient } from './types.js';
|
|
3
|
+
export declare function serveBrowserSyncHostPortInternal(host: BrowserSyncHost, port: MessagePort, hooks?: BrowserHostTestHooks): () => void;
|
|
4
|
+
export declare function serveBrowserSyncHostPort(host: BrowserSyncHost, port: MessagePort): () => void;
|
|
5
|
+
export declare function createBrowserSyncHostPortClient(port: MessagePort): BrowserSyncHostPortClient;
|
|
6
|
+
//# sourceMappingURL=message-port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-port.d.ts","sourceRoot":"","sources":["../../packages/sync-browser-host/src/message-port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAA6B,MAAM,WAAW,CAAA;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAgG5E,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,WAAW,EACjB,KAAK,CAAC,EAAE,oBAAoB,GAC3B,MAAM,IAAI,CA2DZ;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,WAAW,GAChB,MAAM,IAAI,CAEZ;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,WAAW,GAChB,yBAAyB,CAuE3B"}
|