@memberjunction/integration-engine 6.1.0-edge.2 → 6.1.0-edge.4
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/LICENSE +180 -4
- package/dist/BaseIntegrationConnector.d.ts +115 -4
- package/dist/BaseIntegrationConnector.d.ts.map +1 -1
- package/dist/BaseIntegrationConnector.js +191 -24
- package/dist/BaseIntegrationConnector.js.map +1 -1
- package/dist/BaseRESTIntegrationConnector.d.ts +14 -1
- package/dist/BaseRESTIntegrationConnector.d.ts.map +1 -1
- package/dist/BaseRESTIntegrationConnector.js +50 -3
- package/dist/BaseRESTIntegrationConnector.js.map +1 -1
- package/dist/BatchIdentity.d.ts +47 -0
- package/dist/BatchIdentity.d.ts.map +1 -0
- package/dist/BatchIdentity.js +78 -0
- package/dist/BatchIdentity.js.map +1 -0
- package/dist/DiscoveryWatchdog.d.ts +103 -0
- package/dist/DiscoveryWatchdog.d.ts.map +1 -0
- package/dist/DiscoveryWatchdog.js +166 -0
- package/dist/DiscoveryWatchdog.js.map +1 -0
- package/dist/FieldMapValidation.d.ts +40 -0
- package/dist/FieldMapValidation.d.ts.map +1 -0
- package/dist/FieldMapValidation.js +58 -0
- package/dist/FieldMapValidation.js.map +1 -0
- package/dist/FieldMappingEngine.d.ts +1 -13
- package/dist/FieldMappingEngine.d.ts.map +1 -1
- package/dist/FieldMappingEngine.js +18 -3
- package/dist/FieldMappingEngine.js.map +1 -1
- package/dist/IntegrationConnectorCreationPipeline.d.ts +92 -1
- package/dist/IntegrationConnectorCreationPipeline.d.ts.map +1 -1
- package/dist/IntegrationConnectorCreationPipeline.js +186 -11
- package/dist/IntegrationConnectorCreationPipeline.js.map +1 -1
- package/dist/IntegrationEngine.d.ts +198 -21
- package/dist/IntegrationEngine.d.ts.map +1 -1
- package/dist/IntegrationEngine.js +1092 -165
- package/dist/IntegrationEngine.js.map +1 -1
- package/dist/IntegrationSchemaSync.d.ts +8 -0
- package/dist/IntegrationSchemaSync.d.ts.map +1 -1
- package/dist/IntegrationSchemaSync.js +39 -2
- package/dist/IntegrationSchemaSync.js.map +1 -1
- package/dist/KeylessRecordGuard.d.ts +56 -0
- package/dist/KeylessRecordGuard.d.ts.map +1 -0
- package/dist/KeylessRecordGuard.js +80 -0
- package/dist/KeylessRecordGuard.js.map +1 -0
- package/dist/ResumeConcurrency.d.ts +46 -0
- package/dist/ResumeConcurrency.d.ts.map +1 -0
- package/dist/ResumeConcurrency.js +74 -0
- package/dist/ResumeConcurrency.js.map +1 -0
- package/dist/RetryAfter.d.ts +50 -0
- package/dist/RetryAfter.d.ts.map +1 -0
- package/dist/RetryAfter.js +127 -0
- package/dist/RetryAfter.js.map +1 -0
- package/dist/RetryRunner.d.ts +26 -2
- package/dist/RetryRunner.d.ts.map +1 -1
- package/dist/RetryRunner.js +11 -3
- package/dist/RetryRunner.js.map +1 -1
- package/dist/RunOwnershipService.d.ts +177 -0
- package/dist/RunOwnershipService.d.ts.map +1 -0
- package/dist/RunOwnershipService.js +279 -0
- package/dist/RunOwnershipService.js.map +1 -0
- package/dist/SyncDirectives.d.ts +66 -0
- package/dist/SyncDirectives.d.ts.map +1 -0
- package/dist/SyncDirectives.js +123 -0
- package/dist/SyncDirectives.js.map +1 -0
- package/dist/SyncLogger.d.ts +1 -1
- package/dist/SyncLogger.d.ts.map +1 -1
- package/dist/SyncLogger.js.map +1 -1
- package/dist/WatermarkService.d.ts +8 -0
- package/dist/WatermarkService.d.ts.map +1 -1
- package/dist/WatermarkService.js +18 -0
- package/dist/WatermarkService.js.map +1 -1
- package/dist/index.d.ts +12 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +66 -1
- package/dist/types.js.map +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { LogErrorEx, LogStatusEx } from '@memberjunction/core';
|
|
3
|
+
export class RunOwnershipLostError extends Error {
|
|
4
|
+
constructor(runID, detail) {
|
|
5
|
+
super(`Ownership of CompanyIntegrationRun ${runID} lost: ${detail}`);
|
|
6
|
+
this.name = 'RunOwnershipLostError';
|
|
7
|
+
this.RunID = runID;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Per-run ownership manager for durable CompanyIntegrationRun execution
|
|
12
|
+
* (GH tasks.md PR 1). One instance is created per sync run and owns:
|
|
13
|
+
*
|
|
14
|
+
* - **Claim**: a single atomic UPDATE...WHERE (unowned OR lease expired) via
|
|
15
|
+
* spClaimCompanyIntegrationRun — never select-then-update. Claiming bumps
|
|
16
|
+
* FenceToken, invalidating any prior holder's writes.
|
|
17
|
+
* - **Renew**: timer-driven lease extension (interval ≈ lease/3) via
|
|
18
|
+
* spRenewCompanyIntegrationRunLease, token+fence-checked. The renewal result
|
|
19
|
+
* doubles as the cross-process cancel signal (returns CancelRequestedAt).
|
|
20
|
+
* - **Boundary fence**: {@link CheckBoundary} — a cheap SELECT the sync loop
|
|
21
|
+
* calls before every batch's writes. Ownership lost ⇒ the loop throws
|
|
22
|
+
* {@link RunOwnershipLostError} and writes nothing further.
|
|
23
|
+
* - **Release**: terminal status write + owner clear, token-checked so a stale
|
|
24
|
+
* holder's release no-ops.
|
|
25
|
+
*
|
|
26
|
+
* All sproc calls use the dialect-portable positional-parameter convention
|
|
27
|
+
* (same pattern as ScheduledJobEngine's lock sprocs): SQL Server binds the
|
|
28
|
+
* sproc's named params to positional `@pN` placeholders via EXEC; PostgreSQL
|
|
29
|
+
* calls the plpgsql port via `SELECT * FROM fn($1,...)`. The SAME value array
|
|
30
|
+
* serves both.
|
|
31
|
+
*/
|
|
32
|
+
export class RunOwnershipService {
|
|
33
|
+
/** Default lease when the caller supplies no MaxRuntimeMinutes. */
|
|
34
|
+
static { this.DEFAULT_LEASE_MINUTES = 10; }
|
|
35
|
+
/**
|
|
36
|
+
* @param provider the run's OWN provider connection (per-run, never a shared
|
|
37
|
+
* engine-level provider — see the per-run-connection requirement).
|
|
38
|
+
* @param runID CompanyIntegrationRun.ID this service governs.
|
|
39
|
+
* @param leaseMinutes lease length; callers pass
|
|
40
|
+
* max(DEFAULT_LEASE_MINUTES, options.MaxRuntimeMinutes ?? 0) so a
|
|
41
|
+
* long-batch override only ever EXTENDS protection.
|
|
42
|
+
*/
|
|
43
|
+
constructor(provider, runID, leaseMinutes, contextUser) {
|
|
44
|
+
this.fenceToken = null;
|
|
45
|
+
this.lastKnownLeaseExpiresAt = null;
|
|
46
|
+
this.heartbeatTimer = null;
|
|
47
|
+
this.lostNotified = false;
|
|
48
|
+
this.cancelNotified = false;
|
|
49
|
+
this.renewInFlight = false;
|
|
50
|
+
this.lastProgressWriteMs = 0;
|
|
51
|
+
this.provider = provider;
|
|
52
|
+
this.runID = runID;
|
|
53
|
+
this.contextUser = contextUser;
|
|
54
|
+
// Cryptographic UUID — token identity IS execution identity; a collision
|
|
55
|
+
// between concurrent workers would defeat the fence.
|
|
56
|
+
this.ownerToken = randomUUID();
|
|
57
|
+
this.leaseMinutes = Math.max(RunOwnershipService.DEFAULT_LEASE_MINUTES, leaseMinutes ?? 0);
|
|
58
|
+
}
|
|
59
|
+
/** The CompanyIntegrationRun ID this service governs. */
|
|
60
|
+
get RunID() {
|
|
61
|
+
return this.runID;
|
|
62
|
+
}
|
|
63
|
+
/** The opaque owner token minted for this execution. */
|
|
64
|
+
get OwnerToken() {
|
|
65
|
+
return this.ownerToken;
|
|
66
|
+
}
|
|
67
|
+
/** The fence token returned by the successful claim (null before claim). */
|
|
68
|
+
get FenceToken() {
|
|
69
|
+
return this.fenceToken;
|
|
70
|
+
}
|
|
71
|
+
/** Last lease expiry the DB confirmed for us (null before claim). */
|
|
72
|
+
get LeaseExpiresAt() {
|
|
73
|
+
return this.lastKnownLeaseExpiresAt;
|
|
74
|
+
}
|
|
75
|
+
/** Lease length in minutes this service renews with. */
|
|
76
|
+
get LeaseMinutes() {
|
|
77
|
+
return this.leaseMinutes;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Atomically claim the run row. Returns true iff WE now own it (the sproc's
|
|
81
|
+
* single UPDATE succeeded because the row was unowned or its lease had
|
|
82
|
+
* expired). On success the DB-assigned FenceToken (bumped by the claim) and
|
|
83
|
+
* lease expiry are cached for renewals and boundary checks.
|
|
84
|
+
*/
|
|
85
|
+
async Claim() {
|
|
86
|
+
const rows = await this.provider.ExecuteSQL(this.buildSprocCall('spClaimCompanyIntegrationRun', ['RunID', 'OwnerToken', 'LeaseMinutes']), [this.runID, this.ownerToken, this.leaseMinutes], { isMutation: true, description: 'spClaimCompanyIntegrationRun' }, this.contextUser);
|
|
87
|
+
const row = rows?.[0];
|
|
88
|
+
if (!row) {
|
|
89
|
+
return false; // someone else holds a live lease
|
|
90
|
+
}
|
|
91
|
+
this.fenceToken = Number(row.FenceToken);
|
|
92
|
+
this.lastKnownLeaseExpiresAt = new Date(row.LeaseExpiresAt);
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Renew the lease (token+fence-checked). Zero rows back ⇒ ownership lost.
|
|
97
|
+
* Optionally piggybacks a progress snapshot onto the same write, and always
|
|
98
|
+
* surfaces the row's CancelRequestedAt so the heartbeat doubles as the
|
|
99
|
+
* cross-process cancel poll.
|
|
100
|
+
*/
|
|
101
|
+
async Renew(progressJSON) {
|
|
102
|
+
if (this.fenceToken == null) {
|
|
103
|
+
return { Renewed: false, CancelRequested: false };
|
|
104
|
+
}
|
|
105
|
+
const rows = await this.provider.ExecuteSQL(this.buildSprocCall('spRenewCompanyIntegrationRunLease', ['RunID', 'OwnerToken', 'FenceToken', 'LeaseMinutes', 'ProgressJSON']), [this.runID, this.ownerToken, this.fenceToken, this.leaseMinutes, progressJSON ?? null], { isMutation: true, description: 'spRenewCompanyIntegrationRunLease' }, this.contextUser);
|
|
106
|
+
const row = rows?.[0];
|
|
107
|
+
if (!row) {
|
|
108
|
+
return { Renewed: false, CancelRequested: false };
|
|
109
|
+
}
|
|
110
|
+
this.lastKnownLeaseExpiresAt = new Date(row.LeaseExpiresAt);
|
|
111
|
+
return { Renewed: true, CancelRequested: row.CancelRequestedAt != null };
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Batch-boundary fence: a cheap SELECT of the ownership columns. The sync
|
|
115
|
+
* loop calls this BEFORE each batch's writes; if we no longer own the row,
|
|
116
|
+
* the caller must throw {@link RunOwnershipLostError} and stop writing.
|
|
117
|
+
* Deliberately a plain read (no lease extension) — renewal belongs to the
|
|
118
|
+
* heartbeat timer, and a boundary check must stay cheap enough to run
|
|
119
|
+
* every batch.
|
|
120
|
+
*/
|
|
121
|
+
async CheckBoundary() {
|
|
122
|
+
const d = this.provider.Dialect;
|
|
123
|
+
const schema = d.QuoteIdentifier(this.provider.MJCoreSchemaName);
|
|
124
|
+
const table = d.QuoteIdentifier('CompanyIntegrationRun');
|
|
125
|
+
const placeholder = this.provider.BuildParameterPlaceholder(0);
|
|
126
|
+
const rows = await this.provider.ExecuteSQL(`SELECT ${d.QuoteIdentifier('OwnerToken')} AS OwnerToken, ` +
|
|
127
|
+
`${d.QuoteIdentifier('FenceToken')} AS FenceToken, ` +
|
|
128
|
+
`${d.QuoteIdentifier('CancelRequestedAt')} AS CancelRequestedAt ` +
|
|
129
|
+
`FROM ${schema}.${table} WHERE ${d.QuoteIdentifier('ID')} = ${placeholder}`, [this.runID], { isMutation: false, description: 'CompanyIntegrationRun ownership boundary check' }, this.contextUser);
|
|
130
|
+
const row = rows?.[0];
|
|
131
|
+
if (!row) {
|
|
132
|
+
return { Owned: false, CancelRequested: false }; // row gone ⇒ definitely not ours
|
|
133
|
+
}
|
|
134
|
+
const owned = row.OwnerToken != null
|
|
135
|
+
&& row.OwnerToken.toLowerCase() === this.ownerToken.toLowerCase()
|
|
136
|
+
&& Number(row.FenceToken) === this.fenceToken;
|
|
137
|
+
return { Owned: owned, CancelRequested: row.CancelRequestedAt != null };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Terminal release: set the final status, clear OwnerToken/LeaseExpiresAt,
|
|
141
|
+
* stamp EndedAt if unset. Token- AND fence-checked — a stale holder (lease
|
|
142
|
+
* reclaimed) releasing late is a harmless no-op (returns false).
|
|
143
|
+
*
|
|
144
|
+
* The fence is sent for the same reason Renew() sends it: the owner token proves
|
|
145
|
+
* only that *some* context using this token owns the row, not that THIS context
|
|
146
|
+
* still does. Each instance mints its own token and claims once, so the two are
|
|
147
|
+
* equivalent today — but Claim() is re-callable and overwrites the fence, so
|
|
148
|
+
* passing it keeps the guarantee in the procedure rather than in call-site
|
|
149
|
+
* discipline.
|
|
150
|
+
*/
|
|
151
|
+
async Release(finalStatus) {
|
|
152
|
+
this.StopHeartbeat();
|
|
153
|
+
const rows = await this.provider.ExecuteSQL(this.buildSprocCall('spReleaseCompanyIntegrationRun', ['RunID', 'OwnerToken', 'FinalStatus', 'FenceToken']), [this.runID, this.ownerToken, finalStatus, this.fenceToken], { isMutation: true, description: 'spReleaseCompanyIntegrationRun' }, this.contextUser);
|
|
154
|
+
return (rows?.length ?? 0) > 0;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Start the background renewal timer at interval ≈ lease/3 (so a renewal
|
|
158
|
+
* must fail ~3 consecutive times before the lease can lapse). The timer
|
|
159
|
+
* body is best-effort and never throws; renewal failures surface through
|
|
160
|
+
* opts.onLost exactly once. Idempotent — restarting replaces the timer.
|
|
161
|
+
*/
|
|
162
|
+
StartHeartbeat(opts) {
|
|
163
|
+
this.StopHeartbeat();
|
|
164
|
+
const intervalMs = Math.max(5_000, Math.floor((this.leaseMinutes * 60_000) / 3));
|
|
165
|
+
this.heartbeatTimer = setInterval(() => {
|
|
166
|
+
void this.heartbeatOnce(opts);
|
|
167
|
+
}, intervalMs);
|
|
168
|
+
// Never keep the process alive just to renew a lease.
|
|
169
|
+
this.heartbeatTimer.unref?.();
|
|
170
|
+
}
|
|
171
|
+
/** Stop the renewal timer (idempotent). */
|
|
172
|
+
StopHeartbeat() {
|
|
173
|
+
if (this.heartbeatTimer) {
|
|
174
|
+
clearInterval(this.heartbeatTimer);
|
|
175
|
+
this.heartbeatTimer = null;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Sync the entity's in-memory ownership columns to the service's last-known
|
|
180
|
+
* authoritative values before ANY full-row `run.Save()`. The generated
|
|
181
|
+
* spUpdate writes every column from the entity's in-memory state, so a
|
|
182
|
+
* terminal Save without this sync would clobber the DB's live
|
|
183
|
+
* FenceToken/OwnerToken/LeaseExpiresAt with the stale values the entity was
|
|
184
|
+
* loaded with (typically pre-claim). Call this immediately before each
|
|
185
|
+
* Save on the run row; Release() then clears ownership atomically.
|
|
186
|
+
*/
|
|
187
|
+
SyncEntityOwnershipFields(run) {
|
|
188
|
+
run.OwnerToken = this.ownerToken;
|
|
189
|
+
run.LeaseExpiresAt = this.lastKnownLeaseExpiresAt;
|
|
190
|
+
run.HeartbeatAt = new Date();
|
|
191
|
+
if (this.fenceToken != null) {
|
|
192
|
+
run.FenceToken = this.fenceToken;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Persist a progress snapshot to the run row's ProgressJSON (PR 1 item 4 —
|
|
197
|
+
* progress lives in the database; readers query the row). Ownership-guarded
|
|
198
|
+
* (WHERE OwnerToken AND FenceToken) so a reclaimed run can never overwrite the
|
|
199
|
+
* new owner's progress. Throttled internally (default once per 5s) so progress
|
|
200
|
+
* never becomes its own hot path; best-effort — a progress write failure must
|
|
201
|
+
* never fault the sync.
|
|
202
|
+
*/
|
|
203
|
+
async WriteProgress(progressJSON, minIntervalMs = 5_000) {
|
|
204
|
+
if (this.fenceToken == null)
|
|
205
|
+
return;
|
|
206
|
+
const now = Date.now();
|
|
207
|
+
if (now - this.lastProgressWriteMs < minIntervalMs)
|
|
208
|
+
return;
|
|
209
|
+
this.lastProgressWriteMs = now;
|
|
210
|
+
try {
|
|
211
|
+
const d = this.provider.Dialect;
|
|
212
|
+
const schema = d.QuoteIdentifier(this.provider.MJCoreSchemaName);
|
|
213
|
+
const table = d.QuoteIdentifier('CompanyIntegrationRun');
|
|
214
|
+
const ph = (i) => this.provider.BuildParameterPlaceholder(i);
|
|
215
|
+
await this.provider.ExecuteSQL(`UPDATE ${schema}.${table} SET ${d.QuoteIdentifier('ProgressJSON')} = ${ph(0)}, ` +
|
|
216
|
+
`${d.QuoteIdentifier('HeartbeatAt')} = ${d.CurrentTimestampUTC()} ` +
|
|
217
|
+
`WHERE ${d.QuoteIdentifier('ID')} = ${ph(1)} AND ${d.QuoteIdentifier('OwnerToken')} = ${ph(2)} ` +
|
|
218
|
+
`AND ${d.QuoteIdentifier('FenceToken')} = ${ph(3)}`, [progressJSON, this.runID, this.ownerToken, this.fenceToken], { isMutation: true, description: 'CompanyIntegrationRun progress write (ownership-guarded)' }, this.contextUser);
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
LogErrorEx({
|
|
222
|
+
message: `[RunOwnership] Progress write failed for run ${this.runID.substring(0, 8)} (non-fatal)`,
|
|
223
|
+
category: 'IntegrationEngine',
|
|
224
|
+
error: error instanceof Error ? error : undefined,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/** One heartbeat tick: renew, then fan out lost/cancel notifications once each. */
|
|
229
|
+
async heartbeatOnce(opts) {
|
|
230
|
+
if (this.renewInFlight) {
|
|
231
|
+
return; // never stack renewals behind a slow DB
|
|
232
|
+
}
|
|
233
|
+
this.renewInFlight = true;
|
|
234
|
+
try {
|
|
235
|
+
const progress = opts?.progressSupplier ? opts.progressSupplier() : null;
|
|
236
|
+
const result = await this.Renew(progress);
|
|
237
|
+
if (!result.Renewed) {
|
|
238
|
+
if (!this.lostNotified) {
|
|
239
|
+
this.lostNotified = true;
|
|
240
|
+
LogStatusEx({
|
|
241
|
+
message: `[RunOwnership] Lease for run ${this.runID.substring(0, 8)} NOT renewed ` +
|
|
242
|
+
`(token/fence mismatch — reclaimed by another holder). Aborting locally.`,
|
|
243
|
+
category: 'IntegrationEngine',
|
|
244
|
+
});
|
|
245
|
+
opts?.onLost?.();
|
|
246
|
+
}
|
|
247
|
+
this.StopHeartbeat(); // no point renewing a lost lease
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (result.CancelRequested && !this.cancelNotified) {
|
|
251
|
+
this.cancelNotified = true;
|
|
252
|
+
opts?.onCancelRequested?.();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
// Best-effort: a transient renewal failure must never fault the sync.
|
|
257
|
+
// The lease covers ~3 intervals, so one failed tick is survivable.
|
|
258
|
+
LogErrorEx({
|
|
259
|
+
message: `[RunOwnership] Lease renewal failed for run ${this.runID.substring(0, 8)} (non-fatal)`,
|
|
260
|
+
category: 'IntegrationEngine',
|
|
261
|
+
error: error instanceof Error ? error : undefined,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
this.renewInFlight = false;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Dialect-portable sproc call, preserving the MJ positional-parameter-array
|
|
270
|
+
* convention (same helper shape as ScheduledJobEngine.buildLockSprocCall).
|
|
271
|
+
*/
|
|
272
|
+
buildSprocCall(sprocName, paramNames) {
|
|
273
|
+
const placeholders = this.provider.PlatformKey === 'postgresql'
|
|
274
|
+
? paramNames.map((_name, i) => `$${i + 1}`)
|
|
275
|
+
: paramNames.map((name, i) => `@${name}=@p${i}`);
|
|
276
|
+
return this.provider.Dialect.ProcedureCallSyntax(this.provider.MJCoreSchemaName, sprocName, placeholders);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=RunOwnershipService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunOwnershipService.js","sourceRoot":"","sources":["../src/RunOwnershipService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field-level sync directives.
|
|
3
|
+
*
|
|
4
|
+
* A connector can now declare that a source field should not be synced at all
|
|
5
|
+
* (`SourceFieldInfo.SyncDirective: 'Exclude'`). The directive is persisted into
|
|
6
|
+
* `IntegrationObjectField.Configuration` (a JSON column that already exists, so no
|
|
7
|
+
* migration is required) and honoured by the mapping stage, which strips excluded
|
|
8
|
+
* keys from the record BEFORE field mapping runs.
|
|
9
|
+
*
|
|
10
|
+
* Why stripping must happen there and not by deactivating a field map: an unmapped
|
|
11
|
+
* source key does not disappear — `computeUnmappedFields` captures it and the writer
|
|
12
|
+
* parks it in `__mj_integration_CustomOverflow`. Deactivating the map therefore
|
|
13
|
+
* REROUTES the value instead of excluding it, and the custom-column promoter will
|
|
14
|
+
* happily resurrect it as a real column later. Stripping before mapping keeps the
|
|
15
|
+
* key out of MappedFields, out of the overflow, and out of the content hash (whose
|
|
16
|
+
* basis is MappedFields), so an excluded field stops influencing change detection
|
|
17
|
+
* entirely.
|
|
18
|
+
*
|
|
19
|
+
* What this is for, concretely (measured on a live tenant, 2026-08-19):
|
|
20
|
+
* - `preferences` on Totara Users / Enrolled_Users: Moodle UI widget state
|
|
21
|
+
* (file-picker recents, user-selector toggles), identical nine keys on 100% of
|
|
22
|
+
* rows — ~2.5M expanded values of nothing.
|
|
23
|
+
* - `courseformatoptions` on Courses: course theming (header colours, tile icons).
|
|
24
|
+
* - `enrolledcourses` on Enrolled_Users: re-derives the Enrolled_Users table
|
|
25
|
+
* itself — ~7.6M expanded values that duplicate an object already synced.
|
|
26
|
+
*
|
|
27
|
+
* The directive lives in Configuration rather than a new column so that existing
|
|
28
|
+
* installs pick it up on their next schema sync with no DDL. Absence of a directive
|
|
29
|
+
* means Sync — connectors that never heard of this feature behave exactly as before.
|
|
30
|
+
*/
|
|
31
|
+
/** The Configuration key under which a field's sync directive is stored. */
|
|
32
|
+
export declare const SYNC_DIRECTIVE_CONFIG_KEY = "syncDirective";
|
|
33
|
+
/** Recognised directive values. Anything unrecognised is treated as 'Sync'. */
|
|
34
|
+
export type FieldSyncDirective = 'Sync' | 'Exclude';
|
|
35
|
+
/** Minimal shape of an IntegrationObjectField row this module needs. */
|
|
36
|
+
export interface FieldWithConfiguration {
|
|
37
|
+
Name: string;
|
|
38
|
+
Configuration: string | null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Reads the sync directive out of an IntegrationObjectField.Configuration JSON blob.
|
|
42
|
+
* Malformed JSON, a missing key, or an unrecognised value all mean 'Sync' — the
|
|
43
|
+
* directive can only ever narrow what is synced, never break a sync by its absence.
|
|
44
|
+
*/
|
|
45
|
+
export declare function ReadFieldSyncDirective(configuration: string | null | undefined): FieldSyncDirective;
|
|
46
|
+
/**
|
|
47
|
+
* Merges a directive into an existing Configuration JSON string, preserving every
|
|
48
|
+
* other key. Returns the new JSON, or the original string when nothing changes
|
|
49
|
+
* (so callers can cheaply detect no-op writes). Setting 'Sync' REMOVES the key
|
|
50
|
+
* rather than storing the default.
|
|
51
|
+
*/
|
|
52
|
+
export declare function WriteFieldSyncDirective(configuration: string | null | undefined, directive: FieldSyncDirective): string | null;
|
|
53
|
+
/**
|
|
54
|
+
* The set of source field names to strip for one integration object, derived from
|
|
55
|
+
* its IntegrationObjectField rows. Empty set when nothing is excluded — the
|
|
56
|
+
* mapping engine's fast path.
|
|
57
|
+
*/
|
|
58
|
+
export declare function ComputeExcludedSourceNames(fields: ReadonlyArray<FieldWithConfiguration>): Set<string>;
|
|
59
|
+
/**
|
|
60
|
+
* Returns a copy of `fields` without the excluded keys, or the ORIGINAL object when
|
|
61
|
+
* no key matches (so the no-exclusions path allocates nothing). Matching is exact:
|
|
62
|
+
* source field names are the connector's own spelling, already used verbatim as
|
|
63
|
+
* field-map SourceFieldName and overflow keys.
|
|
64
|
+
*/
|
|
65
|
+
export declare function StripExcludedFields(fields: Record<string, unknown>, excluded: ReadonlySet<string>): Record<string, unknown>;
|
|
66
|
+
//# sourceMappingURL=SyncDirectives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncDirectives.d.ts","sourceRoot":"","sources":["../src/SyncDirectives.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AAEzD,+EAA+E;AAC/E,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAAC;AAEpD,wEAAwE;AACxE,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,kBAAkB,CAYnG;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACnC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,SAAS,EAAE,kBAAkB,GAC9B,MAAM,GAAG,IAAI,CAqBf;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,CAAC,sBAAsB,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAQrG;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYzB"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field-level sync directives.
|
|
3
|
+
*
|
|
4
|
+
* A connector can now declare that a source field should not be synced at all
|
|
5
|
+
* (`SourceFieldInfo.SyncDirective: 'Exclude'`). The directive is persisted into
|
|
6
|
+
* `IntegrationObjectField.Configuration` (a JSON column that already exists, so no
|
|
7
|
+
* migration is required) and honoured by the mapping stage, which strips excluded
|
|
8
|
+
* keys from the record BEFORE field mapping runs.
|
|
9
|
+
*
|
|
10
|
+
* Why stripping must happen there and not by deactivating a field map: an unmapped
|
|
11
|
+
* source key does not disappear — `computeUnmappedFields` captures it and the writer
|
|
12
|
+
* parks it in `__mj_integration_CustomOverflow`. Deactivating the map therefore
|
|
13
|
+
* REROUTES the value instead of excluding it, and the custom-column promoter will
|
|
14
|
+
* happily resurrect it as a real column later. Stripping before mapping keeps the
|
|
15
|
+
* key out of MappedFields, out of the overflow, and out of the content hash (whose
|
|
16
|
+
* basis is MappedFields), so an excluded field stops influencing change detection
|
|
17
|
+
* entirely.
|
|
18
|
+
*
|
|
19
|
+
* What this is for, concretely (measured on a live tenant, 2026-08-19):
|
|
20
|
+
* - `preferences` on Totara Users / Enrolled_Users: Moodle UI widget state
|
|
21
|
+
* (file-picker recents, user-selector toggles), identical nine keys on 100% of
|
|
22
|
+
* rows — ~2.5M expanded values of nothing.
|
|
23
|
+
* - `courseformatoptions` on Courses: course theming (header colours, tile icons).
|
|
24
|
+
* - `enrolledcourses` on Enrolled_Users: re-derives the Enrolled_Users table
|
|
25
|
+
* itself — ~7.6M expanded values that duplicate an object already synced.
|
|
26
|
+
*
|
|
27
|
+
* The directive lives in Configuration rather than a new column so that existing
|
|
28
|
+
* installs pick it up on their next schema sync with no DDL. Absence of a directive
|
|
29
|
+
* means Sync — connectors that never heard of this feature behave exactly as before.
|
|
30
|
+
*/
|
|
31
|
+
/** The Configuration key under which a field's sync directive is stored. */
|
|
32
|
+
export const SYNC_DIRECTIVE_CONFIG_KEY = 'syncDirective';
|
|
33
|
+
/**
|
|
34
|
+
* Reads the sync directive out of an IntegrationObjectField.Configuration JSON blob.
|
|
35
|
+
* Malformed JSON, a missing key, or an unrecognised value all mean 'Sync' — the
|
|
36
|
+
* directive can only ever narrow what is synced, never break a sync by its absence.
|
|
37
|
+
*/
|
|
38
|
+
export function ReadFieldSyncDirective(configuration) {
|
|
39
|
+
if (!configuration)
|
|
40
|
+
return 'Sync';
|
|
41
|
+
try {
|
|
42
|
+
const parsed = JSON.parse(configuration);
|
|
43
|
+
if (parsed && typeof parsed === 'object') {
|
|
44
|
+
const v = parsed[SYNC_DIRECTIVE_CONFIG_KEY];
|
|
45
|
+
if (typeof v === 'string' && v.toLowerCase() === 'exclude')
|
|
46
|
+
return 'Exclude';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Malformed Configuration is not this feature's problem to surface.
|
|
51
|
+
}
|
|
52
|
+
return 'Sync';
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Merges a directive into an existing Configuration JSON string, preserving every
|
|
56
|
+
* other key. Returns the new JSON, or the original string when nothing changes
|
|
57
|
+
* (so callers can cheaply detect no-op writes). Setting 'Sync' REMOVES the key
|
|
58
|
+
* rather than storing the default.
|
|
59
|
+
*/
|
|
60
|
+
export function WriteFieldSyncDirective(configuration, directive) {
|
|
61
|
+
let obj = {};
|
|
62
|
+
if (configuration) {
|
|
63
|
+
try {
|
|
64
|
+
const parsed = JSON.parse(configuration);
|
|
65
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
66
|
+
obj = parsed;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Unparseable existing Configuration: preserve it untouched rather than
|
|
71
|
+
// destroy whatever it held. The directive is not worth data loss.
|
|
72
|
+
return configuration;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (directive === 'Exclude') {
|
|
76
|
+
obj[SYNC_DIRECTIVE_CONFIG_KEY] = 'Exclude';
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
delete obj[SYNC_DIRECTIVE_CONFIG_KEY];
|
|
80
|
+
}
|
|
81
|
+
const out = Object.keys(obj).length > 0 ? JSON.stringify(obj) : null;
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The set of source field names to strip for one integration object, derived from
|
|
86
|
+
* its IntegrationObjectField rows. Empty set when nothing is excluded — the
|
|
87
|
+
* mapping engine's fast path.
|
|
88
|
+
*/
|
|
89
|
+
export function ComputeExcludedSourceNames(fields) {
|
|
90
|
+
const out = new Set();
|
|
91
|
+
for (const f of fields) {
|
|
92
|
+
if (ReadFieldSyncDirective(f.Configuration) === 'Exclude') {
|
|
93
|
+
out.add(f.Name);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Returns a copy of `fields` without the excluded keys, or the ORIGINAL object when
|
|
100
|
+
* no key matches (so the no-exclusions path allocates nothing). Matching is exact:
|
|
101
|
+
* source field names are the connector's own spelling, already used verbatim as
|
|
102
|
+
* field-map SourceFieldName and overflow keys.
|
|
103
|
+
*/
|
|
104
|
+
export function StripExcludedFields(fields, excluded) {
|
|
105
|
+
if (excluded.size === 0)
|
|
106
|
+
return fields;
|
|
107
|
+
let hit = false;
|
|
108
|
+
for (const k of Object.keys(fields)) {
|
|
109
|
+
if (excluded.has(k)) {
|
|
110
|
+
hit = true;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (!hit)
|
|
115
|
+
return fields;
|
|
116
|
+
const out = {};
|
|
117
|
+
for (const [k, v] of Object.entries(fields)) {
|
|
118
|
+
if (!excluded.has(k))
|
|
119
|
+
out[k] = v;
|
|
120
|
+
}
|
|
121
|
+
return out;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=SyncDirectives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncDirectives.js","sourceRoot":"","sources":["../src/SyncDirectives.ts"],"names":[],"mappings":"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"}
|
package/dist/SyncLogger.d.ts
CHANGED
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
* tail -f /tmp/mjapi.log | grep '"event":"sync\.push\.' # only outbound writes
|
|
36
36
|
* tail -f /tmp/mjapi.log | grep '"event":"sync\..*\.error"' # only errors
|
|
37
37
|
*/
|
|
38
|
-
export type SyncLogEvent = 'sync.run.start' | 'sync.config.loaded' | 'sync.connector.built' | 'sync.connector.test' | 'sync.entity-map.start' | 'sync.resume.keyset' | 'sync.partition.reconcile' | 'sync.fetch.batch.start' | 'sync.fetch.batch.complete' | 'sync.fetch.retry' | 'sync.record.decision' | 'sync.record.saved' | 'sync.record.error' | 'sync.record.retry' | 'sync.record.archived' | 'sync.record.conflict' | 'sync.push.candidates' | 'sync.push.record' | 'sync.push.response' | 'sync.entity-map.complete' | 'sync.run.complete' | 'sync.run.fail' | 'sync.run.cancelled' | 'sync.schema_update' | 'sync.warning';
|
|
38
|
+
export type SyncLogEvent = 'sync.run.start' | 'sync.config.loaded' | 'sync.connector.built' | 'sync.connector.test' | 'sync.entity-map.start' | 'sync.entity-map.exclusions' | 'sync.resume.keyset' | 'sync.partition.reconcile' | 'sync.fetch.batch.start' | 'sync.fetch.batch.complete' | 'sync.fetch.retry' | 'sync.record.decision' | 'sync.record.saved' | 'sync.record.error' | 'sync.record.retry' | 'sync.record.archived' | 'sync.record.conflict' | 'sync.push.candidates' | 'sync.push.record' | 'sync.push.response' | 'sync.entity-map.complete' | 'sync.run.complete' | 'sync.run.fail' | 'sync.run.cancelled' | 'sync.schema_update' | 'sync.warning';
|
|
39
39
|
import type { IntegrationProgressEmitter } from '@memberjunction/integration-progress-artifacts';
|
|
40
40
|
export interface SyncLoggerContext {
|
|
41
41
|
/** CompanyIntegration ID — the per-run anchor for filtering. */
|
package/dist/SyncLogger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyncLogger.d.ts","sourceRoot":"","sources":["../src/SyncLogger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,MAAM,MAAM,YAAY,GAClB,gBAAgB,GAChB,oBAAoB,GACpB,sBAAsB,GACtB,qBAAqB,GACrB,uBAAuB,GACvB,oBAAoB,GACpB,0BAA0B,GAC1B,wBAAwB,GACxB,2BAA2B,GAC3B,kBAAkB,GAClB,sBAAsB,GACtB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,sBAAsB,GACtB,sBAAsB,GACtB,sBAAsB,GACtB,kBAAkB,GAClB,oBAAoB,GACpB,0BAA0B,GAC1B,mBAAmB,GACnB,eAAe,GACf,oBAAoB,GACpB,oBAAoB,GACpB,cAAc,CAAC;AAErB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gDAAgD,CAAC;AAEjG,MAAM,WAAW,iBAAiB;IAC9B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvC,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iDAAiD;IACjD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAkBD;;;;GAIG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IACxC,OAAO,CAAC,OAAO,CAAC,CAA6B;gBAEjC,GAAG,EAAE,iBAAiB;IAIlC,6DAA6D;IACtD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIvC,6EAA6E;IACtE,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAInE;;;;;;;OAOG;IACI,aAAa,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI;IAI/D;;;;;OAKG;IACI,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI/E;;;;;;;OAOG;IACI,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3F,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI;IAuB1E;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAyDxB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,GAAG;IAIX,qFAAqF;IACrF,OAAO,CAAC,QAAQ;CAGnB"}
|
|
1
|
+
{"version":3,"file":"SyncLogger.d.ts","sourceRoot":"","sources":["../src/SyncLogger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,MAAM,MAAM,YAAY,GAClB,gBAAgB,GAChB,oBAAoB,GACpB,sBAAsB,GACtB,qBAAqB,GACrB,uBAAuB,GACvB,4BAA4B,GAC5B,oBAAoB,GACpB,0BAA0B,GAC1B,wBAAwB,GACxB,2BAA2B,GAC3B,kBAAkB,GAClB,sBAAsB,GACtB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,sBAAsB,GACtB,sBAAsB,GACtB,sBAAsB,GACtB,kBAAkB,GAClB,oBAAoB,GACpB,0BAA0B,GAC1B,mBAAmB,GACnB,eAAe,GACf,oBAAoB,GACpB,oBAAoB,GACpB,cAAc,CAAC;AAErB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gDAAgD,CAAC;AAEjG,MAAM,WAAW,iBAAiB;IAC9B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvC,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iDAAiD;IACjD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAkBD;;;;GAIG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IACxC,OAAO,CAAC,OAAO,CAAC,CAA6B;gBAEjC,GAAG,EAAE,iBAAiB;IAIlC,6DAA6D;IACtD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIvC,6EAA6E;IACtE,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAInE;;;;;;;OAOG;IACI,aAAa,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI;IAI/D;;;;;OAKG;IACI,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI/E;;;;;;;OAOG;IACI,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3F,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI;IAuB1E;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAyDxB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,GAAG;IAIX,qFAAqF;IACrF,OAAO,CAAC,QAAQ;CAGnB"}
|
package/dist/SyncLogger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyncLogger.js","sourceRoot":"","sources":["../src/SyncLogger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;
|
|
1
|
+
{"version":3,"file":"SyncLogger.js","sourceRoot":"","sources":["../src/SyncLogger.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,14 @@ export declare class WatermarkService {
|
|
|
24
24
|
* @param contextUser - User context for data access
|
|
25
25
|
*/
|
|
26
26
|
Update(entityMapID: string, newValue: string, contextUser: UserInfo, direction?: 'Pull' | 'Push'): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Puts the watermark VALUE back to a prior state — the undo for a mid-run durability floor
|
|
29
|
+
* (IntegrationEngine §8a) after a page-skip gap makes that floor unsafe. Accepts null because
|
|
30
|
+
* the prior state may be "no watermark yet" (first run / the row was created BY the floor);
|
|
31
|
+
* a null value re-triggers a full window fetch on the next run, which is exactly the hold
|
|
32
|
+
* semantics the gap requires. A missing row means no floor was ever written — nothing to do.
|
|
33
|
+
*/
|
|
34
|
+
RestoreValue(entityMapID: string, value: string | null, contextUser: UserInfo, direction?: 'Pull' | 'Push'): Promise<void>;
|
|
27
35
|
/**
|
|
28
36
|
* Updates the progress fields on an existing watermark mid-sync without changing
|
|
29
37
|
* the WatermarkValue. Updates RecordsSynced to the cumulative total written so far
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WatermarkService.d.ts","sourceRoot":"","sources":["../src/WatermarkService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;GAGG;AACH,qBAAa,gBAAgB;IACzB;;;;;;OAMG;IACU,IAAI,CACb,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,QAAQ,EACrB,SAAS,GAAE,MAAM,GAAG,MAAe,GACpC,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC;IAsBnD;;;;;;;;OAQG;IACU,MAAM,CACf,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,QAAQ,EACrB,SAAS,GAAE,MAAM,GAAG,MAAe,GACpC,OAAO,CAAC,IAAI,CAAC;IAShB;;;;;;;;;OASG;IACU,cAAc,CACvB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,IAAI,CAAC;IAShB;;;;;;OAMG;IACI,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO;IAkBvF;;;;;;;;OAQG;IACU,kBAAkB,CAC3B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,IAAI,CAAC;IAehB;;;;;OAKG;IACU,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3F;;;;;OAKG;IACU,oBAAoB,CAC7B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,IAAI,CAAC;IAchB;;;OAGG;IACU,oBAAoB,CAC7B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAa/B;;OAEG;YACW,uBAAuB;IAYrC;;;OAGG;YACW,kBAAkB;IAShC;;;OAGG;YACW,eAAe;CAsChC"}
|
|
1
|
+
{"version":3,"file":"WatermarkService.d.ts","sourceRoot":"","sources":["../src/WatermarkService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;GAGG;AACH,qBAAa,gBAAgB;IACzB;;;;;;OAMG;IACU,IAAI,CACb,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,QAAQ,EACrB,SAAS,GAAE,MAAM,GAAG,MAAe,GACpC,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC;IAsBnD;;;;;;;;OAQG;IACU,MAAM,CACf,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,QAAQ,EACrB,SAAS,GAAE,MAAM,GAAG,MAAe,GACpC,OAAO,CAAC,IAAI,CAAC;IAShB;;;;;;OAMG;IACU,YAAY,CACrB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,WAAW,EAAE,QAAQ,EACrB,SAAS,GAAE,MAAM,GAAG,MAAe,GACpC,OAAO,CAAC,IAAI,CAAC;IAWhB;;;;;;;;;OASG;IACU,cAAc,CACvB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,IAAI,CAAC;IAShB;;;;;;OAMG;IACI,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO;IAkBvF;;;;;;;;OAQG;IACU,kBAAkB,CAC3B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,IAAI,CAAC;IAehB;;;;;OAKG;IACU,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3F;;;;;OAKG;IACU,oBAAoB,CAC7B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,IAAI,CAAC;IAchB;;;OAGG;IACU,oBAAoB,CAC7B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAa/B;;OAEG;YACW,uBAAuB;IAYrC;;;OAGG;YACW,kBAAkB;IAShC;;;OAGG;YACW,eAAe;CAsChC"}
|
package/dist/WatermarkService.js
CHANGED
|
@@ -50,6 +50,24 @@ export class WatermarkService {
|
|
|
50
50
|
await this.CreateNewWatermark(entityMapID, newValue, contextUser, direction);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Puts the watermark VALUE back to a prior state — the undo for a mid-run durability floor
|
|
55
|
+
* (IntegrationEngine §8a) after a page-skip gap makes that floor unsafe. Accepts null because
|
|
56
|
+
* the prior state may be "no watermark yet" (first run / the row was created BY the floor);
|
|
57
|
+
* a null value re-triggers a full window fetch on the next run, which is exactly the hold
|
|
58
|
+
* semantics the gap requires. A missing row means no floor was ever written — nothing to do.
|
|
59
|
+
*/
|
|
60
|
+
async RestoreValue(entityMapID, value, contextUser, direction = 'Pull') {
|
|
61
|
+
const existing = await this.Load(entityMapID, contextUser, direction);
|
|
62
|
+
if (!existing)
|
|
63
|
+
return;
|
|
64
|
+
existing.WatermarkValue = value;
|
|
65
|
+
existing.LastSyncAt = new Date();
|
|
66
|
+
const saved = await existing.Save();
|
|
67
|
+
if (!saved) {
|
|
68
|
+
throw new Error(`Failed to restore watermark for EntityMapID=${entityMapID}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
53
71
|
/**
|
|
54
72
|
* Updates the progress fields on an existing watermark mid-sync without changing
|
|
55
73
|
* the WatermarkValue. Updates RecordsSynced to the cumulative total written so far
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WatermarkService.js","sourceRoot":"","sources":["../src/WatermarkService.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WatermarkService.js","sourceRoot":"","sources":["../src/WatermarkService.ts"],"names":[],"mappings":"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"}
|