@memberjunction/record-set-processor 0.0.1 → 5.43.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.
- package/README.md +58 -43
- package/dist/RateLimiter.d.ts +46 -0
- package/dist/RateLimiter.d.ts.map +1 -0
- package/dist/RateLimiter.js +71 -0
- package/dist/RateLimiter.js.map +1 -0
- package/dist/RecordProcessExecutor.d.ts +53 -0
- package/dist/RecordProcessExecutor.d.ts.map +1 -0
- package/dist/RecordProcessExecutor.js +141 -0
- package/dist/RecordProcessExecutor.js.map +1 -0
- package/dist/RecordSetProcessor.d.ts +36 -0
- package/dist/RecordSetProcessor.d.ts.map +1 -0
- package/dist/RecordSetProcessor.js +216 -0
- package/dist/RecordSetProcessor.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/operations/RecordProcessControlOperations.d.ts +33 -0
- package/dist/operations/RecordProcessControlOperations.d.ts.map +1 -0
- package/dist/operations/RecordProcessControlOperations.js +117 -0
- package/dist/operations/RecordProcessControlOperations.js.map +1 -0
- package/dist/operations/RecordProcessGetRunStatusOperation.d.ts +19 -0
- package/dist/operations/RecordProcessGetRunStatusOperation.d.ts.map +1 -0
- package/dist/operations/RecordProcessGetRunStatusOperation.js +51 -0
- package/dist/operations/RecordProcessGetRunStatusOperation.js.map +1 -0
- package/dist/processors/ActionRecordProcessor.d.ts +27 -0
- package/dist/processors/ActionRecordProcessor.d.ts.map +1 -0
- package/dist/processors/ActionRecordProcessor.js +61 -0
- package/dist/processors/ActionRecordProcessor.js.map +1 -0
- package/dist/processors/AgentRecordProcessor.d.ts +23 -0
- package/dist/processors/AgentRecordProcessor.d.ts.map +1 -0
- package/dist/processors/AgentRecordProcessor.js +51 -0
- package/dist/processors/AgentRecordProcessor.js.map +1 -0
- package/dist/processors/FieldRulesProcessor.d.ts +44 -0
- package/dist/processors/FieldRulesProcessor.d.ts.map +1 -0
- package/dist/processors/FieldRulesProcessor.js +130 -0
- package/dist/processors/FieldRulesProcessor.js.map +1 -0
- package/dist/processors/FunctionRecordProcessor.d.ts +16 -0
- package/dist/processors/FunctionRecordProcessor.d.ts.map +1 -0
- package/dist/processors/FunctionRecordProcessor.js +16 -0
- package/dist/processors/FunctionRecordProcessor.js.map +1 -0
- package/dist/processors/InferProcessor.d.ts +24 -0
- package/dist/processors/InferProcessor.d.ts.map +1 -0
- package/dist/processors/InferProcessor.js +60 -0
- package/dist/processors/InferProcessor.js.map +1 -0
- package/dist/processors/WriteBackProcessor.d.ts +20 -0
- package/dist/processors/WriteBackProcessor.d.ts.map +1 -0
- package/dist/processors/WriteBackProcessor.js +41 -0
- package/dist/processors/WriteBackProcessor.js.map +1 -0
- package/dist/trackers/GenericProcessRunTracker.d.ts +24 -0
- package/dist/trackers/GenericProcessRunTracker.d.ts.map +1 -0
- package/dist/trackers/GenericProcessRunTracker.js +133 -0
- package/dist/trackers/GenericProcessRunTracker.js.map +1 -0
- package/dist/trackers/NoOpTracker.d.ts +15 -0
- package/dist/trackers/NoOpTracker.d.ts.map +1 -0
- package/dist/trackers/NoOpTracker.js +24 -0
- package/dist/trackers/NoOpTracker.js.map +1 -0
- package/dist/writeBack.d.ts +42 -0
- package/dist/writeBack.d.ts.map +1 -0
- package/dist/writeBack.js +59 -0
- package/dist/writeBack.js.map +1 -0
- package/package.json +39 -7
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The Record Set Processor engine — the single substrate every set-iterating job
|
|
3
|
+
* routes through. It owns batching, bounded concurrency, optional rate limiting, an error-rate
|
|
4
|
+
* circuit breaker, a budget-gate hook, progress events, the pause/cancel handshake, resume from a
|
|
5
|
+
* checkpoint, and per-record error isolation — while delegating *what to iterate* (source), *what
|
|
6
|
+
* to do* (processor), and *where to persist* (tracker) to pluggable seams.
|
|
7
|
+
* @module @memberjunction/record-set-processor
|
|
8
|
+
*/
|
|
9
|
+
import { BaseSingleton } from '@memberjunction/global';
|
|
10
|
+
import { LogError, Metadata } from '@memberjunction/core';
|
|
11
|
+
import { RateLimiter } from './RateLimiter.js';
|
|
12
|
+
import { GenericProcessRunTracker } from './trackers/GenericProcessRunTracker.js';
|
|
13
|
+
/** Default batch size when none is supplied. */
|
|
14
|
+
const DEFAULT_BATCH_SIZE = 100;
|
|
15
|
+
/** Default error-rate circuit-breaker threshold (percent). */
|
|
16
|
+
const DEFAULT_ERROR_THRESHOLD = 20;
|
|
17
|
+
/**
|
|
18
|
+
* The server-side engine that processes a record set through the source/processor/tracker pipeline.
|
|
19
|
+
* Use the {@link Instance} singleton: `await RecordSetProcessor.Instance.Process({ ... })`.
|
|
20
|
+
*/
|
|
21
|
+
export class RecordSetProcessor extends BaseSingleton {
|
|
22
|
+
/** The process-wide singleton instance. */
|
|
23
|
+
static get Instance() {
|
|
24
|
+
return super.getInstance();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Processes a record set end to end and returns the run summary.
|
|
28
|
+
* Logical failures never throw — inspect the returned {@link ProcessRunResult}.
|
|
29
|
+
*
|
|
30
|
+
* @param options - The source, processor, tracker, and execution knobs for this run.
|
|
31
|
+
* @returns The run summary plus the persisted run ID (when a persisting tracker was used).
|
|
32
|
+
*/
|
|
33
|
+
async Process(options) {
|
|
34
|
+
const { source, processor, contextUser } = options;
|
|
35
|
+
const provider = options.provider ?? Metadata.Provider;
|
|
36
|
+
const tracker = options.tracker ?? new GenericProcessRunTracker();
|
|
37
|
+
const batchSize = options.batchSize ?? DEFAULT_BATCH_SIZE;
|
|
38
|
+
const maxConcurrency = Math.max(1, options.maxConcurrency ?? 1);
|
|
39
|
+
const errorThreshold = options.errorThresholdPercent ?? DEFAULT_ERROR_THRESHOLD;
|
|
40
|
+
const delayMs = options.delayBetweenBatchesMs ?? 0;
|
|
41
|
+
const shouldResume = options.resume ?? true;
|
|
42
|
+
const rateLimiter = options.rateLimit
|
|
43
|
+
? new RateLimiter({ RequestsPerMinute: options.rateLimit.requestsPerMinute, TokensPerMinute: options.rateLimit.tokensPerMinute })
|
|
44
|
+
: undefined;
|
|
45
|
+
const descriptor = source.Describe();
|
|
46
|
+
const meta = {
|
|
47
|
+
RecordProcessID: options.recordProcessID,
|
|
48
|
+
ScheduledJobRunID: options.scheduledJobRunID,
|
|
49
|
+
EntityID: options.entityID ?? descriptor.EntityID,
|
|
50
|
+
TriggeredBy: options.triggeredBy ?? 'Manual',
|
|
51
|
+
SourceType: descriptor.SourceType,
|
|
52
|
+
SourceID: descriptor.SourceID,
|
|
53
|
+
SourceFilter: descriptor.SourceFilter,
|
|
54
|
+
BatchSize: batchSize,
|
|
55
|
+
Configuration: options.configuration,
|
|
56
|
+
DryRun: options.dryRun,
|
|
57
|
+
};
|
|
58
|
+
const handle = await tracker.BeginRun(meta, contextUser, provider);
|
|
59
|
+
const counts = { Processed: 0, Success: 0, Error: 0, Skipped: 0 };
|
|
60
|
+
let cursor = shouldResume ? await tracker.LoadResumeCursor(handle, contextUser, provider) : undefined;
|
|
61
|
+
let total = null;
|
|
62
|
+
let status = 'Running';
|
|
63
|
+
let errorMessage;
|
|
64
|
+
const startTime = new Date();
|
|
65
|
+
try {
|
|
66
|
+
status = await this.runBatchLoop({
|
|
67
|
+
options, source, processor, tracker, handle, provider,
|
|
68
|
+
batchSize, maxConcurrency, errorThreshold, delayMs, rateLimiter,
|
|
69
|
+
counts,
|
|
70
|
+
getCursor: () => cursor,
|
|
71
|
+
setCursor: (c) => { cursor = c; },
|
|
72
|
+
getTotal: () => total,
|
|
73
|
+
setTotal: (t) => { total = t; },
|
|
74
|
+
setErrorMessage: (m) => { errorMessage = m; },
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
status = 'Failed';
|
|
79
|
+
errorMessage = e instanceof Error ? e.message : String(e);
|
|
80
|
+
LogError(`RecordSetProcessor: run failed: ${errorMessage}`);
|
|
81
|
+
}
|
|
82
|
+
const summary = {
|
|
83
|
+
Status: status,
|
|
84
|
+
Total: total,
|
|
85
|
+
Processed: counts.Processed,
|
|
86
|
+
Success: counts.Success,
|
|
87
|
+
Error: counts.Error,
|
|
88
|
+
Skipped: counts.Skipped,
|
|
89
|
+
StartTime: startTime,
|
|
90
|
+
EndTime: new Date(),
|
|
91
|
+
ErrorMessage: errorMessage,
|
|
92
|
+
};
|
|
93
|
+
await tracker.CompleteRun(handle, summary, contextUser, provider);
|
|
94
|
+
return { ...summary, ProcessRunID: handle.ProcessRunID };
|
|
95
|
+
}
|
|
96
|
+
/** The core batch loop. Returns the terminal status. */
|
|
97
|
+
async runBatchLoop(ctx) {
|
|
98
|
+
const { options, source, batchSize, counts } = ctx;
|
|
99
|
+
const { contextUser } = options;
|
|
100
|
+
// eslint-disable-next-line no-constant-condition
|
|
101
|
+
while (true) {
|
|
102
|
+
const batch = await source.NextBatch(ctx.getCursor(), batchSize, contextUser, ctx.provider);
|
|
103
|
+
if (batch.TotalRowCount != null && ctx.getTotal() == null) {
|
|
104
|
+
ctx.setTotal(batch.TotalRowCount);
|
|
105
|
+
}
|
|
106
|
+
if (batch.Records.length === 0) {
|
|
107
|
+
return 'Completed';
|
|
108
|
+
}
|
|
109
|
+
// Honor a hard record cap by trimming the batch.
|
|
110
|
+
let records = batch.Records;
|
|
111
|
+
if (options.maxRecords != null) {
|
|
112
|
+
const remaining = options.maxRecords - counts.Processed;
|
|
113
|
+
if (remaining <= 0) {
|
|
114
|
+
return 'Completed';
|
|
115
|
+
}
|
|
116
|
+
if (records.length > remaining) {
|
|
117
|
+
records = records.slice(0, remaining);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (ctx.rateLimiter) {
|
|
121
|
+
await ctx.rateLimiter.Acquire();
|
|
122
|
+
}
|
|
123
|
+
await this.processBatch(records, ctx);
|
|
124
|
+
options.onProgress?.({ ...counts, Total: ctx.getTotal() });
|
|
125
|
+
// Checkpoint + pause/cancel handshake.
|
|
126
|
+
ctx.setCursor(batch.NextCursor);
|
|
127
|
+
const shouldContinue = await ctx.tracker.Checkpoint(ctx.handle, batch.NextCursor, counts, contextUser, ctx.provider);
|
|
128
|
+
if (!shouldContinue) {
|
|
129
|
+
return 'Paused';
|
|
130
|
+
}
|
|
131
|
+
// Budget gate.
|
|
132
|
+
if (options.onAfterBatch) {
|
|
133
|
+
const verdict = await this.safeAfterBatch(options.onAfterBatch, records, counts.Processed);
|
|
134
|
+
if (verdict && !verdict.continue) {
|
|
135
|
+
ctx.setErrorMessage(verdict.reason ? `Auto-paused: ${verdict.reason}` : 'Auto-paused: budget exceeded');
|
|
136
|
+
return 'Paused';
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Error-rate circuit breaker.
|
|
140
|
+
if (counts.Processed > 0 && counts.Error > 0) {
|
|
141
|
+
const errorRate = (counts.Error / counts.Processed) * 100;
|
|
142
|
+
if (errorRate > ctx.errorThreshold) {
|
|
143
|
+
ctx.setErrorMessage(`Circuit breaker: error rate ${errorRate.toFixed(1)}% exceeded ${ctx.errorThreshold}%`);
|
|
144
|
+
return 'Failed';
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (batch.Exhausted) {
|
|
148
|
+
return 'Completed';
|
|
149
|
+
}
|
|
150
|
+
if (ctx.delayMs > 0) {
|
|
151
|
+
await this.delay(ctx.delayMs);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** Processes one batch with bounded concurrency, isolating per-record failures. */
|
|
156
|
+
async processBatch(records, ctx) {
|
|
157
|
+
const { options, counts } = ctx;
|
|
158
|
+
const recordContext = { contextUser: options.contextUser, provider: ctx.provider, processRunID: ctx.handle.ProcessRunID };
|
|
159
|
+
const worker = async (record) => {
|
|
160
|
+
const started = Date.now();
|
|
161
|
+
let result;
|
|
162
|
+
try {
|
|
163
|
+
result = await options.processor.ProcessRecord(record, recordContext);
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
result = { Status: 'Failed', ErrorMessage: e instanceof Error ? e.message : String(e) };
|
|
167
|
+
}
|
|
168
|
+
if (result.DurationMs == null) {
|
|
169
|
+
result.DurationMs = Date.now() - started;
|
|
170
|
+
}
|
|
171
|
+
counts.Processed++;
|
|
172
|
+
if (result.Status === 'Succeeded') {
|
|
173
|
+
counts.Success++;
|
|
174
|
+
}
|
|
175
|
+
else if (result.Status === 'Skipped') {
|
|
176
|
+
counts.Skipped++;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
counts.Error++;
|
|
180
|
+
}
|
|
181
|
+
await ctx.tracker.RecordResult(ctx.handle, record, result, options.contextUser, ctx.provider);
|
|
182
|
+
};
|
|
183
|
+
await this.runWithConcurrency(records, ctx.maxConcurrency, worker);
|
|
184
|
+
}
|
|
185
|
+
/** Runs `worker` over `items` with at most `limit` in flight at once. */
|
|
186
|
+
async runWithConcurrency(items, limit, worker) {
|
|
187
|
+
if (limit <= 1) {
|
|
188
|
+
for (const item of items) {
|
|
189
|
+
await worker(item);
|
|
190
|
+
}
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
let index = 0;
|
|
194
|
+
const runNext = async () => {
|
|
195
|
+
while (index < items.length) {
|
|
196
|
+
const current = index++;
|
|
197
|
+
await worker(items[current]);
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
await Promise.all(Array.from({ length: Math.min(limit, items.length) }, () => runNext()));
|
|
201
|
+
}
|
|
202
|
+
/** Invokes the budget-gate hook, treating a thrown hook as non-fatal (continue). */
|
|
203
|
+
async safeAfterBatch(hook, records, processed) {
|
|
204
|
+
try {
|
|
205
|
+
return await hook(records, processed);
|
|
206
|
+
}
|
|
207
|
+
catch (e) {
|
|
208
|
+
LogError(`RecordSetProcessor: onAfterBatch hook threw (continuing): ${e instanceof Error ? e.message : String(e)}`);
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
delay(ms) {
|
|
213
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=RecordSetProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordSetProcessor.js","sourceRoot":"","sources":["../src/RecordSetProcessor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Public API for the Record Set Processor engine — the server-side `RecordSetProcessor`
|
|
3
|
+
* plus the built-in rate limiter, trackers, and the function processor. Source adapters, types, and
|
|
4
|
+
* the pluggable seam interfaces live in `@memberjunction/record-set-processor-base`.
|
|
5
|
+
* @module @memberjunction/record-set-processor
|
|
6
|
+
*/
|
|
7
|
+
export * from './RateLimiter.js';
|
|
8
|
+
export * from './RecordSetProcessor.js';
|
|
9
|
+
export * from './RecordProcessExecutor.js';
|
|
10
|
+
export * from './writeBack.js';
|
|
11
|
+
export * from './processors/FunctionRecordProcessor.js';
|
|
12
|
+
export * from './processors/ActionRecordProcessor.js';
|
|
13
|
+
export * from './processors/AgentRecordProcessor.js';
|
|
14
|
+
export * from './processors/WriteBackProcessor.js';
|
|
15
|
+
export * from './processors/InferProcessor.js';
|
|
16
|
+
export * from './processors/FieldRulesProcessor.js';
|
|
17
|
+
export * from './trackers/NoOpTracker.js';
|
|
18
|
+
export * from './trackers/GenericProcessRunTracker.js';
|
|
19
|
+
export * from './operations/RecordProcessGetRunStatusOperation.js';
|
|
20
|
+
export * from './operations/RecordProcessControlOperations.js';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC;AAC5B,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,iDAAiD,CAAC;AAChE,cAAc,6CAA6C,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Public API for the Record Set Processor engine — the server-side `RecordSetProcessor`
|
|
3
|
+
* plus the built-in rate limiter, trackers, and the function processor. Source adapters, types, and
|
|
4
|
+
* the pluggable seam interfaces live in `@memberjunction/record-set-processor-base`.
|
|
5
|
+
* @module @memberjunction/record-set-processor
|
|
6
|
+
*/
|
|
7
|
+
export * from './RateLimiter.js';
|
|
8
|
+
export * from './RecordSetProcessor.js';
|
|
9
|
+
export * from './RecordProcessExecutor.js';
|
|
10
|
+
export * from './writeBack.js';
|
|
11
|
+
export * from './processors/FunctionRecordProcessor.js';
|
|
12
|
+
export * from './processors/ActionRecordProcessor.js';
|
|
13
|
+
export * from './processors/AgentRecordProcessor.js';
|
|
14
|
+
export * from './processors/WriteBackProcessor.js';
|
|
15
|
+
export * from './processors/InferProcessor.js';
|
|
16
|
+
export * from './processors/FieldRulesProcessor.js';
|
|
17
|
+
export * from './trackers/NoOpTracker.js';
|
|
18
|
+
export * from './trackers/GenericProcessRunTracker.js';
|
|
19
|
+
export * from './operations/RecordProcessGetRunStatusOperation.js';
|
|
20
|
+
export * from './operations/RecordProcessControlOperations.js';
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC;AAC5B,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,iDAAiD,CAAC;AAChE,cAAc,6CAA6C,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Record Process control Remote Operations — RunNow (on-demand execution) plus the
|
|
3
|
+
* Pause / Resume / Cancel control surface (the run's `CancellationRequested` handshake). These are
|
|
4
|
+
* the facade's only on-demand/control path (no bespoke resolvers).
|
|
5
|
+
* @module @memberjunction/record-set-processor
|
|
6
|
+
*/
|
|
7
|
+
import { IMetadataProvider, RemoteOpServerContext, UserInfo } from '@memberjunction/core';
|
|
8
|
+
import { RecordProcessRunNowOperation, RecordProcessPauseRunOperation, RecordProcessCancelRunOperation, RecordProcessResumeRunOperation, type RecordProcessRunNowInput, type RecordProcessRunNowOutput, type ProcessRunControlInput, type ProcessRunControlOutput } from '@memberjunction/core-entities';
|
|
9
|
+
/**
|
|
10
|
+
* Server implementation of `RecordProcess.RunNow` — runs a Record Process on demand, honoring an optional
|
|
11
|
+
* dry-run (compute-only preview) and runtime scope override (the rows a UI selected). Extends the
|
|
12
|
+
* client-safe {@link RecordProcessRunNowOperation} base in `-base` (which carries the key + typed I/O) and
|
|
13
|
+
* supplies the server body; registered last so it wins server-side dispatch. Marked `LongRunning` (the
|
|
14
|
+
* handle is a `ProcessRunID`).
|
|
15
|
+
*/
|
|
16
|
+
export declare class RecordProcessRunNowServerOperation extends RecordProcessRunNowOperation {
|
|
17
|
+
protected InternalExecute(input: RecordProcessRunNowInput, provider: IMetadataProvider, user: UserInfo, context: RemoteOpServerContext): Promise<RecordProcessRunNowOutput>;
|
|
18
|
+
}
|
|
19
|
+
/** Requests a graceful pause of a running process (honored at the next checkpoint). */
|
|
20
|
+
export declare class RecordProcessPauseRunServerOperation extends RecordProcessPauseRunOperation {
|
|
21
|
+
protected InternalExecute(input: ProcessRunControlInput, provider: IMetadataProvider, user: UserInfo): Promise<ProcessRunControlOutput>;
|
|
22
|
+
}
|
|
23
|
+
/** Requests cancellation of a running process (honored at the next checkpoint). */
|
|
24
|
+
export declare class RecordProcessCancelRunServerOperation extends RecordProcessCancelRunOperation {
|
|
25
|
+
protected InternalExecute(input: ProcessRunControlInput, provider: IMetadataProvider, user: UserInfo): Promise<ProcessRunControlOutput>;
|
|
26
|
+
}
|
|
27
|
+
/** Clears a paused run's cancellation flag so it can be resumed by a subsequent run. */
|
|
28
|
+
export declare class RecordProcessResumeRunServerOperation extends RecordProcessResumeRunOperation {
|
|
29
|
+
protected InternalExecute(input: ProcessRunControlInput, provider: IMetadataProvider, user: UserInfo): Promise<ProcessRunControlOutput>;
|
|
30
|
+
}
|
|
31
|
+
/** Tree-shaking anchor — call from a server bootstrap to retain these operation registrations. */
|
|
32
|
+
export declare function LoadRecordProcessControlOperations(): void;
|
|
33
|
+
//# sourceMappingURL=RecordProcessControlOperations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordProcessControlOperations.d.ts","sourceRoot":"","sources":["../../src/operations/RecordProcessControlOperations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAA0B,iBAAiB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAElH,OAAO,EACH,4BAA4B,EAC5B,8BAA8B,EAC9B,+BAA+B,EAC/B,+BAA+B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC/B,MAAM,+BAA+B,CAAC;AAGvC;;;;;;GAMG;AACH,qBACa,kCAAmC,SAAQ,4BAA4B;cAChE,eAAe,CAAC,KAAK,EAAE,wBAAwB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,yBAAyB,CAAC;CAiCpL;AA0BD,uFAAuF;AACvF,qBACa,oCAAqC,SAAQ,8BAA8B;cACpE,eAAe,CAAC,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAGhJ;AAED,mFAAmF;AACnF,qBACa,qCAAsC,SAAQ,+BAA+B;cACtE,eAAe,CAAC,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAGhJ;AAED,wFAAwF;AACxF,qBACa,qCAAsC,SAAQ,+BAA+B;cACtE,eAAe,CAAC,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAGhJ;AAED,kGAAkG;AAClG,wBAAgB,kCAAkC,IAAI,IAAI,CAEzD"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Record Process control Remote Operations — RunNow (on-demand execution) plus the
|
|
3
|
+
* Pause / Resume / Cancel control surface (the run's `CancellationRequested` handshake). These are
|
|
4
|
+
* the facade's only on-demand/control path (no bespoke resolvers).
|
|
5
|
+
* @module @memberjunction/record-set-processor
|
|
6
|
+
*/
|
|
7
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
8
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
10
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
11
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
12
|
+
};
|
|
13
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
14
|
+
import { BaseRemotableOperation } from '@memberjunction/core';
|
|
15
|
+
import { RecordProcessRunNowOperation, RecordProcessPauseRunOperation, RecordProcessCancelRunOperation, RecordProcessResumeRunOperation, } from '@memberjunction/core-entities';
|
|
16
|
+
import { RecordProcessExecutor } from '../RecordProcessExecutor.js';
|
|
17
|
+
/**
|
|
18
|
+
* Server implementation of `RecordProcess.RunNow` — runs a Record Process on demand, honoring an optional
|
|
19
|
+
* dry-run (compute-only preview) and runtime scope override (the rows a UI selected). Extends the
|
|
20
|
+
* client-safe {@link RecordProcessRunNowOperation} base in `-base` (which carries the key + typed I/O) and
|
|
21
|
+
* supplies the server body; registered last so it wins server-side dispatch. Marked `LongRunning` (the
|
|
22
|
+
* handle is a `ProcessRunID`).
|
|
23
|
+
*/
|
|
24
|
+
let RecordProcessRunNowServerOperation = class RecordProcessRunNowServerOperation extends RecordProcessRunNowOperation {
|
|
25
|
+
async InternalExecute(input, provider, user, context) {
|
|
26
|
+
if (!input?.recordProcessID) {
|
|
27
|
+
throw new Error('recordProcessID is required');
|
|
28
|
+
}
|
|
29
|
+
const result = await new RecordProcessExecutor().RunByID(input.recordProcessID, {
|
|
30
|
+
contextUser: user,
|
|
31
|
+
provider,
|
|
32
|
+
triggeredBy: 'OnDemand',
|
|
33
|
+
singleRecordID: input.singleRecordID,
|
|
34
|
+
dryRun: input.dryRun,
|
|
35
|
+
scope: input.scope,
|
|
36
|
+
// RO-3: forward the executor's per-batch progress as typed RemoteOpProgress, so an `attached`
|
|
37
|
+
// caller's onProgress (and, over the wire, the progress channel) sees live run progress.
|
|
38
|
+
onProgress: (p) => context.emitProgress({
|
|
39
|
+
OperationKey: this.OperationKey,
|
|
40
|
+
Processed: p.Processed,
|
|
41
|
+
Total: p.Total ?? undefined,
|
|
42
|
+
Status: 'Running',
|
|
43
|
+
Message: `Processed ${p.Processed}${p.Total != null ? ` of ${p.Total}` : ''} record(s)`,
|
|
44
|
+
Payload: { Success: p.Success, Error: p.Error, Skipped: p.Skipped, CurrentRecordID: p.CurrentRecordID },
|
|
45
|
+
}),
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
processRunID: result.ProcessRunID,
|
|
49
|
+
status: result.Status,
|
|
50
|
+
processed: result.Processed,
|
|
51
|
+
success: result.Success,
|
|
52
|
+
error: result.Error,
|
|
53
|
+
skipped: result.Skipped,
|
|
54
|
+
errorMessage: result.ErrorMessage,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
RecordProcessRunNowServerOperation = __decorate([
|
|
59
|
+
RegisterClass(BaseRemotableOperation, 'RecordProcess.RunNow')
|
|
60
|
+
], RecordProcessRunNowServerOperation);
|
|
61
|
+
export { RecordProcessRunNowServerOperation };
|
|
62
|
+
// ProcessRunControlInput / ProcessRunControlOutput are now CodeGen-emitted into @memberjunction/core-entities
|
|
63
|
+
// (generated/remote_operations.ts) from the MJ: Remote Operations rows, and imported above.
|
|
64
|
+
/** Sets `CancellationRequested` on a run to the given value, returning the run's status. */
|
|
65
|
+
async function setCancellation(processRunID, value, provider, user) {
|
|
66
|
+
if (!processRunID) {
|
|
67
|
+
throw new Error('processRunID is required');
|
|
68
|
+
}
|
|
69
|
+
const run = await provider.GetEntityObject('MJ: Process Runs', user);
|
|
70
|
+
const loaded = await run.Load(processRunID);
|
|
71
|
+
if (!loaded) {
|
|
72
|
+
throw new Error(`Process Run '${processRunID}' not found`);
|
|
73
|
+
}
|
|
74
|
+
run.CancellationRequested = value;
|
|
75
|
+
const saved = await run.Save();
|
|
76
|
+
if (!saved) {
|
|
77
|
+
throw new Error(`Failed updating Process Run '${processRunID}': ${run.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
78
|
+
}
|
|
79
|
+
return { status: run.Status };
|
|
80
|
+
}
|
|
81
|
+
// Each server operation extends its CodeGen-emitted base (which carries OperationKey / ExecutionMode /
|
|
82
|
+
// RequiredScope / RequiresSystemUser from metadata) and supplies only the InternalExecute body + @RegisterClass.
|
|
83
|
+
/** Requests a graceful pause of a running process (honored at the next checkpoint). */
|
|
84
|
+
let RecordProcessPauseRunServerOperation = class RecordProcessPauseRunServerOperation extends RecordProcessPauseRunOperation {
|
|
85
|
+
async InternalExecute(input, provider, user) {
|
|
86
|
+
return setCancellation(input.processRunID, true, provider, user);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
RecordProcessPauseRunServerOperation = __decorate([
|
|
90
|
+
RegisterClass(BaseRemotableOperation, 'RecordProcess.PauseRun')
|
|
91
|
+
], RecordProcessPauseRunServerOperation);
|
|
92
|
+
export { RecordProcessPauseRunServerOperation };
|
|
93
|
+
/** Requests cancellation of a running process (honored at the next checkpoint). */
|
|
94
|
+
let RecordProcessCancelRunServerOperation = class RecordProcessCancelRunServerOperation extends RecordProcessCancelRunOperation {
|
|
95
|
+
async InternalExecute(input, provider, user) {
|
|
96
|
+
return setCancellation(input.processRunID, true, provider, user);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
RecordProcessCancelRunServerOperation = __decorate([
|
|
100
|
+
RegisterClass(BaseRemotableOperation, 'RecordProcess.CancelRun')
|
|
101
|
+
], RecordProcessCancelRunServerOperation);
|
|
102
|
+
export { RecordProcessCancelRunServerOperation };
|
|
103
|
+
/** Clears a paused run's cancellation flag so it can be resumed by a subsequent run. */
|
|
104
|
+
let RecordProcessResumeRunServerOperation = class RecordProcessResumeRunServerOperation extends RecordProcessResumeRunOperation {
|
|
105
|
+
async InternalExecute(input, provider, user) {
|
|
106
|
+
return setCancellation(input.processRunID, false, provider, user);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
RecordProcessResumeRunServerOperation = __decorate([
|
|
110
|
+
RegisterClass(BaseRemotableOperation, 'RecordProcess.ResumeRun')
|
|
111
|
+
], RecordProcessResumeRunServerOperation);
|
|
112
|
+
export { RecordProcessResumeRunServerOperation };
|
|
113
|
+
/** Tree-shaking anchor — call from a server bootstrap to retain these operation registrations. */
|
|
114
|
+
export function LoadRecordProcessControlOperations() {
|
|
115
|
+
// intentionally empty
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=RecordProcessControlOperations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordProcessControlOperations.js","sourceRoot":"","sources":["../../src/operations/RecordProcessControlOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `RecordProcess.GetRunStatus` — a typed, sync Remote Operation that returns the
|
|
3
|
+
* status + counts of a Process Run. The proof-of-concept consumer of the Remote Operations
|
|
4
|
+
* substrate: the same typed object runs in-process on the server and (once dispatched) is callable
|
|
5
|
+
* from the browser via the generic `ExecuteRemoteOperation` transport.
|
|
6
|
+
* @module @memberjunction/record-set-processor
|
|
7
|
+
*/
|
|
8
|
+
import { IMetadataProvider, UserInfo } from '@memberjunction/core';
|
|
9
|
+
import { RecordProcessGetRunStatusOperation, type RecordProcessGetRunStatusInput, type RecordProcessGetRunStatusOutput } from '@memberjunction/core-entities';
|
|
10
|
+
/** Returns the live status and counts of a Process Run; the server body for the generated `RecordProcess.GetRunStatus` base. */
|
|
11
|
+
export declare class RecordProcessGetRunStatusServerOperation extends RecordProcessGetRunStatusOperation {
|
|
12
|
+
protected InternalExecute(input: RecordProcessGetRunStatusInput, provider: IMetadataProvider, user: UserInfo): Promise<RecordProcessGetRunStatusOutput>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Tree-shaking anchor — call from a server bootstrap to guarantee the `@RegisterClass` registration
|
|
16
|
+
* is retained so the operation is resolvable by key.
|
|
17
|
+
*/
|
|
18
|
+
export declare function LoadRecordProcessGetRunStatusOperation(): void;
|
|
19
|
+
//# sourceMappingURL=RecordProcessGetRunStatusOperation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordProcessGetRunStatusOperation.d.ts","sourceRoot":"","sources":["../../src/operations/RecordProcessGetRunStatusOperation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAA0B,iBAAiB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAEH,kCAAkC,EAClC,KAAK,8BAA8B,EACnC,KAAK,+BAA+B,EACvC,MAAM,+BAA+B,CAAC;AAKvC,gIAAgI;AAChI,qBACa,wCAAyC,SAAQ,kCAAkC;cAE5E,eAAe,CAAC,KAAK,EAAE,8BAA8B,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,+BAA+B,CAAC;CAkBhK;AAED;;;GAGG;AACH,wBAAgB,sCAAsC,IAAI,IAAI,CAE7D"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `RecordProcess.GetRunStatus` — a typed, sync Remote Operation that returns the
|
|
3
|
+
* status + counts of a Process Run. The proof-of-concept consumer of the Remote Operations
|
|
4
|
+
* substrate: the same typed object runs in-process on the server and (once dispatched) is callable
|
|
5
|
+
* from the browser via the generic `ExecuteRemoteOperation` transport.
|
|
6
|
+
* @module @memberjunction/record-set-processor
|
|
7
|
+
*/
|
|
8
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
9
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
10
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
11
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
12
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
13
|
+
};
|
|
14
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
15
|
+
import { BaseRemotableOperation } from '@memberjunction/core';
|
|
16
|
+
import { RecordProcessGetRunStatusOperation, } from '@memberjunction/core-entities';
|
|
17
|
+
// RecordProcessGetRunStatusInput / Output + the typed base are now CodeGen-emitted into
|
|
18
|
+
// @memberjunction/core-entities (generated/remote_operations.ts) and imported above.
|
|
19
|
+
/** Returns the live status and counts of a Process Run; the server body for the generated `RecordProcess.GetRunStatus` base. */
|
|
20
|
+
let RecordProcessGetRunStatusServerOperation = class RecordProcessGetRunStatusServerOperation extends RecordProcessGetRunStatusOperation {
|
|
21
|
+
async InternalExecute(input, provider, user) {
|
|
22
|
+
if (!input?.processRunID) {
|
|
23
|
+
throw new Error('processRunID is required');
|
|
24
|
+
}
|
|
25
|
+
const run = await provider.GetEntityObject('MJ: Process Runs', user);
|
|
26
|
+
const loaded = await run.Load(input.processRunID);
|
|
27
|
+
if (!loaded) {
|
|
28
|
+
throw new Error(`Process Run '${input.processRunID}' not found`);
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
status: run.Status,
|
|
32
|
+
processed: run.ProcessedItems,
|
|
33
|
+
total: run.TotalItemCount,
|
|
34
|
+
success: run.SuccessCount,
|
|
35
|
+
error: run.ErrorCount,
|
|
36
|
+
skipped: run.SkippedCount,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
RecordProcessGetRunStatusServerOperation = __decorate([
|
|
41
|
+
RegisterClass(BaseRemotableOperation, 'RecordProcess.GetRunStatus')
|
|
42
|
+
], RecordProcessGetRunStatusServerOperation);
|
|
43
|
+
export { RecordProcessGetRunStatusServerOperation };
|
|
44
|
+
/**
|
|
45
|
+
* Tree-shaking anchor — call from a server bootstrap to guarantee the `@RegisterClass` registration
|
|
46
|
+
* is retained so the operation is resolvable by key.
|
|
47
|
+
*/
|
|
48
|
+
export function LoadRecordProcessGetRunStatusOperation() {
|
|
49
|
+
// intentionally empty
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=RecordProcessGetRunStatusOperation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordProcessGetRunStatusOperation.js","sourceRoot":"","sources":["../../src/operations/RecordProcessGetRunStatusOperation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;;;;;;;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAA+B,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAEH,kCAAkC,GAGrC,MAAM,+BAA+B,CAAC;AAEvC,wFAAwF;AACxF,qFAAqF;AAErF,gIAAgI;AAEzH,IAAM,wCAAwC,GAA9C,MAAM,wCAAyC,SAAQ,kCAAkC;IAElF,KAAK,CAAC,eAAe,CAAC,KAAqC,EAAE,QAA2B,EAAE,IAAc;QAC9G,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAqB,kBAAkB,EAAE,IAAI,CAAC,CAAC;QACzF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,CAAC,YAAY,aAAa,CAAC,CAAC;QACrE,CAAC;QACD,OAAO;YACH,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,SAAS,EAAE,GAAG,CAAC,cAAc;YAC7B,KAAK,EAAE,GAAG,CAAC,cAAc;YACzB,OAAO,EAAE,GAAG,CAAC,YAAY;YACzB,KAAK,EAAE,GAAG,CAAC,UAAU;YACrB,OAAO,EAAE,GAAG,CAAC,YAAY;SAC5B,CAAC;IACN,CAAC;CACJ,CAAA;AApBY,wCAAwC;IADpD,aAAa,CAAC,sBAAsB,EAAE,4BAA4B,CAAC;GACvD,wCAAwC,CAoBpD;;AAED;;;GAGG;AACH,MAAM,UAAU,sCAAsC;IAClD,sBAAsB;AAC1B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Processor that runs an Action over each record. Input is resolved from the record
|
|
3
|
+
* via the generic value-mapping resolver (`InputMapping`); the action's output params become the
|
|
4
|
+
* record result payload, and the Action Execution Log is captured for tracing.
|
|
5
|
+
* @module @memberjunction/record-set-processor
|
|
6
|
+
*/
|
|
7
|
+
import { ActionParam } from '@memberjunction/actions-base';
|
|
8
|
+
import { IRecordProcessor, RecordProcessorContext, RecordRef, RecordResult } from '@memberjunction/record-set-processor-base';
|
|
9
|
+
/** Runs an Action for each record, mapping the record into the action's input parameters. */
|
|
10
|
+
export declare class ActionRecordProcessor implements IRecordProcessor {
|
|
11
|
+
private readonly actionID;
|
|
12
|
+
private readonly inputMapping?;
|
|
13
|
+
/**
|
|
14
|
+
* @param actionID - ID of the Action to run.
|
|
15
|
+
* @param inputMapping - Optional mapping config resolved against `{ record, recordId, entityId }`
|
|
16
|
+
* to build the action's input params (e.g. `{ "CustomerID": "record.ID", "Tier": "record.Tier" }`).
|
|
17
|
+
*/
|
|
18
|
+
constructor(actionID: string, inputMapping?: unknown);
|
|
19
|
+
/** Named sources exposed to the input mapping for a record. */
|
|
20
|
+
static buildSources(record: RecordRef): Record<string, unknown>;
|
|
21
|
+
/** Resolves the input mapping into Action input params. */
|
|
22
|
+
static buildActionParams(inputMapping: unknown, record: RecordRef): ActionParam[];
|
|
23
|
+
/** Collects an action's output params into a plain payload object. */
|
|
24
|
+
static extractOutputs(params?: ActionParam[]): Record<string, unknown>;
|
|
25
|
+
ProcessRecord(record: RecordRef, context: RecordProcessorContext): Promise<RecordResult>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=ActionRecordProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActionRecordProcessor.d.ts","sourceRoot":"","sources":["../../src/processors/ActionRecordProcessor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EACH,gBAAgB,EAChB,sBAAsB,EACtB,SAAS,EACT,YAAY,EACf,MAAM,2CAA2C,CAAC;AAEnD,6FAA6F;AAC7F,qBAAa,qBAAsB,YAAW,gBAAgB;IAM9C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAU,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IAL7E;;;;OAIG;gBAC0B,QAAQ,EAAE,MAAM,EAAmB,YAAY,CAAC,EAAE,OAAO;IAEtF,+DAA+D;WACjD,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAItE,2DAA2D;WAC7C,iBAAiB,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,WAAW,EAAE;IAOxF,sEAAsE;WACxD,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAUhE,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC;CAqBxG"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Processor that runs an Action over each record. Input is resolved from the record
|
|
3
|
+
* via the generic value-mapping resolver (`InputMapping`); the action's output params become the
|
|
4
|
+
* record result payload, and the Action Execution Log is captured for tracing.
|
|
5
|
+
* @module @memberjunction/record-set-processor
|
|
6
|
+
*/
|
|
7
|
+
import { UUIDsEqual, resolveValueMapping } from '@memberjunction/global';
|
|
8
|
+
import { ActionEngineServer } from '@memberjunction/actions';
|
|
9
|
+
/** Runs an Action for each record, mapping the record into the action's input parameters. */
|
|
10
|
+
export class ActionRecordProcessor {
|
|
11
|
+
/**
|
|
12
|
+
* @param actionID - ID of the Action to run.
|
|
13
|
+
* @param inputMapping - Optional mapping config resolved against `{ record, recordId, entityId }`
|
|
14
|
+
* to build the action's input params (e.g. `{ "CustomerID": "record.ID", "Tier": "record.Tier" }`).
|
|
15
|
+
*/
|
|
16
|
+
constructor(actionID, inputMapping) {
|
|
17
|
+
this.actionID = actionID;
|
|
18
|
+
this.inputMapping = inputMapping;
|
|
19
|
+
}
|
|
20
|
+
/** Named sources exposed to the input mapping for a record. */
|
|
21
|
+
static buildSources(record) {
|
|
22
|
+
return { record: record.Record ?? {}, recordId: record.RecordID, entityId: record.EntityID };
|
|
23
|
+
}
|
|
24
|
+
/** Resolves the input mapping into Action input params. */
|
|
25
|
+
static buildActionParams(inputMapping, record) {
|
|
26
|
+
const mapped = inputMapping
|
|
27
|
+
? resolveValueMapping(inputMapping, ActionRecordProcessor.buildSources(record))
|
|
28
|
+
: {};
|
|
29
|
+
return Object.entries(mapped).map(([Name, Value]) => ({ Name, Value, Type: 'Input' }));
|
|
30
|
+
}
|
|
31
|
+
/** Collects an action's output params into a plain payload object. */
|
|
32
|
+
static extractOutputs(params) {
|
|
33
|
+
const out = {};
|
|
34
|
+
for (const p of params ?? []) {
|
|
35
|
+
if (p.Type === 'Output' || p.Type === 'Both') {
|
|
36
|
+
out[p.Name] = p.Value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
async ProcessRecord(record, context) {
|
|
42
|
+
await ActionEngineServer.Instance.Config(false, context.contextUser);
|
|
43
|
+
const action = ActionEngineServer.Instance.Actions.find((a) => UUIDsEqual(a.ID, this.actionID));
|
|
44
|
+
if (!action) {
|
|
45
|
+
return { Status: 'Failed', ErrorMessage: `Action '${this.actionID}' not found` };
|
|
46
|
+
}
|
|
47
|
+
const result = await ActionEngineServer.Instance.RunAction({
|
|
48
|
+
Action: action,
|
|
49
|
+
ContextUser: context.contextUser,
|
|
50
|
+
Params: ActionRecordProcessor.buildActionParams(this.inputMapping, record),
|
|
51
|
+
Filters: [],
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
Status: result.Success ? 'Succeeded' : 'Failed',
|
|
55
|
+
ResultPayload: ActionRecordProcessor.extractOutputs(result.Params),
|
|
56
|
+
ErrorMessage: result.Success ? undefined : (result.Message ?? 'Action failed'),
|
|
57
|
+
ActionExecutionLogID: result.LogEntry?.ID,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=ActionRecordProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActionRecordProcessor.js","sourceRoot":"","sources":["../../src/processors/ActionRecordProcessor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAS7D,6FAA6F;AAC7F,MAAM,OAAO,qBAAqB;IAC9B;;;;OAIG;IACH,YAA6B,QAAgB,EAAmB,YAAsB;QAAzD,aAAQ,GAAR,QAAQ,CAAQ;QAAmB,iBAAY,GAAZ,YAAY,CAAU;IAAG,CAAC;IAE1F,+DAA+D;IACxD,MAAM,CAAC,YAAY,CAAC,MAAiB;QACxC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACjG,CAAC;IAED,2DAA2D;IACpD,MAAM,CAAC,iBAAiB,CAAC,YAAqB,EAAE,MAAiB;QACpE,MAAM,MAAM,GAAG,YAAY;YACvB,CAAC,CAAC,mBAAmB,CAA0B,YAAY,EAAE,qBAAqB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACxG,CAAC,CAAC,EAAE,CAAC;QACT,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAC,CAAC,CAAC;IACpG,CAAC;IAED,sEAAsE;IAC/D,MAAM,CAAC,cAAc,CAAC,MAAsB;QAC/C,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC3C,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YAC1B,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,MAAiB,EAAE,OAA+B;QACzE,MAAM,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChG,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,IAAI,CAAC,QAAQ,aAAa,EAAE,CAAC;QACrF,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC;YACvD,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,MAAM,EAAE,qBAAqB,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;YAC1E,OAAO,EAAE,EAAE;SACd,CAAC,CAAC;QAEH,OAAO;YACH,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;YAC/C,aAAa,EAAE,qBAAqB,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;YAClE,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,eAAe,CAAC;YAC9E,oBAAoB,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE;SAC5C,CAAC;IACN,CAAC;CACJ"}
|