@powersync/service-module-mssql 0.0.0-dev-20260313100403 → 0.0.0-dev-20260515144844

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 (75) hide show
  1. package/CHANGELOG.md +91 -6
  2. package/dist/api/MSSQLRouteAPIAdapter.d.ts +2 -2
  3. package/dist/api/MSSQLRouteAPIAdapter.js +3 -3
  4. package/dist/api/MSSQLRouteAPIAdapter.js.map +1 -1
  5. package/dist/common/CaptureInstance.d.ts +14 -0
  6. package/dist/common/CaptureInstance.js +2 -0
  7. package/dist/common/CaptureInstance.js.map +1 -0
  8. package/dist/common/MSSQLSourceTable.d.ts +16 -14
  9. package/dist/common/MSSQLSourceTable.js +35 -16
  10. package/dist/common/MSSQLSourceTable.js.map +1 -1
  11. package/dist/common/MSSQLSourceTableCache.js.map +1 -1
  12. package/dist/common/mssqls-to-sqlite.d.ts +1 -1
  13. package/dist/common/mssqls-to-sqlite.js +1 -1
  14. package/dist/common/mssqls-to-sqlite.js.map +1 -1
  15. package/dist/module/MSSQLModule.js +4 -4
  16. package/dist/module/MSSQLModule.js.map +1 -1
  17. package/dist/replication/CDCPoller.d.ts +45 -23
  18. package/dist/replication/CDCPoller.js +201 -61
  19. package/dist/replication/CDCPoller.js.map +1 -1
  20. package/dist/replication/CDCReplicationJob.d.ts +2 -2
  21. package/dist/replication/CDCReplicationJob.js +12 -4
  22. package/dist/replication/CDCReplicationJob.js.map +1 -1
  23. package/dist/replication/CDCReplicator.d.ts +2 -3
  24. package/dist/replication/CDCReplicator.js +1 -24
  25. package/dist/replication/CDCReplicator.js.map +1 -1
  26. package/dist/replication/CDCStream.d.ts +39 -16
  27. package/dist/replication/CDCStream.js +195 -102
  28. package/dist/replication/CDCStream.js.map +1 -1
  29. package/dist/replication/MSSQLConnectionManager.d.ts +1 -1
  30. package/dist/replication/MSSQLConnectionManager.js +17 -6
  31. package/dist/replication/MSSQLConnectionManager.js.map +1 -1
  32. package/dist/replication/MSSQLConnectionManagerFactory.d.ts +1 -1
  33. package/dist/replication/MSSQLConnectionManagerFactory.js.map +1 -1
  34. package/dist/replication/MSSQLSnapshotQuery.d.ts +1 -1
  35. package/dist/replication/MSSQLSnapshotQuery.js +2 -2
  36. package/dist/replication/MSSQLSnapshotQuery.js.map +1 -1
  37. package/dist/types/types.d.ts +4 -56
  38. package/dist/types/types.js +5 -24
  39. package/dist/types/types.js.map +1 -1
  40. package/dist/utils/deadlock.d.ts +9 -0
  41. package/dist/utils/deadlock.js +40 -0
  42. package/dist/utils/deadlock.js.map +1 -0
  43. package/dist/utils/mssql.d.ts +36 -18
  44. package/dist/utils/mssql.js +102 -100
  45. package/dist/utils/mssql.js.map +1 -1
  46. package/dist/utils/schema.d.ts +9 -0
  47. package/dist/utils/schema.js +34 -0
  48. package/dist/utils/schema.js.map +1 -1
  49. package/package.json +14 -14
  50. package/src/api/MSSQLRouteAPIAdapter.ts +4 -4
  51. package/src/common/CaptureInstance.ts +15 -0
  52. package/src/common/MSSQLSourceTable.ts +33 -24
  53. package/src/common/MSSQLSourceTableCache.ts +1 -1
  54. package/src/common/mssqls-to-sqlite.ts +1 -1
  55. package/src/module/MSSQLModule.ts +4 -4
  56. package/src/replication/CDCPoller.ts +275 -75
  57. package/src/replication/CDCReplicationJob.ts +13 -6
  58. package/src/replication/CDCReplicator.ts +2 -28
  59. package/src/replication/CDCStream.ts +265 -124
  60. package/src/replication/MSSQLConnectionManager.ts +17 -7
  61. package/src/replication/MSSQLConnectionManagerFactory.ts +1 -1
  62. package/src/replication/MSSQLSnapshotQuery.ts +3 -3
  63. package/src/types/types.ts +5 -28
  64. package/src/utils/deadlock.ts +44 -0
  65. package/src/utils/mssql.ts +163 -128
  66. package/src/utils/schema.ts +44 -1
  67. package/test/src/CDCStream.test.ts +7 -7
  68. package/test/src/CDCStreamTestContext.ts +14 -8
  69. package/test/src/CDCStream_resumable_snapshot.test.ts +6 -6
  70. package/test/src/LSN.test.ts +1 -1
  71. package/test/src/mssql-to-sqlite.test.ts +25 -17
  72. package/test/src/schema-changes.test.ts +474 -0
  73. package/test/src/util.ts +79 -22
  74. package/test/tsconfig.json +0 -1
  75. package/tsconfig.tsbuildinfo +1 -1
@@ -1,8 +1,10 @@
1
- import { logger as defaultLogger, ReplicationAssertionError } from '@powersync/lib-services-framework';
1
+ import { DatabaseQueryError, logger as defaultLogger, ErrorCode, ReplicationAssertionError } from '@powersync/lib-services-framework';
2
+ import sql from 'mssql';
2
3
  import timers from 'timers/promises';
3
4
  import { LSN } from '../common/LSN.js';
4
- import sql from 'mssql';
5
- import { getMinLSN, incrementLSN } from '../utils/mssql.js';
5
+ import { isDeadlockError } from '../utils/deadlock.js';
6
+ import { getCaptureInstances, incrementLSN, toQualifiedTableName } from '../utils/mssql.js';
7
+ import { tableExists } from '../utils/schema.js';
6
8
  var Operation;
7
9
  (function (Operation) {
8
10
  Operation[Operation["DELETE"] = 1] = "DELETE";
@@ -10,19 +12,16 @@ var Operation;
10
12
  Operation[Operation["UPDATE_BEFORE"] = 3] = "UPDATE_BEFORE";
11
13
  Operation[Operation["UPDATE_AFTER"] = 4] = "UPDATE_AFTER";
12
14
  })(Operation || (Operation = {}));
13
- /**
14
- * Schema changes that are detectable by inspecting query events.
15
- * Create table statements are not included here, since new tables are automatically detected when row events
16
- * are received for them.
17
- */
18
15
  export var SchemaChangeType;
19
16
  (function (SchemaChangeType) {
20
- SchemaChangeType["RENAME_TABLE"] = "Rename Table";
21
- SchemaChangeType["DROP_TABLE"] = "Drop Table";
22
- SchemaChangeType["TRUNCATE_TABLE"] = "Truncate Table";
23
- SchemaChangeType["ALTER_TABLE_COLUMN"] = "Alter Table Column";
24
- SchemaChangeType["REPLICATION_IDENTITY"] = "Alter Replication Identity";
17
+ SchemaChangeType["TABLE_RENAME"] = "table_rename";
18
+ SchemaChangeType["TABLE_DROP"] = "table_drop";
19
+ SchemaChangeType["TABLE_CREATE"] = "table_create";
20
+ SchemaChangeType["TABLE_COLUMN_CHANGES"] = "table_column_changes";
21
+ SchemaChangeType["NEW_CAPTURE_INSTANCE"] = "new_capture_instance";
22
+ SchemaChangeType["MISSING_CAPTURE_INSTANCE"] = "missing_capture_instance";
25
23
  })(SchemaChangeType || (SchemaChangeType = {}));
24
+ export const DEFAULT_SCHEMA_CHECK_INTERVAL_MS = 60_000;
26
25
  /**
27
26
  *
28
27
  */
@@ -33,9 +32,11 @@ export class CDCPoller {
33
32
  currentLSN;
34
33
  logger;
35
34
  listenerError;
35
+ captureInstances;
36
36
  isStopped = false;
37
37
  isStopping = false;
38
38
  isPolling = false;
39
+ lastSchemaCheckTime = 0;
39
40
  constructor(options) {
40
41
  this.options = options;
41
42
  this.logger = options.logger ?? defaultLogger;
@@ -43,6 +44,7 @@ export class CDCPoller {
43
44
  this.eventHandler = options.eventHandler;
44
45
  this.currentLSN = options.startLSN;
45
46
  this.listenerError = null;
47
+ this.captureInstances = new Map();
46
48
  }
47
49
  get pollingBatchSize() {
48
50
  return this.options.additionalConfig.pollingBatchSize;
@@ -50,8 +52,11 @@ export class CDCPoller {
50
52
  get pollingIntervalMs() {
51
53
  return this.options.additionalConfig.pollingIntervalMs;
52
54
  }
53
- get sourceTables() {
54
- return this.options.sourceTables;
55
+ get schemaCheckIntervalMs() {
56
+ return this.options.schemaCheckIntervalMs ?? DEFAULT_SCHEMA_CHECK_INTERVAL_MS;
57
+ }
58
+ get replicatedTables() {
59
+ return this.options.getReplicatedTables();
55
60
  }
56
61
  async stop() {
57
62
  if (!(this.isStopped || this.isStopping)) {
@@ -68,15 +73,38 @@ export class CDCPoller {
68
73
  throw new ReplicationAssertionError('A polling cycle is already in progress.');
69
74
  }
70
75
  try {
76
+ if (this.shouldCheckSchema()) {
77
+ this.captureInstances = await getCaptureInstances({ connectionManager: this.connectionManager });
78
+ const schemaChanges = await this.checkForSchemaChanges();
79
+ for (const schemaChange of schemaChanges) {
80
+ await this.eventHandler.onSchemaChange(schemaChange);
81
+ }
82
+ this.lastSchemaCheckTime = Date.now();
83
+ this.logger.debug(`Schema change check complete. Schema changes found: ${schemaChanges.map((c) => c.type).join(', ')}`);
84
+ }
71
85
  const hasChanges = await this.poll();
72
86
  if (!hasChanges) {
73
- // No changes found, wait before next poll
87
+ // No changes found, wait before polling again
74
88
  await timers.setTimeout(this.pollingIntervalMs);
75
89
  }
76
90
  // If changes were found, poll immediately again (no wait)
77
91
  }
78
92
  catch (error) {
79
93
  if (!(this.isStopped || this.isStopping)) {
94
+ // Recoverable errors
95
+ if (error instanceof DatabaseQueryError) {
96
+ this.logger.warn(error.message);
97
+ // Force schema check on next iteration to detect breaking changes
98
+ this.lastSchemaCheckTime = 0;
99
+ continue;
100
+ }
101
+ // Deadlock errors are transient — even if all retries within retryOnDeadlock were
102
+ // exhausted, we should not crash the poller. Instead, log and retry the entire cycle.
103
+ if (isDeadlockError(error)) {
104
+ this.logger.warn(`Deadlock persisted after all retry attempts during CDC polling cycle. Will retry on next cycle: ${error.message}`);
105
+ continue;
106
+ }
107
+ // Non-recoverable errors
80
108
  this.listenerError = error;
81
109
  this.logger.error('Error during CDC polling:', error);
82
110
  this.stop();
@@ -110,15 +138,18 @@ export class CDCPoller {
110
138
  const endLSN = LSN.fromBinary(results[results.length - 1].start_lsn);
111
139
  this.logger.info(`Polling bounds are ${startLSN} -> ${endLSN} spanning ${results.length} transaction(s).`);
112
140
  let transactionCount = 0;
113
- for (const table of this.sourceTables) {
114
- const tableTransactionCount = await this.pollTable(table, { startLSN, endLSN });
115
- // We poll for batch size transactions, but these include transactions not applicable to our Source Tables.
116
- // Each Source Table may or may not have transactions that are applicable to it, so just keep track of the highest number of transactions processed for any Source Table.
117
- if (tableTransactionCount > transactionCount) {
118
- transactionCount = tableTransactionCount;
141
+ this.logger.debug(`Currently replicating tables: ${this.replicatedTables.map((table) => table.toQualifiedName()).join(', ')}`);
142
+ for (const table of this.replicatedTables) {
143
+ if (table.enabledForCDC()) {
144
+ const tableTransactionCount = await this.pollTable(table, { startLSN, endLSN });
145
+ // We poll for batch size transactions, but these include transactions not applicable to our Source Tables.
146
+ // Each Source Table may or may not have transactions that are applicable to it, so just keep track of the highest number of transactions processed for any Source Table.
147
+ if (tableTransactionCount > transactionCount) {
148
+ transactionCount = tableTransactionCount;
149
+ }
119
150
  }
120
151
  }
121
- this.logger.info(`Processed ${results.length} transaction(s), including ${transactionCount} Source Table transaction(s).`);
152
+ this.logger.info(`Processed ${results.length} transaction(s), including ${transactionCount} Source Table transaction(s). Commited LSN: ${endLSN.toString()}`);
122
153
  // Call eventHandler.onCommit() with toLSN after processing all tables
123
154
  await this.eventHandler.onCommit(endLSN.toString(), transactionCount);
124
155
  this.currentLSN = endLSN;
@@ -131,57 +162,166 @@ export class CDCPoller {
131
162
  }
132
163
  async pollTable(table, bounds) {
133
164
  // Ensure that the startLSN is not before the minimum LSN for the table
134
- const minLSN = await getMinLSN(this.connectionManager, table.captureInstance);
165
+ const minLSN = this.captureInstances.get(table.objectId).instances[0].minLSN;
135
166
  if (minLSN > bounds.endLSN) {
136
167
  return 0;
137
168
  }
138
169
  else if (minLSN >= bounds.startLSN) {
139
170
  bounds.startLSN = minLSN;
140
171
  }
141
- const { recordset: results } = await this.connectionManager.query(`
172
+ try {
173
+ const { recordset: results } = await this.connectionManager.query(`
142
174
  SELECT * FROM ${table.allChangesFunction}(@from_lsn, @to_lsn, 'all update old') ORDER BY __$start_lsn, __$seqval
143
175
  `, [
144
- { name: 'from_lsn', type: sql.VarBinary, value: bounds.startLSN.toBinary() },
145
- { name: 'to_lsn', type: sql.VarBinary, value: bounds.endLSN.toBinary() }
146
- ]);
147
- let transactionCount = 0;
148
- let updateBefore = null;
149
- let lastTransactionLSN = null;
150
- for (const row of results) {
151
- const transactionLSN = LSN.fromBinary(row.__$start_lsn);
152
- switch (row.__$operation) {
153
- case Operation.DELETE:
154
- await this.eventHandler.onDelete(row, table, results.columns);
155
- this.logger.info(`Processed DELETE row LSN: ${transactionLSN}`);
156
- break;
157
- case Operation.INSERT:
158
- await this.eventHandler.onInsert(row, table, results.columns);
159
- this.logger.info(`Processed INSERT row LSN: ${transactionLSN}`);
160
- break;
161
- case Operation.UPDATE_BEFORE:
162
- updateBefore = row;
163
- this.logger.debug(`Processed UPDATE, before row LSN: ${transactionLSN}`);
164
- break;
165
- case Operation.UPDATE_AFTER:
166
- if (updateBefore === null) {
167
- throw new ReplicationAssertionError('Missing before image for update event.');
176
+ { name: 'from_lsn', type: sql.VarBinary, value: bounds.startLSN.toBinary() },
177
+ { name: 'to_lsn', type: sql.VarBinary, value: bounds.endLSN.toBinary() }
178
+ ]);
179
+ let transactionCount = 0;
180
+ let updateBefore = null;
181
+ let lastTransactionLSN = null;
182
+ for (const row of results) {
183
+ const transactionLSN = LSN.fromBinary(row.__$start_lsn);
184
+ switch (row.__$operation) {
185
+ case Operation.DELETE:
186
+ await this.eventHandler.onDelete(row, table, results.columns);
187
+ this.logger.info(`Processed DELETE row LSN: ${transactionLSN}`);
188
+ break;
189
+ case Operation.INSERT:
190
+ await this.eventHandler.onInsert(row, table, results.columns);
191
+ this.logger.info(`Processed INSERT row LSN: ${transactionLSN}`);
192
+ break;
193
+ case Operation.UPDATE_BEFORE:
194
+ updateBefore = row;
195
+ this.logger.debug(`Processed UPDATE, before row LSN: ${transactionLSN}`);
196
+ break;
197
+ case Operation.UPDATE_AFTER:
198
+ if (updateBefore === null) {
199
+ throw new ReplicationAssertionError('Missing before image for update event.');
200
+ }
201
+ await this.eventHandler.onUpdate(row, updateBefore, table, results.columns);
202
+ updateBefore = null;
203
+ this.logger.info(`Processed UPDATE row LSN: ${transactionLSN}`);
204
+ break;
205
+ default:
206
+ this.logger.warn(`Unknown operation type [${row.__$operation}] encountered in CDC changes.`);
207
+ }
208
+ // Increment transaction count when we encounter a new transaction LSN (except for UPDATE_BEFORE rows)
209
+ if (transactionLSN != lastTransactionLSN) {
210
+ lastTransactionLSN = transactionLSN;
211
+ if (row.__$operation !== Operation.UPDATE_BEFORE) {
212
+ transactionCount++;
213
+ }
214
+ }
215
+ }
216
+ return transactionCount;
217
+ }
218
+ catch (error) {
219
+ // This Covers both deleted tables and capture instances
220
+ if (error.message.includes(`Invalid object name`)) {
221
+ throw new DatabaseQueryError(ErrorCode.PSYNC_S1601, `Capture instance for table ${table.toQualifiedName()} is no longer available.`, error);
222
+ }
223
+ throw error;
224
+ }
225
+ }
226
+ shouldCheckSchema() {
227
+ return Date.now() - this.lastSchemaCheckTime >= this.schemaCheckIntervalMs;
228
+ }
229
+ /**
230
+ * Checks the given table for pending schema changes that can lead to inconsistencies in the replicated data if not handled.
231
+ * Returns the SchemaChange if any are found, null otherwise.
232
+ */
233
+ async checkForSchemaChanges() {
234
+ const schemaChanges = [];
235
+ const newTables = this.checkForNewTables();
236
+ for (const table of newTables) {
237
+ this.logger.info(`New table ${toQualifiedTableName(table.sourceTable.schema, table.sourceTable.name)} matching the sync config has been created. Handling schema change...`);
238
+ schemaChanges.push({
239
+ type: SchemaChangeType.TABLE_CREATE,
240
+ newTable: {
241
+ name: table.sourceTable.name,
242
+ schema: table.sourceTable.schema,
243
+ objectId: table.sourceTable.objectId
244
+ },
245
+ newCaptureInstance: table.instances[0]
246
+ });
247
+ }
248
+ for (const table of this.replicatedTables) {
249
+ const exists = await tableExists(table.objectId, this.connectionManager);
250
+ if (!exists) {
251
+ this.logger.info(`Table ${table.toQualifiedName()} has been dropped. Handling schema change...`);
252
+ schemaChanges.push({
253
+ type: SchemaChangeType.TABLE_DROP,
254
+ table
255
+ });
256
+ continue;
257
+ }
258
+ const captureInstanceDetails = this.captureInstances.get(table.objectId);
259
+ if (!captureInstanceDetails) {
260
+ if (table.enabledForCDC()) {
261
+ // Table had a capture instance but no longer does.
262
+ schemaChanges.push({
263
+ type: SchemaChangeType.MISSING_CAPTURE_INSTANCE,
264
+ table
265
+ });
266
+ }
267
+ continue;
268
+ }
269
+ const latestCaptureInstance = captureInstanceDetails.instances[0];
270
+ // If the table is not enabled for CDC or the capture instance is different, we need to re-snapshot the source table
271
+ if (!table.enabledForCDC() || table.captureInstance.objectId !== latestCaptureInstance.objectId) {
272
+ schemaChanges.push({
273
+ type: SchemaChangeType.NEW_CAPTURE_INSTANCE,
274
+ table,
275
+ newCaptureInstance: latestCaptureInstance
276
+ });
277
+ continue;
278
+ }
279
+ // One of the replicated tables has been renamed
280
+ if (table.sourceTable.name !== captureInstanceDetails.sourceTable.name) {
281
+ const newTable = this.tableMatchesSyncRules(captureInstanceDetails.sourceTable.schema, captureInstanceDetails.sourceTable.name)
282
+ ? {
283
+ name: captureInstanceDetails.sourceTable.name,
284
+ schema: captureInstanceDetails.sourceTable.schema,
285
+ objectId: captureInstanceDetails.sourceTable.objectId
168
286
  }
169
- await this.eventHandler.onUpdate(row, updateBefore, table, results.columns);
170
- updateBefore = null;
171
- this.logger.info(`Processed UPDATE row LSN: ${transactionLSN}`);
172
- break;
173
- default:
174
- this.logger.warn(`Unknown operation type [${row.__$operation}] encountered in CDC changes.`);
287
+ : undefined;
288
+ schemaChanges.push({
289
+ type: SchemaChangeType.TABLE_RENAME,
290
+ table,
291
+ newTable,
292
+ newCaptureInstance: latestCaptureInstance
293
+ });
294
+ continue;
295
+ }
296
+ if (latestCaptureInstance.pendingSchemaChanges.length > 0) {
297
+ schemaChanges.push({
298
+ type: SchemaChangeType.TABLE_COLUMN_CHANGES,
299
+ table,
300
+ newCaptureInstance: latestCaptureInstance
301
+ });
175
302
  }
176
- // Increment transaction count when we encounter a new transaction LSN (except for UPDATE_BEFORE rows)
177
- if (transactionLSN != lastTransactionLSN) {
178
- lastTransactionLSN = transactionLSN;
179
- if (row.__$operation !== Operation.UPDATE_BEFORE) {
180
- transactionCount++;
303
+ }
304
+ return schemaChanges;
305
+ }
306
+ checkForNewTables() {
307
+ const newTables = [];
308
+ for (const [objectId, captureInstanceDetails] of this.captureInstances.entries()) {
309
+ // If a source table is not in the replicated tables array, but a capture instance exists for it, it is potentially a new table to replicate.
310
+ if (!this.replicatedTables.some((table) => table.objectId === objectId)) {
311
+ // Check if the new table matches any of the sync config source tables.
312
+ if (this.tableMatchesSyncRules(captureInstanceDetails.sourceTable.schema, captureInstanceDetails.sourceTable.name)) {
313
+ newTables.push(captureInstanceDetails);
181
314
  }
182
315
  }
183
316
  }
184
- return transactionCount;
317
+ return newTables;
318
+ }
319
+ tableMatchesSyncRules(schema, tableName) {
320
+ return this.options.sourceTables.some((tablePattern) => tablePattern.matches({
321
+ connectionTag: this.connectionManager.connectionTag,
322
+ schema: schema,
323
+ name: tableName
324
+ }));
185
325
  }
186
326
  }
187
327
  //# sourceMappingURL=CDCPoller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CDCPoller.js","sourceRoot":"","sources":["../../src/replication/CDCPoller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CDCPoller.js","sourceRoot":"","sources":["../../src/replication/CDCPoller.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { replication } from '@powersync/service-core';
2
- import { MSSQLConnectionManagerFactory } from './MSSQLConnectionManagerFactory.js';
3
2
  import { AdditionalConfig } from '../types/types.js';
3
+ import { MSSQLConnectionManagerFactory } from './MSSQLConnectionManagerFactory.js';
4
4
  export interface CDCReplicationJobOptions extends replication.AbstractReplicationJobOptions {
5
5
  connectionFactory: MSSQLConnectionManagerFactory;
6
6
  additionalConfig: AdditionalConfig;
@@ -13,5 +13,5 @@ export declare class CDCReplicationJob extends replication.AbstractReplicationJo
13
13
  keepAlive(): Promise<void>;
14
14
  replicate(): Promise<void>;
15
15
  replicateOnce(): Promise<void>;
16
- getReplicationLagMillis(): Promise<number | undefined>;
16
+ getReplicationLagMillis(): number | undefined;
17
17
  }
@@ -1,5 +1,6 @@
1
+ import { container } from '@powersync/lib-services-framework';
1
2
  import { replication } from '@powersync/service-core';
2
- import { container, logger as defaultLogger } from '@powersync/lib-services-framework';
3
+ import { POWERSYNC_CHECKPOINTS_TABLE } from '../utils/mssql.js';
3
4
  import { CDCDataExpiredError, CDCStream } from './CDCStream.js';
4
5
  export class CDCReplicationJob extends replication.AbstractReplicationJob {
5
6
  connectionFactory;
@@ -7,12 +8,19 @@ export class CDCReplicationJob extends replication.AbstractReplicationJob {
7
8
  cdcReplicationJobOptions;
8
9
  constructor(options) {
9
10
  super(options);
10
- this.logger = defaultLogger.child({ prefix: `[powersync_${this.options.storage.group_id}] ` });
11
+ this.logger = options.storage.logger;
11
12
  this.connectionFactory = options.connectionFactory;
12
13
  this.cdcReplicationJobOptions = options;
13
14
  }
14
15
  async keepAlive() {
15
- // TODO Might need to leverage checkpoints table as a keepAlive
16
+ if (this.lastStream) {
17
+ try {
18
+ await this.lastStream.keepAlive();
19
+ }
20
+ catch (e) {
21
+ this.logger.warn(`KeepAlive failed, unable to write an update to the ${POWERSYNC_CHECKPOINTS_TABLE} table`, e);
22
+ }
23
+ }
16
24
  }
17
25
  async replicate() {
18
26
  try {
@@ -69,7 +77,7 @@ export class CDCReplicationJob extends replication.AbstractReplicationJob {
69
77
  await connectionManager.end();
70
78
  }
71
79
  }
72
- async getReplicationLagMillis() {
80
+ getReplicationLagMillis() {
73
81
  return this.lastStream?.getReplicationLagMillis();
74
82
  }
75
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CDCReplicationJob.js","sourceRoot":"","sources":["../../src/replication/CDCReplicationJob.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CDCReplicationJob.js","sourceRoot":"","sources":["../../src/replication/CDCReplicationJob.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { replication, storage } from '@powersync/service-core';
2
- import { MSSQLConnectionManagerFactory } from './MSSQLConnectionManagerFactory.js';
3
- import { CDCReplicationJob } from './CDCReplicationJob.js';
4
2
  import { AdditionalConfig } from '../types/types.js';
3
+ import { CDCReplicationJob } from './CDCReplicationJob.js';
4
+ import { MSSQLConnectionManagerFactory } from './MSSQLConnectionManagerFactory.js';
5
5
  export interface CDCReplicatorOptions extends replication.AbstractReplicatorOptions {
6
6
  connectionFactory: MSSQLConnectionManagerFactory;
7
7
  additionalConfig: AdditionalConfig;
@@ -14,5 +14,4 @@ export declare class CDCReplicator extends replication.AbstractReplicator<CDCRep
14
14
  cleanUp(syncRulesStorage: storage.SyncRulesBucketStorage): Promise<void>;
15
15
  stop(): Promise<void>;
16
16
  testConnection(): Promise<replication.ConnectionTestResult>;
17
- getReplicationLagMillis(): Promise<number | undefined>;
18
17
  }
@@ -1,6 +1,6 @@
1
1
  import { replication } from '@powersync/service-core';
2
- import { CDCReplicationJob } from './CDCReplicationJob.js';
3
2
  import { MSSQLModule } from '../module/MSSQLModule.js';
3
+ import { CDCReplicationJob } from './CDCReplicationJob.js';
4
4
  export class CDCReplicator extends replication.AbstractReplicator {
5
5
  connectionFactory;
6
6
  cdcReplicatorOptions;
@@ -28,28 +28,5 @@ export class CDCReplicator extends replication.AbstractReplicator {
28
28
  async testConnection() {
29
29
  return await MSSQLModule.testConnection(this.connectionFactory.connectionConfig);
30
30
  }
31
- async getReplicationLagMillis() {
32
- // TODO:Get replication lag
33
- const lag = await super.getReplicationLagMillis();
34
- if (lag != null) {
35
- return lag;
36
- }
37
- // Booting or in an error loop. Check last active replication status.
38
- // This includes sync rules in an ERROR state.
39
- const content = await this.storage.getActiveSyncRulesContent();
40
- if (content == null) {
41
- return undefined;
42
- }
43
- // Measure the lag from the last commit or keepalive timestamp.
44
- // This is not 100% accurate since it is the commit time in the storage db rather than
45
- // the source db, but it's the best we currently have for mssql.
46
- const checkpointTs = content.last_checkpoint_ts?.getTime() ?? 0;
47
- const keepaliveTs = content.last_keepalive_ts?.getTime() ?? 0;
48
- const latestTs = Math.max(checkpointTs, keepaliveTs);
49
- if (latestTs != 0) {
50
- return Date.now() - latestTs;
51
- }
52
- return undefined;
53
- }
54
31
  }
55
32
  //# sourceMappingURL=CDCReplicator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CDCReplicator.js","sourceRoot":"","sources":["../../src/replication/CDCReplicator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAW,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAQvD,MAAM,OAAO,aAAc,SAAQ,WAAW,CAAC,kBAAqC;IACjE,iBAAiB,CAAgC;IACjD,oBAAoB,CAAuB;IAE5D,YAAY,OAA6B;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACnD,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC;IACtC,CAAC;IAED,SAAS,CAAC,OAAqC;QAC7C,OAAO,IAAI,iBAAiB,CAAC;YAC3B,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC9C,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,CAAC,gBAAgB;SAC7D,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,gBAAgD,IAAkB,CAAC;IAEjF,KAAK,CAAC,IAAI;QACR,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,MAAM,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,uBAAuB;QAC3B,2BAA2B;QAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,uBAAuB,EAAE,CAAC;QAClD,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC;QACb,CAAC;QAED,qEAAqE;QACrE,8CAA8C;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC;QAC/D,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,+DAA+D;QAC/D,sFAAsF;QACtF,gEAAgE;QAChE,MAAM,YAAY,GAAG,OAAO,CAAC,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QACrD,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;QAC/B,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
1
+ {"version":3,"file":"CDCReplicator.js","sourceRoot":"","sources":["../../src/replication/CDCReplicator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAW,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAQ3D,MAAM,OAAO,aAAc,SAAQ,WAAW,CAAC,kBAAqC;IACjE,iBAAiB,CAAgC;IACjD,oBAAoB,CAAuB;IAE5D,YAAY,OAA6B;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACnD,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC;IACtC,CAAC;IAED,SAAS,CAAC,OAAqC;QAC7C,OAAO,IAAI,iBAAiB,CAAC;YAC3B,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC9C,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,CAAC,gBAAgB;SAC7D,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,gBAAgD,IAAkB,CAAC;IAEjF,KAAK,CAAC,IAAI;QACR,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,MAAM,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACnF,CAAC;CACF"}
@@ -1,10 +1,13 @@
1
1
  import { DatabaseConnectionError, Logger } from '@powersync/lib-services-framework';
2
2
  import { MetricsEngine, SourceEntityDescriptor, storage } from '@powersync/service-core';
3
3
  import { TablePattern } from '@powersync/service-sync-rules';
4
- import { MSSQLConnectionManager } from './MSSQLConnectionManager.js';
5
4
  import sql from 'mssql';
5
+ import { CaptureInstance } from '../common/CaptureInstance.js';
6
6
  import { MSSQLSourceTable } from '../common/MSSQLSourceTable.js';
7
+ import { MSSQLSourceTableCache } from '../common/MSSQLSourceTableCache.js';
7
8
  import { AdditionalConfig } from '../types/types.js';
9
+ import { SchemaChange } from './CDCPoller.js';
10
+ import { MSSQLConnectionManager } from './MSSQLConnectionManager.js';
8
11
  export interface CDCStreamOptions {
9
12
  connections: MSSQLConnectionManager;
10
13
  storage: storage.SyncRulesBucketStorage;
@@ -18,15 +21,27 @@ export interface CDCStreamOptions {
18
21
  */
19
22
  snapshotBatchSize?: number;
20
23
  additionalConfig: AdditionalConfig;
24
+ /**
25
+ * Override schema check interval, defaults is 60 seconds.
26
+ */
27
+ schemaCheckIntervalMs?: number;
21
28
  }
22
29
  export declare enum SnapshotStatus {
23
- IN_PROGRESS = "in-progress",
30
+ INITIAL = "initial",
31
+ RESUME = "resume",
24
32
  DONE = "done",
25
- RESTART_REQUIRED = "restart-required"
33
+ LIMITED_RESNAPSHOT = "limited-resnapshot"
26
34
  }
27
35
  export interface SnapshotStatusResult {
28
36
  status: SnapshotStatus;
29
37
  snapshotLSN: string | null;
38
+ /**
39
+ * Under certain circumstances it may be necessary to re-snapshot specific tables:
40
+ * * A new capture instance has been created for a table.
41
+ * * A table has been renamed.
42
+ * * The retention threshold has been exceeded for a table.
43
+ */
44
+ specificTablesToResnapshot?: MSSQLSourceTable[];
30
45
  }
31
46
  export declare class CDCConfigurationError extends Error {
32
47
  constructor(message: string);
@@ -48,20 +63,12 @@ export declare class CDCStream {
48
63
  private readonly connections;
49
64
  private readonly abortSignal;
50
65
  private readonly logger;
51
- private tableCache;
52
- /**
53
- * Time of the oldest uncommitted change, according to the source db.
54
- * This is used to determine the replication lag.
55
- */
56
- private oldestUncommittedChange;
57
- /**
58
- * Keep track of whether we have done a commit or keepalive yet.
59
- * We can only compute replication lag if isStartingReplication == false, or oldestUncommittedChange is present.
60
- */
61
- isStartingReplication: boolean;
66
+ tableCache: MSSQLSourceTableCache;
67
+ private replicationLag;
62
68
  constructor(options: CDCStreamOptions);
63
69
  private get metrics();
64
70
  get stopped(): boolean;
71
+ get isStartingReplication(): boolean;
65
72
  get defaultSchema(): string;
66
73
  get groupId(): number;
67
74
  get connectionId(): number;
@@ -70,7 +77,7 @@ export declare class CDCStream {
70
77
  replicate(): Promise<void>;
71
78
  populateTableCache(): Promise<void>;
72
79
  getQualifiedTableNames(batch: storage.BucketStorageBatch, tablePattern: TablePattern): Promise<MSSQLSourceTable[]>;
73
- processTable(batch: storage.BucketStorageBatch, table: SourceEntityDescriptor, snapshot: boolean): Promise<MSSQLSourceTable>;
80
+ processTable(batch: storage.BucketStorageBatch, table: SourceEntityDescriptor, captureInstance: CaptureInstance | null, snapshot: boolean): Promise<MSSQLSourceTable>;
74
81
  private snapshotTableInTx;
75
82
  private snapshotTable;
76
83
  /**
@@ -95,12 +102,28 @@ export declare class CDCStream {
95
102
  private checkSnapshotStatus;
96
103
  streamChanges(): Promise<void>;
97
104
  private createEventHandler;
105
+ handleSchemaChange(batch: storage.BucketStorageBatch, change: SchemaChange): Promise<void>;
106
+ private handleCreateOrUpdateTable;
107
+ /**
108
+ * There is very little that can be automatically done to handle the column changes other than to warn the user about the schema drift.
109
+ *
110
+ * Due to the way CDC works, users are prevented from making column schema changes that affect the replication identities of a table.
111
+ * If changes like that are required, CDC has to be disabled and re-enabled for the table. This would then be handled by the detection of the new
112
+ * capture instance.
113
+ * @param table
114
+ * @param captureInstance
115
+ */
116
+ private handleColumnChanges;
98
117
  /**
99
118
  * Convert CDC row data to SqliteRow format.
100
119
  * CDC rows include table columns plus CDC metadata columns (__$operation, __$start_lsn, etc.).
101
120
  * We filter out the CDC metadata columns.
102
121
  */
103
122
  private toSqliteRow;
104
- getReplicationLagMillis(): Promise<number | undefined>;
123
+ getReplicationLagMillis(): number | undefined;
105
124
  private touch;
125
+ /**
126
+ * Creates an update in the source database to ensure regular checkpoints via the CDC
127
+ */
128
+ keepAlive(): Promise<void>;
106
129
  }