@quereus/sync 4.5.0 → 4.7.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/README.md +14 -6
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/metadata/column-version.d.ts.map +1 -1
- package/dist/src/metadata/column-version.js +8 -9
- package/dist/src/metadata/column-version.js.map +1 -1
- package/dist/src/metadata/keys.d.ts +99 -39
- package/dist/src/metadata/keys.d.ts.map +1 -1
- package/dist/src/metadata/keys.js +213 -158
- package/dist/src/metadata/keys.js.map +1 -1
- package/dist/src/metadata/pk-identity.d.ts +19 -14
- package/dist/src/metadata/pk-identity.d.ts.map +1 -1
- package/dist/src/metadata/pk-identity.js +21 -28
- package/dist/src/metadata/pk-identity.js.map +1 -1
- package/dist/src/metadata/schema-migration.d.ts +33 -10
- package/dist/src/metadata/schema-migration.d.ts.map +1 -1
- package/dist/src/metadata/schema-migration.js +77 -18
- package/dist/src/metadata/schema-migration.js.map +1 -1
- package/dist/src/sync/change-applicator.d.ts +19 -3
- package/dist/src/sync/change-applicator.d.ts.map +1 -1
- package/dist/src/sync/change-applicator.js +253 -63
- package/dist/src/sync/change-applicator.js.map +1 -1
- package/dist/src/sync/maintenance.d.ts +8 -5
- package/dist/src/sync/maintenance.d.ts.map +1 -1
- package/dist/src/sync/maintenance.js +7 -4
- package/dist/src/sync/maintenance.js.map +1 -1
- package/dist/src/sync/manager.d.ts +46 -1
- package/dist/src/sync/manager.d.ts.map +1 -1
- package/dist/src/sync/protocol.d.ts +42 -3
- package/dist/src/sync/protocol.d.ts.map +1 -1
- package/dist/src/sync/protocol.js +40 -0
- package/dist/src/sync/protocol.js.map +1 -1
- package/dist/src/sync/snapshot-identity.d.ts.map +1 -1
- package/dist/src/sync/snapshot-identity.js +1 -9
- package/dist/src/sync/snapshot-identity.js.map +1 -1
- package/dist/src/sync/snapshot-stream.d.ts +11 -0
- package/dist/src/sync/snapshot-stream.d.ts.map +1 -1
- package/dist/src/sync/snapshot-stream.js +134 -67
- package/dist/src/sync/snapshot-stream.js.map +1 -1
- package/dist/src/sync/snapshot.d.ts.map +1 -1
- package/dist/src/sync/snapshot.js +15 -30
- package/dist/src/sync/snapshot.js.map +1 -1
- package/dist/src/sync/store-adapter.d.ts +5 -4
- package/dist/src/sync/store-adapter.d.ts.map +1 -1
- package/dist/src/sync/store-adapter.js +328 -108
- package/dist/src/sync/store-adapter.js.map +1 -1
- package/dist/src/sync/sync-manager-impl.d.ts +37 -4
- package/dist/src/sync/sync-manager-impl.d.ts.map +1 -1
- package/dist/src/sync/sync-manager-impl.js +110 -56
- package/dist/src/sync/sync-manager-impl.js.map +1 -1
- package/dist/src/sync/wire.d.ts +6 -0
- package/dist/src/sync/wire.d.ts.map +1 -1
- package/dist/src/sync/wire.js +3 -0
- package/dist/src/sync/wire.js.map +1 -1
- package/package.json +7 -7
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Host-agnostic tick body for the periodic sync-maintenance loop.
|
|
3
3
|
*
|
|
4
|
-
* `@quereus/sync` is deliberately timer-free: it exposes the
|
|
4
|
+
* `@quereus/sync` is deliberately timer-free: it exposes the five host-driven
|
|
5
5
|
* sweeps (`drainHeldChanges` / `pruneQuarantine` / `pruneTombstones` /
|
|
6
|
-
* `evictExpiredBasisTables`) but never schedules them — the host owns cadence
|
|
6
|
+
* `repairChangeLog` / `evictExpiredBasisTables`) but never schedules them — the host owns cadence
|
|
7
7
|
* (`docs/sync.md` § Who drives the sweep, `docs/migration.md` § 4 Contract).
|
|
8
8
|
* What lives here is only the *shape* of one pass — ordering, error isolation,
|
|
9
9
|
* single-flight — with no timer and no `SyncManager` import, so every host
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
export declare const SYNC_MAINTENANCE_INTERVAL_MS: number;
|
|
25
25
|
/**
|
|
26
|
-
* Minimal structural view of the
|
|
26
|
+
* Minimal structural view of the five host-driven sweeps the loop calls. Avoids
|
|
27
27
|
* depending on the full `SyncManager` surface and keeps test fakes tiny — a
|
|
28
28
|
* `SyncManager` is structurally assignable to this.
|
|
29
29
|
*/
|
|
@@ -31,6 +31,7 @@ export interface SyncMaintenanceTarget {
|
|
|
31
31
|
drainHeldChanges(): Promise<number>;
|
|
32
32
|
pruneQuarantine(): Promise<number>;
|
|
33
33
|
pruneTombstones(): Promise<number>;
|
|
34
|
+
repairChangeLog(): Promise<number>;
|
|
34
35
|
evictExpiredBasisTables(): Promise<number>;
|
|
35
36
|
}
|
|
36
37
|
/**
|
|
@@ -44,9 +45,11 @@ export type MaintenanceLogger = (step: string, error: unknown) => void;
|
|
|
44
45
|
*
|
|
45
46
|
* Order: `drainHeldChanges` first — it replays held out-of-basis changes into
|
|
46
47
|
* tables that have reappeared in the local basis — THEN `pruneQuarantine` GCs
|
|
47
|
-
* the truly-expired remainder, then `pruneTombstones`, then
|
|
48
|
-
* `evictExpiredBasisTables`. Draining before pruning means a held change for a
|
|
48
|
+
* the truly-expired remainder, then `pruneTombstones`, then `repairChangeLog`,
|
|
49
|
+
* then `evictExpiredBasisTables`. Draining before pruning means a held change for a
|
|
49
50
|
* table that has come back is replayed rather than GC'd out from under it.
|
|
51
|
+
* `repairChangeLog` has no ordering dependency on any other sweep — it is placed
|
|
52
|
+
* next to `pruneTombstones` because both act on the change log.
|
|
50
53
|
*/
|
|
51
54
|
export declare function runSyncMaintenancePass(target: SyncMaintenanceTarget, log: MaintenanceLogger): Promise<void>;
|
|
52
55
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../../src/sync/maintenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,4BAA4B,QAAgB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5C;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;AAevE
|
|
1
|
+
{"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../../src/sync/maintenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,4BAA4B,QAAgB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5C;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;AAevE;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,qBAAqB,EAC7B,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,qBAAqB,GAAG,IAAI,EAC7C,GAAG,EAAE,iBAAiB,GACrB,MAAM,OAAO,CAAC,IAAI,CAAC,CAarB"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Host-agnostic tick body for the periodic sync-maintenance loop.
|
|
3
3
|
*
|
|
4
|
-
* `@quereus/sync` is deliberately timer-free: it exposes the
|
|
4
|
+
* `@quereus/sync` is deliberately timer-free: it exposes the five host-driven
|
|
5
5
|
* sweeps (`drainHeldChanges` / `pruneQuarantine` / `pruneTombstones` /
|
|
6
|
-
* `evictExpiredBasisTables`) but never schedules them — the host owns cadence
|
|
6
|
+
* `repairChangeLog` / `evictExpiredBasisTables`) but never schedules them — the host owns cadence
|
|
7
7
|
* (`docs/sync.md` § Who drives the sweep, `docs/migration.md` § 4 Contract).
|
|
8
8
|
* What lives here is only the *shape* of one pass — ordering, error isolation,
|
|
9
9
|
* single-flight — with no timer and no `SyncManager` import, so every host
|
|
@@ -37,14 +37,17 @@ async function runStep(step, run, log) {
|
|
|
37
37
|
*
|
|
38
38
|
* Order: `drainHeldChanges` first — it replays held out-of-basis changes into
|
|
39
39
|
* tables that have reappeared in the local basis — THEN `pruneQuarantine` GCs
|
|
40
|
-
* the truly-expired remainder, then `pruneTombstones`, then
|
|
41
|
-
* `evictExpiredBasisTables`. Draining before pruning means a held change for a
|
|
40
|
+
* the truly-expired remainder, then `pruneTombstones`, then `repairChangeLog`,
|
|
41
|
+
* then `evictExpiredBasisTables`. Draining before pruning means a held change for a
|
|
42
42
|
* table that has come back is replayed rather than GC'd out from under it.
|
|
43
|
+
* `repairChangeLog` has no ordering dependency on any other sweep — it is placed
|
|
44
|
+
* next to `pruneTombstones` because both act on the change log.
|
|
43
45
|
*/
|
|
44
46
|
export async function runSyncMaintenancePass(target, log) {
|
|
45
47
|
await runStep('drainHeldChanges', () => target.drainHeldChanges(), log);
|
|
46
48
|
await runStep('pruneQuarantine', () => target.pruneQuarantine(), log);
|
|
47
49
|
await runStep('pruneTombstones', () => target.pruneTombstones(), log);
|
|
50
|
+
await runStep('repairChangeLog', () => target.repairChangeLog(), log);
|
|
48
51
|
await runStep('evictExpiredBasisTables', () => target.evictExpiredBasisTables(), log);
|
|
49
52
|
}
|
|
50
53
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../../src/sync/maintenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../../src/sync/maintenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAqB1D,gFAAgF;AAChF,KAAK,UAAU,OAAO,CACpB,IAAY,EACZ,GAA0B,EAC1B,GAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,GAAG,EAAE,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAA6B,EAC7B,GAAsB;IAEtB,MAAM,OAAO,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;IACxE,MAAM,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;IACtE,MAAM,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;IACtE,MAAM,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;IACtE,MAAM,OAAO,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,uBAAuB,EAAE,EAAE,GAAG,CAAC,CAAC;AACxF,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,2BAA2B,CACzC,SAA6C,EAC7C,GAAsB;IAEtB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,KAAK,IAAI,EAAE;QAChB,IAAI,OAAO;YAAE,OAAO;QACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,CAAC;YACH,MAAM,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;gBAAS,CAAC;YACT,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -40,7 +40,13 @@ export interface SyncManager {
|
|
|
40
40
|
* Changes are applied atomically per transaction.
|
|
41
41
|
* Conflicts are resolved using column-level LWW.
|
|
42
42
|
*
|
|
43
|
-
*
|
|
43
|
+
* **Order-independent**: `changes` may be in any order and produces the same
|
|
44
|
+
* committed state as the HLC-ordered array — every ordering decision (which write
|
|
45
|
+
* survives, which DDL runs first, what the table row becomes) is made from the
|
|
46
|
+
* facts' HLCs, not from their position in the array. Callers assembling a batch
|
|
47
|
+
* from several senders, or passing one through an approval hook, need not sort it.
|
|
48
|
+
*
|
|
49
|
+
* @param changes - Change sets received from a peer, in any order
|
|
44
50
|
* @returns Statistics about what was applied
|
|
45
51
|
*/
|
|
46
52
|
applyChanges(changes: ChangeSet[]): Promise<ApplyResult>;
|
|
@@ -117,6 +123,22 @@ export interface SyncManager {
|
|
|
117
123
|
* {@link pruneTombstones}. Returns the number of entries pruned.
|
|
118
124
|
*/
|
|
119
125
|
pruneQuarantine(): Promise<number>;
|
|
126
|
+
/**
|
|
127
|
+
* Repair pass over the change log: delete every entry whose target record is
|
|
128
|
+
* already gone. Forward cleanup (`deleteRowVersionsAndLogEntries` / the change-log
|
|
129
|
+
* deletion in {@link pruneTombstones}) only stops *new* orphans — an entry whose
|
|
130
|
+
* record died before that cleanup existed is orphaned forever unless something
|
|
131
|
+
* scans the log itself. Nothing is incorrect while orphans remain (a resolved-to-
|
|
132
|
+
* `null` entry already produces no output), so this is a storage/scan-cost cleanup,
|
|
133
|
+
* safe to run at any time with no peer coordination.
|
|
134
|
+
*
|
|
135
|
+
* Host-driven — call from the same periodic maintenance path as
|
|
136
|
+
* {@link pruneTombstones} / {@link pruneQuarantine} / {@link evictExpiredBasisTables};
|
|
137
|
+
* the library adds no timer. Idempotent and cheap on a replica with nothing to
|
|
138
|
+
* repair: every entry resolves and none are deleted. Returns the number of
|
|
139
|
+
* entries removed.
|
|
140
|
+
*/
|
|
141
|
+
repairChangeLog(): Promise<number>;
|
|
120
142
|
/**
|
|
121
143
|
* Replay held out-of-basis changes (`quarantine` + forwardable `store-and-forward`
|
|
122
144
|
* entries) into tables that have since reappeared in the local basis — the revival
|
|
@@ -222,6 +244,29 @@ export interface SyncManager {
|
|
|
222
244
|
* @param snapshotId - The snapshot ID to get checkpoint for
|
|
223
245
|
*/
|
|
224
246
|
getSnapshotCheckpoint(snapshotId: string): Promise<SnapshotCheckpoint | undefined>;
|
|
247
|
+
/**
|
|
248
|
+
* List every saved checkpoint for an interrupted snapshot apply.
|
|
249
|
+
*
|
|
250
|
+
* A non-empty result means this replica's data is PARTIAL: a snapshot apply
|
|
251
|
+
* cleared existing sync metadata and did not reach its footer. Callers use
|
|
252
|
+
* this to discover a resumable transfer whose `snapshotId` they no longer
|
|
253
|
+
* hold (it only ever arrived in the snapshot's header chunk).
|
|
254
|
+
*
|
|
255
|
+
* Ordering is unspecified; pick by `createdAt` when more than one exists.
|
|
256
|
+
*/
|
|
257
|
+
listSnapshotCheckpoints(): Promise<SnapshotCheckpoint[]>;
|
|
258
|
+
/**
|
|
259
|
+
* Discard a saved checkpoint without applying anything.
|
|
260
|
+
*
|
|
261
|
+
* `applySnapshotStream` already clears its own checkpoint on success; this is
|
|
262
|
+
* for callers abandoning a transfer they will not resume (e.g. discarding
|
|
263
|
+
* superseded checkpoints when several are present).
|
|
264
|
+
*
|
|
265
|
+
* Calling this for an IN-FLIGHT apply's snapshotId is not guarded: the apply
|
|
266
|
+
* simply re-saves the record at its next flush, so nothing corrupts — the
|
|
267
|
+
* transfer only loses one resume position in the interim.
|
|
268
|
+
*/
|
|
269
|
+
clearSnapshotCheckpoint(snapshotId: string): Promise<void>;
|
|
225
270
|
/**
|
|
226
271
|
* Resume a snapshot transfer from a checkpoint.
|
|
227
272
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/sync/manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACvG,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAEhF;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,SAAS,IAAI,MAAM,CAAC;IAEpB;;OAEG;IACH,aAAa,IAAI,GAAG,CAAC;IAErB;;;;;;OAMG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAE1E
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/sync/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* and send via WebSocket, HTTP, WebRTC, or any other transport.
|
|
7
7
|
*/
|
|
8
8
|
import type { AssertionViolation, Row, SqlValue } from '@quereus/quereus';
|
|
9
|
-
import type
|
|
9
|
+
import { type HLC } from '../clock/hlc.js';
|
|
10
10
|
import type { SiteId } from '../clock/site.js';
|
|
11
11
|
/**
|
|
12
12
|
* A single column modification within a row.
|
|
@@ -57,18 +57,52 @@ export type Change = ColumnChange | RowDeletion;
|
|
|
57
57
|
/**
|
|
58
58
|
* Types of schema migrations.
|
|
59
59
|
*/
|
|
60
|
-
export type SchemaMigrationType = 'create_table' | 'drop_table' | 'add_column' | 'drop_column' | 'add_index' | 'drop_index' | 'alter_column';
|
|
60
|
+
export type SchemaMigrationType = 'create_table' | 'drop_table' | 'rename_table' | 'add_column' | 'drop_column' | 'add_index' | 'drop_index' | 'alter_column';
|
|
61
|
+
/**
|
|
62
|
+
* The kind of schema object a migration names.
|
|
63
|
+
*
|
|
64
|
+
* A migration's object name means different things per type — for an index
|
|
65
|
+
* migration it is the INDEX name, for every other type it is the TABLE name — so
|
|
66
|
+
* the kind is what keeps a table and a same-named index in separate migration
|
|
67
|
+
* streams (see {@link migrationObjectKind} and the `sm:` key layout in
|
|
68
|
+
* `metadata/keys.ts`).
|
|
69
|
+
*/
|
|
70
|
+
export type SchemaObjectKind = 'table' | 'index';
|
|
71
|
+
/**
|
|
72
|
+
* The object kind a migration type names. Derived, never carried on the wire:
|
|
73
|
+
* `SchemaMigration.type` already travels, so both ends compute the same kind and
|
|
74
|
+
* cannot disagree.
|
|
75
|
+
*/
|
|
76
|
+
export declare function migrationObjectKind(type: SchemaMigrationType): SchemaObjectKind;
|
|
61
77
|
/**
|
|
62
78
|
* A schema migration record.
|
|
63
79
|
*/
|
|
64
80
|
export interface SchemaMigration {
|
|
65
81
|
readonly type: SchemaMigrationType;
|
|
66
82
|
readonly schema: string;
|
|
83
|
+
/** The object's name AFTER this migration (for a `rename_table`, the NEW name). */
|
|
67
84
|
readonly table: string;
|
|
85
|
+
/**
|
|
86
|
+
* `rename_table` only: the table name before the rename. The migration itself
|
|
87
|
+
* is keyed under the NEW name (`table`), so every subsequent alteration of the
|
|
88
|
+
* renamed table stays in one contiguous version stream where the table lives.
|
|
89
|
+
*/
|
|
90
|
+
readonly fromTable?: string;
|
|
68
91
|
readonly ddl: string;
|
|
69
92
|
readonly hlc: HLC;
|
|
70
93
|
readonly schemaVersion: number;
|
|
71
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Order migrations causally — ascending HLC, stable, so migrations that cannot be
|
|
97
|
+
* distinguished by HLC keep arrival order.
|
|
98
|
+
*
|
|
99
|
+
* Every consumer replays DDL as a plain array in list order, and migrations are
|
|
100
|
+
* order-dependent across objects as well as within one: `create index` fails
|
|
101
|
+
* outright if its table's `create table` has not run. Neither the `sm:` key order
|
|
102
|
+
* (schema, then object kind, then name — every index before every table) nor
|
|
103
|
+
* changeset arrival order is causal, so both snapshot and delta paths sort here.
|
|
104
|
+
*/
|
|
105
|
+
export declare function sortMigrationsByHLC(migrations: readonly SchemaMigration[]): SchemaMigration[];
|
|
72
106
|
/**
|
|
73
107
|
* Exactly one source transaction's worth of changes.
|
|
74
108
|
*
|
|
@@ -216,7 +250,7 @@ export interface Snapshot {
|
|
|
216
250
|
* The receiver flushes rows to the store in bounded batches rather than buffering
|
|
217
251
|
* the whole snapshot, and DDL only beats DML *within* one flush — so a `create
|
|
218
252
|
* table` emitted after its rows arrives too late for the flushes those rows already
|
|
219
|
-
* triggered. See docs/sync.md § Streaming Snapshot API.
|
|
253
|
+
* triggered. See docs/sync-protocol.md § Streaming Snapshot API.
|
|
220
254
|
*/
|
|
221
255
|
export type SnapshotChunkType = 'header' | 'schema-migration' | 'table-start' | 'column-versions' | 'table-end' | 'tombstone' | 'footer';
|
|
222
256
|
/**
|
|
@@ -365,10 +399,15 @@ export interface DataChangeToApply {
|
|
|
365
399
|
export interface SchemaChangeToApply {
|
|
366
400
|
readonly type: SchemaMigrationType;
|
|
367
401
|
readonly schema: string;
|
|
402
|
+
/** The object's name AFTER the migration (for a `rename_table`, the NEW name). */
|
|
368
403
|
readonly table: string;
|
|
404
|
+
/** `rename_table` only: the table name before the rename. */
|
|
405
|
+
readonly fromTable?: string;
|
|
369
406
|
/** The DDL statement to execute. */
|
|
370
407
|
readonly ddl: string;
|
|
371
408
|
}
|
|
409
|
+
/** Narrow a migration to the fields the store adapter replays. */
|
|
410
|
+
export declare function toSchemaChange(migration: SchemaMigration): SchemaChangeToApply;
|
|
372
411
|
/**
|
|
373
412
|
* Result of applying changes to the store.
|
|
374
413
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/sync/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/sync/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,35 @@
|
|
|
5
5
|
* Applications can serialize these to JSON, MessagePack, protobuf, etc.
|
|
6
6
|
* and send via WebSocket, HTTP, WebRTC, or any other transport.
|
|
7
7
|
*/
|
|
8
|
+
import { compareHLC } from '../clock/hlc.js';
|
|
9
|
+
/**
|
|
10
|
+
* The object kind a migration type names. Derived, never carried on the wire:
|
|
11
|
+
* `SchemaMigration.type` already travels, so both ends compute the same kind and
|
|
12
|
+
* cannot disagree.
|
|
13
|
+
*/
|
|
14
|
+
export function migrationObjectKind(type) {
|
|
15
|
+
switch (type) {
|
|
16
|
+
case 'add_index':
|
|
17
|
+
case 'drop_index':
|
|
18
|
+
return 'index';
|
|
19
|
+
// create/drop/rename table and the three column-level types all name a TABLE.
|
|
20
|
+
default:
|
|
21
|
+
return 'table';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Order migrations causally — ascending HLC, stable, so migrations that cannot be
|
|
26
|
+
* distinguished by HLC keep arrival order.
|
|
27
|
+
*
|
|
28
|
+
* Every consumer replays DDL as a plain array in list order, and migrations are
|
|
29
|
+
* order-dependent across objects as well as within one: `create index` fails
|
|
30
|
+
* outright if its table's `create table` has not run. Neither the `sm:` key order
|
|
31
|
+
* (schema, then object kind, then name — every index before every table) nor
|
|
32
|
+
* changeset arrival order is causal, so both snapshot and delta paths sort here.
|
|
33
|
+
*/
|
|
34
|
+
export function sortMigrationsByHLC(migrations) {
|
|
35
|
+
return [...migrations].sort((a, b) => compareHLC(a.hlc, b.hlc));
|
|
36
|
+
}
|
|
8
37
|
/**
|
|
9
38
|
* Snapshot wire-format version, stamped into both snapshot forms (the streaming
|
|
10
39
|
* header chunk and the non-streaming `Snapshot`). Both apply paths REFUSE a
|
|
@@ -20,6 +49,17 @@
|
|
|
20
49
|
* derives its own (see docs/sync.md § Row identity vs. address).
|
|
21
50
|
*/
|
|
22
51
|
export const SNAPSHOT_WIRE_FORMAT_VERSION = 1;
|
|
52
|
+
/** Narrow a migration to the fields the store adapter replays. */
|
|
53
|
+
export function toSchemaChange(migration) {
|
|
54
|
+
return {
|
|
55
|
+
type: migration.type,
|
|
56
|
+
schema: migration.schema,
|
|
57
|
+
table: migration.table,
|
|
58
|
+
// Present-only, so a non-rename migration carries no phantom key.
|
|
59
|
+
...(migration.fromTable !== undefined ? { fromTable: migration.fromTable } : {}),
|
|
60
|
+
ddl: migration.ddl,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
23
63
|
/**
|
|
24
64
|
* Default sync configuration.
|
|
25
65
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/sync/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/sync/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAY,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAoFvD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAyB;IAC5D,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,WAAW,CAAC;QACjB,KAAK,YAAY;YAChB,OAAO,OAAO,CAAC;QAChB,8EAA8E;QAC9E;YACC,OAAO,OAAO,CAAC;IACjB,CAAC;AACF,CAAC;AAqBD;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAsC;IACzE,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACjE,CAAC;AAwED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AA2Q9C,kEAAkE;AAClE,MAAM,UAAU,cAAc,CAAC,SAA0B;IACxD,OAAO;QACN,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,kEAAkE;QAClE,GAAG,CAAC,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,EAAE,SAAS,CAAC,GAAG;KAClB,CAAC;AACH,CAAC;AAoPD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,kBAAkB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAG,UAAU;IACzD,iBAAiB,EAAE,KAAK;IACxB,SAAS,EAAE,IAAI;IACf,uBAAuB,EAAE,YAAY;IACrC,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IAClC,eAAe,EAAE,IAAI;CACtB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-identity.d.ts","sourceRoot":"","sources":["../../../src/sync/snapshot-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAc,KAAK,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,
|
|
1
|
+
{"version":3,"file":"snapshot-identity.d.ts","sourceRoot":"","sources":["../../../src/sync/snapshot-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAc,KAAK,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAkC,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,6EAA6E;AAC7E,MAAM,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAC;AAEjF;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,QAAQ,EAAE,CAAC;IACf,KAAK,EAAE,GAAG,CAAC;IACX,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAC;CAClD;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,WAAW,GAAG,sBAAsB,CAgBrF;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC5B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAChC,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,QAAQ,GACd,IAAI,CAeN;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;CAAE,EACzD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EACvB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,GACV,IAAI,CAKN"}
|
|
@@ -10,16 +10,8 @@
|
|
|
10
10
|
* See docs/sync.md § Row identity vs. address.
|
|
11
11
|
*/
|
|
12
12
|
import { compareHLC } from '../clock/hlc.js';
|
|
13
|
-
import { encodePkIdentity } from '../metadata/keys.js';
|
|
13
|
+
import { encodePkIdentity, joinKeyParts } from '../metadata/keys.js';
|
|
14
14
|
import { toError } from './sync-context.js';
|
|
15
|
-
/**
|
|
16
|
-
* Length-prefixed join of components that may each contain any character (a
|
|
17
|
-
* quoted SQL identifier, an arbitrary pk identity), so no separator choice can
|
|
18
|
-
* let two distinct triples collide.
|
|
19
|
-
*/
|
|
20
|
-
function joinKeyParts(...parts) {
|
|
21
|
-
return parts.map(part => `${part.length}:${part}`).join('');
|
|
22
|
-
}
|
|
23
15
|
/**
|
|
24
16
|
* Memoized per-`(schema, table)` keying lookup for one snapshot apply.
|
|
25
17
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-identity.js","sourceRoot":"","sources":["../../../src/sync/snapshot-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,UAAU,EAAY,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAiB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshot-identity.js","sourceRoot":"","sources":["../../../src/sync/snapshot-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,4 +30,15 @@ export declare function applySnapshotStream(ctx: SyncContext, chunks: AsyncItera
|
|
|
30
30
|
* Retrieve a saved checkpoint for an in-progress snapshot.
|
|
31
31
|
*/
|
|
32
32
|
export declare function getSnapshotCheckpoint(ctx: SyncContext, snapshotId: string): Promise<SnapshotCheckpoint | undefined>;
|
|
33
|
+
/**
|
|
34
|
+
* List every saved snapshot checkpoint — the discovery path for a caller that
|
|
35
|
+
* has forgotten (or never held) the `snapshotId` of an interrupted transfer.
|
|
36
|
+
* See {@link import('./manager.js').SyncManager.listSnapshotCheckpoints}.
|
|
37
|
+
*/
|
|
38
|
+
export declare function listSnapshotCheckpoints(ctx: SyncContext): Promise<SnapshotCheckpoint[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Clear a checkpoint — after its snapshot completes successfully, or when a
|
|
41
|
+
* caller abandons a transfer it will not resume.
|
|
42
|
+
*/
|
|
43
|
+
export declare function clearSnapshotCheckpoint(ctx: SyncContext, snapshotId: string): Promise<void>;
|
|
33
44
|
//# sourceMappingURL=snapshot-stream.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-stream.d.ts","sourceRoot":"","sources":["../../../src/sync/snapshot-stream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAEN,KAAK,aAAa,EAClB,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"snapshot-stream.d.ts","sourceRoot":"","sources":["../../../src/sync/snapshot-stream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAEN,KAAK,aAAa,EAClB,KAAK,gBAAgB,EAcrB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAarD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,MAAM,CAAC;AA+MnC;;GAEG;AACH,wBAAuB,iBAAiB,CACvC,GAAG,EAAE,WAAW,EAChB,SAAS,GAAE,MAAoC,GAC7C,aAAa,CAAC,aAAa,CAAC,CAO9B;AAED;;GAEG;AACH,wBAAuB,oBAAoB,CAC1C,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,kBAAkB,GAC5B,aAAa,CAAC,aAAa,CAAC,CAS9B;AAiED;;GAEG;AACH,wBAAsB,mBAAmB,CACxC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,EACpC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAC/C,OAAO,CAAC,IAAI,CAAC,CAsYf;AAkCD;;GAEG;AACH,wBAAsB,qBAAqB,CAC1C,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAIzC;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAM7F;AA+CD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC5C,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAEf"}
|