firebird-wasm 0.1.1 → 0.3.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 (68) hide show
  1. package/CHANGELOG.md +203 -0
  2. package/README.md +4 -1
  3. package/dist/.tsbuildinfo.build +1 -1
  4. package/dist/browser/engine-transport.d.ts +56 -5
  5. package/dist/browser/engine-transport.d.ts.map +1 -1
  6. package/dist/browser/engine-transport.js +271 -8
  7. package/dist/browser/engine-transport.js.map +1 -1
  8. package/dist/browser/firebird-browser.d.ts +282 -9
  9. package/dist/browser/firebird-browser.d.ts.map +1 -1
  10. package/dist/browser/firebird-browser.js +435 -42
  11. package/dist/browser/firebird-browser.js.map +1 -1
  12. package/dist/browser/index.d.ts +12 -2
  13. package/dist/browser/index.d.ts.map +1 -1
  14. package/dist/browser/index.js +23 -3
  15. package/dist/browser/index.js.map +1 -1
  16. package/dist/browser/leader-election.d.ts +55 -0
  17. package/dist/browser/leader-election.d.ts.map +1 -0
  18. package/dist/browser/leader-election.js +64 -0
  19. package/dist/browser/leader-election.js.map +1 -0
  20. package/dist/browser/opfs-fs.d.ts +72 -0
  21. package/dist/browser/opfs-fs.d.ts.map +1 -0
  22. package/dist/browser/opfs-fs.js +249 -0
  23. package/dist/browser/opfs-fs.js.map +1 -0
  24. package/dist/browser/shared-transport.d.ts +134 -0
  25. package/dist/browser/shared-transport.d.ts.map +1 -0
  26. package/dist/browser/shared-transport.js +366 -0
  27. package/dist/browser/shared-transport.js.map +1 -0
  28. package/dist/browser/statement-types.d.ts +18 -0
  29. package/dist/browser/statement-types.d.ts.map +1 -0
  30. package/dist/browser/statement-types.js +39 -0
  31. package/dist/browser/statement-types.js.map +1 -0
  32. package/dist/browser/value-types.d.ts +173 -0
  33. package/dist/browser/value-types.d.ts.map +1 -0
  34. package/dist/browser/value-types.js +222 -0
  35. package/dist/browser/value-types.js.map +1 -0
  36. package/dist/browser/worker-entry.d.ts.map +1 -1
  37. package/dist/browser/worker-entry.js +38 -1
  38. package/dist/browser/worker-entry.js.map +1 -1
  39. package/dist/browser/worker-protocol.d.ts +1 -1
  40. package/dist/browser/worker-protocol.d.ts.map +1 -1
  41. package/dist/browser/worker-transport.d.ts +8 -2
  42. package/dist/browser/worker-transport.d.ts.map +1 -1
  43. package/dist/browser/worker-transport.js +26 -2
  44. package/dist/browser/worker-transport.js.map +1 -1
  45. package/dist/firebird.d.ts +58 -5
  46. package/dist/firebird.d.ts.map +1 -1
  47. package/dist/firebird.js +161 -52
  48. package/dist/firebird.js.map +1 -1
  49. package/dist/index.d.ts +4 -1
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +9 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/sql-tag.d.ts +184 -0
  54. package/dist/sql-tag.d.ts.map +1 -0
  55. package/dist/sql-tag.js +287 -0
  56. package/dist/sql-tag.js.map +1 -0
  57. package/dist/statement-types.d.ts +23 -0
  58. package/dist/statement-types.d.ts.map +1 -0
  59. package/dist/statement-types.js +44 -0
  60. package/dist/statement-types.js.map +1 -0
  61. package/dist/types.d.ts +62 -0
  62. package/dist/types.d.ts.map +1 -1
  63. package/dist/wasm/firebird-embedded.js +1 -1
  64. package/dist/wasm/firebird-embedded.wasm +0 -0
  65. package/dist/wasm-loader.d.ts +38 -2
  66. package/dist/wasm-loader.d.ts.map +1 -1
  67. package/dist/wasm-loader.js.map +1 -1
  68. package/package.json +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opfs-fs.js","sourceRoot":"","sources":["../../src/browser/opfs-fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * shared-transport.ts – one engine, many tabs.
3
+ *
4
+ * `multiTab: 'exclusive'` keeps a second tab safe by refusing it. This serves
5
+ * it instead: one tab wins the election, runs the engine, and answers for
6
+ * everyone else over a `BroadcastChannel`.
7
+ *
8
+ * ## Why only one tab may run the engine
9
+ *
10
+ * Not because concurrent access needs coordinating — because each tab holds
11
+ * its own complete copy of the database in memory and persists the whole
12
+ * image. Two engines on one database is not a race to be locked around; the
13
+ * later persist discards the other's work entirely. So the engine is
14
+ * singular by construction, and the other tabs are clients of it.
15
+ *
16
+ * ## What happens when the leader disappears
17
+ *
18
+ * The lock releases, a follower is promoted, and it starts its own engine from
19
+ * the last persisted image. Writes made in the departed leader's final
20
+ * debounce window are lost — the same exposure a single tab has always had,
21
+ * and no worse.
22
+ *
23
+ * In-flight calls at that moment are handled by what they are, not uniformly:
24
+ * a read is re-issued to the new leader, because running a query twice is
25
+ * indistinguishable from running it once; a write is **rejected**. The old
26
+ * leader may have committed it and died before the reply, so re-issuing could
27
+ * apply it twice. An error a caller can see beats a duplicate row it cannot.
28
+ */
29
+ import type { Row, QueryResult, QueryDescription, QueryParams, RowMode, TransactionOptions } from '../types';
30
+ import type { EngineHandle, EngineTransport } from './engine-transport';
31
+ /** Options for {@link SharedEngineTransport}. */
32
+ export interface SharedEngineTransportOptions {
33
+ /** Logical database name; scopes both the lock and the channel. */
34
+ dbName: string;
35
+ /**
36
+ * Builds the engine. Called **only** if this tab becomes leader, so a
37
+ * follower never loads the 9 MB artifact it would not use.
38
+ */
39
+ createEngine: () => EngineTransport;
40
+ /**
41
+ * How long a follower waits for the leader to answer, in milliseconds.
42
+ *
43
+ * Generous by default because creating a database is slow and the follower
44
+ * cannot tell a slow leader from a dead one.
45
+ *
46
+ * @default 120000
47
+ */
48
+ timeoutMs?: number;
49
+ /**
50
+ * Called on the leader when it serves an operation that changed data.
51
+ *
52
+ * Persistence lives with whoever owns the engine, and a follower's writes
53
+ * are executed by the leader — so without this the leader would never learn
54
+ * that anything needs saving.
55
+ */
56
+ onServedMutation?: () => void;
57
+ /**
58
+ * Called when the engine behind this transport has been replaced.
59
+ *
60
+ * Handles are issued by whichever engine is running, so a leadership change
61
+ * voids every one of them — in every tab, not just the promoted one. The
62
+ * owner must re-open the database before using it again, and it must happen
63
+ * on the leader before any follower is told there is a leader to talk to.
64
+ */
65
+ onEngineReplaced?: () => Promise<void>;
66
+ }
67
+ /**
68
+ * An {@link EngineTransport} backed by whichever tab currently owns the engine.
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * const db = new FirebirdBrowser('mydb', {
73
+ * multiTab: 'shared',
74
+ * worker: () => new Worker('/firebird-engine-worker.js'),
75
+ * });
76
+ * ```
77
+ */
78
+ export declare class SharedEngineTransport implements EngineTransport {
79
+ private readonly dbName;
80
+ private readonly createEngine;
81
+ private readonly timeoutMs;
82
+ private readonly onServedMutation?;
83
+ private readonly onEngineReplaced?;
84
+ private readonly channel;
85
+ private readonly clientId;
86
+ private readonly election;
87
+ /** The real engine. Non-null exactly when this tab is the leader. */
88
+ private engine;
89
+ private readonly pending;
90
+ private nextCallId;
91
+ private disposed;
92
+ /** Highest leadership generation seen; guards against stale announcements. */
93
+ private epoch;
94
+ /** True while this tab is standing its engine up, so calls stay local. */
95
+ private promoting;
96
+ /** Resolves once a leader is known to exist, so calls do not go nowhere. */
97
+ private leaderKnown;
98
+ private announceLeaderKnown;
99
+ constructor(options: SharedEngineTransportOptions);
100
+ /** Whether this tab currently runs the engine. */
101
+ get isLeader(): boolean;
102
+ private assumeLeadership;
103
+ private recoverPending;
104
+ /** Follower side: the leader changed, so re-open against the new one. */
105
+ private reopenAfterLeaderChange;
106
+ private readonly onMessage;
107
+ /** Leader side: run the operation and reply to the caller. */
108
+ private serve;
109
+ private settle;
110
+ private runLocally;
111
+ /** Run `op` here if this tab leads, otherwise ask whoever does. */
112
+ private call;
113
+ init(): Promise<void>;
114
+ createDatabase(path: string): Promise<EngineHandle>;
115
+ attachDatabase(path: string): Promise<EngineHandle>;
116
+ detachDatabase(dbHandle: EngineHandle): Promise<void>;
117
+ execute(dbHandle: EngineHandle, txHandle: EngineHandle, sql: string, params?: QueryParams): Promise<number>;
118
+ query<T = Row>(dbHandle: EngineHandle, txHandle: EngineHandle, sql: string, params?: QueryParams, rowMode?: RowMode, binaryBlobs?: boolean): Promise<QueryResult<T>>;
119
+ describe(dbHandle: EngineHandle, txHandle: EngineHandle, sql: string): Promise<QueryDescription>;
120
+ startTransaction(dbHandle: EngineHandle, options?: TransactionOptions): Promise<EngineHandle>;
121
+ commit(txHandle: EngineHandle): Promise<void>;
122
+ rollback(txHandle: EngineHandle): Promise<void>;
123
+ mkdir(path: string): Promise<void>;
124
+ exists(path: string): Promise<boolean>;
125
+ readFile(path: string): Promise<Uint8Array>;
126
+ writeFile(path: string, data: Uint8Array): Promise<void>;
127
+ unlink(path: string): Promise<void>;
128
+ eventsSubscribe(dbHandle: EngineHandle, names: string[]): Promise<number>;
129
+ eventsPoll(subscription: number): Promise<Record<string, number>>;
130
+ eventsCancel(subscription: number): Promise<void>;
131
+ mountOpfs(dbName: string): Promise<string>;
132
+ dispose(): Promise<void>;
133
+ }
134
+ //# sourceMappingURL=shared-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-transport.d.ts","sourceRoot":"","sources":["../../src/browser/shared-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,366 @@
1
+ "use strict";
2
+ /**
3
+ * shared-transport.ts – one engine, many tabs.
4
+ *
5
+ * `multiTab: 'exclusive'` keeps a second tab safe by refusing it. This serves
6
+ * it instead: one tab wins the election, runs the engine, and answers for
7
+ * everyone else over a `BroadcastChannel`.
8
+ *
9
+ * ## Why only one tab may run the engine
10
+ *
11
+ * Not because concurrent access needs coordinating — because each tab holds
12
+ * its own complete copy of the database in memory and persists the whole
13
+ * image. Two engines on one database is not a race to be locked around; the
14
+ * later persist discards the other's work entirely. So the engine is
15
+ * singular by construction, and the other tabs are clients of it.
16
+ *
17
+ * ## What happens when the leader disappears
18
+ *
19
+ * The lock releases, a follower is promoted, and it starts its own engine from
20
+ * the last persisted image. Writes made in the departed leader's final
21
+ * debounce window are lost — the same exposure a single tab has always had,
22
+ * and no worse.
23
+ *
24
+ * In-flight calls at that moment are handled by what they are, not uniformly:
25
+ * a read is re-issued to the new leader, because running a query twice is
26
+ * indistinguishable from running it once; a write is **rejected**. The old
27
+ * leader may have committed it and died before the reply, so re-issuing could
28
+ * apply it twice. An error a caller can see beats a duplicate row it cannot.
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.SharedEngineTransport = void 0;
32
+ const leader_election_1 = require("./leader-election");
33
+ /**
34
+ * Operations safe to re-issue to a new leader after the old one vanished.
35
+ *
36
+ * Reads and existence checks only. Every mutation is absent deliberately: its
37
+ * outcome is unknown once the leader dies mid-call, and "unknown" must not be
38
+ * quietly resolved as "did not happen".
39
+ */
40
+ const REPLAYABLE = new Set([
41
+ 'init',
42
+ 'query',
43
+ // Prepares a statement and drops it, executing nothing, so re-issuing it is
44
+ // indistinguishable from issuing it once.
45
+ 'describe',
46
+ 'exists',
47
+ 'readFile',
48
+ ]);
49
+ /** Ops that change the database, and so make the leader's image dirty. */
50
+ const MUTATING = new Set([
51
+ 'execute',
52
+ 'commit',
53
+ 'createDatabase',
54
+ 'writeFile',
55
+ ]);
56
+ const DEFAULT_TIMEOUT_MS = 120000;
57
+ /**
58
+ * An {@link EngineTransport} backed by whichever tab currently owns the engine.
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * const db = new FirebirdBrowser('mydb', {
63
+ * multiTab: 'shared',
64
+ * worker: () => new Worker('/firebird-engine-worker.js'),
65
+ * });
66
+ * ```
67
+ */
68
+ class SharedEngineTransport {
69
+ constructor(options) {
70
+ /** The real engine. Non-null exactly when this tab is the leader. */
71
+ this.engine = null;
72
+ this.pending = new Map();
73
+ this.nextCallId = 1;
74
+ this.disposed = false;
75
+ /** Highest leadership generation seen; guards against stale announcements. */
76
+ this.epoch = 0;
77
+ /** True while this tab is standing its engine up, so calls stay local. */
78
+ this.promoting = false;
79
+ // ── Channel ────────────────────────────────────────────────────────────
80
+ this.onMessage = (event) => {
81
+ const message = event.data;
82
+ switch (message.kind) {
83
+ case 'who-leads':
84
+ // Only a leader answers, and only if it has an engine standing.
85
+ if (this.engine) {
86
+ this.channel.postMessage({
87
+ kind: 'leader',
88
+ epoch: this.epoch,
89
+ });
90
+ }
91
+ return;
92
+ case 'leader':
93
+ this.announceLeaderKnown();
94
+ // A *new* leader, not the one this tab already knew about: its engine
95
+ // is a different engine, so this tab's handles mean nothing to it.
96
+ if (message.epoch > this.epoch) {
97
+ this.epoch = message.epoch;
98
+ if (!this.engine)
99
+ void this.reopenAfterLeaderChange();
100
+ }
101
+ return;
102
+ case 'call':
103
+ if (this.engine)
104
+ void this.serve(message);
105
+ return;
106
+ case 'reply':
107
+ if (message.to === this.clientId)
108
+ this.settle(message);
109
+ return;
110
+ }
111
+ };
112
+ this.dbName = options.dbName;
113
+ this.createEngine = options.createEngine;
114
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
115
+ this.onServedMutation = options.onServedMutation;
116
+ this.onEngineReplaced = options.onEngineReplaced;
117
+ this.clientId = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
118
+ this.channel = new BroadcastChannel(`firebird-wasm:shared:${this.dbName}`);
119
+ this.channel.addEventListener('message', this.onMessage);
120
+ this.leaderKnown = new Promise((resolve) => {
121
+ this.announceLeaderKnown = resolve;
122
+ });
123
+ this.election = (0, leader_election_1.electLeader)(this.dbName, {
124
+ onPromoted: () => this.assumeLeadership(),
125
+ });
126
+ // A follower that starts while a leader already exists hears nothing until
127
+ // it asks; the leader's announcement happened before this tab existed.
128
+ this.channel.postMessage({ kind: 'who-leads' });
129
+ }
130
+ /** Whether this tab currently runs the engine. */
131
+ get isLeader() {
132
+ return this.election.isLeader;
133
+ }
134
+ // ── Leadership ─────────────────────────────────────────────────────────
135
+ async assumeLeadership() {
136
+ if (this.disposed)
137
+ return;
138
+ this.engine = this.createEngine();
139
+ await this.engine.init();
140
+ // Re-open before announcing. A follower that heard "leader" and attached
141
+ // straight away would be attaching to an engine with no database in it.
142
+ this.promoting = true;
143
+ try {
144
+ await this.onEngineReplaced?.();
145
+ }
146
+ finally {
147
+ this.promoting = false;
148
+ }
149
+ this.announceLeaderKnown();
150
+ this.channel.postMessage({ kind: 'leader', epoch: ++this.epoch });
151
+ // Anything still outstanding was addressed to a leader that no longer
152
+ // exists. Replay what is safe to replay; fail the rest loudly.
153
+ this.recoverPending();
154
+ }
155
+ recoverPending() {
156
+ const outstanding = [...this.pending.entries()];
157
+ this.pending.clear();
158
+ for (const [, call] of outstanding) {
159
+ clearTimeout(call.timer);
160
+ if (REPLAYABLE.has(call.op)) {
161
+ this.runLocally(call.op, call.args).then((value) => call.resolve(value), (err) => call.reject(err instanceof Error ? err : new Error(String(err))));
162
+ continue;
163
+ }
164
+ call.reject(new Error(`The tab running the database closed while "${call.op}" was in ` +
165
+ `flight, and this tab has taken over. The operation may or may ` +
166
+ `not have been applied, so it was not retried — re-check the ` +
167
+ `data before repeating it.`));
168
+ }
169
+ }
170
+ /** Follower side: the leader changed, so re-open against the new one. */
171
+ async reopenAfterLeaderChange() {
172
+ if (this.disposed || this.engine)
173
+ return;
174
+ try {
175
+ await this.onEngineReplaced?.();
176
+ }
177
+ catch {
178
+ // Reported through the owner's own error handling; a throw here would
179
+ // become an unhandled rejection in a channel event listener.
180
+ }
181
+ }
182
+ /** Leader side: run the operation and reply to the caller. */
183
+ async serve(message) {
184
+ let reply;
185
+ try {
186
+ const result = await this.runLocally(message.op, message.args);
187
+ reply = {
188
+ kind: 'reply',
189
+ to: message.from,
190
+ id: message.id,
191
+ ok: true,
192
+ result: result ?? null,
193
+ };
194
+ if (MUTATING.has(message.op)) {
195
+ // The write happened here, but the caller that wanted it is in
196
+ // another tab and will never mark this engine dirty.
197
+ this.onServedMutation?.();
198
+ }
199
+ }
200
+ catch (err) {
201
+ reply = {
202
+ kind: 'reply',
203
+ to: message.from,
204
+ id: message.id,
205
+ ok: false,
206
+ // A string, not an Error: structured cloning drops the prototype and
207
+ // the stack belongs to a tab the caller cannot see anyway.
208
+ error: err instanceof Error ? err.message : String(err),
209
+ };
210
+ }
211
+ this.channel.postMessage(reply);
212
+ }
213
+ settle(message) {
214
+ const call = this.pending.get(message.id);
215
+ if (!call)
216
+ return; // already timed out, or replayed after a promotion
217
+ this.pending.delete(message.id);
218
+ clearTimeout(call.timer);
219
+ if (message.ok) {
220
+ call.resolve(message.result);
221
+ }
222
+ else {
223
+ call.reject(new Error(message.error ?? 'the database tab reported an error'));
224
+ }
225
+ }
226
+ runLocally(op, args) {
227
+ const engine = this.engine;
228
+ if (!engine) {
229
+ return Promise.reject(new Error('not the leader'));
230
+ }
231
+ const fn = engine[op];
232
+ if (typeof fn !== 'function') {
233
+ return Promise.reject(new Error(`unknown engine operation: ${op}`));
234
+ }
235
+ return fn.apply(engine, args);
236
+ }
237
+ // ── Dispatch ───────────────────────────────────────────────────────────
238
+ /** Run `op` here if this tab leads, otherwise ask whoever does. */
239
+ async call(op, ...args) {
240
+ if (this.disposed) {
241
+ throw new Error('SharedEngineTransport has been disposed');
242
+ }
243
+ if (this.engine) {
244
+ return (await this.runLocally(op, args));
245
+ }
246
+ // Do not shout into an empty channel: on a cold start every tab is a
247
+ // follower for the moment it takes the winner to stand its engine up.
248
+ await this.leaderKnown;
249
+ // Promotion can happen while waiting, in which case this is now local.
250
+ if (this.engine) {
251
+ return (await this.runLocally(op, args));
252
+ }
253
+ const id = this.nextCallId++;
254
+ return new Promise((resolve, reject) => {
255
+ const timer = setTimeout(() => {
256
+ this.pending.delete(id);
257
+ reject(new Error(`the tab running database "${this.dbName}" did not answer ` +
258
+ `"${op}" within ${this.timeoutMs}ms`));
259
+ }, this.timeoutMs);
260
+ this.pending.set(id, {
261
+ op,
262
+ args,
263
+ resolve: resolve,
264
+ reject,
265
+ timer,
266
+ });
267
+ this.channel.postMessage({
268
+ kind: 'call',
269
+ from: this.clientId,
270
+ id,
271
+ op,
272
+ args,
273
+ });
274
+ });
275
+ }
276
+ // ── EngineTransport ────────────────────────────────────────────────────
277
+ async init() {
278
+ // Whoever wins the election calls the engine's own init(); a follower has
279
+ // nothing to initialise and must not wait for an engine it will not build.
280
+ await Promise.race([this.election.promoted, this.leaderKnown]);
281
+ }
282
+ createDatabase(path) {
283
+ return this.call('createDatabase', path);
284
+ }
285
+ attachDatabase(path) {
286
+ return this.call('attachDatabase', path);
287
+ }
288
+ detachDatabase(dbHandle) {
289
+ // Followers share the leader's attachment; detaching it because one tab
290
+ // closed would pull the database out from under every other tab.
291
+ if (!this.engine)
292
+ return Promise.resolve();
293
+ return this.call('detachDatabase', dbHandle);
294
+ }
295
+ execute(dbHandle, txHandle, sql, params = []) {
296
+ return this.call('execute', dbHandle, txHandle, sql, params);
297
+ }
298
+ query(dbHandle, txHandle, sql, params = [], rowMode = 'object', binaryBlobs = false) {
299
+ // Decoding happens on the far side, so both of these have to travel with
300
+ // the call rather than being applied to what comes back. They are a string
301
+ // and a boolean, so they survive structured cloning like the rest of the
302
+ // arguments — and the Uint8Arrays that come back from a side-channelled
303
+ // BLOB survive it too, which is what made this placement possible.
304
+ return this.call('query', dbHandle, txHandle, sql, params, rowMode, binaryBlobs);
305
+ }
306
+ describe(dbHandle, txHandle, sql) {
307
+ return this.call('describe', dbHandle, txHandle, sql);
308
+ }
309
+ startTransaction(dbHandle, options = {}) {
310
+ return this.call('startTransaction', dbHandle, options);
311
+ }
312
+ commit(txHandle) {
313
+ return this.call('commit', txHandle);
314
+ }
315
+ rollback(txHandle) {
316
+ return this.call('rollback', txHandle);
317
+ }
318
+ mkdir(path) {
319
+ return this.call('mkdir', path);
320
+ }
321
+ exists(path) {
322
+ return this.call('exists', path);
323
+ }
324
+ readFile(path) {
325
+ return this.call('readFile', path);
326
+ }
327
+ writeFile(path, data) {
328
+ return this.call('writeFile', path, data);
329
+ }
330
+ unlink(path) {
331
+ return this.call('unlink', path);
332
+ }
333
+ eventsSubscribe(dbHandle, names) {
334
+ return this.call('eventsSubscribe', dbHandle, names);
335
+ }
336
+ eventsPoll(subscription) {
337
+ return this.call('eventsPoll', subscription);
338
+ }
339
+ eventsCancel(subscription) {
340
+ return this.call('eventsCancel', subscription);
341
+ }
342
+ mountOpfs(dbName) {
343
+ // The mount happens on the far side; only the resulting path comes back.
344
+ return this.call('mountOpfs', dbName);
345
+ }
346
+ async dispose() {
347
+ if (this.disposed)
348
+ return;
349
+ this.disposed = true;
350
+ for (const [, call] of this.pending) {
351
+ clearTimeout(call.timer);
352
+ call.reject(new Error('SharedEngineTransport has been disposed'));
353
+ }
354
+ this.pending.clear();
355
+ this.channel.removeEventListener('message', this.onMessage);
356
+ this.channel.close();
357
+ const engine = this.engine;
358
+ this.engine = null;
359
+ // Resign last: releasing the lock promotes another tab, which will build
360
+ // its own engine, and this one should be gone before that happens.
361
+ await engine?.dispose();
362
+ await this.election.resign();
363
+ }
364
+ }
365
+ exports.SharedEngineTransport = SharedEngineTransport;
366
+ //# sourceMappingURL=shared-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-transport.js","sourceRoot":"","sources":["../../src/browser/shared-transport.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;AAWH,uDAAgD;AA6ChD;;;;;;GAMG;AACH,MAAM,UAAU,GAA0B,IAAI,GAAG,CAAW;IAC1D,MAAM;IACN,OAAO;IACP,4EAA4E;IAC5E,0CAA0C;IAC1C,UAAU;IACV,QAAQ;IACR,UAAU;CACX,CAAC,CAAC;AA2CH,0EAA0E;AAC1E,MAAM,QAAQ,GAA0B,IAAI,GAAG,CAAW;IACxD,SAAS;IACT,QAAQ;IACR,gBAAgB;IAChB,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,MAAO,CAAC;AAcnC;;;;;;;;;;GAUG;AACH,MAAa,qBAAqB;IA0BhC,YAAY,OAAqC;QAfjD,sEAAsE;QAC9D,WAAM,GAA2B,IAAI,CAAC;QAE7B,YAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;QAC9C,eAAU,GAAG,CAAC,CAAC;QACf,aAAQ,GAAG,KAAK,CAAC;QAEzB,8EAA8E;QACtE,UAAK,GAAG,CAAC,CAAC;QAClB,0EAA0E;QAClE,cAAS,GAAG,KAAK,CAAC;QAgG1B,0EAA0E;QAEzD,cAAS,GAAG,CAAC,KAAkC,EAAQ,EAAE;YACxE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;YAE3B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,WAAW;oBACd,gEAAgE;oBAChE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;wBAChB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;4BACvB,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE,IAAI,CAAC,KAAK;yBACM,CAAC,CAAC;oBAC7B,CAAC;oBACD,OAAO;gBAET,KAAK,QAAQ;oBACX,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC3B,sEAAsE;oBACtE,mEAAmE;oBACnE,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;wBAC/B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;wBAC3B,IAAI,CAAC,IAAI,CAAC,MAAM;4BAAE,KAAK,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBACxD,CAAC;oBACD,OAAO;gBAET,KAAK,MAAM;oBACT,IAAI,IAAI,CAAC,MAAM;wBAAE,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC1C,OAAO;gBAET,KAAK,OAAO;oBACV,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ;wBAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACvD,OAAO;YACX,CAAC;QACH,CAAC,CAAC;QA5HA,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;QACzD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QAEjD,IAAI,CAAC,QAAQ,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACxF,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,wBAAwB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEzD,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC/C,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,GAAG,IAAA,6BAAW,EAAC,IAAI,CAAC,MAAM,EAAE;YACvC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE;SAC1C,CAAC,CAAC;QAEH,2EAA2E;QAC3E,uEAAuE;QACvE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAA0B,CAAC,CAAC;IAC1E,CAAC;IAED,kDAAkD;IAClD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,0EAA0E;IAElE,KAAK,CAAC,gBAAgB;QAC5B,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEzB,0EAA0E;QAC1E,wEAAwE;QACxE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAClC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,KAAK,EAA0B,CAAC,CAAC;QAE1F,sEAAsE;QACtE,gEAAgE;QAChE,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEO,cAAc;QACpB,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAErB,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC;YACnC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEzB,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CACtC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAc,CAAC,EACvC,CAAC,GAAY,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CACnF,CAAC;gBACF,SAAS;YACX,CAAC;YAED,IAAI,CAAC,MAAM,CACT,IAAI,KAAK,CACP,8CAA8C,IAAI,CAAC,EAAE,WAAW;gBAC9D,gEAAgE;gBAChE,8DAA8D;gBAC9D,2BAA2B,CAC9B,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,yEAAyE;IACjE,KAAK,CAAC,uBAAuB;QACnC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;YACtE,6DAA6D;QAC/D,CAAC;IACH,CAAC;IAsCD,8DAA8D;IACtD,KAAK,CAAC,KAAK,CAAC,OAAoB;QACtC,IAAI,KAAmB,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/D,KAAK,GAAG;gBACN,IAAI,EAAE,OAAO;gBACb,EAAE,EAAE,OAAO,CAAC,IAAI;gBAChB,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,MAAM,IAAI,IAAI;aACvB,CAAC;YAEF,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC7B,+DAA+D;gBAC/D,qDAAqD;gBACrD,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG;gBACN,IAAI,EAAE,OAAO;gBACb,EAAE,EAAE,OAAO,CAAC,IAAI;gBAChB,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,EAAE,EAAE,KAAK;gBACT,qEAAqE;gBACrE,2DAA2D;gBAC3D,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAEO,MAAM,CAAC,OAAqB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,mDAAmD;QAEtE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzB,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAe,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,oCAAoC,CAAC,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,EAAY,EAAE,IAAe;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,EAAE,GAAI,MAA2E,CAAC,EAAE,CAAC,CAAC;QAC5F,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,0EAA0E;IAE1E,mEAAmE;IAC3D,KAAK,CAAC,IAAI,CAAI,EAAY,EAAE,GAAG,IAAe;QACpD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAM,CAAC;QAChD,CAAC;QAED,qEAAqE;QACrE,sEAAsE;QACtE,MAAM,IAAI,CAAC,WAAW,CAAC;QAEvB,uEAAuE;QACvE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAM,CAAC;QAChD,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAE7B,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CACJ,IAAI,KAAK,CACP,6BAA6B,IAAI,CAAC,MAAM,mBAAmB;oBACzD,IAAI,EAAE,YAAY,IAAI,CAAC,SAAS,IAAI,CACvC,CACF,CAAC;YACJ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAEnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;gBACnB,EAAE;gBACF,IAAI;gBACJ,OAAO,EAAE,OAAiC;gBAC1C,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;gBACvB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,EAAE;gBACF,EAAE;gBACF,IAAI;aACmB,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAE1E,KAAK,CAAC,IAAI;QACR,0EAA0E;QAC1E,2EAA2E;QAC3E,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,cAAc,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,IAAI,CAAe,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,cAAc,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,IAAI,CAAe,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,cAAc,CAAC,QAAsB;QACnC,wEAAwE;QACxE,iEAAiE;QACjE,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAO,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,CACL,QAAsB,EACtB,QAAsB,EACtB,GAAW,EACX,SAAsB,EAAE;QAExB,OAAO,IAAI,CAAC,IAAI,CAAS,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CACH,QAAsB,EACtB,QAAsB,EACtB,GAAW,EACX,SAAsB,EAAE,EACxB,UAAmB,QAAQ,EAC3B,WAAW,GAAG,KAAK;QAEnB,yEAAyE;QACzE,2EAA2E;QAC3E,yEAAyE;QACzE,wEAAwE;QACxE,mEAAmE;QACnE,OAAO,IAAI,CAAC,IAAI,CACd,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,GAAG,EACH,MAAM,EACN,OAAO,EACP,WAAW,CACZ,CAAC;IACJ,CAAC;IAED,QAAQ,CACN,QAAsB,EACtB,QAAsB,EACtB,GAAW;QAEX,OAAO,IAAI,CAAC,IAAI,CAAmB,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC1E,CAAC;IAED,gBAAgB,CACd,QAAsB,EACtB,UAA8B,EAAE;QAEhC,OAAO,IAAI,CAAC,IAAI,CAAe,kBAAkB,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,CAAC,QAAsB;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,QAAQ,CAAC,QAAsB;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAO,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAY;QAChB,OAAO,IAAI,CAAC,IAAI,CAAO,OAAO,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,IAAI,CAAU,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,IAAI,CAAa,UAAU,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,IAAgB;QACtC,OAAO,IAAI,CAAC,IAAI,CAAO,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,IAAI,CAAO,QAAQ,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,eAAe,CAAC,QAAsB,EAAE,KAAe;QACrD,OAAO,IAAI,CAAC,IAAI,CAAS,iBAAiB,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/D,CAAC;IAED,UAAU,CAAC,YAAoB;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAyB,YAAY,EAAE,YAAY,CAAC,CAAC;IACvE,CAAC;IAED,YAAY,CAAC,YAAoB;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAO,cAAc,EAAE,YAAY,CAAC,CAAC;IACvD,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,yEAAyE;QACzE,OAAO,IAAI,CAAC,IAAI,CAAS,WAAW,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAErB,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAErB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,yEAAyE;QACzE,mEAAmE;QACnE,MAAM,MAAM,EAAE,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC/B,CAAC;CACF;AAnZD,sDAmZC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * statement-types.ts – names for Firebird's statement-type codes.
3
+ *
4
+ * The engine reports what a statement *is* as one of the `isc_info_sql_stmt_*`
5
+ * constants. A caller asking `describeQuery()` what they have wants the name,
6
+ * not the number — the number is only meaningful next to a copy of
7
+ * `iberror.h`.
8
+ */
9
+ import type { StatementKind } from '../types';
10
+ /**
11
+ * Name a statement-type code.
12
+ *
13
+ * An unrecognised code is `'UNKNOWN'` rather than an error: a Firebird release
14
+ * may add one, and a name this library has not learned yet is no reason to
15
+ * fail a description that is otherwise complete.
16
+ */
17
+ export declare function statementKind(code: number): StatementKind;
18
+ //# sourceMappingURL=statement-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statement-types.d.ts","sourceRoot":"","sources":["../../src/browser/statement-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAoB9C;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAEzD"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ /**
3
+ * statement-types.ts – names for Firebird's statement-type codes.
4
+ *
5
+ * The engine reports what a statement *is* as one of the `isc_info_sql_stmt_*`
6
+ * constants. A caller asking `describeQuery()` what they have wants the name,
7
+ * not the number — the number is only meaningful next to a copy of
8
+ * `iberror.h`.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.statementKind = statementKind;
12
+ // From firebird/impl/consts_pub.h (isc_info_sql_stmt_*).
13
+ const NAMES = {
14
+ 1: 'SELECT',
15
+ 2: 'INSERT',
16
+ 3: 'UPDATE',
17
+ 4: 'DELETE',
18
+ 5: 'DDL',
19
+ 6: 'GET_SEGMENT',
20
+ 7: 'PUT_SEGMENT',
21
+ 8: 'EXEC_PROCEDURE',
22
+ 9: 'START_TRANS',
23
+ 10: 'COMMIT',
24
+ 11: 'ROLLBACK',
25
+ 12: 'SELECT_FOR_UPD',
26
+ 13: 'SET_GENERATOR',
27
+ 14: 'SAVEPOINT',
28
+ };
29
+ /**
30
+ * Name a statement-type code.
31
+ *
32
+ * An unrecognised code is `'UNKNOWN'` rather than an error: a Firebird release
33
+ * may add one, and a name this library has not learned yet is no reason to
34
+ * fail a description that is otherwise complete.
35
+ */
36
+ function statementKind(code) {
37
+ return NAMES[code] ?? 'UNKNOWN';
38
+ }
39
+ //# sourceMappingURL=statement-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statement-types.js","sourceRoot":"","sources":["../../src/browser/statement-types.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AA6BH,sCAEC;AA3BD,yDAAyD;AACzD,MAAM,KAAK,GAAkC;IAC3C,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,gBAAgB;IACnB,CAAC,EAAE,aAAa;IAChB,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,eAAe;IACnB,EAAE,EAAE,WAAW;CAChB,CAAC;AAEF;;;;;;GAMG;AACH,SAAgB,aAAa,CAAC,IAAY;IACxC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;AAClC,CAAC"}