firebird-wasm 0.7.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 (99) hide show
  1. package/CHANGELOG.md +266 -0
  2. package/README.md +31 -15
  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 +43 -11
  7. package/dist/browser/engine-transport.js.map +1 -1
  8. package/dist/browser/firebird-browser.d.ts.map +1 -1
  9. package/dist/browser/firebird-browser.js +59 -20
  10. package/dist/browser/firebird-browser.js.map +1 -1
  11. package/dist/browser/index.d.ts +3 -3
  12. package/dist/browser/index.d.ts.map +1 -1
  13. package/dist/browser/index.js +6 -3
  14. package/dist/browser/index.js.map +1 -1
  15. package/dist/browser/params.d.ts +8 -2
  16. package/dist/browser/params.d.ts.map +1 -1
  17. package/dist/browser/params.js +14 -5
  18. package/dist/browser/params.js.map +1 -1
  19. package/dist/browser/serve-engine.d.ts +30 -0
  20. package/dist/browser/serve-engine.d.ts.map +1 -0
  21. package/dist/browser/serve-engine.js +93 -0
  22. package/dist/browser/serve-engine.js.map +1 -0
  23. package/dist/browser/worker-entry.d.ts +8 -22
  24. package/dist/browser/worker-entry.d.ts.map +1 -1
  25. package/dist/browser/worker-entry.js +18 -79
  26. package/dist/browser/worker-entry.js.map +1 -1
  27. package/dist/electric/apply.d.ts +53 -0
  28. package/dist/electric/apply.d.ts.map +1 -0
  29. package/dist/electric/apply.js +88 -0
  30. package/dist/electric/apply.js.map +1 -0
  31. package/dist/electric/index.d.ts +133 -0
  32. package/dist/electric/index.d.ts.map +1 -0
  33. package/dist/electric/index.js +378 -0
  34. package/dist/electric/index.js.map +1 -0
  35. package/dist/electric/serial.d.ts +20 -0
  36. package/dist/electric/serial.d.ts.map +1 -0
  37. package/dist/electric/serial.js +29 -0
  38. package/dist/electric/serial.js.map +1 -0
  39. package/dist/electric/values.d.ts +65 -0
  40. package/dist/electric/values.d.ts.map +1 -0
  41. package/dist/electric/values.js +257 -0
  42. package/dist/electric/values.js.map +1 -0
  43. package/dist/electric/writes.d.ts +99 -0
  44. package/dist/electric/writes.d.ts.map +1 -0
  45. package/dist/electric/writes.js +282 -0
  46. package/dist/electric/writes.js.map +1 -0
  47. package/dist/electric-server/capture.d.ts +51 -0
  48. package/dist/electric-server/capture.d.ts.map +1 -0
  49. package/dist/electric-server/capture.js +224 -0
  50. package/dist/electric-server/capture.js.map +1 -0
  51. package/dist/electric-server/catalog.d.ts +61 -0
  52. package/dist/electric-server/catalog.d.ts.map +1 -0
  53. package/dist/electric-server/catalog.js +137 -0
  54. package/dist/electric-server/catalog.js.map +1 -0
  55. package/dist/electric-server/index.d.ts +85 -0
  56. package/dist/electric-server/index.d.ts.map +1 -0
  57. package/dist/electric-server/index.js +528 -0
  58. package/dist/electric-server/index.js.map +1 -0
  59. package/dist/electric-server/where.d.ts +30 -0
  60. package/dist/electric-server/where.d.ts.map +1 -0
  61. package/dist/electric-server/where.js +243 -0
  62. package/dist/electric-server/where.js.map +1 -0
  63. package/dist/firebird.d.ts +3 -1
  64. package/dist/firebird.d.ts.map +1 -1
  65. package/dist/firebird.js +259 -22
  66. package/dist/firebird.js.map +1 -1
  67. package/dist/frameworks/query-store.d.ts +99 -0
  68. package/dist/frameworks/query-store.d.ts.map +1 -0
  69. package/dist/frameworks/query-store.js +166 -0
  70. package/dist/frameworks/query-store.js.map +1 -0
  71. package/dist/index.d.ts +1 -1
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +2 -1
  74. package/dist/index.js.map +1 -1
  75. package/dist/react/index.d.ts +68 -0
  76. package/dist/react/index.d.ts.map +1 -0
  77. package/dist/react/index.js +92 -0
  78. package/dist/react/index.js.map +1 -0
  79. package/dist/repl/index.d.ts +76 -0
  80. package/dist/repl/index.d.ts.map +1 -0
  81. package/dist/repl/index.js +328 -0
  82. package/dist/repl/index.js.map +1 -0
  83. package/dist/types.d.ts +2 -1
  84. package/dist/types.d.ts.map +1 -1
  85. package/dist/version.d.ts +1 -1
  86. package/dist/version.js +1 -1
  87. package/dist/vue/index.d.ts +68 -0
  88. package/dist/vue/index.d.ts.map +1 -0
  89. package/dist/vue/index.js +107 -0
  90. package/dist/vue/index.js.map +1 -0
  91. package/dist/wasm/firebird-embedded-st.js +1 -1
  92. package/dist/wasm/firebird-embedded-st.wasm +0 -0
  93. package/dist/wasm/firebird-embedded.js +1 -1
  94. package/dist/wasm/firebird-embedded.wasm +0 -0
  95. package/dist/wasm-loader.d.ts +57 -7
  96. package/dist/wasm-loader.d.ts.map +1 -1
  97. package/dist/wasm-loader.js +106 -21
  98. package/dist/wasm-loader.js.map +1 -1
  99. package/package.json +50 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writes.js","sourceRoot":"","sources":["../../src/electric/writes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * capture.ts – the change log a shape is served from, kept by triggers.
3
+ *
4
+ * See docs/plans/firebird-shape-server.md. Per synced table, an AFTER
5
+ * trigger logs each changed row's key. The server numbers the log itself
6
+ * (stampCommitted): a change is numbered once its transaction has committed,
7
+ * which is the order the stream follows.
8
+ */
9
+ import type { Attachment } from 'node-firebird-driver';
10
+ import type { TablePlan } from './catalog';
11
+ export declare const CHANGES = "ELECTRIC_CHANGES";
12
+ export declare const META = "ELECTRIC_META";
13
+ /** When each commit number was given: what pruning goes by. */
14
+ export declare const STAMPS = "ELECTRIC_STAMPS";
15
+ /** The event each logged change posts, delivered when its transaction commits. */
16
+ export declare const CHANGE_EVENT = "ELECTRIC_CHANGES";
17
+ /** How many key columns the log has room for. */
18
+ export declare const KEY_COLUMNS = 4;
19
+ /** A short, stable trigger name for a table: Firebird 3 allows 31 characters. */
20
+ export declare function triggerName(table: string): string;
21
+ /**
22
+ * Create what the log needs (once) and a trigger for each of `tables`.
23
+ * Safe to run again: existing objects are kept, triggers replaced.
24
+ */
25
+ export declare function installCapture(attachment: Attachment, tables: TablePlan[]): Promise<void>;
26
+ /** The trigger that logs `table`'s changed keys. */
27
+ export declare function tableTrigger(table: TablePlan): string;
28
+ /**
29
+ * Give every change committed since the last call one new number, and
30
+ * return it (or 0 when there was nothing to number).
31
+ *
32
+ * Numbering after the commit, not in a commit trigger: a database trigger
33
+ * is loaded when a connection attaches, so an application connected before
34
+ * the capture was installed would never run it. A change still being
35
+ * written is invisible to this READ COMMITTED update and is numbered by a
36
+ * later call, after its commit; so numbers follow commits.
37
+ *
38
+ * One numbering at a time, across every server on the database: each takes
39
+ * the ELECTRIC_META row first, and a number is taken only under it. So
40
+ * numbers commit in order, and a snapshot that sees a number sees every
41
+ * number below it. Two servers numbering at once used to fail on each
42
+ * other's rows, or commit a higher number before a lower one.
43
+ */
44
+ export declare function stampCommitted(attachment: Attachment): Promise<number>;
45
+ /**
46
+ * Drop what was numbered before `before` from the log, and return the
47
+ * highest number dropped (0 when nothing was). A client whose position is
48
+ * below it is sent back to a snapshot: what it would need is gone.
49
+ */
50
+ export declare function pruneLog(attachment: Attachment, before: Date): Promise<number>;
51
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/electric-server/capture.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,sBAAsB,CAAC;AAEpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAG3C,eAAO,MAAM,OAAO,qBAAqB,CAAC;AAC1C,eAAO,MAAM,IAAI,kBAAkB,CAAC;AACpC,+DAA+D;AAC/D,eAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,kFAAkF;AAClF,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAI/C,iDAAiD;AACjD,eAAO,MAAM,WAAW,IAAI,CAAC;AAE7B,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOjD;AAYD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD/F;AAED,oDAAoD;AACpD,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAqBrD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAqC5E;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCpF"}
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+ /**
3
+ * capture.ts – the change log a shape is served from, kept by triggers.
4
+ *
5
+ * See docs/plans/firebird-shape-server.md. Per synced table, an AFTER
6
+ * trigger logs each changed row's key. The server numbers the log itself
7
+ * (stampCommitted): a change is numbered once its transaction has committed,
8
+ * which is the order the stream follows.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.KEY_COLUMNS = exports.CHANGE_EVENT = exports.STAMPS = exports.META = exports.CHANGES = void 0;
12
+ exports.triggerName = triggerName;
13
+ exports.installCapture = installCapture;
14
+ exports.tableTrigger = tableTrigger;
15
+ exports.stampCommitted = stampCommitted;
16
+ exports.pruneLog = pruneLog;
17
+ const node_firebird_driver_1 = require("node-firebird-driver");
18
+ const catalog_1 = require("./catalog");
19
+ exports.CHANGES = 'ELECTRIC_CHANGES';
20
+ exports.META = 'ELECTRIC_META';
21
+ /** When each commit number was given: what pruning goes by. */
22
+ exports.STAMPS = 'ELECTRIC_STAMPS';
23
+ /** The event each logged change posts, delivered when its transaction commits. */
24
+ exports.CHANGE_EVENT = 'ELECTRIC_CHANGES';
25
+ const CHANGE_SEQ = 'ELECTRIC_CHANGE_SEQ';
26
+ const COMMIT_SEQ = 'ELECTRIC_COMMIT_SEQ';
27
+ /** How many key columns the log has room for. */
28
+ exports.KEY_COLUMNS = 4;
29
+ /** A short, stable trigger name for a table: Firebird 3 allows 31 characters. */
30
+ function triggerName(table) {
31
+ let hash = 0x811c9dc5;
32
+ for (const ch of table) {
33
+ hash ^= ch.codePointAt(0);
34
+ hash = Math.imul(hash, 0x01000193) >>> 0;
35
+ }
36
+ return `ELECTRIC$${hash.toString(16).padStart(8, '0').toUpperCase()}`;
37
+ }
38
+ async function exists(attachment, tx, sql, name) {
39
+ // Not executeSingleton: it fails on a query that finds no row.
40
+ const rs = await attachment.executeQuery(tx, sql, [name]);
41
+ try {
42
+ return (await rs.fetch({ fetchSize: 1 })).length > 0;
43
+ }
44
+ finally {
45
+ await rs.close();
46
+ }
47
+ }
48
+ /**
49
+ * Create what the log needs (once) and a trigger for each of `tables`.
50
+ * Safe to run again: existing objects are kept, triggers replaced.
51
+ */
52
+ async function installCapture(attachment, tables) {
53
+ // DDL commits before its objects are usable, so each step is its own
54
+ // transaction.
55
+ const ddl = async (sql) => {
56
+ const tx = await attachment.startTransaction();
57
+ try {
58
+ await attachment.execute(tx, sql);
59
+ await tx.commit();
60
+ }
61
+ catch (err) {
62
+ await tx.rollback().catch(() => undefined);
63
+ throw err;
64
+ }
65
+ };
66
+ const has = async (sql, name) => {
67
+ const tx = await attachment.startTransaction();
68
+ try {
69
+ return await exists(attachment, tx, sql, name);
70
+ }
71
+ finally {
72
+ await tx.commit();
73
+ }
74
+ };
75
+ const generator = 'SELECT 1 FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME = ?';
76
+ const relation = 'SELECT 1 FROM RDB$RELATIONS WHERE RDB$RELATION_NAME = ?';
77
+ if (!(await has(generator, CHANGE_SEQ)))
78
+ await ddl(`CREATE SEQUENCE ${CHANGE_SEQ}`);
79
+ if (!(await has(generator, COMMIT_SEQ)))
80
+ await ddl(`CREATE SEQUENCE ${COMMIT_SEQ}`);
81
+ if (!(await has(relation, exports.CHANGES))) {
82
+ const keys = Array.from({ length: exports.KEY_COLUMNS }, (_, i) => `K${i + 1} VARCHAR(255)`).join(', ');
83
+ await ddl(`CREATE TABLE ${exports.CHANGES} (CHANGE_ID BIGINT NOT NULL PRIMARY KEY, TX_ID BIGINT NOT NULL, ` +
84
+ `COMMIT_SEQ BIGINT, TABLE_NAME VARCHAR(63) NOT NULL, OP CHAR(1) NOT NULL, ${keys})`);
85
+ await ddl(`CREATE INDEX ${exports.CHANGES}_TX ON ${exports.CHANGES} (TX_ID)`);
86
+ await ddl(`CREATE INDEX ${exports.CHANGES}_SEQ ON ${exports.CHANGES} (COMMIT_SEQ)`);
87
+ }
88
+ if (!(await has(relation, exports.META))) {
89
+ await ddl(`CREATE TABLE ${exports.META} (EPOCH VARCHAR(40) NOT NULL, PRUNED_THROUGH BIGINT DEFAULT 0 NOT NULL)`);
90
+ const tx = await attachment.startTransaction();
91
+ const epoch = `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`;
92
+ await attachment.execute(tx, `INSERT INTO ${exports.META} (EPOCH) VALUES (?)`, [epoch]);
93
+ await tx.commit();
94
+ }
95
+ // Installed by an earlier version: without pruning.
96
+ const column = 'SELECT 1 FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = \'' + exports.META + '\' AND RDB$FIELD_NAME = ?';
97
+ if (!(await has(column, 'PRUNED_THROUGH'))) {
98
+ await ddl(`ALTER TABLE ${exports.META} ADD PRUNED_THROUGH BIGINT DEFAULT 0 NOT NULL`);
99
+ }
100
+ if (!(await has(relation, exports.STAMPS))) {
101
+ await ddl(`CREATE TABLE ${exports.STAMPS} (COMMIT_SEQ BIGINT NOT NULL PRIMARY KEY, STAMPED_AT TIMESTAMP NOT NULL)`);
102
+ }
103
+ for (const table of tables) {
104
+ await ddl(tableTrigger(table));
105
+ }
106
+ }
107
+ /** The trigger that logs `table`'s changed keys. */
108
+ function tableTrigger(table) {
109
+ const keys = table.key.map((_, i) => `K${i + 1}`).join(', ');
110
+ const values = (row) => table.key.map((k) => `${row}.${(0, catalog_1.quote)(k)}`).join(', ');
111
+ const name = table.name.replace(/'/g, "''");
112
+ const log = (op, row) => `INSERT INTO ${exports.CHANGES} (CHANGE_ID, TX_ID, TABLE_NAME, OP, ${keys}) ` +
113
+ `VALUES (GEN_ID(${CHANGE_SEQ}, 1), CURRENT_TRANSACTION, '${name}', '${op}', ${values(row)});`;
114
+ const keyChanged = table.key.map((k) => `OLD.${(0, catalog_1.quote)(k)} IS DISTINCT FROM NEW.${(0, catalog_1.quote)(k)}`).join(' OR ');
115
+ return (`CREATE OR ALTER TRIGGER ${triggerName(table.name)} FOR ${(0, catalog_1.quote)(table.name)}\n` +
116
+ 'ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 32767 AS\n' +
117
+ 'BEGIN\n' +
118
+ // A changed key is the old row gone and a new one there.
119
+ ` IF (DELETING OR (UPDATING AND (${keyChanged}))) THEN ${log('D', 'OLD')}\n` +
120
+ ` IF (INSERTING) THEN ${log('I', 'NEW')}\n` +
121
+ ` IF (UPDATING) THEN ${log('U', 'NEW')}\n` +
122
+ // Wakes the servers' live requests when the transaction commits; Firebird
123
+ // delivers one per transaction however many rows posted it.
124
+ ` POST_EVENT '${exports.CHANGE_EVENT}';\n` +
125
+ 'END');
126
+ }
127
+ /**
128
+ * Give every change committed since the last call one new number, and
129
+ * return it (or 0 when there was nothing to number).
130
+ *
131
+ * Numbering after the commit, not in a commit trigger: a database trigger
132
+ * is loaded when a connection attaches, so an application connected before
133
+ * the capture was installed would never run it. A change still being
134
+ * written is invisible to this READ COMMITTED update and is numbered by a
135
+ * later call, after its commit; so numbers follow commits.
136
+ *
137
+ * One numbering at a time, across every server on the database: each takes
138
+ * the ELECTRIC_META row first, and a number is taken only under it. So
139
+ * numbers commit in order, and a snapshot that sees a number sees every
140
+ * number below it. Two servers numbering at once used to fail on each
141
+ * other's rows, or commit a higher number before a lower one.
142
+ */
143
+ async function stampCommitted(attachment) {
144
+ for (let attempt = 1;; attempt++) {
145
+ const tx = await attachment.startTransaction({
146
+ isolation: node_firebird_driver_1.TransactionIsolation.READ_COMMITTED,
147
+ readCommittedMode: 'RECORD_VERSION',
148
+ waitMode: 'NO_WAIT',
149
+ });
150
+ try {
151
+ const pending = await attachment.executeQuery(tx, `SELECT FIRST 1 1 FROM ${exports.CHANGES} WHERE COMMIT_SEQ IS NULL`);
152
+ const any = (await pending.fetch({ fetchSize: 1 })).length > 0;
153
+ await pending.close();
154
+ if (!any) {
155
+ await tx.commit();
156
+ return 0;
157
+ }
158
+ try {
159
+ await attachment.execute(tx, `UPDATE ${exports.META} SET EPOCH = EPOCH`);
160
+ }
161
+ catch (err) {
162
+ // Another server is numbering: try again once it has.
163
+ await tx.rollback().catch(() => undefined);
164
+ if (attempt >= 100)
165
+ throw err;
166
+ await new Promise((r) => setTimeout(r, Math.min(5 * attempt, 50)));
167
+ continue;
168
+ }
169
+ const seq = await attachment.executeQuery(tx, `SELECT GEN_ID(${COMMIT_SEQ}, 1) FROM RDB$DATABASE`);
170
+ const n = Number((await seq.fetch())[0][0]);
171
+ await seq.close();
172
+ await attachment.execute(tx, `UPDATE ${exports.CHANGES} SET COMMIT_SEQ = ? WHERE COMMIT_SEQ IS NULL`, [n]);
173
+ await attachment.execute(tx, `INSERT INTO ${exports.STAMPS} (COMMIT_SEQ, STAMPED_AT) VALUES (?, CURRENT_TIMESTAMP)`, [n]);
174
+ await tx.commit();
175
+ return n;
176
+ }
177
+ catch (err) {
178
+ await tx.rollback().catch(() => undefined);
179
+ throw err;
180
+ }
181
+ }
182
+ }
183
+ /**
184
+ * Drop what was numbered before `before` from the log, and return the
185
+ * highest number dropped (0 when nothing was). A client whose position is
186
+ * below it is sent back to a snapshot: what it would need is gone.
187
+ */
188
+ async function pruneLog(attachment, before) {
189
+ for (let attempt = 1;; attempt++) {
190
+ const tx = await attachment.startTransaction({
191
+ isolation: node_firebird_driver_1.TransactionIsolation.READ_COMMITTED,
192
+ readCommittedMode: 'RECORD_VERSION',
193
+ waitMode: 'NO_WAIT',
194
+ });
195
+ try {
196
+ try {
197
+ // Not while a number is being given: the same lock as stampCommitted.
198
+ await attachment.execute(tx, `UPDATE ${exports.META} SET EPOCH = EPOCH`);
199
+ }
200
+ catch (err) {
201
+ await tx.rollback().catch(() => undefined);
202
+ if (attempt >= 100)
203
+ throw err;
204
+ await new Promise((r) => setTimeout(r, Math.min(5 * attempt, 50)));
205
+ continue;
206
+ }
207
+ const rs = await attachment.executeQuery(tx, `SELECT MAX(COMMIT_SEQ) FROM ${exports.STAMPS} WHERE STAMPED_AT < ?`, [before]);
208
+ const through = Number((await rs.fetch())[0]?.[0] ?? 0);
209
+ await rs.close();
210
+ if (through > 0) {
211
+ await attachment.execute(tx, `DELETE FROM ${exports.CHANGES} WHERE COMMIT_SEQ <= ?`, [through]);
212
+ await attachment.execute(tx, `DELETE FROM ${exports.STAMPS} WHERE COMMIT_SEQ <= ?`, [through]);
213
+ await attachment.execute(tx, `UPDATE ${exports.META} SET PRUNED_THROUGH = ? WHERE PRUNED_THROUGH < ?`, [through, through]);
214
+ }
215
+ await tx.commit();
216
+ return through;
217
+ }
218
+ catch (err) {
219
+ await tx.rollback().catch(() => undefined);
220
+ throw err;
221
+ }
222
+ }
223
+ }
224
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/electric-server/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * catalog.ts – a Firebird table described as an Electric shape: its columns
3
+ * in Postgres's type names, its key, and the SQL that renders each value as
4
+ * the text the client parses.
5
+ */
6
+ import type { ElectricColumn, ElectricSchema } from '../electric/values';
7
+ /** A column as the system tables describe it. */
8
+ export interface FirebirdColumn {
9
+ /** The Firebird name, exactly (upper case unless it was quoted). */
10
+ name: string;
11
+ /** RDB$FIELD_TYPE. */
12
+ type: number;
13
+ subType: number;
14
+ scale: number;
15
+ precision: number;
16
+ charLength: number;
17
+ notNull: boolean;
18
+ /** RDB$CHARACTER_SET_ID: 1 is OCTETS, the set of BINARY and VARBINARY. */
19
+ charSet?: number;
20
+ }
21
+ /** How one column is read and described. */
22
+ export interface ColumnPlan {
23
+ /** The Firebird name. */
24
+ name: string;
25
+ /** The name the shape uses: lower case where Firebird folded it. */
26
+ shapeName: string;
27
+ /** The SELECT expression that yields the value. */
28
+ select: string;
29
+ /** How the fetched value becomes text. */
30
+ render: 'text' | 'number' | 'boolean' | 'blob' | 'bytes' | 'utc';
31
+ /** The column in `electric-schema`. */
32
+ schema: ElectricColumn;
33
+ }
34
+ export declare function quote(name: string): string;
35
+ /**
36
+ * The shape's name for a Firebird column: a name Firebird folded to upper
37
+ * case is lower case, as Postgres would fold it, and the client folds it back
38
+ * (`TITLE` → `title` → `"TITLE"`); any other name is kept as it is.
39
+ */
40
+ export declare function shapeName(firebirdName: string): string;
41
+ /** The plan for one column, from its system-table description. */
42
+ export declare function planColumn(column: FirebirdColumn): ColumnPlan;
43
+ /** A table as the server serves it. */
44
+ export interface TablePlan {
45
+ /** The Firebird name, exactly. */
46
+ name: string;
47
+ columns: ColumnPlan[];
48
+ /** Key columns, Firebird names, in key order. */
49
+ key: string[];
50
+ schema: ElectricSchema;
51
+ }
52
+ /** Combine a table's columns and key into its plan. */
53
+ export declare function planTable(name: string, columns: FirebirdColumn[], key: string[]): TablePlan;
54
+ /** Render one fetched value as the text Electric sends, or null. */
55
+ export declare function renderValue(plan: ColumnPlan, value: unknown): string | null;
56
+ /**
57
+ * A table name as a client gives it (`items`, `ITEMS` or `"Mixed"`) as the
58
+ * name in the system tables.
59
+ */
60
+ export declare function relationName(given: string): string;
61
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/electric-server/catalog.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzE,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;IACjE,uCAAuC;IACvC,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEtD;AAKD,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CA0D7D;AAED,uCAAuC;AACvC,MAAM,WAAW,SAAS;IACxB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,iDAAiD;IACjD,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,uDAAuD;AACvD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,CAW3F;AAED,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAmB3E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlD"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ /**
3
+ * catalog.ts – a Firebird table described as an Electric shape: its columns
4
+ * in Postgres's type names, its key, and the SQL that renders each value as
5
+ * the text the client parses.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.quote = quote;
9
+ exports.shapeName = shapeName;
10
+ exports.planColumn = planColumn;
11
+ exports.planTable = planTable;
12
+ exports.renderValue = renderValue;
13
+ exports.relationName = relationName;
14
+ function quote(name) {
15
+ return `"${name.replace(/"/g, '""')}"`;
16
+ }
17
+ /**
18
+ * The shape's name for a Firebird column: a name Firebird folded to upper
19
+ * case is lower case, as Postgres would fold it, and the client folds it back
20
+ * (`TITLE` → `title` → `"TITLE"`); any other name is kept as it is.
21
+ */
22
+ function shapeName(firebirdName) {
23
+ return /^[A-Z][A-Z0-9_$]*$/.test(firebirdName) ? firebirdName.toLowerCase() : firebirdName;
24
+ }
25
+ /** RDB$CHARACTER_SET_ID of OCTETS. */
26
+ const OCTETS = 1;
27
+ /** The plan for one column, from its system-table description. */
28
+ function planColumn(column) {
29
+ const q = quote(column.name);
30
+ const base = { name: column.name, shapeName: shapeName(column.name) };
31
+ const schema = (type, extra = {}) => ({
32
+ type,
33
+ ...(column.notNull ? { not_null: true } : {}),
34
+ ...extra,
35
+ });
36
+ const exact = (type, extra = {}) => ({
37
+ ...base, select: `CAST(${q} AS VARCHAR(64))`, render: 'text', schema: schema(type, extra),
38
+ });
39
+ switch (column.type) {
40
+ case 7: // SMALLINT, or NUMERIC/DECIMAL stored in one
41
+ case 8: // INTEGER, likewise
42
+ case 16: // BIGINT, likewise
43
+ case 26: { // INT128, likewise
44
+ if (column.scale < 0 || column.subType === 1 || column.subType === 2) {
45
+ return exact('numeric', { precision: column.precision, scale: -column.scale });
46
+ }
47
+ if (column.type === 7)
48
+ return { ...base, select: q, render: 'number', schema: schema('int2') };
49
+ if (column.type === 8)
50
+ return { ...base, select: q, render: 'number', schema: schema('int4') };
51
+ if (column.type === 16)
52
+ return exact('int8');
53
+ return exact('numeric', { precision: 38, scale: 0 });
54
+ }
55
+ case 10: return { ...base, select: q, render: 'number', schema: schema('float4') };
56
+ case 27: return { ...base, select: q, render: 'number', schema: schema('float8') };
57
+ case 23: return { ...base, select: q, render: 'boolean', schema: schema('bool') };
58
+ // BINARY(n) and VARBINARY(n) are CHAR and VARCHAR in OCTETS: bytes. Read
59
+ // as a binary BLOB: the native driver decodes an OCTETS column as text.
60
+ case 14:
61
+ return column.charSet === OCTETS
62
+ ? { ...base, select: `CAST(${q} AS BLOB SUB_TYPE BINARY)`, render: 'bytes', schema: schema('bytea') }
63
+ : { ...base, select: q, render: 'text', schema: schema('bpchar', { length: column.charLength }) };
64
+ case 37:
65
+ return column.charSet === OCTETS
66
+ ? { ...base, select: `CAST(${q} AS BLOB SUB_TYPE BINARY)`, render: 'bytes', schema: schema('bytea') }
67
+ : { ...base, select: q, render: 'text', schema: schema('varchar', { max_length: column.charLength }) };
68
+ case 261:
69
+ return column.subType === 1
70
+ ? { ...base, select: q, render: 'blob', schema: schema('text') }
71
+ : { ...base, select: q, render: 'bytes', schema: schema('bytea') };
72
+ case 12: return { ...base, select: `CAST(${q} AS VARCHAR(10))`, render: 'text', schema: schema('date') };
73
+ case 13: return { ...base, select: `CAST(${q} AS VARCHAR(13))`, render: 'text', schema: schema('time') };
74
+ case 35: return { ...base, select: `CAST(${q} AS VARCHAR(24))`, render: 'text', schema: schema('timestamp') };
75
+ // The zoned types, in UTC: Firebird renders the zone as a name, the
76
+ // client wants an offset.
77
+ case 28:
78
+ return { ...base, select: `CAST(${q} AT TIME ZONE 'UTC' AS VARCHAR(40))`, render: 'utc', schema: schema('timetz') };
79
+ case 29:
80
+ return { ...base, select: `CAST(${q} AT TIME ZONE 'UTC' AS VARCHAR(48))`, render: 'utc', schema: schema('timestamptz') };
81
+ case 24:
82
+ case 25:
83
+ // DECFLOAT renders in exponent notation, which numeric does not take.
84
+ return { ...base, select: 'NULL', render: 'text', schema: schema('decfloat') };
85
+ default:
86
+ return { ...base, select: 'NULL', render: 'text', schema: schema(`firebird_type_${column.type}`) };
87
+ }
88
+ }
89
+ /** Combine a table's columns and key into its plan. */
90
+ function planTable(name, columns, key) {
91
+ if (columns.length === 0)
92
+ throw new Error(`Table ${name} does not exist or has no columns`);
93
+ if (key.length === 0)
94
+ throw new Error(`Table ${name} has no primary key, which a shape needs`);
95
+ if (key.length > 4)
96
+ throw new Error(`Table ${name} has a key of ${key.length} columns; at most 4 are supported`);
97
+ const plans = columns.map(planColumn);
98
+ const schema = {};
99
+ for (const plan of plans) {
100
+ const index = key.indexOf(plan.name);
101
+ schema[plan.shapeName] = index >= 0 ? { ...plan.schema, pk_index: index } : plan.schema;
102
+ }
103
+ return { name, columns: plans, key, schema };
104
+ }
105
+ /** Render one fetched value as the text Electric sends, or null. */
106
+ function renderValue(plan, value) {
107
+ if (value === null || value === undefined)
108
+ return null;
109
+ switch (plan.render) {
110
+ case 'number':
111
+ // String() of a double is the shortest text that reads back as it.
112
+ return String(value);
113
+ case 'boolean':
114
+ return value ? 'true' : 'false';
115
+ case 'bytes': {
116
+ // Postgres's hex form, of the bytes of a BLOB read whole.
117
+ const bytes = Buffer.from(value);
118
+ return `\\x${bytes.toString('hex')}`;
119
+ }
120
+ case 'utc':
121
+ // '2024-05-01 10:00:00.0000 UTC' → '2024-05-01 10:00:00.0000+00'
122
+ return String(value).replace(/ (UTC|GMT|\+00:00)$/, '+00');
123
+ default:
124
+ return String(value);
125
+ }
126
+ }
127
+ /**
128
+ * A table name as a client gives it (`items`, `ITEMS` or `"Mixed"`) as the
129
+ * name in the system tables.
130
+ */
131
+ function relationName(given) {
132
+ const quoted = /^"((?:[^"]|"")+)"$/.exec(given);
133
+ if (quoted)
134
+ return quoted[1].replace(/""/g, '"');
135
+ return given.toUpperCase();
136
+ }
137
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/electric-server/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
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, in pages for a snapshot, and with a `where` if asked.
22
+ * Several servers can share a database: they number the log one at a time.
23
+ * Node only: it uses the native client (`node-firebird-driver-
24
+ * native`, an optional dependency of this package).
25
+ */
26
+ import type { IncomingMessage, ServerResponse } from 'node:http';
27
+ import type { TablePlan } from './catalog';
28
+ export { triggerName, tableTrigger } from './capture';
29
+ export { translateWhere, WhereError } from './where';
30
+ export { planTable, planColumn, shapeName } from './catalog';
31
+ export type { TablePlan, ColumnPlan, FirebirdColumn } from './catalog';
32
+ /** Options of {@link createShapeServer}. */
33
+ export interface ShapeServerOptions {
34
+ /** The database, as the native client takes it: `host:/path/db.fdb`. */
35
+ database: string;
36
+ username?: string;
37
+ password?: string;
38
+ /** Path to the Firebird client library. Default: the system's. */
39
+ libraryPath?: string;
40
+ /** The tables served, as written in SQL (`items`, or `"Mixed"`). Each needs a primary key. */
41
+ tables: string[];
42
+ /** Install the log and the triggers (idempotent). Default true. */
43
+ install?: boolean;
44
+ /** How long a live request waits for a change. Default 20 000 ms, as Electric. */
45
+ liveTimeoutMs?: number;
46
+ /**
47
+ * How often a waiting live request looks at the log when no event woke it.
48
+ * Default 1000 ms: a commit that logged a change wakes it at once.
49
+ */
50
+ pollIntervalMs?: number;
51
+ /** Wake live requests on Firebird events (`ELECTRIC_CHANGES`), on a connection of its own. Default true. */
52
+ events?: boolean;
53
+ /** Rows per response while serving a snapshot. Default 10 000. */
54
+ snapshotPageRows?: number;
55
+ /**
56
+ * How long the log keeps a change after numbering it, in ms; a client
57
+ * further behind starts again from a snapshot. Default 7 days; `null` or
58
+ * 0 keeps everything (prune with {@link ShapeServer.prune}).
59
+ */
60
+ retainLogMs?: number | null;
61
+ }
62
+ /** A running shape server. */
63
+ export interface ShapeServer {
64
+ /** The Node HTTP handler: `http.createServer(server.handler)`. */
65
+ handler: (req: IncomingMessage, res: ServerResponse) => void;
66
+ /** The plans of the served tables, by Firebird name. */
67
+ readonly tables: ReadonlyMap<string, TablePlan>;
68
+ /**
69
+ * Whether live requests are woken by Firebird events. False when the
70
+ * event connection could not be made (the server's `RemoteAuxPort` must
71
+ * be reachable from here; a container usually needs it pinned and
72
+ * published): live requests then poll every `pollIntervalMs`.
73
+ */
74
+ readonly events: boolean;
75
+ /**
76
+ * Drop what the log numbered before `before` (default: now less
77
+ * `retainLogMs`), and return the highest number dropped, or 0.
78
+ */
79
+ prune(before?: Date): Promise<number>;
80
+ /** Stop answering and close the connection. */
81
+ close(): Promise<void>;
82
+ }
83
+ /** Connect, install the capture, and return a handler serving `options.tables`. */
84
+ export declare function createShapeServer(options: ShapeServerOptions): Promise<ShapeServer>;
85
+ //# 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;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,OAAO,KAAK,EAAkB,SAAS,EAAE,MAAM,WAAW,CAAC;AAK3D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrD,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;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6GAA6G;IAC7G,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;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;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,+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,CAkWzF"}