@514labs/moose-lib 0.6.321-ci-5-ga23d35fe → 0.6.322
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/dist/browserCompatible-BVw4gSAN.d.mts +184 -0
- package/dist/browserCompatible-rK8ei0bt.d.ts +184 -0
- package/dist/browserCompatible.d.mts +3 -7
- package/dist/browserCompatible.d.ts +3 -7
- package/dist/browserCompatible.js +180 -197
- package/dist/browserCompatible.js.map +1 -1
- package/dist/browserCompatible.mjs +180 -196
- package/dist/browserCompatible.mjs.map +1 -1
- package/dist/compilerPlugin.js.map +1 -1
- package/dist/compilerPlugin.mjs.map +1 -1
- package/dist/dataModels/toDataModels.js.map +1 -1
- package/dist/dataModels/toDataModels.mjs.map +1 -1
- package/dist/dmv2/index.d.mts +1 -2
- package/dist/dmv2/index.d.ts +1 -2
- package/dist/dmv2/index.js +24 -41
- package/dist/dmv2/index.js.map +1 -1
- package/dist/dmv2/index.mjs +24 -40
- package/dist/dmv2/index.mjs.map +1 -1
- package/dist/{index-Aq9KzsRd.d.mts → index-C4miZc-A.d.mts} +33 -181
- package/dist/{index-Aq9KzsRd.d.ts → index-C4miZc-A.d.ts} +33 -181
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +202 -176
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +199 -176
- package/dist/index.mjs.map +1 -1
- package/dist/moose-runner.js +257 -88
- package/dist/moose-runner.js.map +1 -1
- package/dist/moose-runner.mjs +258 -89
- package/dist/moose-runner.mjs.map +1 -1
- package/dist/scripts/workflow.js +11 -9
- package/dist/scripts/workflow.js.map +1 -1
- package/dist/scripts/workflow.mjs +11 -9
- package/dist/scripts/workflow.mjs.map +1 -1
- package/package.json +1 -1
package/dist/scripts/workflow.js
CHANGED
|
@@ -39,7 +39,7 @@ var mooseJsonEncode = (data) => {
|
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
// src/scripts/workflow.ts
|
|
42
|
-
var {
|
|
42
|
+
var { getDmv2Workflow, getTaskForWorkflow } = (0, import_workflow.proxyActivities)({
|
|
43
43
|
startToCloseTimeout: "1 minutes",
|
|
44
44
|
retry: {
|
|
45
45
|
maximumAttempts: 1
|
|
@@ -49,7 +49,9 @@ async function ScriptWorkflow(request, inputData) {
|
|
|
49
49
|
const state = {
|
|
50
50
|
completedSteps: [],
|
|
51
51
|
currentStep: null,
|
|
52
|
-
failedStep: null
|
|
52
|
+
failedStep: null,
|
|
53
|
+
scriptPath: null,
|
|
54
|
+
inputData: null
|
|
53
55
|
};
|
|
54
56
|
const results = [];
|
|
55
57
|
const workflowName = request.workflow_name;
|
|
@@ -59,9 +61,9 @@ async function ScriptWorkflow(request, inputData) {
|
|
|
59
61
|
);
|
|
60
62
|
try {
|
|
61
63
|
currentData = JSON.parse(mooseJsonEncode(currentData));
|
|
62
|
-
const workflow = await
|
|
64
|
+
const workflow = await getDmv2Workflow(workflowName);
|
|
63
65
|
const task = request.execution_mode === "start" ? workflow.config.startingTask : await getTaskForWorkflow(workflowName, request.continue_from_task);
|
|
64
|
-
const result = await
|
|
66
|
+
const result = await handleDmv2Task(workflow, task, currentData);
|
|
65
67
|
results.push(...result);
|
|
66
68
|
return results;
|
|
67
69
|
} catch (error) {
|
|
@@ -69,7 +71,7 @@ async function ScriptWorkflow(request, inputData) {
|
|
|
69
71
|
throw error;
|
|
70
72
|
}
|
|
71
73
|
}
|
|
72
|
-
async function
|
|
74
|
+
async function handleDmv2Task(workflow, task, inputData) {
|
|
73
75
|
const configTimeout = task.config.timeout;
|
|
74
76
|
let taskTimeout;
|
|
75
77
|
if (!configTimeout) {
|
|
@@ -95,7 +97,7 @@ async function handleTask(workflow, task, inputData) {
|
|
|
95
97
|
} else {
|
|
96
98
|
activityOptions.scheduleToCloseTimeout = "87600h";
|
|
97
99
|
}
|
|
98
|
-
const {
|
|
100
|
+
const { executeDmv2Task } = (0, import_workflow.proxyActivities)(activityOptions);
|
|
99
101
|
let taskCompleted = false;
|
|
100
102
|
const monitorTask = async () => {
|
|
101
103
|
import_workflow.log.info(`Monitor task starting for ${task.name}`);
|
|
@@ -114,7 +116,7 @@ async function handleTask(workflow, task, inputData) {
|
|
|
114
116
|
import_workflow.log.info(`Monitor task exiting because main task completed`);
|
|
115
117
|
};
|
|
116
118
|
const result = await Promise.race([
|
|
117
|
-
|
|
119
|
+
executeDmv2Task(workflow, task, inputData).then((taskResult) => {
|
|
118
120
|
return {
|
|
119
121
|
type: "task_completed",
|
|
120
122
|
data: taskResult
|
|
@@ -134,12 +136,12 @@ async function handleTask(workflow, task, inputData) {
|
|
|
134
136
|
return results;
|
|
135
137
|
}
|
|
136
138
|
for (const childTask of task.config.onComplete) {
|
|
137
|
-
const childResult = await
|
|
139
|
+
const childResult = await handleDmv2Task(workflow, childTask, result.data);
|
|
138
140
|
results.push(...childResult);
|
|
139
141
|
}
|
|
140
142
|
if (task.name.endsWith("_extract") && result && typeof result === "object" && result.data && typeof result.data === "object" && "hasMore" in result.data && result.data.hasMore === true) {
|
|
141
143
|
import_workflow.log.info(`Extract task ${task.name} has more data, restarting chain...`);
|
|
142
|
-
const nextBatchResults = await
|
|
144
|
+
const nextBatchResults = await handleDmv2Task(workflow, task, null);
|
|
143
145
|
results.push(...nextBatchResults);
|
|
144
146
|
}
|
|
145
147
|
return results;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/scripts/workflow.ts","../../src/scripts/serialization.ts"],"sourcesContent":["import {\n log as logger,\n ActivityOptions,\n proxyActivities,\n workflowInfo,\n continueAsNew,\n sleep,\n} from \"@temporalio/workflow\";\nimport { Duration } from \"@temporalio/common\";\nimport { Task, Workflow } from \"../dmv2\";\n\nimport { WorkflowState } from \"./types\";\nimport { mooseJsonEncode } from \"./serialization\";\n\ninterface WorkflowRequest {\n workflow_name: string;\n execution_mode: \"start\" | \"continue_as_new\";\n continue_from_task?: string; // Only for continue_as_new\n}\n\nconst {
|
|
1
|
+
{"version":3,"sources":["../../src/scripts/workflow.ts","../../src/scripts/serialization.ts"],"sourcesContent":["import {\n log as logger,\n ActivityOptions,\n proxyActivities,\n workflowInfo,\n continueAsNew,\n sleep,\n} from \"@temporalio/workflow\";\nimport { Duration } from \"@temporalio/common\";\nimport { Task, Workflow } from \"../dmv2\";\n\nimport { WorkflowState } from \"./types\";\nimport { mooseJsonEncode } from \"./serialization\";\n\ninterface WorkflowRequest {\n workflow_name: string;\n execution_mode: \"start\" | \"continue_as_new\";\n continue_from_task?: string; // Only for continue_as_new\n}\n\nconst { getDmv2Workflow, getTaskForWorkflow } = proxyActivities({\n startToCloseTimeout: \"1 minutes\",\n retry: {\n maximumAttempts: 1,\n },\n});\n\nexport async function ScriptWorkflow(\n request: WorkflowRequest,\n inputData?: any,\n): Promise<any[]> {\n const state: WorkflowState = {\n completedSteps: [],\n currentStep: null,\n failedStep: null,\n scriptPath: null,\n inputData: null,\n };\n\n const results: any[] = [];\n const workflowName = request.workflow_name;\n let currentData = inputData?.data || inputData || {};\n\n logger.info(\n `Starting workflow: ${workflowName} (mode: ${request.execution_mode}) with data: ${JSON.stringify(currentData)}`,\n );\n\n try {\n currentData = JSON.parse(mooseJsonEncode(currentData));\n const workflow = await getDmv2Workflow(workflowName);\n const task =\n request.execution_mode === \"start\" ?\n workflow.config.startingTask\n : await getTaskForWorkflow(workflowName, request.continue_from_task!);\n const result = await handleDmv2Task(workflow, task, currentData);\n results.push(...result);\n\n return results;\n } catch (error) {\n state.failedStep = workflowName;\n throw error;\n }\n}\n\nasync function handleDmv2Task(\n workflow: Workflow,\n task: Task<any, any>,\n inputData: any,\n): Promise<any[]> {\n // Handle timeout configuration\n const configTimeout = task.config.timeout;\n let taskTimeout: Duration | undefined;\n\n if (!configTimeout) {\n taskTimeout = \"1h\";\n } else if (configTimeout === \"never\") {\n taskTimeout = undefined;\n } else {\n taskTimeout = configTimeout as Duration;\n }\n\n const taskRetries = task.config.retries ?? 3;\n\n const timeoutMessage =\n taskTimeout ? `with timeout ${taskTimeout}` : \"with no timeout (unlimited)\";\n logger.info(\n `Handling task ${task.name} ${timeoutMessage} and retries ${taskRetries}`,\n );\n\n const activityOptions: ActivityOptions = {\n heartbeatTimeout: \"10s\",\n retry: {\n maximumAttempts: taskRetries,\n },\n };\n\n // Temporal requires either startToCloseTimeout OR scheduleToCloseTimeout to be set\n // For unlimited timeout (timeout = \"none\"), we use scheduleToCloseTimeout with a very large value\n // For normal timeouts, we use startToCloseTimeout for single execution timeout\n if (taskTimeout) {\n // Normal timeout - limit each individual execution attempt\n activityOptions.startToCloseTimeout = taskTimeout;\n } else {\n // Unlimited timeout - set scheduleToCloseTimeout to a very large value (10 years)\n // This satisfies Temporal's requirement while effectively allowing unlimited execution\n activityOptions.scheduleToCloseTimeout = \"87600h\"; // 10 years\n }\n\n const { executeDmv2Task } = proxyActivities(activityOptions);\n\n let taskCompleted = false;\n\n const monitorTask = async () => {\n logger.info(`Monitor task starting for ${task.name}`);\n while (!taskCompleted) {\n const info = workflowInfo();\n\n // Continue-as-new only when suggested by Temporal\n if (info.continueAsNewSuggested) {\n logger.info(`ContinueAsNew suggested by Temporal`);\n return await continueAsNew({\n workflow_name: workflow.name,\n execution_mode: \"continue_as_new\" as const,\n continue_from_task: task.name,\n });\n }\n\n await sleep(100);\n }\n logger.info(`Monitor task exiting because main task completed`);\n };\n\n const result = await Promise.race([\n executeDmv2Task(workflow, task, inputData)\n .then((taskResult) => {\n return {\n type: \"task_completed\" as const,\n data: taskResult,\n };\n })\n .finally(() => {\n taskCompleted = true;\n }),\n monitorTask().then(() => {\n return { type: \"continue_as_new\" as const, data: undefined };\n }),\n ]);\n\n if (result.type !== \"task_completed\") {\n return [];\n }\n\n const results = [result.data];\n if (!task.config.onComplete?.length) {\n return results;\n }\n\n for (const childTask of task.config.onComplete) {\n const childResult = await handleDmv2Task(workflow, childTask, result.data);\n results.push(...childResult);\n }\n\n // Check if this is an ETL extract task that needs to loop\n // ETL extract tasks end with \"_extract\" and return BatchResult with hasMore\n if (\n task.name.endsWith(\"_extract\") &&\n result &&\n typeof result === \"object\" &&\n result.data &&\n typeof result.data === \"object\" &&\n \"hasMore\" in result.data &&\n (result.data as any).hasMore === true\n ) {\n logger.info(`Extract task ${task.name} has more data, restarting chain...`);\n\n // Recursively call the extract task again to get the next batch\n const nextBatchResults = await handleDmv2Task(workflow, task, null);\n results.push(...nextBatchResults);\n }\n\n return results;\n}\n","// Add serialization helpers\nexport const mooseJsonEncode = (data: any): string => {\n return JSON.stringify(data, (_, value) => {\n if (value instanceof Map) {\n return {\n __type: \"Map\",\n value: Array.from(value.entries()),\n };\n }\n return value;\n });\n};\n\nexport const mooseJsonDecode = (text: string): any => {\n return JSON.parse(text, (_, value) => {\n if (value && typeof value === \"object\" && value.__type === \"Map\") {\n return new Map(value.value);\n }\n return value;\n });\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAOO;;;ACNA,IAAM,kBAAkB,CAAC,SAAsB;AACpD,SAAO,KAAK,UAAU,MAAM,CAAC,GAAG,UAAU;AACxC,QAAI,iBAAiB,KAAK;AACxB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO,MAAM,KAAK,MAAM,QAAQ,CAAC;AAAA,MACnC;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH;;;ADSA,IAAM,EAAE,iBAAiB,mBAAmB,QAAI,iCAAgB;AAAA,EAC9D,qBAAqB;AAAA,EACrB,OAAO;AAAA,IACL,iBAAiB;AAAA,EACnB;AACF,CAAC;AAED,eAAsB,eACpB,SACA,WACgB;AAChB,QAAM,QAAuB;AAAA,IAC3B,gBAAgB,CAAC;AAAA,IACjB,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AAEA,QAAM,UAAiB,CAAC;AACxB,QAAM,eAAe,QAAQ;AAC7B,MAAI,cAAc,WAAW,QAAQ,aAAa,CAAC;AAEnD,kBAAAA,IAAO;AAAA,IACL,sBAAsB,YAAY,WAAW,QAAQ,cAAc,gBAAgB,KAAK,UAAU,WAAW,CAAC;AAAA,EAChH;AAEA,MAAI;AACF,kBAAc,KAAK,MAAM,gBAAgB,WAAW,CAAC;AACrD,UAAM,WAAW,MAAM,gBAAgB,YAAY;AACnD,UAAM,OACJ,QAAQ,mBAAmB,UACzB,SAAS,OAAO,eAChB,MAAM,mBAAmB,cAAc,QAAQ,kBAAmB;AACtE,UAAM,SAAS,MAAM,eAAe,UAAU,MAAM,WAAW;AAC/D,YAAQ,KAAK,GAAG,MAAM;AAEtB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,aAAa;AACnB,UAAM;AAAA,EACR;AACF;AAEA,eAAe,eACb,UACA,MACA,WACgB;AAEhB,QAAM,gBAAgB,KAAK,OAAO;AAClC,MAAI;AAEJ,MAAI,CAAC,eAAe;AAClB,kBAAc;AAAA,EAChB,WAAW,kBAAkB,SAAS;AACpC,kBAAc;AAAA,EAChB,OAAO;AACL,kBAAc;AAAA,EAChB;AAEA,QAAM,cAAc,KAAK,OAAO,WAAW;AAE3C,QAAM,iBACJ,cAAc,gBAAgB,WAAW,KAAK;AAChD,kBAAAA,IAAO;AAAA,IACL,iBAAiB,KAAK,IAAI,IAAI,cAAc,gBAAgB,WAAW;AAAA,EACzE;AAEA,QAAM,kBAAmC;AAAA,IACvC,kBAAkB;AAAA,IAClB,OAAO;AAAA,MACL,iBAAiB;AAAA,IACnB;AAAA,EACF;AAKA,MAAI,aAAa;AAEf,oBAAgB,sBAAsB;AAAA,EACxC,OAAO;AAGL,oBAAgB,yBAAyB;AAAA,EAC3C;AAEA,QAAM,EAAE,gBAAgB,QAAI,iCAAgB,eAAe;AAE3D,MAAI,gBAAgB;AAEpB,QAAM,cAAc,YAAY;AAC9B,oBAAAA,IAAO,KAAK,6BAA6B,KAAK,IAAI,EAAE;AACpD,WAAO,CAAC,eAAe;AACrB,YAAM,WAAO,8BAAa;AAG1B,UAAI,KAAK,wBAAwB;AAC/B,wBAAAA,IAAO,KAAK,qCAAqC;AACjD,eAAO,UAAM,+BAAc;AAAA,UACzB,eAAe,SAAS;AAAA,UACxB,gBAAgB;AAAA,UAChB,oBAAoB,KAAK;AAAA,QAC3B,CAAC;AAAA,MACH;AAEA,gBAAM,uBAAM,GAAG;AAAA,IACjB;AACA,oBAAAA,IAAO,KAAK,kDAAkD;AAAA,EAChE;AAEA,QAAM,SAAS,MAAM,QAAQ,KAAK;AAAA,IAChC,gBAAgB,UAAU,MAAM,SAAS,EACtC,KAAK,CAAC,eAAe;AACpB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF,CAAC,EACA,QAAQ,MAAM;AACb,sBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,YAAY,EAAE,KAAK,MAAM;AACvB,aAAO,EAAE,MAAM,mBAA4B,MAAM,OAAU;AAAA,IAC7D,CAAC;AAAA,EACH,CAAC;AAED,MAAI,OAAO,SAAS,kBAAkB;AACpC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,CAAC,OAAO,IAAI;AAC5B,MAAI,CAAC,KAAK,OAAO,YAAY,QAAQ;AACnC,WAAO;AAAA,EACT;AAEA,aAAW,aAAa,KAAK,OAAO,YAAY;AAC9C,UAAM,cAAc,MAAM,eAAe,UAAU,WAAW,OAAO,IAAI;AACzE,YAAQ,KAAK,GAAG,WAAW;AAAA,EAC7B;AAIA,MACE,KAAK,KAAK,SAAS,UAAU,KAC7B,UACA,OAAO,WAAW,YAClB,OAAO,QACP,OAAO,OAAO,SAAS,YACvB,aAAa,OAAO,QACnB,OAAO,KAAa,YAAY,MACjC;AACA,oBAAAA,IAAO,KAAK,gBAAgB,KAAK,IAAI,qCAAqC;AAG1E,UAAM,mBAAmB,MAAM,eAAe,UAAU,MAAM,IAAI;AAClE,YAAQ,KAAK,GAAG,gBAAgB;AAAA,EAClC;AAEA,SAAO;AACT;","names":["logger"]}
|
|
@@ -21,7 +21,7 @@ var mooseJsonEncode = (data) => {
|
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
// src/scripts/workflow.ts
|
|
24
|
-
var {
|
|
24
|
+
var { getDmv2Workflow, getTaskForWorkflow } = proxyActivities({
|
|
25
25
|
startToCloseTimeout: "1 minutes",
|
|
26
26
|
retry: {
|
|
27
27
|
maximumAttempts: 1
|
|
@@ -31,7 +31,9 @@ async function ScriptWorkflow(request, inputData) {
|
|
|
31
31
|
const state = {
|
|
32
32
|
completedSteps: [],
|
|
33
33
|
currentStep: null,
|
|
34
|
-
failedStep: null
|
|
34
|
+
failedStep: null,
|
|
35
|
+
scriptPath: null,
|
|
36
|
+
inputData: null
|
|
35
37
|
};
|
|
36
38
|
const results = [];
|
|
37
39
|
const workflowName = request.workflow_name;
|
|
@@ -41,9 +43,9 @@ async function ScriptWorkflow(request, inputData) {
|
|
|
41
43
|
);
|
|
42
44
|
try {
|
|
43
45
|
currentData = JSON.parse(mooseJsonEncode(currentData));
|
|
44
|
-
const workflow = await
|
|
46
|
+
const workflow = await getDmv2Workflow(workflowName);
|
|
45
47
|
const task = request.execution_mode === "start" ? workflow.config.startingTask : await getTaskForWorkflow(workflowName, request.continue_from_task);
|
|
46
|
-
const result = await
|
|
48
|
+
const result = await handleDmv2Task(workflow, task, currentData);
|
|
47
49
|
results.push(...result);
|
|
48
50
|
return results;
|
|
49
51
|
} catch (error) {
|
|
@@ -51,7 +53,7 @@ async function ScriptWorkflow(request, inputData) {
|
|
|
51
53
|
throw error;
|
|
52
54
|
}
|
|
53
55
|
}
|
|
54
|
-
async function
|
|
56
|
+
async function handleDmv2Task(workflow, task, inputData) {
|
|
55
57
|
const configTimeout = task.config.timeout;
|
|
56
58
|
let taskTimeout;
|
|
57
59
|
if (!configTimeout) {
|
|
@@ -77,7 +79,7 @@ async function handleTask(workflow, task, inputData) {
|
|
|
77
79
|
} else {
|
|
78
80
|
activityOptions.scheduleToCloseTimeout = "87600h";
|
|
79
81
|
}
|
|
80
|
-
const {
|
|
82
|
+
const { executeDmv2Task } = proxyActivities(activityOptions);
|
|
81
83
|
let taskCompleted = false;
|
|
82
84
|
const monitorTask = async () => {
|
|
83
85
|
logger.info(`Monitor task starting for ${task.name}`);
|
|
@@ -96,7 +98,7 @@ async function handleTask(workflow, task, inputData) {
|
|
|
96
98
|
logger.info(`Monitor task exiting because main task completed`);
|
|
97
99
|
};
|
|
98
100
|
const result = await Promise.race([
|
|
99
|
-
|
|
101
|
+
executeDmv2Task(workflow, task, inputData).then((taskResult) => {
|
|
100
102
|
return {
|
|
101
103
|
type: "task_completed",
|
|
102
104
|
data: taskResult
|
|
@@ -116,12 +118,12 @@ async function handleTask(workflow, task, inputData) {
|
|
|
116
118
|
return results;
|
|
117
119
|
}
|
|
118
120
|
for (const childTask of task.config.onComplete) {
|
|
119
|
-
const childResult = await
|
|
121
|
+
const childResult = await handleDmv2Task(workflow, childTask, result.data);
|
|
120
122
|
results.push(...childResult);
|
|
121
123
|
}
|
|
122
124
|
if (task.name.endsWith("_extract") && result && typeof result === "object" && result.data && typeof result.data === "object" && "hasMore" in result.data && result.data.hasMore === true) {
|
|
123
125
|
logger.info(`Extract task ${task.name} has more data, restarting chain...`);
|
|
124
|
-
const nextBatchResults = await
|
|
126
|
+
const nextBatchResults = await handleDmv2Task(workflow, task, null);
|
|
125
127
|
results.push(...nextBatchResults);
|
|
126
128
|
}
|
|
127
129
|
return results;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/scripts/workflow.ts","../../src/scripts/serialization.ts"],"sourcesContent":["import {\n log as logger,\n ActivityOptions,\n proxyActivities,\n workflowInfo,\n continueAsNew,\n sleep,\n} from \"@temporalio/workflow\";\nimport { Duration } from \"@temporalio/common\";\nimport { Task, Workflow } from \"../dmv2\";\n\nimport { WorkflowState } from \"./types\";\nimport { mooseJsonEncode } from \"./serialization\";\n\ninterface WorkflowRequest {\n workflow_name: string;\n execution_mode: \"start\" | \"continue_as_new\";\n continue_from_task?: string; // Only for continue_as_new\n}\n\nconst {
|
|
1
|
+
{"version":3,"sources":["../../src/scripts/workflow.ts","../../src/scripts/serialization.ts"],"sourcesContent":["import {\n log as logger,\n ActivityOptions,\n proxyActivities,\n workflowInfo,\n continueAsNew,\n sleep,\n} from \"@temporalio/workflow\";\nimport { Duration } from \"@temporalio/common\";\nimport { Task, Workflow } from \"../dmv2\";\n\nimport { WorkflowState } from \"./types\";\nimport { mooseJsonEncode } from \"./serialization\";\n\ninterface WorkflowRequest {\n workflow_name: string;\n execution_mode: \"start\" | \"continue_as_new\";\n continue_from_task?: string; // Only for continue_as_new\n}\n\nconst { getDmv2Workflow, getTaskForWorkflow } = proxyActivities({\n startToCloseTimeout: \"1 minutes\",\n retry: {\n maximumAttempts: 1,\n },\n});\n\nexport async function ScriptWorkflow(\n request: WorkflowRequest,\n inputData?: any,\n): Promise<any[]> {\n const state: WorkflowState = {\n completedSteps: [],\n currentStep: null,\n failedStep: null,\n scriptPath: null,\n inputData: null,\n };\n\n const results: any[] = [];\n const workflowName = request.workflow_name;\n let currentData = inputData?.data || inputData || {};\n\n logger.info(\n `Starting workflow: ${workflowName} (mode: ${request.execution_mode}) with data: ${JSON.stringify(currentData)}`,\n );\n\n try {\n currentData = JSON.parse(mooseJsonEncode(currentData));\n const workflow = await getDmv2Workflow(workflowName);\n const task =\n request.execution_mode === \"start\" ?\n workflow.config.startingTask\n : await getTaskForWorkflow(workflowName, request.continue_from_task!);\n const result = await handleDmv2Task(workflow, task, currentData);\n results.push(...result);\n\n return results;\n } catch (error) {\n state.failedStep = workflowName;\n throw error;\n }\n}\n\nasync function handleDmv2Task(\n workflow: Workflow,\n task: Task<any, any>,\n inputData: any,\n): Promise<any[]> {\n // Handle timeout configuration\n const configTimeout = task.config.timeout;\n let taskTimeout: Duration | undefined;\n\n if (!configTimeout) {\n taskTimeout = \"1h\";\n } else if (configTimeout === \"never\") {\n taskTimeout = undefined;\n } else {\n taskTimeout = configTimeout as Duration;\n }\n\n const taskRetries = task.config.retries ?? 3;\n\n const timeoutMessage =\n taskTimeout ? `with timeout ${taskTimeout}` : \"with no timeout (unlimited)\";\n logger.info(\n `Handling task ${task.name} ${timeoutMessage} and retries ${taskRetries}`,\n );\n\n const activityOptions: ActivityOptions = {\n heartbeatTimeout: \"10s\",\n retry: {\n maximumAttempts: taskRetries,\n },\n };\n\n // Temporal requires either startToCloseTimeout OR scheduleToCloseTimeout to be set\n // For unlimited timeout (timeout = \"none\"), we use scheduleToCloseTimeout with a very large value\n // For normal timeouts, we use startToCloseTimeout for single execution timeout\n if (taskTimeout) {\n // Normal timeout - limit each individual execution attempt\n activityOptions.startToCloseTimeout = taskTimeout;\n } else {\n // Unlimited timeout - set scheduleToCloseTimeout to a very large value (10 years)\n // This satisfies Temporal's requirement while effectively allowing unlimited execution\n activityOptions.scheduleToCloseTimeout = \"87600h\"; // 10 years\n }\n\n const { executeDmv2Task } = proxyActivities(activityOptions);\n\n let taskCompleted = false;\n\n const monitorTask = async () => {\n logger.info(`Monitor task starting for ${task.name}`);\n while (!taskCompleted) {\n const info = workflowInfo();\n\n // Continue-as-new only when suggested by Temporal\n if (info.continueAsNewSuggested) {\n logger.info(`ContinueAsNew suggested by Temporal`);\n return await continueAsNew({\n workflow_name: workflow.name,\n execution_mode: \"continue_as_new\" as const,\n continue_from_task: task.name,\n });\n }\n\n await sleep(100);\n }\n logger.info(`Monitor task exiting because main task completed`);\n };\n\n const result = await Promise.race([\n executeDmv2Task(workflow, task, inputData)\n .then((taskResult) => {\n return {\n type: \"task_completed\" as const,\n data: taskResult,\n };\n })\n .finally(() => {\n taskCompleted = true;\n }),\n monitorTask().then(() => {\n return { type: \"continue_as_new\" as const, data: undefined };\n }),\n ]);\n\n if (result.type !== \"task_completed\") {\n return [];\n }\n\n const results = [result.data];\n if (!task.config.onComplete?.length) {\n return results;\n }\n\n for (const childTask of task.config.onComplete) {\n const childResult = await handleDmv2Task(workflow, childTask, result.data);\n results.push(...childResult);\n }\n\n // Check if this is an ETL extract task that needs to loop\n // ETL extract tasks end with \"_extract\" and return BatchResult with hasMore\n if (\n task.name.endsWith(\"_extract\") &&\n result &&\n typeof result === \"object\" &&\n result.data &&\n typeof result.data === \"object\" &&\n \"hasMore\" in result.data &&\n (result.data as any).hasMore === true\n ) {\n logger.info(`Extract task ${task.name} has more data, restarting chain...`);\n\n // Recursively call the extract task again to get the next batch\n const nextBatchResults = await handleDmv2Task(workflow, task, null);\n results.push(...nextBatchResults);\n }\n\n return results;\n}\n","// Add serialization helpers\nexport const mooseJsonEncode = (data: any): string => {\n return JSON.stringify(data, (_, value) => {\n if (value instanceof Map) {\n return {\n __type: \"Map\",\n value: Array.from(value.entries()),\n };\n }\n return value;\n });\n};\n\nexport const mooseJsonDecode = (text: string): any => {\n return JSON.parse(text, (_, value) => {\n if (value && typeof value === \"object\" && value.__type === \"Map\") {\n return new Map(value.value);\n }\n return value;\n });\n};\n"],"mappings":"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","names":[]}
|