firebird-wasm 0.7.0 → 0.8.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 +141 -0
- package/README.md +1 -1
- package/dist/.tsbuildinfo.build +1 -1
- package/dist/browser/engine-transport.d.ts.map +1 -1
- package/dist/browser/engine-transport.js +5 -8
- package/dist/browser/engine-transport.js.map +1 -1
- package/dist/browser/firebird-browser.d.ts.map +1 -1
- package/dist/browser/firebird-browser.js +59 -20
- package/dist/browser/firebird-browser.js.map +1 -1
- package/dist/browser/index.d.ts +2 -2
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +4 -2
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/serve-engine.d.ts +30 -0
- package/dist/browser/serve-engine.d.ts.map +1 -0
- package/dist/browser/serve-engine.js +93 -0
- package/dist/browser/serve-engine.js.map +1 -0
- package/dist/browser/worker-entry.d.ts +8 -22
- package/dist/browser/worker-entry.d.ts.map +1 -1
- package/dist/browser/worker-entry.js +18 -79
- package/dist/browser/worker-entry.js.map +1 -1
- package/dist/electric/apply.d.ts +53 -0
- package/dist/electric/apply.d.ts.map +1 -0
- package/dist/electric/apply.js +88 -0
- package/dist/electric/apply.js.map +1 -0
- package/dist/electric/index.d.ts +83 -0
- package/dist/electric/index.d.ts.map +1 -0
- package/dist/electric/index.js +210 -0
- package/dist/electric/index.js.map +1 -0
- package/dist/electric/values.d.ts +65 -0
- package/dist/electric/values.d.ts.map +1 -0
- package/dist/electric/values.js +243 -0
- package/dist/electric/values.js.map +1 -0
- package/dist/electric-server/capture.d.ts +36 -0
- package/dist/electric-server/capture.d.ts.map +1 -0
- package/dist/electric-server/capture.js +148 -0
- package/dist/electric-server/capture.js.map +1 -0
- package/dist/electric-server/catalog.d.ts +59 -0
- package/dist/electric-server/catalog.d.ts.map +1 -0
- package/dist/electric-server/catalog.js +122 -0
- package/dist/electric-server/catalog.js.map +1 -0
- package/dist/electric-server/index.d.ts +58 -0
- package/dist/electric-server/index.d.ts.map +1 -0
- package/dist/electric-server/index.js +348 -0
- package/dist/electric-server/index.js.map +1 -0
- package/dist/firebird.d.ts +3 -1
- package/dist/firebird.d.ts.map +1 -1
- package/dist/firebird.js +250 -22
- package/dist/firebird.js.map +1 -1
- package/dist/frameworks/query-store.d.ts +99 -0
- package/dist/frameworks/query-store.d.ts.map +1 -0
- package/dist/frameworks/query-store.js +166 -0
- package/dist/frameworks/query-store.js.map +1 -0
- package/dist/react/index.d.ts +68 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +92 -0
- package/dist/react/index.js.map +1 -0
- package/dist/repl/index.d.ts +76 -0
- package/dist/repl/index.d.ts.map +1 -0
- package/dist/repl/index.js +328 -0
- package/dist/repl/index.js.map +1 -0
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/vue/index.d.ts +68 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/index.js +107 -0
- package/dist/vue/index.js.map +1 -0
- package/dist/wasm/firebird-embedded-st.wasm +0 -0
- package/dist/wasm/firebird-embedded.wasm +0 -0
- package/package.json +50 -3
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* firebird-wasm/electric-server – a Firebird server's tables, served over
|
|
3
|
+
* Electric's HTTP shape protocol.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import * as http from 'node:http';
|
|
7
|
+
* import { createShapeServer } from 'firebird-wasm/electric-server';
|
|
8
|
+
*
|
|
9
|
+
* const shapes = await createShapeServer({
|
|
10
|
+
* database: 'localhost:/data/app.fdb', username: 'SYSDBA', password: '…',
|
|
11
|
+
* tables: ['items'],
|
|
12
|
+
* });
|
|
13
|
+
* http.createServer(shapes.handler).listen(3000);
|
|
14
|
+
* // in the browser: syncShapeToTable(db, { shape: { url: 'http://…:3000/v1/shape', params: { table: 'items' } }, … })
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* Electric itself reads only Postgres; this stands in its place for a
|
|
18
|
+
* Firebird source. It installs triggers that log each changed row's key,
|
|
19
|
+
* numbers the log in commit order itself (see
|
|
20
|
+
* docs/plans/firebird-shape-server.md), and serves a snapshot and then the
|
|
21
|
+
* changes after it. One server per database: two would number the log
|
|
22
|
+
* against each other. Node only: it uses the native client (`node-firebird-driver-
|
|
23
|
+
* native`, an optional dependency of this package).
|
|
24
|
+
*/
|
|
25
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
26
|
+
import type { TablePlan } from './catalog';
|
|
27
|
+
export { triggerName, tableTrigger } from './capture';
|
|
28
|
+
export { planTable, planColumn, shapeName } from './catalog';
|
|
29
|
+
export type { TablePlan, ColumnPlan, FirebirdColumn } from './catalog';
|
|
30
|
+
/** Options of {@link createShapeServer}. */
|
|
31
|
+
export interface ShapeServerOptions {
|
|
32
|
+
/** The database, as the native client takes it: `host:/path/db.fdb`. */
|
|
33
|
+
database: string;
|
|
34
|
+
username?: string;
|
|
35
|
+
password?: string;
|
|
36
|
+
/** Path to the Firebird client library. Default: the system's. */
|
|
37
|
+
libraryPath?: string;
|
|
38
|
+
/** The tables served, as written in SQL (`items`, or `"Mixed"`). Each needs a primary key. */
|
|
39
|
+
tables: string[];
|
|
40
|
+
/** Install the log and the triggers (idempotent). Default true. */
|
|
41
|
+
install?: boolean;
|
|
42
|
+
/** How long a live request waits for a change. Default 20 000 ms, as Electric. */
|
|
43
|
+
liveTimeoutMs?: number;
|
|
44
|
+
/** How often a waiting live request looks at the log. Default 100 ms. */
|
|
45
|
+
pollIntervalMs?: number;
|
|
46
|
+
}
|
|
47
|
+
/** A running shape server. */
|
|
48
|
+
export interface ShapeServer {
|
|
49
|
+
/** The Node HTTP handler: `http.createServer(server.handler)`. */
|
|
50
|
+
handler: (req: IncomingMessage, res: ServerResponse) => void;
|
|
51
|
+
/** The plans of the served tables, by Firebird name. */
|
|
52
|
+
readonly tables: ReadonlyMap<string, TablePlan>;
|
|
53
|
+
/** Stop answering and close the connection. */
|
|
54
|
+
close(): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
/** Connect, install the capture, and return a handler serving `options.tables`. */
|
|
57
|
+
export declare function createShapeServer(options: ShapeServerOptions): Promise<ShapeServer>;
|
|
58
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/electric-server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,OAAO,KAAK,EAAkB,SAAS,EAAE,MAAM,WAAW,CAAC;AAG3D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC7D,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEvE,4CAA4C;AAC5C,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,oEAAoE;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,8BAA8B;AAC9B,MAAM,WAAW,WAAW;IAC1B,kEAAkE;IAClE,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7D,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChD,+CAA+C;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAYD,mFAAmF;AACnF,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAiOzF"}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* firebird-wasm/electric-server – a Firebird server's tables, served over
|
|
4
|
+
* Electric's HTTP shape protocol.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* import * as http from 'node:http';
|
|
8
|
+
* import { createShapeServer } from 'firebird-wasm/electric-server';
|
|
9
|
+
*
|
|
10
|
+
* const shapes = await createShapeServer({
|
|
11
|
+
* database: 'localhost:/data/app.fdb', username: 'SYSDBA', password: '…',
|
|
12
|
+
* tables: ['items'],
|
|
13
|
+
* });
|
|
14
|
+
* http.createServer(shapes.handler).listen(3000);
|
|
15
|
+
* // in the browser: syncShapeToTable(db, { shape: { url: 'http://…:3000/v1/shape', params: { table: 'items' } }, … })
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Electric itself reads only Postgres; this stands in its place for a
|
|
19
|
+
* Firebird source. It installs triggers that log each changed row's key,
|
|
20
|
+
* numbers the log in commit order itself (see
|
|
21
|
+
* docs/plans/firebird-shape-server.md), and serves a snapshot and then the
|
|
22
|
+
* changes after it. One server per database: two would number the log
|
|
23
|
+
* against each other. Node only: it uses the native client (`node-firebird-driver-
|
|
24
|
+
* native`, an optional dependency of this package).
|
|
25
|
+
*/
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.shapeName = exports.planColumn = exports.planTable = exports.tableTrigger = exports.triggerName = void 0;
|
|
28
|
+
exports.createShapeServer = createShapeServer;
|
|
29
|
+
const node_firebird_driver_1 = require("node-firebird-driver");
|
|
30
|
+
const catalog_1 = require("./catalog");
|
|
31
|
+
const capture_1 = require("./capture");
|
|
32
|
+
var capture_2 = require("./capture");
|
|
33
|
+
Object.defineProperty(exports, "triggerName", { enumerable: true, get: function () { return capture_2.triggerName; } });
|
|
34
|
+
Object.defineProperty(exports, "tableTrigger", { enumerable: true, get: function () { return capture_2.tableTrigger; } });
|
|
35
|
+
var catalog_2 = require("./catalog");
|
|
36
|
+
Object.defineProperty(exports, "planTable", { enumerable: true, get: function () { return catalog_2.planTable; } });
|
|
37
|
+
Object.defineProperty(exports, "planColumn", { enumerable: true, get: function () { return catalog_2.planColumn; } });
|
|
38
|
+
Object.defineProperty(exports, "shapeName", { enumerable: true, get: function () { return catalog_2.shapeName; } });
|
|
39
|
+
const EXPOSED = 'electric-cursor,electric-handle,electric-offset,electric-schema,electric-up-to-date';
|
|
40
|
+
class HttpError extends Error {
|
|
41
|
+
constructor(status, message) {
|
|
42
|
+
super(message);
|
|
43
|
+
this.status = status;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Connect, install the capture, and return a handler serving `options.tables`. */
|
|
47
|
+
async function createShapeServer(options) {
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
49
|
+
const native = require('node-firebird-driver-native');
|
|
50
|
+
const client = native.createNativeClient(options.libraryPath ?? native.getDefaultLibraryFilename());
|
|
51
|
+
const attachment = await client.connect(options.database, {
|
|
52
|
+
username: options.username,
|
|
53
|
+
password: options.password,
|
|
54
|
+
});
|
|
55
|
+
const liveTimeoutMs = options.liveTimeoutMs ?? 20000;
|
|
56
|
+
const pollIntervalMs = options.pollIntervalMs ?? 100;
|
|
57
|
+
const tables = new Map();
|
|
58
|
+
try {
|
|
59
|
+
for (const given of options.tables) {
|
|
60
|
+
const name = (0, catalog_1.relationName)(given);
|
|
61
|
+
tables.set(name, await describeTable(attachment, name));
|
|
62
|
+
}
|
|
63
|
+
if (options.install ?? true)
|
|
64
|
+
await (0, capture_1.installCapture)(attachment, [...tables.values()]);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
await attachment.disconnect().catch(() => undefined);
|
|
68
|
+
await client.dispose().catch(() => undefined);
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
const epoch = await readOnly(attachment, async (tx) => {
|
|
72
|
+
const rs = await attachment.executeQuery(tx, `SELECT FIRST 1 EPOCH FROM ${capture_1.META}`);
|
|
73
|
+
const rows = await rs.fetch();
|
|
74
|
+
await rs.close();
|
|
75
|
+
return String(rows[0]?.[0] ?? 'none');
|
|
76
|
+
});
|
|
77
|
+
let closed = false;
|
|
78
|
+
/** Number what has committed since, then read in a snapshot. */
|
|
79
|
+
const stampedSnapshot = async (fn) => {
|
|
80
|
+
await serialized(attachment, () => (0, capture_1.stampCommitted)(attachment));
|
|
81
|
+
return readOnly(attachment, async (tx) => {
|
|
82
|
+
const rs = await attachment.executeQuery(tx, `SELECT MAX(COMMIT_SEQ) FROM ${capture_1.CHANGES}`);
|
|
83
|
+
const top = Number((await rs.fetch())[0]?.[0] ?? 0);
|
|
84
|
+
await rs.close();
|
|
85
|
+
return fn(tx, top);
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
const handleOf = (table) => `${epoch}-${hashName(table.name)}`;
|
|
89
|
+
// A snapshot may hold changes not numbered yet; they are numbered above
|
|
90
|
+
// its offset and served again later, which re-applies them as no-ops.
|
|
91
|
+
const snapshot = async (table, columns) => {
|
|
92
|
+
return stampedSnapshot(async (tx, top) => {
|
|
93
|
+
const rs = await attachment.executeQuery(tx, `SELECT ${columns.map((c) => c.select).join(', ')} FROM ${(0, catalog_1.quote)(table.name)}`);
|
|
94
|
+
const messages = [];
|
|
95
|
+
for (const row of await rs.fetch()) {
|
|
96
|
+
messages.push(await change('insert', table, columns, row, tx));
|
|
97
|
+
}
|
|
98
|
+
await rs.close();
|
|
99
|
+
return { messages, offset: top };
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
/** The changes to `table` after `after`, up to the watermark, one per key. */
|
|
103
|
+
const changesAfter = async (table, columns, after) => {
|
|
104
|
+
return stampedSnapshot(async (tx, top) => {
|
|
105
|
+
if (top <= after)
|
|
106
|
+
return { messages: [], offset: after };
|
|
107
|
+
const keys = Array.from({ length: capture_1.KEY_COLUMNS }, (_, i) => `K${i + 1}`).join(', ');
|
|
108
|
+
const rs = await attachment.executeQuery(tx, `SELECT OP, ${keys} FROM ${capture_1.CHANGES} WHERE TABLE_NAME = ? AND COMMIT_SEQ > ? AND COMMIT_SEQ <= ? ` +
|
|
109
|
+
'ORDER BY COMMIT_SEQ, CHANGE_ID', [table.name, after, top]);
|
|
110
|
+
// The last operation per key wins; the row is read as it is now.
|
|
111
|
+
const last = new Map();
|
|
112
|
+
for (const row of await rs.fetch()) {
|
|
113
|
+
const key = row.slice(1, 1 + table.key.length);
|
|
114
|
+
last.set(JSON.stringify(key), { op: String(row[0]), key });
|
|
115
|
+
}
|
|
116
|
+
await rs.close();
|
|
117
|
+
const where = table.key.map((k) => `${(0, catalog_1.quote)(k)} = ?`).join(' AND ');
|
|
118
|
+
const select = `SELECT ${columns.map((c) => c.select).join(', ')} FROM ${(0, catalog_1.quote)(table.name)} WHERE ${where}`;
|
|
119
|
+
const messages = [];
|
|
120
|
+
for (const { op, key } of last.values()) {
|
|
121
|
+
let current = null;
|
|
122
|
+
if (op !== 'D') {
|
|
123
|
+
const found = await attachment.executeQuery(tx, select, key);
|
|
124
|
+
current = (await found.fetch({ fetchSize: 1 }))[0] ?? null;
|
|
125
|
+
await found.close();
|
|
126
|
+
}
|
|
127
|
+
messages.push(current
|
|
128
|
+
? await change('insert', table, columns, current, tx)
|
|
129
|
+
: deletion(table, key));
|
|
130
|
+
}
|
|
131
|
+
return { messages, offset: top };
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
const change = async (operation, table, columns, row, tx) => {
|
|
135
|
+
const value = {};
|
|
136
|
+
for (let i = 0; i < columns.length; i++) {
|
|
137
|
+
const plan = columns[i];
|
|
138
|
+
let raw = row[i];
|
|
139
|
+
if (plan.render === 'blob' && raw)
|
|
140
|
+
raw = await readBlob(attachment, tx, raw);
|
|
141
|
+
value[plan.shapeName] = (0, catalog_1.renderValue)(plan, raw);
|
|
142
|
+
}
|
|
143
|
+
return { key: keyOf(table, table.key.map((k) => value[shapeOf(table, k)])), value, headers: { operation } };
|
|
144
|
+
};
|
|
145
|
+
const deletion = (table, key) => {
|
|
146
|
+
const value = {};
|
|
147
|
+
table.key.forEach((k, i) => {
|
|
148
|
+
const plan = table.columns.find((c) => c.name === k);
|
|
149
|
+
const text = key[i] === null || key[i] === undefined ? null : String(key[i]);
|
|
150
|
+
// The log keeps the key as Firebird's text; booleans as TRUE/FALSE.
|
|
151
|
+
value[plan.shapeName] = plan.render === 'boolean' && text !== null ? text.toLowerCase() : text;
|
|
152
|
+
});
|
|
153
|
+
return { key: keyOf(table, Object.values(value)), value, headers: { operation: 'delete' } };
|
|
154
|
+
};
|
|
155
|
+
const respond = (res, status, body, headers = {}) => {
|
|
156
|
+
res.writeHead(status, {
|
|
157
|
+
'content-type': 'application/json',
|
|
158
|
+
'cache-control': 'no-store',
|
|
159
|
+
'access-control-allow-origin': '*',
|
|
160
|
+
'access-control-expose-headers': EXPOSED,
|
|
161
|
+
...headers,
|
|
162
|
+
});
|
|
163
|
+
res.end(JSON.stringify(body));
|
|
164
|
+
};
|
|
165
|
+
const serve = async (req, res) => {
|
|
166
|
+
if (req.method === 'OPTIONS') {
|
|
167
|
+
res.writeHead(204, {
|
|
168
|
+
'access-control-allow-origin': '*',
|
|
169
|
+
'access-control-allow-methods': 'GET, OPTIONS',
|
|
170
|
+
'access-control-allow-headers': '*',
|
|
171
|
+
});
|
|
172
|
+
res.end();
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const url = new URL(req.url ?? '/', 'http://shape.server');
|
|
176
|
+
if (req.method !== 'GET' || url.pathname !== '/v1/shape') {
|
|
177
|
+
throw new HttpError(404, 'Only GET /v1/shape is served');
|
|
178
|
+
}
|
|
179
|
+
const params = url.searchParams;
|
|
180
|
+
const given = params.get('table');
|
|
181
|
+
if (!given)
|
|
182
|
+
throw new HttpError(400, 'table is required');
|
|
183
|
+
const table = tables.get((0, catalog_1.relationName)(given));
|
|
184
|
+
if (!table)
|
|
185
|
+
throw new HttpError(404, `Table ${given} is not served`);
|
|
186
|
+
if (params.get('where'))
|
|
187
|
+
throw new HttpError(400, 'where is not supported by this server yet');
|
|
188
|
+
const columns = selectColumns(table, params.get('columns'));
|
|
189
|
+
const schema = Object.fromEntries(columns.map((c) => [c.shapeName, table.schema[c.shapeName]]));
|
|
190
|
+
const handle = handleOf(table);
|
|
191
|
+
const upToDate = { headers: { control: 'up-to-date' } };
|
|
192
|
+
const offsetParam = params.get('offset') ?? '-1';
|
|
193
|
+
if (offsetParam === '-1') {
|
|
194
|
+
const { messages, offset } = await snapshot(table, columns);
|
|
195
|
+
respond(res, 200, [...messages, upToDate], {
|
|
196
|
+
'electric-handle': handle,
|
|
197
|
+
'electric-offset': `${offset}_0`,
|
|
198
|
+
'electric-schema': JSON.stringify(schema),
|
|
199
|
+
'electric-up-to-date': '',
|
|
200
|
+
});
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (params.get('handle') !== handle) {
|
|
204
|
+
respond(res, 409, [{ headers: { control: 'must-refetch' } }], { 'electric-handle': handle });
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const after = offsetParam === 'now'
|
|
208
|
+
? await stampedSnapshot(async (_tx, top) => top)
|
|
209
|
+
: Number(offsetParam.split('_')[0]);
|
|
210
|
+
if (!Number.isSafeInteger(after) || after < 0)
|
|
211
|
+
throw new HttpError(400, `offset ${offsetParam} is not one this server gave`);
|
|
212
|
+
const live = params.get('live') === 'true';
|
|
213
|
+
const deadline = Date.now() + (live ? liveTimeoutMs : 0);
|
|
214
|
+
let result = await changesAfter(table, columns, after);
|
|
215
|
+
while (live && result.messages.length === 0 && Date.now() < deadline && !closed && !req.destroyed) {
|
|
216
|
+
await new Promise((r) => setTimeout(r, pollIntervalMs));
|
|
217
|
+
result = await changesAfter(table, columns, after);
|
|
218
|
+
}
|
|
219
|
+
const headers = {
|
|
220
|
+
'electric-handle': handle,
|
|
221
|
+
'electric-offset': `${result.offset}_0`,
|
|
222
|
+
'electric-up-to-date': '',
|
|
223
|
+
};
|
|
224
|
+
if (live)
|
|
225
|
+
headers['electric-cursor'] = String(Math.floor(Date.now() / 1000));
|
|
226
|
+
else
|
|
227
|
+
headers['electric-schema'] = JSON.stringify(schema);
|
|
228
|
+
respond(res, 200, [...result.messages, upToDate], headers);
|
|
229
|
+
};
|
|
230
|
+
return {
|
|
231
|
+
tables,
|
|
232
|
+
handler: (req, res) => {
|
|
233
|
+
if (closed) {
|
|
234
|
+
respond(res, 503, { message: 'The shape server is closing' });
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
serve(req, res).catch((err) => {
|
|
238
|
+
const status = err instanceof HttpError ? err.status : 500;
|
|
239
|
+
if (!res.headersSent)
|
|
240
|
+
respond(res, status, { message: err instanceof Error ? err.message : String(err) });
|
|
241
|
+
else
|
|
242
|
+
res.end();
|
|
243
|
+
});
|
|
244
|
+
},
|
|
245
|
+
close: async () => {
|
|
246
|
+
closed = true;
|
|
247
|
+
await attachment.disconnect().catch(() => undefined);
|
|
248
|
+
await client.dispose().catch(() => undefined);
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* One transaction at a time on the connection: the native client runs each
|
|
254
|
+
* call on a worker thread, and two at once on one attachment (a live poll
|
|
255
|
+
* beside a snapshot) crashed the process.
|
|
256
|
+
*/
|
|
257
|
+
const queues = new WeakMap();
|
|
258
|
+
/** Run `fn` after whatever else this connection is running. */
|
|
259
|
+
function serialized(attachment, fn) {
|
|
260
|
+
const previous = queues.get(attachment) ?? Promise.resolve();
|
|
261
|
+
const result = previous.then(fn, fn);
|
|
262
|
+
queues.set(attachment, result.catch(() => undefined));
|
|
263
|
+
return result;
|
|
264
|
+
}
|
|
265
|
+
/** Run `fn` in a read-only snapshot transaction, after any other on this connection. */
|
|
266
|
+
async function readOnly(attachment, fn) {
|
|
267
|
+
return serialized(attachment, async () => {
|
|
268
|
+
// SNAPSHOT is Firebird's concurrency mode (CONSISTENCY would lock the tables).
|
|
269
|
+
const tx = await attachment.startTransaction({ isolation: node_firebird_driver_1.TransactionIsolation.SNAPSHOT, accessMode: 'READ_ONLY' });
|
|
270
|
+
try {
|
|
271
|
+
return await fn(tx);
|
|
272
|
+
}
|
|
273
|
+
finally {
|
|
274
|
+
await tx.commit().catch(() => tx.rollback().catch(() => undefined));
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
async function readBlob(attachment, tx, blob) {
|
|
279
|
+
const stream = await attachment.openBlob(tx, blob);
|
|
280
|
+
try {
|
|
281
|
+
const chunks = [];
|
|
282
|
+
for (;;) {
|
|
283
|
+
const buffer = Buffer.alloc(64 * 1024);
|
|
284
|
+
const n = await stream.read(buffer);
|
|
285
|
+
if (n < 0)
|
|
286
|
+
break;
|
|
287
|
+
chunks.push(buffer.subarray(0, n));
|
|
288
|
+
}
|
|
289
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
290
|
+
}
|
|
291
|
+
finally {
|
|
292
|
+
await stream.close();
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/** The columns and key of `name`, from the system tables. */
|
|
296
|
+
async function describeTable(attachment, name) {
|
|
297
|
+
return readOnly(attachment, async (tx) => {
|
|
298
|
+
const rs = await attachment.executeQuery(tx, 'SELECT TRIM(rf.RDB$FIELD_NAME), f.RDB$FIELD_TYPE, COALESCE(f.RDB$FIELD_SUB_TYPE, 0), ' +
|
|
299
|
+
'COALESCE(f.RDB$FIELD_SCALE, 0), COALESCE(f.RDB$FIELD_PRECISION, 0), ' +
|
|
300
|
+
'COALESCE(f.RDB$CHARACTER_LENGTH, f.RDB$FIELD_LENGTH, 0), ' +
|
|
301
|
+
'COALESCE(rf.RDB$NULL_FLAG, f.RDB$NULL_FLAG, 0) ' +
|
|
302
|
+
'FROM RDB$RELATION_FIELDS rf JOIN RDB$FIELDS f ON f.RDB$FIELD_NAME = rf.RDB$FIELD_SOURCE ' +
|
|
303
|
+
'WHERE rf.RDB$RELATION_NAME = ? AND f.RDB$COMPUTED_BLR IS NULL ORDER BY rf.RDB$FIELD_POSITION', [name]);
|
|
304
|
+
const columns = (await rs.fetch()).map((r) => ({
|
|
305
|
+
name: String(r[0]),
|
|
306
|
+
type: Number(r[1]),
|
|
307
|
+
subType: Number(r[2]),
|
|
308
|
+
scale: Number(r[3]),
|
|
309
|
+
precision: Number(r[4]),
|
|
310
|
+
charLength: Number(r[5]),
|
|
311
|
+
notNull: Number(r[6]) === 1,
|
|
312
|
+
}));
|
|
313
|
+
await rs.close();
|
|
314
|
+
const keyRs = await attachment.executeQuery(tx, 'SELECT TRIM(s.RDB$FIELD_NAME) FROM RDB$RELATION_CONSTRAINTS c ' +
|
|
315
|
+
'JOIN RDB$INDEX_SEGMENTS s ON s.RDB$INDEX_NAME = c.RDB$INDEX_NAME ' +
|
|
316
|
+
"WHERE c.RDB$RELATION_NAME = ? AND c.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY s.RDB$FIELD_POSITION", [name]);
|
|
317
|
+
const key = (await keyRs.fetch()).map((r) => String(r[0]));
|
|
318
|
+
await keyRs.close();
|
|
319
|
+
return (0, catalog_1.planTable)(name, columns, key);
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
function selectColumns(table, list) {
|
|
323
|
+
if (!list)
|
|
324
|
+
return table.columns;
|
|
325
|
+
const wanted = list.split(',').map((c) => c.trim().replace(/^"(.*)"$/, '$1'));
|
|
326
|
+
const columns = table.columns.filter((c) => wanted.includes(c.shapeName) || wanted.includes(c.name));
|
|
327
|
+
for (const k of table.key) {
|
|
328
|
+
if (!columns.some((c) => c.name === k)) {
|
|
329
|
+
throw new HttpError(400, `columns must include the key column ${shapeOf(table, k)}`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return columns;
|
|
333
|
+
}
|
|
334
|
+
function shapeOf(table, firebirdName) {
|
|
335
|
+
return table.columns.find((c) => c.name === firebirdName).shapeName;
|
|
336
|
+
}
|
|
337
|
+
function keyOf(table, values) {
|
|
338
|
+
return `"${table.name}"/${values.map((v) => `"${String(v)}"`).join('/')}`;
|
|
339
|
+
}
|
|
340
|
+
function hashName(name) {
|
|
341
|
+
let hash = 0x811c9dc5;
|
|
342
|
+
for (const ch of name) {
|
|
343
|
+
hash ^= ch.codePointAt(0);
|
|
344
|
+
hash = Math.imul(hash, 0x01000193) >>> 0;
|
|
345
|
+
}
|
|
346
|
+
return hash.toString(36);
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/electric-server/index.ts"],"names":[],"mappings":"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"}
|
package/dist/firebird.d.ts
CHANGED
|
@@ -60,7 +60,9 @@ export declare class FirebirdLite {
|
|
|
60
60
|
* Execute a (parameterised) SQL statement and return the result rows.
|
|
61
61
|
*
|
|
62
62
|
* For SELECT queries the rows are returned as plain objects keyed by the
|
|
63
|
-
*
|
|
63
|
+
* column name as Firebird reports it, mirroring the PGlite convention: an
|
|
64
|
+
* unquoted name in upper case (`SELECT title` gives `TITLE`), a quoted alias
|
|
65
|
+
* as written (`SELECT title AS "title"` gives `title`).
|
|
64
66
|
*
|
|
65
67
|
* ```ts
|
|
66
68
|
* await db.query('SELECT * FROM items WHERE id = ?', [id]);
|
package/dist/firebird.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebird.d.ts","sourceRoot":"","sources":["../src/firebird.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,UAAU,EACV,SAAS,EACT,WAAW,EAEZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,QAAQ,EACR,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,GAAG,EACH,WAAW,EACX,OAAO,EACP,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAKjB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAgC7C,0EAA0E;AAC1E,KAAK,gBAAgB,GAAG,YAAY,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5D;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoE;IACnG,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,2EAA2E;IAC3E,OAAO,CAAC,eAAe,CAA4B;IACnD,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,qFAAqF;IACrF,OAAO,CAAC,UAAU,CAA+B;gBAErC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB;IAgB7D;;OAEG;YACW,WAAW;IAkBzB;;;;;;;OAOG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,MAAM,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9E;;;;OAIG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE
|
|
1
|
+
{"version":3,"file":"firebird.d.ts","sourceRoot":"","sources":["../src/firebird.ts"],"names":[],"mappings":"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"}
|