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.
- package/CHANGELOG.md +125 -0
- package/README.md +30 -14
- package/dist/.tsbuildinfo.build +1 -1
- package/dist/browser/engine-transport.d.ts +2 -0
- package/dist/browser/engine-transport.d.ts.map +1 -1
- package/dist/browser/engine-transport.js +38 -3
- package/dist/browser/engine-transport.js.map +1 -1
- package/dist/browser/index.d.ts +1 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +2 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/params.d.ts +8 -2
- package/dist/browser/params.d.ts.map +1 -1
- package/dist/browser/params.js +14 -5
- package/dist/browser/params.js.map +1 -1
- package/dist/electric/index.d.ts +52 -2
- package/dist/electric/index.d.ts.map +1 -1
- package/dist/electric/index.js +266 -98
- package/dist/electric/index.js.map +1 -1
- package/dist/electric/serial.d.ts +20 -0
- package/dist/electric/serial.d.ts.map +1 -0
- package/dist/electric/serial.js +29 -0
- package/dist/electric/serial.js.map +1 -0
- package/dist/electric/values.d.ts.map +1 -1
- package/dist/electric/values.js +17 -3
- package/dist/electric/values.js.map +1 -1
- package/dist/electric/writes.d.ts +99 -0
- package/dist/electric/writes.d.ts.map +1 -0
- package/dist/electric/writes.js +282 -0
- package/dist/electric/writes.js.map +1 -0
- package/dist/electric-server/capture.d.ts +17 -2
- package/dist/electric-server/capture.d.ts.map +1 -1
- package/dist/electric-server/capture.js +100 -24
- package/dist/electric-server/capture.js.map +1 -1
- package/dist/electric-server/catalog.d.ts +3 -1
- package/dist/electric-server/catalog.d.ts.map +1 -1
- package/dist/electric-server/catalog.js +18 -3
- package/dist/electric-server/catalog.js.map +1 -1
- package/dist/electric-server/index.d.ts +30 -3
- package/dist/electric-server/index.d.ts.map +1 -1
- package/dist/electric-server/index.js +258 -78
- package/dist/electric-server/index.js.map +1 -1
- package/dist/electric-server/where.d.ts +30 -0
- package/dist/electric-server/where.d.ts.map +1 -0
- package/dist/electric-server/where.js +243 -0
- package/dist/electric-server/where.js.map +1 -0
- package/dist/firebird.d.ts.map +1 -1
- package/dist/firebird.js +10 -1
- package/dist/firebird.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/wasm/firebird-embedded-st.js +1 -1
- package/dist/wasm/firebird-embedded-st.wasm +0 -0
- package/dist/wasm/firebird-embedded.js +1 -1
- package/dist/wasm/firebird-embedded.wasm +0 -0
- package/dist/wasm-loader.d.ts +57 -7
- package/dist/wasm-loader.d.ts.map +1 -1
- package/dist/wasm-loader.js +106 -21
- package/dist/wasm-loader.js.map +1 -1
- package/package.json +1 -1
package/dist/electric/index.js
CHANGED
|
@@ -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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
// a
|
|
59
|
-
|
|
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
|
-
|
|
62
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
120
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
await
|
|
150
|
-
|
|
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
|
-
|
|
158
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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 (
|
|
180
|
-
|
|
181
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;AAyEH,4CAwKC;AA/OD,iDAAsF;AAEtF,mCAAsD;AAEtD,qCAAmE;AAGnE,mCAAkG;AAAzF,yGAAA,eAAe,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,sGAAA,YAAY,OAAA;AAoD/E,MAAM,QAAQ,GAAG,mBAAmB,CAAC;AAErC,6FAA6F;AAC7F,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC;AAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAClC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAChG,CAAC;AAEF;;;GAGG;AACI,KAAK,UAAU,gBAAgB,CACpC,EAAoB,EACpB,OAAgC;IAEhC,MAAM,KAAK,GAAG,IAAA,qBAAY,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAC9B,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAA,qBAAY,EAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,qBAAa,EAAC,IAAI,CAAC,CAAC;IACpG,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS;QAC3C,CAAC,CAAC,YAAY,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE;QACjD,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAClB,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,CAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE5G,iCAAiC;IACjC,IAAI,QAAgF,CAAC;IACrF,0EAA0E;IAC1E,yDAAyD;IACzD,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAChC,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC9B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,KAAK,CAC7B,wDAAwD,QAAQ,sBAAsB,EACtF,CAAC,OAAO,CAAC,QAAQ,CAAC,CACnB,CAAC;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;gBACtD,QAAQ,GAAG;oBACT,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBACnC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBACnC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,CAAmB;iBAC1E,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,GAA+B,QAAQ,EAAE,MAAM,CAAC;IAC1D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,+EAA+E;IAC/E,IAAI,OAAO,GAAe,OAAO,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5F,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAA0B,CAAC;IAC/B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,QAAQ,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEhD,IAAI,YAAyB,CAAC;IAC9B,IAAI,WAAgC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,YAAY,GAAG,OAAO,CAAC;QACvB,WAAW,GAAG,MAAM,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAE7B,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;IACxC,IAAI,UAAU;QAAE,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1F,qEAAqE;IACrE,MAAM,SAAS,GAAiB,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC3F,MAAM,WAAW,GAAiB,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACvD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAmB,CAAC;YAC9C,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,oBAAW,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,GAAG,OAAO,CAAC,KAAK;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW;QACX,MAAM,EAAE,SAAS;QACjB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAsC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzG,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;YACxB,iEAAiE;YACjE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QACnC,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,GAAG,KAAK,CAAC;YAChB,WAAW,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,EAAE,OAAmB,EAAE,EAAE;QAC1C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC7F,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;YACpB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,MAAM,MAAM,GAAG;YACb,KAAK;YACL,MAAM;YACN,MAAM;YACN,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAA,qBAAY,EAAC,MAAM,CAAC;SACvD,CAAC;QACF,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,gBAAgB,OAAO,CAAC,KAAK,sCAAsC,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAChC,MAAM,IAAA,oBAAY,EAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACxC,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,EAAE,CAAC;gBACxC,MAAM,EAAE,CAAC,IAAI,CACX,yBAAyB,QAAQ,yDAAyD;oBACxF,0CAA0C,EAC5C,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAC/C,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,EAAE,CAAC,IAAI,CACX,kFAAkF,EAClF,CAAC,SAAS,CAAC,CACZ,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,QAAgC,EAAE,EAAE;QAC1D,IAAI,OAAO;YAAE,OAAO;QACpB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,IAAA,wBAAe,EAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,KAAgC,EAAE,CAAC,CAAC;YACrG,CAAC;iBAAM,IAAI,IAAA,yBAAgB,EAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;gBACnF,6DAA6D;gBAC7D,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAChC,CAAC;iBAAM,IAAI,IAAA,yBAAgB,EAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;gBACjF,MAAM,OAAO,GAAG,OAAO,CAAC;gBACxB,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC/C,IAAI,CAAC;oBACH,MAAM,QAAQ,CAAC;gBACjB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAChE,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,QAAQ,GAAG,IAAI,CAAC;oBAChB,YAAY,EAAE,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,IAAI,UAAU;YACZ,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,KAAK;YACP,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,WAAW,EAAE,KAAK,IAAI,EAAE;YACtB,MAAM,IAAI,EAAE,CAAC;YACb,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACtC,WAAW,CAAC,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC1E,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,KAAK,UAAU,cAAc,CAAC,EAAuB;IACnD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,KAAK,CAC7B,8EAA8E,CAC/E,CAAC;IACF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO;IAC5B,MAAM,EAAE,CAAC,IAAI,CACX,gBAAgB,QAAQ,IAAI;QAC1B,+CAA+C;QAC/C,uFAAuF,CAC1F,CAAC;AACJ,CAAC"}
|
|
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;
|
|
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"}
|
package/dist/electric/values.js
CHANGED
|
@@ -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
|
});
|