@ilijanl/temporalio-utils
Version:
A set of utils around temporalio typescript sdk
139 lines (137 loc) • 4.26 kB
JavaScript
import {
getWorkflowOptions,
mapInputToArgs
} from "../chunk-JWYS7WEA.js";
// src/workflow/index.ts
import * as wf from "@temporalio/workflow";
import _merge from "lodash.merge";
var testingQueueName = "__testingQueue__";
var createWorkflow = (definition, execution) => {
return {
async executeFn(...args) {
return execution(...args).catch((error) => {
wf.log.error("Workflow failure caught", { error });
return Promise.reject(error);
});
},
definition
};
};
function calculateChildWorkflowOptions(definiton, payload, options) {
const childWorkflowOptions = getWorkflowOptions(definiton, payload);
return {
...childWorkflowOptions,
...options
};
}
var executeChildWorkflow = (definition, payload, options) => {
return wf.executeChild(
definition.workflowType,
calculateChildWorkflowOptions(definition, payload, options)
);
};
var startAsyncChildWorkflow = (definition, payload, options) => {
return wf.startChild(definition.workflowType, {
parentClosePolicy: wf.ParentClosePolicy.ABANDON,
cancellationType: wf.ChildWorkflowCancellationType.TRY_CANCEL,
...calculateChildWorkflowOptions(definition, payload, options)
});
};
function isTestQueue(queue) {
return queue === testingQueueName;
}
var createTestActivityOptions = (calledFromQueue) => {
const isTest = isTestQueue(calledFromQueue);
if (!isTest) {
return {};
}
return {
scheduleToStartTimeout: "1 seconds",
startToCloseTimeout: "3 seconds",
taskQueue: calledFromQueue,
retry: {
initialInterval: "1 second",
maximumAttempts: 2,
maximumInterval: "1 second",
backoffCoefficient: 1
}
};
};
async function executeActivity(activityDefinition, input, options) {
const contextInfo = wf.workflowInfo();
const finalOptions = _merge(
{},
activityDefinition.config,
createTestActivityOptions(contextInfo.taskQueue),
{
scheduleToCloseTimeout: options?.timeout
}
);
return wf.scheduleActivity(activityDefinition.activityType, mapInputToArgs(input), finalOptions);
}
var executeWorkflowAsActivity = (workflowDefinition, payload, activityOptions) => wf.scheduleActivity(workflowDefinition.workflowType, mapInputToArgs(payload), {
activityId: payload.workflowId,
// keep the default low so the tests fail fast
startToCloseTimeout: "3 seconds",
retry: {
maximumAttempts: 3
},
...activityOptions
});
var workflowsToActivities = (workflowDefinitions, activityOptions) => workflowDefinitions.reduce(
(agg, workflowDefinition) => {
async function workflowFn(input) {
const workflowInfo2 = wf.workflowInfo();
return executeWorkflowAsActivity(
workflowDefinition,
{
workflowId: workflowInfo2.workflowId,
input
},
activityOptions
);
}
agg[workflowDefinition.workflowType] = workflowFn;
return agg;
},
{}
);
var createWorkflowsHandler = (workflows) => {
const handlers = workflows.reduce(
(agg, workflow) => {
const workflowType = workflow.definition.workflowType;
if (agg[workflowType]) {
throw new Error(`Workflow "${workflowType}" is already defined`);
}
agg[workflowType] = workflow.executeFn;
return agg;
},
{}
);
return async function workflowHandler(...args) {
const workflowType = wf.workflowInfo().workflowType;
const workflowFn = handlers[workflowType];
if (!workflowFn) {
const details = workflowFn === void 0 ? "no such workflow handler is defined" : `expected a function, but got: '${typeof workflowFn}'`;
throw new TypeError(`Failed to initialize workflow of type '${workflowType}': ${details}`);
}
return workflowFn.apply(this, args);
};
};
var createCallableActivities = (activities) => Object.entries(activities).reduce((agg, [property, activityDefinition]) => {
agg[property] = function execute(input, options) {
return executeActivity(activityDefinition, input, options);
};
return agg;
}, {});
export {
createCallableActivities,
createWorkflow,
createWorkflowsHandler,
executeActivity,
executeChildWorkflow,
executeWorkflowAsActivity,
startAsyncChildWorkflow,
testingQueueName,
workflowsToActivities
};