UNPKG

@ilijanl/temporalio-utils

Version:

A set of utils around temporalio typescript sdk

139 lines (137 loc) 4.26 kB
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 };