firebird-wasm 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/README.md +30 -14
  3. package/dist/.tsbuildinfo.build +1 -1
  4. package/dist/browser/engine-transport.d.ts +2 -0
  5. package/dist/browser/engine-transport.d.ts.map +1 -1
  6. package/dist/browser/engine-transport.js +38 -3
  7. package/dist/browser/engine-transport.js.map +1 -1
  8. package/dist/browser/index.d.ts +1 -1
  9. package/dist/browser/index.d.ts.map +1 -1
  10. package/dist/browser/index.js +2 -1
  11. package/dist/browser/index.js.map +1 -1
  12. package/dist/browser/params.d.ts +8 -2
  13. package/dist/browser/params.d.ts.map +1 -1
  14. package/dist/browser/params.js +14 -5
  15. package/dist/browser/params.js.map +1 -1
  16. package/dist/electric/index.d.ts +52 -2
  17. package/dist/electric/index.d.ts.map +1 -1
  18. package/dist/electric/index.js +266 -98
  19. package/dist/electric/index.js.map +1 -1
  20. package/dist/electric/serial.d.ts +20 -0
  21. package/dist/electric/serial.d.ts.map +1 -0
  22. package/dist/electric/serial.js +29 -0
  23. package/dist/electric/serial.js.map +1 -0
  24. package/dist/electric/values.d.ts.map +1 -1
  25. package/dist/electric/values.js +17 -3
  26. package/dist/electric/values.js.map +1 -1
  27. package/dist/electric/writes.d.ts +99 -0
  28. package/dist/electric/writes.d.ts.map +1 -0
  29. package/dist/electric/writes.js +282 -0
  30. package/dist/electric/writes.js.map +1 -0
  31. package/dist/electric-server/capture.d.ts +17 -2
  32. package/dist/electric-server/capture.d.ts.map +1 -1
  33. package/dist/electric-server/capture.js +100 -24
  34. package/dist/electric-server/capture.js.map +1 -1
  35. package/dist/electric-server/catalog.d.ts +3 -1
  36. package/dist/electric-server/catalog.d.ts.map +1 -1
  37. package/dist/electric-server/catalog.js +18 -3
  38. package/dist/electric-server/catalog.js.map +1 -1
  39. package/dist/electric-server/index.d.ts +30 -3
  40. package/dist/electric-server/index.d.ts.map +1 -1
  41. package/dist/electric-server/index.js +258 -78
  42. package/dist/electric-server/index.js.map +1 -1
  43. package/dist/electric-server/where.d.ts +30 -0
  44. package/dist/electric-server/where.d.ts.map +1 -0
  45. package/dist/electric-server/where.js +243 -0
  46. package/dist/electric-server/where.js.map +1 -0
  47. package/dist/firebird.d.ts.map +1 -1
  48. package/dist/firebird.js +10 -1
  49. package/dist/firebird.js.map +1 -1
  50. package/dist/index.d.ts +1 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +2 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/version.d.ts +1 -1
  55. package/dist/version.js +1 -1
  56. package/dist/wasm/firebird-embedded-st.js +1 -1
  57. package/dist/wasm/firebird-embedded-st.wasm +0 -0
  58. package/dist/wasm/firebird-embedded.js +1 -1
  59. package/dist/wasm/firebird-embedded.wasm +0 -0
  60. package/dist/wasm-loader.d.ts +57 -7
  61. package/dist/wasm-loader.d.ts.map +1 -1
  62. package/dist/wasm-loader.js +106 -21
  63. package/dist/wasm-loader.js.map +1 -1
  64. package/package.json +1 -1
@@ -26,8 +26,9 @@
26
26
  * this module.
27
27
  */
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.firebirdName = exports.firebirdColumn = exports.toFirebird = exports.checkSchema = exports.tableFromSchema = void 0;
29
+ exports.WriteRejected = exports.createWriteQueue = exports.firebirdName = exports.firebirdColumn = exports.toFirebird = exports.checkSchema = exports.tableFromSchema = void 0;
30
30
  exports.syncShapeToTable = syncShapeToTable;
31
+ exports.syncShapesToTables = syncShapesToTables;
31
32
  const client_1 = require("@electric-sql/client");
32
33
  const apply_1 = require("./apply");
33
34
  const values_1 = require("./values");
@@ -37,6 +38,11 @@ Object.defineProperty(exports, "checkSchema", { enumerable: true, get: function
37
38
  Object.defineProperty(exports, "toFirebird", { enumerable: true, get: function () { return values_2.toFirebird; } });
38
39
  Object.defineProperty(exports, "firebirdColumn", { enumerable: true, get: function () { return values_2.firebirdColumn; } });
39
40
  Object.defineProperty(exports, "firebirdName", { enumerable: true, get: function () { return values_2.firebirdName; } });
41
+ var writes_1 = require("./writes");
42
+ Object.defineProperty(exports, "createWriteQueue", { enumerable: true, get: function () { return writes_1.createWriteQueue; } });
43
+ Object.defineProperty(exports, "WriteRejected", { enumerable: true, get: function () { return writes_1.WriteRejected; } });
44
+ const writes_2 = require("./writes");
45
+ const serial_1 = require("./serial");
40
46
  const METADATA = '"ELECTRIC_SHAPES"';
41
47
  /** Electric's own parsing, turned off for the types it parses: values stay Postgres text. */
42
48
  const IDENTITY = (value) => value;
@@ -46,38 +52,80 @@ const KEEP_TEXT = Object.fromEntries(['int2', 'int4', 'int8', 'float4', 'float8'
46
52
  * change, until {@link ShapeSync.unsubscribe}. The table must exist.
47
53
  */
48
54
  async function syncShapeToTable(db, options) {
49
- const table = (0, values_1.firebirdName)(options.table);
50
- const column = (name) => options.columns?.[name] !== undefined ? (0, values_1.firebirdName)(options.columns[name]) : (0, apply_1.defaultColumn)(name);
51
- const eventName = options.event === undefined
52
- ? `electric_${options.shapeKey ?? options.table}`
53
- : options.event;
55
+ return syncShapes(db, {
56
+ shapes: [{
57
+ shape: options.shape,
58
+ table: options.table,
59
+ primaryKey: options.primaryKey,
60
+ columns: options.columns,
61
+ positionKey: options.shapeKey,
62
+ }],
63
+ event: options.event === undefined ? `electric_${options.shapeKey ?? options.table}` : options.event,
64
+ onError: options.onError,
65
+ writes: options.writes,
66
+ ShapeStream: options.ShapeStream,
67
+ });
68
+ }
69
+ /**
70
+ * Keep several tables in step with several shapes, together: every batch is
71
+ * applied in one Firebird transaction with all the shapes' positions, so a
72
+ * Postgres transaction that wrote to two of them never shows in one table
73
+ * and not the other.
74
+ *
75
+ * A batch is applied once every shape has reached up-to-date after the last
76
+ * change it received. Electric marks each up-to-date with the last
77
+ * Postgres position it has seen (`global_last_seen_lsn`); where it does, the
78
+ * shapes must also be at the same one, and a shape behind is asked to
79
+ * refresh, so the batch holds the whole of each transaction it holds any of.
80
+ * The tables must exist.
81
+ */
82
+ async function syncShapesToTables(db, options) {
83
+ const names = Object.keys(options.shapes);
84
+ if (names.length === 0)
85
+ throw new RangeError('syncShapesToTables needs at least one shape');
86
+ const tables = names.map((n) => (0, values_1.firebirdName)(options.shapes[n].table));
87
+ if (new Set(tables).size !== tables.length)
88
+ throw new RangeError('Each shape needs a table of its own');
89
+ return syncShapes(db, {
90
+ shapes: names.map((name) => ({
91
+ ...options.shapes[name],
92
+ positionKey: options.key === null ? null : `${options.key}:${name}`,
93
+ })),
94
+ event: options.event === undefined ? (options.key === null ? null : `electric_${options.key}`) : options.event,
95
+ onError: options.onError,
96
+ writes: options.writes,
97
+ ShapeStream: options.ShapeStream,
98
+ });
99
+ }
100
+ async function syncShapes(given, options) {
54
101
  const report = options.onError ?? ((e) => console.error('[firebird-wasm/electric] sync stopped', e));
55
- // Where a previous sync stopped.
56
- let position;
57
- // Its own transaction: Firebird applies DDL at commit, so a table made in
58
- // a transaction cannot be read in that same transaction.
59
- await db.transaction((tx) => ensureMetadata(tx));
102
+ const eventName = options.event;
103
+ // One transaction at a time with the other syncs and the write queue.
104
+ const db = (0, serial_1.serialDatabase)(given);
105
+ // Where a previous sync stopped. Its own transaction first: Firebird
106
+ // applies DDL at commit, so a table made in a transaction cannot be read
107
+ // in that same transaction.
108
+ await ensureMetadata(db);
109
+ const positions = new Map();
60
110
  await db.transaction(async (tx) => {
61
- if (options.shapeKey !== null) {
62
- const { rows } = await tx.query(`SELECT SHAPE_HANDLE, SHAPE_OFFSET, SHAPE_SCHEMA FROM ${METADATA} WHERE SHAPE_KEY = ?`, [options.shapeKey]);
111
+ for (const spec of options.shapes) {
112
+ if (spec.positionKey === null)
113
+ continue;
114
+ const { rows } = await tx.query(`SELECT SHAPE_HANDLE, SHAPE_OFFSET, SHAPE_SCHEMA FROM ${METADATA} WHERE SHAPE_KEY = ?`, [spec.positionKey]);
63
115
  const row = rows[0];
64
116
  if (row && row['SHAPE_HANDLE'] && row['SHAPE_OFFSET']) {
65
- position = {
117
+ positions.set(spec.positionKey, {
66
118
  handle: String(row['SHAPE_HANDLE']),
67
119
  offset: String(row['SHAPE_OFFSET']),
68
120
  schema: JSON.parse(String(row['SHAPE_SCHEMA'] ?? '{}')),
69
- };
121
+ });
70
122
  }
71
123
  }
72
124
  });
73
- let schema = position?.schema;
74
- let checked = false;
75
- // Operations received since the last up-to-date; applied together at the next.
76
- let pending = options.shapeKey === null || !position ? [{ kind: 'reset' }] : [];
77
125
  let upToDate = false;
78
126
  let failure;
79
127
  let stopped = false;
80
- let applying = Promise.resolve();
128
+ let committing = Promise.resolve();
81
129
  let resolveReady;
82
130
  let rejectReady;
83
131
  const ready = new Promise((resolve, reject) => {
@@ -85,104 +133,199 @@ async function syncShapeToTable(db, options) {
85
133
  rejectReady = reject;
86
134
  });
87
135
  ready.catch(() => undefined);
88
- const abort = new AbortController();
89
- const userSignal = options.shape.signal;
90
- if (userSignal)
91
- userSignal.addEventListener('abort', () => abort.abort(), { once: true });
92
- // The schema arrives as a header, which the client does not hand on.
93
- const baseFetch = options.shape.fetchClient ?? ((...args) => fetch(...args));
94
- const fetchClient = async (input, init) => {
95
- const response = await baseFetch(input, init);
96
- const header = response.headers.get('electric-schema');
97
- if (header) {
98
- schema = JSON.parse(header);
99
- checked = false;
100
- }
101
- return response;
102
- };
103
136
  const Stream = options.ShapeStream ?? client_1.ShapeStream;
104
- const stream = new Stream({
105
- ...options.shape,
106
- signal: abort.signal,
107
- fetchClient,
108
- parser: KEEP_TEXT,
109
- ...(position ? { handle: position.handle, offset: position.offset } : {}),
110
- onError: (error) => {
111
- // The client has already retried what it retries; this is final.
112
- void stop(error);
113
- },
114
- });
137
+ const states = [];
115
138
  const stop = async (error) => {
116
139
  if (stopped)
117
140
  return;
118
141
  stopped = true;
119
- abort.abort();
120
- stream.unsubscribeAll();
142
+ for (const s of states) {
143
+ s.abort.abort();
144
+ s.stream.unsubscribeAll();
145
+ }
121
146
  if (error) {
122
147
  failure = error;
123
148
  rejectReady(error);
124
149
  report(error);
125
150
  }
126
151
  };
127
- const apply = async (entries) => {
128
- if (!schema)
129
- throw new Error('Electric sent rows before a schema; the sync cannot map them');
130
- if (!checked) {
131
- (0, values_1.checkSchema)(schema);
132
- checked = true;
152
+ /** Apply every shape's pending operations, and every position, in one transaction. */
153
+ const commit = async () => {
154
+ const batch = states.map((s) => ({ s, entries: s.pending, handle: s.handle, offset: s.offset }));
155
+ const txids = new Set();
156
+ for (const s of states) {
157
+ s.pending = [];
158
+ for (const t of s.txids)
159
+ txids.add(t);
160
+ s.txids = new Set();
133
161
  }
134
- const target = {
135
- table,
136
- column,
137
- schema,
138
- primaryKey: options.primaryKey ?? (0, values_1.primaryKeyOf)(schema),
139
- };
140
- if (target.primaryKey.length === 0) {
141
- throw new Error(`The shape of ${options.table} has no primary key; pass primaryKey`);
142
- }
143
- const handle = stream.shapeHandle;
144
- const offset = String(stream.lastOffset);
145
- const schemaText = JSON.stringify(schema);
162
+ const targets = batch.map(({ s }) => {
163
+ const schema = s.schema;
164
+ if (!schema)
165
+ throw new Error('Electric sent rows before a schema; the sync cannot map them');
166
+ if (!s.checked) {
167
+ (0, values_1.checkSchema)(schema);
168
+ s.checked = true;
169
+ }
170
+ const primaryKey = s.spec.primaryKey ?? (0, values_1.primaryKeyOf)(schema);
171
+ if (primaryKey.length === 0) {
172
+ throw new Error(`The shape of ${s.spec.table} has no primary key; pass primaryKey`);
173
+ }
174
+ return { table: s.table, column: s.column, schema, primaryKey };
175
+ });
146
176
  await db.transaction(async (tx) => {
147
- await (0, apply_1.applyEntries)(tx, target, entries);
148
- if (options.shapeKey !== null && handle) {
149
- await tx.exec(`UPDATE OR INSERT INTO ${METADATA} (SHAPE_KEY, SHAPE_HANDLE, SHAPE_OFFSET, SHAPE_SCHEMA) ` +
150
- 'VALUES (?, ?, ?, ?) MATCHING (SHAPE_KEY)', [options.shapeKey, handle, offset, schemaText]);
177
+ for (let i = 0; i < batch.length; i++) {
178
+ const { s, entries, handle, offset } = batch[i];
179
+ await (0, apply_1.applyEntries)(tx, targets[i], entries);
180
+ if (options.writes) {
181
+ // Local writes stay over what the source sent, until it sends them back.
182
+ const keys = targets[i].primaryKey;
183
+ const touched = entries.some((e) => e.kind === 'reset')
184
+ ? 'all'
185
+ : new Set(entries.map((e) => (0, writes_2.writeKeyText)(Object.fromEntries(keys.map((k) => [k, e.value[k]])))));
186
+ await options.writes.sync.reconcile(tx, s.spec.table, touched, txids);
187
+ }
188
+ if (s.spec.positionKey !== null && handle && offset) {
189
+ await tx.exec(`UPDATE OR INSERT INTO ${METADATA} (SHAPE_KEY, SHAPE_HANDLE, SHAPE_OFFSET, SHAPE_SCHEMA) ` +
190
+ 'VALUES (?, ?, ?, ?) MATCHING (SHAPE_KEY)', [s.spec.positionKey, handle, offset, JSON.stringify(targets[i].schema)]);
191
+ }
151
192
  }
152
193
  if (eventName) {
153
194
  await tx.exec('EXECUTE BLOCK (event_name VARCHAR(127) = ?) AS BEGIN POST_EVENT :event_name; END', [eventName]);
154
195
  }
155
196
  });
197
+ if (!upToDate) {
198
+ upToDate = true;
199
+ resolveReady();
200
+ }
156
201
  };
157
- stream.subscribe(async (messages) => {
158
- if (stopped)
202
+ /** Commit if every shape is at a transaction boundary, and the same one where that is known. */
203
+ const settle = async () => {
204
+ if (stopped || states.some((s) => !s.seen || s.dirty))
159
205
  return;
160
- for (const message of messages) {
161
- if ((0, client_1.isChangeMessage)(message)) {
162
- pending.push({ kind: message.headers.operation, value: message.value });
206
+ const lsns = states.map((s) => s.lsn);
207
+ if (lsns.every((l) => l !== undefined)) {
208
+ const top = lsns.reduce((a, b) => (b > a ? b : a));
209
+ const behind = states.filter((s) => s.lsn < top);
210
+ if (behind.length > 0) {
211
+ // Idle in a long poll since an earlier position: ask for the current one.
212
+ for (const s of behind) {
213
+ if (s.refreshing)
214
+ continue;
215
+ s.refreshing = true;
216
+ void s.stream.forceDisconnectAndRefresh?.().catch(() => undefined);
217
+ }
218
+ return;
163
219
  }
164
- else if ((0, client_1.isControlMessage)(message) && message.headers.control === 'must-refetch') {
165
- // What came before belongs to a shape that no longer exists.
166
- pending = [{ kind: 'reset' }];
220
+ }
221
+ committing = committing.then(commit);
222
+ await committing;
223
+ };
224
+ /** Start (or start again) following one shape, from `position` or from scratch. */
225
+ const open = (state, position) => {
226
+ const spec = state.spec;
227
+ const abort = new AbortController();
228
+ const userSignal = spec.shape.signal;
229
+ if (userSignal)
230
+ userSignal.addEventListener('abort', () => abort.abort(), { once: true });
231
+ state.abort = abort;
232
+ // The schema arrives as a header, which the client does not hand on.
233
+ const baseFetch = spec.shape.fetchClient ?? ((...args) => fetch(...args));
234
+ const fetchClient = async (input, init) => {
235
+ const response = await baseFetch(input, init);
236
+ const header = response.headers.get('electric-schema');
237
+ if (header) {
238
+ state.schema = JSON.parse(header);
239
+ state.checked = false;
167
240
  }
168
- else if ((0, client_1.isControlMessage)(message) && message.headers.control === 'up-to-date') {
169
- const entries = pending;
170
- pending = [];
171
- applying = applying.then(() => apply(entries));
172
- try {
173
- await applying;
241
+ return response;
242
+ };
243
+ const stream = new Stream({
244
+ ...spec.shape,
245
+ signal: abort.signal,
246
+ fetchClient,
247
+ parser: KEEP_TEXT,
248
+ ...(position ? { handle: position.handle, offset: position.offset } : {}),
249
+ onError: (error) => {
250
+ // The client has already retried what it retries; this is final.
251
+ void stop(error);
252
+ },
253
+ });
254
+ state.stream = stream;
255
+ stream.subscribe(async (messages) => {
256
+ if (stopped || state.stream !== stream)
257
+ return;
258
+ for (const message of messages) {
259
+ if ((0, client_1.isChangeMessage)(message)) {
260
+ state.pending.push({ kind: message.headers.operation, value: message.value });
261
+ state.dirty = true;
262
+ const txids = message.headers.txids;
263
+ if (txids)
264
+ for (const t of txids)
265
+ state.txids.add(String(t));
174
266
  }
175
- catch (err) {
176
- await stop(err instanceof Error ? err : new Error(String(err)));
177
- return;
267
+ else if ((0, client_1.isControlMessage)(message) && message.headers.control === 'must-refetch') {
268
+ // What came before belongs to a shape that no longer exists.
269
+ state.pending = [{ kind: 'reset' }];
270
+ state.dirty = true;
178
271
  }
179
- if (!upToDate) {
180
- upToDate = true;
181
- resolveReady();
272
+ else if ((0, client_1.isControlMessage)(message) && message.headers.control === 'up-to-date') {
273
+ state.dirty = false;
274
+ state.seen = true;
275
+ state.refreshing = false;
276
+ const lsn = message.headers.global_last_seen_lsn;
277
+ state.lsn = lsn !== undefined && /^\d+$/.test(lsn) ? BigInt(lsn) : undefined;
278
+ state.handle = stream.shapeHandle ?? state.handle;
279
+ state.offset = String(stream.lastOffset);
280
+ try {
281
+ await settle();
282
+ }
283
+ catch (err) {
284
+ await stop(err instanceof Error ? err : new Error(String(err)));
285
+ return;
286
+ }
182
287
  }
183
288
  }
289
+ });
290
+ };
291
+ const unregister = [];
292
+ for (const spec of options.shapes) {
293
+ const position = spec.positionKey === null ? undefined : positions.get(spec.positionKey);
294
+ const state = {
295
+ spec,
296
+ table: (0, values_1.firebirdName)(spec.table),
297
+ column: (name) => spec.columns?.[name] !== undefined ? (0, values_1.firebirdName)(spec.columns[name]) : (0, apply_1.defaultColumn)(name),
298
+ stream: undefined,
299
+ abort: new AbortController(),
300
+ schema: position?.schema,
301
+ checked: false,
302
+ pending: position ? [] : [{ kind: 'reset' }],
303
+ dirty: false,
304
+ seen: false,
305
+ lsn: undefined,
306
+ handle: position?.handle,
307
+ offset: position?.offset,
308
+ refreshing: false,
309
+ txids: new Set(),
310
+ };
311
+ states.push(state);
312
+ open(state, position);
313
+ if (options.writes) {
314
+ // A rejected write is rolled back by fetching the table's shape again:
315
+ // the source's rows, then the writes still pending over them.
316
+ unregister.push(options.writes.sync.register(spec.table, () => {
317
+ if (stopped)
318
+ return;
319
+ state.abort.abort();
320
+ state.stream.unsubscribeAll();
321
+ state.pending = [{ kind: 'reset' }];
322
+ state.dirty = true;
323
+ state.seen = false;
324
+ state.lsn = undefined;
325
+ open(state, undefined);
326
+ }));
184
327
  }
185
- });
328
+ }
186
329
  return {
187
330
  upToDate: ready,
188
331
  get isUpToDate() {
@@ -192,19 +335,44 @@ async function syncShapeToTable(db, options) {
192
335
  return failure;
193
336
  },
194
337
  unsubscribe: async () => {
338
+ for (const u of unregister)
339
+ u();
195
340
  await stop();
196
- await applying.catch(() => undefined);
341
+ await committing.catch(() => undefined);
197
342
  rejectReady(new Error('The sync was stopped before it was up to date'));
198
343
  },
199
344
  };
200
345
  }
201
346
  /** The table holding each shape's position, made on first use. */
202
- async function ensureMetadata(tx) {
347
+ async function hasMetadata(tx) {
203
348
  const { rows } = await tx.query("SELECT 1 AS X FROM RDB$RELATIONS WHERE RDB$RELATION_NAME = 'ELECTRIC_SHAPES'");
204
- if (rows.length > 0)
205
- return;
206
- await tx.exec(`CREATE TABLE ${METADATA} (` +
207
- 'SHAPE_KEY VARCHAR(255) NOT NULL PRIMARY KEY, ' +
208
- 'SHAPE_HANDLE VARCHAR(255), SHAPE_OFFSET VARCHAR(64), SHAPE_SCHEMA BLOB SUB_TYPE TEXT)');
349
+ return rows.length > 0;
350
+ }
351
+ /**
352
+ * Create the metadata table unless it is there. Two syncs started together
353
+ * on a new database both find it missing and both create it; the one whose
354
+ * creation fails looks again and goes on with the table the other made.
355
+ */
356
+ async function ensureMetadata(db) {
357
+ for (let attempt = 1;; attempt++) {
358
+ try {
359
+ await db.transaction(async (tx) => {
360
+ if (await hasMetadata(tx))
361
+ return;
362
+ await tx.exec(`CREATE TABLE ${METADATA} (` +
363
+ 'SHAPE_KEY VARCHAR(255) NOT NULL PRIMARY KEY, ' +
364
+ 'SHAPE_HANDLE VARCHAR(255), SHAPE_OFFSET VARCHAR(64), SHAPE_SCHEMA BLOB SUB_TYPE TEXT)');
365
+ });
366
+ return;
367
+ }
368
+ catch (error) {
369
+ if (await db.transaction((tx) => hasMetadata(tx)))
370
+ return;
371
+ // The other creation may not have committed yet.
372
+ if (attempt >= 5)
373
+ throw error;
374
+ await new Promise((resolve) => setTimeout(resolve, 20 * attempt));
375
+ }
376
+ }
209
377
  }
210
378
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/electric/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/electric/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * serial.ts – one transaction at a time per database, among the syncs and
3
+ * the write queue.
4
+ *
5
+ * A sync's batch and a local write can both change the same row. Two such
6
+ * transactions at once on one connection would wait on each other's lock in
7
+ * the engine, and the browser engine answers one call at a time: the wait
8
+ * would never end. So every transaction this module runs on a database
9
+ * waits for the one before it.
10
+ */
11
+ /** Run `fn` once every earlier `serially(db, …)` call has finished. */
12
+ export declare function serially<T>(db: object, fn: () => Promise<T>): Promise<T>;
13
+ /** Anything with Firebird-style transactions. */
14
+ interface Transactional<Tx> {
15
+ transaction<T>(fn: (tx: Tx) => Promise<T>): Promise<T>;
16
+ }
17
+ /** `db` with its `transaction` queued behind every other one run through this module. */
18
+ export declare function serialDatabase<Tx>(db: Transactional<Tx>): Transactional<Tx>;
19
+ export {};
20
+ //# sourceMappingURL=serial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serial.d.ts","sourceRoot":"","sources":["../../src/electric/serial.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,uEAAuE;AACvE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAKxE;AAED,iDAAiD;AACjD,UAAU,aAAa,CAAC,EAAE;IACxB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACxD;AAED,yFAAyF;AACzF,wBAAgB,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC,CAI3E"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ /**
3
+ * serial.ts – one transaction at a time per database, among the syncs and
4
+ * the write queue.
5
+ *
6
+ * A sync's batch and a local write can both change the same row. Two such
7
+ * transactions at once on one connection would wait on each other's lock in
8
+ * the engine, and the browser engine answers one call at a time: the wait
9
+ * would never end. So every transaction this module runs on a database
10
+ * waits for the one before it.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.serially = serially;
14
+ exports.serialDatabase = serialDatabase;
15
+ const queues = new WeakMap();
16
+ /** Run `fn` once every earlier `serially(db, …)` call has finished. */
17
+ function serially(db, fn) {
18
+ const previous = queues.get(db) ?? Promise.resolve();
19
+ const result = previous.then(fn, fn);
20
+ queues.set(db, result.catch(() => undefined));
21
+ return result;
22
+ }
23
+ /** `db` with its `transaction` queued behind every other one run through this module. */
24
+ function serialDatabase(db) {
25
+ return {
26
+ transaction: (fn) => serially(db, () => db.transaction(fn)),
27
+ };
28
+ }
29
+ //# sourceMappingURL=serial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serial.js","sourceRoot":"","sources":["../../src/electric/serial.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAKH,4BAKC;AAQD,wCAIC;AApBD,MAAM,MAAM,GAAG,IAAI,OAAO,EAA4B,CAAC;AAEvD,uEAAuE;AACvE,SAAgB,QAAQ,CAAI,EAAU,EAAE,EAAoB;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC;AAChB,CAAC;AAOD,yFAAyF;AACzF,SAAgB,cAAc,CAAK,EAAqB;IACtD,OAAO;QACL,WAAW,EAAE,CAAI,EAA0B,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;KACvF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/electric/values.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AA2G5D;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAaxD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAQxF;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAwCD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAe7E;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,EAAE,CAK7D"}
1
+ {"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/electric/values.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAwH5D;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAaxD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAQxF;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAyCD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAgB7E;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,EAAE,CAK7D"}
@@ -82,6 +82,18 @@ const asZoned = (text, column) => {
82
82
  }
83
83
  return fourDigitFraction(match[1]) + offset(match[2], match[3], match[4]);
84
84
  };
85
+ // Postgres's hex output (`\x` and two digits a byte), the default since 9.0,
86
+ // into the bytes, which bind as themselves into a BLOB SUB_TYPE BINARY.
87
+ const asBytes = (text, column) => {
88
+ if (!/^\\x([0-9a-fA-F]{2})*$/.test(text)) {
89
+ throw new RangeError(`Column ${column} holds bytea that is not in hex form (\\x…); ` +
90
+ "Postgres's bytea_output must be 'hex', its default");
91
+ }
92
+ const bytes = new Uint8Array((text.length - 2) / 2);
93
+ for (let i = 0; i < bytes.length; i++)
94
+ bytes[i] = parseInt(text.slice(2 + i * 2, 4 + i * 2), 16);
95
+ return bytes;
96
+ };
85
97
  /** Postgres type name to its conversion, for every type this maps. */
86
98
  const CONVERSIONS = {
87
99
  int2: asInteger,
@@ -104,11 +116,10 @@ const CONVERSIONS = {
104
116
  timestamp: asTimestamp,
105
117
  timetz: asZoned,
106
118
  timestamptz: asZoned,
119
+ bytea: asBytes,
107
120
  };
108
121
  /** Why a type is not mapped, where there is more to say than "not yet". */
109
- const REFUSED = {
110
- bytea: 'bytea is not mapped yet: the WASM build binds parameters as text, and bytes are not text',
111
- };
122
+ const REFUSED = {};
112
123
  /**
113
124
  * Check that every column of `schema` can be stored, before any row is.
114
125
  * @throws naming each column and type that cannot.
@@ -196,6 +207,7 @@ function firebirdType(info) {
196
207
  case 'timetz': return 'TIME WITH TIME ZONE';
197
208
  case 'timestamp': return 'TIMESTAMP';
198
209
  case 'timestamptz': return 'TIMESTAMP WITH TIME ZONE';
210
+ case 'bytea': return 'BLOB SUB_TYPE BINARY';
199
211
  case 'text':
200
212
  case 'name':
201
213
  case 'citext':
@@ -226,6 +238,8 @@ function tableFromSchema(table, schema) {
226
238
  let type = firebirdType(info);
227
239
  if (key.includes(name) && type === 'BLOB SUB_TYPE TEXT')
228
240
  type = 'VARCHAR(255)';
241
+ if (key.includes(name) && type === 'BLOB SUB_TYPE BINARY')
242
+ type = 'VARCHAR(255) CHARACTER SET OCTETS';
229
243
  const notNull = info.not_null || key.includes(name) ? ' NOT NULL' : '';
230
244
  return ` ${firebirdColumn(name)} ${type}${notNull}`;
231
245
  });