@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,232 +0,0 @@
1
- /**
2
- * Store adapter for applying remote sync changes.
3
- *
4
- * This module provides adapters that implement the ApplyToStoreCallback
5
- * interface for LevelDB and IndexedDB stores, enabling the SyncManager
6
- * to apply remote changes to the actual data store.
7
- */
8
- import { buildDataKey, serializeRow, deserializeRow } from '@quereus/plugin-store';
9
- /**
10
- * Creates an ApplyToStoreCallback for applying remote sync changes.
11
- *
12
- * This adapter handles:
13
- * - UPSERT semantics for column changes (insert if row doesn't exist, update if it does)
14
- * - Row deletions by primary key
15
- * - DDL execution for schema changes
16
- *
17
- * All data change events are emitted with `remote: true` to prevent
18
- * the SyncManager from re-recording CRDT metadata.
19
- */
20
- export function createStoreAdapter(options) {
21
- const { db, getKVStore, events, getTableSchema, collation = 'NOCASE' } = options;
22
- return async (dataChanges, schemaChanges, applyOptions) => {
23
- const result = {
24
- dataChangesApplied: 0,
25
- schemaChangesApplied: 0,
26
- errors: [],
27
- };
28
- // Apply schema changes first (DDL before DML)
29
- for (const schemaChange of schemaChanges) {
30
- try {
31
- await applySchemaChange(db, events, schemaChange, applyOptions);
32
- result.schemaChangesApplied++;
33
- }
34
- catch (error) {
35
- result.errors.push({
36
- change: schemaChange,
37
- error: error instanceof Error ? error : new Error(String(error)),
38
- });
39
- }
40
- }
41
- // Group data changes by table for efficient batch operations
42
- // Each table may have its own KV store (especially in IndexedDB)
43
- const changesByTable = groupChangesByTable(dataChanges);
44
- // Apply data changes per table
45
- for (const [tableKey, tableChanges] of changesByTable) {
46
- const [schemaName, tableName] = tableKey.split('.');
47
- try {
48
- // Get the correct KV store for this table
49
- const kv = await getKVStore(schemaName, tableName);
50
- // Group by row within the table
51
- const changesByRow = groupChangesByRow(tableChanges);
52
- for (const [rowKey, rowChanges] of changesByRow) {
53
- await applyRowChanges(kv, events, getTableSchema, collation, rowKey, rowChanges, applyOptions);
54
- result.dataChangesApplied += rowChanges.length;
55
- }
56
- }
57
- catch (error) {
58
- for (const change of tableChanges) {
59
- result.errors.push({
60
- change,
61
- error: error instanceof Error ? error : new Error(String(error)),
62
- });
63
- }
64
- }
65
- }
66
- return result;
67
- };
68
- }
69
- /**
70
- * Group data changes by table (schema.table).
71
- */
72
- function groupChangesByTable(changes) {
73
- const grouped = new Map();
74
- for (const change of changes) {
75
- const tableKey = `${change.schema}.${change.table}`;
76
- const existing = grouped.get(tableKey);
77
- if (existing) {
78
- existing.push(change);
79
- }
80
- else {
81
- grouped.set(tableKey, [change]);
82
- }
83
- }
84
- return grouped;
85
- }
86
- /**
87
- * Group data changes by row (schema.table:pk).
88
- */
89
- function groupChangesByRow(changes) {
90
- const grouped = new Map();
91
- for (const change of changes) {
92
- const rowKey = `${change.schema}.${change.table}:${JSON.stringify(change.pk)}`;
93
- const existing = grouped.get(rowKey);
94
- if (existing) {
95
- existing.push(change);
96
- }
97
- else {
98
- grouped.set(rowKey, [change]);
99
- }
100
- }
101
- return grouped;
102
- }
103
- /**
104
- * Apply schema changes (DDL) to the database.
105
- */
106
- async function applySchemaChange(db, events, change, _options) {
107
- // Determine the event signature
108
- const eventType = change.type.startsWith('drop') ? 'drop' : change.type.startsWith('create') ? 'create' : 'alter';
109
- const objectType = change.type.includes('table') ? 'table' : 'index';
110
- // Register this as an expected remote event BEFORE executing DDL.
111
- // When IndexedDBModule.create() emits the event, it will be automatically
112
- // marked as remote, so SyncManager won't re-record it.
113
- // This approach avoids race conditions with concurrent local DDL.
114
- events.expectRemoteSchemaEvent({
115
- type: eventType,
116
- objectType,
117
- schemaName: change.schema,
118
- objectName: change.table,
119
- });
120
- try {
121
- // Execute the DDL statement
122
- // The module will emit a schema event, which will be marked as remote
123
- await db.exec(change.ddl);
124
- }
125
- catch (e) {
126
- // Clear the expectation if DDL failed
127
- events.clearExpectedRemoteSchemaEvent({
128
- type: eventType,
129
- objectType,
130
- schemaName: change.schema,
131
- objectName: change.table,
132
- });
133
- throw e;
134
- }
135
- // Note: We don't emit a separate event here anymore.
136
- // The module's event is automatically marked as remote.
137
- }
138
- /**
139
- * Apply data changes for a single row.
140
- */
141
- async function applyRowChanges(kv, events, getTableSchema, collation, _rowKey, changes, _options) {
142
- // All changes in the group should be for the same row
143
- const firstChange = changes[0];
144
- const { schema, table, pk } = firstChange;
145
- const tableSchema = getTableSchema(schema, table);
146
- if (!tableSchema) {
147
- throw new Error(`Table schema not found: ${schema}.${table}`);
148
- }
149
- const encodeOptions = { collation };
150
- const dataKey = buildDataKey(schema, table, pk, encodeOptions);
151
- // Check for delete operations first
152
- const deleteChange = changes.find(c => c.type === 'delete');
153
- if (deleteChange) {
154
- await applyDelete(kv, events, tableSchema, dataKey, pk);
155
- return;
156
- }
157
- // Apply column updates (UPSERT semantics)
158
- await applyColumnUpdates(kv, events, tableSchema, dataKey, pk, changes, { serializeRow, deserializeRow });
159
- }
160
- /**
161
- * Apply a delete operation for a row.
162
- */
163
- async function applyDelete(kv, events, tableSchema, dataKey, pk) {
164
- await kv.delete(dataKey);
165
- // Emit data change event with remote flag
166
- events.emitDataChange({
167
- type: 'delete',
168
- schemaName: tableSchema.schemaName,
169
- tableName: tableSchema.name,
170
- key: pk,
171
- remote: true,
172
- });
173
- }
174
- /**
175
- * Apply column updates with UPSERT semantics.
176
- */
177
- async function applyColumnUpdates(kv, events, tableSchema, dataKey, pk, changes, serialization) {
178
- const { serializeRow, deserializeRow } = serialization;
179
- // Read existing row if any
180
- const existingData = await kv.get(dataKey);
181
- let row;
182
- let isInsert = false;
183
- if (existingData) {
184
- row = deserializeRow(existingData);
185
- }
186
- else {
187
- // Create new row with nulls
188
- row = new Array(tableSchema.columns.length).fill(null);
189
- // Set PK values
190
- for (let i = 0; i < tableSchema.primaryKeyDefinition.length; i++) {
191
- const pkDef = tableSchema.primaryKeyDefinition[i];
192
- row[pkDef.index] = pk[i];
193
- }
194
- isInsert = true;
195
- }
196
- // Apply column changes from all changes
197
- const changedColumns = [];
198
- for (const change of changes) {
199
- if (change.columns) {
200
- for (const [colName, value] of Object.entries(change.columns)) {
201
- const colIndex = tableSchema.columnIndexMap.get(colName.toLowerCase());
202
- if (colIndex !== undefined) {
203
- row[colIndex] = value;
204
- changedColumns.push(colName);
205
- }
206
- else {
207
- // Column name not found in schema - this could be a sync bug
208
- console.warn(`[Sync] Column '${colName}' not found in ${tableSchema.schemaName}.${tableSchema.name}. ` +
209
- `Available columns: ${[...tableSchema.columnIndexMap.keys()].join(', ')}`);
210
- }
211
- }
212
- }
213
- }
214
- // Check if any columns were actually applied
215
- if (changedColumns.length === 0 && !isInsert) {
216
- console.warn(`[Sync] No columns were applied for ${tableSchema.schemaName}.${tableSchema.name} pk=${JSON.stringify(pk)}. ` +
217
- `This may indicate a column name mismatch between source and destination.`);
218
- }
219
- // Write updated row
220
- await kv.put(dataKey, serializeRow(row));
221
- // Emit data change event with remote flag
222
- events.emitDataChange({
223
- type: isInsert ? 'insert' : 'update',
224
- schemaName: tableSchema.schemaName,
225
- tableName: tableSchema.name,
226
- key: pk,
227
- newRow: row,
228
- changedColumns: isInsert ? undefined : changedColumns,
229
- remote: true,
230
- });
231
- }
232
- //# sourceMappingURL=store-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store-adapter.js","sourceRoot":"","sources":["../../../src/sync/store-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,91 +0,0 @@
1
- /**
2
- * SyncManager implementation.
3
- *
4
- * Coordinates CRDT metadata tracking and sync operations.
5
- */
6
- import type { KVStore, StoreEventEmitter } from '@quereus/plugin-store';
7
- import type { TableSchema } from '@quereus/quereus';
8
- /**
9
- * Callback to get table schema by name.
10
- * Used to map column indices to actual column names.
11
- */
12
- export type GetTableSchemaCallback = (schemaName: string, tableName: string) => TableSchema | undefined;
13
- import { type HLC } from '../clock/hlc.js';
14
- import { type SiteId } from '../clock/site.js';
15
- import type { SyncManager, SnapshotCheckpoint } from './manager.js';
16
- import type { SyncConfig, ChangeSet, ApplyResult, Snapshot, SnapshotChunk, SnapshotProgress, ApplyToStoreCallback } from './protocol.js';
17
- import { SyncEventEmitterImpl } from './events.js';
18
- /**
19
- * Implementation of SyncManager.
20
- */
21
- export declare class SyncManagerImpl implements SyncManager {
22
- private readonly kv;
23
- private readonly config;
24
- private readonly hlcManager;
25
- private readonly columnVersions;
26
- private readonly tombstones;
27
- private readonly peerStates;
28
- private readonly changeLog;
29
- private readonly schemaMigrations;
30
- private readonly syncEvents;
31
- private readonly applyToStore?;
32
- private readonly getTableSchema?;
33
- private pendingChanges;
34
- private currentTransactionId;
35
- private constructor();
36
- /**
37
- * Create a new SyncManager, initializing or loading site identity.
38
- *
39
- * @param kv - KV store for sync metadata
40
- * @param storeEvents - Store event emitter to subscribe to local changes
41
- * @param config - Sync configuration
42
- * @param syncEvents - Sync event emitter for UI integration
43
- * @param applyToStore - Optional callback for applying remote changes to the store
44
- * @param getTableSchema - Optional callback for getting table schema by name
45
- */
46
- static create(kv: KVStore, storeEvents: StoreEventEmitter, config: SyncConfig, syncEvents: SyncEventEmitterImpl, applyToStore?: ApplyToStoreCallback, getTableSchema?: GetTableSchemaCallback): Promise<SyncManagerImpl>;
47
- getSiteId(): SiteId;
48
- getCurrentHLC(): HLC;
49
- /**
50
- * Handle a data change event from the store.
51
- * Records CRDT metadata for the change.
52
- * Skips remote events to prevent duplicate recording.
53
- */
54
- private handleDataChange;
55
- /**
56
- * Handle a schema change event from the store.
57
- * Records schema migrations for sync.
58
- * Skips remote events to prevent duplicate recording.
59
- */
60
- private handleSchemaChange;
61
- private recordColumnVersions;
62
- private persistHLCState;
63
- getChangesSince(peerSiteId: SiteId, sinceHLC?: HLC): Promise<ChangeSet[]>;
64
- /**
65
- * Fallback: collect all changes when no sinceHLC is provided.
66
- */
67
- private collectAllChanges;
68
- applyChanges(changes: ChangeSet[]): Promise<ApplyResult>;
69
- /**
70
- * Resolve CRDT conflicts and record metadata for a change.
71
- * Returns outcome and the data change to apply (if any).
72
- */
73
- private resolveAndRecordChange;
74
- canDeltaSync(peerSiteId: SiteId, sinceHLC: HLC): Promise<boolean>;
75
- getSnapshot(): Promise<Snapshot>;
76
- applySnapshot(snapshot: Snapshot): Promise<void>;
77
- updatePeerSyncState(peerSiteId: SiteId, hlc: HLC): Promise<void>;
78
- getPeerSyncState(peerSiteId: SiteId): Promise<HLC | undefined>;
79
- pruneTombstones(): Promise<number>;
80
- /**
81
- * Get the sync event emitter for UI integration.
82
- */
83
- getEventEmitter(): SyncEventEmitterImpl;
84
- getSnapshotStream(chunkSize?: number): AsyncIterable<SnapshotChunk>;
85
- applySnapshotStream(chunks: AsyncIterable<SnapshotChunk>, onProgress?: (progress: SnapshotProgress) => void): Promise<void>;
86
- getSnapshotCheckpoint(snapshotId: string): Promise<SnapshotCheckpoint | undefined>;
87
- private saveSnapshotCheckpoint;
88
- private clearSnapshotCheckpoint;
89
- resumeSnapshotStream(checkpoint: SnapshotCheckpoint): AsyncIterable<SnapshotChunk>;
90
- }
91
- //# sourceMappingURL=sync-manager-impl.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-manager-impl.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-manager-impl.ts"],"names":[],"mappings":"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"}