@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.
- package/README.md +2 -1
- package/package.json +4 -4
- package/dist/src/clock/hlc.d.ts +0 -105
- package/dist/src/clock/hlc.d.ts.map +0 -1
- package/dist/src/clock/hlc.js +0 -251
- package/dist/src/clock/hlc.js.map +0 -1
- package/dist/src/clock/index.d.ts +0 -6
- package/dist/src/clock/index.d.ts.map +0 -1
- package/dist/src/clock/index.js +0 -6
- package/dist/src/clock/index.js.map +0 -1
- package/dist/src/clock/site.d.ts +0 -58
- package/dist/src/clock/site.d.ts.map +0 -1
- package/dist/src/clock/site.js +0 -137
- package/dist/src/clock/site.js.map +0 -1
- package/dist/src/create-sync-module.d.ts +0 -85
- package/dist/src/create-sync-module.d.ts.map +0 -1
- package/dist/src/create-sync-module.js +0 -54
- package/dist/src/create-sync-module.js.map +0 -1
- package/dist/src/index.d.ts +0 -31
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -42
- package/dist/src/index.js.map +0 -1
- package/dist/src/metadata/change-log.d.ts +0 -67
- package/dist/src/metadata/change-log.d.ts.map +0 -1
- package/dist/src/metadata/change-log.js +0 -107
- package/dist/src/metadata/change-log.js.map +0 -1
- package/dist/src/metadata/column-version.d.ts +0 -58
- package/dist/src/metadata/column-version.d.ts.map +0 -1
- package/dist/src/metadata/column-version.js +0 -100
- package/dist/src/metadata/column-version.js.map +0 -1
- package/dist/src/metadata/index.d.ts +0 -11
- package/dist/src/metadata/index.d.ts.map +0 -1
- package/dist/src/metadata/index.js +0 -11
- package/dist/src/metadata/index.js.map +0 -1
- package/dist/src/metadata/keys.d.ts +0 -180
- package/dist/src/metadata/keys.d.ts.map +0 -1
- package/dist/src/metadata/keys.js +0 -390
- package/dist/src/metadata/keys.js.map +0 -1
- package/dist/src/metadata/peer-state.d.ts +0 -52
- package/dist/src/metadata/peer-state.d.ts.map +0 -1
- package/dist/src/metadata/peer-state.js +0 -87
- package/dist/src/metadata/peer-state.js.map +0 -1
- package/dist/src/metadata/schema-migration.d.ts +0 -60
- package/dist/src/metadata/schema-migration.d.ts.map +0 -1
- package/dist/src/metadata/schema-migration.js +0 -126
- package/dist/src/metadata/schema-migration.js.map +0 -1
- package/dist/src/metadata/schema-version.d.ts +0 -163
- package/dist/src/metadata/schema-version.d.ts.map +0 -1
- package/dist/src/metadata/schema-version.js +0 -307
- package/dist/src/metadata/schema-version.js.map +0 -1
- package/dist/src/metadata/tombstones.d.ts +0 -67
- package/dist/src/metadata/tombstones.d.ts.map +0 -1
- package/dist/src/metadata/tombstones.js +0 -125
- package/dist/src/metadata/tombstones.js.map +0 -1
- package/dist/src/sync/events.d.ts +0 -117
- package/dist/src/sync/events.d.ts.map +0 -1
- package/dist/src/sync/events.js +0 -56
- package/dist/src/sync/events.js.map +0 -1
- package/dist/src/sync/index.d.ts +0 -8
- package/dist/src/sync/index.d.ts.map +0 -1
- package/dist/src/sync/index.js +0 -8
- package/dist/src/sync/index.js.map +0 -1
- package/dist/src/sync/manager.d.ts +0 -146
- package/dist/src/sync/manager.d.ts.map +0 -1
- package/dist/src/sync/manager.js +0 -8
- package/dist/src/sync/manager.js.map +0 -1
- package/dist/src/sync/protocol.d.ts +0 -282
- package/dist/src/sync/protocol.d.ts.map +0 -1
- package/dist/src/sync/protocol.js +0 -16
- package/dist/src/sync/protocol.js.map +0 -1
- package/dist/src/sync/store-adapter.d.ts +0 -42
- package/dist/src/sync/store-adapter.d.ts.map +0 -1
- package/dist/src/sync/store-adapter.js +0 -232
- package/dist/src/sync/store-adapter.js.map +0 -1
- package/dist/src/sync/sync-manager-impl.d.ts +0 -91
- package/dist/src/sync/sync-manager-impl.d.ts.map +0 -1
- package/dist/src/sync/sync-manager-impl.js +0 -1123
- 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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"}
|