Disclaimer: this package is made for our internal usage and is only open source for convenience so we might not consider Pull Requests or Issues.
A TypeScript implementation of the workflow pattern.
Using workflow provides a framework to add error handling and logging to your business logic.
The workflow module exports:
- a
Workflow<Input, Result>
that represent the final function - a
UnexpectedError
error type. This error is thrown if your business logic throws an undeclared error. - a
Logger
interface withinfo
a function to handle usal logging (e.g.console.log
,winston.info
...)error
a function to handle error logging (e.g.console.error
,winston.error
...)
- a
Meta
interface that allows you to put a logger and a set of adapters that will be passed to your business logic. - a
Payload<Input>
type that contains aninput: Input
and ameta: Meta
field. - a
makePayload(input: Input, meta: Meta)
function that should be used to create payloads. - finally the default export is
makeWorkflow
function that use your business logic function to create a workflow. It accepts:workflowName: string
this should be unique per workflow and is used to identify your workflow in logshandleRun: (input: Input, adapters?: object) => Promise<Result>
your actual business logic functions. the input that will be passed is the input contained in the payload. the adapters are the adapters contained in the payload's meta.acceptableErrors
an Array of error classes that are accepted to be thrown by the workflow.
// src/workflows/dummy-workflow.ts
import makeWorkflow from "workflow"
// A custom error class
export class WrongInput extends Error {}
// this is your actual business logic
function handleRun(input: Input, adapters: object): Promise<Result> {
const adapter = adapters["dummyAdapter"] || realImplementation
return someLogic(adapter(input))
}
// this is the errors you handle
const acceptableErrors = [WrongInput]
export default makeWorkflow("dummyWorkflow", handleRun, acceptableErrors)
// src/handlers/some-module.ts
import {UnexpectedError} from "workflow"
import dummyWorkflow, {WrongInput} from "../worflows/dummy-workflow"
export function dummyHandle(req, res) {
const payload = makePayload({myParam: req.params.myParam}, {logger: {info: console.log, error: console.error}})
return dummyWorkflow(payload)
.then(data => res.status(200).json(data))
.catch(error => {
if (error instanceof WrongInput) {
return res.status(422).json({message: error.message})
} else {
return res.status(500).json({message: "An unexpected error happened"})
}
})
}
See CONTRIBUTING.md.