@memberjunction/external-change-detection 5.14.0 → 5.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -67,40 +67,132 @@ export declare class ExternalChangeDetectorEngine extends BaseEngine<ExternalCha
67
67
  */
68
68
  get EligibleEntities(): EntityInfo[];
69
69
  /**
70
- * Detects external changes for a single entity
71
- * @param entity
70
+ * Detects external changes for a single entity. Results are paginated
71
+ * (DETECTION_PAGE_SIZE rows per query) to cap memory regardless of how
72
+ * many untracked records exist.
73
+ *
74
+ * Detection queries return ot.* so we build LatestRecord inline —
75
+ * no second round-trip to the database.
72
76
  */
73
77
  DetectChangesForEntity(entity: EntityInfo): Promise<ChangeDetectionResult>;
74
78
  /**
75
- * This method compares a version of the record in question from the database with the last version we had in RecordChange table
76
- * @param change
79
+ * Validates that entity is non-null and in the eligible list.
80
+ */
81
+ private validateEntityEligibility;
82
+ /**
83
+ * Builds the template parameter objects for all three detection queries.
84
+ */
85
+ private buildDetectionParams;
86
+ /**
87
+ * Runs a detection query in pages of DETECTION_PAGE_SIZE, calling the
88
+ * provided handler for each result row. Stops when a page returns fewer
89
+ * rows than the page size.
90
+ *
91
+ * If a page query fails (timeout, connection error, etc.), logs the error
92
+ * and stops pagination for this entity rather than retrying or crashing.
93
+ * The caller's try/catch in DetectChangesForEntity will report partial results.
94
+ */
95
+ private detectPages;
96
+ /**
97
+ * Builds a ChangeDetectionItem with PrimaryKey extracted from a query result row.
98
+ */
99
+ private buildChangeItem;
100
+ /**
101
+ * Builds a ChangeDetectionItem for a deletion from a RecordChanges row.
102
+ */
103
+ private buildDeleteItem;
104
+ /**
105
+ * Creates a BaseEntity instance and loads it with data from a query result row.
106
+ * Strips __ecd_ prefixed columns (our timestamp aliases) before loading to
107
+ * avoid "field not found in entity" warnings from BaseEntity.SetMany().
108
+ */
109
+ private buildEntityFromRow;
110
+ /**
111
+ * Compares the current record with the last RecordChange snapshot to determine field-level changes.
77
112
  */
78
113
  DetermineRecordChanges(md: Metadata, change: ChangeDetectionItem): Promise<{
79
114
  changes: FieldChange[];
80
115
  latestRecord: BaseEntity;
81
116
  }>;
82
- protected DoValuesDiffer(tsType: EntityFieldTSType, value1: any, value2: any): {
117
+ protected DoValuesDiffer(tsType: EntityFieldTSType, value1: unknown, value2: unknown): {
83
118
  differ: boolean;
84
- castValue1: any;
85
- castValue2: any;
119
+ castValue1: unknown;
120
+ castValue2: unknown;
86
121
  };
87
122
  /**
88
123
  * Casts a value to a boolean, properly handling string representations like 'false' and '0'
89
124
  * which are truthy in JavaScript but should be treated as false.
90
125
  */
91
126
  protected CastToBoolean(value: unknown): boolean;
92
- protected GetLatestRecordChangesDataForEntityRecord(change: ChangeDetectionItem): Promise<any>;
93
- protected GetLatestDatabaseRecords(md: Metadata, changes: ChangeDetectionItem[]): Promise<boolean>;
94
- protected GetLatestDatabaseRecord(md: Metadata, change: ChangeDetectionItem): Promise<BaseEntity>;
127
+ protected GetLatestRecordChangesDataForEntityRecord(change: ChangeDetectionItem): Promise<Record<string, unknown> | null>;
95
128
  protected getPrimaryKeyString(entity: EntityInfo, tablePrefix: string): string;
96
129
  /**
97
- * Detects changes across all of the entities specified
130
+ * Row count thresholds for dynamic concurrency. Entities are sorted smallest-first
131
+ * and processed with a concurrency level appropriate to their size.
132
+ * Conservative values to avoid overwhelming production databases where
133
+ * detection queries use string-concat PK joins that force full table scans.
134
+ */
135
+ private static readonly CONCURRENCY_TIERS;
136
+ /**
137
+ * Detects and replays external changes for the specified entities in an interleaved
138
+ * fashion: each entity's changes are detected, replayed, and then discarded before
139
+ * moving to the next entity. This keeps memory bounded to one entity's changes at
140
+ * a time rather than accumulating all changes across all entities.
141
+ *
142
+ * Entity concurrency is dynamically determined from approximate row counts
143
+ * (via sys.partitions) so small tables run in parallel while large tables
144
+ * don't overwhelm the DB.
145
+ *
146
+ * Production safety mechanisms:
147
+ * - **Circuit breaker**: Aborts if >50% of entities fail
148
+ * - **Cooldown**: Pauses 30s after 5 consecutive failures
149
+ * - **Heap guard**: Stops if heap usage exceeds 85%
150
+ *
98
151
  * @param entities Array of entities to process
99
- * @param entityBatchSize Optional, defines how many entities to process in parallel. Defaults to 10.
100
- * @returns
152
+ * @param replayBatchSize Concurrent replays per entity. Defaults to 20.
153
+ * @param maxConcurrency Max parallel entity detection. Defaults to 5.
154
+ * @param staleTimeoutHours Hours before a stuck run is considered stale. Defaults to 24.
155
+ * @returns Summary with success status and aggregate counts
156
+ */
157
+ DetectAndReplayChanges(entities: EntityInfo[], replayBatchSize?: number, maxConcurrency?: number, staleTimeoutHours?: number): Promise<{
158
+ Success: boolean;
159
+ ErrorMessage?: string;
160
+ TotalDetected: number;
161
+ TotalReplayed: number;
162
+ EntitiesProcessed: number;
163
+ EntitiesFailed: number;
164
+ }>;
165
+ /**
166
+ * Replays a single entity's changes and returns the count of successful replays.
167
+ * Changes are processed in batches for concurrency but the entire set is for
168
+ * one entity only, keeping memory bounded.
169
+ */
170
+ private replayEntityChanges;
171
+ /**
172
+ * Checks whether Node.js heap usage is approaching the V8 heap limit.
173
+ * Uses v8.getHeapStatistics().heap_size_limit which is the actual max
174
+ * (set by --max-old-space-size or V8's default), not the currently
175
+ * allocated heapTotal which starts small and grows on demand.
176
+ */
177
+ private isHeapPressureHigh;
178
+ /**
179
+ * Queries sys.partitions for fast approximate row counts (no table scans).
180
+ * Returns a Map of entityID → approx row count.
181
+ */
182
+ private getApproxRowCounts;
183
+ /**
184
+ * Determines the concurrency level for an entity based on its approximate row count.
185
+ */
186
+ private getConcurrencyForEntity;
187
+ /**
188
+ * @deprecated Use DetectAndReplayChanges() instead, which interleaves detection and replay
189
+ * per entity to keep memory bounded. This method accumulates all changes in memory.
190
+ */
191
+ DetectChangesForEntities(entities: EntityInfo[], maxConcurrency?: number): Promise<ChangeDetectionResult>;
192
+ /**
193
+ * @deprecated Use DetectAndReplayChanges() instead.
101
194
  */
102
- DetectChangesForEntities(entities: EntityInfo[], entityBatchSize?: number): Promise<ChangeDetectionResult>;
103
- DetectChangesForAllEligibleEntities(entityBatchSize?: number): Promise<ChangeDetectionResult>;
195
+ DetectChangesForAllEligibleEntities(maxConcurrency?: number): Promise<ChangeDetectionResult>;
104
196
  /**
105
197
  * This method will replay all of the items in the changes array
106
198
  * @param changes Array of changes to replay.
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeDetector.d.ts","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChangeDetector.d.ts","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,32 @@ import { BaseEngine, CompositeKey, ConsoleColor, EntityFieldTSType, EntityInfo,
2
2
  import { UUIDsEqual } from "@memberjunction/global";
3
3
  import { SQLServerDataProvider, SQLServerProviderConfigData } from "@memberjunction/sqlserver-dataprovider";
4
4
  import { PostgreSQLDialect, SQLServerDialect } from "@memberjunction/sql-dialect";
5
+ import { getHeapStatistics } from "v8";
6
+ /**
7
+ * Maximum number of rows per detection query page. Since changes are replayed
8
+ * per-entity and then discarded (not accumulated), this can be generous.
9
+ */
10
+ const DETECTION_PAGE_SIZE = 5000;
11
+ /**
12
+ * Abort the entire run if this percentage of entities fail detection.
13
+ * Prevents hammering a database that's clearly under pressure.
14
+ */
15
+ const FAILURE_ABORT_THRESHOLD = 0.5;
16
+ /**
17
+ * Number of consecutive entity failures that triggers a cooldown pause.
18
+ * After this many failures in a row, the engine pauses before continuing
19
+ * to let the database recover.
20
+ */
21
+ const CONSECUTIVE_FAILURE_COOLDOWN_THRESHOLD = 5;
22
+ /**
23
+ * Milliseconds to pause after hitting the consecutive failure threshold.
24
+ */
25
+ const COOLDOWN_PAUSE_MS = 30_000;
26
+ /**
27
+ * Maximum percentage of Node.js heap that can be used before the engine
28
+ * skips remaining entities to prevent OOM crashes.
29
+ */
30
+ const HEAP_USAGE_LIMIT_PERCENT = 0.85;
5
31
  /**
6
32
  * Represents a change to a single field in a record
7
33
  */
@@ -76,169 +102,222 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
76
102
  return netEligible;
77
103
  }
78
104
  /**
79
- * Detects external changes for a single entity
80
- * @param entity
105
+ * Detects external changes for a single entity. Results are paginated
106
+ * (DETECTION_PAGE_SIZE rows per query) to cap memory regardless of how
107
+ * many untracked records exist.
108
+ *
109
+ * Detection queries return ot.* so we build LatestRecord inline —
110
+ * no second round-trip to the database.
81
111
  */
82
112
  async DetectChangesForEntity(entity) {
83
113
  try {
84
- // check to make sure that the entity is in the eligible list
85
- if (!entity) {
86
- throw new Error("entity parameter is required");
87
- }
88
- else if (!this.EligibleEntities.find(e => UUIDsEqual(e.ID, entity.ID))) {
89
- throw new Error(`Entity ${entity.Name} is not eligible for external change detection. Refer to the documentation on the EligibleEntities and IneligibleEntities properties for more information.`);
90
- }
114
+ this.validateEntityEligibility(entity);
91
115
  const md = new Metadata();
92
116
  const rq = new RunQuery();
93
- const commonParams = {
94
- EntityID: entity.ID,
95
- SchemaName: entity.SchemaName,
96
- BaseView: entity.BaseView,
97
- ColumnList: entity.PrimaryKeys.map(pk => `ot.${this._dialect.QuoteIdentifier(pk.Name)}`).join(', '),
98
- PrimaryKeyJoin: this.getPrimaryKeyString(entity, 'ot'),
99
- CreatedAtField: EntityInfo.CreatedAtFieldName,
100
- UpdatedAtField: EntityInfo.UpdatedAtFieldName
101
- };
102
- const [createResult, updateResult, deleteResult] = await rq.RunQueries([
103
- { QueryName: 'ExternalChangeDetection_DetectCreations', Parameters: commonParams },
104
- { QueryName: 'ExternalChangeDetection_DetectUpdates', Parameters: {
105
- EntityID: commonParams.EntityID,
106
- SchemaName: commonParams.SchemaName,
107
- BaseView: commonParams.BaseView,
108
- ColumnList: commonParams.ColumnList,
109
- PrimaryKeyJoin: commonParams.PrimaryKeyJoin,
110
- UpdatedAtField: commonParams.UpdatedAtField
111
- } },
112
- { QueryName: 'ExternalChangeDetection_DetectDeletions', Parameters: {
113
- EntityID: commonParams.EntityID,
114
- SchemaName: commonParams.SchemaName,
115
- BaseView: commonParams.BaseView,
116
- PrimaryKeyJoin: commonParams.PrimaryKeyJoin,
117
- PrimaryKeyIsNull: entity.PrimaryKeys.map(pk => `ot.${this._dialect.QuoteIdentifier(pk.Name)} IS NULL`).join(' AND ')
118
- } }
119
- ], this.ContextUser);
120
- // we have the results for all of the queries, now we need to convert them into ChangeDetectionItems
117
+ const params = this.buildDetectionParams(entity);
121
118
  const changes = [];
122
- if (createResult && createResult.Success && createResult.Results.length > 0) {
123
- for (const row of createResult.Results) {
124
- const item = new ChangeDetectionItem();
125
- item.Entity = entity;
126
- item.PrimaryKey = new CompositeKey(entity.PrimaryKeys.map(pk => {
127
- return {
128
- FieldName: pk.Name,
129
- Value: row[pk.Name]
130
- };
131
- }));
132
- item.Type = 'Create';
133
- item.ChangedAt = row.CreatedAt >= row.UpdatedAt ? row.CreatedAt : row.UpdatedAt;
134
- item.Changes = []; // not relevant because the row is new
119
+ // Detect creations (paginated)
120
+ await this.detectPages(rq, 'ExternalChangeDetection_DetectCreations', params.creation, async (row) => {
121
+ const item = this.buildChangeItem(entity, row, 'Create');
122
+ const created = new Date(row.__ecd_CreatedAt);
123
+ const updated = new Date(row.__ecd_UpdatedAt);
124
+ item.ChangedAt = created >= updated ? created : updated;
125
+ item.LatestRecord = await this.buildEntityFromRow(md, entity, row);
126
+ changes.push(item);
127
+ });
128
+ // Track creation PKs so we can skip duplicates in update detection
129
+ const createdKeys = new Set(changes.map(c => c.PrimaryKey.ToConcatenatedString()));
130
+ // Detect updates (paginated)
131
+ await this.detectPages(rq, 'ExternalChangeDetection_DetectUpdates', params.update, async (row) => {
132
+ const item = this.buildChangeItem(entity, row, 'Update');
133
+ item.ChangedAt = new Date(row.__ecd_UpdatedAt);
134
+ // skip if already detected as a creation
135
+ if (!createdKeys.has(item.PrimaryKey.ToConcatenatedString())) {
136
+ item.LatestRecord = await this.buildEntityFromRow(md, entity, row);
135
137
  changes.push(item);
136
138
  }
137
- }
138
- if (updateResult && updateResult.Success && updateResult.Results.length > 0) {
139
- for (const row of updateResult.Results) {
140
- const item = new ChangeDetectionItem();
141
- item.Entity = entity;
142
- item.PrimaryKey = new CompositeKey(entity.PrimaryKeys.map(pk => {
143
- return {
144
- FieldName: pk.Name,
145
- Value: row[pk.Name]
146
- };
147
- }));
148
- item.Type = 'Update';
149
- item.ChangedAt = row.UpdatedAt;
150
- // push the item but first make sure it is NOT already in the changes from the
151
- // create detection, if it is, we do not push it into changes
152
- if (!changes.find(c => c.PrimaryKey.Equals(item.PrimaryKey))) {
153
- changes.push(item);
154
- }
139
+ });
140
+ // Detect deletions (single call bounded by RecordChange entries, not entity size)
141
+ const deleteResult = await rq.RunQuery({
142
+ QueryName: 'ExternalChangeDetection_DetectDeletions',
143
+ Parameters: params.deletion
144
+ }, this.ContextUser);
145
+ if (deleteResult?.Success) {
146
+ for (const row of deleteResult.Results) {
147
+ changes.push(this.buildDeleteItem(entity, row));
155
148
  }
156
149
  }
157
- if (deleteResult && deleteResult.Success && deleteResult.Results.length > 0) {
158
- deleteResult.Results.forEach(row => {
159
- const item = new ChangeDetectionItem();
160
- item.Entity = entity;
161
- const ck = new CompositeKey();
162
- // row.RecordID should have a format of Field1|Value1||Field2|Value2, however in some cases there is legacy
163
- // data in the RecordChange table that just has a single value in it and in that case assuming that the entity
164
- // in question has a single-valued primary key, we can just use that value as the key, so we need to test for that
165
- // first and if we find that the RecordID is just a single value, we can use that as the key
166
- if (row.RecordID.indexOf(CompositeKey.DefaultValueDelimiter) === -1) {
167
- // there is no field delimiter, so we can assume this is a single value
168
- ck.LoadFromSingleKeyValuePair(entity.PrimaryKeys[0].Name, row.RecordID); // this is a string like 'Field1Value' (no quotes
169
- item.LegacyKey = true;
170
- item.LegacyKeyValue = row.RecordID;
171
- }
172
- else
173
- ck.LoadFromConcatenatedString(row.RecordID); // this is a string like 'Field1Value|Field2Value' (no quotes)
174
- item.PrimaryKey = ck;
175
- item.Type = 'Delete';
176
- item.ChangedAt = row.ChangedAt;
177
- item.Changes = []; // not relevant because the row is now deleted
178
- changes.push(item);
179
- });
180
- }
181
- await this.GetLatestDatabaseRecords(md, changes); // load everything from the database in one step
182
- // now we have latest records, go back through and update the Changes field for the UPDATE types
150
+ // Determine field-level changes for updates
183
151
  for (const c of changes) {
184
152
  if (c.Type === 'Update') {
185
- const changesResult = await this.DetermineRecordChanges(md, c);
186
- c.Changes = changesResult.changes;
153
+ const result = await this.DetermineRecordChanges(md, c);
154
+ c.Changes = result.changes;
187
155
  }
188
156
  }
189
- return {
190
- Success: true,
191
- Changes: changes
192
- };
157
+ return { Success: true, Changes: changes };
193
158
  }
194
159
  catch (e) {
195
160
  LogError(e);
196
- return {
197
- Success: false,
198
- ErrorMessage: e.message,
199
- Changes: []
200
- };
161
+ return { Success: false, ErrorMessage: e.message, Changes: [] };
162
+ }
163
+ }
164
+ /**
165
+ * Validates that entity is non-null and in the eligible list.
166
+ */
167
+ validateEntityEligibility(entity) {
168
+ if (!entity)
169
+ throw new Error("entity parameter is required");
170
+ if (!this.EligibleEntities.find(e => UUIDsEqual(e.ID, entity.ID)))
171
+ throw new Error(`Entity ${entity.Name} is not eligible for external change detection. Refer to the documentation on the EligibleEntities and IneligibleEntities properties for more information.`);
172
+ }
173
+ /**
174
+ * Builds the template parameter objects for all three detection queries.
175
+ */
176
+ buildDetectionParams(entity) {
177
+ const base = {
178
+ EntityID: entity.ID,
179
+ SchemaName: entity.SchemaName,
180
+ BaseView: entity.BaseView,
181
+ PrimaryKeyJoin: this.getPrimaryKeyString(entity, 'ot'),
182
+ PrimaryKeyOrderBy: entity.PrimaryKeys.map(pk => `ot.${this._dialect.QuoteIdentifier(pk.Name)}`).join(', ')
183
+ };
184
+ return {
185
+ creation: {
186
+ ...base,
187
+ CreatedAtField: EntityInfo.CreatedAtFieldName,
188
+ UpdatedAtField: EntityInfo.UpdatedAtFieldName
189
+ },
190
+ update: {
191
+ ...base,
192
+ UpdatedAtField: EntityInfo.UpdatedAtFieldName
193
+ },
194
+ deletion: {
195
+ EntityID: base.EntityID,
196
+ SchemaName: base.SchemaName,
197
+ BaseView: base.BaseView,
198
+ PrimaryKeyJoin: base.PrimaryKeyJoin,
199
+ PrimaryKeyIsNull: entity.PrimaryKeys.map(pk => `ot.${this._dialect.QuoteIdentifier(pk.Name)} IS NULL`).join(' AND ')
200
+ }
201
+ };
202
+ }
203
+ /**
204
+ * Runs a detection query in pages of DETECTION_PAGE_SIZE, calling the
205
+ * provided handler for each result row. Stops when a page returns fewer
206
+ * rows than the page size.
207
+ *
208
+ * If a page query fails (timeout, connection error, etc.), logs the error
209
+ * and stops pagination for this entity rather than retrying or crashing.
210
+ * The caller's try/catch in DetectChangesForEntity will report partial results.
211
+ */
212
+ async detectPages(rq, queryName, parameters, handleRow) {
213
+ let startRow = 0;
214
+ for (;;) {
215
+ const result = await rq.RunQuery({
216
+ QueryName: queryName,
217
+ Parameters: parameters,
218
+ MaxRows: DETECTION_PAGE_SIZE,
219
+ StartRow: startRow
220
+ }, this.ContextUser);
221
+ if (!result?.Success) {
222
+ // Query failed (timeout, connection error, etc.) — stop paginating
223
+ // this entity. Don't throw — let the caller report partial results.
224
+ LogError(`Detection query ${queryName} failed at offset ${startRow}: ${result?.ErrorMessage || 'unknown error'}`);
225
+ break;
226
+ }
227
+ if (result.Results.length === 0)
228
+ break;
229
+ for (const row of result.Results) {
230
+ await handleRow(row);
231
+ }
232
+ // If we got fewer rows than requested, this was the last page
233
+ if (result.Results.length < DETECTION_PAGE_SIZE)
234
+ break;
235
+ startRow += DETECTION_PAGE_SIZE;
201
236
  }
202
237
  }
203
238
  /**
204
- * This method compares a version of the record in question from the database with the last version we had in RecordChange table
205
- * @param change
239
+ * Builds a ChangeDetectionItem with PrimaryKey extracted from a query result row.
240
+ */
241
+ buildChangeItem(entity, row, type) {
242
+ const item = new ChangeDetectionItem();
243
+ item.Entity = entity;
244
+ item.PrimaryKey = new CompositeKey(entity.PrimaryKeys.map(pk => ({
245
+ FieldName: pk.Name,
246
+ Value: row[pk.Name]
247
+ })));
248
+ item.Type = type;
249
+ item.ChangedAt = new Date();
250
+ item.Changes = [];
251
+ return item;
252
+ }
253
+ /**
254
+ * Builds a ChangeDetectionItem for a deletion from a RecordChanges row.
255
+ */
256
+ buildDeleteItem(entity, row) {
257
+ const item = new ChangeDetectionItem();
258
+ item.Entity = entity;
259
+ const ck = new CompositeKey();
260
+ const recordID = row.RecordID;
261
+ // Legacy data may have a bare value instead of Field|Value format
262
+ if (recordID.indexOf(CompositeKey.DefaultValueDelimiter) === -1) {
263
+ ck.LoadFromSingleKeyValuePair(entity.PrimaryKeys[0].Name, recordID);
264
+ item.LegacyKey = true;
265
+ item.LegacyKeyValue = recordID;
266
+ }
267
+ else {
268
+ ck.LoadFromConcatenatedString(recordID);
269
+ }
270
+ item.PrimaryKey = ck;
271
+ item.Type = 'Delete';
272
+ item.ChangedAt = row.ChangedAt;
273
+ item.Changes = [];
274
+ return item;
275
+ }
276
+ /**
277
+ * Creates a BaseEntity instance and loads it with data from a query result row.
278
+ * Strips __ecd_ prefixed columns (our timestamp aliases) before loading to
279
+ * avoid "field not found in entity" warnings from BaseEntity.SetMany().
280
+ */
281
+ async buildEntityFromRow(md, entity, row) {
282
+ const cleanRow = {};
283
+ for (const key of Object.keys(row)) {
284
+ if (!key.startsWith('__ecd_'))
285
+ cleanRow[key] = row[key];
286
+ }
287
+ const record = await md.GetEntityObject(entity.Name, this.ContextUser);
288
+ await record.LoadFromData(cleanRow);
289
+ return record;
290
+ }
291
+ /**
292
+ * Compares the current record with the last RecordChange snapshot to determine field-level changes.
206
293
  */
207
294
  async DetermineRecordChanges(md, change) {
208
295
  try {
209
- // Step 1 - load the current record if needed, sometimes already loaded by here
210
- const record = change.LatestRecord ? change.LatestRecord : await this.GetLatestDatabaseRecord(md, change);
211
- if (record) {
212
- // now we have the version from the database that has been updated from an external source
213
- // then we need to get the latest version from the vwRecordChanges table that matches this entity and RecordID
214
- const result = await this.GetLatestRecordChangesDataForEntityRecord(change);
215
- if (result && result.FullRecordJSON && result.FullRecordJSON.length > 0) {
216
- // we have our row, so get the JSON, parse it and we'll have the differences
217
- const json = JSON.parse(result.FullRecordJSON);
218
- // now go through each field in the record object and compare it with the json
219
- const changes = [];
220
- for (const field of record.Fields) {
221
- if (!field.IsPrimaryKey) {
222
- const differResult = this.DoValuesDiffer(field.FieldType, field.Value, json[field.Name]);
223
- if (differResult.differ) {
224
- changes.push({
225
- FieldName: field.Name,
226
- NewValue: differResult.castValue1, // use the typecast values so they're the right types
227
- OldValue: differResult.castValue2 // use the typecast values so they're the right types
228
- });
229
- }
296
+ const record = change.LatestRecord;
297
+ if (!record)
298
+ return { changes: [], latestRecord: null };
299
+ const result = await this.GetLatestRecordChangesDataForEntityRecord(change);
300
+ const fullRecordJSON = result?.FullRecordJSON;
301
+ if (fullRecordJSON?.length > 0) {
302
+ const json = JSON.parse(fullRecordJSON);
303
+ const changes = [];
304
+ for (const field of record.Fields) {
305
+ if (!field.IsPrimaryKey) {
306
+ const differResult = this.DoValuesDiffer(field.FieldType, field.Value, json[field.Name]);
307
+ if (differResult.differ) {
308
+ changes.push({
309
+ FieldName: field.Name,
310
+ NewValue: differResult.castValue1,
311
+ OldValue: differResult.castValue2
312
+ });
230
313
  }
231
314
  }
232
- return { changes, latestRecord: record };
233
- }
234
- else {
235
- LogStatus(` WARNING: No record found, or no FullRecordJSON found, in vwRecordChanges for ${change.Entity.Name}: ${change.PrimaryKey.ToConcatenatedString()}`);
236
- return { changes: [], latestRecord: record };
237
315
  }
316
+ return { changes, latestRecord: record };
238
317
  }
239
318
  else {
240
- // record not found in database, this could happen if it was deleted between detection and replay
241
- return { changes: [], latestRecord: null };
319
+ LogStatus(` WARNING: No record found, or no FullRecordJSON found, in vwRecordChanges for ${change.Entity.Name}: ${change.PrimaryKey.ToConcatenatedString()}`);
320
+ return { changes: [], latestRecord: record };
242
321
  }
243
322
  }
244
323
  catch (e) {
@@ -254,14 +333,11 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
254
333
  castValue1 = value1 ? new Date(value1) : null;
255
334
  castValue2 = value2 ? new Date(value2) : null;
256
335
  if (castValue1 && castValue2) {
257
- // check both to see if they're the same - up to 3 digits of precision
258
- // because when we get the values back into JavaScript objects, Date objects only have 3 digits of precision
259
336
  const d1 = castValue1.getTime();
260
337
  const d2 = castValue2.getTime();
261
338
  return { differ: d1 !== d2, castValue1, castValue2 };
262
339
  }
263
- else
264
- return { differ: castValue1 !== castValue2, castValue1, castValue2 };
340
+ return { differ: castValue1 !== castValue2, castValue1, castValue2 };
265
341
  case EntityFieldTSType.Number:
266
342
  castValue1 = value1 ? parseFloat(value1) : 0;
267
343
  castValue2 = value2 ? parseFloat(value2) : 0;
@@ -295,82 +371,10 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
295
371
  ExtraFilter: `EntityID = '${change.Entity.ID}' AND RecordID = '${change.PrimaryKey.ToConcatenatedString()}' AND Type IN ('Update', 'Create')`,
296
372
  OrderBy: "ChangedAt DESC"
297
373
  }, this.ContextUser);
298
- if (result && result.Success && result.Results.length > 0) {
374
+ if (result?.Success && result.Results.length > 0)
299
375
  return result.Results[0];
300
- }
301
- else
302
- return null;
303
- }
304
- catch (e) {
305
- LogError(e);
306
376
  return null;
307
377
  }
308
- }
309
- async GetLatestDatabaseRecords(md, changes) {
310
- try {
311
- const provider = Metadata.Provider;
312
- // distinct list of entities
313
- const entities = [];
314
- for (const c of changes) {
315
- if (c.Type === 'Update' || c.Type === 'Create') {
316
- let entry = entities.find(e => UUIDsEqual(e.entity.ID, c.Entity.ID));
317
- if (!entry) {
318
- entry = { entity: c.Entity, keys: [] };
319
- entities.push(entry);
320
- }
321
- entry.keys.push(c.PrimaryKey);
322
- }
323
- }
324
- // now we have a distinct list of entities and all of the pkeys for each one, so we can run a single
325
- // select statement for each entity
326
- for (const e of entities) {
327
- const quotedTable = this._dialect.QuoteSchema(e.entity.SchemaName, e.entity.BaseView);
328
- const sql = `SELECT * FROM ${quotedTable}
329
- WHERE ${e.keys.map(k => `(${k.KeyValuePairs.map(kvp => {
330
- const f = e.entity.Fields.find(f => kvp.FieldName.trim().toLowerCase() === f.Name.trim().toLowerCase());
331
- const needsQuotes = f?.NeedsQuotes || typeof kvp.Value === 'string';
332
- const quotes = needsQuotes ? "'" : "";
333
- const quotedField = this._dialect.QuoteIdentifier(kvp.FieldName);
334
- const escapedValue = typeof kvp.Value === 'string' ? kvp.Value.replace(/'/g, "''") : kvp.Value;
335
- return `${quotedField}=${quotes}${escapedValue}${quotes}`;
336
- }).join(' AND ')})`).join(' OR ')} `;
337
- const result = await provider.ExecuteSQL(sql);
338
- if (result) {
339
- // we have the rows from the result, now go back through each of the changes we have in the changes array
340
- // and associate the data with each one
341
- for (const r of result) {
342
- const kvp = e.entity.PrimaryKeys.map(pk => {
343
- return {
344
- FieldName: pk.Name,
345
- Value: r[pk.Name]
346
- };
347
- });
348
- const changeItem = changes.find(ci => ci.Entity === e.entity && ci.PrimaryKey.EqualsKey(kvp));
349
- if (changeItem) {
350
- // found the match, update latest Record
351
- const record = await md.GetEntityObject(changeItem.Entity.Name, this.ContextUser);
352
- await record.LoadFromData(r);
353
- changeItem.LatestRecord = record;
354
- }
355
- }
356
- }
357
- }
358
- return true;
359
- }
360
- catch (e) {
361
- LogError(e);
362
- return false;
363
- }
364
- }
365
- async GetLatestDatabaseRecord(md, change) {
366
- try {
367
- const record = await md.GetEntityObject(change.Entity.Name, this.ContextUser);
368
- if (await record.InnerLoad(change.PrimaryKey)) {
369
- return record;
370
- }
371
- else
372
- return null;
373
- }
374
378
  catch (e) {
375
379
  LogError(e);
376
380
  return null;
@@ -384,55 +388,239 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
384
388
  return entity.PrimaryKeys.map(pk => `'${pk.Name}${CompositeKey.DefaultValueDelimiter}' ${concatOp} ${castToText(`${table}.${quote(pk.Name)}`)}`).join(` ${concatOp} '${CompositeKey.DefaultFieldDelimiter}' ${concatOp} `);
385
389
  }
386
390
  /**
387
- * Detects changes across all of the entities specified
391
+ * Row count thresholds for dynamic concurrency. Entities are sorted smallest-first
392
+ * and processed with a concurrency level appropriate to their size.
393
+ * Conservative values to avoid overwhelming production databases where
394
+ * detection queries use string-concat PK joins that force full table scans.
395
+ */
396
+ static { this.CONCURRENCY_TIERS = [
397
+ { maxRows: 1_000, concurrency: 5 }, // tiny tables
398
+ { maxRows: 10_000, concurrency: 3 }, // small tables
399
+ { maxRows: 50_000, concurrency: 2 }, // medium tables
400
+ { maxRows: Infinity, concurrency: 1 }, // large tables — one at a time
401
+ ]; }
402
+ /**
403
+ * Detects and replays external changes for the specified entities in an interleaved
404
+ * fashion: each entity's changes are detected, replayed, and then discarded before
405
+ * moving to the next entity. This keeps memory bounded to one entity's changes at
406
+ * a time rather than accumulating all changes across all entities.
407
+ *
408
+ * Entity concurrency is dynamically determined from approximate row counts
409
+ * (via sys.partitions) so small tables run in parallel while large tables
410
+ * don't overwhelm the DB.
411
+ *
412
+ * Production safety mechanisms:
413
+ * - **Circuit breaker**: Aborts if >50% of entities fail
414
+ * - **Cooldown**: Pauses 30s after 5 consecutive failures
415
+ * - **Heap guard**: Stops if heap usage exceeds 85%
416
+ *
388
417
  * @param entities Array of entities to process
389
- * @param entityBatchSize Optional, defines how many entities to process in parallel. Defaults to 10.
390
- * @returns
418
+ * @param replayBatchSize Concurrent replays per entity. Defaults to 20.
419
+ * @param maxConcurrency Max parallel entity detection. Defaults to 5.
420
+ * @param staleTimeoutHours Hours before a stuck run is considered stale. Defaults to 24.
421
+ * @returns Summary with success status and aggregate counts
391
422
  */
392
- async DetectChangesForEntities(entities, entityBatchSize = 10) {
423
+ async DetectAndReplayChanges(entities, replayBatchSize = 20, maxConcurrency = 5, staleTimeoutHours = 24) {
424
+ if (!entities || entities.length === 0)
425
+ throw new Error("entities parameter is required and must have at least one entity");
426
+ const rowCounts = await this.getApproxRowCounts(entities);
427
+ const sortedEntities = rowCounts.size > 0
428
+ ? [...entities].sort((a, b) => (rowCounts.get(a.ID) ?? 0) - (rowCounts.get(b.ID) ?? 0))
429
+ : entities;
430
+ LogStatus(`Detecting and replaying changes for ${sortedEntities.length} entities with dynamic concurrency (max ${maxConcurrency})`);
431
+ // Start the replay run record (ensures no concurrent runs)
432
+ const run = await this.StartRun(staleTimeoutHours);
433
+ const replayProviders = await this.createReplayProviders(replayBatchSize);
434
+ let entitiesProcessed = 0;
435
+ let entitiesFailed = 0;
436
+ let consecutiveFailures = 0;
437
+ let totalDetected = 0;
438
+ let totalReplayed = 0;
439
+ let aborted = false;
440
+ let i = 0;
393
441
  try {
394
- if (!entities)
395
- throw new Error("entities parameter is required");
396
- else if (entities.length === 0)
397
- throw new Error("entities parameter must have at least one entity in it");
398
- const result = new ChangeDetectionResult();
399
- result.Success = true;
400
- result.Changes = [];
401
- LogStatus(`Detecting changes for ${entities.length} entities in batches of ${entityBatchSize}`);
402
- // process entities in batches
403
- for (let i = 0; i < entities.length; i += entityBatchSize) {
404
- const batch = entities.slice(i, i + entityBatchSize);
442
+ while (i < sortedEntities.length && !aborted) {
443
+ // Heap guard
444
+ if (this.isHeapPressureHigh()) {
445
+ LogStatus(` ⚠ Heap usage exceeds ${Math.round(HEAP_USAGE_LIMIT_PERCENT * 100)}%, stopping to prevent OOM (${entitiesProcessed}/${sortedEntities.length} processed)`);
446
+ aborted = true;
447
+ break;
448
+ }
449
+ // Circuit breaker
450
+ if (entitiesProcessed >= 10 && entitiesFailed / entitiesProcessed > FAILURE_ABORT_THRESHOLD) {
451
+ LogStatus(` ⚠ Circuit breaker: ${entitiesFailed}/${entitiesProcessed} entities failed, aborting`);
452
+ aborted = true;
453
+ break;
454
+ }
455
+ // Dynamic concurrency for detection (entities run in parallel)
456
+ const dynamicSize = this.getConcurrencyForEntity(sortedEntities[i], rowCounts);
457
+ const concurrency = Math.min(dynamicSize, maxConcurrency);
458
+ const batch = sortedEntities.slice(i, i + concurrency);
459
+ // Detect changes for this batch of entities in parallel
405
460
  const batchPromises = batch.map(e => {
406
- UpdateCurrentConsoleLine(` Starting change detection changes for ${e.Name}`, ConsoleColor.gray);
461
+ const rows = rowCounts?.get(e.ID);
462
+ const rowInfo = rows != null ? ` (~${rows.toLocaleString()} rows)` : '';
463
+ UpdateCurrentConsoleLine(` Detecting: ${e.Name}${rowInfo}`, ConsoleColor.gray);
407
464
  return this.DetectChangesForEntity(e);
408
465
  });
409
466
  const batchResults = await Promise.all(batchPromises);
467
+ // Replay each entity's changes immediately, then discard
410
468
  for (let j = 0; j < batch.length; j++) {
411
- const r = batchResults[j];
412
- const e = batch[j];
413
- if (r.Success) {
414
- result.Changes.push(...r.Changes);
469
+ const entity = batch[j];
470
+ const detection = batchResults[j];
471
+ entitiesProcessed++;
472
+ if (!detection.Success) {
473
+ entitiesFailed++;
474
+ consecutiveFailures++;
475
+ UpdateCurrentConsoleProgress(` Failed: ${entity.Name}`, entitiesProcessed, sortedEntities.length, ConsoleColor.crimson);
476
+ continue;
415
477
  }
416
- else {
417
- result.Success = false;
418
- result.ErrorMessage = (result.ErrorMessage ? result.ErrorMessage + "\n" : "") + `Error detecting changes for ${e.Name}: ` + r.ErrorMessage;
478
+ const changeCount = detection.Changes.length;
479
+ totalDetected += changeCount;
480
+ if (changeCount > 0) {
481
+ const replayed = await this.replayEntityChanges(detection.Changes, replayProviders, replayBatchSize);
482
+ totalReplayed += replayed;
419
483
  }
420
- UpdateCurrentConsoleProgress(` Finished change detection changes for ${e.Name}`, i + j + 1, entities.length, r.Success ? ConsoleColor.cyan : ConsoleColor.crimson);
484
+ consecutiveFailures = 0;
485
+ UpdateCurrentConsoleProgress(` Done: ${entity.Name} (${changeCount} changes)`, entitiesProcessed, sortedEntities.length, ConsoleColor.cyan);
486
+ // Changes go out of scope here — GC can reclaim the BaseEntity objects
487
+ }
488
+ i += batch.length;
489
+ // Cooldown after consecutive failures
490
+ if (consecutiveFailures >= CONSECUTIVE_FAILURE_COOLDOWN_THRESHOLD && i < sortedEntities.length) {
491
+ LogStatus(` ⏸ ${consecutiveFailures} consecutive failures, pausing ${COOLDOWN_PAUSE_MS / 1000}s...`);
492
+ await new Promise(resolve => setTimeout(resolve, COOLDOWN_PAUSE_MS));
493
+ consecutiveFailures = 0;
421
494
  }
422
495
  }
423
- return result;
496
+ run.Status = aborted ? 'Error' : 'Complete';
497
+ run.EndedAt = new Date();
498
+ await run.Save();
499
+ const summary = `${entitiesProcessed} entities processed, ${entitiesFailed} failed, ${totalDetected} changes detected, ${totalReplayed} replayed`;
500
+ LogStatus(`Run complete: ${summary}`);
501
+ return {
502
+ Success: entitiesFailed === 0 && !aborted,
503
+ ErrorMessage: aborted ? `Aborted after ${entitiesProcessed} entities` : undefined,
504
+ TotalDetected: totalDetected,
505
+ TotalReplayed: totalReplayed,
506
+ EntitiesProcessed: entitiesProcessed,
507
+ EntitiesFailed: entitiesFailed
508
+ };
424
509
  }
425
510
  catch (e) {
426
511
  LogError(e);
512
+ run.Status = 'Error';
513
+ run.EndedAt = new Date();
514
+ await run.Save();
427
515
  return {
428
516
  Success: false,
429
- ErrorMessage: e.message,
430
- Changes: []
517
+ ErrorMessage: e instanceof Error ? e.message : String(e),
518
+ TotalDetected: totalDetected,
519
+ TotalReplayed: totalReplayed,
520
+ EntitiesProcessed: entitiesProcessed,
521
+ EntitiesFailed: entitiesFailed
431
522
  };
432
523
  }
433
524
  }
434
- async DetectChangesForAllEligibleEntities(entityBatchSize = 10) {
435
- return await this.DetectChangesForEntities(this.EligibleEntities, entityBatchSize);
525
+ /**
526
+ * Replays a single entity's changes and returns the count of successful replays.
527
+ * Changes are processed in batches for concurrency but the entire set is for
528
+ * one entity only, keeping memory bounded.
529
+ */
530
+ async replayEntityChanges(changes, providers, batchSize) {
531
+ let successCount = 0;
532
+ for (let i = 0; i < changes.length; i += batchSize) {
533
+ const batch = changes.slice(i, i + batchSize);
534
+ const results = await Promise.all(batch.map((c, idx) => this.ReplayChange(providers[idx], c)));
535
+ successCount += results.filter(r => r).length;
536
+ }
537
+ return successCount;
538
+ }
539
+ /**
540
+ * Checks whether Node.js heap usage is approaching the V8 heap limit.
541
+ * Uses v8.getHeapStatistics().heap_size_limit which is the actual max
542
+ * (set by --max-old-space-size or V8's default), not the currently
543
+ * allocated heapTotal which starts small and grows on demand.
544
+ */
545
+ isHeapPressureHigh() {
546
+ const stats = getHeapStatistics();
547
+ const usedRatio = stats.used_heap_size / stats.heap_size_limit;
548
+ return usedRatio > HEAP_USAGE_LIMIT_PERCENT;
549
+ }
550
+ /**
551
+ * Queries sys.partitions for fast approximate row counts (no table scans).
552
+ * Returns a Map of entityID → approx row count.
553
+ */
554
+ async getApproxRowCounts(entities) {
555
+ try {
556
+ const provider = Metadata.Provider;
557
+ const entityIDs = entities.map(e => `'${e.ID}'`).join(',');
558
+ const sql = `
559
+ SELECT
560
+ e.ID,
561
+ ISNULL(SUM(p.rows), 0) AS ApproxRows
562
+ FROM ${provider.MJCoreSchemaName}.vwEntities e
563
+ LEFT JOIN sys.partitions p
564
+ ON p.object_id = OBJECT_ID(e.SchemaName + '.' + e.BaseTable)
565
+ AND p.index_id IN (0, 1)
566
+ WHERE e.ID IN (${entityIDs})
567
+ GROUP BY e.ID
568
+ `;
569
+ const rows = await provider.ExecuteSQL(sql);
570
+ const map = new Map();
571
+ if (rows) {
572
+ for (const row of rows) {
573
+ map.set(row.ID, row.ApproxRows);
574
+ }
575
+ }
576
+ return map;
577
+ }
578
+ catch (e) {
579
+ LogStatus(' Warning: Could not fetch row counts for dynamic concurrency, using default batch size');
580
+ return new Map();
581
+ }
582
+ }
583
+ /**
584
+ * Determines the concurrency level for an entity based on its approximate row count.
585
+ */
586
+ getConcurrencyForEntity(entity, rowCounts) {
587
+ if (!rowCounts || rowCounts.size === 0)
588
+ return 2;
589
+ const rows = rowCounts.get(entity.ID) ?? 0;
590
+ for (const tier of ExternalChangeDetectorEngine.CONCURRENCY_TIERS) {
591
+ if (rows <= tier.maxRows)
592
+ return tier.concurrency;
593
+ }
594
+ return 1;
595
+ }
596
+ /**
597
+ * @deprecated Use DetectAndReplayChanges() instead, which interleaves detection and replay
598
+ * per entity to keep memory bounded. This method accumulates all changes in memory.
599
+ */
600
+ async DetectChangesForEntities(entities, maxConcurrency = 5) {
601
+ if (!entities)
602
+ throw new Error("entities parameter is required");
603
+ if (entities.length === 0)
604
+ throw new Error("entities parameter must have at least one entity in it");
605
+ const result = new ChangeDetectionResult();
606
+ result.Success = true;
607
+ result.Changes = [];
608
+ for (const entity of entities) {
609
+ const r = await this.DetectChangesForEntity(entity);
610
+ if (r.Success)
611
+ result.Changes.push(...r.Changes);
612
+ else {
613
+ result.Success = false;
614
+ result.ErrorMessage = (result.ErrorMessage || '') + `\n${entity.Name}: ${r.ErrorMessage}`;
615
+ }
616
+ }
617
+ return result;
618
+ }
619
+ /**
620
+ * @deprecated Use DetectAndReplayChanges() instead.
621
+ */
622
+ async DetectChangesForAllEligibleEntities(maxConcurrency) {
623
+ return await this.DetectChangesForEntities(this.EligibleEntities, maxConcurrency);
436
624
  }
437
625
  /**
438
626
  * This method will replay all of the items in the changes array
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeDetector.js","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChangeDetector.js","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/external-change-detection",
3
3
  "type": "module",
4
- "version": "5.14.0",
4
+ "version": "5.16.0",
5
5
  "description": "Library used by server side applications to determine if changes have been made to entities by external systems/integrations",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -20,11 +20,11 @@
20
20
  "typescript": "^5.9.3"
21
21
  },
22
22
  "dependencies": {
23
- "@memberjunction/core": "5.14.0",
24
- "@memberjunction/core-entities": "5.14.0",
25
- "@memberjunction/global": "5.14.0",
26
- "@memberjunction/sql-dialect": "5.14.0",
27
- "@memberjunction/sqlserver-dataprovider": "5.14.0"
23
+ "@memberjunction/core": "5.16.0",
24
+ "@memberjunction/core-entities": "5.16.0",
25
+ "@memberjunction/global": "5.16.0",
26
+ "@memberjunction/sql-dialect": "5.16.0",
27
+ "@memberjunction/sqlserver-dataprovider": "5.16.0"
28
28
  },
29
29
  "repository": {
30
30
  "type": "git",