@delali/sirannon-db 0.1.6 → 0.1.8

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 (54) hide show
  1. package/README.md +154 -19
  2. package/dist/backup-scheduler/index.d.ts +18 -3
  3. package/dist/backup-scheduler/index.mjs +2 -2
  4. package/dist/{change-tracker-CFTQ9TSn.d.ts → change-tracker-CbmaMO-N.d.ts} +12 -2
  5. package/dist/chunk-4ISB7XMA.mjs +21 -0
  6. package/dist/chunk-BNUTBHHH.mjs +22 -0
  7. package/dist/chunk-CJLYFDP5.mjs +26 -0
  8. package/dist/chunk-CW6S3WL5.mjs +222 -0
  9. package/dist/chunk-DVWQD3GF.mjs +49 -0
  10. package/dist/chunk-GEZUUIKV.mjs +268 -0
  11. package/dist/{chunk-UVMVN3OT.mjs → chunk-H5AB6NIR.mjs} +1 -1
  12. package/dist/{chunk-UTO3ZAFS.mjs → chunk-HHRMRFFR.mjs} +148 -28
  13. package/dist/chunk-TKGHYWQ6.mjs +35 -0
  14. package/dist/chunk-UXLAO6ZH.mjs +352 -0
  15. package/dist/chunk-VLTICJOD.mjs +470 -0
  16. package/dist/{chunk-O7BHI3CF.mjs → chunk-YPYVQJ4C.mjs} +15 -1
  17. package/dist/client/index.d.ts +107 -15
  18. package/dist/client/index.mjs +348 -37
  19. package/dist/core/index.d.ts +70 -13
  20. package/dist/core/index.mjs +635 -192
  21. package/dist/core/writer-worker.d.ts +2 -0
  22. package/dist/core/writer-worker.mjs +129 -0
  23. package/dist/{database-BVY1GqE7.d.ts → database-DuGp0Rtr.d.ts} +51 -19
  24. package/dist/driver/better-sqlite3.d.ts +1 -1
  25. package/dist/driver/better-sqlite3.mjs +44 -6
  26. package/dist/driver/bun.mjs +35 -6
  27. package/dist/driver/expo.mjs +2 -2
  28. package/dist/driver/node.d.ts +1 -1
  29. package/dist/driver/node.mjs +48 -5
  30. package/dist/driver/wa-sqlite.d.ts +109 -0
  31. package/dist/driver/wa-sqlite.mjs +30 -2
  32. package/dist/{errors-C00ed08Q.d.ts → errors-5Nf5ZAEC.d.ts} +19 -1
  33. package/dist/file-migrations/index.d.ts +2 -3
  34. package/dist/file-migrations/index.mjs +1 -1
  35. package/dist/replication/coordinator/etcd.mjs +2 -2
  36. package/dist/replication/index.d.ts +7 -8
  37. package/dist/replication/index.mjs +79 -78
  38. package/dist/server/index.d.ts +111 -28
  39. package/dist/server/index.mjs +1016 -384
  40. package/dist/{sirannon-Cd-lK6T0.d.ts → sirannon-4SspRvP5.d.ts} +3 -3
  41. package/dist/transport/grpc.d.ts +3 -4
  42. package/dist/transport/grpc.mjs +2 -2
  43. package/dist/{types-Lc7ywFx7.d.ts → types-BsjobKbl.d.ts} +2 -2
  44. package/dist/{types-BeozgNPr.d.ts → types-D4p4UyDK.d.ts} +1 -1
  45. package/dist/types-D_hQW1hr.d.ts +494 -0
  46. package/package.json +3 -23
  47. package/dist/chunk-3MCMONVP.mjs +0 -115
  48. package/dist/chunk-74UN4DIE.mjs +0 -14
  49. package/dist/chunk-FB2U2Q3Y.mjs +0 -21
  50. package/dist/chunk-GS7T5YMI.mjs +0 -51
  51. package/dist/chunk-PXKAKK2V.mjs +0 -124
  52. package/dist/index-CLdNrcPz.d.ts +0 -16
  53. package/dist/types-BFSsG77t.d.ts +0 -29
  54. package/dist/types-D-74JiXb.d.ts +0 -265
@@ -0,0 +1,222 @@
1
+ import { assertSqlAllowed, encodeWireRowsInPlace } from './chunk-GEZUUIKV.mjs';
2
+ import { SirannonError, QueryError } from './chunk-YPYVQJ4C.mjs';
3
+
4
+ // src/core/query-executor.ts
5
+ var STATEMENT_CACHE_CAPACITY = 128;
6
+ var statementCaches = /* @__PURE__ */ new WeakMap();
7
+ async function getStatement(conn, sql) {
8
+ let cache = statementCaches.get(conn);
9
+ if (!cache) {
10
+ cache = /* @__PURE__ */ new Map();
11
+ statementCaches.set(conn, cache);
12
+ }
13
+ const cached = cache.get(sql);
14
+ if (cached) {
15
+ cache.delete(sql);
16
+ cache.set(sql, cached);
17
+ return cached;
18
+ }
19
+ const pending = conn.prepare(sql);
20
+ cache.set(sql, pending);
21
+ if (cache.size > STATEMENT_CACHE_CAPACITY) {
22
+ const oldest = cache.keys().next().value;
23
+ if (oldest !== void 0) {
24
+ cache.delete(oldest);
25
+ }
26
+ }
27
+ try {
28
+ return await pending;
29
+ } catch (err) {
30
+ cache.delete(sql);
31
+ throw err;
32
+ }
33
+ }
34
+ function bindParams(params) {
35
+ if (params === void 0) return [];
36
+ if (Array.isArray(params)) return params;
37
+ return [params];
38
+ }
39
+ function asQueryError(err, sql) {
40
+ if (err instanceof SirannonError) return err;
41
+ return new QueryError(err instanceof Error ? err.message : String(err), sql);
42
+ }
43
+ async function query(conn, sql, params) {
44
+ assertSqlAllowed(sql);
45
+ try {
46
+ const stmt = await getStatement(conn, sql);
47
+ return await stmt.all(...bindParams(params));
48
+ } catch (err) {
49
+ throw asQueryError(err, sql);
50
+ }
51
+ }
52
+ async function queryForWire(conn, sql, params) {
53
+ assertSqlAllowed(sql);
54
+ try {
55
+ const stmt = await getStatement(conn, sql);
56
+ const bound = bindParams(params);
57
+ const rows = stmt.allRaw ? await stmt.allRaw(...bound) : await stmt.all(...bound);
58
+ return encodeWireRowsInPlace(rows);
59
+ } catch (err) {
60
+ throw asQueryError(err, sql);
61
+ }
62
+ }
63
+ async function queryOne(conn, sql, params) {
64
+ assertSqlAllowed(sql);
65
+ try {
66
+ const stmt = await getStatement(conn, sql);
67
+ return await stmt.get(...bindParams(params));
68
+ } catch (err) {
69
+ throw asQueryError(err, sql);
70
+ }
71
+ }
72
+ async function execute(conn, sql, params) {
73
+ assertSqlAllowed(sql);
74
+ try {
75
+ const stmt = await getStatement(conn, sql);
76
+ const result = await stmt.run(...bindParams(params));
77
+ return {
78
+ changes: result.changes,
79
+ lastInsertRowId: result.lastInsertRowId
80
+ };
81
+ } catch (err) {
82
+ throw asQueryError(err, sql);
83
+ }
84
+ }
85
+ async function executeGroup(conn, units) {
86
+ const outcomes = new Array(units.length);
87
+ try {
88
+ await conn.exec("BEGIN");
89
+ for (let i = 0; i < units.length; i++) {
90
+ outcomes[i] = { ok: true, values: await runUnit(conn, units[i]) };
91
+ }
92
+ } catch {
93
+ await rollbackQuietly(conn);
94
+ return executeGroupIsolated(conn, units);
95
+ }
96
+ const failure = await execControl(conn, "COMMIT");
97
+ if (!failure) return outcomes;
98
+ await rollbackQuietly(conn);
99
+ return outcomes.map(() => ({ ok: false, error: failure }));
100
+ }
101
+ async function runUnit(conn, unit) {
102
+ const values = new Array(unit.statements.length);
103
+ for (let i = 0; i < unit.statements.length; i++) {
104
+ const statement = unit.statements[i];
105
+ values[i] = await execute(conn, statement.sql, statement.params);
106
+ }
107
+ return values;
108
+ }
109
+ function controlError(err, sql) {
110
+ return asQueryError(err, sql);
111
+ }
112
+ async function execControl(conn, sql) {
113
+ try {
114
+ await conn.exec(sql);
115
+ return null;
116
+ } catch (err) {
117
+ return controlError(err, sql);
118
+ }
119
+ }
120
+ async function rollbackQuietly(conn) {
121
+ try {
122
+ await conn.exec("ROLLBACK");
123
+ } catch {
124
+ }
125
+ }
126
+ async function executeGroupIsolated(conn, units) {
127
+ const outcomes = new Array(units.length);
128
+ await conn.exec("BEGIN");
129
+ for (let i = 0; i < units.length; i++) {
130
+ const attempt = await runIsolatedUnit(conn, units[i], `sirannon_gc_${i}`);
131
+ outcomes[i] = attempt.outcome;
132
+ if (!attempt.contained) return rerunSurvivorsAlone(conn, units, outcomes, i);
133
+ }
134
+ const failure = await execControl(conn, "COMMIT");
135
+ if (!failure) return outcomes;
136
+ await rollbackQuietly(conn);
137
+ return outcomes.map((outcome) => outcome.ok ? { ok: false, error: failure } : outcome);
138
+ }
139
+ async function runIsolatedUnit(conn, unit, savepoint) {
140
+ const notOpened = await execControl(conn, `SAVEPOINT ${savepoint}`);
141
+ if (notOpened) return { outcome: { ok: false, error: notOpened }, contained: false };
142
+ let values;
143
+ try {
144
+ values = await runUnit(conn, unit);
145
+ } catch (err) {
146
+ return { outcome: { ok: false, error: err }, contained: await unwind(conn, savepoint) };
147
+ }
148
+ const notReleased = await execControl(conn, `RELEASE ${savepoint}`);
149
+ if (notReleased) return { outcome: { ok: false, error: notReleased }, contained: false };
150
+ return { outcome: { ok: true, values }, contained: true };
151
+ }
152
+ async function unwind(conn, savepoint) {
153
+ if (await execControl(conn, `ROLLBACK TO ${savepoint}`)) return false;
154
+ return await execControl(conn, `RELEASE ${savepoint}`) === null;
155
+ }
156
+ async function rerunSurvivorsAlone(conn, units, outcomes, failed) {
157
+ await rollbackQuietly(conn);
158
+ for (let i = 0; i < units.length; i++) {
159
+ if (i === failed) continue;
160
+ outcomes[i] = await runUnitAlone(conn, units[i]);
161
+ }
162
+ return outcomes;
163
+ }
164
+ async function runUnitAlone(conn, unit) {
165
+ const notBegun = await execControl(conn, "BEGIN");
166
+ if (notBegun) return { ok: false, error: notBegun };
167
+ let values;
168
+ try {
169
+ values = await runUnit(conn, unit);
170
+ } catch (err) {
171
+ await rollbackQuietly(conn);
172
+ return { ok: false, error: err };
173
+ }
174
+ const notCommitted = await execControl(conn, "COMMIT");
175
+ if (!notCommitted) return { ok: true, values };
176
+ await rollbackQuietly(conn);
177
+ return { ok: false, error: notCommitted };
178
+ }
179
+ async function forEachBatchRow(conn, sql, paramsBatch, sink) {
180
+ assertSqlAllowed(sql);
181
+ try {
182
+ const stmt = await getStatement(conn, sql);
183
+ for (const params of paramsBatch) {
184
+ const result = await stmt.run(...bindParams(params));
185
+ sink(result.changes, result.lastInsertRowId);
186
+ }
187
+ } catch (err) {
188
+ throw asQueryError(err, sql);
189
+ }
190
+ }
191
+ async function executeBatch(conn, sql, paramsBatch) {
192
+ if (conn.runBatch) {
193
+ assertSqlAllowed(sql);
194
+ try {
195
+ return await conn.runBatch(sql, paramsBatch.map(bindParams));
196
+ } catch (err) {
197
+ throw asQueryError(err, sql);
198
+ }
199
+ }
200
+ const results = [];
201
+ await forEachBatchRow(conn, sql, paramsBatch, (changes, lastInsertRowId) => {
202
+ results.push({ changes, lastInsertRowId });
203
+ });
204
+ return results;
205
+ }
206
+ async function executeBatchSummary(conn, sql, paramsBatch) {
207
+ if (conn.runBatchSummary) {
208
+ assertSqlAllowed(sql);
209
+ try {
210
+ return await conn.runBatchSummary(sql, paramsBatch.map(bindParams));
211
+ } catch (err) {
212
+ throw asQueryError(err, sql);
213
+ }
214
+ }
215
+ let changes = 0;
216
+ await forEachBatchRow(conn, sql, paramsBatch, (rowChanges) => {
217
+ changes += rowChanges;
218
+ });
219
+ return { rowsLoaded: paramsBatch.length, changes };
220
+ }
221
+
222
+ export { bindParams, execute, executeBatch, executeBatchSummary, executeGroup, query, queryForWire, queryOne };
@@ -0,0 +1,49 @@
1
+ // src/core/errors.ts
2
+ var SirannonError = class extends Error {
3
+ constructor(message, code) {
4
+ super(message);
5
+ this.code = code;
6
+ this.name = "SirannonError";
7
+ }
8
+ };
9
+
10
+ // src/core/driver/define.ts
11
+ function defineDriver(config) {
12
+ if (!config.capabilities || typeof config.open !== "function") {
13
+ throw new SirannonError("Driver must define capabilities and open()", "INVALID_DRIVER");
14
+ }
15
+ if (config.worker !== void 0 && typeof config.worker.specifier !== "string") {
16
+ throw new SirannonError("Driver worker entry must define a string specifier", "INVALID_DRIVER");
17
+ }
18
+ return Object.freeze({
19
+ capabilities: Object.freeze({ ...config.capabilities }),
20
+ open: config.open,
21
+ ...config.worker ? { worker: Object.freeze({ ...config.worker }) } : {},
22
+ ...config.startWriterHost ? { startWriterHost: config.startWriterHost } : {},
23
+ ...config.createWriterContext ? { createWriterContext: config.createWriterContext } : {},
24
+ ...config.createBackupEngine ? { createBackupEngine: config.createBackupEngine } : {},
25
+ ...config.resolveExtensionPath ? { resolveExtensionPath: config.resolveExtensionPath } : {}
26
+ });
27
+ }
28
+
29
+ // src/core/driver/synchronous.ts
30
+ var DEFAULT_SYNCHRONOUS = "normal";
31
+ var SYNCHRONOUS_PRAGMA_VALUES = {
32
+ off: "OFF",
33
+ normal: "NORMAL",
34
+ full: "FULL",
35
+ extra: "EXTRA"
36
+ };
37
+ function synchronousPragmaValue(level) {
38
+ const resolved = level ?? DEFAULT_SYNCHRONOUS;
39
+ const value = SYNCHRONOUS_PRAGMA_VALUES[resolved];
40
+ if (value === void 0) {
41
+ throw new SirannonError(
42
+ `Invalid synchronous level '${String(resolved)}': expected 'off', 'normal', 'full', or 'extra'`,
43
+ "INVALID_SYNCHRONOUS"
44
+ );
45
+ }
46
+ return value;
47
+ }
48
+
49
+ export { defineDriver, synchronousPragmaValue };
@@ -0,0 +1,268 @@
1
+ import { ForbiddenSqlError } from './chunk-YPYVQJ4C.mjs';
2
+
3
+ // src/core/internal-tables.ts
4
+ var INTERNAL_TABLE_PREFIX = "_sirannon_";
5
+ var CHANGES_TABLE = "_sirannon_changes";
6
+ var META_TABLE = "_sirannon_meta";
7
+ var MIGRATIONS_TABLE = "_sirannon_migrations";
8
+ var PEER_STATE_TABLE = "_sirannon_peer_state";
9
+ var APPLIED_CHANGES_TABLE = "_sirannon_applied_changes";
10
+ var COLUMN_VERSIONS_TABLE = "_sirannon_column_versions";
11
+ var SYNC_STATE_TABLE = "_sirannon_sync_state";
12
+ var CDC_TRIGGER_PREFIX = "_sirannon_trg_";
13
+ var SIRANNON_PREFIX = "_sirannon";
14
+ var SQLITE_PREFIX = "sqlite_";
15
+ var SIRANNON_MESSAGE = "Access to internal tables is not permitted: identifiers beginning with '_sirannon' are reserved";
16
+ var SQLITE_WRITE_MESSAGE = "The SQLite schema catalogue is read-only: statements that modify a 'sqlite_' identifier are not permitted";
17
+ var ATTACH_MESSAGE = "ATTACH and DETACH statements are not permitted";
18
+ var WRITABLE_SCHEMA_MESSAGE = "PRAGMA writable_schema is not permitted";
19
+ var WRITE_VERBS = /* @__PURE__ */ new Set(["insert", "update", "delete", "replace", "create", "alter", "drop", "vacuum", "reindex"]);
20
+ function reservedKind(name) {
21
+ const lower = name.toLowerCase();
22
+ if (lower.startsWith(SIRANNON_PREFIX)) return "sirannon";
23
+ if (lower.startsWith(SQLITE_PREFIX)) return "sqlite";
24
+ return null;
25
+ }
26
+ function isReservedIdentifier(name) {
27
+ return reservedKind(name) !== null;
28
+ }
29
+ function reservedSqlError(sql) {
30
+ const lower = sql.toLowerCase();
31
+ if (!lower.includes("_sirannon") && !lower.includes("sqlite_") && !lower.includes("attach") && !lower.includes("detach") && !lower.includes("writable_schema")) {
32
+ return null;
33
+ }
34
+ return scan(sql);
35
+ }
36
+ function assertSqlAllowed(sql) {
37
+ const reason = reservedSqlError(sql);
38
+ if (reason) {
39
+ throw new ForbiddenSqlError(reason);
40
+ }
41
+ }
42
+ function isWordStart(c) {
43
+ return c >= "a" && c <= "z" || c >= "A" && c <= "Z" || c === "_";
44
+ }
45
+ function isWordPart(c) {
46
+ return isWordStart(c) || c >= "0" && c <= "9" || c === "$";
47
+ }
48
+ function referenceError(kind, verb) {
49
+ if (kind === "sirannon") return SIRANNON_MESSAGE;
50
+ if (kind === "sqlite" && WRITE_VERBS.has(verb)) return SQLITE_WRITE_MESSAGE;
51
+ return null;
52
+ }
53
+ function scan(sql) {
54
+ const n = sql.length;
55
+ let i = 0;
56
+ let statementStart = true;
57
+ let verb = "";
58
+ while (i < n) {
59
+ const c = sql[i];
60
+ if (c === " " || c === " " || c === "\n" || c === "\r" || c === "\f" || c === "\v") {
61
+ i++;
62
+ continue;
63
+ }
64
+ if (c === "-" && sql[i + 1] === "-") {
65
+ i += 2;
66
+ while (i < n && sql[i] !== "\n") i++;
67
+ continue;
68
+ }
69
+ if (c === "/" && sql[i + 1] === "*") {
70
+ i += 2;
71
+ while (i < n && !(sql[i] === "*" && sql[i + 1] === "/")) i++;
72
+ i += 2;
73
+ continue;
74
+ }
75
+ if (c === "'") {
76
+ i = skipQuoted(sql, i, "'");
77
+ statementStart = false;
78
+ continue;
79
+ }
80
+ if (c === '"' || c === "`") {
81
+ const delimited = readDelimited(sql, i, c);
82
+ const error = referenceError(reservedKind(delimited.value), verb);
83
+ if (error) return error;
84
+ i = delimited.next;
85
+ statementStart = false;
86
+ continue;
87
+ }
88
+ if (c === "[") {
89
+ const end = sql.indexOf("]", i + 1);
90
+ const stop = end === -1 ? n : end;
91
+ const error = referenceError(reservedKind(sql.slice(i + 1, stop)), verb);
92
+ if (error) return error;
93
+ i = stop + 1;
94
+ statementStart = false;
95
+ continue;
96
+ }
97
+ if (c === ";") {
98
+ i++;
99
+ statementStart = true;
100
+ verb = "";
101
+ continue;
102
+ }
103
+ if (isWordStart(c)) {
104
+ let j = i + 1;
105
+ while (j < n && isWordPart(sql[j])) j++;
106
+ const word = sql.slice(i, j);
107
+ const lowerWord = word.toLowerCase();
108
+ if (statementStart) {
109
+ verb = lowerWord;
110
+ if (lowerWord === "attach" || lowerWord === "detach") return ATTACH_MESSAGE;
111
+ } else if (verb === "pragma" && lowerWord === "writable_schema") {
112
+ return WRITABLE_SCHEMA_MESSAGE;
113
+ }
114
+ const error = referenceError(reservedKind(word), verb);
115
+ if (error) return error;
116
+ i = j;
117
+ statementStart = false;
118
+ continue;
119
+ }
120
+ i++;
121
+ statementStart = false;
122
+ }
123
+ return null;
124
+ }
125
+ function skipQuoted(sql, start, quote) {
126
+ const n = sql.length;
127
+ let i = start + 1;
128
+ while (i < n) {
129
+ if (sql[i] === quote) {
130
+ if (sql[i + 1] === quote) {
131
+ i += 2;
132
+ continue;
133
+ }
134
+ return i + 1;
135
+ }
136
+ i++;
137
+ }
138
+ return n;
139
+ }
140
+ function readDelimited(sql, start, quote) {
141
+ const n = sql.length;
142
+ let i = start + 1;
143
+ let value = "";
144
+ while (i < n) {
145
+ if (sql[i] === quote) {
146
+ if (sql[i + 1] === quote) {
147
+ value += quote;
148
+ i += 2;
149
+ continue;
150
+ }
151
+ return { value, next: i + 1 };
152
+ }
153
+ value += sql[i];
154
+ i++;
155
+ }
156
+ return { value, next: n };
157
+ }
158
+
159
+ // src/core/cdc/encoding.ts
160
+ var BLOB_TAG = "__sirannon_blob";
161
+ var INT_TAG = "__sirannon_int";
162
+ var SAFE_INT_BOUND_TEXT = "9007199254740991";
163
+ var SAFE_INT_BOUND = 9007199254740991n;
164
+ var HEX_BYTES_RE = /^[0-9a-fA-F]*$/;
165
+ var INT_PAYLOAD_RE = /^-?\d{1,19}$/;
166
+ function encodeTaggedValues(value) {
167
+ if (typeof value === "bigint" || isBinaryValue(value)) {
168
+ return encodeTaggedLeaf(value);
169
+ }
170
+ if (value === null || typeof value !== "object") return value;
171
+ if (Array.isArray(value)) {
172
+ return value.map(encodeTaggedValues);
173
+ }
174
+ if (typeof value.toJSON === "function") {
175
+ return value;
176
+ }
177
+ const obj = value;
178
+ const out = {};
179
+ for (const k of Object.keys(obj)) {
180
+ out[k] = encodeTaggedValues(obj[k]);
181
+ }
182
+ return out;
183
+ }
184
+ function encodeTaggedLeaf(value) {
185
+ if (typeof value === "bigint") {
186
+ if (value >= -SAFE_INT_BOUND && value <= SAFE_INT_BOUND) {
187
+ return Number(value);
188
+ }
189
+ return { [INT_TAG]: value.toString() };
190
+ }
191
+ if (isBinaryValue(value)) {
192
+ return { [BLOB_TAG]: encodeHexBytes(value) };
193
+ }
194
+ return value;
195
+ }
196
+ function encodeWireRowsInPlace(rows) {
197
+ for (let i = 0; i < rows.length; i++) {
198
+ const row = rows[i];
199
+ if (row === null || typeof row !== "object") continue;
200
+ const obj = row;
201
+ for (const k of Object.keys(obj)) {
202
+ const cell = obj[k];
203
+ if (typeof cell === "bigint" || isBinaryValue(cell)) {
204
+ obj[k] = encodeTaggedLeaf(cell);
205
+ }
206
+ }
207
+ }
208
+ return rows;
209
+ }
210
+ function decodeTaggedValues(value) {
211
+ if (value === null || typeof value !== "object") return value;
212
+ if (isBinaryValue(value)) return value;
213
+ if (Array.isArray(value)) {
214
+ return value.map(decodeTaggedValues);
215
+ }
216
+ const obj = value;
217
+ const keys = Object.keys(obj);
218
+ if (keys.length === 1) {
219
+ const tag = keys[0];
220
+ const tagValue = obj[tag];
221
+ if (tag === BLOB_TAG && typeof tagValue === "string") {
222
+ return decodeHexBytes(tagValue);
223
+ }
224
+ if (tag === INT_TAG && typeof tagValue === "string") {
225
+ if (!INT_PAYLOAD_RE.test(tagValue)) {
226
+ throw new Error("Invalid tagged integer payload");
227
+ }
228
+ return BigInt(tagValue);
229
+ }
230
+ }
231
+ const out = {};
232
+ for (const k of keys) {
233
+ out[k] = decodeTaggedValues(obj[k]);
234
+ }
235
+ return out;
236
+ }
237
+ function isBinaryValue(value) {
238
+ return value instanceof Uint8Array || typeof Buffer !== "undefined" && Buffer.isBuffer(value);
239
+ }
240
+ function encodeHexBytes(bytes) {
241
+ if (typeof Buffer !== "undefined") {
242
+ return Buffer.from(bytes).toString("hex").toUpperCase();
243
+ }
244
+ let hex = "";
245
+ for (const byte of bytes) {
246
+ hex += byte.toString(16).padStart(2, "0");
247
+ }
248
+ return hex.toUpperCase();
249
+ }
250
+ function decodeHexBytes(hex) {
251
+ if (hex.length % 2 !== 0 || !HEX_BYTES_RE.test(hex)) {
252
+ throw new Error("Invalid CDC BLOB hex payload");
253
+ }
254
+ if (typeof Buffer !== "undefined") {
255
+ return Buffer.from(hex, "hex");
256
+ }
257
+ const bytes = new Uint8Array(hex.length / 2);
258
+ for (let i = 0; i < hex.length; i += 2) {
259
+ const byte = Number.parseInt(hex.slice(i, i + 2), 16);
260
+ if (Number.isNaN(byte)) {
261
+ throw new Error("Invalid CDC BLOB hex payload");
262
+ }
263
+ bytes[i / 2] = byte;
264
+ }
265
+ return bytes;
266
+ }
267
+
268
+ export { APPLIED_CHANGES_TABLE, CDC_TRIGGER_PREFIX, CHANGES_TABLE, COLUMN_VERSIONS_TABLE, INTERNAL_TABLE_PREFIX, META_TABLE, MIGRATIONS_TABLE, PEER_STATE_TABLE, SAFE_INT_BOUND_TEXT, SYNC_STATE_TABLE, assertSqlAllowed, decodeTaggedValues, encodeTaggedValues, encodeWireRowsInPlace, isReservedIdentifier };
@@ -1,4 +1,4 @@
1
- import { SirannonError } from './chunk-O7BHI3CF.mjs';
1
+ import { SirannonError } from './chunk-YPYVQJ4C.mjs';
2
2
 
3
3
  // src/replication/errors.ts
4
4
  var ReplicationError = class extends SirannonError {