import { GatewayRequest, GatewayResponse } from './api-gateway'; /** * Request definition for orchestration. */ export interface OrchestratedRequest { /** Unique request identifier */ id: string; /** The request to execute */ request: GatewayRequest | (() => Promise); /** Dependencies (other request IDs that must complete first) */ dependsOn?: string[]; /** Transform the result before storing */ transform?: (result: T) => unknown; /** Condition to determine if request should execute */ condition?: (results: Record) => boolean; /** Custom error handler */ onError?: (error: Error, results: Record) => T | Promise; /** Priority (higher executes first when dependencies are equal) */ priority?: number; /** Request metadata */ metadata?: Record; } /** * Orchestration result. */ export interface OrchestrationResult> { /** Whether all requests succeeded */ success: boolean; /** Results keyed by request ID */ results: T; /** Errors keyed by request ID */ errors: Record; /** Execution order */ executionOrder: string[]; /** Total duration in milliseconds */ duration: number; /** Individual request durations */ durations: Record; } /** * Batch request configuration. */ export interface BatchConfig { /** Maximum concurrent requests */ maxConcurrency?: number; /** Stop on first error */ stopOnError?: boolean; /** Delay between batches in milliseconds */ batchDelay?: number; /** Timeout for entire batch in milliseconds */ timeout?: number; } /** * Chain configuration. */ export interface ChainConfig { /** Stop chain on error */ stopOnError?: boolean; /** Delay between requests in milliseconds */ delay?: number; /** Pass result to next request */ passResult?: boolean; } /** * Waterfall step. */ export interface WaterfallStep { /** Step identifier */ id: string; /** Execute function */ execute: (input: TInput, context: WaterfallContext) => Promise; /** Condition to skip step */ skip?: (input: TInput, context: WaterfallContext) => boolean; /** Error handler */ onError?: (error: Error, input: TInput, context: WaterfallContext) => TOutput | Promise; } /** * Waterfall execution context. */ export interface WaterfallContext { /** All results so far */ results: Record; /** Original input */ originalInput: unknown; /** Metadata */ metadata: Record; } /** * Request Orchestrator for complex API request patterns. * * @example * ```typescript * const orchestrator = new RequestOrchestrator(apiGateway.request.bind(apiGateway)); * * // Parallel requests * const results = await orchestrator.parallel([ * { path: '/users', method: 'GET' }, * { path: '/posts', method: 'GET' }, * { path: '/comments', method: 'GET' }, * ]); * * // Dependent requests * const orchestrated = await orchestrator.orchestrate([ * { id: 'user', request: { path: '/users/1', method: 'GET' } }, * { * id: 'posts', * request: { path: '/posts?userId=1', method: 'GET' }, * dependsOn: ['user'], * }, * ]); * ``` */ export declare class RequestOrchestrator { private readonly executor; /** * Create a new orchestrator. * * @param executor - Function to execute requests */ constructor(executor: (request: GatewayRequest) => Promise>); /** * Execute multiple requests in parallel. * * @param requests - Requests to execute * @param config - Batch configuration * @returns Array of results */ parallel(requests: GatewayRequest[], config?: BatchConfig): Promise[]>; /** * Execute requests in parallel, settling all regardless of errors. * * @param requests - Requests to execute * @returns Results and errors */ allSettled(requests: GatewayRequest[]): Promise<{ fulfilled: GatewayResponse[]; rejected: { request: GatewayRequest; error: Error; }[]; }>; /** * Race multiple requests, returning the first to complete. * * @param requests - Requests to race * @returns First completed result */ race(requests: GatewayRequest[]): Promise>; /** * Execute requests sequentially. * * @param requests - Requests to execute in order * @param config - Chain configuration * @returns Array of results */ sequence(requests: GatewayRequest[], config?: ChainConfig): Promise[]>; /** * Execute a waterfall pattern where each step's output feeds the next. * * @param steps - Waterfall steps * @param initialInput - Initial input to first step * @returns Final result and all intermediate results */ waterfall(steps: WaterfallStep[], initialInput: TInput): Promise<{ result: TOutput; results: Record; }>; /** * Orchestrate requests with dependencies. * * Requests are executed in optimal order based on their dependencies, * maximizing parallelism while respecting dependency constraints. * * @param requests - Orchestrated requests * @returns Orchestration result */ orchestrate>(requests: OrchestratedRequest[]): Promise>; /** * Execute with fallback options. * * @param primary - Primary request * @param fallbacks - Fallback requests in order of preference * @returns First successful result */ withFallback(primary: GatewayRequest, fallbacks: GatewayRequest[]): Promise>; /** * Execute with retry and exponential backoff. * * @param request - Request to execute * @param maxRetries - Maximum retry attempts * @param baseDelay - Base delay in milliseconds * @returns Response */ withRetry(request: GatewayRequest, maxRetries?: number, baseDelay?: number): Promise>; /** * Execute with timeout. * * @param request - Request to execute * @param timeout - Timeout in milliseconds * @returns Response */ withTimeout(request: GatewayRequest, timeout: number): Promise>; /** * Aggregate paginated results. * * @param baseRequest - Base request * @param options - Pagination options * @returns All aggregated results */ paginate(baseRequest: GatewayRequest, options?: { /** Page parameter name */ pageParam?: string; /** Limit parameter name */ limitParam?: string; /** Items per page */ pageSize?: number; /** Maximum pages to fetch */ maxPages?: number; /** Extract items from response */ getItems?: (data: unknown) => T[]; /** Check if more pages exist */ hasMore?: (data: unknown, page: number) => boolean; }): Promise; /** * Build dependency graph and determine execution levels. */ private buildDependencyGraph; /** * Delay execution. */ private delay; } /** * Create a new request orchestrator. * * @param executor - Request executor function * @returns RequestOrchestrator instance */ export declare function createRequestOrchestrator(executor: (request: GatewayRequest) => Promise>): RequestOrchestrator;