import type { Effect } from 'effect'; import type { HandlerName } from '../../domain/identity/index.js'; import type { OutboxFlow } from '../../flow/sync-flow/index.js'; import type { Request } from '../entries/index.js'; export type Handler = { readonly flow?: OutboxFlow | null; } & ( | { readonly kind: 'entity'; readonly send: (request: Request) => Effect.Effect; } | { readonly kind: 'action'; readonly send: ( payload: unknown, entryId: string, ) => Effect.Effect; } ); export type Handlers = { readonly register: (name: HandlerName, handler: Handler) => void; readonly lookup: (name: HandlerName) => Handler | null; }; export const makeHandlers = (): Handlers => { const handlers = new Map(); return { register: (name, handler) => { if (handlers.has(name)) { throw new Error( `[sync] outbox handler "${name}" is already registered`, ); } handlers.set(name, handler); }, lookup: (name) => handlers.get(name) ?? null, }; };