@quereus/sync 4.4.0 → 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.
- package/README.md +19 -1
- package/dist/src/create-sync-module.d.ts +11 -1
- package/dist/src/create-sync-module.d.ts.map +1 -1
- package/dist/src/create-sync-module.js +2 -2
- package/dist/src/create-sync-module.js.map +1 -1
- package/dist/src/index.d.ts +4 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +9 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/metadata/change-log.d.ts +39 -3
- package/dist/src/metadata/change-log.d.ts.map +1 -1
- package/dist/src/metadata/change-log.js +43 -8
- package/dist/src/metadata/change-log.js.map +1 -1
- package/dist/src/metadata/column-version.d.ts +62 -9
- package/dist/src/metadata/column-version.d.ts.map +1 -1
- package/dist/src/metadata/column-version.js +79 -25
- package/dist/src/metadata/column-version.js.map +1 -1
- package/dist/src/metadata/index.d.ts +1 -0
- package/dist/src/metadata/index.d.ts.map +1 -1
- package/dist/src/metadata/index.js +1 -0
- package/dist/src/metadata/index.js.map +1 -1
- package/dist/src/metadata/keys.d.ts +88 -22
- package/dist/src/metadata/keys.d.ts.map +1 -1
- package/dist/src/metadata/keys.js +134 -77
- package/dist/src/metadata/keys.js.map +1 -1
- package/dist/src/metadata/pk-identity.d.ts +60 -0
- package/dist/src/metadata/pk-identity.d.ts.map +1 -0
- package/dist/src/metadata/pk-identity.js +94 -0
- package/dist/src/metadata/pk-identity.js.map +1 -0
- package/dist/src/metadata/tombstones.d.ts +41 -11
- package/dist/src/metadata/tombstones.d.ts.map +1 -1
- package/dist/src/metadata/tombstones.js +58 -33
- package/dist/src/metadata/tombstones.js.map +1 -1
- package/dist/src/sync/change-applicator.d.ts +30 -1
- package/dist/src/sync/change-applicator.d.ts.map +1 -1
- package/dist/src/sync/change-applicator.js +161 -40
- package/dist/src/sync/change-applicator.js.map +1 -1
- package/dist/src/sync/maintenance.d.ts +70 -0
- package/dist/src/sync/maintenance.d.ts.map +1 -0
- package/dist/src/sync/maintenance.js +84 -0
- package/dist/src/sync/maintenance.js.map +1 -0
- package/dist/src/sync/protocol.d.ts +61 -10
- package/dist/src/sync/protocol.d.ts.map +1 -1
- package/dist/src/sync/protocol.js +15 -0
- package/dist/src/sync/protocol.js.map +1 -1
- package/dist/src/sync/snapshot-identity.d.ts +62 -0
- package/dist/src/sync/snapshot-identity.d.ts.map +1 -0
- package/dist/src/sync/snapshot-identity.js +88 -0
- package/dist/src/sync/snapshot-identity.js.map +1 -0
- package/dist/src/sync/snapshot-stream.d.ts +8 -1
- package/dist/src/sync/snapshot-stream.d.ts.map +1 -1
- package/dist/src/sync/snapshot-stream.js +166 -67
- package/dist/src/sync/snapshot-stream.js.map +1 -1
- package/dist/src/sync/snapshot.d.ts +1 -1
- package/dist/src/sync/snapshot.d.ts.map +1 -1
- package/dist/src/sync/snapshot.js +75 -44
- package/dist/src/sync/snapshot.js.map +1 -1
- package/dist/src/sync/staged-transaction-metadata.d.ts +75 -0
- package/dist/src/sync/staged-transaction-metadata.d.ts.map +1 -0
- package/dist/src/sync/staged-transaction-metadata.js +100 -0
- package/dist/src/sync/staged-transaction-metadata.js.map +1 -0
- package/dist/src/sync/store-adapter.d.ts +10 -4
- package/dist/src/sync/store-adapter.d.ts.map +1 -1
- package/dist/src/sync/store-adapter.js +244 -21
- package/dist/src/sync/store-adapter.js.map +1 -1
- package/dist/src/sync/sync-context.d.ts +54 -2
- package/dist/src/sync/sync-context.d.ts.map +1 -1
- package/dist/src/sync/sync-context.js +66 -0
- package/dist/src/sync/sync-context.js.map +1 -1
- package/dist/src/sync/sync-manager-impl.d.ts +70 -4
- package/dist/src/sync/sync-manager-impl.d.ts.map +1 -1
- package/dist/src/sync/sync-manager-impl.js +206 -36
- package/dist/src/sync/sync-manager-impl.js.map +1 -1
- package/dist/src/sync/wire.d.ts +47 -6
- package/dist/src/sync/wire.d.ts.map +1 -1
- package/dist/src/sync/wire.js +62 -11
- package/dist/src/sync/wire.js.map +1 -1
- 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
|
|
16
|
-
* when the version has no prior, keeping first-writes and
|
|
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 = {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
//
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const
|
|
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
|
-
*
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
-
|
|
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":"AAAA;;;;;GAKG;AAIH,OAAO,EAAgC,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACjI,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"column-version.js","sourceRoot":"","sources":["../../../src/metadata/column-version.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -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
|
-
*
|
|
36
|
-
*
|
|
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
|
|
54
|
+
export interface PkKeying {
|
|
55
|
+
readonly normalizers: ReadonlyArray<(s: string) => string>;
|
|
56
|
+
readonly transforms: ReadonlyArray<((v: SqlValue) => SqlValue) | undefined>;
|
|
57
|
+
}
|
|
39
58
|
/**
|
|
40
|
-
*
|
|
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
|
|
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}:{
|
|
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,
|
|
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}:{
|
|
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,
|
|
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}:{
|
|
143
|
+
* Returns keys to scan cv:{schema}.{table}:{identity_length}:{identity}:*
|
|
91
144
|
*/
|
|
92
|
-
export declare function buildColumnVersionScanBounds(schemaName: string, tableName: string,
|
|
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}:{
|
|
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
|
-
|
|
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}:{
|
|
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
|
-
|
|
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}:{
|
|
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,
|
|
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
|
-
|
|
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) + :{
|
|
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.
|
|
215
|
-
*
|
|
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
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/metadata/keys.ts"],"names":[],"mappings":"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"}
|