UNPKG

@karmai-cloud/rest.temporalio

Version:

Express middleware for calling Temporal.io using REST Api Calls

157 lines 6.01 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.useValidator = useValidator; exports.temporalioMiddleware = temporalioMiddleware; const express_1 = __importStar(require("express")); const uuid_1 = require("uuid"); const signalValidators = new WeakMap(); function useValidator(signal, fn) { signalValidators.set(signal, fn); } function temporalioMiddleware(workflows, client, taskQueue, router) { if (router === undefined) { router = (0, express_1.Router)(); } for (const key of Object.keys(workflows)) { const value = workflows[key]; if (typeof value === "function") { // Workflow createWorkflowEndpoint(router, client, key, value, taskQueue); cancelWorkflowEndpoint(router, client); } else if (typeof value === "object" && value != null) { if (value["type"] === "signal") { // Signal createSignalEndpoint(router, client, value); } else if (value["type"] === "query") { // Query createQueryEndpoint(router, client, value); } else if (value["type"] === "update") { // Query createUpdateEndpoint(router, client, value); } } } return router; } function createWorkflowEndpoint(router, client, name, fn, taskQueue) { router.post(`/workflow/${name}`, express_1.default.json(), function (req, res) { const workflowId = req.body?.workflowId || `${name}_${(0, uuid_1.v4)()}`; const opts = { taskQueue, workflowId, args: [req.body], }; client.start(fn, opts).then(() => res.status(201).json({ workflowId })); }); router.post(`/workflow/${name}/sync`, express_1.default.json(), function (req, res) { const workflowId = req.body?.workflowId || `${name}_${(0, uuid_1.v4)()}`; const opts = { taskQueue, workflowId, args: [req.body], }; client .execute(fn, opts) .then((response) => res.status(201).send(response)); }); router.post(`/workflow/${name}/:workflowId`, express_1.default.json(), function (req, res) { const workflowId = req.params.workflowId; const opts = { taskQueue, workflowId, args: [req.body], }; client .start(fn, opts) .then(() => res.json({ workflowId })) .catch(defaultErrorHandlingMiddleware(req, res)); }); } function createSignalEndpoint(router, client, signal) { router.put(`/signal/${signal.name}/:workflowId`, express_1.default.json(), function (req, res) { let data = req.body; let fn = signalValidators.get(signal); if (fn != null) { data = fn(data); } const handle = client.getHandle(req.params.workflowId); handle .signal(signal, req.body) .then(() => res.json({ received: true })) .catch(defaultErrorHandlingMiddleware(req, res)); }); } function createQueryEndpoint(router, client, query) { router.get(`/query/${query.name}/:workflowId`, function (req, res) { const handle = client.getHandle(req.params.workflowId); handle .query(query, req.query) .then((result) => res.json({ result })) .catch(defaultErrorHandlingMiddleware(req, res)); }); } function createUpdateEndpoint(router, client, update) { router.patch(`/update/${update.name}/:workflowId`, express_1.default.json(), function (req, res) { let data = req.body; const handle = client.getHandle(req.params.workflowId); handle .executeUpdate(update, data) .then((result) => res.send(result)) .catch(defaultErrorHandlingMiddleware(req, res)); // TODO: Implement custom logic to handle errors }); } function cancelWorkflowEndpoint(router, client) { router.delete(`/workflow/:workflowId`, function (req, res) { const handle = client.getHandle(req.params.workflowId); handle .cancel() .then(() => res.status(204).send()) .catch(defaultErrorHandlingMiddleware(req, res)); }); } function defaultErrorHandlingMiddleware(req, res, next) { return (err) => { console.error(err); return res .status(err?.code > 200 && err?.code < 600 ? err.code : 500) .json({ message: err.message, issues: err?.issues }); }; } //# sourceMappingURL=index.js.map