UNPKG

autotel

Version:
1 lines 33.1 kB
{"version":3,"sources":["../src/workflow.ts"],"names":["AsyncLocalStorage","trace","emitCorrelatedEvent","getActiveSpan"],"mappings":"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","file":"chunk-K4UDKM3P.cjs","sourcesContent":["/**\n * Workflow and Saga tracing helpers\n *\n * Provides specialized tracing for multi-step workflows and sagas with\n * automatic step linking, compensation tracking, and workflow correlation.\n *\n * @example Simple workflow\n * ```typescript\n * import { traceWorkflow, traceStep } from 'autotel/workflow';\n *\n * export const processOrder = traceWorkflow({\n * name: 'OrderFulfillment',\n * workflowId: (order) => order.id,\n * })(ctx => async (order: Order) => {\n * await validateOrder(order);\n * await chargePayment(order);\n * await shipOrder(order);\n * });\n * ```\n *\n * @example Saga with compensation\n * ```typescript\n * import { traceWorkflow, traceStep } from 'autotel/workflow';\n *\n * export const orderSaga = traceWorkflow({\n * name: 'OrderSaga',\n * workflowId: () => generateUUID(),\n * })(ctx => async (order: Order) => {\n *\n * const reserveStep = traceStep({\n * name: 'ReserveInventory',\n * compensate: async () => {\n * await releaseInventory(order.items);\n * },\n * })(async () => {\n * await inventoryService.reserve(order.items);\n * });\n * await reserveStep();\n *\n * const paymentStep = traceStep({\n * name: 'ProcessPayment',\n * linkToPrevious: true,\n * compensate: async () => {\n * await refundPayment(order.paymentId);\n * },\n * })(async () => {\n * await paymentService.charge(order);\n * });\n * await paymentStep();\n * });\n * ```\n *\n * @module\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport type { Attributes, Link, SpanContext } from '@opentelemetry/api';\nimport { emitCorrelatedEvent } from './correlated-events';\nimport { trace } from './functional';\nimport type { TraceContext } from './trace-context';\nimport { getActiveSpan } from './trace-helpers';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Workflow status\n */\nexport type WorkflowStatus =\n | 'pending'\n | 'running'\n | 'completed'\n | 'failed'\n | 'compensating'\n | 'compensated'\n | 'compensation_failed';\n\n/**\n * Step status\n */\nexport type StepStatus =\n | 'pending'\n | 'running'\n | 'completed'\n | 'failed'\n | 'skipped'\n | 'compensated';\n\n/**\n * Configuration for workflow tracing\n */\nexport interface WorkflowConfig<TArgs extends unknown[] = unknown[]> {\n /** Workflow name (e.g., 'OrderFulfillment', 'UserOnboarding') */\n name: string;\n\n /**\n * Function to extract or generate workflow ID\n * Can be static string, function of args, or generator\n */\n workflowId: string | ((...args: TArgs) => string);\n\n /** Optional workflow version */\n version?: string;\n\n /** Additional attributes */\n attributes?: Attributes;\n\n /** Callback on workflow completion */\n onComplete?: (ctx: WorkflowContext, result: unknown) => void;\n\n /** Callback on workflow failure */\n onFailed?: (ctx: WorkflowContext, error: Error) => void;\n\n /** Callback on compensation start */\n onCompensating?: (ctx: WorkflowContext) => void;\n}\n\n/**\n * Configuration for workflow step tracing\n */\nexport interface StepConfig {\n /** Step name */\n name: string;\n\n /** Optional step description */\n description?: string;\n\n /** Step index (auto-assigned if not provided) */\n index?: number;\n\n /** Link to previous step span */\n linkToPrevious?: boolean;\n\n /** Link to specific step(s) by name */\n linkTo?: string | string[];\n\n /** Additional attributes */\n attributes?: Attributes;\n\n /** Compensation handler for saga rollback */\n compensate?: (error: Error) => Promise<void> | void;\n\n /** Whether this step is idempotent */\n idempotent?: boolean;\n\n /** Retry configuration */\n retry?: {\n maxAttempts: number;\n backoffMs?: number;\n };\n\n /** Callback on step completion */\n onComplete?: (ctx: StepContext) => void;\n\n /** Callback on step failure */\n onFailed?: (ctx: StepContext, error: Error) => void;\n}\n\n/**\n * Step metadata stored for linking and compensation\n */\ninterface StepMetadata {\n name: string;\n index: number;\n status: StepStatus;\n spanContext?: SpanContext;\n compensate?: (error: Error) => Promise<void> | void;\n startTime: number;\n endTime?: number;\n}\n\n/**\n * Extended trace context for workflows\n */\nexport interface WorkflowContext extends TraceContext {\n /** Get the workflow ID */\n getWorkflowId(): string;\n\n /** Get workflow name */\n getWorkflowName(): string;\n\n /** Get current workflow status */\n getStatus(): WorkflowStatus;\n\n /** Mark step as completed and store for linking */\n completeStep(stepName: string): void;\n\n /** Get previous step's span context for linking */\n getPreviousStep(stepName?: string): SpanContext | null;\n\n /** Get all completed steps */\n getCompletedSteps(): string[];\n\n /** Register a compensation handler */\n registerCompensation(\n stepName: string,\n handler: (error: Error) => Promise<void> | void,\n ): void;\n\n /** Trigger compensation for all registered steps */\n compensate(error: Error): Promise<void>;\n\n /** Record compensation result */\n recordCompensation(stepName: string, success: boolean, error?: Error): void;\n\n /** Set workflow status */\n setWorkflowStatus(status: WorkflowStatus): void;\n}\n\n/**\n * Extended trace context for workflow steps\n */\nexport interface StepContext extends TraceContext {\n /** Get step name */\n getStepName(): string;\n\n /** Get step index */\n getStepIndex(): number;\n\n /** Mark this step as completed */\n complete(): void;\n\n /** Skip this step */\n skip(reason?: string): void;\n\n /** Get workflow context */\n getWorkflowContext(): WorkflowContext | null;\n}\n\n// ============================================================================\n// Storage\n// ============================================================================\n\n// Store workflow state in a WeakMap keyed by span\nconst workflowStates = new WeakMap<\n object,\n {\n workflowId: string;\n workflowName: string;\n status: WorkflowStatus;\n steps: Map<string, StepMetadata>;\n stepCounter: number;\n compensations: Map<string, (error: Error) => Promise<void> | void>;\n }\n>();\n\n/**\n * AsyncLocalStorage for workflow context (async-safe)\n *\n * This replaces the previous module-level variable which was NOT safe for\n * concurrent workflows. AsyncLocalStorage ensures each async execution chain\n * has its own isolated workflow context.\n */\nconst workflowContextStorage = new AsyncLocalStorage<WorkflowContext>();\n\n// ============================================================================\n// Workflow Helper\n// ============================================================================\n\n/**\n * Create a traced workflow function\n *\n * Wraps business logic in a workflow span with automatic step tracking,\n * correlation via workflow ID, and compensation support.\n *\n * @param config - Workflow configuration\n * @returns Factory function that wraps your workflow logic\n *\n * @example Order fulfillment workflow\n * ```typescript\n * export const fulfillOrder = traceWorkflow({\n * name: 'OrderFulfillment',\n * workflowId: (order) => order.id,\n * version: '2.0',\n * })(ctx => async (order: Order) => {\n * ctx.setAttribute('order.total', order.total);\n *\n * await validateOrder(order);\n * await processPayment(order);\n * await fulfillItems(order);\n * await notifyCustomer(order);\n *\n * return { success: true, orderId: order.id };\n * });\n * ```\n */\nexport function traceWorkflow<TArgs extends unknown[], TReturn>(\n config: WorkflowConfig<TArgs>,\n) {\n const spanName = `workflow.${config.name}`;\n\n return (\n fnFactory: (ctx: WorkflowContext) => (...args: TArgs) => Promise<TReturn>,\n ): ((...args: TArgs) => Promise<TReturn>) => {\n return trace<TArgs, TReturn>(spanName, (baseCtx) => {\n return async (...args: TArgs) => {\n // Generate or extract workflow ID\n const workflowId =\n typeof config.workflowId === 'function'\n ? config.workflowId(...args)\n : config.workflowId;\n\n // Create workflow context\n const ctx = createWorkflowContext(baseCtx, config.name, workflowId);\n\n // Set workflow attributes\n ctx.setAttribute('workflow.name', config.name);\n ctx.setAttribute('workflow.id', workflowId);\n if (config.version) {\n ctx.setAttribute('workflow.version', config.version);\n }\n ctx.setAttribute('workflow.status', 'running');\n\n // Set custom attributes\n if (config.attributes) {\n for (const [key, value] of Object.entries(config.attributes)) {\n if (value !== undefined) {\n ctx.setAttribute(key, value as string | number | boolean);\n }\n }\n }\n\n // Run workflow in AsyncLocalStorage context for async-safety\n // This ensures concurrent workflows have isolated contexts\n return workflowContextStorage.run(ctx, async () => {\n try {\n // Execute workflow\n const userFn = fnFactory(ctx);\n const result = await userFn(...args);\n\n // Mark as completed\n ctx.setWorkflowStatus('completed');\n config.onComplete?.(ctx, result);\n\n return result;\n } catch (error) {\n // Mark as failed\n ctx.setWorkflowStatus('failed');\n config.onFailed?.(ctx, error as Error);\n\n // Check if we have compensations to run\n const state = getWorkflowState();\n if (state && state.compensations.size > 0) {\n ctx.setWorkflowStatus('compensating');\n config.onCompensating?.(ctx);\n\n try {\n await ctx.compensate(error as Error);\n ctx.setWorkflowStatus('compensated');\n } catch (compensationError) {\n ctx.setWorkflowStatus('compensation_failed');\n ctx.setAttribute(\n 'workflow.compensation.error',\n String(compensationError),\n );\n }\n }\n\n throw error;\n }\n });\n };\n });\n };\n}\n\n/**\n * Create a traced workflow step\n *\n * Wraps step logic with automatic linking to previous steps,\n * compensation registration, and status tracking.\n *\n * @param config - Step configuration\n * @returns Factory function that wraps your step logic\n *\n * @example Step with compensation\n * ```typescript\n * const chargePayment = traceStep({\n * name: 'ChargePayment',\n * linkToPrevious: true,\n * compensate: async (error) => {\n * await paymentService.refund(paymentId);\n * },\n * })(async (amount: number) => {\n * return await paymentService.charge(amount);\n * });\n * ```\n */\nexport function traceStep<TArgs extends unknown[], TReturn>(\n config: StepConfig,\n) {\n return (\n fn: (...args: TArgs) => Promise<TReturn>,\n ): ((...args: TArgs) => Promise<TReturn>) => {\n const spanName = `step.${config.name}`;\n\n return trace<TArgs, TReturn>(spanName, (baseCtx) => {\n return async (...args: TArgs) => {\n // Get workflow context from AsyncLocalStorage (async-safe)\n const workflowCtx = workflowContextStorage.getStore() ?? null;\n\n // Create step context\n const ctx = createStepContext(baseCtx, config, workflowCtx);\n\n // Set step attributes\n ctx.setAttribute('workflow.step.name', config.name);\n ctx.setAttribute('workflow.step.index', ctx.getStepIndex());\n ctx.setAttribute('workflow.step.status', 'running');\n\n if (config.description) {\n ctx.setAttribute('workflow.step.description', config.description);\n }\n\n if (config.idempotent) {\n ctx.setAttribute('workflow.step.idempotent', true);\n }\n\n // Set custom attributes\n if (config.attributes) {\n for (const [key, value] of Object.entries(config.attributes)) {\n if (value !== undefined) {\n ctx.setAttribute(key, value as string | number | boolean);\n }\n }\n }\n\n // Link to previous steps\n await addStepLinks(ctx, config, workflowCtx);\n\n // Register compensation if provided\n if (config.compensate && workflowCtx) {\n workflowCtx.registerCompensation(config.name, config.compensate);\n }\n\n // Execute with optional retry\n let lastError: Error | undefined;\n const maxAttempts = config.retry?.maxAttempts ?? 1;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n if (attempt > 1) {\n ctx.setAttribute('workflow.step.retry_attempt', attempt);\n emitCorrelatedEvent(ctx, 'step_retry', {\n 'workflow.step.attempt': attempt,\n 'workflow.step.max_attempts': maxAttempts,\n });\n\n // Backoff\n if (config.retry?.backoffMs) {\n await sleep(config.retry.backoffMs * attempt);\n }\n }\n\n const result = await fn(...args);\n\n // Mark as completed\n ctx.setAttribute('workflow.step.status', 'completed');\n ctx.complete();\n config.onComplete?.(ctx);\n\n return result;\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < maxAttempts) {\n emitCorrelatedEvent(ctx, 'step_retry_scheduled', {\n 'workflow.step.error': String(error),\n 'workflow.step.attempt': attempt,\n });\n }\n }\n }\n\n // All attempts failed\n ctx.setAttribute('workflow.step.status', 'failed');\n ctx.setAttribute('workflow.step.error', String(lastError));\n config.onFailed?.(ctx, lastError!);\n\n throw lastError;\n };\n });\n };\n}\n\n// ============================================================================\n// Context Creation\n// ============================================================================\n\n/**\n * Create workflow-extended context\n */\nfunction createWorkflowContext(\n baseCtx: TraceContext,\n workflowName: string,\n workflowId: string,\n): WorkflowContext {\n // Initialize state\n const span = getActiveSpan();\n const state = {\n workflowId,\n workflowName,\n status: 'running' as WorkflowStatus,\n steps: new Map<string, StepMetadata>(),\n stepCounter: 0,\n compensations: new Map<string, (error: Error) => Promise<void> | void>(),\n };\n\n if (span) {\n workflowStates.set(span, state);\n }\n\n return {\n ...baseCtx,\n\n getWorkflowId(): string {\n return workflowId;\n },\n\n getWorkflowName(): string {\n return workflowName;\n },\n\n getStatus(): WorkflowStatus {\n return state.status;\n },\n\n completeStep(stepName: string): void {\n let step = state.steps.get(stepName);\n if (!step) {\n // Auto-create step entry for manually managed steps\n // (when using registerCompensation without traceStep)\n step = {\n name: stepName,\n index: state.stepCounter++,\n status: 'pending',\n startTime: Date.now(),\n };\n state.steps.set(stepName, step);\n }\n step.status = 'completed';\n step.endTime = Date.now();\n\n // Capture span context for linking\n const currentSpan = getActiveSpan();\n if (currentSpan) {\n step.spanContext = currentSpan.spanContext();\n }\n },\n\n getPreviousStep(stepName?: string): SpanContext | null {\n if (stepName) {\n const step = state.steps.get(stepName);\n return step?.spanContext ?? null;\n }\n\n // Get last completed step\n let lastStep: StepMetadata | null = null;\n for (const step of state.steps.values()) {\n if (\n step.status === 'completed' &&\n (!lastStep || step.index > lastStep.index)\n ) {\n lastStep = step;\n }\n }\n\n return lastStep?.spanContext ?? null;\n },\n\n getCompletedSteps(): string[] {\n const completed: string[] = [];\n for (const [name, step] of state.steps) {\n if (step.status === 'completed') {\n completed.push(name);\n }\n }\n return completed.toSorted(\n (a, b) =>\n (state.steps.get(a)?.index ?? 0) - (state.steps.get(b)?.index ?? 0),\n );\n },\n\n registerCompensation(\n stepName: string,\n handler: (error: Error) => Promise<void> | void,\n ): void {\n state.compensations.set(stepName, handler);\n },\n\n async compensate(error: Error): Promise<void> {\n // Execute compensations in reverse order\n const compensationOrder = [...state.compensations.entries()].toReversed();\n\n for (const [stepName, handler] of compensationOrder) {\n const step = state.steps.get(stepName);\n if (step && step.status === 'completed') {\n try {\n emitCorrelatedEvent(baseCtx, 'compensation_started', {\n 'workflow.step.name': stepName,\n });\n\n await Promise.resolve(handler(error));\n\n this.recordCompensation(stepName, true);\n step.status = 'compensated';\n } catch (compensationError) {\n this.recordCompensation(\n stepName,\n false,\n compensationError as Error,\n );\n throw compensationError;\n }\n }\n }\n },\n\n recordCompensation(\n stepName: string,\n success: boolean,\n error?: Error,\n ): void {\n emitCorrelatedEvent(baseCtx, 'compensation_completed', {\n 'workflow.step.name': stepName,\n 'workflow.compensation.success': success,\n ...(error && { 'workflow.compensation.error': String(error) }),\n });\n\n baseCtx.setAttribute(\n `workflow.compensation.${stepName}`,\n success ? 'success' : 'failed',\n );\n },\n\n setWorkflowStatus(status: WorkflowStatus): void {\n state.status = status;\n baseCtx.setAttribute('workflow.status', status);\n\n emitCorrelatedEvent(baseCtx, 'workflow_status_changed', {\n 'workflow.status': status,\n });\n },\n };\n}\n\n/**\n * Create step-extended context\n */\nfunction createStepContext(\n baseCtx: TraceContext,\n config: StepConfig,\n workflowCtx: WorkflowContext | null,\n): StepContext {\n // Determine step index\n let stepIndex = config.index ?? 0;\n if (workflowCtx) {\n const span = getActiveSpan();\n if (span) {\n const state = workflowStates.get(span);\n if (state) {\n stepIndex = config.index ?? state.stepCounter++;\n }\n }\n }\n\n // Register step metadata\n if (workflowCtx) {\n const wfSpan = getActiveSpan();\n if (wfSpan) {\n const state = workflowStates.get(wfSpan);\n if (state) {\n state.steps.set(config.name, {\n name: config.name,\n index: stepIndex,\n status: 'running',\n startTime: Date.now(),\n compensate: config.compensate,\n });\n }\n }\n }\n\n return {\n ...baseCtx,\n\n getStepName(): string {\n return config.name;\n },\n\n getStepIndex(): number {\n return stepIndex;\n },\n\n complete(): void {\n if (workflowCtx) {\n workflowCtx.completeStep(config.name);\n }\n },\n\n skip(reason?: string): void {\n baseCtx.setAttribute('workflow.step.status', 'skipped');\n if (reason) {\n baseCtx.setAttribute('workflow.step.skip_reason', reason);\n }\n emitCorrelatedEvent(baseCtx, 'step_skipped', {\n 'workflow.step.name': config.name,\n ...(reason && { 'workflow.step.skip_reason': reason }),\n });\n },\n\n getWorkflowContext(): WorkflowContext | null {\n return workflowCtx;\n },\n };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get workflow state from context\n */\nfunction getWorkflowState() {\n const span = getActiveSpan();\n return span ? workflowStates.get(span) : null;\n}\n\n/**\n * Add links to previous steps\n */\nasync function addStepLinks(\n ctx: StepContext,\n config: StepConfig,\n workflowCtx: WorkflowContext | null,\n): Promise<void> {\n if (!workflowCtx) return;\n\n const links: Link[] = [];\n\n // Link to previous step\n if (config.linkToPrevious) {\n const prevSpanContext = workflowCtx.getPreviousStep();\n if (prevSpanContext) {\n links.push({\n context: prevSpanContext,\n attributes: {\n 'workflow.link.type': 'sequence',\n },\n });\n }\n }\n\n // Link to specific steps\n if (config.linkTo) {\n const stepNames = Array.isArray(config.linkTo)\n ? config.linkTo\n : [config.linkTo];\n\n for (const stepName of stepNames) {\n const spanContext = workflowCtx.getPreviousStep(stepName);\n if (spanContext) {\n links.push({\n context: spanContext,\n attributes: {\n 'workflow.link.type': 'dependency',\n 'workflow.link.step': stepName,\n },\n });\n }\n }\n }\n\n // Add all links\n if (links.length > 0) {\n ctx.addLinks(links);\n }\n}\n\n/**\n * Sleep utility for retry backoff\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// ============================================================================\n// Convenience Exports\n// ============================================================================\n\n/**\n * Get current workflow context (if inside a workflow)\n *\n * Uses AsyncLocalStorage to ensure async-safety when multiple\n * workflows are running concurrently.\n */\nexport function getCurrentWorkflowContext(): WorkflowContext | null {\n return workflowContextStorage.getStore() ?? null;\n}\n\n/**\n * Check if currently executing inside a workflow\n *\n * Uses AsyncLocalStorage to ensure async-safety when multiple\n * workflows are running concurrently.\n */\nexport function isInWorkflow(): boolean {\n return workflowContextStorage.getStore() !== undefined;\n}\n"]}