UNPKG

@ilijanl/temporalio-utils

Version:

A set of utils around temporalio typescript sdk

187 lines (183 loc) 6.57 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/workflow/index.ts var workflow_exports = {}; __export(workflow_exports, { createCallableActivities: () => createCallableActivities, createWorkflow: () => createWorkflow, createWorkflowsHandler: () => createWorkflowsHandler, executeActivity: () => executeActivity, executeChildWorkflow: () => executeChildWorkflow, executeWorkflowAsActivity: () => executeWorkflowAsActivity, startAsyncChildWorkflow: () => startAsyncChildWorkflow, testingQueueName: () => testingQueueName, workflowsToActivities: () => workflowsToActivities }); module.exports = __toCommonJS(workflow_exports); var wf = __toESM(require("@temporalio/workflow"), 1); var import_lodash = __toESM(require("lodash.merge"), 1); // src/common/utils.ts var mapInputToArgs = (input) => input !== void 0 ? [input] : []; var getWorkflowOptions = (definition, payload) => ({ args: mapInputToArgs(payload.input), taskQueue: definition.taskQueue, workflowId: payload.workflowId }); // src/workflow/index.ts 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 = (0, import_lodash.default)( {}, 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; }, {}); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createCallableActivities, createWorkflow, createWorkflowsHandler, executeActivity, executeChildWorkflow, executeWorkflowAsActivity, startAsyncChildWorkflow, testingQueueName, workflowsToActivities });