firebird-wasm 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +125 -0
- package/README.md +30 -14
- package/dist/.tsbuildinfo.build +1 -1
- package/dist/browser/engine-transport.d.ts +2 -0
- package/dist/browser/engine-transport.d.ts.map +1 -1
- package/dist/browser/engine-transport.js +38 -3
- package/dist/browser/engine-transport.js.map +1 -1
- package/dist/browser/index.d.ts +1 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +2 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/params.d.ts +8 -2
- package/dist/browser/params.d.ts.map +1 -1
- package/dist/browser/params.js +14 -5
- package/dist/browser/params.js.map +1 -1
- package/dist/electric/index.d.ts +52 -2
- package/dist/electric/index.d.ts.map +1 -1
- package/dist/electric/index.js +266 -98
- package/dist/electric/index.js.map +1 -1
- package/dist/electric/serial.d.ts +20 -0
- package/dist/electric/serial.d.ts.map +1 -0
- package/dist/electric/serial.js +29 -0
- package/dist/electric/serial.js.map +1 -0
- package/dist/electric/values.d.ts.map +1 -1
- package/dist/electric/values.js +17 -3
- package/dist/electric/values.js.map +1 -1
- package/dist/electric/writes.d.ts +99 -0
- package/dist/electric/writes.d.ts.map +1 -0
- package/dist/electric/writes.js +282 -0
- package/dist/electric/writes.js.map +1 -0
- package/dist/electric-server/capture.d.ts +17 -2
- package/dist/electric-server/capture.d.ts.map +1 -1
- package/dist/electric-server/capture.js +100 -24
- package/dist/electric-server/capture.js.map +1 -1
- package/dist/electric-server/catalog.d.ts +3 -1
- package/dist/electric-server/catalog.d.ts.map +1 -1
- package/dist/electric-server/catalog.js +18 -3
- package/dist/electric-server/catalog.js.map +1 -1
- package/dist/electric-server/index.d.ts +30 -3
- package/dist/electric-server/index.d.ts.map +1 -1
- package/dist/electric-server/index.js +258 -78
- package/dist/electric-server/index.js.map +1 -1
- package/dist/electric-server/where.d.ts +30 -0
- package/dist/electric-server/where.d.ts.map +1 -0
- package/dist/electric-server/where.js +243 -0
- package/dist/electric-server/where.js.map +1 -0
- package/dist/firebird.d.ts.map +1 -1
- package/dist/firebird.js +10 -1
- package/dist/firebird.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/wasm/firebird-embedded-st.js +1 -1
- package/dist/wasm/firebird-embedded-st.wasm +0 -0
- package/dist/wasm/firebird-embedded.js +1 -1
- package/dist/wasm/firebird-embedded.wasm +0 -0
- package/dist/wasm-loader.d.ts +57 -7
- package/dist/wasm-loader.d.ts.map +1 -1
- package/dist/wasm-loader.js +106 -21
- package/dist/wasm-loader.js.map +1 -1
- package/package.json +1 -1
|
@@ -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
|
|
120
|
-
*
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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":";AAAA;;;;;;;GAOG;;;
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/electric-server/capture.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAoBH,kCAOC;AAgBD,wCAuDC;AAGD,oCAqBC;AAkBD,wCAqCC;AAOD,4BAiCC;AAtND,+DAA4D;AAE5D,uCAAkC;AAErB,QAAA,OAAO,GAAG,kBAAkB,CAAC;AAC7B,QAAA,IAAI,GAAG,eAAe,CAAC;AACpC,+DAA+D;AAClD,QAAA,MAAM,GAAG,iBAAiB,CAAC;AACxC,kFAAkF;AACrE,QAAA,YAAY,GAAG,kBAAkB,CAAC;AAC/C,MAAM,UAAU,GAAG,qBAAqB,CAAC;AACzC,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAEzC,iDAAiD;AACpC,QAAA,WAAW,GAAG,CAAC,CAAC;AAE7B,iFAAiF;AACjF,SAAgB,WAAW,CAAC,KAAa;IACvC,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;QAC3B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,YAAY,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,UAAsB,EAAE,EAAe,EAAE,GAAW,EAAE,IAAY;IACtF,+DAA+D;IAC/D,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACvD,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,cAAc,CAAC,UAAsB,EAAE,MAAmB;IAC9E,qEAAqE;IACrE,eAAe;IACf,MAAM,GAAG,GAAG,KAAK,EAAE,GAAW,EAAE,EAAE;QAChC,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAClC,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,KAAK,EAAE,GAAW,EAAE,IAAY,EAAE,EAAE;QAC9C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACjD,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,2DAA2D,CAAC;IAC9E,MAAM,QAAQ,GAAG,yDAAyD,CAAC;IAC3E,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAAE,MAAM,GAAG,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;IACpF,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAAE,MAAM,GAAG,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;IAEpF,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,eAAO,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,mBAAW,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChG,MAAM,GAAG,CACP,gBAAgB,eAAO,kEAAkE;YACvF,4EAA4E,IAAI,GAAG,CACtF,CAAC;QACF,MAAM,GAAG,CAAC,gBAAgB,eAAO,UAAU,eAAO,UAAU,CAAC,CAAC;QAC9D,MAAM,GAAG,CAAC,gBAAgB,eAAO,WAAW,eAAO,eAAe,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,YAAI,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,GAAG,CAAC,gBAAgB,YAAI,yEAAyE,CAAC,CAAC;QACzG,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACrF,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,eAAe,YAAI,qBAAqB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAChF,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;IACpB,CAAC;IACD,oDAAoD;IACpD,MAAM,MAAM,GAAG,gEAAgE,GAAG,YAAI,GAAG,2BAA2B,CAAC;IACrH,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,GAAG,CAAC,eAAe,YAAI,+CAA+C,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,cAAM,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,CAAC,gBAAgB,cAAM,0EAA0E,CAAC,CAAC;IAC9G,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,oDAAoD;AACpD,SAAgB,YAAY,CAAC,KAAgB;IAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,CAAC,GAAkB,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,IAAA,eAAK,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,GAAkB,EAAE,EAAE,CAC7C,eAAe,eAAO,uCAAuC,IAAI,IAAI;QACrE,kBAAkB,UAAU,+BAA+B,IAAI,OAAO,EAAE,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;IAChG,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,IAAA,eAAK,EAAC,CAAC,CAAC,yBAAyB,IAAA,eAAK,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzG,OAAO,CACL,2BAA2B,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAA,eAAK,EAAC,KAAK,CAAC,IAAI,CAAC,IAAI;QAC/E,6DAA6D;QAC7D,SAAS;QACT,yDAAyD;QACzD,oCAAoC,UAAU,YAAY,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI;QAC7E,yBAAyB,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI;QAC5C,wBAAwB,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI;QAC3C,0EAA0E;QAC1E,4DAA4D;QAC5D,iBAAiB,oBAAY,MAAM;QACnC,KAAK,CACN,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACI,KAAK,UAAU,cAAc,CAAC,UAAsB;IACzD,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,gBAAgB,CAAC;YAC3C,SAAS,EAAE,2CAAoB,CAAC,cAAc;YAC9C,iBAAiB,EAAE,gBAAgB;YACnC,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,YAAY,CAC3C,EAAE,EAAE,yBAAyB,eAAO,2BAA2B,CAAC,CAAC;YACnE,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC/D,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,YAAI,oBAAoB,CAAC,CAAC;YACnE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,sDAAsD;gBACtD,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC3C,IAAI,OAAO,IAAI,GAAG;oBAAE,MAAM,GAAG,CAAC;gBAC9B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBACnE,SAAS;YACX,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,EAAE,iBAAiB,UAAU,wBAAwB,CAAC,CAAC;YACnG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,eAAO,8CAA8C,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACnG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,eAAe,cAAM,yDAAyD,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAClH,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,QAAQ,CAAC,UAAsB,EAAE,MAAY;IACjE,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,gBAAgB,CAAC;YAC3C,SAAS,EAAE,2CAAoB,CAAC,cAAc;YAC9C,iBAAiB,EAAE,gBAAgB;YACnC,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;QACH,IAAI,CAAC;YACH,IAAI,CAAC;gBACH,sEAAsE;gBACtE,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,YAAI,oBAAoB,CAAC,CAAC;YACnE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC3C,IAAI,OAAO,IAAI,GAAG;oBAAE,MAAM,GAAG,CAAC;gBAC9B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBACnE,SAAS;YACX,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,YAAY,CACtC,EAAE,EAAE,+BAA+B,cAAM,uBAAuB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9E,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACxD,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,eAAe,eAAO,wBAAwB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;gBACxF,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,eAAe,cAAM,wBAAwB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;gBACvF,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,YAAI,kDAAkD,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACrH,CAAC;YACD,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -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;
|
|
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
|
-
|
|
57
|
-
|
|
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:
|
|
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":";AAAA;;;;GAIG;;
|
|
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
|
|
22
|
-
*
|
|
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
|
-
/**
|
|
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
|
|
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"}
|