firebird-wasm 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/README.md +30 -14
  3. package/dist/.tsbuildinfo.build +1 -1
  4. package/dist/browser/engine-transport.d.ts +2 -0
  5. package/dist/browser/engine-transport.d.ts.map +1 -1
  6. package/dist/browser/engine-transport.js +38 -3
  7. package/dist/browser/engine-transport.js.map +1 -1
  8. package/dist/browser/index.d.ts +1 -1
  9. package/dist/browser/index.d.ts.map +1 -1
  10. package/dist/browser/index.js +2 -1
  11. package/dist/browser/index.js.map +1 -1
  12. package/dist/browser/params.d.ts +8 -2
  13. package/dist/browser/params.d.ts.map +1 -1
  14. package/dist/browser/params.js +14 -5
  15. package/dist/browser/params.js.map +1 -1
  16. package/dist/electric/index.d.ts +52 -2
  17. package/dist/electric/index.d.ts.map +1 -1
  18. package/dist/electric/index.js +266 -98
  19. package/dist/electric/index.js.map +1 -1
  20. package/dist/electric/serial.d.ts +20 -0
  21. package/dist/electric/serial.d.ts.map +1 -0
  22. package/dist/electric/serial.js +29 -0
  23. package/dist/electric/serial.js.map +1 -0
  24. package/dist/electric/values.d.ts.map +1 -1
  25. package/dist/electric/values.js +17 -3
  26. package/dist/electric/values.js.map +1 -1
  27. package/dist/electric/writes.d.ts +99 -0
  28. package/dist/electric/writes.d.ts.map +1 -0
  29. package/dist/electric/writes.js +282 -0
  30. package/dist/electric/writes.js.map +1 -0
  31. package/dist/electric-server/capture.d.ts +17 -2
  32. package/dist/electric-server/capture.d.ts.map +1 -1
  33. package/dist/electric-server/capture.js +100 -24
  34. package/dist/electric-server/capture.js.map +1 -1
  35. package/dist/electric-server/catalog.d.ts +3 -1
  36. package/dist/electric-server/catalog.d.ts.map +1 -1
  37. package/dist/electric-server/catalog.js +18 -3
  38. package/dist/electric-server/catalog.js.map +1 -1
  39. package/dist/electric-server/index.d.ts +30 -3
  40. package/dist/electric-server/index.d.ts.map +1 -1
  41. package/dist/electric-server/index.js +258 -78
  42. package/dist/electric-server/index.js.map +1 -1
  43. package/dist/electric-server/where.d.ts +30 -0
  44. package/dist/electric-server/where.d.ts.map +1 -0
  45. package/dist/electric-server/where.js +243 -0
  46. package/dist/electric-server/where.js.map +1 -0
  47. package/dist/firebird.d.ts.map +1 -1
  48. package/dist/firebird.js +10 -1
  49. package/dist/firebird.js.map +1 -1
  50. package/dist/index.d.ts +1 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +2 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/version.d.ts +1 -1
  55. package/dist/version.js +1 -1
  56. package/dist/wasm/firebird-embedded-st.js +1 -1
  57. package/dist/wasm/firebird-embedded-st.wasm +0 -0
  58. package/dist/wasm/firebird-embedded.js +1 -1
  59. package/dist/wasm/firebird-embedded.wasm +0 -0
  60. package/dist/wasm-loader.d.ts +57 -7
  61. package/dist/wasm-loader.d.ts.map +1 -1
  62. package/dist/wasm-loader.js +106 -21
  63. package/dist/wasm-loader.js.map +1 -1
  64. package/package.json +1 -1
@@ -8,15 +8,20 @@
8
8
  * which is the order the stream follows.
9
9
  */
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.KEY_COLUMNS = exports.META = exports.CHANGES = void 0;
11
+ exports.KEY_COLUMNS = exports.CHANGE_EVENT = exports.STAMPS = exports.META = exports.CHANGES = void 0;
12
12
  exports.triggerName = triggerName;
13
13
  exports.installCapture = installCapture;
14
14
  exports.tableTrigger = tableTrigger;
15
15
  exports.stampCommitted = stampCommitted;
16
+ exports.pruneLog = pruneLog;
16
17
  const node_firebird_driver_1 = require("node-firebird-driver");
17
18
  const catalog_1 = require("./catalog");
18
19
  exports.CHANGES = 'ELECTRIC_CHANGES';
19
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';
20
25
  const CHANGE_SEQ = 'ELECTRIC_CHANGE_SEQ';
21
26
  const COMMIT_SEQ = 'ELECTRIC_COMMIT_SEQ';
22
27
  /** How many key columns the log has room for. */
@@ -81,12 +86,20 @@ async function installCapture(attachment, tables) {
81
86
  await ddl(`CREATE INDEX ${exports.CHANGES}_SEQ ON ${exports.CHANGES} (COMMIT_SEQ)`);
82
87
  }
83
88
  if (!(await has(relation, exports.META))) {
84
- await ddl(`CREATE TABLE ${exports.META} (EPOCH VARCHAR(40) NOT NULL)`);
89
+ await ddl(`CREATE TABLE ${exports.META} (EPOCH VARCHAR(40) NOT NULL, PRUNED_THROUGH BIGINT DEFAULT 0 NOT NULL)`);
85
90
  const tx = await attachment.startTransaction();
86
91
  const epoch = `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`;
87
92
  await attachment.execute(tx, `INSERT INTO ${exports.META} (EPOCH) VALUES (?)`, [epoch]);
88
93
  await tx.commit();
89
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
+ }
90
103
  for (const table of tables) {
91
104
  await ddl(tableTrigger(table));
92
105
  }
@@ -106,6 +119,9 @@ function tableTrigger(table) {
106
119
  ` IF (DELETING OR (UPDATING AND (${keyChanged}))) THEN ${log('D', 'OLD')}\n` +
107
120
  ` IF (INSERTING) THEN ${log('I', 'NEW')}\n` +
108
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` +
109
125
  'END');
110
126
  }
111
127
  /**
@@ -116,33 +132,93 @@ function tableTrigger(table) {
116
132
  * is loaded when a connection attaches, so an application connected before
117
133
  * the capture was installed would never run it. A change still being
118
134
  * written is invisible to this READ COMMITTED update and is numbered by a
119
- * later call, after its commit; so numbers follow commits, and one stamper
120
- * at a time (the server's queue) leaves no number to arrive late.
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.
121
142
  */
122
143
  async function stampCommitted(attachment) {
123
- const tx = await attachment.startTransaction({
124
- isolation: node_firebird_driver_1.TransactionIsolation.READ_COMMITTED,
125
- readCommittedMode: 'RECORD_VERSION',
126
- waitMode: 'NO_WAIT',
127
- });
128
- try {
129
- const pending = await attachment.executeQuery(tx, `SELECT FIRST 1 1 FROM ${exports.CHANGES} WHERE COMMIT_SEQ IS NULL`);
130
- const any = (await pending.fetch({ fetchSize: 1 })).length > 0;
131
- await pending.close();
132
- if (!any) {
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]);
133
174
  await tx.commit();
134
- return 0;
175
+ return n;
176
+ }
177
+ catch (err) {
178
+ await tx.rollback().catch(() => undefined);
179
+ throw err;
135
180
  }
136
- const seq = await attachment.executeQuery(tx, `SELECT GEN_ID(${COMMIT_SEQ}, 1) FROM RDB$DATABASE`);
137
- const n = Number((await seq.fetch())[0][0]);
138
- await seq.close();
139
- await attachment.execute(tx, `UPDATE ${exports.CHANGES} SET COMMIT_SEQ = ? WHERE COMMIT_SEQ IS NULL`, [n]);
140
- await tx.commit();
141
- return n;
142
181
  }
143
- catch (err) {
144
- await tx.rollback().catch(() => undefined);
145
- throw err;
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
+ }
146
222
  }
147
223
  }
148
224
  //# sourceMappingURL=capture.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/electric-server/capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/electric-server/capture.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,8 @@ export interface FirebirdColumn {
15
15
  precision: number;
16
16
  charLength: number;
17
17
  notNull: boolean;
18
+ /** RDB$CHARACTER_SET_ID: 1 is OCTETS, the set of BINARY and VARBINARY. */
19
+ charSet?: number;
18
20
  }
19
21
  /** How one column is read and described. */
20
22
  export interface ColumnPlan {
@@ -25,7 +27,7 @@ export interface ColumnPlan {
25
27
  /** The SELECT expression that yields the value. */
26
28
  select: string;
27
29
  /** How the fetched value becomes text. */
28
- render: 'text' | 'number' | 'boolean' | 'blob' | 'utc';
30
+ render: 'text' | 'number' | 'boolean' | 'blob' | 'bytes' | 'utc';
29
31
  /** The column in `electric-schema`. */
30
32
  schema: ElectricColumn;
31
33
  }
@@ -1 +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;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,KAAK,CAAC;IACvD,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;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CAkD7D;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,CAc3E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlD"}
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"}
@@ -22,6 +22,8 @@ function quote(name) {
22
22
  function shapeName(firebirdName) {
23
23
  return /^[A-Z][A-Z0-9_$]*$/.test(firebirdName) ? firebirdName.toLowerCase() : firebirdName;
24
24
  }
25
+ /** RDB$CHARACTER_SET_ID of OCTETS. */
26
+ const OCTETS = 1;
25
27
  /** The plan for one column, from its system-table description. */
26
28
  function planColumn(column) {
27
29
  const q = quote(column.name);
@@ -53,12 +55,20 @@ function planColumn(column) {
53
55
  case 10: return { ...base, select: q, render: 'number', schema: schema('float4') };
54
56
  case 27: return { ...base, select: q, render: 'number', schema: schema('float8') };
55
57
  case 23: return { ...base, select: q, render: 'boolean', schema: schema('bool') };
56
- case 14: return { ...base, select: q, render: 'text', schema: schema('bpchar', { length: column.charLength }) };
57
- case 37: return { ...base, select: q, render: 'text', schema: schema('varchar', { max_length: column.charLength }) };
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 }) };
58
68
  case 261:
59
69
  return column.subType === 1
60
70
  ? { ...base, select: q, render: 'blob', schema: schema('text') }
61
- : { ...base, select: 'NULL', render: 'text', schema: schema('bytea') };
71
+ : { ...base, select: q, render: 'bytes', schema: schema('bytea') };
62
72
  case 12: return { ...base, select: `CAST(${q} AS VARCHAR(10))`, render: 'text', schema: schema('date') };
63
73
  case 13: return { ...base, select: `CAST(${q} AS VARCHAR(13))`, render: 'text', schema: schema('time') };
64
74
  case 35: return { ...base, select: `CAST(${q} AS VARCHAR(24))`, render: 'text', schema: schema('timestamp') };
@@ -102,6 +112,11 @@ function renderValue(plan, value) {
102
112
  return String(value);
103
113
  case 'boolean':
104
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
+ }
105
120
  case 'utc':
106
121
  // '2024-05-01 10:00:00.0000 UTC' → '2024-05-01 10:00:00.0000+00'
107
122
  return String(value).replace(/ (UTC|GMT|\+00:00)$/, '+00');
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/electric-server/catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/electric-server/catalog.ts"],"names":[],"mappings":"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"}
@@ -18,13 +18,15 @@
18
18
  * Firebird source. It installs triggers that log each changed row's key,
19
19
  * numbers the log in commit order itself (see
20
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-
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-
23
24
  * native`, an optional dependency of this package).
24
25
  */
25
26
  import type { IncomingMessage, ServerResponse } from 'node:http';
26
27
  import type { TablePlan } from './catalog';
27
28
  export { triggerName, tableTrigger } from './capture';
29
+ export { translateWhere, WhereError } from './where';
28
30
  export { planTable, planColumn, shapeName } from './catalog';
29
31
  export type { TablePlan, ColumnPlan, FirebirdColumn } from './catalog';
30
32
  /** Options of {@link createShapeServer}. */
@@ -41,8 +43,21 @@ export interface ShapeServerOptions {
41
43
  install?: boolean;
42
44
  /** How long a live request waits for a change. Default 20 000 ms, as Electric. */
43
45
  liveTimeoutMs?: number;
44
- /** How often a waiting live request looks at the log. Default 100 ms. */
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
+ */
45
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;
46
61
  }
47
62
  /** A running shape server. */
48
63
  export interface ShapeServer {
@@ -50,6 +65,18 @@ export interface ShapeServer {
50
65
  handler: (req: IncomingMessage, res: ServerResponse) => void;
51
66
  /** The plans of the served tables, by Firebird name. */
52
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>;
53
80
  /** Stop answering and close the connection. */
54
81
  close(): Promise<void>;
55
82
  }
@@ -1 +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"}
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"}