Orchestr

Middleware

Middleware is a way to intercept and modify the input, output or context of an action. It is a way to add additional functionality to an action without having to modify the action-handler.

Middleware is a way to intercept and modify the input, output or context of an action. It is a way to add additional functionality to an action without having to modify the action-handler.

Middleware Types

Action Middleware

server/orchestr/newsletter/subscribe.ts
import { defineOrchestrMock as defineOrchestr } from '@laioutr-core/orchestr/types';
/** Create a mock client for a CRM system */
declare const createCrmClient: () => { subscribe: (email: string) => Promise<void> };
// ---cut---
import { SubscribeAction } from '@laioutr-core/canonical-types/newsletter';

// The return-type of the use-method is a new Orchestr instance with the middleware applied
const defineMyPackage = defineOrchestr.use((args, next) => {
  return next({
    context: { client: createCrmClient() }
  })
})

export default defineMyPackage.actionHandler(SubscribeAction, async ({ input, context }) => {
  // Now we can use the client to subscribe to the newsletter
  await context.client.subscribe(input.email);
  return { status: 'success' as const };
});

Middleware can also be used before and after an action-handler. An example would be a logger middleware that logs the input and output of an action.

server/orchestr/defineWithLogger.ts
import { defineOrchestrMock as defineOrchestr } from '@laioutr-core/orchestr/types';
// ---cut---
export const defineWithLogger = defineOrchestr.use(async (args, next) => {
  console.log('Action Input', args.input, args.clientEnv);
  const response = await next({});
  console.log('Action Output', response.output);
  return response;
});