@quereus/sync 4.3.2 → 4.4.1

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 (78) hide show
  1. package/README.md +19 -1
  2. package/dist/src/create-sync-module.d.ts +11 -1
  3. package/dist/src/create-sync-module.d.ts.map +1 -1
  4. package/dist/src/create-sync-module.js +2 -2
  5. package/dist/src/create-sync-module.js.map +1 -1
  6. package/dist/src/index.d.ts +4 -3
  7. package/dist/src/index.d.ts.map +1 -1
  8. package/dist/src/index.js +9 -3
  9. package/dist/src/index.js.map +1 -1
  10. package/dist/src/metadata/change-log.d.ts +39 -3
  11. package/dist/src/metadata/change-log.d.ts.map +1 -1
  12. package/dist/src/metadata/change-log.js +43 -8
  13. package/dist/src/metadata/change-log.js.map +1 -1
  14. package/dist/src/metadata/column-version.d.ts +62 -9
  15. package/dist/src/metadata/column-version.d.ts.map +1 -1
  16. package/dist/src/metadata/column-version.js +79 -25
  17. package/dist/src/metadata/column-version.js.map +1 -1
  18. package/dist/src/metadata/index.d.ts +1 -0
  19. package/dist/src/metadata/index.d.ts.map +1 -1
  20. package/dist/src/metadata/index.js +1 -0
  21. package/dist/src/metadata/index.js.map +1 -1
  22. package/dist/src/metadata/keys.d.ts +88 -22
  23. package/dist/src/metadata/keys.d.ts.map +1 -1
  24. package/dist/src/metadata/keys.js +134 -77
  25. package/dist/src/metadata/keys.js.map +1 -1
  26. package/dist/src/metadata/pk-identity.d.ts +60 -0
  27. package/dist/src/metadata/pk-identity.d.ts.map +1 -0
  28. package/dist/src/metadata/pk-identity.js +94 -0
  29. package/dist/src/metadata/pk-identity.js.map +1 -0
  30. package/dist/src/metadata/tombstones.d.ts +41 -11
  31. package/dist/src/metadata/tombstones.d.ts.map +1 -1
  32. package/dist/src/metadata/tombstones.js +58 -33
  33. package/dist/src/metadata/tombstones.js.map +1 -1
  34. package/dist/src/sync/change-applicator.d.ts +30 -1
  35. package/dist/src/sync/change-applicator.d.ts.map +1 -1
  36. package/dist/src/sync/change-applicator.js +161 -40
  37. package/dist/src/sync/change-applicator.js.map +1 -1
  38. package/dist/src/sync/maintenance.d.ts +70 -0
  39. package/dist/src/sync/maintenance.d.ts.map +1 -0
  40. package/dist/src/sync/maintenance.js +84 -0
  41. package/dist/src/sync/maintenance.js.map +1 -0
  42. package/dist/src/sync/protocol.d.ts +61 -10
  43. package/dist/src/sync/protocol.d.ts.map +1 -1
  44. package/dist/src/sync/protocol.js +15 -0
  45. package/dist/src/sync/protocol.js.map +1 -1
  46. package/dist/src/sync/snapshot-identity.d.ts +62 -0
  47. package/dist/src/sync/snapshot-identity.d.ts.map +1 -0
  48. package/dist/src/sync/snapshot-identity.js +88 -0
  49. package/dist/src/sync/snapshot-identity.js.map +1 -0
  50. package/dist/src/sync/snapshot-stream.d.ts +8 -1
  51. package/dist/src/sync/snapshot-stream.d.ts.map +1 -1
  52. package/dist/src/sync/snapshot-stream.js +166 -67
  53. package/dist/src/sync/snapshot-stream.js.map +1 -1
  54. package/dist/src/sync/snapshot.d.ts +1 -1
  55. package/dist/src/sync/snapshot.d.ts.map +1 -1
  56. package/dist/src/sync/snapshot.js +75 -44
  57. package/dist/src/sync/snapshot.js.map +1 -1
  58. package/dist/src/sync/staged-transaction-metadata.d.ts +75 -0
  59. package/dist/src/sync/staged-transaction-metadata.d.ts.map +1 -0
  60. package/dist/src/sync/staged-transaction-metadata.js +100 -0
  61. package/dist/src/sync/staged-transaction-metadata.js.map +1 -0
  62. package/dist/src/sync/store-adapter.d.ts +10 -4
  63. package/dist/src/sync/store-adapter.d.ts.map +1 -1
  64. package/dist/src/sync/store-adapter.js +244 -21
  65. package/dist/src/sync/store-adapter.js.map +1 -1
  66. package/dist/src/sync/sync-context.d.ts +54 -2
  67. package/dist/src/sync/sync-context.d.ts.map +1 -1
  68. package/dist/src/sync/sync-context.js +66 -0
  69. package/dist/src/sync/sync-context.js.map +1 -1
  70. package/dist/src/sync/sync-manager-impl.d.ts +70 -4
  71. package/dist/src/sync/sync-manager-impl.d.ts.map +1 -1
  72. package/dist/src/sync/sync-manager-impl.js +206 -36
  73. package/dist/src/sync/sync-manager-impl.js.map +1 -1
  74. package/dist/src/sync/wire.d.ts +47 -6
  75. package/dist/src/sync/wire.d.ts.map +1 -1
  76. package/dist/src/sync/wire.js +62 -11
  77. package/dist/src/sync/wire.js.map +1 -1
  78. package/package.json +6 -6
@@ -5,19 +5,23 @@
5
5
  * When merging changes, the column with the higher HLC wins.
6
6
  */
7
7
  import { serializeHLC, deserializeHLC, compareHLC, hlcToJson, hlcFromJson } from '../clock/hlc.js';
8
- import { buildColumnVersionKey, buildColumnVersionScanBounds } from './keys.js';
8
+ import { buildColumnVersionKey, buildColumnVersionRowPrefix, buildColumnVersionScanBounds, encodePkIdentity } from './keys.js';
9
9
  /**
10
10
  * Serialize a column version for storage.
11
- * Format: 30 bytes HLC + JSON payload `{ v, pv?, ph? }`.
11
+ * Format: 30 bytes HLC + JSON payload `{ v, k, pv?, ph? }`.
12
12
  *
13
13
  * Uint8Array values are encoded as `{"__bin":"<base64>"}` (bigint as
14
14
  * `{"__bigint":"..."}`) so they survive the JSON round-trip; the same encoding
15
- * covers the before-image (`pv`). The before-image fields are omitted entirely
16
- * when the version has no prior, keeping first-writes and snapshot cells compact.
15
+ * covers the pk cells and the before-image (`pv`). The before-image fields are
16
+ * omitted entirely when the version has no prior, keeping first-writes and
17
+ * snapshot cells compact.
17
18
  */
18
19
  export function serializeColumnVersion(cv) {
19
20
  const hlcBytes = serializeHLC(cv.hlc);
20
- const payload = { v: encodeSqlValue(cv.value) };
21
+ const payload = {
22
+ v: encodeSqlValue(cv.value),
23
+ k: cv.pk.map(encodeSqlValue),
24
+ };
21
25
  if (cv.priorHlc !== undefined) {
22
26
  payload.ph = hlcToJson(cv.priorHlc);
23
27
  payload.pv = encodeSqlValue(cv.priorValue ?? null);
@@ -35,7 +39,7 @@ export function serializeColumnVersion(cv) {
35
39
  export function deserializeColumnVersion(buffer) {
36
40
  const hlc = deserializeHLC(buffer.slice(0, 30));
37
41
  const payload = JSON.parse(new TextDecoder().decode(buffer.slice(30)));
38
- const cv = { hlc, value: decodeSqlValue(payload.v) };
42
+ const cv = { hlc, value: decodeSqlValue(payload.v), pk: payload.k.map(decodeSqlValue) };
39
43
  if (payload.ph !== undefined) {
40
44
  cv.priorHlc = hlcFromJson(payload.ph);
41
45
  cv.priorValue = decodeSqlValue(payload.pv);
@@ -100,17 +104,33 @@ export function decodeSqlValue(v) {
100
104
  }
101
105
  /**
102
106
  * Column version store operations.
107
+ *
108
+ * Every pk-taking method derives the record key's pk IDENTITY through the
109
+ * per-table {@link PkKeyingResolver} passed at construction, so callers keep
110
+ * addressing rows by raw pk while the storage keys collapse spellings.
103
111
  */
104
112
  export class ColumnVersionStore {
105
113
  kv;
106
- constructor(kv) {
114
+ keying;
115
+ constructor(kv, keying) {
107
116
  this.kv = kv;
117
+ this.keying = keying;
118
+ }
119
+ identity(schemaName, tableName, pk) {
120
+ return encodePkIdentity(pk, this.keying(schemaName, tableName));
108
121
  }
109
122
  /**
110
123
  * Get the version of a specific column.
111
124
  */
112
125
  async getColumnVersion(schemaName, tableName, pk, column) {
113
- const key = buildColumnVersionKey(schemaName, tableName, pk, column);
126
+ return this.getColumnVersionByIdentity(schemaName, tableName, this.identity(schemaName, tableName, pk), column);
127
+ }
128
+ /**
129
+ * Get the version of a specific column by pk IDENTITY (as recovered from a
130
+ * parsed `cv:`/`cl:` key — no raw pk needed).
131
+ */
132
+ async getColumnVersionByIdentity(schemaName, tableName, identity, column) {
133
+ const key = buildColumnVersionKey(schemaName, tableName, identity, column);
114
134
  const data = await this.kv.get(key);
115
135
  if (!data)
116
136
  return undefined;
@@ -120,41 +140,75 @@ export class ColumnVersionStore {
120
140
  * Set the version of a specific column.
121
141
  */
122
142
  async setColumnVersion(schemaName, tableName, pk, column, version) {
123
- const key = buildColumnVersionKey(schemaName, tableName, pk, column);
124
- await this.kv.put(key, serializeColumnVersion(version));
143
+ const key = buildColumnVersionKey(schemaName, tableName, this.identity(schemaName, tableName, pk), column);
144
+ await this.kv.put(key, serializeColumnVersion({ ...version, pk }));
125
145
  }
126
146
  /**
127
- * Set column version in a batch.
147
+ * Set column version in a batch. The key's pk IDENTITY is always derived
148
+ * locally through this store's keying resolver — there is deliberately no
149
+ * caller-supplied-identity variant (a snapshot receiver trusting a sender's
150
+ * identity was the bug fixed by deriving on ingress; see docs/sync.md
151
+ * § Row identity vs. address).
128
152
  */
129
153
  setColumnVersionBatch(batch, schemaName, tableName, pk, column, version) {
130
- const key = buildColumnVersionKey(schemaName, tableName, pk, column);
131
- batch.put(key, serializeColumnVersion(version));
154
+ const key = buildColumnVersionKey(schemaName, tableName, this.identity(schemaName, tableName, pk), column);
155
+ batch.put(key, serializeColumnVersion({ ...version, pk }));
132
156
  }
133
157
  /**
134
158
  * Get all column versions for a row.
135
159
  */
136
160
  async getRowVersions(schemaName, tableName, pk) {
137
- const bounds = buildColumnVersionScanBounds(schemaName, tableName, pk);
161
+ const identity = this.identity(schemaName, tableName, pk);
162
+ const bounds = buildColumnVersionScanBounds(schemaName, tableName, identity);
163
+ const prefix = buildColumnVersionRowPrefix(schemaName, tableName, identity);
164
+ const decoder = new TextDecoder();
138
165
  const versions = new Map();
139
166
  for await (const entry of this.kv.iterate(bounds)) {
140
- // Extract column name from key
141
- const keyStr = new TextDecoder().decode(entry.key);
142
- const lastColon = keyStr.lastIndexOf(':');
143
- const column = keyStr.slice(lastColon + 1);
167
+ // The scan bounds are exactly [prefix, prefix+1), so every key here starts
168
+ // with `prefix` and everything after it is the column name verbatim —
169
+ // including a name containing `:`, which a last-colon split would truncate.
170
+ const keyStr = decoder.decode(entry.key);
171
+ const column = keyStr.slice(prefix.length);
144
172
  versions.set(column, deserializeColumnVersion(entry.value));
145
173
  }
146
174
  return versions;
147
175
  }
148
176
  /**
149
- * Delete all column versions for a row.
177
+ * Queue deletion of ONE column's cell record into `batch`, whether or not a
178
+ * committed record exists — the caller may be removing a record that is only
179
+ * STAGED in this same batch (the local-capture delete cleanup; see
180
+ * `deleteRowVersionsAndLogEntries`).
150
181
  */
151
- async deleteRowVersions(schemaName, tableName, pk) {
152
- const bounds = buildColumnVersionScanBounds(schemaName, tableName, pk);
153
- const batch = this.kv.batch();
154
- for await (const entry of this.kv.iterate(bounds)) {
155
- batch.delete(entry.key);
182
+ deleteColumnVersionBatch(batch, schemaName, tableName, pk, column) {
183
+ batch.delete(buildColumnVersionKey(schemaName, tableName, this.identity(schemaName, tableName, pk), column));
184
+ }
185
+ /**
186
+ * Queue deletion of every column version of a row into `batch`, returning the
187
+ * versions that were removed (column → version). A column in `keepColumns` is
188
+ * skipped entirely — neither staged for deletion nor included in the returned
189
+ * map (its paired `cl:` entry must survive too; see
190
+ * `deleteRowVersionsAndLogEntries`).
191
+ *
192
+ * The returned map is what lets a caller drop the paired `cl:` change-log
193
+ * entries in the SAME batch — each entry's key embeds the version's HLC, which
194
+ * is only recoverable from the record being deleted.
195
+ *
196
+ * NOTE: this fully deserializes each cell (a JSON parse of the value) when the
197
+ * change-log caller only needs the 30-byte HLC prefix. If deleting wide rows or
198
+ * rows with large blob cells ever shows up as slow, read just the HLC prefix
199
+ * here instead of reusing `getRowVersions`.
200
+ */
201
+ async deleteRowVersionsBatch(batch, schemaName, tableName, pk, keepColumns) {
202
+ const identity = this.identity(schemaName, tableName, pk);
203
+ const versions = await this.getRowVersions(schemaName, tableName, pk);
204
+ for (const column of [...versions.keys()]) {
205
+ if (keepColumns?.has(column)) {
206
+ versions.delete(column);
207
+ continue;
208
+ }
209
+ batch.delete(buildColumnVersionKey(schemaName, tableName, identity, column));
156
210
  }
157
- await batch.write();
211
+ return versions;
158
212
  }
159
213
  /**
160
214
  * Check if a column write should be applied (LWW comparison).
@@ -1 +1 @@
1
- {"version":3,"file":"column-version.js","sourceRoot":"","sources":["../../../src/metadata/column-version.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"column-version.js","sourceRoot":"","sources":["../../../src/metadata/column-version.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  * Metadata module exports.
3
3
  */
4
4
  export * from './keys.js';
5
+ export * from './pk-identity.js';
5
6
  export * from './column-version.js';
6
7
  export * from './tombstones.js';
7
8
  export * from './peer-state.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/metadata/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/metadata/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
@@ -2,6 +2,7 @@
2
2
  * Metadata module exports.
3
3
  */
4
4
  export * from './keys.js';
5
+ export * from './pk-identity.js';
5
6
  export * from './column-version.js';
6
7
  export * from './tombstones.js';
7
8
  export * from './peer-state.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metadata/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metadata/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
@@ -13,6 +13,7 @@
13
13
  * cl: - Change log (HLC-indexed for efficient delta queries)
14
14
  * qt: - Quarantine (held out-of-basis straggler changes)
15
15
  * bl: - Basis-table lifecycle (mapped/derivation-source/unreferenced/detached bookkeeping)
16
+ * fv: - Sync-metadata format version (single record; see SYNC_METADATA_FORMAT_VERSION)
16
17
  */
17
18
  import type { SqlValue } from '@quereus/quereus';
18
19
  import { type SiteId } from '../clock/site.js';
@@ -30,26 +31,68 @@ export declare const SYNC_KEY_PREFIX: {
30
31
  readonly CHANGE_LOG: Uint8Array<ArrayBuffer>;
31
32
  readonly QUARANTINE: Uint8Array<ArrayBuffer>;
32
33
  readonly BASIS_LIFECYCLE: Uint8Array<ArrayBuffer>;
34
+ readonly FORMAT_VERSION: Uint8Array<ArrayBuffer>;
33
35
  };
34
36
  /**
35
- * Encode a primary key as a string for use in metadata keys.
36
- * Uses JSON for simplicity and determinism.
37
+ * Current sync-metadata storage format version, persisted under the `fv:` key.
38
+ *
39
+ * Version 2: per-row records (`cv:`/`tb:`/`cl:`) are keyed by the pk IDENTITY
40
+ * (collation- and semantic-transform-normalized, via {@link encodePkIdentity})
41
+ * and carry the raw pk in the record VALUE. Version-1 metadata (raw
42
+ * `JSON.stringify(pk)` keys, no pk in values) is unreadable under this layout;
43
+ * a replica whose stored version mismatches must re-bootstrap from a peer
44
+ * snapshot (see docs/sync.md § Metadata format version).
45
+ */
46
+ export declare const SYNC_METADATA_FORMAT_VERSION = 2;
47
+ /**
48
+ * Per-pk-column normalization for one table, resolved once from its schema
49
+ * (see `metadata/pk-identity.ts`). Mirrors the engine's row-identity rule:
50
+ * each pk column's KEY COLLATION normalizer plus its logical type's semantic
51
+ * key transform (TIMESPAN → total seconds), so two spellings of one row
52
+ * ('apple'/'APPLE' under nocase, 'PT1H'/'PT60M') produce ONE identity.
37
53
  */
38
- export declare function encodePK(pk: SqlValue[]): string;
54
+ export interface PkKeying {
55
+ readonly normalizers: ReadonlyArray<(s: string) => string>;
56
+ readonly transforms: ReadonlyArray<((v: SqlValue) => SqlValue) | undefined>;
57
+ }
39
58
  /**
40
- * Decode a primary key from its string representation.
59
+ * Keying that applies NO collation and NO semantic transform — raw value
60
+ * identity. Used where no table schema can exist: quarantine keys (out-of-basis
61
+ * by definition) and relay-only deployments with no schema oracle, where the
62
+ * raw identity is stable for the replica's whole life (an oracle can never
63
+ * appear later, so the identity can never flip).
41
64
  */
42
- export declare function decodePK(encoded: string): SqlValue[];
65
+ export declare const RAW_PK_KEYING: PkKeying;
66
+ /**
67
+ * Encode a primary key's IDENTITY — the string a row's sync bookkeeping is filed
68
+ * under. Built on the engine's type-tagged `serializeKeyNullGrouping`, so:
69
+ * - numerics share one tag (`5n` and `5` key alike — bigint-safe, unlike the
70
+ * former `JSON.stringify` encoding which threw on bigint);
71
+ * - string values run through the column's key-collation normalizer;
72
+ * - semantic-ordering types (TIMESPAN) run through their `groupKey` first.
73
+ *
74
+ * The result is LOSSY and never decoded back — the raw pk (the row's ADDRESS,
75
+ * what goes on the wire) lives in the record VALUE instead.
76
+ */
77
+ export declare function encodePkIdentity(pk: SqlValue[], keying: PkKeying): string;
78
+ /** Raw (no-collation, no-transform) pk identity — see {@link RAW_PK_KEYING}. */
79
+ export declare function encodeRawPkIdentity(pk: SqlValue[]): string;
43
80
  /**
44
81
  * Build a column version key.
45
- * Format: cv:{schema}.{table}:{pk_json}:{column}
82
+ * Format: cv:{schema}.{table}:{identity_length}:{identity}:{column}
83
+ *
84
+ * The identity is LENGTH-PREFIXED (code units of the decoded key string) because
85
+ * it freely contains `:` (type tags) and `\0` (member separator) — no separator
86
+ * character is guaranteed absent, so an explicit length is the only unambiguous
87
+ * split between identity and column.
46
88
  */
47
- export declare function buildColumnVersionKey(schemaName: string, tableName: string, pk: SqlValue[], column: string): Uint8Array;
89
+ export declare function buildColumnVersionKey(schemaName: string, tableName: string, identity: string, column: string): Uint8Array;
48
90
  /**
49
91
  * Build a tombstone key.
50
- * Format: tb:{schema}.{table}:{pk_json}
92
+ * Format: tb:{schema}.{table}:{identity}
93
+ * (No length prefix — the identity is the final component.)
51
94
  */
52
- export declare function buildTombstoneKey(schemaName: string, tableName: string, pk: SqlValue[]): Uint8Array;
95
+ export declare function buildTombstoneKey(schemaName: string, tableName: string, identity: string): Uint8Array;
53
96
  /**
54
97
  * Build a transaction record key.
55
98
  * Format: tx:{transactionId}
@@ -85,11 +128,21 @@ export declare function buildTableColumnVersionScanBounds(schemaName: string, ta
85
128
  gte: Uint8Array;
86
129
  lt: Uint8Array;
87
130
  };
131
+ /**
132
+ * The key prefix shared by every column version of one row:
133
+ * `cv:{schema}.{table}:{identity_length}:{identity}:`.
134
+ *
135
+ * Exported so a row scan can recover each entry's column name by stripping this
136
+ * exact prefix, rather than splitting the key at its last `:` — the column name
137
+ * is the only unbounded, separator-bearing component, so only the prefix is
138
+ * unambiguous (see {@link parseColumnVersionKey}, which has no pk to anchor on).
139
+ */
140
+ export declare function buildColumnVersionRowPrefix(schemaName: string, tableName: string, identity: string): string;
88
141
  /**
89
142
  * Build scan bounds for all column versions of a row.
90
- * Returns keys to scan cv:{schema}.{table}:{pk_json}:*
143
+ * Returns keys to scan cv:{schema}.{table}:{identity_length}:{identity}:*
91
144
  */
92
- export declare function buildColumnVersionScanBounds(schemaName: string, tableName: string, pk: SqlValue[]): {
145
+ export declare function buildColumnVersionScanBounds(schemaName: string, tableName: string, identity: string): {
93
146
  gte: Uint8Array;
94
147
  lt: Uint8Array;
95
148
  };
@@ -130,22 +183,30 @@ export declare function buildAllSchemaMigrationsScanBounds(): {
130
183
  };
131
184
  /**
132
185
  * Parse a column version key to extract components.
133
- * Key format: cv:{schema}.{table}:{pk_json}:{column}
186
+ * Key format: cv:{schema}.{table}:{identity_length}:{identity}:{column}
187
+ *
188
+ * Returns the pk IDENTITY string — the identity is lossy and cannot be decoded
189
+ * back to values; the raw pk lives in the record VALUE (`ColumnVersion.pk`).
190
+ * The length prefix makes the identity/column split unambiguous regardless of
191
+ * what characters either contains.
134
192
  */
135
193
  export declare function parseColumnVersionKey(key: Uint8Array): {
136
194
  schema: string;
137
195
  table: string;
138
- pk: SqlValue[];
196
+ identity: string;
139
197
  column: string;
140
198
  } | null;
141
199
  /**
142
200
  * Parse a tombstone key to extract components.
143
- * Key format: tb:{schema}.{table}:{pk_json}
201
+ * Key format: tb:{schema}.{table}:{identity}
202
+ *
203
+ * Returns the pk IDENTITY string; the raw pk lives in the record VALUE
204
+ * (`Tombstone.pk`).
144
205
  */
145
206
  export declare function parseTombstoneKey(key: Uint8Array): {
146
207
  schema: string;
147
208
  table: string;
148
- pk: SqlValue[];
209
+ identity: string;
149
210
  } | null;
150
211
  /**
151
212
  * Parse a schema migration key to extract components.
@@ -172,12 +233,13 @@ export declare function serializeHLCForKey(hlc: HLC): Uint8Array;
172
233
  export declare function deserializeHLCFromKey(buffer: Uint8Array): HLC;
173
234
  /**
174
235
  * Build a change log key.
175
- * Format: cl:{hlc_bytes}{type_byte}{schema}.{table}:{pk_json}:{column?}
236
+ * Format: cl:{hlc_bytes}{type_byte}{schema}.{table}:{identity_length}:{identity}[:{column}]
176
237
  *
177
238
  * The HLC comes first to enable efficient range scans by time.
178
239
  * type_byte: 0x01 for column change, 0x02 for delete
240
+ * The identity is length-prefixed for the same reason as {@link buildColumnVersionKey}.
179
241
  */
180
- export declare function buildChangeLogKey(hlc: HLC, entryType: ChangeLogEntryType, schemaName: string, tableName: string, pk: SqlValue[], column?: string): Uint8Array;
242
+ export declare function buildChangeLogKey(hlc: HLC, entryType: ChangeLogEntryType, schemaName: string, tableName: string, identity: string, column?: string): Uint8Array;
181
243
  /**
182
244
  * Build scan bounds for change log entries after a given HLC.
183
245
  * Returns keys to scan cl:{sinceHLC}* to end of change log.
@@ -201,19 +263,23 @@ export declare function parseChangeLogKey(key: Uint8Array): {
201
263
  entryType: ChangeLogEntryType;
202
264
  schema: string;
203
265
  table: string;
204
- pk: SqlValue[];
266
+ identity: string;
205
267
  column?: string;
206
268
  } | null;
207
269
  /**
208
270
  * Build a quarantine key for a held out-of-basis straggler change.
209
- * Format: qt:{schema}.{table}: + hlc_bytes(30) + type_byte(1) + :{pk_json}[:{column}]
271
+ * Format: qt:{schema}.{table}: + hlc_bytes(30) + type_byte(1) + :{raw_identity}[:{column}]
210
272
  *
211
273
  * Unlike the change log (`cl:`), the table prefix comes BEFORE the HLC so the
212
274
  * range scans by `(schema, table)` for operator inspection. The HLC + type + pk
213
275
  * (+ column) suffix make the key idempotent: re-applying the same straggler
214
- * change (same HLC) overwrites its own entry rather than accumulating. Reuses
215
- * {@link serializeHLCForKey} / {@link encodePK} for parity with the change-log
216
- * encoding.
276
+ * change (same HLC) overwrites its own entry rather than accumulating.
277
+ *
278
+ * The pk component uses the RAW identity encoding ({@link encodeRawPkIdentity})
279
+ * deliberately: a quarantined table is out of the local basis, so no schema —
280
+ * and hence no collation/transform keying — can exist for it. Raw is sound here
281
+ * because the `(hlc, type)` component already makes the key unique per change,
282
+ * and it is bigint-safe (the former `JSON.stringify` threw on a bigint pk).
217
283
  *
218
284
  * The value (not the key) carries the serialized change verbatim, so quarantine
219
285
  * keys are written and pruned but never parsed back.
@@ -1 +1 @@
1
- {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/metadata/keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,KAAK,MAAM,EAAoC,MAAM,kBAAkB,CAAC;AACjF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAI3C,0CAA0C;AAC1C,eAAO,MAAM,eAAe;;;;;;;;;;;;CAYlB,CAAC;AAmBX;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAEpD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,QAAQ,EAAE,EACd,MAAM,EAAE,MAAM,GACb,UAAU,CAIZ;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,QAAQ,EAAE,GACb,UAAU,CAIZ;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,CAErE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAQhE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,UAAU,CAGZ;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAMrC;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,QAAQ,EAAE,GACb;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAMrC;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAMrC;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAMrC;AAkBD;;GAEG;AACH,wBAAgB,gCAAgC,IAAI;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAKtF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAKlF;AAED;;GAEG;AACH,wBAAgB,kCAAkC,IAAI;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAKxF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,GAAG;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,QAAQ,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CA4BP;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,QAAQ,EAAE,CAAC;CAChB,GAAG,IAAI,CAuBP;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,UAAU,GAAG;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,IAAI,CAqBP;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU,CAYvD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,GAAG,CAO7D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,kBAAkB,EAC7B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,QAAQ,EAAE,EACd,MAAM,CAAC,EAAE,MAAM,GACd,UAAU,CAiBZ;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,GAAG,GAAG;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAWhG;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAKjF;AAkBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG;IAClD,GAAG,EAAE,GAAG,CAAC;IACT,SAAS,EAAE,kBAAkB,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,QAAQ,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,IAAI,CA+CP;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,kBAAkB,EAC7B,EAAE,EAAE,QAAQ,EAAE,EACd,MAAM,CAAC,EAAE,MAAM,GACd,UAAU,CAiBZ;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAarC;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CAGxF;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,IAAI;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAKtF"}
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/metadata/keys.ts"],"names":[],"mappings":"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"}