@quereus/plugin-sync 0.3.1 → 0.3.3

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 +2 -1
  2. package/package.json +4 -4
  3. package/dist/src/clock/hlc.d.ts +0 -105
  4. package/dist/src/clock/hlc.d.ts.map +0 -1
  5. package/dist/src/clock/hlc.js +0 -251
  6. package/dist/src/clock/hlc.js.map +0 -1
  7. package/dist/src/clock/index.d.ts +0 -6
  8. package/dist/src/clock/index.d.ts.map +0 -1
  9. package/dist/src/clock/index.js +0 -6
  10. package/dist/src/clock/index.js.map +0 -1
  11. package/dist/src/clock/site.d.ts +0 -58
  12. package/dist/src/clock/site.d.ts.map +0 -1
  13. package/dist/src/clock/site.js +0 -137
  14. package/dist/src/clock/site.js.map +0 -1
  15. package/dist/src/create-sync-module.d.ts +0 -85
  16. package/dist/src/create-sync-module.d.ts.map +0 -1
  17. package/dist/src/create-sync-module.js +0 -54
  18. package/dist/src/create-sync-module.js.map +0 -1
  19. package/dist/src/index.d.ts +0 -31
  20. package/dist/src/index.d.ts.map +0 -1
  21. package/dist/src/index.js +0 -42
  22. package/dist/src/index.js.map +0 -1
  23. package/dist/src/metadata/change-log.d.ts +0 -67
  24. package/dist/src/metadata/change-log.d.ts.map +0 -1
  25. package/dist/src/metadata/change-log.js +0 -107
  26. package/dist/src/metadata/change-log.js.map +0 -1
  27. package/dist/src/metadata/column-version.d.ts +0 -58
  28. package/dist/src/metadata/column-version.d.ts.map +0 -1
  29. package/dist/src/metadata/column-version.js +0 -100
  30. package/dist/src/metadata/column-version.js.map +0 -1
  31. package/dist/src/metadata/index.d.ts +0 -11
  32. package/dist/src/metadata/index.d.ts.map +0 -1
  33. package/dist/src/metadata/index.js +0 -11
  34. package/dist/src/metadata/index.js.map +0 -1
  35. package/dist/src/metadata/keys.d.ts +0 -180
  36. package/dist/src/metadata/keys.d.ts.map +0 -1
  37. package/dist/src/metadata/keys.js +0 -390
  38. package/dist/src/metadata/keys.js.map +0 -1
  39. package/dist/src/metadata/peer-state.d.ts +0 -52
  40. package/dist/src/metadata/peer-state.d.ts.map +0 -1
  41. package/dist/src/metadata/peer-state.js +0 -87
  42. package/dist/src/metadata/peer-state.js.map +0 -1
  43. package/dist/src/metadata/schema-migration.d.ts +0 -60
  44. package/dist/src/metadata/schema-migration.d.ts.map +0 -1
  45. package/dist/src/metadata/schema-migration.js +0 -126
  46. package/dist/src/metadata/schema-migration.js.map +0 -1
  47. package/dist/src/metadata/schema-version.d.ts +0 -163
  48. package/dist/src/metadata/schema-version.d.ts.map +0 -1
  49. package/dist/src/metadata/schema-version.js +0 -307
  50. package/dist/src/metadata/schema-version.js.map +0 -1
  51. package/dist/src/metadata/tombstones.d.ts +0 -67
  52. package/dist/src/metadata/tombstones.d.ts.map +0 -1
  53. package/dist/src/metadata/tombstones.js +0 -125
  54. package/dist/src/metadata/tombstones.js.map +0 -1
  55. package/dist/src/sync/events.d.ts +0 -117
  56. package/dist/src/sync/events.d.ts.map +0 -1
  57. package/dist/src/sync/events.js +0 -56
  58. package/dist/src/sync/events.js.map +0 -1
  59. package/dist/src/sync/index.d.ts +0 -8
  60. package/dist/src/sync/index.d.ts.map +0 -1
  61. package/dist/src/sync/index.js +0 -8
  62. package/dist/src/sync/index.js.map +0 -1
  63. package/dist/src/sync/manager.d.ts +0 -146
  64. package/dist/src/sync/manager.d.ts.map +0 -1
  65. package/dist/src/sync/manager.js +0 -8
  66. package/dist/src/sync/manager.js.map +0 -1
  67. package/dist/src/sync/protocol.d.ts +0 -282
  68. package/dist/src/sync/protocol.d.ts.map +0 -1
  69. package/dist/src/sync/protocol.js +0 -16
  70. package/dist/src/sync/protocol.js.map +0 -1
  71. package/dist/src/sync/store-adapter.d.ts +0 -42
  72. package/dist/src/sync/store-adapter.d.ts.map +0 -1
  73. package/dist/src/sync/store-adapter.js +0 -232
  74. package/dist/src/sync/store-adapter.js.map +0 -1
  75. package/dist/src/sync/sync-manager-impl.d.ts +0 -91
  76. package/dist/src/sync/sync-manager-impl.d.ts.map +0 -1
  77. package/dist/src/sync/sync-manager-impl.js +0 -1123
  78. package/dist/src/sync/sync-manager-impl.js.map +0 -1
@@ -1,85 +0,0 @@
1
- /**
2
- * Factory function to create a sync-enabled store module.
3
- *
4
- * This wraps an existing store module (LevelDB or IndexedDB) with
5
- * CRDT sync capabilities.
6
- */
7
- import type { KVStore, StoreEventEmitter } from '@quereus/plugin-store';
8
- import type { TableSchema } from '@quereus/quereus';
9
- import { SyncEventEmitterImpl } from './sync/events.js';
10
- import { type SyncConfig, type ApplyToStoreCallback } from './sync/protocol.js';
11
- import type { SyncManager } from './sync/manager.js';
12
- /**
13
- * Function to get table schema by name.
14
- * Used to map column indices to column names for sync.
15
- */
16
- export type GetTableSchemaCallback = (schemaName: string, tableName: string) => TableSchema | undefined;
17
- /**
18
- * Result of creating a sync module.
19
- */
20
- export interface CreateSyncModuleResult {
21
- /** The sync manager for sync operations */
22
- syncManager: SyncManager;
23
- /** Event emitter for reactive UI integration */
24
- syncEvents: SyncEventEmitterImpl;
25
- }
26
- /**
27
- * Options for creating a sync module.
28
- */
29
- export interface CreateSyncModuleOptions extends Partial<SyncConfig> {
30
- /**
31
- * Callback for applying remote changes to the store.
32
- *
33
- * When provided, the SyncManager will call this to apply data and schema
34
- * changes from remote replicas. The store should emit events with
35
- * `remote: true` when this is called.
36
- *
37
- * If not provided, the SyncManager will only update CRDT metadata
38
- * and emit sync events, but will not modify actual data. The application
39
- * is responsible for applying changes separately.
40
- */
41
- applyToStore?: ApplyToStoreCallback;
42
- /**
43
- * Callback for getting table schema by name.
44
- *
45
- * When provided, the SyncManager uses this to get actual column names
46
- * for sync. This is required for proper column-level CRDT tracking.
47
- *
48
- * If not provided, column names will be derived from row indices (col_0,
49
- * col_1, etc.), which may not match across replicas if table schemas differ.
50
- */
51
- getTableSchema?: GetTableSchemaCallback;
52
- }
53
- /**
54
- * Create a sync-enabled module.
55
- *
56
- * This function:
57
- * 1. Creates a SyncManager that tracks CRDT metadata
58
- * 2. Subscribes to store events to record changes
59
- * 3. Returns the sync manager and event emitter for UI integration
60
- *
61
- * @param kv - The KV store to use for metadata storage
62
- * @param storeEvents - The store's event emitter
63
- * @param config - Optional sync configuration
64
- *
65
- * @example
66
- * ```typescript
67
- * import { LevelDBStore, StoreEventEmitter } from '@quereus/plugin-store';
68
- * import { createSyncModule } from '@quereus/plugin-sync';
69
- *
70
- * const storeEvents = new StoreEventEmitter();
71
- * const kv = await LevelDBStore.open({ path: './data' });
72
- *
73
- * const { syncManager, syncEvents } = await createSyncModule(kv, storeEvents);
74
- *
75
- * // Subscribe to sync events for UI
76
- * syncEvents.onRemoteChange((event) => {
77
- * console.log('Remote changes:', event.changes.length);
78
- * });
79
- *
80
- * // Use syncManager for sync operations
81
- * const changes = await syncManager.getChangesSince(peerSiteId, lastHLC);
82
- * ```
83
- */
84
- export declare function createSyncModule(kv: KVStore, storeEvents: StoreEventEmitter, options?: CreateSyncModuleOptions): Promise<CreateSyncModuleResult>;
85
- //# sourceMappingURL=create-sync-module.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-sync-module.d.ts","sourceRoot":"","sources":["../../src/create-sync-module.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAuB,KAAK,UAAU,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;AAExG;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,2CAA2C;IAC3C,WAAW,EAAE,WAAW,CAAC;IACzB,gDAAgD;IAChD,UAAU,EAAE,oBAAoB,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,OAAO,CAAC,UAAU,CAAC;IAClE;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,oBAAoB,CAAC;IAEpC;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC;CACzC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,OAAO,EACX,WAAW,EAAE,iBAAiB,EAC9B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,sBAAsB,CAAC,CAuBjC"}
@@ -1,54 +0,0 @@
1
- /**
2
- * Factory function to create a sync-enabled store module.
3
- *
4
- * This wraps an existing store module (LevelDB or IndexedDB) with
5
- * CRDT sync capabilities.
6
- */
7
- import { SyncManagerImpl } from './sync/sync-manager-impl.js';
8
- import { SyncEventEmitterImpl } from './sync/events.js';
9
- import { DEFAULT_SYNC_CONFIG } from './sync/protocol.js';
10
- /**
11
- * Create a sync-enabled module.
12
- *
13
- * This function:
14
- * 1. Creates a SyncManager that tracks CRDT metadata
15
- * 2. Subscribes to store events to record changes
16
- * 3. Returns the sync manager and event emitter for UI integration
17
- *
18
- * @param kv - The KV store to use for metadata storage
19
- * @param storeEvents - The store's event emitter
20
- * @param config - Optional sync configuration
21
- *
22
- * @example
23
- * ```typescript
24
- * import { LevelDBStore, StoreEventEmitter } from '@quereus/plugin-store';
25
- * import { createSyncModule } from '@quereus/plugin-sync';
26
- *
27
- * const storeEvents = new StoreEventEmitter();
28
- * const kv = await LevelDBStore.open({ path: './data' });
29
- *
30
- * const { syncManager, syncEvents } = await createSyncModule(kv, storeEvents);
31
- *
32
- * // Subscribe to sync events for UI
33
- * syncEvents.onRemoteChange((event) => {
34
- * console.log('Remote changes:', event.changes.length);
35
- * });
36
- *
37
- * // Use syncManager for sync operations
38
- * const changes = await syncManager.getChangesSince(peerSiteId, lastHLC);
39
- * ```
40
- */
41
- export async function createSyncModule(kv, storeEvents, options = {}) {
42
- const { applyToStore, getTableSchema, ...configOverrides } = options;
43
- const fullConfig = {
44
- ...DEFAULT_SYNC_CONFIG,
45
- ...configOverrides,
46
- };
47
- const syncEvents = new SyncEventEmitterImpl();
48
- const syncManager = await SyncManagerImpl.create(kv, storeEvents, fullConfig, syncEvents, applyToStore, getTableSchema);
49
- return {
50
- syncManager,
51
- syncEvents,
52
- };
53
- }
54
- //# sourceMappingURL=create-sync-module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-sync-module.js","sourceRoot":"","sources":["../../src/create-sync-module.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAA8C,MAAM,oBAAoB,CAAC;AAgDrG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAW,EACX,WAA8B,EAC9B,UAAmC,EAAE;IAErC,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,CAAC;IAErE,MAAM,UAAU,GAAe;QAC7B,GAAG,mBAAmB;QACtB,GAAG,eAAe;KACnB,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE9C,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,MAAM,CAC9C,EAAE,EACF,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,EACZ,cAAc,CACf,CAAC;IAEF,OAAO;QACL,WAAW;QACX,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -1,31 +0,0 @@
1
- /**
2
- * Sync Plugin for Quereus
3
- *
4
- * Provides multi-master CRDT replication with automatic conflict resolution.
5
- *
6
- * Features:
7
- * - Fully automatic: All tables are CRDT-enabled without opt-in
8
- * - Column-level LWW: Fine-grained conflict resolution
9
- * - Transport agnostic: Bring your own WebSocket/HTTP/WebRTC
10
- * - Reactive hooks: UI integration for real-time updates
11
- * - Offline-first: Works with local changes that sync later
12
- *
13
- * Usage:
14
- * import { createSyncModule } from '@quereus/plugin-sync';
15
- * import { LevelDBModule, StoreEventEmitter } from '@quereus/plugin-store';
16
- *
17
- * const storeEvents = new StoreEventEmitter();
18
- * const store = new LevelDBModule(storeEvents);
19
- * const { syncModule, syncManager, syncEvents } = createSyncModule(store, storeEvents);
20
- *
21
- * db.registerVtabModule('store', syncModule);
22
- */
23
- export { type HLC, HLCManager, compareHLC, hlcEquals, createHLC, serializeHLC, deserializeHLC, type SerializedHLC, hlcToJson, hlcFromJson, type SiteId, generateSiteId, siteIdToBase64, siteIdFromBase64, toBase64Url, fromBase64Url, siteIdEquals, type SiteIdentity, serializeSiteIdentity, deserializeSiteIdentity, SITE_ID_KEY, } from './clock/index.js';
24
- export { type ColumnChange, type RowDeletion, type Change, type SchemaMigrationType, type SchemaMigration, type ChangeSet, type ApplyResult, type ColumnVersionEntry, type TableSnapshot, type Snapshot, type PeerSyncState, type SnapshotChunkType, type SnapshotHeaderChunk, type SnapshotTableStartChunk, type SnapshotColumnVersionsChunk, type SnapshotTableEndChunk, type SnapshotSchemaMigrationChunk, type SnapshotFooterChunk, type SnapshotChunk, type SnapshotProgress, type ApplyToStoreOptions, type DataChangeToApply, type SchemaChangeToApply, type ApplyToStoreResult, type ApplyToStoreCallback, type SyncConfig, DEFAULT_SYNC_CONFIG, } from './sync/protocol.js';
25
- export { type SyncManager, type SnapshotCheckpoint } from './sync/manager.js';
26
- export { SyncManagerImpl } from './sync/sync-manager-impl.js';
27
- export { createStoreAdapter, type SyncStoreAdapterOptions } from './sync/store-adapter.js';
28
- export { createSyncModule, type CreateSyncModuleResult, type CreateSyncModuleOptions, type GetTableSchemaCallback, } from './create-sync-module.js';
29
- export { type RemoteChangeEvent, type LocalChangeEvent, type ConflictEvent, type SyncState, type Unsubscribe, type SyncEventEmitter, SyncEventEmitterImpl, } from './sync/events.js';
30
- export { SYNC_KEY_PREFIX, buildColumnVersionKey, buildTombstoneKey, buildTransactionKey, buildPeerStateKey, buildSchemaMigrationKey, buildColumnVersionScanBounds, buildTombstoneScanBounds, buildSchemaMigrationScanBounds, encodePK, decodePK, type ColumnVersion, ColumnVersionStore, serializeColumnVersion, deserializeColumnVersion, type Tombstone, TombstoneStore, serializeTombstone, deserializeTombstone, type PeerState, PeerStateStore, serializePeerState, deserializePeerState, type SchemaVersion, type SchemaVersionType, type SchemaChangeOperation, SchemaVersionStore, buildSchemaVersionKey, buildSchemaVersionScanBounds, buildAllSchemaVersionsScanBounds, serializeSchemaVersion, deserializeSchemaVersion, parseSchemaVersionKey, getDestructiveness, getOperationDestructiveness, shouldApplySchemaChangeByOperation, } from './metadata/index.js';
31
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAEL,KAAK,GAAG,EACR,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,YAAY,EACZ,cAAc,EAEd,KAAK,aAAa,EAClB,SAAS,EACT,WAAW,EAEX,KAAK,MAAM,EACX,cAAc,EAEd,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,KAAK,YAAY,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,MAAM,EAEX,KAAK,mBAAmB,EACxB,KAAK,eAAe,EAEpB,KAAK,SAAS,EAEd,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,aAAa,EAElB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EAErB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAEzB,KAAK,UAAU,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAG3F,OAAO,EACL,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,GAC5B,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAEL,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,4BAA4B,EAC5B,wBAAwB,EACxB,8BAA8B,EAC9B,QAAQ,EACR,QAAQ,EAER,KAAK,aAAa,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,EAExB,KAAK,SAAS,EACd,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EAEpB,KAAK,SAAS,EACd,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EAEpB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,kBAAkB,EAClB,qBAAqB,EACrB,4BAA4B,EAC5B,gCAAgC,EAChC,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EAErB,kBAAkB,EAClB,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,qBAAqB,CAAC"}
package/dist/src/index.js DELETED
@@ -1,42 +0,0 @@
1
- /**
2
- * Sync Plugin for Quereus
3
- *
4
- * Provides multi-master CRDT replication with automatic conflict resolution.
5
- *
6
- * Features:
7
- * - Fully automatic: All tables are CRDT-enabled without opt-in
8
- * - Column-level LWW: Fine-grained conflict resolution
9
- * - Transport agnostic: Bring your own WebSocket/HTTP/WebRTC
10
- * - Reactive hooks: UI integration for real-time updates
11
- * - Offline-first: Works with local changes that sync later
12
- *
13
- * Usage:
14
- * import { createSyncModule } from '@quereus/plugin-sync';
15
- * import { LevelDBModule, StoreEventEmitter } from '@quereus/plugin-store';
16
- *
17
- * const storeEvents = new StoreEventEmitter();
18
- * const store = new LevelDBModule(storeEvents);
19
- * const { syncModule, syncManager, syncEvents } = createSyncModule(store, storeEvents);
20
- *
21
- * db.registerVtabModule('store', syncModule);
22
- */
23
- // Clock module
24
- export { HLCManager, compareHLC, hlcEquals, createHLC, serializeHLC, deserializeHLC, hlcToJson, hlcFromJson, generateSiteId,
25
- // Base64url encoding
26
- siteIdToBase64, siteIdFromBase64, toBase64Url, fromBase64Url, siteIdEquals, serializeSiteIdentity, deserializeSiteIdentity, SITE_ID_KEY, } from './clock/index.js';
27
- // Sync protocol types
28
- export { DEFAULT_SYNC_CONFIG, } from './sync/protocol.js';
29
- export { SyncManagerImpl } from './sync/sync-manager-impl.js';
30
- // Store adapter for applying remote changes
31
- export { createStoreAdapter } from './sync/store-adapter.js';
32
- // Factory function
33
- export { createSyncModule, } from './create-sync-module.js';
34
- // Reactive events
35
- export { SyncEventEmitterImpl, } from './sync/events.js';
36
- // Metadata storage
37
- export {
38
- // Key builders
39
- SYNC_KEY_PREFIX, buildColumnVersionKey, buildTombstoneKey, buildTransactionKey, buildPeerStateKey, buildSchemaMigrationKey, buildColumnVersionScanBounds, buildTombstoneScanBounds, buildSchemaMigrationScanBounds, encodePK, decodePK, ColumnVersionStore, serializeColumnVersion, deserializeColumnVersion, TombstoneStore, serializeTombstone, deserializeTombstone, PeerStateStore, serializePeerState, deserializePeerState, SchemaVersionStore, buildSchemaVersionKey, buildSchemaVersionScanBounds, buildAllSchemaVersionsScanBounds, serializeSchemaVersion, deserializeSchemaVersion, parseSchemaVersionKey,
40
- // Most destructive wins
41
- getDestructiveness, getOperationDestructiveness, shouldApplySchemaChangeByOperation, } from './metadata/index.js';
42
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,eAAe;AACf,OAAO,EAGL,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,YAAY,EACZ,cAAc,EAGd,SAAS,EACT,WAAW,EAGX,cAAc;AACd,qBAAqB;AACrB,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EAEZ,qBAAqB,EACrB,uBAAuB,EACvB,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAE1B,sBAAsB;AACtB,OAAO,EAkCL,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,4CAA4C;AAC5C,OAAO,EAAE,kBAAkB,EAAgC,MAAM,yBAAyB,CAAC;AAE3F,mBAAmB;AACnB,OAAO,EACL,gBAAgB,GAIjB,MAAM,yBAAyB,CAAC;AAEjC,kBAAkB;AAClB,OAAO,EAOL,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,mBAAmB;AACnB,OAAO;AACL,eAAe;AACf,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,4BAA4B,EAC5B,wBAAwB,EACxB,8BAA8B,EAC9B,QAAQ,EACR,QAAQ,EAGR,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,EAGxB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EAGpB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EAKpB,kBAAkB,EAClB,qBAAqB,EACrB,4BAA4B,EAC5B,gCAAgC,EAChC,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB;AACrB,wBAAwB;AACxB,kBAAkB,EAClB,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,qBAAqB,CAAC"}
@@ -1,67 +0,0 @@
1
- /**
2
- * HLC-indexed change log for efficient delta sync.
3
- *
4
- * The change log stores references to changes indexed by HLC timestamp,
5
- * enabling efficient getChangesSince() queries without scanning all data.
6
- */
7
- import type { KVStore, WriteBatch } from '@quereus/plugin-store';
8
- import type { SqlValue } from '@quereus/quereus';
9
- import type { HLC } from '../clock/hlc.js';
10
- import { type ChangeLogEntryType } from './keys.js';
11
- /**
12
- * Change log entry stored in KV.
13
- */
14
- export interface ChangeLogEntry {
15
- readonly hlc: HLC;
16
- readonly entryType: ChangeLogEntryType;
17
- readonly schema: string;
18
- readonly table: string;
19
- readonly pk: SqlValue[];
20
- readonly column?: string;
21
- }
22
- /**
23
- * Change log store for HLC-indexed change tracking.
24
- *
25
- * Each mutation (column update or row deletion) creates an entry in the
26
- * change log, keyed by HLC. This allows efficient range scans to find
27
- * all changes since a given timestamp.
28
- */
29
- export declare class ChangeLogStore {
30
- private readonly kv;
31
- constructor(kv: KVStore);
32
- /**
33
- * Record a column change in the change log.
34
- */
35
- recordColumnChange(hlc: HLC, schema: string, table: string, pk: SqlValue[], column: string): Promise<void>;
36
- /**
37
- * Record a column change in a batch.
38
- */
39
- recordColumnChangeBatch(batch: WriteBatch, hlc: HLC, schema: string, table: string, pk: SqlValue[], column: string): void;
40
- /**
41
- * Record a row deletion in the change log.
42
- */
43
- recordDeletion(hlc: HLC, schema: string, table: string, pk: SqlValue[]): Promise<void>;
44
- /**
45
- * Record a row deletion in a batch.
46
- */
47
- recordDeletionBatch(batch: WriteBatch, hlc: HLC, schema: string, table: string, pk: SqlValue[]): void;
48
- /**
49
- * Get all change log entries after a given HLC.
50
- * Returns entries in HLC order (oldest first).
51
- */
52
- getChangesSince(sinceHLC: HLC): AsyncIterable<ChangeLogEntry>;
53
- /**
54
- * Get all change log entries.
55
- */
56
- getAllChanges(): AsyncIterable<ChangeLogEntry>;
57
- /**
58
- * Delete change log entries up to a given HLC.
59
- * Used for pruning old entries after they've been synced to all peers.
60
- */
61
- pruneEntriesBefore(beforeHLC: HLC): Promise<number>;
62
- /**
63
- * Delete a specific change log entry (used during snapshot application).
64
- */
65
- deleteEntryBatch(batch: WriteBatch, hlc: HLC, entryType: ChangeLogEntryType, schema: string, table: string, pk: SqlValue[], column?: string): void;
66
- }
67
- //# sourceMappingURL=change-log.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"change-log.d.ts","sourceRoot":"","sources":["../../../src/metadata/change-log.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,WAAW,CAAC;AAEnB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,OAAO;IAExC;;OAEG;IACG,kBAAkB,CACtB,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,QAAQ,EAAE,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAMhB;;OAEG;IACH,uBAAuB,CACrB,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,QAAQ,EAAE,EACd,MAAM,EAAE,MAAM,GACb,IAAI;IAKP;;OAEG;IACG,cAAc,CAClB,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,QAAQ,EAAE,GACb,OAAO,CAAC,IAAI,CAAC;IAKhB;;OAEG;IACH,mBAAmB,CACjB,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,QAAQ,EAAE,GACb,IAAI;IAKP;;;OAGG;IACI,eAAe,CAAC,QAAQ,EAAE,GAAG,GAAG,aAAa,CAAC,cAAc,CAAC;IAUpE;;OAEG;IACI,aAAa,IAAI,aAAa,CAAC,cAAc,CAAC;IAUrD;;;OAGG;IACG,kBAAkB,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBzD;;OAEG;IACH,gBAAgB,CACd,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,kBAAkB,EAC7B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,QAAQ,EAAE,EACd,MAAM,CAAC,EAAE,MAAM,GACd,IAAI;CAIR"}
@@ -1,107 +0,0 @@
1
- /**
2
- * HLC-indexed change log for efficient delta sync.
3
- *
4
- * The change log stores references to changes indexed by HLC timestamp,
5
- * enabling efficient getChangesSince() queries without scanning all data.
6
- */
7
- import { buildChangeLogKey, buildChangeLogScanBoundsAfter, buildAllChangeLogScanBounds, parseChangeLogKey, } from './keys.js';
8
- /**
9
- * Change log store for HLC-indexed change tracking.
10
- *
11
- * Each mutation (column update or row deletion) creates an entry in the
12
- * change log, keyed by HLC. This allows efficient range scans to find
13
- * all changes since a given timestamp.
14
- */
15
- export class ChangeLogStore {
16
- kv;
17
- constructor(kv) {
18
- this.kv = kv;
19
- }
20
- /**
21
- * Record a column change in the change log.
22
- */
23
- async recordColumnChange(hlc, schema, table, pk, column) {
24
- const key = buildChangeLogKey(hlc, 'column', schema, table, pk, column);
25
- // Value is empty - all info is in the key
26
- await this.kv.put(key, new Uint8Array(0));
27
- }
28
- /**
29
- * Record a column change in a batch.
30
- */
31
- recordColumnChangeBatch(batch, hlc, schema, table, pk, column) {
32
- const key = buildChangeLogKey(hlc, 'column', schema, table, pk, column);
33
- batch.put(key, new Uint8Array(0));
34
- }
35
- /**
36
- * Record a row deletion in the change log.
37
- */
38
- async recordDeletion(hlc, schema, table, pk) {
39
- const key = buildChangeLogKey(hlc, 'delete', schema, table, pk);
40
- await this.kv.put(key, new Uint8Array(0));
41
- }
42
- /**
43
- * Record a row deletion in a batch.
44
- */
45
- recordDeletionBatch(batch, hlc, schema, table, pk) {
46
- const key = buildChangeLogKey(hlc, 'delete', schema, table, pk);
47
- batch.put(key, new Uint8Array(0));
48
- }
49
- /**
50
- * Get all change log entries after a given HLC.
51
- * Returns entries in HLC order (oldest first).
52
- */
53
- async *getChangesSince(sinceHLC) {
54
- const bounds = buildChangeLogScanBoundsAfter(sinceHLC);
55
- for await (const entry of this.kv.iterate(bounds)) {
56
- const parsed = parseChangeLogKey(entry.key);
57
- if (parsed) {
58
- yield parsed;
59
- }
60
- }
61
- }
62
- /**
63
- * Get all change log entries.
64
- */
65
- async *getAllChanges() {
66
- const bounds = buildAllChangeLogScanBounds();
67
- for await (const entry of this.kv.iterate(bounds)) {
68
- const parsed = parseChangeLogKey(entry.key);
69
- if (parsed) {
70
- yield parsed;
71
- }
72
- }
73
- }
74
- /**
75
- * Delete change log entries up to a given HLC.
76
- * Used for pruning old entries after they've been synced to all peers.
77
- */
78
- async pruneEntriesBefore(beforeHLC) {
79
- const bounds = buildAllChangeLogScanBounds();
80
- const batch = this.kv.batch();
81
- let count = 0;
82
- for await (const entry of this.kv.iterate(bounds)) {
83
- const parsed = parseChangeLogKey(entry.key);
84
- if (!parsed)
85
- continue;
86
- // Compare HLCs - stop when we reach entries >= beforeHLC
87
- if (parsed.hlc.wallTime > beforeHLC.wallTime)
88
- break;
89
- if (parsed.hlc.wallTime === beforeHLC.wallTime) {
90
- if (parsed.hlc.counter >= beforeHLC.counter)
91
- break;
92
- }
93
- batch.delete(entry.key);
94
- count++;
95
- }
96
- await batch.write();
97
- return count;
98
- }
99
- /**
100
- * Delete a specific change log entry (used during snapshot application).
101
- */
102
- deleteEntryBatch(batch, hlc, entryType, schema, table, pk, column) {
103
- const key = buildChangeLogKey(hlc, entryType, schema, table, pk, column);
104
- batch.delete(key);
105
- }
106
- }
107
- //# sourceMappingURL=change-log.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"change-log.js","sourceRoot":"","sources":["../../../src/metadata/change-log.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EACL,iBAAiB,EACjB,6BAA6B,EAC7B,2BAA2B,EAC3B,iBAAiB,GAElB,MAAM,WAAW,CAAC;AAcnB;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,EAAW;QAAX,OAAE,GAAF,EAAE,CAAS;IAAG,CAAC;IAE5C;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACtB,GAAQ,EACR,MAAc,EACd,KAAa,EACb,EAAc,EACd,MAAc;QAEd,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACxE,0CAA0C;QAC1C,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,uBAAuB,CACrB,KAAiB,EACjB,GAAQ,EACR,MAAc,EACd,KAAa,EACb,EAAc,EACd,MAAc;QAEd,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACxE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,GAAQ,EACR,MAAc,EACd,KAAa,EACb,EAAc;QAEd,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAChE,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,mBAAmB,CACjB,KAAiB,EACjB,GAAQ,EACR,MAAc,EACd,KAAa,EACb,EAAc;QAEd,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAChE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,CAAC,eAAe,CAAC,QAAa;QAClC,MAAM,MAAM,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,MAAM,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAC,aAAa;QAClB,MAAM,MAAM,GAAG,2BAA2B,EAAE,CAAC;QAC7C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,MAAM,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,kBAAkB,CAAC,SAAc;QACrC,MAAM,MAAM,GAAG,2BAA2B,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM;gBAAE,SAAS;YAEtB,yDAAyD;YACzD,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ;gBAAE,MAAM;YACpD,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,EAAE,CAAC;gBAC/C,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO;oBAAE,MAAM;YACrD,CAAC;YAED,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxB,KAAK,EAAE,CAAC;QACV,CAAC;QAED,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,gBAAgB,CACd,KAAiB,EACjB,GAAQ,EACR,SAA6B,EAC7B,MAAc,EACd,KAAa,EACb,EAAc,EACd,MAAe;QAEf,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACzE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;CACF"}
@@ -1,58 +0,0 @@
1
- /**
2
- * Column version tracking for LWW conflict resolution.
3
- *
4
- * Each column of each row has an associated HLC timestamp.
5
- * When merging changes, the column with the higher HLC wins.
6
- */
7
- import type { SqlValue } from '@quereus/quereus';
8
- import type { KVStore, WriteBatch } from '@quereus/plugin-store';
9
- import { type HLC } from '../clock/hlc.js';
10
- /**
11
- * Column version record stored in the KV store.
12
- */
13
- export interface ColumnVersion {
14
- hlc: HLC;
15
- value: SqlValue;
16
- }
17
- /**
18
- * Serialize a column version for storage.
19
- * Format: 26 bytes HLC + JSON value
20
- */
21
- export declare function serializeColumnVersion(cv: ColumnVersion): Uint8Array;
22
- /**
23
- * Deserialize a column version from storage.
24
- */
25
- export declare function deserializeColumnVersion(buffer: Uint8Array): ColumnVersion;
26
- /**
27
- * Column version store operations.
28
- */
29
- export declare class ColumnVersionStore {
30
- private readonly kv;
31
- constructor(kv: KVStore);
32
- /**
33
- * Get the version of a specific column.
34
- */
35
- getColumnVersion(schemaName: string, tableName: string, pk: SqlValue[], column: string): Promise<ColumnVersion | undefined>;
36
- /**
37
- * Set the version of a specific column.
38
- */
39
- setColumnVersion(schemaName: string, tableName: string, pk: SqlValue[], column: string, version: ColumnVersion): Promise<void>;
40
- /**
41
- * Set column version in a batch.
42
- */
43
- setColumnVersionBatch(batch: WriteBatch, schemaName: string, tableName: string, pk: SqlValue[], column: string, version: ColumnVersion): void;
44
- /**
45
- * Get all column versions for a row.
46
- */
47
- getRowVersions(schemaName: string, tableName: string, pk: SqlValue[]): Promise<Map<string, ColumnVersion>>;
48
- /**
49
- * Delete all column versions for a row.
50
- */
51
- deleteRowVersions(schemaName: string, tableName: string, pk: SqlValue[]): Promise<void>;
52
- /**
53
- * Check if a column write should be applied (LWW comparison).
54
- * Returns true if the incoming HLC is newer than the current version.
55
- */
56
- shouldApplyWrite(schemaName: string, tableName: string, pk: SqlValue[], column: string, incomingHLC: HLC): Promise<boolean>;
57
- }
58
- //# sourceMappingURL=column-version.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"column-version.d.ts","sourceRoot":"","sources":["../../../src/metadata/column-version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,KAAK,GAAG,EAA4C,MAAM,iBAAiB,CAAC;AAGrF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,aAAa,GAAG,UAAU,CASpE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,CAK1E;AAED;;GAEG;AACH,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,OAAO;IAExC;;OAEG;IACG,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,QAAQ,EAAE,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAOrC;;OAEG;IACG,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,QAAQ,EAAE,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC;IAKhB;;OAEG;IACH,qBAAqB,CACnB,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,QAAQ,EAAE,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,GACrB,IAAI;IAKP;;OAEG;IACG,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,QAAQ,EAAE,GACb,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAgBtC;;OAEG;IACG,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,QAAQ,EAAE,GACb,OAAO,CAAC,IAAI,CAAC;IAWhB;;;OAGG;IACG,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,QAAQ,EAAE,EACd,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,GAAG,GACf,OAAO,CAAC,OAAO,CAAC;CAKpB"}
@@ -1,100 +0,0 @@
1
- /**
2
- * Column version tracking for LWW conflict resolution.
3
- *
4
- * Each column of each row has an associated HLC timestamp.
5
- * When merging changes, the column with the higher HLC wins.
6
- */
7
- import { serializeHLC, deserializeHLC, compareHLC } from '../clock/hlc.js';
8
- import { buildColumnVersionKey, buildColumnVersionScanBounds } from './keys.js';
9
- /**
10
- * Serialize a column version for storage.
11
- * Format: 26 bytes HLC + JSON value
12
- */
13
- export function serializeColumnVersion(cv) {
14
- const hlcBytes = serializeHLC(cv.hlc);
15
- const valueJson = JSON.stringify(cv.value);
16
- const valueBytes = new TextEncoder().encode(valueJson);
17
- const result = new Uint8Array(hlcBytes.length + valueBytes.length);
18
- result.set(hlcBytes, 0);
19
- result.set(valueBytes, hlcBytes.length);
20
- return result;
21
- }
22
- /**
23
- * Deserialize a column version from storage.
24
- */
25
- export function deserializeColumnVersion(buffer) {
26
- const hlc = deserializeHLC(buffer.slice(0, 26));
27
- const valueJson = new TextDecoder().decode(buffer.slice(26));
28
- const value = JSON.parse(valueJson);
29
- return { hlc, value };
30
- }
31
- /**
32
- * Column version store operations.
33
- */
34
- export class ColumnVersionStore {
35
- kv;
36
- constructor(kv) {
37
- this.kv = kv;
38
- }
39
- /**
40
- * Get the version of a specific column.
41
- */
42
- async getColumnVersion(schemaName, tableName, pk, column) {
43
- const key = buildColumnVersionKey(schemaName, tableName, pk, column);
44
- const data = await this.kv.get(key);
45
- if (!data)
46
- return undefined;
47
- return deserializeColumnVersion(data);
48
- }
49
- /**
50
- * Set the version of a specific column.
51
- */
52
- async setColumnVersion(schemaName, tableName, pk, column, version) {
53
- const key = buildColumnVersionKey(schemaName, tableName, pk, column);
54
- await this.kv.put(key, serializeColumnVersion(version));
55
- }
56
- /**
57
- * Set column version in a batch.
58
- */
59
- setColumnVersionBatch(batch, schemaName, tableName, pk, column, version) {
60
- const key = buildColumnVersionKey(schemaName, tableName, pk, column);
61
- batch.put(key, serializeColumnVersion(version));
62
- }
63
- /**
64
- * Get all column versions for a row.
65
- */
66
- async getRowVersions(schemaName, tableName, pk) {
67
- const bounds = buildColumnVersionScanBounds(schemaName, tableName, pk);
68
- const versions = new Map();
69
- for await (const entry of this.kv.iterate(bounds)) {
70
- // Extract column name from key
71
- const keyStr = new TextDecoder().decode(entry.key);
72
- const lastColon = keyStr.lastIndexOf(':');
73
- const column = keyStr.slice(lastColon + 1);
74
- versions.set(column, deserializeColumnVersion(entry.value));
75
- }
76
- return versions;
77
- }
78
- /**
79
- * Delete all column versions for a row.
80
- */
81
- async deleteRowVersions(schemaName, tableName, pk) {
82
- const bounds = buildColumnVersionScanBounds(schemaName, tableName, pk);
83
- const batch = this.kv.batch();
84
- for await (const entry of this.kv.iterate(bounds)) {
85
- batch.delete(entry.key);
86
- }
87
- await batch.write();
88
- }
89
- /**
90
- * Check if a column write should be applied (LWW comparison).
91
- * Returns true if the incoming HLC is newer than the current version.
92
- */
93
- async shouldApplyWrite(schemaName, tableName, pk, column, incomingHLC) {
94
- const current = await this.getColumnVersion(schemaName, tableName, pk, column);
95
- if (!current)
96
- return true;
97
- return compareHLC(incomingHLC, current.hlc) > 0;
98
- }
99
- }
100
- //# sourceMappingURL=column-version.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"column-version.js","sourceRoot":"","sources":["../../../src/metadata/column-version.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Metadata module exports.
3
- */
4
- export * from './keys.js';
5
- export * from './column-version.js';
6
- export * from './tombstones.js';
7
- export * from './peer-state.js';
8
- export * from './schema-migration.js';
9
- export * from './schema-version.js';
10
- export * from './change-log.js';
11
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Metadata module exports.
3
- */
4
- export * from './keys.js';
5
- export * from './column-version.js';
6
- export * from './tombstones.js';
7
- export * from './peer-state.js';
8
- export * from './schema-migration.js';
9
- export * from './schema-version.js';
10
- export * from './change-log.js';
11
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
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"}