@parsrun/service 0.1.29 → 0.1.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +30 -3
- package/dist/client.js +1 -0
- package/dist/client.js.map +1 -1
- package/dist/define.d.ts +29 -6
- package/dist/define.js.map +1 -1
- package/dist/events/index.d.ts +95 -15
- package/dist/events/index.js.map +1 -1
- package/dist/{handler-CmiDUWZv.d.ts → handler-eCIZLODd.d.ts} +45 -3
- package/dist/{index-CVOAoJjZ.d.ts → index-reEpIe1R.d.ts} +82 -11
- package/dist/index.d.ts +53 -9
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/resilience/index.d.ts +76 -9
- package/dist/resilience/index.js +1 -0
- package/dist/resilience/index.js.map +1 -1
- package/dist/rpc/index.d.ts +3 -3
- package/dist/rpc/index.js +1 -0
- package/dist/rpc/index.js.map +1 -1
- package/dist/serialization/index.d.ts +27 -2
- package/dist/serialization/index.js.map +1 -1
- package/dist/{server-DFE8n2Sx.d.ts → server-BB9AbnkP.d.ts} +50 -6
- package/dist/tracing/index.d.ts +94 -15
- package/dist/tracing/index.js.map +1 -1
- package/dist/transports/cloudflare/index.d.ts +72 -10
- package/dist/transports/cloudflare/index.js.map +1 -1
- package/dist/{types-n4LLSPQU.d.ts → types-DHZaZwAt.d.ts} +51 -0
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/define.ts","../src/client.ts","../src/config.ts","../src/rpc/client.ts","../src/rpc/errors.ts","../src/resilience/circuit-breaker.ts","../src/resilience/bulkhead.ts","../src/resilience/retry.ts","../src/resilience/timeout.ts","../src/rpc/transports/embedded.ts","../src/serialization/index.ts","../src/rpc/transports/http.ts","../src/events/transports/memory.ts","../src/events/handler.ts","../src/events/format.ts","../src/tracing/tracer.ts","../src/tracing/context.ts","../src/tracing/spans.ts","../src/tracing/exporters.ts","../src/rpc/server.ts","../src/events/emitter.ts","../src/events/dead-letter.ts"],"sourcesContent":["/**\n * @parsrun/service - Service Definition\n * Factory function for defining services\n */\n\nimport type {\n ServiceDefinition,\n QueryDefinition,\n MutationDefinition,\n EventDefinition,\n} from \"./types.js\";\n\n// ============================================================================\n// SERVICE DEFINITION FACTORY\n// ============================================================================\n\n/**\n * Define a service with type-safe queries, mutations, and events\n *\n * @example\n * ```typescript\n * const paymentsService = defineService({\n * name: 'payments',\n * version: '1.0.0',\n *\n * queries: {\n * getSubscription: {\n * input: { subscriptionId: 'string' },\n * output: { status: 'string', plan: 'string' },\n * },\n * },\n *\n * mutations: {\n * subscribe: {\n * input: { email: 'string', planId: 'string' },\n * output: { checkoutUrl: 'string' },\n * },\n * },\n *\n * events: {\n * emits: {\n * 'subscription.created': {\n * data: { customerId: 'string', planId: 'string' },\n * delivery: 'at-least-once',\n * },\n * },\n * handles: ['user.deleted', 'tenant.suspended'],\n * },\n * });\n * ```\n */\nexport function defineService<\n TQueries extends Record<string, QueryDefinition> = Record<string, QueryDefinition>,\n TMutations extends Record<string, MutationDefinition> = Record<string, MutationDefinition>,\n TEmits extends Record<string, EventDefinition> = Record<string, EventDefinition>,\n THandles extends string[] = string[],\n>(\n definition: ServiceDefinition<TQueries, TMutations, TEmits, THandles>\n): ServiceDefinition<TQueries, TMutations, TEmits, THandles> {\n // Validate service definition\n validateServiceDefinition(definition);\n\n // Freeze the definition to prevent mutation\n return Object.freeze({\n ...definition,\n queries: definition.queries ? Object.freeze({ ...definition.queries }) : undefined,\n mutations: definition.mutations ? Object.freeze({ ...definition.mutations }) : undefined,\n events: definition.events\n ? Object.freeze({\n emits: definition.events.emits\n ? Object.freeze({ ...definition.events.emits })\n : undefined,\n handles: definition.events.handles\n ? Object.freeze([...definition.events.handles])\n : undefined,\n })\n : undefined,\n }) as ServiceDefinition<TQueries, TMutations, TEmits, THandles>;\n}\n\n/**\n * Validate service definition\n */\nfunction validateServiceDefinition(definition: ServiceDefinition): void {\n if (!definition.name) {\n throw new Error(\"Service name is required\");\n }\n\n if (!definition.version) {\n throw new Error(\"Service version is required\");\n }\n\n // Validate version format (semver-like)\n const versionRegex = /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.]+)?$/;\n if (!versionRegex.test(definition.version)) {\n throw new Error(`Invalid version format: ${definition.version}. Expected semver (e.g., 1.0.0)`);\n }\n\n // Validate query/mutation names (no dots or special chars)\n const nameRegex = /^[a-zA-Z][a-zA-Z0-9_]*$/;\n\n if (definition.queries) {\n for (const name of Object.keys(definition.queries)) {\n if (!nameRegex.test(name)) {\n throw new Error(\n `Invalid query name: ${name}. Must start with letter and contain only alphanumeric and underscore`\n );\n }\n }\n }\n\n if (definition.mutations) {\n for (const name of Object.keys(definition.mutations)) {\n if (!nameRegex.test(name)) {\n throw new Error(\n `Invalid mutation name: ${name}. Must start with letter and contain only alphanumeric and underscore`\n );\n }\n }\n }\n\n // Validate event names (dot notation allowed)\n const eventNameRegex = /^[a-zA-Z][a-zA-Z0-9_.]*$/;\n\n if (definition.events?.emits) {\n for (const name of Object.keys(definition.events.emits)) {\n if (!eventNameRegex.test(name)) {\n throw new Error(\n `Invalid event name: ${name}. Must start with letter and contain only alphanumeric, underscore, and dot`\n );\n }\n }\n }\n\n if (definition.events?.handles) {\n for (const name of definition.events.handles) {\n if (!eventNameRegex.test(name)) {\n throw new Error(\n `Invalid handled event name: ${name}. Must start with letter and contain only alphanumeric, underscore, and dot`\n );\n }\n }\n }\n}\n\n// ============================================================================\n// SERVICE DEFINITION UTILITIES\n// ============================================================================\n\n/**\n * Get all method names from a service definition\n */\nexport function getServiceMethods(definition: ServiceDefinition): {\n queries: string[];\n mutations: string[];\n} {\n return {\n queries: definition.queries ? Object.keys(definition.queries) : [],\n mutations: definition.mutations ? Object.keys(definition.mutations) : [],\n };\n}\n\n/**\n * Get all event types from a service definition\n */\nexport function getServiceEvents(definition: ServiceDefinition): {\n emits: string[];\n handles: string[];\n} {\n return {\n emits: definition.events?.emits ? Object.keys(definition.events.emits) : [],\n handles: definition.events?.handles ?? [],\n };\n}\n\n/**\n * Check if a service version satisfies a version requirement\n *\n * @example\n * ```typescript\n * satisfiesVersion('1.2.3', '1.x') // true\n * satisfiesVersion('1.2.3', '1.2.x') // true\n * satisfiesVersion('2.0.0', '1.x') // false\n * ```\n */\nexport function satisfiesVersion(version: string, requirement: string): boolean {\n const versionParts = version.split(\".\").map((p) => parseInt(p, 10));\n const requirementParts = requirement.split(\".\");\n\n for (let i = 0; i < requirementParts.length; i++) {\n const req = requirementParts[i];\n if (req === \"x\" || req === \"*\") {\n continue;\n }\n\n const reqNum = parseInt(req ?? \"0\", 10);\n const verNum = versionParts[i] ?? 0;\n\n if (verNum !== reqNum) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Check if a method is deprecated in the service definition\n */\nexport function isMethodDeprecated(\n definition: ServiceDefinition,\n methodName: string,\n type: \"query\" | \"mutation\"\n): { deprecated: boolean; since?: string; replacement?: string } {\n const methods = type === \"query\" ? definition.queries : definition.mutations;\n const method = methods?.[methodName];\n\n if (!method?.deprecated) {\n return { deprecated: false };\n }\n\n const result: { deprecated: boolean; since?: string; replacement?: string } = {\n deprecated: true,\n since: method.deprecated,\n };\n\n if (method.replacement) {\n result.replacement = method.replacement;\n }\n\n return result;\n}\n\n/**\n * Get method timeout (use method-specific or fall back to default)\n */\nexport function getMethodTimeout(\n definition: ServiceDefinition,\n methodName: string,\n type: \"query\" | \"mutation\",\n defaultTimeout: number\n): number {\n const methods = type === \"query\" ? definition.queries : definition.mutations;\n const method = methods?.[methodName];\n\n return method?.timeout ?? defaultTimeout;\n}\n","/**\n * @parsrun/service - Service Client\n * High-level client API for consuming services\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { generateId } from \"@parsrun/core\";\nimport type {\n ServiceDefinition,\n ServiceClient,\n ServiceClientOptions,\n ServiceConfig,\n RpcTransport,\n EventTransport,\n EventHandler,\n EventHandlerOptions,\n Unsubscribe,\n ParsEvent,\n QueryInput,\n QueryOutput,\n MutationInput,\n MutationOutput,\n EventData,\n} from \"./types.js\";\nimport { mergeConfig } from \"./config.js\";\nimport { RpcClient } from \"./rpc/client.js\";\nimport { getEmbeddedRegistry } from \"./rpc/transports/embedded.js\";\nimport { createHttpTransport } from \"./rpc/transports/http.js\";\nimport { createMemoryEventTransport, getGlobalEventBus } from \"./events/transports/memory.js\";\nimport { Tracer, getGlobalTracer } from \"./tracing/tracer.js\";\n\n// ============================================================================\n// SERVICE CLIENT IMPLEMENTATION\n// ============================================================================\n\n/**\n * Full service client with RPC and Events\n */\nclass ServiceClientImpl<TDef extends ServiceDefinition> implements ServiceClient<TDef> {\n readonly name: string;\n private readonly rpcClient: RpcClient;\n private readonly eventTransport: EventTransport;\n private readonly config: Required<ServiceConfig>;\n private readonly tracer: Tracer | null;\n\n constructor(\n definition: TDef,\n rpcTransport: RpcTransport,\n eventTransport: EventTransport,\n config: ServiceConfig,\n _logger?: Logger\n ) {\n this.name = definition.name;\n this.config = mergeConfig(config);\n this.tracer = getGlobalTracer();\n\n this.rpcClient = new RpcClient({\n service: definition.name,\n transport: rpcTransport,\n config: this.config,\n });\n\n this.eventTransport = eventTransport;\n }\n\n /**\n * Execute a query\n */\n async query<K extends keyof TDef[\"queries\"]>(\n method: K,\n input: QueryInput<TDef[\"queries\"], K>\n ): Promise<QueryOutput<TDef[\"queries\"], K>> {\n const methodName = String(method);\n const traceContext = this.tracer?.currentContext();\n\n // Trace if available\n if (this.tracer && traceContext) {\n return this.tracer.trace(\n `rpc.${this.name}.${methodName}`,\n async () => {\n return this.rpcClient.query(methodName, input, {\n traceContext,\n }) as Promise<QueryOutput<TDef[\"queries\"], K>>;\n },\n { kind: \"client\" }\n ) as Promise<QueryOutput<TDef[\"queries\"], K>>;\n }\n\n return this.rpcClient.query(methodName, input) as Promise<QueryOutput<TDef[\"queries\"], K>>;\n }\n\n /**\n * Execute a mutation\n */\n async mutate<K extends keyof TDef[\"mutations\"]>(\n method: K,\n input: MutationInput<TDef[\"mutations\"], K>\n ): Promise<MutationOutput<TDef[\"mutations\"], K>> {\n const methodName = String(method);\n const traceContext = this.tracer?.currentContext();\n\n // Trace if available\n if (this.tracer && traceContext) {\n return this.tracer.trace(\n `rpc.${this.name}.${methodName}`,\n async () => {\n return this.rpcClient.mutate(methodName, input, {\n traceContext,\n }) as Promise<MutationOutput<TDef[\"mutations\"], K>>;\n },\n { kind: \"client\" }\n ) as Promise<MutationOutput<TDef[\"mutations\"], K>>;\n }\n\n return this.rpcClient.mutate(methodName, input) as Promise<MutationOutput<TDef[\"mutations\"], K>>;\n }\n\n /**\n * Emit an event\n */\n async emit<K extends keyof NonNullable<TDef[\"events\"]>[\"emits\"]>(\n eventType: K,\n data: EventData<NonNullable<TDef[\"events\"]>[\"emits\"], K>\n ): Promise<void> {\n const type = String(eventType);\n const traceContext = this.tracer?.currentContext();\n\n const event: ParsEvent = {\n specversion: \"1.0\",\n type,\n source: this.name,\n id: generateId(),\n time: new Date().toISOString(),\n data,\n };\n\n // Add trace context if available\n if (traceContext) {\n event.parstracecontext = `00-${traceContext.traceId}-${traceContext.spanId}-01`;\n }\n\n await this.eventTransport.emit(event);\n }\n\n /**\n * Subscribe to events\n */\n on<T = unknown>(\n eventType: string,\n handler: EventHandler<T>,\n options?: EventHandlerOptions\n ): Unsubscribe {\n return this.eventTransport.subscribe(eventType, handler as EventHandler, options);\n }\n\n /**\n * Get circuit breaker state\n */\n getCircuitState(): \"closed\" | \"open\" | \"half-open\" | null {\n return this.rpcClient.getCircuitState();\n }\n\n /**\n * Close the client\n */\n async close(): Promise<void> {\n await this.rpcClient.close();\n await this.eventTransport.close?.();\n }\n}\n\n// ============================================================================\n// USE SERVICE FACTORY\n// ============================================================================\n\n/**\n * Create a service client\n *\n * @example\n * ```typescript\n * // Embedded mode (same process)\n * const payments = useService('payments');\n *\n * // HTTP mode (remote service)\n * const payments = useService('payments', {\n * mode: 'http',\n * baseUrl: 'https://payments.example.com',\n * });\n *\n * // Cloudflare binding mode\n * const payments = useService('payments', {\n * mode: 'binding',\n * binding: env.PAYMENTS,\n * });\n * ```\n */\nexport function useService<TDef extends ServiceDefinition = ServiceDefinition>(\n serviceName: string,\n options: ServiceClientOptions = {}\n): ServiceClient<TDef> {\n const mode = options.mode ?? \"embedded\";\n const config = options.config ?? {};\n\n let rpcTransport: RpcTransport;\n let eventTransport: EventTransport;\n\n switch (mode) {\n case \"embedded\": {\n // Use embedded registry\n const registry = getEmbeddedRegistry();\n if (!registry.has(serviceName)) {\n throw new Error(\n `Service not found in embedded registry: ${serviceName}. ` +\n `Make sure the service is registered before using it.`\n );\n }\n rpcTransport = registry.createTransport(serviceName);\n\n // Use global event bus\n const eventBus = getGlobalEventBus();\n const services = eventBus.getServices();\n if (services.includes(serviceName)) {\n // Get existing transport from bus\n eventTransport = createMemoryEventTransport();\n } else {\n eventTransport = createMemoryEventTransport();\n }\n break;\n }\n\n case \"http\": {\n if (!options.baseUrl) {\n throw new Error(\"baseUrl is required for HTTP mode\");\n }\n rpcTransport = createHttpTransport({\n baseUrl: options.baseUrl,\n });\n // Events over HTTP would need webhook or polling - use memory for now\n eventTransport = createMemoryEventTransport();\n break;\n }\n\n case \"binding\": {\n if (!options.binding) {\n throw new Error(\"binding is required for binding mode\");\n }\n // Cloudflare service binding transport\n rpcTransport = createBindingTransport(serviceName, options.binding);\n eventTransport = createMemoryEventTransport();\n break;\n }\n\n default:\n throw new Error(`Unknown service client mode: ${mode}`);\n }\n\n // Use custom transports if provided\n if (options.rpcTransport) {\n rpcTransport = options.rpcTransport;\n }\n if (options.eventTransport) {\n eventTransport = options.eventTransport;\n }\n\n // Create a minimal definition for the client\n const definition: ServiceDefinition = {\n name: serviceName,\n version: \"1.x\",\n };\n\n return new ServiceClientImpl<TDef>(\n definition as TDef,\n rpcTransport,\n eventTransport,\n config\n );\n}\n\n/**\n * Create a typed service client from a definition\n */\nexport function useTypedService<TDef extends ServiceDefinition>(\n definition: TDef,\n options: ServiceClientOptions = {}\n): ServiceClient<TDef> {\n return useService<TDef>(definition.name, options);\n}\n\n// ============================================================================\n// BINDING TRANSPORT HELPER\n// ============================================================================\n\nimport type { Fetcher, RpcRequest, RpcResponse } from \"./types.js\";\n\n/**\n * Create RPC transport for Cloudflare service binding\n */\nfunction createBindingTransport(_serviceName: string, binding: Fetcher): RpcTransport {\n return {\n name: \"binding\",\n async call<TInput, TOutput>(request: RpcRequest<TInput>) {\n const response = await binding.fetch(\"http://internal/rpc\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Request-ID\": request.id,\n \"X-Service\": request.service,\n \"X-Method\": request.method,\n },\n body: JSON.stringify(request),\n });\n\n return response.json() as Promise<RpcResponse<TOutput>>;\n },\n async close() {\n // No cleanup needed for bindings\n },\n };\n}\n\n// ============================================================================\n// SERVICE REGISTRY CLIENT\n// ============================================================================\n\n/**\n * Service registry for managing multiple service clients\n */\nexport class ServiceRegistry {\n private readonly clients: Map<string, ServiceClient> = new Map();\n private readonly config: ServiceConfig;\n\n constructor(config?: ServiceConfig) {\n this.config = config ?? {};\n }\n\n /**\n * Get or create a service client\n */\n get<TDef extends ServiceDefinition = ServiceDefinition>(\n serviceName: string,\n options?: ServiceClientOptions\n ): ServiceClient<TDef> {\n let client = this.clients.get(serviceName);\n if (!client) {\n client = useService<TDef>(serviceName, {\n ...options,\n config: { ...this.config, ...options?.config },\n });\n this.clients.set(serviceName, client);\n }\n return client as ServiceClient<TDef>;\n }\n\n /**\n * Close all clients\n */\n async closeAll(): Promise<void> {\n const closePromises = Array.from(this.clients.values()).map((client) => {\n if (\"close\" in client && typeof client.close === \"function\") {\n return (client as { close: () => Promise<void> }).close();\n }\n return Promise.resolve();\n });\n await Promise.all(closePromises);\n this.clients.clear();\n }\n}\n\n/**\n * Create a service registry\n */\nexport function createServiceRegistry(config?: ServiceConfig): ServiceRegistry {\n return new ServiceRegistry(config);\n}\n","/**\n * @parsrun/service - Configuration\n * Default configuration and config utilities\n */\n\nimport type {\n ServiceConfig,\n EventFormatConfig,\n SerializationConfig,\n TracingConfig,\n VersioningConfig,\n ResilienceConfig,\n DeadLetterConfig,\n} from \"./types.js\";\n\n// ============================================================================\n// DEFAULT CONFIGURATIONS\n// ============================================================================\n\nexport const DEFAULT_EVENT_CONFIG: Required<EventFormatConfig> = {\n format: \"cloudevents\",\n internalCompact: true,\n};\n\nexport const DEFAULT_SERIALIZATION_CONFIG: Required<SerializationConfig> = {\n format: \"json\",\n};\n\nexport const DEFAULT_TRACING_CONFIG: Required<TracingConfig> = {\n enabled: true,\n sampler: { ratio: 0.1 },\n exporter: \"console\",\n endpoint: \"\",\n serviceName: \"pars-service\",\n};\n\nexport const DEFAULT_VERSIONING_CONFIG: Required<VersioningConfig> = {\n strategy: \"header\",\n defaultVersion: \"1.x\",\n};\n\nexport const DEFAULT_RESILIENCE_CONFIG: Required<ResilienceConfig> = {\n circuitBreaker: {\n enabled: true,\n failureThreshold: 5,\n resetTimeout: 30_000,\n successThreshold: 2,\n },\n bulkhead: {\n maxConcurrent: 100,\n maxQueue: 50,\n },\n timeout: 5_000,\n retry: {\n attempts: 3,\n backoff: \"exponential\",\n initialDelay: 100,\n maxDelay: 10_000,\n },\n};\n\nexport const DEFAULT_DEAD_LETTER_CONFIG: Required<DeadLetterConfig> = {\n enabled: true,\n retention: \"30d\",\n onFail: \"alert\",\n alertThreshold: 10,\n};\n\nexport const DEFAULT_SERVICE_CONFIG: Required<ServiceConfig> = {\n events: DEFAULT_EVENT_CONFIG,\n serialization: DEFAULT_SERIALIZATION_CONFIG,\n tracing: DEFAULT_TRACING_CONFIG,\n versioning: DEFAULT_VERSIONING_CONFIG,\n resilience: DEFAULT_RESILIENCE_CONFIG,\n deadLetter: DEFAULT_DEAD_LETTER_CONFIG,\n};\n\n// ============================================================================\n// CONFIG UTILITIES\n// ============================================================================\n\n/**\n * Merge user config with defaults\n */\nexport function mergeConfig(userConfig?: Partial<ServiceConfig>): Required<ServiceConfig> {\n if (!userConfig) {\n return { ...DEFAULT_SERVICE_CONFIG };\n }\n\n return {\n events: {\n ...DEFAULT_EVENT_CONFIG,\n ...userConfig.events,\n },\n serialization: {\n ...DEFAULT_SERIALIZATION_CONFIG,\n ...userConfig.serialization,\n },\n tracing: {\n ...DEFAULT_TRACING_CONFIG,\n ...userConfig.tracing,\n },\n versioning: {\n ...DEFAULT_VERSIONING_CONFIG,\n ...userConfig.versioning,\n },\n resilience: {\n ...DEFAULT_RESILIENCE_CONFIG,\n ...userConfig.resilience,\n circuitBreaker: {\n ...DEFAULT_RESILIENCE_CONFIG.circuitBreaker,\n ...userConfig.resilience?.circuitBreaker,\n },\n bulkhead: {\n ...DEFAULT_RESILIENCE_CONFIG.bulkhead,\n ...userConfig.resilience?.bulkhead,\n },\n retry: {\n ...DEFAULT_RESILIENCE_CONFIG.retry,\n ...userConfig.resilience?.retry,\n },\n },\n deadLetter: {\n ...DEFAULT_DEAD_LETTER_CONFIG,\n ...userConfig.deadLetter,\n },\n };\n}\n\n/**\n * Create config for development\n */\nexport function createDevConfig(overrides?: Partial<ServiceConfig>): Required<ServiceConfig> {\n return mergeConfig({\n tracing: {\n enabled: true,\n sampler: \"always\",\n exporter: \"console\",\n },\n resilience: {\n circuitBreaker: { enabled: false },\n timeout: 30_000,\n },\n ...overrides,\n });\n}\n\n/**\n * Create config for production\n */\nexport function createProdConfig(overrides?: Partial<ServiceConfig>): Required<ServiceConfig> {\n return mergeConfig({\n tracing: {\n enabled: true,\n sampler: { ratio: 0.1 },\n exporter: \"otlp\",\n },\n resilience: {\n circuitBreaker: { enabled: true },\n timeout: 5_000,\n },\n ...overrides,\n });\n}\n\n/**\n * Validate config\n */\nexport function validateConfig(config: ServiceConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // Validate tracing\n if (config.tracing?.sampler && typeof config.tracing.sampler === \"object\") {\n const ratio = config.tracing.sampler.ratio;\n if (ratio < 0 || ratio > 1) {\n errors.push(\"tracing.sampler.ratio must be between 0 and 1\");\n }\n }\n\n // Validate resilience\n if (config.resilience?.timeout !== undefined && config.resilience.timeout < 0) {\n errors.push(\"resilience.timeout must be non-negative\");\n }\n\n if (config.resilience?.circuitBreaker?.failureThreshold !== undefined) {\n if (config.resilience.circuitBreaker.failureThreshold < 1) {\n errors.push(\"resilience.circuitBreaker.failureThreshold must be at least 1\");\n }\n }\n\n if (config.resilience?.bulkhead?.maxConcurrent !== undefined) {\n if (config.resilience.bulkhead.maxConcurrent < 1) {\n errors.push(\"resilience.bulkhead.maxConcurrent must be at least 1\");\n }\n }\n\n if (config.resilience?.retry?.attempts !== undefined) {\n if (config.resilience.retry.attempts < 0) {\n errors.push(\"resilience.retry.attempts must be non-negative\");\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","/**\n * @parsrun/service - RPC Client\n * Client for making RPC calls to services\n */\n\nimport { generateId } from \"@parsrun/core\";\nimport type {\n RpcRequest,\n RpcTransport,\n RpcMetadata,\n TraceContext,\n ServiceConfig,\n} from \"../types.js\";\nimport { mergeConfig } from \"../config.js\";\nimport { TimeoutError, toRpcError } from \"./errors.js\";\nimport {\n CircuitBreaker,\n Bulkhead,\n withRetry,\n withTimeout,\n} from \"../resilience/index.js\";\n\n// ============================================================================\n// RPC CLIENT\n// ============================================================================\n\nexport interface RpcClientOptions {\n /** Service name */\n service: string;\n /** RPC transport */\n transport: RpcTransport;\n /** Service configuration */\n config?: ServiceConfig;\n /** Default metadata for all requests */\n defaultMetadata?: RpcMetadata;\n}\n\n/**\n * RPC Client for making service calls\n */\nexport class RpcClient {\n private readonly service: string;\n private readonly transport: RpcTransport;\n private readonly config: Required<ServiceConfig>;\n private readonly defaultMetadata: RpcMetadata;\n private readonly circuitBreaker: CircuitBreaker | null;\n private readonly bulkhead: Bulkhead | null;\n\n constructor(options: RpcClientOptions) {\n this.service = options.service;\n this.transport = options.transport;\n this.config = mergeConfig(options.config);\n this.defaultMetadata = options.defaultMetadata ?? {};\n\n // Initialize circuit breaker\n const cbConfig = this.config.resilience?.circuitBreaker;\n if (\n cbConfig &&\n cbConfig.enabled &&\n cbConfig.failureThreshold !== undefined &&\n cbConfig.resetTimeout !== undefined &&\n cbConfig.successThreshold !== undefined\n ) {\n this.circuitBreaker = new CircuitBreaker({\n failureThreshold: cbConfig.failureThreshold,\n resetTimeout: cbConfig.resetTimeout,\n successThreshold: cbConfig.successThreshold,\n });\n } else {\n this.circuitBreaker = null;\n }\n\n // Initialize bulkhead\n const bhConfig = this.config.resilience?.bulkhead;\n if (bhConfig && bhConfig.maxConcurrent !== undefined && bhConfig.maxQueue !== undefined) {\n this.bulkhead = new Bulkhead({\n maxConcurrent: bhConfig.maxConcurrent,\n maxQueue: bhConfig.maxQueue,\n });\n } else {\n this.bulkhead = null;\n }\n }\n\n /**\n * Execute a query\n */\n async query<TInput, TOutput>(\n method: string,\n input: TInput,\n options?: CallOptions\n ): Promise<TOutput> {\n return this.call<TInput, TOutput>(\"query\", method, input, options);\n }\n\n /**\n * Execute a mutation\n */\n async mutate<TInput, TOutput>(\n method: string,\n input: TInput,\n options?: CallOptions\n ): Promise<TOutput> {\n return this.call<TInput, TOutput>(\"mutation\", method, input, options);\n }\n\n /**\n * Internal call implementation\n */\n private async call<TInput, TOutput>(\n type: \"query\" | \"mutation\",\n method: string,\n input: TInput,\n options?: CallOptions\n ): Promise<TOutput> {\n const request: RpcRequest<TInput> = {\n id: generateId(),\n service: this.service,\n method,\n type,\n input,\n metadata: {\n ...this.defaultMetadata,\n ...options?.metadata,\n },\n };\n\n const version = options?.version ?? this.config.versioning.defaultVersion;\n if (version) {\n request.version = version;\n }\n if (options?.traceContext) {\n request.traceContext = options.traceContext;\n }\n\n const timeout = options?.timeout ?? this.config.resilience.timeout ?? 30_000;\n const retryConfig = options?.retry ?? this.config.resilience.retry;\n\n // Build the execution chain\n let execute = async (): Promise<TOutput> => {\n const response = await this.transport.call<TInput, TOutput>(request);\n\n if (!response.success) {\n const error = toRpcError(\n new Error(response.error?.message ?? \"Unknown error\")\n );\n throw error;\n }\n\n return response.output as TOutput;\n };\n\n // Wrap with timeout\n execute = withTimeout(execute, timeout, () => {\n throw new TimeoutError(this.service, method, timeout);\n });\n\n // Wrap with retry\n const attempts = retryConfig?.attempts ?? 0;\n if (attempts > 0) {\n execute = withRetry(execute, {\n attempts,\n backoff: retryConfig?.backoff ?? \"exponential\",\n initialDelay: retryConfig?.initialDelay ?? 100,\n maxDelay: retryConfig?.maxDelay ?? 5000,\n shouldRetry: (error) => {\n if (error instanceof Error && \"retryable\" in error) {\n return (error as { retryable: boolean }).retryable;\n }\n return false;\n },\n });\n }\n\n // Wrap with circuit breaker\n if (this.circuitBreaker) {\n const cb = this.circuitBreaker;\n const originalExecute = execute;\n execute = async () => {\n return cb.execute(originalExecute);\n };\n }\n\n // Wrap with bulkhead\n if (this.bulkhead) {\n const bh = this.bulkhead;\n const originalExecute = execute;\n execute = async () => {\n return bh.execute(originalExecute);\n };\n }\n\n return execute();\n }\n\n /**\n * Get circuit breaker state\n */\n getCircuitState(): \"closed\" | \"open\" | \"half-open\" | null {\n return this.circuitBreaker?.state ?? null;\n }\n\n /**\n * Get bulkhead stats\n */\n getBulkheadStats(): { concurrent: number; queued: number } | null {\n if (!this.bulkhead) return null;\n return {\n concurrent: this.bulkhead.concurrent,\n queued: this.bulkhead.queued,\n };\n }\n\n /**\n * Close the client and release resources\n */\n async close(): Promise<void> {\n await this.transport.close?.();\n }\n}\n\n/**\n * Call options\n */\nexport interface CallOptions {\n /** Timeout in ms */\n timeout?: number;\n /** Version requirement */\n version?: string;\n /** Trace context */\n traceContext?: TraceContext;\n /** Request metadata */\n metadata?: RpcMetadata;\n /** Retry configuration override */\n retry?: {\n attempts?: number;\n backoff?: \"linear\" | \"exponential\";\n initialDelay?: number;\n maxDelay?: number;\n };\n}\n\n/**\n * Create an RPC client\n */\nexport function createRpcClient(options: RpcClientOptions): RpcClient {\n return new RpcClient(options);\n}\n","/**\n * @parsrun/service - RPC Errors\n */\n\nimport { ParsError } from \"@parsrun/core\";\n\n/**\n * Base RPC error\n */\nexport class RpcError extends ParsError {\n public readonly retryable: boolean;\n public readonly retryAfter?: number;\n\n constructor(\n message: string,\n code: string,\n statusCode: number = 500,\n options?: {\n retryable?: boolean;\n retryAfter?: number;\n details?: Record<string, unknown>;\n }\n ) {\n super(message, code, statusCode, options?.details);\n this.name = \"RpcError\";\n this.retryable = options?.retryable ?? false;\n if (options?.retryAfter !== undefined) {\n this.retryAfter = options.retryAfter;\n }\n }\n}\n\n/**\n * Service not found error\n */\nexport class ServiceNotFoundError extends RpcError {\n constructor(serviceName: string) {\n super(`Service not found: ${serviceName}`, \"SERVICE_NOT_FOUND\", 404, {\n retryable: false,\n details: { service: serviceName },\n });\n this.name = \"ServiceNotFoundError\";\n }\n}\n\n/**\n * Method not found error\n */\nexport class MethodNotFoundError extends RpcError {\n constructor(serviceName: string, methodName: string) {\n super(\n `Method not found: ${serviceName}.${methodName}`,\n \"METHOD_NOT_FOUND\",\n 404,\n {\n retryable: false,\n details: { service: serviceName, method: methodName },\n }\n );\n this.name = \"MethodNotFoundError\";\n }\n}\n\n/**\n * Version mismatch error\n */\nexport class VersionMismatchError extends RpcError {\n constructor(serviceName: string, requested: string, available: string) {\n super(\n `Version mismatch for ${serviceName}: requested ${requested}, available ${available}`,\n \"VERSION_MISMATCH\",\n 400,\n {\n retryable: false,\n details: { service: serviceName, requested, available },\n }\n );\n this.name = \"VersionMismatchError\";\n }\n}\n\n/**\n * Timeout error\n */\nexport class TimeoutError extends RpcError {\n constructor(serviceName: string, methodName: string, timeoutMs: number) {\n super(\n `Request to ${serviceName}.${methodName} timed out after ${timeoutMs}ms`,\n \"TIMEOUT\",\n 504,\n {\n retryable: true,\n details: { service: serviceName, method: methodName, timeout: timeoutMs },\n }\n );\n this.name = \"TimeoutError\";\n }\n}\n\n/**\n * Circuit breaker open error\n */\nexport class CircuitOpenError extends RpcError {\n constructor(serviceName: string, resetAfterMs: number) {\n super(\n `Circuit breaker open for ${serviceName}`,\n \"CIRCUIT_OPEN\",\n 503,\n {\n retryable: true,\n retryAfter: Math.ceil(resetAfterMs / 1000),\n details: { service: serviceName, resetAfterMs },\n }\n );\n this.name = \"CircuitOpenError\";\n }\n}\n\n/**\n * Bulkhead rejected error\n */\nexport class BulkheadRejectedError extends RpcError {\n constructor(serviceName: string) {\n super(\n `Request rejected by bulkhead for ${serviceName}: too many concurrent requests`,\n \"BULKHEAD_REJECTED\",\n 503,\n {\n retryable: true,\n retryAfter: 1,\n details: { service: serviceName },\n }\n );\n this.name = \"BulkheadRejectedError\";\n }\n}\n\n/**\n * Transport error\n */\nexport class TransportError extends RpcError {\n constructor(message: string, cause?: Error) {\n const options: { retryable: boolean; details?: Record<string, unknown> } = {\n retryable: true,\n };\n if (cause) {\n options.details = { cause: cause.message };\n }\n super(message, \"TRANSPORT_ERROR\", 502, options);\n this.name = \"TransportError\";\n }\n}\n\n/**\n * Serialization error\n */\nexport class SerializationError extends RpcError {\n constructor(message: string, cause?: Error) {\n const options: { retryable: boolean; details?: Record<string, unknown> } = {\n retryable: false,\n };\n if (cause) {\n options.details = { cause: cause.message };\n }\n super(message, \"SERIALIZATION_ERROR\", 400, options);\n this.name = \"SerializationError\";\n }\n}\n\n/**\n * Convert unknown error to RpcError\n */\nexport function toRpcError(error: unknown): RpcError {\n if (error instanceof RpcError) {\n return error;\n }\n\n if (error instanceof Error) {\n return new RpcError(error.message, \"INTERNAL_ERROR\", 500, {\n retryable: false,\n details: { originalError: error.name },\n });\n }\n\n return new RpcError(String(error), \"UNKNOWN_ERROR\", 500, {\n retryable: false,\n });\n}\n","/**\n * @parsrun/service - Circuit Breaker\n * Prevents cascading failures by failing fast when a service is unhealthy\n */\n\nimport { CircuitOpenError } from \"../rpc/errors.js\";\n\n// ============================================================================\n// CIRCUIT BREAKER\n// ============================================================================\n\nexport interface CircuitBreakerOptions {\n /** Number of failures before opening circuit */\n failureThreshold: number;\n /** Time to wait before half-open state (ms) */\n resetTimeout: number;\n /** Number of successes in half-open to close circuit */\n successThreshold: number;\n /** Optional callback on state change */\n onStateChange?: (from: CircuitState, to: CircuitState) => void;\n}\n\nexport type CircuitState = \"closed\" | \"open\" | \"half-open\";\n\n/**\n * Circuit Breaker implementation\n *\n * States:\n * - CLOSED: Normal operation, requests pass through\n * - OPEN: Failing fast, requests are rejected immediately\n * - HALF-OPEN: Testing if service recovered, limited requests allowed\n */\nexport class CircuitBreaker {\n private _state: CircuitState = \"closed\";\n private failures = 0;\n private successes = 0;\n private lastFailureTime = 0;\n private readonly options: CircuitBreakerOptions;\n\n constructor(options: CircuitBreakerOptions) {\n this.options = options;\n }\n\n /**\n * Get current state\n */\n get state(): CircuitState {\n // Check if we should transition from open to half-open\n if (this._state === \"open\") {\n const timeSinceFailure = Date.now() - this.lastFailureTime;\n if (timeSinceFailure >= this.options.resetTimeout) {\n this.transitionTo(\"half-open\");\n }\n }\n return this._state;\n }\n\n /**\n * Execute a function with circuit breaker protection\n */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n // Check state (this may transition from open to half-open)\n const currentState = this.state;\n\n if (currentState === \"open\") {\n const resetAfter = this.options.resetTimeout - (Date.now() - this.lastFailureTime);\n throw new CircuitOpenError(\"service\", Math.max(0, resetAfter));\n }\n\n try {\n const result = await fn();\n this.onSuccess();\n return result;\n } catch (error) {\n this.onFailure();\n throw error;\n }\n }\n\n /**\n * Record a successful call\n */\n private onSuccess(): void {\n if (this._state === \"half-open\") {\n this.successes++;\n if (this.successes >= this.options.successThreshold) {\n this.transitionTo(\"closed\");\n }\n } else if (this._state === \"closed\") {\n // Reset failure count on success\n this.failures = 0;\n }\n }\n\n /**\n * Record a failed call\n */\n private onFailure(): void {\n this.lastFailureTime = Date.now();\n\n if (this._state === \"half-open\") {\n // Any failure in half-open goes back to open\n this.transitionTo(\"open\");\n } else if (this._state === \"closed\") {\n this.failures++;\n if (this.failures >= this.options.failureThreshold) {\n this.transitionTo(\"open\");\n }\n }\n }\n\n /**\n * Transition to a new state\n */\n private transitionTo(newState: CircuitState): void {\n const oldState = this._state;\n this._state = newState;\n\n // Reset counters on state change\n if (newState === \"closed\") {\n this.failures = 0;\n this.successes = 0;\n } else if (newState === \"half-open\") {\n this.successes = 0;\n }\n\n this.options.onStateChange?.(oldState, newState);\n }\n\n /**\n * Manually reset the circuit breaker\n */\n reset(): void {\n this.transitionTo(\"closed\");\n }\n\n /**\n * Get circuit breaker statistics\n */\n getStats(): {\n state: CircuitState;\n failures: number;\n successes: number;\n lastFailureTime: number;\n } {\n return {\n state: this.state,\n failures: this.failures,\n successes: this.successes,\n lastFailureTime: this.lastFailureTime,\n };\n }\n}\n","/**\n * @parsrun/service - Bulkhead\n * Limits concurrent requests to prevent resource exhaustion\n */\n\nimport { BulkheadRejectedError } from \"../rpc/errors.js\";\n\n// ============================================================================\n// BULKHEAD\n// ============================================================================\n\nexport interface BulkheadOptions {\n /** Maximum concurrent requests */\n maxConcurrent: number;\n /** Maximum queue size (0 = no queue) */\n maxQueue: number;\n /** Optional callback when request is rejected */\n onRejected?: () => void;\n}\n\ninterface QueuedRequest<T> {\n fn: () => Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Bulkhead implementation\n *\n * Limits the number of concurrent requests to protect resources.\n * Excess requests can be queued up to maxQueue limit.\n */\nexport class Bulkhead {\n private _concurrent = 0;\n private readonly queue: QueuedRequest<unknown>[] = [];\n private readonly options: BulkheadOptions;\n\n constructor(options: BulkheadOptions) {\n this.options = options;\n }\n\n /**\n * Get current concurrent count\n */\n get concurrent(): number {\n return this._concurrent;\n }\n\n /**\n * Get current queue size\n */\n get queued(): number {\n return this.queue.length;\n }\n\n /**\n * Check if bulkhead is full\n */\n get isFull(): boolean {\n return (\n this._concurrent >= this.options.maxConcurrent &&\n this.queue.length >= this.options.maxQueue\n );\n }\n\n /**\n * Execute a function with bulkhead protection\n */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n // Check if we can execute immediately\n if (this._concurrent < this.options.maxConcurrent) {\n return this.doExecute(fn);\n }\n\n // Check if we can queue\n if (this.queue.length < this.options.maxQueue) {\n return this.enqueue(fn);\n }\n\n // Reject\n this.options.onRejected?.();\n throw new BulkheadRejectedError(\"service\");\n }\n\n /**\n * Execute immediately\n */\n private async doExecute<T>(fn: () => Promise<T>): Promise<T> {\n this._concurrent++;\n try {\n return await fn();\n } finally {\n this._concurrent--;\n this.processQueue();\n }\n }\n\n /**\n * Add to queue\n */\n private enqueue<T>(fn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n this.queue.push({\n fn,\n resolve: resolve as (value: unknown) => void,\n reject,\n });\n });\n }\n\n /**\n * Process queued requests\n */\n private processQueue(): void {\n if (this.queue.length === 0) return;\n if (this._concurrent >= this.options.maxConcurrent) return;\n\n const queued = this.queue.shift();\n if (!queued) return;\n\n this.doExecute(queued.fn)\n .then(queued.resolve)\n .catch(queued.reject);\n }\n\n /**\n * Get bulkhead statistics\n */\n getStats(): {\n concurrent: number;\n queued: number;\n maxConcurrent: number;\n maxQueue: number;\n } {\n return {\n concurrent: this._concurrent,\n queued: this.queue.length,\n maxConcurrent: this.options.maxConcurrent,\n maxQueue: this.options.maxQueue,\n };\n }\n\n /**\n * Clear the queue (reject all pending)\n */\n clearQueue(): void {\n const error = new BulkheadRejectedError(\"service\");\n while (this.queue.length > 0) {\n const queued = this.queue.shift();\n queued?.reject(error);\n }\n }\n}\n","/**\n * @parsrun/service - Retry\n * Retry failed operations with backoff\n */\n\n// ============================================================================\n// RETRY\n// ============================================================================\n\nexport interface RetryOptions {\n /** Number of retry attempts (not including initial attempt) */\n attempts: number;\n /** Backoff strategy */\n backoff: \"linear\" | \"exponential\";\n /** Initial delay in ms */\n initialDelay: number;\n /** Maximum delay in ms */\n maxDelay: number;\n /** Jitter factor (0-1) to add randomness */\n jitter?: number;\n /** Should retry predicate */\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n /** Callback on retry */\n onRetry?: (error: unknown, attempt: number, delay: number) => void;\n}\n\n/**\n * Default retry predicate - retry on retryable errors\n */\nconst defaultShouldRetry = (error: unknown): boolean => {\n if (error && typeof error === \"object\" && \"retryable\" in error) {\n return (error as { retryable: boolean }).retryable;\n }\n return false;\n};\n\n/**\n * Calculate delay for retry attempt\n */\nfunction calculateDelay(\n attempt: number,\n options: RetryOptions\n): number {\n let delay: number;\n\n if (options.backoff === \"exponential\") {\n // Exponential backoff: initialDelay * 2^attempt\n delay = options.initialDelay * Math.pow(2, attempt);\n } else {\n // Linear backoff: initialDelay * (attempt + 1)\n delay = options.initialDelay * (attempt + 1);\n }\n\n // Apply max delay\n delay = Math.min(delay, options.maxDelay);\n\n // Apply jitter\n if (options.jitter && options.jitter > 0) {\n const jitterRange = delay * options.jitter;\n delay = delay - jitterRange / 2 + Math.random() * jitterRange;\n }\n\n return Math.round(delay);\n}\n\n/**\n * Sleep for a given duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Wrap a function with retry logic\n */\nexport function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions\n): () => Promise<T> {\n const shouldRetry = options.shouldRetry ?? defaultShouldRetry;\n\n return async (): Promise<T> => {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= options.attempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Check if we should retry\n if (attempt >= options.attempts || !shouldRetry(error, attempt)) {\n throw error;\n }\n\n // Calculate delay\n const delay = calculateDelay(attempt, options);\n\n // Callback\n options.onRetry?.(error, attempt + 1, delay);\n\n // Wait before retry\n await sleep(delay);\n }\n }\n\n throw lastError;\n };\n}\n\n/**\n * Execute a function with retry\n */\nexport async function executeWithRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions\n): Promise<T> {\n return withRetry(fn, options)();\n}\n\n/**\n * Create a retry wrapper with preset options\n */\nexport function createRetryWrapper(\n defaultOptions: Partial<RetryOptions>\n): <T>(fn: () => Promise<T>, options?: Partial<RetryOptions>) => Promise<T> {\n const defaults: RetryOptions = {\n attempts: defaultOptions.attempts ?? 3,\n backoff: defaultOptions.backoff ?? \"exponential\",\n initialDelay: defaultOptions.initialDelay ?? 100,\n maxDelay: defaultOptions.maxDelay ?? 10_000,\n jitter: defaultOptions.jitter ?? 0.1,\n };\n\n if (defaultOptions.shouldRetry) {\n defaults.shouldRetry = defaultOptions.shouldRetry;\n }\n if (defaultOptions.onRetry) {\n defaults.onRetry = defaultOptions.onRetry;\n }\n\n return async <T>(\n fn: () => Promise<T>,\n options?: Partial<RetryOptions>\n ): Promise<T> => {\n return executeWithRetry(fn, { ...defaults, ...options });\n };\n}\n","/**\n * @parsrun/service - Timeout\n * Timeout wrapper for async operations\n */\n\n// ============================================================================\n// TIMEOUT\n// ============================================================================\n\n/**\n * Timeout error\n */\nexport class TimeoutExceededError extends Error {\n readonly timeout: number;\n\n constructor(timeout: number) {\n super(`Operation timed out after ${timeout}ms`);\n this.name = \"TimeoutExceededError\";\n this.timeout = timeout;\n }\n}\n\n/**\n * Wrap a function with timeout\n */\nexport function withTimeout<T>(\n fn: () => Promise<T>,\n timeoutMs: number,\n onTimeout?: () => void | never\n): () => Promise<T> {\n return async (): Promise<T> => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n if (onTimeout) {\n try {\n onTimeout();\n } catch (error) {\n reject(error);\n return;\n }\n }\n reject(new TimeoutExceededError(timeoutMs));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([fn(), timeoutPromise]);\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n }\n };\n}\n\n/**\n * Execute a function with timeout\n */\nexport async function executeWithTimeout<T>(\n fn: () => Promise<T>,\n timeoutMs: number,\n onTimeout?: () => void | never\n): Promise<T> {\n return withTimeout(fn, timeoutMs, onTimeout)();\n}\n\n/**\n * Create a timeout wrapper with preset duration\n */\nexport function createTimeoutWrapper(\n defaultTimeoutMs: number\n): <T>(fn: () => Promise<T>, timeoutMs?: number) => Promise<T> {\n return async <T>(fn: () => Promise<T>, timeoutMs?: number): Promise<T> => {\n return executeWithTimeout(fn, timeoutMs ?? defaultTimeoutMs);\n };\n}\n\n/**\n * Race multiple promises with a timeout\n */\nexport async function raceWithTimeout<T>(\n promises: Promise<T>[],\n timeoutMs: number\n): Promise<T> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new TimeoutExceededError(timeoutMs));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([...promises, timeoutPromise]);\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n }\n}\n\n/**\n * Execute with deadline (absolute time)\n */\nexport async function executeWithDeadline<T>(\n fn: () => Promise<T>,\n deadline: Date\n): Promise<T> {\n const now = Date.now();\n const deadlineMs = deadline.getTime();\n const timeoutMs = Math.max(0, deadlineMs - now);\n\n if (timeoutMs === 0) {\n throw new TimeoutExceededError(0);\n }\n\n return executeWithTimeout(fn, timeoutMs);\n}\n","/**\n * @parsrun/service - Embedded RPC Transport\n * Direct function call transport for monolithic/embedded mode\n */\n\nimport type { RpcRequest, RpcResponse, RpcTransport } from \"../../types.js\";\nimport type { RpcServer } from \"../server.js\";\n\n// ============================================================================\n// EMBEDDED TRANSPORT\n// ============================================================================\n\n/**\n * Embedded transport that calls handlers directly\n * Used when services are in the same process\n */\nexport class EmbeddedTransport implements RpcTransport {\n readonly name = \"embedded\";\n private readonly server: RpcServer;\n\n constructor(server: RpcServer) {\n this.server = server;\n }\n\n async call<TInput, TOutput>(request: RpcRequest<TInput>): Promise<RpcResponse<TOutput>> {\n // Direct call to server - no serialization needed\n return this.server.handle<TInput, TOutput>(request);\n }\n\n async close(): Promise<void> {\n // No cleanup needed for embedded transport\n }\n}\n\n/**\n * Create an embedded transport\n */\nexport function createEmbeddedTransport(server: RpcServer): EmbeddedTransport {\n return new EmbeddedTransport(server);\n}\n\n// ============================================================================\n// EMBEDDED TRANSPORT REGISTRY\n// ============================================================================\n\n/**\n * Registry for embedded services\n * Allows services to find each other in embedded mode\n */\nexport class EmbeddedRegistry {\n private static instance: EmbeddedRegistry | null = null;\n private readonly servers: Map<string, RpcServer> = new Map();\n\n private constructor() {}\n\n static getInstance(): EmbeddedRegistry {\n if (!EmbeddedRegistry.instance) {\n EmbeddedRegistry.instance = new EmbeddedRegistry();\n }\n return EmbeddedRegistry.instance;\n }\n\n /**\n * Register a service\n */\n register(name: string, server: RpcServer): void {\n if (this.servers.has(name)) {\n throw new Error(`Service already registered: ${name}`);\n }\n this.servers.set(name, server);\n }\n\n /**\n * Unregister a service\n */\n unregister(name: string): boolean {\n return this.servers.delete(name);\n }\n\n /**\n * Get a service by name\n */\n get(name: string): RpcServer | undefined {\n return this.servers.get(name);\n }\n\n /**\n * Check if a service is registered\n */\n has(name: string): boolean {\n return this.servers.has(name);\n }\n\n /**\n * Get all registered service names\n */\n getServiceNames(): string[] {\n return Array.from(this.servers.keys());\n }\n\n /**\n * Create a transport for a registered service\n */\n createTransport(name: string): EmbeddedTransport {\n const server = this.servers.get(name);\n if (!server) {\n throw new Error(`Service not found: ${name}`);\n }\n return new EmbeddedTransport(server);\n }\n\n /**\n * Clear all registered services\n */\n clear(): void {\n this.servers.clear();\n }\n\n /**\n * Reset the singleton instance (for testing)\n */\n static reset(): void {\n EmbeddedRegistry.instance = null;\n }\n}\n\n/**\n * Get the global embedded registry\n */\nexport function getEmbeddedRegistry(): EmbeddedRegistry {\n return EmbeddedRegistry.getInstance();\n}\n","/**\n * @parsrun/service - Serialization\n * JSON and MessagePack serializers\n */\n\n// ============================================================================\n// SERIALIZER INTERFACE\n// ============================================================================\n\n/**\n * Serializer interface for encoding/decoding data\n */\nexport interface Serializer {\n /** Encode data to string or buffer */\n encode(data: unknown): string | ArrayBuffer;\n /** Decode string or buffer to data */\n decode(raw: string | ArrayBuffer): unknown;\n /** Content type for HTTP headers */\n contentType: string;\n}\n\n// ============================================================================\n// JSON SERIALIZER\n// ============================================================================\n\n/**\n * JSON serializer (default)\n */\nexport const jsonSerializer: Serializer = {\n encode(data: unknown): string {\n return JSON.stringify(data);\n },\n\n decode(raw: string | ArrayBuffer): unknown {\n if (raw instanceof ArrayBuffer) {\n const decoder = new TextDecoder();\n return JSON.parse(decoder.decode(raw));\n }\n return JSON.parse(raw);\n },\n\n contentType: \"application/json\",\n};\n\n// ============================================================================\n// MESSAGEPACK SERIALIZER (Lightweight implementation)\n// ============================================================================\n\n/**\n * Lightweight MessagePack encoder\n * Supports: null, boolean, number, string, array, object\n */\nfunction msgpackEncode(value: unknown): Uint8Array {\n const parts: Uint8Array[] = [];\n\n function encode(val: unknown): void {\n if (val === null || val === undefined) {\n parts.push(new Uint8Array([0xc0])); // nil\n return;\n }\n\n if (typeof val === \"boolean\") {\n parts.push(new Uint8Array([val ? 0xc3 : 0xc2]));\n return;\n }\n\n if (typeof val === \"number\") {\n if (Number.isInteger(val)) {\n if (val >= 0 && val <= 127) {\n // positive fixint\n parts.push(new Uint8Array([val]));\n } else if (val < 0 && val >= -32) {\n // negative fixint\n parts.push(new Uint8Array([val & 0xff]));\n } else if (val >= 0 && val <= 0xff) {\n // uint8\n parts.push(new Uint8Array([0xcc, val]));\n } else if (val >= 0 && val <= 0xffff) {\n // uint16\n parts.push(new Uint8Array([0xcd, (val >> 8) & 0xff, val & 0xff]));\n } else if (val >= 0 && val <= 0xffffffff) {\n // uint32\n parts.push(\n new Uint8Array([\n 0xce,\n (val >> 24) & 0xff,\n (val >> 16) & 0xff,\n (val >> 8) & 0xff,\n val & 0xff,\n ])\n );\n } else if (val >= -128 && val <= 127) {\n // int8\n parts.push(new Uint8Array([0xd0, val & 0xff]));\n } else if (val >= -32768 && val <= 32767) {\n // int16\n parts.push(new Uint8Array([0xd1, (val >> 8) & 0xff, val & 0xff]));\n } else if (val >= -2147483648 && val <= 2147483647) {\n // int32\n parts.push(\n new Uint8Array([\n 0xd2,\n (val >> 24) & 0xff,\n (val >> 16) & 0xff,\n (val >> 8) & 0xff,\n val & 0xff,\n ])\n );\n } else {\n // Fall back to float64 for large integers\n const buffer = new ArrayBuffer(9);\n const view = new DataView(buffer);\n view.setUint8(0, 0xcb);\n view.setFloat64(1, val, false);\n parts.push(new Uint8Array(buffer));\n }\n } else {\n // float64\n const buffer = new ArrayBuffer(9);\n const view = new DataView(buffer);\n view.setUint8(0, 0xcb);\n view.setFloat64(1, val, false);\n parts.push(new Uint8Array(buffer));\n }\n return;\n }\n\n if (typeof val === \"string\") {\n const encoded = new TextEncoder().encode(val);\n const len = encoded.length;\n\n if (len <= 31) {\n // fixstr\n parts.push(new Uint8Array([0xa0 | len]));\n } else if (len <= 0xff) {\n // str8\n parts.push(new Uint8Array([0xd9, len]));\n } else if (len <= 0xffff) {\n // str16\n parts.push(new Uint8Array([0xda, (len >> 8) & 0xff, len & 0xff]));\n } else {\n // str32\n parts.push(\n new Uint8Array([\n 0xdb,\n (len >> 24) & 0xff,\n (len >> 16) & 0xff,\n (len >> 8) & 0xff,\n len & 0xff,\n ])\n );\n }\n parts.push(encoded);\n return;\n }\n\n if (Array.isArray(val)) {\n const len = val.length;\n\n if (len <= 15) {\n // fixarray\n parts.push(new Uint8Array([0x90 | len]));\n } else if (len <= 0xffff) {\n // array16\n parts.push(new Uint8Array([0xdc, (len >> 8) & 0xff, len & 0xff]));\n } else {\n // array32\n parts.push(\n new Uint8Array([\n 0xdd,\n (len >> 24) & 0xff,\n (len >> 16) & 0xff,\n (len >> 8) & 0xff,\n len & 0xff,\n ])\n );\n }\n\n for (const item of val) {\n encode(item);\n }\n return;\n }\n\n if (typeof val === \"object\") {\n const keys = Object.keys(val as object);\n const len = keys.length;\n\n if (len <= 15) {\n // fixmap\n parts.push(new Uint8Array([0x80 | len]));\n } else if (len <= 0xffff) {\n // map16\n parts.push(new Uint8Array([0xde, (len >> 8) & 0xff, len & 0xff]));\n } else {\n // map32\n parts.push(\n new Uint8Array([\n 0xdf,\n (len >> 24) & 0xff,\n (len >> 16) & 0xff,\n (len >> 8) & 0xff,\n len & 0xff,\n ])\n );\n }\n\n for (const key of keys) {\n encode(key);\n encode((val as Record<string, unknown>)[key]);\n }\n return;\n }\n\n // Unsupported type - encode as null\n parts.push(new Uint8Array([0xc0]));\n }\n\n encode(value);\n\n // Merge all parts\n const totalLength = parts.reduce((sum, p) => sum + p.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n\n return result;\n}\n\n/**\n * Lightweight MessagePack decoder\n */\nfunction msgpackDecode(buffer: Uint8Array): unknown {\n let offset = 0;\n\n function decode(): unknown {\n if (offset >= buffer.length) {\n throw new Error(\"Unexpected end of buffer\");\n }\n\n const byte = buffer[offset++]!;\n\n // Positive fixint (0x00 - 0x7f)\n if (byte <= 0x7f) {\n return byte;\n }\n\n // Negative fixint (0xe0 - 0xff)\n if (byte >= 0xe0) {\n return byte - 256;\n }\n\n // Fixmap (0x80 - 0x8f)\n if (byte >= 0x80 && byte <= 0x8f) {\n const len = byte - 0x80;\n const result: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n const key = decode() as string;\n result[key] = decode();\n }\n return result;\n }\n\n // Fixarray (0x90 - 0x9f)\n if (byte >= 0x90 && byte <= 0x9f) {\n const len = byte - 0x90;\n const result: unknown[] = [];\n for (let i = 0; i < len; i++) {\n result.push(decode());\n }\n return result;\n }\n\n // Fixstr (0xa0 - 0xbf)\n if (byte >= 0xa0 && byte <= 0xbf) {\n const len = byte - 0xa0;\n const str = new TextDecoder().decode(buffer.subarray(offset, offset + len));\n offset += len;\n return str;\n }\n\n switch (byte) {\n case 0xc0: // nil\n return null;\n case 0xc2: // false\n return false;\n case 0xc3: // true\n return true;\n\n case 0xcc: // uint8\n return buffer[offset++];\n case 0xcd: // uint16\n return (buffer[offset++]! << 8) | buffer[offset++]!;\n case 0xce: // uint32\n return (\n ((buffer[offset++]! << 24) >>> 0) +\n (buffer[offset++]! << 16) +\n (buffer[offset++]! << 8) +\n buffer[offset++]!\n );\n\n case 0xd0: // int8\n {\n const val = buffer[offset++]!;\n return val > 127 ? val - 256 : val;\n }\n case 0xd1: // int16\n {\n const val = (buffer[offset++]! << 8) | buffer[offset++]!;\n return val > 32767 ? val - 65536 : val;\n }\n case 0xd2: // int32\n {\n const val =\n (buffer[offset++]! << 24) |\n (buffer[offset++]! << 16) |\n (buffer[offset++]! << 8) |\n buffer[offset++]!;\n return val;\n }\n\n case 0xcb: // float64\n {\n const view = new DataView(buffer.buffer, buffer.byteOffset + offset, 8);\n offset += 8;\n return view.getFloat64(0, false);\n }\n\n case 0xd9: // str8\n {\n const len = buffer[offset++]!;\n const str = new TextDecoder().decode(buffer.subarray(offset, offset + len));\n offset += len;\n return str;\n }\n case 0xda: // str16\n {\n const len = (buffer[offset++]! << 8) | buffer[offset++]!;\n const str = new TextDecoder().decode(buffer.subarray(offset, offset + len));\n offset += len;\n return str;\n }\n case 0xdb: // str32\n {\n const len =\n (buffer[offset++]! << 24) |\n (buffer[offset++]! << 16) |\n (buffer[offset++]! << 8) |\n buffer[offset++]!;\n const str = new TextDecoder().decode(buffer.subarray(offset, offset + len));\n offset += len;\n return str;\n }\n\n case 0xdc: // array16\n {\n const len = (buffer[offset++]! << 8) | buffer[offset++]!;\n const result: unknown[] = [];\n for (let i = 0; i < len; i++) {\n result.push(decode());\n }\n return result;\n }\n case 0xdd: // array32\n {\n const len =\n (buffer[offset++]! << 24) |\n (buffer[offset++]! << 16) |\n (buffer[offset++]! << 8) |\n buffer[offset++]!;\n const result: unknown[] = [];\n for (let i = 0; i < len; i++) {\n result.push(decode());\n }\n return result;\n }\n\n case 0xde: // map16\n {\n const len = (buffer[offset++]! << 8) | buffer[offset++]!;\n const result: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n const key = decode() as string;\n result[key] = decode();\n }\n return result;\n }\n case 0xdf: // map32\n {\n const len =\n (buffer[offset++]! << 24) |\n (buffer[offset++]! << 16) |\n (buffer[offset++]! << 8) |\n buffer[offset++]!;\n const result: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n const key = decode() as string;\n result[key] = decode();\n }\n return result;\n }\n\n default:\n throw new Error(`Unknown MessagePack type: 0x${byte.toString(16)}`);\n }\n }\n\n return decode();\n}\n\n/**\n * MessagePack serializer\n */\nexport const msgpackSerializer: Serializer = {\n encode(data: unknown): ArrayBuffer {\n const encoded = msgpackEncode(data);\n // Create a new ArrayBuffer with the exact bytes from the Uint8Array\n const buffer = new ArrayBuffer(encoded.byteLength);\n new Uint8Array(buffer).set(encoded);\n return buffer;\n },\n\n decode(raw: string | ArrayBuffer): unknown {\n if (typeof raw === \"string\") {\n // If string is passed, assume it's base64 encoded\n const binary = atob(raw);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return msgpackDecode(bytes);\n }\n return msgpackDecode(new Uint8Array(raw));\n },\n\n contentType: \"application/msgpack\",\n};\n\n// ============================================================================\n// SERIALIZER FACTORY\n// ============================================================================\n\n/**\n * Get serializer by format name\n */\nexport function getSerializer(format: \"json\" | \"msgpack\"): Serializer {\n switch (format) {\n case \"json\":\n return jsonSerializer;\n case \"msgpack\":\n return msgpackSerializer;\n default:\n return jsonSerializer;\n }\n}\n\n/**\n * Create a custom serializer\n */\nexport function createSerializer(options: {\n encode: (data: unknown) => string | ArrayBuffer;\n decode: (raw: string | ArrayBuffer) => unknown;\n contentType: string;\n}): Serializer {\n return options;\n}\n","/**\n * @parsrun/service - HTTP RPC Transport\n * HTTP-based transport for distributed services\n */\n\nimport type { RpcRequest, RpcResponse, RpcTransport } from \"../../types.js\";\nimport { type Serializer, jsonSerializer } from \"../../serialization/index.js\";\nimport { TransportError, SerializationError } from \"../errors.js\";\n\n// ============================================================================\n// HTTP TRANSPORT\n// ============================================================================\n\nexport interface HttpTransportOptions {\n /** Base URL of the service */\n baseUrl: string;\n /** Custom serializer (default: JSON) */\n serializer?: Serializer;\n /** Custom headers */\n headers?: Record<string, string>;\n /** Fetch function (for testing or custom implementations) */\n fetch?: typeof globalThis.fetch;\n /** Request timeout in ms */\n timeout?: number;\n}\n\n/**\n * HTTP transport for RPC calls\n */\nexport class HttpTransport implements RpcTransport {\n readonly name = \"http\";\n private readonly baseUrl: string;\n private readonly serializer: Serializer;\n private readonly headers: Record<string, string>;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly timeout: number;\n\n constructor(options: HttpTransportOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\"); // Remove trailing slash\n this.serializer = options.serializer ?? jsonSerializer;\n this.headers = options.headers ?? {};\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.timeout = options.timeout ?? 30_000;\n }\n\n async call<TInput, TOutput>(request: RpcRequest<TInput>): Promise<RpcResponse<TOutput>> {\n const url = `${this.baseUrl}/rpc`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n // Serialize request\n let body: string | ArrayBuffer;\n try {\n body = this.serializer.encode(request);\n } catch (error) {\n throw new SerializationError(\n \"Failed to serialize request\",\n error instanceof Error ? error : undefined\n );\n }\n\n // Make HTTP request\n const response = await this.fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": this.serializer.contentType,\n Accept: this.serializer.contentType,\n \"X-Request-ID\": request.id,\n \"X-Service\": request.service,\n \"X-Method\": request.method,\n \"X-Method-Type\": request.type,\n ...(request.version ? { \"X-Service-Version\": request.version } : {}),\n ...(request.traceContext\n ? {\n traceparent: formatTraceparent(request.traceContext),\n ...(request.traceContext.traceState\n ? { tracestate: request.traceContext.traceState }\n : {}),\n }\n : {}),\n ...this.headers,\n },\n body: body instanceof ArrayBuffer ? body : body,\n signal: controller.signal,\n });\n\n // Parse response\n let responseData: RpcResponse<TOutput>;\n try {\n const contentType = response.headers.get(\"Content-Type\") ?? \"\";\n if (contentType.includes(\"msgpack\")) {\n const buffer = await response.arrayBuffer();\n responseData = this.serializer.decode(buffer) as RpcResponse<TOutput>;\n } else {\n const text = await response.text();\n responseData = this.serializer.decode(text) as RpcResponse<TOutput>;\n }\n } catch (error) {\n throw new SerializationError(\n \"Failed to deserialize response\",\n error instanceof Error ? error : undefined\n );\n }\n\n return responseData;\n } catch (error) {\n if (error instanceof SerializationError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new TransportError(`Request timeout after ${this.timeout}ms`);\n }\n throw new TransportError(`HTTP request failed: ${error.message}`, error);\n }\n\n throw new TransportError(\"Unknown transport error\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n async close(): Promise<void> {\n // No persistent connection to close\n }\n}\n\n/**\n * Create an HTTP transport\n */\nexport function createHttpTransport(options: HttpTransportOptions): HttpTransport {\n return new HttpTransport(options);\n}\n\n// ============================================================================\n// TRACE CONTEXT HELPERS\n// ============================================================================\n\nimport type { TraceContext } from \"../../types.js\";\n\n/**\n * Format trace context as W3C traceparent header\n */\nfunction formatTraceparent(ctx: TraceContext): string {\n const flags = ctx.traceFlags.toString(16).padStart(2, \"0\");\n return `00-${ctx.traceId}-${ctx.spanId}-${flags}`;\n}\n\n/**\n * Parse W3C traceparent header\n */\nexport function parseTraceparent(header: string): TraceContext | null {\n const parts = header.split(\"-\");\n if (parts.length !== 4) {\n return null;\n }\n\n const [version, traceId, spanId, flags] = parts;\n if (version !== \"00\" || !traceId || !spanId || !flags) {\n return null;\n }\n\n if (traceId.length !== 32 || spanId.length !== 16 || flags.length !== 2) {\n return null;\n }\n\n return {\n traceId,\n spanId,\n traceFlags: parseInt(flags, 16),\n };\n}\n\n// ============================================================================\n// HTTP SERVER ADAPTER\n// ============================================================================\n\nimport type { RpcServer } from \"../server.js\";\n\n/**\n * Create HTTP request handler for RPC server\n * Can be used with Hono, Express, or any HTTP framework\n */\nexport function createHttpHandler(server: RpcServer) {\n return async (request: Request): Promise<Response> => {\n try {\n // Parse request body\n const contentType = request.headers.get(\"Content-Type\") ?? \"application/json\";\n let body: unknown;\n\n if (contentType.includes(\"msgpack\")) {\n const buffer = await request.arrayBuffer();\n // For msgpack, we'd need to decode - using JSON for now\n body = JSON.parse(new TextDecoder().decode(buffer));\n } else {\n body = await request.json();\n }\n\n const rpcRequest = body as RpcRequest;\n\n // Parse trace context\n const traceparent = request.headers.get(\"traceparent\");\n if (traceparent) {\n const traceContext = parseTraceparent(traceparent);\n if (traceContext) {\n const tracestate = request.headers.get(\"tracestate\");\n if (tracestate) {\n traceContext.traceState = tracestate;\n }\n rpcRequest.traceContext = traceContext;\n }\n }\n\n // Handle request\n const response = await server.handle(rpcRequest);\n\n // Return response\n return new Response(JSON.stringify(response), {\n status: response.success ? 200 : getHttpStatus(response.error?.code),\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Request-ID\": rpcRequest.id,\n },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return new Response(\n JSON.stringify({\n success: false,\n error: {\n code: \"INTERNAL_ERROR\",\n message,\n },\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\n }\n };\n}\n\n/**\n * Map error code to HTTP status\n */\nfunction getHttpStatus(code?: string): number {\n switch (code) {\n case \"METHOD_NOT_FOUND\":\n case \"SERVICE_NOT_FOUND\":\n return 404;\n case \"VERSION_MISMATCH\":\n case \"VALIDATION_ERROR\":\n case \"SERIALIZATION_ERROR\":\n return 400;\n case \"UNAUTHORIZED\":\n return 401;\n case \"FORBIDDEN\":\n return 403;\n case \"TIMEOUT\":\n return 504;\n case \"CIRCUIT_OPEN\":\n case \"BULKHEAD_REJECTED\":\n return 503;\n default:\n return 500;\n }\n}\n","/**\n * @parsrun/service - Memory Event Transport\n * In-memory event transport for embedded mode and testing\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type {\n ParsEvent,\n EventTransport,\n EventHandler,\n EventHandlerOptions,\n Unsubscribe,\n} from \"../../types.js\";\nimport { EventHandlerRegistry, type EventHandlerRegistryOptions } from \"../handler.js\";\n\n// ============================================================================\n// MEMORY EVENT TRANSPORT\n// ============================================================================\n\nexport interface MemoryEventTransportOptions {\n /** Logger */\n logger?: Logger;\n /** Process events synchronously (default: false) */\n sync?: boolean;\n /** Default handler options */\n defaultHandlerOptions?: EventHandlerOptions;\n}\n\n/**\n * In-memory event transport\n * Events are processed immediately without persistence\n */\nexport class MemoryEventTransport implements EventTransport {\n readonly name = \"memory\";\n private readonly registry: EventHandlerRegistry;\n private readonly logger: Logger;\n private readonly sync: boolean;\n private readonly pendingEvents: ParsEvent[] = [];\n private processing = false;\n\n constructor(options: MemoryEventTransportOptions = {}) {\n this.logger = options.logger ?? createLogger({ name: \"memory-transport\" });\n this.sync = options.sync ?? false;\n\n const registryOptions: EventHandlerRegistryOptions = {\n logger: this.logger,\n };\n if (options.defaultHandlerOptions) {\n registryOptions.defaultOptions = options.defaultHandlerOptions;\n }\n this.registry = new EventHandlerRegistry(registryOptions);\n }\n\n /**\n * Emit an event\n */\n async emit<T>(event: ParsEvent<T>): Promise<void> {\n this.logger.debug(`Event emitted: ${event.type}`, {\n eventId: event.id,\n tenantId: event.parstenantid,\n });\n\n if (this.sync) {\n // Process synchronously\n await this.registry.handle(event);\n } else {\n // Queue for async processing\n this.pendingEvents.push(event);\n this.processQueue();\n }\n }\n\n /**\n * Subscribe to events\n */\n subscribe(\n eventType: string,\n handler: EventHandler,\n options?: EventHandlerOptions\n ): Unsubscribe {\n return this.registry.register(eventType, handler, options);\n }\n\n /**\n * Process pending events asynchronously\n */\n private async processQueue(): Promise<void> {\n if (this.processing) return;\n this.processing = true;\n\n try {\n while (this.pendingEvents.length > 0) {\n const event = this.pendingEvents.shift();\n if (event) {\n await this.registry.handle(event);\n }\n }\n } finally {\n this.processing = false;\n }\n }\n\n /**\n * Wait for all pending events to be processed\n */\n async flush(): Promise<void> {\n while (this.pendingEvents.length > 0 || this.processing) {\n await new Promise((resolve) => setTimeout(resolve, 10));\n }\n }\n\n /**\n * Get pending event count\n */\n get pendingCount(): number {\n return this.pendingEvents.length;\n }\n\n /**\n * Get registered patterns\n */\n getPatterns(): string[] {\n return this.registry.getPatterns();\n }\n\n /**\n * Clear all subscriptions\n */\n clear(): void {\n this.registry.clear();\n this.pendingEvents.length = 0;\n }\n\n /**\n * Close the transport\n */\n async close(): Promise<void> {\n await this.flush();\n this.clear();\n }\n}\n\n/**\n * Create a memory event transport\n */\nexport function createMemoryEventTransport(\n options?: MemoryEventTransportOptions\n): MemoryEventTransport {\n return new MemoryEventTransport(options);\n}\n\n// ============================================================================\n// GLOBAL EVENT BUS (for embedded multi-service)\n// ============================================================================\n\n/**\n * Global event bus for communication between embedded services\n */\nexport class GlobalEventBus {\n private static instance: GlobalEventBus | null = null;\n private readonly transports: Map<string, MemoryEventTransport> = new Map();\n private readonly logger: Logger;\n\n private constructor() {\n this.logger = createLogger({ name: \"global-event-bus\" });\n }\n\n static getInstance(): GlobalEventBus {\n if (!GlobalEventBus.instance) {\n GlobalEventBus.instance = new GlobalEventBus();\n }\n return GlobalEventBus.instance;\n }\n\n /**\n * Register a service's event transport\n */\n register(serviceName: string, transport: MemoryEventTransport): void {\n if (this.transports.has(serviceName)) {\n throw new Error(`Service already registered: ${serviceName}`);\n }\n this.transports.set(serviceName, transport);\n this.logger.debug(`Service registered: ${serviceName}`);\n }\n\n /**\n * Unregister a service\n */\n unregister(serviceName: string): boolean {\n const deleted = this.transports.delete(serviceName);\n if (deleted) {\n this.logger.debug(`Service unregistered: ${serviceName}`);\n }\n return deleted;\n }\n\n /**\n * Broadcast an event to all services (except source)\n */\n async broadcast(event: ParsEvent, excludeSource?: string): Promise<void> {\n const promises: Promise<void>[] = [];\n\n for (const [name, transport] of this.transports) {\n if (name !== excludeSource) {\n promises.push(transport.emit(event));\n }\n }\n\n await Promise.allSettled(promises);\n }\n\n /**\n * Send an event to a specific service\n */\n async send(serviceName: string, event: ParsEvent): Promise<void> {\n const transport = this.transports.get(serviceName);\n if (!transport) {\n this.logger.warn(`Target service not found: ${serviceName}`, {\n eventId: event.id,\n });\n return;\n }\n\n await transport.emit(event);\n }\n\n /**\n * Get all registered service names\n */\n getServices(): string[] {\n return Array.from(this.transports.keys());\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.transports.clear();\n }\n\n /**\n * Reset singleton (for testing)\n */\n static reset(): void {\n GlobalEventBus.instance = null;\n }\n}\n\n/**\n * Get the global event bus\n */\nexport function getGlobalEventBus(): GlobalEventBus {\n return GlobalEventBus.getInstance();\n}\n","/**\n * @parsrun/service - Event Handler\n * Event handler registration and execution\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type {\n ParsEvent,\n EventHandler,\n EventHandlerContext,\n EventHandlerOptions,\n Unsubscribe,\n} from \"../types.js\";\nimport { matchEventType } from \"./format.js\";\nimport type { DeadLetterQueue } from \"./dead-letter.js\";\n\n// ============================================================================\n// EVENT HANDLER REGISTRY\n// ============================================================================\n\n/**\n * Resolved handler options with required fields\n */\nexport interface ResolvedHandlerOptions {\n retries: number;\n backoff: \"linear\" | \"exponential\";\n maxDelay: number;\n onExhausted: \"alert\" | \"log\" | \"discard\";\n deadLetter?: string;\n}\n\nexport interface HandlerRegistration {\n /** Event type pattern (supports wildcards) */\n pattern: string;\n /** Handler function */\n handler: EventHandler;\n /** Handler options */\n options: ResolvedHandlerOptions;\n}\n\nexport interface EventHandlerRegistryOptions {\n /** Logger */\n logger?: Logger;\n /** Dead letter queue */\n deadLetterQueue?: DeadLetterQueue;\n /** Default handler options */\n defaultOptions?: Partial<EventHandlerOptions>;\n}\n\n/**\n * Registry for event handlers\n */\nexport class EventHandlerRegistry {\n private readonly handlers: Map<string, HandlerRegistration[]> = new Map();\n private readonly logger: Logger;\n private readonly deadLetterQueue?: DeadLetterQueue;\n private readonly defaultOptions: ResolvedHandlerOptions;\n\n constructor(options: EventHandlerRegistryOptions = {}) {\n this.logger = options.logger ?? createLogger({ name: \"event-handler\" });\n if (options.deadLetterQueue) {\n this.deadLetterQueue = options.deadLetterQueue;\n }\n const defaultOpts: ResolvedHandlerOptions = {\n retries: options.defaultOptions?.retries ?? 3,\n backoff: options.defaultOptions?.backoff ?? \"exponential\",\n maxDelay: options.defaultOptions?.maxDelay ?? 30_000,\n onExhausted: options.defaultOptions?.onExhausted ?? \"log\",\n };\n if (options.defaultOptions?.deadLetter) {\n defaultOpts.deadLetter = options.defaultOptions.deadLetter;\n }\n this.defaultOptions = defaultOpts;\n }\n\n /**\n * Register an event handler\n */\n register(\n pattern: string,\n handler: EventHandler,\n options?: EventHandlerOptions\n ): Unsubscribe {\n const registration: HandlerRegistration = {\n pattern,\n handler,\n options: {\n ...this.defaultOptions,\n ...options,\n },\n };\n\n const handlers = this.handlers.get(pattern) ?? [];\n handlers.push(registration);\n this.handlers.set(pattern, handlers);\n\n this.logger.debug(`Handler registered for pattern: ${pattern}`);\n\n // Return unsubscribe function\n return () => {\n const currentHandlers = this.handlers.get(pattern);\n if (currentHandlers) {\n const index = currentHandlers.indexOf(registration);\n if (index !== -1) {\n currentHandlers.splice(index, 1);\n if (currentHandlers.length === 0) {\n this.handlers.delete(pattern);\n }\n this.logger.debug(`Handler unregistered for pattern: ${pattern}`);\n }\n }\n };\n }\n\n /**\n * Handle an event\n */\n async handle(event: ParsEvent): Promise<void> {\n const matchingHandlers = this.getMatchingHandlers(event.type);\n\n if (matchingHandlers.length === 0) {\n this.logger.debug(`No handlers for event type: ${event.type}`, {\n eventId: event.id,\n });\n return;\n }\n\n this.logger.debug(`Handling event: ${event.type}`, {\n eventId: event.id,\n handlerCount: matchingHandlers.length,\n });\n\n // Execute handlers in parallel\n const results = await Promise.allSettled(\n matchingHandlers.map((reg) => this.executeHandler(event, reg))\n );\n\n // Log failures\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n if (result?.status === \"rejected\") {\n this.logger.error(\n `Handler failed for ${event.type}`,\n result.reason as Error,\n { eventId: event.id, pattern: matchingHandlers[i]?.pattern }\n );\n }\n }\n }\n\n /**\n * Execute a single handler with retry logic\n */\n private async executeHandler(\n event: ParsEvent,\n registration: HandlerRegistration\n ): Promise<void> {\n const { handler, options } = registration;\n const maxAttempts = options.retries + 1;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const context: EventHandlerContext = {\n logger: this.logger.child({\n eventId: event.id,\n pattern: registration.pattern,\n attempt,\n }),\n attempt,\n maxAttempts,\n isRetry: attempt > 1,\n };\n\n // Add trace context if available\n if (event.parstracecontext) {\n const traceCtx = parseTraceContext(event.parstracecontext);\n if (traceCtx) {\n context.traceContext = traceCtx;\n }\n }\n\n await handler(event, context);\n return; // Success\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < maxAttempts) {\n const delay = this.calculateBackoff(attempt, options);\n this.logger.warn(\n `Handler failed, retrying in ${delay}ms`,\n { eventId: event.id, attempt, maxAttempts }\n );\n await sleep(delay);\n }\n }\n }\n\n // All retries exhausted\n await this.handleExhausted(event, registration, lastError!);\n }\n\n /**\n * Calculate backoff delay\n */\n private calculateBackoff(\n attempt: number,\n options: ResolvedHandlerOptions\n ): number {\n const baseDelay = 100;\n\n if (options.backoff === \"exponential\") {\n return Math.min(baseDelay * Math.pow(2, attempt - 1), options.maxDelay);\n }\n\n // Linear\n return Math.min(baseDelay * attempt, options.maxDelay);\n }\n\n /**\n * Handle exhausted retries\n */\n private async handleExhausted(\n event: ParsEvent,\n registration: HandlerRegistration,\n error: Error\n ): Promise<void> {\n const { options } = registration;\n\n // Send to dead letter queue\n if (options.deadLetter && this.deadLetterQueue) {\n await this.deadLetterQueue.add({\n event,\n error: error.message,\n pattern: registration.pattern,\n attempts: options.retries + 1,\n });\n }\n\n // Handle based on onExhausted option\n switch (options.onExhausted) {\n case \"alert\":\n this.logger.error(\n `[ALERT] Event handler exhausted all retries`,\n error,\n {\n eventId: event.id,\n eventType: event.type,\n pattern: registration.pattern,\n }\n );\n break;\n case \"discard\":\n this.logger.debug(`Event discarded after exhausted retries`, {\n eventId: event.id,\n });\n break;\n case \"log\":\n default:\n this.logger.warn(`Event handler exhausted all retries`, {\n eventId: event.id,\n error: error.message,\n });\n }\n }\n\n /**\n * Get handlers matching an event type\n */\n private getMatchingHandlers(eventType: string): HandlerRegistration[] {\n const matching: HandlerRegistration[] = [];\n\n for (const [pattern, handlers] of this.handlers) {\n if (matchEventType(eventType, pattern)) {\n matching.push(...handlers);\n }\n }\n\n return matching;\n }\n\n /**\n * Get all registered patterns\n */\n getPatterns(): string[] {\n return Array.from(this.handlers.keys());\n }\n\n /**\n * Check if a pattern has handlers\n */\n hasHandlers(pattern: string): boolean {\n return this.handlers.has(pattern);\n }\n\n /**\n * Clear all handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/**\n * Create an event handler registry\n */\nexport function createEventHandlerRegistry(\n options?: EventHandlerRegistryOptions\n): EventHandlerRegistry {\n return new EventHandlerRegistry(options);\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseTraceContext(traceparent: string): {\n traceId: string;\n spanId: string;\n traceFlags: number;\n} | undefined {\n const parts = traceparent.split(\"-\");\n if (parts.length !== 4) return undefined;\n\n const [, traceId, spanId, flags] = parts;\n if (!traceId || !spanId || !flags) return undefined;\n\n return {\n traceId,\n spanId,\n traceFlags: parseInt(flags, 16),\n };\n}\n","/**\n * @parsrun/service - Event Format\n * CloudEvents and compact event format utilities\n */\n\nimport { generateId } from \"@parsrun/core\";\nimport type { ParsEvent, CompactEvent, TraceContext } from \"../types.js\";\n\n// ============================================================================\n// EVENT CREATION\n// ============================================================================\n\nexport interface CreateEventOptions<T = unknown> {\n /** Event type (e.g., \"subscription.created\") */\n type: string;\n /** Source service */\n source: string;\n /** Event data */\n data: T;\n /** Optional event ID (auto-generated if not provided) */\n id?: string;\n /** Optional subject */\n subject?: string;\n /** Tenant ID */\n tenantId?: string;\n /** Request ID for correlation */\n requestId?: string;\n /** Trace context */\n traceContext?: TraceContext;\n /** Delivery guarantee */\n delivery?: \"at-most-once\" | \"at-least-once\";\n}\n\n/**\n * Create a CloudEvents-compatible event\n */\nexport function createEvent<T = unknown>(options: CreateEventOptions<T>): ParsEvent<T> {\n const event: ParsEvent<T> = {\n specversion: \"1.0\",\n type: options.type,\n source: options.source,\n id: options.id ?? generateId(),\n time: new Date().toISOString(),\n datacontenttype: \"application/json\",\n data: options.data,\n };\n\n if (options.subject) event.subject = options.subject;\n if (options.tenantId) event.parstenantid = options.tenantId;\n if (options.requestId) event.parsrequestid = options.requestId;\n if (options.traceContext) event.parstracecontext = formatTraceContext(options.traceContext);\n if (options.delivery) event.parsdelivery = options.delivery;\n\n return event;\n}\n\n// ============================================================================\n// FORMAT CONVERSION\n// ============================================================================\n\n/**\n * Convert to full CloudEvents format\n */\nexport function toCloudEvent<T>(event: ParsEvent<T>): ParsEvent<T> {\n return { ...event };\n}\n\n/**\n * Convert to compact internal format\n */\nexport function toCompactEvent<T>(event: ParsEvent<T>): CompactEvent<T> {\n const compact: CompactEvent<T> = {\n e: event.type,\n s: event.source,\n i: event.id,\n t: new Date(event.time).getTime(),\n d: event.data,\n };\n\n if (event.parstracecontext) compact.ctx = event.parstracecontext;\n if (event.parstenantid) compact.tid = event.parstenantid;\n\n return compact;\n}\n\n/**\n * Convert from compact format to CloudEvents\n */\nexport function fromCompactEvent<T>(compact: CompactEvent<T>, source?: string): ParsEvent<T> {\n const event: ParsEvent<T> = {\n specversion: \"1.0\",\n type: compact.e,\n source: source ?? compact.s,\n id: compact.i,\n time: new Date(compact.t).toISOString(),\n datacontenttype: \"application/json\",\n data: compact.d,\n };\n\n if (compact.ctx) event.parstracecontext = compact.ctx;\n if (compact.tid) event.parstenantid = compact.tid;\n\n return event;\n}\n\n// ============================================================================\n// EVENT TYPE UTILITIES\n// ============================================================================\n\n/**\n * Format full event type with source prefix\n *\n * @example\n * formatEventType('payments', 'subscription.created')\n * // Returns: 'com.pars.payments.subscription.created'\n */\nexport function formatEventType(source: string, type: string): string {\n return `com.pars.${source}.${type}`;\n}\n\n/**\n * Parse event type to extract source and type\n *\n * @example\n * parseEventType('com.pars.payments.subscription.created')\n * // Returns: { source: 'payments', type: 'subscription.created' }\n */\nexport function parseEventType(fullType: string): { source: string; type: string } | null {\n const prefix = \"com.pars.\";\n if (!fullType.startsWith(prefix)) {\n // Try to parse as simple type (source.type)\n const parts = fullType.split(\".\");\n if (parts.length >= 2) {\n const [source, ...rest] = parts;\n return { source: source!, type: rest.join(\".\") };\n }\n return null;\n }\n\n const withoutPrefix = fullType.slice(prefix.length);\n const dotIndex = withoutPrefix.indexOf(\".\");\n if (dotIndex === -1) {\n return null;\n }\n\n return {\n source: withoutPrefix.slice(0, dotIndex),\n type: withoutPrefix.slice(dotIndex + 1),\n };\n}\n\n/**\n * Check if event type matches a pattern\n * Supports wildcards: * matches one segment, ** matches multiple segments\n *\n * @example\n * matchEventType('subscription.created', 'subscription.*') // true\n * matchEventType('payment.invoice.paid', 'payment.**') // true\n * matchEventType('subscription.created', 'payment.*') // false\n */\nexport function matchEventType(type: string, pattern: string): boolean {\n if (pattern === \"*\" || pattern === \"**\") {\n return true;\n }\n\n const typeParts = type.split(\".\");\n const patternParts = pattern.split(\".\");\n\n let ti = 0;\n let pi = 0;\n\n while (ti < typeParts.length && pi < patternParts.length) {\n const pp = patternParts[pi];\n\n if (pp === \"**\") {\n // ** matches rest of type\n if (pi === patternParts.length - 1) {\n return true;\n }\n // Try to match remaining pattern\n for (let i = ti; i <= typeParts.length; i++) {\n const remaining = typeParts.slice(i).join(\".\");\n const remainingPattern = patternParts.slice(pi + 1).join(\".\");\n if (matchEventType(remaining, remainingPattern)) {\n return true;\n }\n }\n return false;\n }\n\n if (pp === \"*\") {\n // * matches single segment\n ti++;\n pi++;\n continue;\n }\n\n if (pp !== typeParts[ti]) {\n return false;\n }\n\n ti++;\n pi++;\n }\n\n return ti === typeParts.length && pi === patternParts.length;\n}\n\n// ============================================================================\n// TRACE CONTEXT HELPERS\n// ============================================================================\n\n/**\n * Format trace context to W3C traceparent string\n */\nfunction formatTraceContext(ctx: TraceContext): string {\n const flags = ctx.traceFlags.toString(16).padStart(2, \"0\");\n return `00-${ctx.traceId}-${ctx.spanId}-${flags}`;\n}\n\n/**\n * Parse W3C traceparent string to trace context\n */\nexport function parseTraceContext(traceparent: string): TraceContext | null {\n const parts = traceparent.split(\"-\");\n if (parts.length !== 4) {\n return null;\n }\n\n const [version, traceId, spanId, flags] = parts;\n if (version !== \"00\" || !traceId || !spanId || !flags) {\n return null;\n }\n\n return {\n traceId,\n spanId,\n traceFlags: parseInt(flags, 16),\n };\n}\n\n// ============================================================================\n// VALIDATION\n// ============================================================================\n\n/**\n * Validate CloudEvents structure\n */\nexport function validateEvent(event: unknown): event is ParsEvent {\n if (!event || typeof event !== \"object\") {\n return false;\n }\n\n const e = event as Record<string, unknown>;\n\n // Required fields\n if (e[\"specversion\"] !== \"1.0\") return false;\n if (typeof e[\"type\"] !== \"string\" || (e[\"type\"] as string).length === 0) return false;\n if (typeof e[\"source\"] !== \"string\" || (e[\"source\"] as string).length === 0) return false;\n if (typeof e[\"id\"] !== \"string\" || (e[\"id\"] as string).length === 0) return false;\n if (typeof e[\"time\"] !== \"string\") return false;\n\n return true;\n}\n\n/**\n * Validate compact event structure\n */\nexport function validateCompactEvent(event: unknown): event is CompactEvent {\n if (!event || typeof event !== \"object\") {\n return false;\n }\n\n const e = event as Record<string, unknown>;\n\n if (typeof e[\"e\"] !== \"string\" || (e[\"e\"] as string).length === 0) return false;\n if (typeof e[\"s\"] !== \"string\" || (e[\"s\"] as string).length === 0) return false;\n if (typeof e[\"i\"] !== \"string\" || (e[\"i\"] as string).length === 0) return false;\n if (typeof e[\"t\"] !== \"number\") return false;\n\n return true;\n}\n","/**\n * @parsrun/service - Tracer\n * High-level tracing API\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type { Span, TraceContext, SpanKind, SpanAttributeValue } from \"../types.js\";\nimport type { TracingConfig } from \"../types.js\";\nimport {\n TraceContextManager,\n shouldSample,\n type Sampler,\n} from \"./context.js\";\nimport { SpanManager, SpanAttributes } from \"./spans.js\";\nimport type { SpanExporter } from \"./exporters.js\";\nimport { ConsoleExporter } from \"./exporters.js\";\n\n// ============================================================================\n// TRACER\n// ============================================================================\n\nexport interface TracerOptions {\n /** Service name */\n serviceName: string;\n /** Service version */\n serviceVersion?: string;\n /** Tracing config */\n config?: TracingConfig;\n /** Span exporter */\n exporter?: SpanExporter;\n /** Logger */\n logger?: Logger;\n}\n\n/**\n * Main tracer class for distributed tracing\n */\nexport class Tracer {\n private readonly serviceName: string;\n private readonly serviceVersion: string;\n private readonly sampler: Sampler;\n private readonly exporter: SpanExporter;\n private readonly logger: Logger;\n private readonly contextManager: TraceContextManager;\n private readonly spanManager: SpanManager;\n private readonly enabled: boolean;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: TracerOptions) {\n this.serviceName = options.serviceName;\n this.serviceVersion = options.serviceVersion ?? \"1.0.0\";\n this.enabled = options.config?.enabled ?? true;\n this.sampler = options.config?.sampler ?? { ratio: 0.1 };\n this.exporter = options.exporter ?? new ConsoleExporter();\n this.logger = options.logger ?? createLogger({ name: `tracer:${options.serviceName}` });\n this.contextManager = new TraceContextManager();\n this.spanManager = new SpanManager();\n\n // Auto-flush spans periodically\n if (this.enabled) {\n this.flushTimer = setInterval(() => this.flush(), 5000);\n }\n }\n\n /**\n * Start a new span\n */\n startSpan(\n name: string,\n options?: {\n kind?: SpanKind;\n parent?: TraceContext;\n attributes?: Record<string, SpanAttributeValue>;\n }\n ): Span | null {\n if (!this.enabled) return null;\n\n // Get parent from options or current context\n const parent = options?.parent ?? this.contextManager.current();\n\n // Check sampling\n if (!parent && !shouldSample(this.sampler)) {\n return null;\n }\n\n const spanOptions: Parameters<typeof this.spanManager.startSpan>[0] = {\n name,\n kind: options?.kind ?? \"internal\",\n attributes: {\n [SpanAttributes.SERVICE_NAME]: this.serviceName,\n [SpanAttributes.SERVICE_VERSION]: this.serviceVersion,\n ...options?.attributes,\n },\n };\n\n if (parent) {\n spanOptions.parent = parent;\n }\n\n const span = this.spanManager.startSpan(spanOptions);\n\n return span;\n }\n\n /**\n * End a span\n */\n endSpan(span: Span | null, error?: Error): void {\n if (!span) return;\n\n if (error) {\n this.spanManager.recordException(span, error);\n }\n\n this.spanManager.endSpan(span, error ? \"error\" : \"ok\");\n }\n\n /**\n * Run a function with automatic span creation\n */\n async trace<T>(\n name: string,\n fn: (span: Span | null) => Promise<T>,\n options?: {\n kind?: SpanKind;\n attributes?: Record<string, SpanAttributeValue>;\n }\n ): Promise<T> {\n const span = this.startSpan(name, options);\n\n if (!span) {\n return fn(null);\n }\n\n try {\n const result = await this.contextManager.run(span.traceContext, () => fn(span));\n this.endSpan(span);\n return result;\n } catch (error) {\n this.endSpan(span, error as Error);\n throw error;\n }\n }\n\n /**\n * Add attribute to current span\n */\n setAttribute(key: string, value: SpanAttributeValue): void {\n const ctx = this.contextManager.current();\n if (!ctx) return;\n\n const span = this.spanManager.getSpan(ctx.spanId);\n if (span) {\n this.spanManager.setAttribute(span, key, value);\n }\n }\n\n /**\n * Add event to current span\n */\n addEvent(name: string, attributes?: Record<string, SpanAttributeValue>): void {\n const ctx = this.contextManager.current();\n if (!ctx) return;\n\n const span = this.spanManager.getSpan(ctx.spanId);\n if (span) {\n this.spanManager.addEvent(span, name, attributes);\n }\n }\n\n /**\n * Get current trace context\n */\n currentContext(): TraceContext | undefined {\n return this.contextManager.current();\n }\n\n /**\n * Get context manager for advanced use\n */\n getContextManager(): TraceContextManager {\n return this.contextManager;\n }\n\n /**\n * Extract trace context from incoming request\n */\n extract(headers: Headers | Record<string, string>): TraceContext | undefined {\n return this.contextManager.fromHeaders(headers);\n }\n\n /**\n * Inject trace context into outgoing request headers\n */\n inject(ctx?: TraceContext): Record<string, string> {\n const context = ctx ?? this.contextManager.current();\n if (!context) return {};\n return this.contextManager.toHeaders(context);\n }\n\n /**\n * Flush completed spans to exporter\n */\n async flush(): Promise<void> {\n const spans = this.spanManager.flush();\n if (spans.length > 0) {\n try {\n await this.exporter.export(spans);\n } catch (error) {\n this.logger.error(\"Failed to export spans\", error as Error);\n }\n }\n }\n\n /**\n * Shutdown tracer\n */\n async shutdown(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n await this.flush();\n await this.exporter.shutdown();\n this.spanManager.clear();\n this.contextManager.clear();\n }\n}\n\n/**\n * Create a tracer\n */\nexport function createTracer(options: TracerOptions): Tracer {\n return new Tracer(options);\n}\n\n// ============================================================================\n// GLOBAL TRACER\n// ============================================================================\n\nlet globalTracer: Tracer | null = null;\n\n/**\n * Get the global tracer instance\n */\nexport function getGlobalTracer(): Tracer | null {\n return globalTracer;\n}\n\n/**\n * Set the global tracer instance\n */\nexport function setGlobalTracer(tracer: Tracer): void {\n globalTracer = tracer;\n}\n\n/**\n * Reset the global tracer (for testing)\n */\nexport function resetGlobalTracer(): void {\n globalTracer = null;\n}\n\n// ============================================================================\n// MIDDLEWARE HELPERS\n// ============================================================================\n\n/**\n * Create HTTP server tracing middleware\n */\nexport function createTracingMiddleware(tracer: Tracer) {\n return async (\n request: Request,\n next: () => Promise<Response>\n ): Promise<Response> => {\n // Extract trace context from incoming request\n const parentCtx = tracer.extract(request.headers);\n\n // Start server span\n const url = new URL(request.url);\n const spanOpts: {\n kind: SpanKind;\n parent?: TraceContext;\n attributes: Record<string, SpanAttributeValue>;\n } = {\n kind: \"server\",\n attributes: {\n [SpanAttributes.HTTP_METHOD]: request.method,\n [SpanAttributes.HTTP_URL]: request.url,\n },\n };\n if (parentCtx) {\n spanOpts.parent = parentCtx;\n }\n const span = tracer.startSpan(`${request.method} ${url.pathname}`, spanOpts);\n\n if (!span) {\n return next();\n }\n\n try {\n const response = await tracer.getContextManager().run(span.traceContext, next);\n\n tracer.endSpan(span);\n span.attributes[SpanAttributes.HTTP_STATUS_CODE] = response.status;\n\n return response;\n } catch (error) {\n tracer.endSpan(span, error as Error);\n throw error;\n }\n };\n}\n\n/**\n * Create RPC tracing helpers\n */\nexport function createRpcTracing(tracer: Tracer) {\n return {\n /**\n * Trace an outgoing RPC call\n */\n async traceCall<T>(\n service: string,\n method: string,\n fn: () => Promise<T>\n ): Promise<T> {\n return tracer.trace(\n `rpc.${service}.${method}`,\n fn,\n {\n kind: \"client\",\n attributes: {\n [SpanAttributes.RPC_SYSTEM]: \"pars\",\n [SpanAttributes.RPC_SERVICE]: service,\n [SpanAttributes.RPC_METHOD]: method,\n },\n }\n );\n },\n\n /**\n * Trace an incoming RPC request\n */\n async traceHandler<T>(\n service: string,\n method: string,\n fn: () => Promise<T>,\n parentCtx?: TraceContext\n ): Promise<T> {\n const handlerOpts: {\n kind: SpanKind;\n parent?: TraceContext;\n attributes: Record<string, SpanAttributeValue>;\n } = {\n kind: \"server\",\n attributes: {\n [SpanAttributes.RPC_SYSTEM]: \"pars\",\n [SpanAttributes.RPC_SERVICE]: service,\n [SpanAttributes.RPC_METHOD]: method,\n },\n };\n if (parentCtx) {\n handlerOpts.parent = parentCtx;\n }\n const span = tracer.startSpan(`rpc.${service}.${method}`, handlerOpts);\n\n if (!span) {\n return fn();\n }\n\n try {\n const result = await tracer.getContextManager().run(span.traceContext, fn);\n tracer.endSpan(span);\n return result;\n } catch (error) {\n tracer.endSpan(span, error as Error);\n throw error;\n }\n },\n };\n}\n","/**\n * @parsrun/service - Trace Context\n * W3C Trace Context implementation\n */\n\nimport type { TraceContext } from \"../types.js\";\n\n// ============================================================================\n// TRACE ID GENERATION\n// ============================================================================\n\n/**\n * Generate a trace ID (32 hex characters)\n */\nexport function generateTraceId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Generate a span ID (16 hex characters)\n */\nexport function generateSpanId(): string {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n// ============================================================================\n// TRACE CONTEXT\n// ============================================================================\n\n/**\n * Create a new trace context\n */\nexport function createTraceContext(options?: {\n traceId?: string;\n spanId?: string;\n traceFlags?: number;\n traceState?: string;\n}): TraceContext {\n const ctx: TraceContext = {\n traceId: options?.traceId ?? generateTraceId(),\n spanId: options?.spanId ?? generateSpanId(),\n traceFlags: options?.traceFlags ?? 1, // Default: sampled\n };\n\n if (options?.traceState) {\n ctx.traceState = options.traceState;\n }\n\n return ctx;\n}\n\n/**\n * Create child trace context (new span in same trace)\n */\nexport function createChildContext(parent: TraceContext): TraceContext {\n const ctx: TraceContext = {\n traceId: parent.traceId,\n spanId: generateSpanId(),\n traceFlags: parent.traceFlags,\n };\n\n if (parent.traceState) {\n ctx.traceState = parent.traceState;\n }\n\n return ctx;\n}\n\n// ============================================================================\n// W3C TRACEPARENT HEADER\n// ============================================================================\n\n/**\n * Format trace context as W3C traceparent header\n *\n * Format: {version}-{trace-id}-{span-id}-{trace-flags}\n * Example: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01\n */\nexport function formatTraceparent(ctx: TraceContext): string {\n const version = \"00\";\n const flags = ctx.traceFlags.toString(16).padStart(2, \"0\");\n return `${version}-${ctx.traceId}-${ctx.spanId}-${flags}`;\n}\n\n/**\n * Parse W3C traceparent header\n */\nexport function parseTraceparent(header: string): TraceContext | null {\n const parts = header.trim().split(\"-\");\n if (parts.length !== 4) {\n return null;\n }\n\n const [version, traceId, spanId, flags] = parts;\n\n // Validate version\n if (version !== \"00\") {\n return null;\n }\n\n // Validate trace ID (32 hex chars)\n if (!traceId || traceId.length !== 32 || !/^[0-9a-f]+$/i.test(traceId)) {\n return null;\n }\n\n // Validate span ID (16 hex chars)\n if (!spanId || spanId.length !== 16 || !/^[0-9a-f]+$/i.test(spanId)) {\n return null;\n }\n\n // Validate flags (2 hex chars)\n if (!flags || flags.length !== 2 || !/^[0-9a-f]+$/i.test(flags)) {\n return null;\n }\n\n return {\n traceId: traceId.toLowerCase(),\n spanId: spanId.toLowerCase(),\n traceFlags: parseInt(flags, 16),\n };\n}\n\n// ============================================================================\n// W3C TRACESTATE HEADER\n// ============================================================================\n\n/**\n * Format trace state as W3C tracestate header\n *\n * Format: key1=value1,key2=value2\n */\nexport function formatTracestate(state: Record<string, string>): string {\n return Object.entries(state)\n .map(([key, value]) => `${key}=${value}`)\n .join(\",\");\n}\n\n/**\n * Parse W3C tracestate header\n */\nexport function parseTracestate(header: string): Record<string, string> {\n const state: Record<string, string> = {};\n\n for (const pair of header.split(\",\")) {\n const [key, value] = pair.trim().split(\"=\");\n if (key && value) {\n state[key] = value;\n }\n }\n\n return state;\n}\n\n// ============================================================================\n// TRACE CONTEXT MANAGER\n// ============================================================================\n\n/**\n * Async-local-storage-like context manager for tracing\n * Uses a simple stack for edge compatibility\n */\nexport class TraceContextManager {\n private readonly stack: TraceContext[] = [];\n\n /**\n * Get current trace context\n */\n current(): TraceContext | undefined {\n return this.stack[this.stack.length - 1];\n }\n\n /**\n * Run a function with a trace context\n */\n async run<T>(ctx: TraceContext, fn: () => Promise<T>): Promise<T> {\n this.stack.push(ctx);\n try {\n return await fn();\n } finally {\n this.stack.pop();\n }\n }\n\n /**\n * Run a function with a new child context\n */\n async runChild<T>(fn: () => Promise<T>): Promise<T> {\n const parent = this.current();\n const child = parent ? createChildContext(parent) : createTraceContext();\n return this.run(child, fn);\n }\n\n /**\n * Create context from incoming request headers\n */\n fromHeaders(headers: Headers | Record<string, string>): TraceContext | undefined {\n const traceparent =\n headers instanceof Headers\n ? headers.get(\"traceparent\")\n : headers[\"traceparent\"];\n\n if (!traceparent) {\n return undefined;\n }\n\n const ctx = parseTraceparent(traceparent);\n if (!ctx) {\n return undefined;\n }\n\n const tracestate =\n headers instanceof Headers\n ? headers.get(\"tracestate\")\n : headers[\"tracestate\"];\n\n if (tracestate) {\n ctx.traceState = tracestate;\n }\n\n return ctx;\n }\n\n /**\n * Add trace context to outgoing request headers\n */\n toHeaders(ctx: TraceContext): Record<string, string> {\n const headers: Record<string, string> = {\n traceparent: formatTraceparent(ctx),\n };\n\n if (ctx.traceState) {\n headers[\"tracestate\"] = ctx.traceState;\n }\n\n return headers;\n }\n\n /**\n * Check if current context is sampled\n */\n isSampled(): boolean {\n const ctx = this.current();\n return ctx ? (ctx.traceFlags & 0x01) === 1 : false;\n }\n\n /**\n * Clear all contexts (for testing)\n */\n clear(): void {\n this.stack.length = 0;\n }\n}\n\n// ============================================================================\n// SAMPLING\n// ============================================================================\n\nexport type Sampler = \"always\" | \"never\" | { ratio: number };\n\n/**\n * Determine if a trace should be sampled\n */\nexport function shouldSample(sampler: Sampler, traceId?: string): boolean {\n if (sampler === \"always\") {\n return true;\n }\n\n if (sampler === \"never\") {\n return false;\n }\n\n // Ratio-based sampling\n if (traceId) {\n // Use trace ID for deterministic sampling\n const hash = parseInt(traceId.slice(-8), 16);\n const threshold = Math.floor(sampler.ratio * 0xffffffff);\n return hash < threshold;\n }\n\n // Random sampling\n return Math.random() < sampler.ratio;\n}\n","/**\n * @parsrun/service - Spans\n * Span creation and management\n */\n\nimport type {\n Span,\n SpanKind,\n SpanStatus,\n SpanAttributeValue,\n SpanEvent,\n TraceContext,\n} from \"../types.js\";\nimport { generateSpanId, createTraceContext } from \"./context.js\";\n\n// ============================================================================\n// SPAN CREATION\n// ============================================================================\n\nexport interface SpanOptions {\n /** Span name */\n name: string;\n /** Span kind */\n kind?: SpanKind;\n /** Parent trace context */\n parent?: TraceContext;\n /** Initial attributes */\n attributes?: Record<string, SpanAttributeValue>;\n /** Start time (default: now) */\n startTime?: number;\n}\n\n/**\n * Create a new span\n */\nexport function createSpan(options: SpanOptions): Span {\n let traceContext: TraceContext;\n\n if (options.parent) {\n traceContext = {\n traceId: options.parent.traceId,\n spanId: generateSpanId(),\n traceFlags: options.parent.traceFlags,\n };\n if (options.parent.traceState) {\n traceContext.traceState = options.parent.traceState;\n }\n } else {\n traceContext = createTraceContext();\n }\n\n const span: Span = {\n name: options.name,\n kind: options.kind ?? \"internal\",\n traceContext,\n startTime: options.startTime ?? Date.now(),\n status: \"unset\",\n attributes: options.attributes ?? {},\n events: [],\n };\n\n if (options.parent?.spanId) {\n span.parentSpanId = options.parent.spanId;\n }\n\n return span;\n}\n\n// ============================================================================\n// SPAN MANAGER\n// ============================================================================\n\n/**\n * Span manager for creating and managing spans\n */\nexport class SpanManager {\n private readonly spans: Map<string, Span> = new Map();\n\n /**\n * Start a new span\n */\n startSpan(options: SpanOptions): Span {\n const span = createSpan(options);\n this.spans.set(span.traceContext.spanId, span);\n return span;\n }\n\n /**\n * End a span\n */\n endSpan(span: Span, status?: SpanStatus): Span {\n span.endTime = Date.now();\n if (status) {\n span.status = status;\n } else if (span.status === \"unset\") {\n span.status = \"ok\";\n }\n return span;\n }\n\n /**\n * Set span attribute\n */\n setAttribute(span: Span, key: string, value: SpanAttributeValue): void {\n span.attributes[key] = value;\n }\n\n /**\n * Set multiple span attributes\n */\n setAttributes(span: Span, attributes: Record<string, SpanAttributeValue>): void {\n Object.assign(span.attributes, attributes);\n }\n\n /**\n * Add span event\n */\n addEvent(\n span: Span,\n name: string,\n attributes?: Record<string, SpanAttributeValue>\n ): void {\n const event: SpanEvent = {\n name,\n time: Date.now(),\n };\n if (attributes) {\n event.attributes = attributes;\n }\n span.events.push(event);\n }\n\n /**\n * Set span status\n */\n setStatus(span: Span, status: SpanStatus): void {\n span.status = status;\n }\n\n /**\n * Record exception on span\n */\n recordException(span: Span, error: Error): void {\n span.status = \"error\";\n this.addEvent(span, \"exception\", {\n \"exception.type\": error.name,\n \"exception.message\": error.message,\n \"exception.stacktrace\": error.stack ?? \"\",\n });\n }\n\n /**\n * Get span by ID\n */\n getSpan(spanId: string): Span | undefined {\n return this.spans.get(spanId);\n }\n\n /**\n * Get all completed spans and clear\n */\n flush(): Span[] {\n const completed = Array.from(this.spans.values()).filter((s) => s.endTime);\n for (const span of completed) {\n this.spans.delete(span.traceContext.spanId);\n }\n return completed;\n }\n\n /**\n * Clear all spans\n */\n clear(): void {\n this.spans.clear();\n }\n}\n\n// ============================================================================\n// SPAN UTILITIES\n// ============================================================================\n\n/**\n * Calculate span duration in milliseconds\n */\nexport function getSpanDuration(span: Span): number | undefined {\n if (!span.endTime) return undefined;\n return span.endTime - span.startTime;\n}\n\n/**\n * Check if span is completed\n */\nexport function isSpanCompleted(span: Span): boolean {\n return span.endTime !== undefined;\n}\n\n/**\n * Get span as simplified object (for logging)\n */\nexport function spanToLogObject(span: Span): Record<string, unknown> {\n return {\n traceId: span.traceContext.traceId,\n spanId: span.traceContext.spanId,\n parentSpanId: span.parentSpanId,\n name: span.name,\n kind: span.kind,\n status: span.status,\n startTime: new Date(span.startTime).toISOString(),\n endTime: span.endTime ? new Date(span.endTime).toISOString() : undefined,\n durationMs: getSpanDuration(span),\n attributes: span.attributes,\n events: span.events.map((e) => ({\n name: e.name,\n time: new Date(e.time).toISOString(),\n attributes: e.attributes,\n })),\n };\n}\n\n// ============================================================================\n// SEMANTIC CONVENTIONS\n// ============================================================================\n\n/**\n * Common span attribute keys (OpenTelemetry semantic conventions)\n */\nexport const SpanAttributes = {\n // HTTP\n HTTP_METHOD: \"http.method\",\n HTTP_URL: \"http.url\",\n HTTP_STATUS_CODE: \"http.status_code\",\n HTTP_REQUEST_CONTENT_LENGTH: \"http.request_content_length\",\n HTTP_RESPONSE_CONTENT_LENGTH: \"http.response_content_length\",\n\n // RPC\n RPC_SYSTEM: \"rpc.system\",\n RPC_SERVICE: \"rpc.service\",\n RPC_METHOD: \"rpc.method\",\n\n // Database\n DB_SYSTEM: \"db.system\",\n DB_NAME: \"db.name\",\n DB_OPERATION: \"db.operation\",\n DB_STATEMENT: \"db.statement\",\n\n // Messaging\n MESSAGING_SYSTEM: \"messaging.system\",\n MESSAGING_DESTINATION: \"messaging.destination\",\n MESSAGING_MESSAGE_ID: \"messaging.message_id\",\n\n // Service\n SERVICE_NAME: \"service.name\",\n SERVICE_VERSION: \"service.version\",\n\n // Error\n EXCEPTION_TYPE: \"exception.type\",\n EXCEPTION_MESSAGE: \"exception.message\",\n EXCEPTION_STACKTRACE: \"exception.stacktrace\",\n\n // Custom Pars attributes\n PARS_TENANT_ID: \"pars.tenant_id\",\n PARS_USER_ID: \"pars.user_id\",\n PARS_REQUEST_ID: \"pars.request_id\",\n} as const;\n","/**\n * @parsrun/service - Trace Exporters\n * Console and OTLP exporters for spans\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type { Span } from \"../types.js\";\nimport { spanToLogObject, getSpanDuration } from \"./spans.js\";\n\n// ============================================================================\n// EXPORTER INTERFACE\n// ============================================================================\n\nexport interface SpanExporter {\n /** Exporter name */\n readonly name: string;\n /** Export spans */\n export(spans: Span[]): Promise<void>;\n /** Shutdown exporter */\n shutdown(): Promise<void>;\n}\n\nexport interface ExporterOptions {\n /** Logger */\n logger?: Logger;\n}\n\n// ============================================================================\n// CONSOLE EXPORTER\n// ============================================================================\n\nexport interface ConsoleExporterOptions extends ExporterOptions {\n /** Pretty print (default: true in dev) */\n pretty?: boolean;\n /** Include attributes (default: true) */\n includeAttributes?: boolean;\n /** Include events (default: true) */\n includeEvents?: boolean;\n}\n\n/**\n * Console exporter for development/debugging\n */\nexport class ConsoleExporter implements SpanExporter {\n readonly name = \"console\";\n private readonly logger: Logger;\n private readonly pretty: boolean;\n private readonly includeAttributes: boolean;\n private readonly includeEvents: boolean;\n\n constructor(options: ConsoleExporterOptions = {}) {\n this.logger = options.logger ?? createLogger({ name: \"trace-exporter\" });\n this.pretty = options.pretty ?? true;\n this.includeAttributes = options.includeAttributes ?? true;\n this.includeEvents = options.includeEvents ?? true;\n }\n\n async export(spans: Span[]): Promise<void> {\n for (const span of spans) {\n const duration = getSpanDuration(span);\n const status = span.status === \"error\" ? \"ERROR\" : span.status === \"ok\" ? \"OK\" : \"UNSET\";\n\n if (this.pretty) {\n const indent = span.parentSpanId ? \" └─\" : \"──\";\n const statusIcon = span.status === \"error\" ? \"✗\" : span.status === \"ok\" ? \"✓\" : \"○\";\n const durationStr = duration !== undefined ? `${duration}ms` : \"?ms\";\n\n console.log(\n `${indent} ${statusIcon} [${span.kind}] ${span.name} (${durationStr}) trace=${span.traceContext.traceId.slice(0, 8)}`\n );\n\n if (this.includeAttributes && Object.keys(span.attributes).length > 0) {\n console.log(` attributes:`, span.attributes);\n }\n\n if (this.includeEvents && span.events.length > 0) {\n for (const event of span.events) {\n console.log(` event: ${event.name}`, event.attributes ?? \"\");\n }\n }\n } else {\n const logObj = spanToLogObject(span);\n this.logger.info(`Span: ${span.name}`, {\n ...logObj,\n status,\n durationMs: duration,\n });\n }\n }\n }\n\n async shutdown(): Promise<void> {\n // No cleanup needed\n }\n}\n\n/**\n * Create a console exporter\n */\nexport function createConsoleExporter(options?: ConsoleExporterOptions): ConsoleExporter {\n return new ConsoleExporter(options);\n}\n\n// ============================================================================\n// OTLP EXPORTER\n// ============================================================================\n\nexport interface OtlpExporterOptions extends ExporterOptions {\n /** OTLP endpoint URL */\n endpoint: string;\n /** Service name */\n serviceName: string;\n /** Service version */\n serviceVersion?: string;\n /** Custom headers */\n headers?: Record<string, string>;\n /** Timeout in ms */\n timeout?: number;\n /** Batch size */\n batchSize?: number;\n /** Flush interval in ms */\n flushInterval?: number;\n}\n\n/**\n * OTLP exporter for production tracing\n */\nexport class OtlpExporter implements SpanExporter {\n readonly name = \"otlp\";\n private readonly endpoint: string;\n private readonly serviceName: string;\n private readonly serviceVersion: string;\n private readonly headers: Record<string, string>;\n private readonly timeout: number;\n private readonly batchSize: number;\n private readonly flushInterval: number;\n private readonly logger: Logger;\n private readonly buffer: Span[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: OtlpExporterOptions) {\n this.endpoint = options.endpoint.replace(/\\/$/, \"\");\n this.serviceName = options.serviceName;\n this.serviceVersion = options.serviceVersion ?? \"1.0.0\";\n this.headers = options.headers ?? {};\n this.timeout = options.timeout ?? 10_000;\n this.batchSize = options.batchSize ?? 100;\n this.flushInterval = options.flushInterval ?? 5_000;\n this.logger = options.logger ?? createLogger({ name: \"otlp-exporter\" });\n\n // Start flush timer\n this.flushTimer = setInterval(() => this.flush(), this.flushInterval);\n }\n\n async export(spans: Span[]): Promise<void> {\n this.buffer.push(...spans);\n\n if (this.buffer.length >= this.batchSize) {\n await this.flush();\n }\n }\n\n private async flush(): Promise<void> {\n if (this.buffer.length === 0) return;\n\n const spansToExport = this.buffer.splice(0, this.batchSize);\n\n try {\n const payload = this.buildOtlpPayload(spansToExport);\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.endpoint}/v1/traces`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.headers,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`OTLP export failed: ${response.status} ${response.statusText}`);\n }\n\n this.logger.debug(`Exported ${spansToExport.length} spans to OTLP`);\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (error) {\n this.logger.error(`Failed to export spans to OTLP`, error as Error);\n // Put spans back in buffer for retry\n this.buffer.unshift(...spansToExport);\n }\n }\n\n private buildOtlpPayload(spans: Span[]): OtlpTracePayload {\n return {\n resourceSpans: [\n {\n resource: {\n attributes: [\n { key: \"service.name\", value: { stringValue: this.serviceName } },\n { key: \"service.version\", value: { stringValue: this.serviceVersion } },\n ],\n },\n scopeSpans: [\n {\n scope: {\n name: \"@parsrun/service\",\n version: \"0.1.0\",\n },\n spans: spans.map((span) => this.convertSpan(span)),\n },\n ],\n },\n ],\n };\n }\n\n private convertSpan(span: Span): OtlpSpan {\n const otlpSpan: OtlpSpan = {\n traceId: span.traceContext.traceId,\n spanId: span.traceContext.spanId,\n name: span.name,\n kind: this.convertSpanKind(span.kind),\n startTimeUnixNano: String(span.startTime * 1_000_000),\n attributes: Object.entries(span.attributes).map(([key, value]) => ({\n key,\n value: this.convertAttributeValue(value),\n })),\n events: span.events.map((event) => ({\n name: event.name,\n timeUnixNano: String(event.time * 1_000_000),\n attributes: event.attributes\n ? Object.entries(event.attributes).map(([key, value]) => ({\n key,\n value: this.convertAttributeValue(value),\n }))\n : [],\n })),\n status: {\n code: span.status === \"error\" ? 2 : span.status === \"ok\" ? 1 : 0,\n },\n };\n\n if (span.parentSpanId) {\n otlpSpan.parentSpanId = span.parentSpanId;\n }\n if (span.endTime) {\n otlpSpan.endTimeUnixNano = String(span.endTime * 1_000_000);\n }\n\n return otlpSpan;\n }\n\n private convertSpanKind(kind: string): number {\n switch (kind) {\n case \"internal\":\n return 1;\n case \"server\":\n return 2;\n case \"client\":\n return 3;\n case \"producer\":\n return 4;\n case \"consumer\":\n return 5;\n default:\n return 0;\n }\n }\n\n private convertAttributeValue(value: unknown): OtlpAttributeValue {\n if (typeof value === \"string\") {\n return { stringValue: value };\n }\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) {\n return { intValue: String(value) };\n }\n return { doubleValue: value };\n }\n if (typeof value === \"boolean\") {\n return { boolValue: value };\n }\n if (Array.isArray(value)) {\n return {\n arrayValue: {\n values: value.map((v) => this.convertAttributeValue(v)),\n },\n };\n }\n return { stringValue: String(value) };\n }\n\n async shutdown(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n}\n\n/**\n * Create an OTLP exporter\n */\nexport function createOtlpExporter(options: OtlpExporterOptions): OtlpExporter {\n return new OtlpExporter(options);\n}\n\n// ============================================================================\n// OTLP TYPES\n// ============================================================================\n\ninterface OtlpTracePayload {\n resourceSpans: Array<{\n resource: {\n attributes: OtlpAttribute[];\n };\n scopeSpans: Array<{\n scope: {\n name: string;\n version: string;\n };\n spans: OtlpSpan[];\n }>;\n }>;\n}\n\ninterface OtlpSpan {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n name: string;\n kind: number;\n startTimeUnixNano: string;\n endTimeUnixNano?: string;\n attributes: OtlpAttribute[];\n events: Array<{\n name: string;\n timeUnixNano: string;\n attributes: OtlpAttribute[];\n }>;\n status: {\n code: number;\n };\n}\n\ninterface OtlpAttribute {\n key: string;\n value: OtlpAttributeValue;\n}\n\ninterface OtlpAttributeValue {\n stringValue?: string;\n intValue?: string;\n doubleValue?: number;\n boolValue?: boolean;\n arrayValue?: {\n values: OtlpAttributeValue[];\n };\n}\n","/**\n * @parsrun/service - RPC Server\n * Server for handling RPC requests\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type {\n RpcRequest,\n RpcResponse,\n ServiceDefinition,\n TraceContext,\n} from \"../types.js\";\nimport { satisfiesVersion, isMethodDeprecated, getMethodTimeout } from \"../define.js\";\nimport { MethodNotFoundError, VersionMismatchError, toRpcError } from \"./errors.js\";\n\n// ============================================================================\n// RPC HANDLER TYPES\n// ============================================================================\n\n/**\n * RPC handler context\n */\nexport interface RpcHandlerContext {\n /** Request ID */\n requestId: string;\n /** Service name */\n service: string;\n /** Method name */\n method: string;\n /** Method type */\n type: \"query\" | \"mutation\";\n /** Request metadata */\n metadata: Record<string, unknown>;\n /** Trace context */\n traceContext?: TraceContext;\n /** Logger */\n logger: Logger;\n}\n\n/**\n * RPC handler function\n */\nexport type RpcHandler<TInput = unknown, TOutput = unknown> = (\n input: TInput,\n context: RpcHandlerContext\n) => Promise<TOutput>;\n\n/**\n * RPC handlers record\n */\nexport type RpcHandlers = {\n queries?: Record<string, RpcHandler>;\n mutations?: Record<string, RpcHandler>;\n};\n\n// ============================================================================\n// RPC SERVER\n// ============================================================================\n\nexport interface RpcServerOptions {\n /** Service definition */\n definition: ServiceDefinition;\n /** RPC handlers */\n handlers: RpcHandlers;\n /** Logger */\n logger?: Logger;\n /** Default timeout in ms */\n defaultTimeout?: number;\n /** Middleware */\n middleware?: RpcMiddleware[];\n}\n\n/**\n * RPC middleware function\n */\nexport type RpcMiddleware = (\n request: RpcRequest,\n context: RpcHandlerContext,\n next: () => Promise<unknown>\n) => Promise<unknown>;\n\n/**\n * RPC Server for handling incoming requests\n */\nexport class RpcServer {\n private readonly definition: ServiceDefinition;\n private readonly handlers: RpcHandlers;\n private readonly logger: Logger;\n private readonly defaultTimeout: number;\n private readonly middleware: RpcMiddleware[];\n\n constructor(options: RpcServerOptions) {\n this.definition = options.definition;\n this.handlers = options.handlers;\n this.logger = options.logger ?? createLogger({ name: `rpc:${options.definition.name}` });\n this.defaultTimeout = options.defaultTimeout ?? 30_000;\n this.middleware = options.middleware ?? [];\n }\n\n /**\n * Handle an RPC request\n */\n async handle<TInput, TOutput>(request: RpcRequest<TInput>): Promise<RpcResponse<TOutput>> {\n const startTime = Date.now();\n const context: RpcHandlerContext = {\n requestId: request.id,\n service: request.service,\n method: request.method,\n type: request.type,\n metadata: request.metadata ?? {},\n logger: this.logger.child({ requestId: request.id, method: request.method }),\n };\n\n if (request.traceContext) {\n context.traceContext = request.traceContext;\n }\n\n try {\n // Check version compatibility\n if (request.version && !satisfiesVersion(this.definition.version, request.version)) {\n throw new VersionMismatchError(\n this.definition.name,\n request.version,\n this.definition.version\n );\n }\n\n // Get handler\n const handler = this.getHandler(request.method, request.type);\n if (!handler) {\n throw new MethodNotFoundError(this.definition.name, request.method);\n }\n\n // Check deprecation\n const deprecation = isMethodDeprecated(this.definition, request.method, request.type);\n if (deprecation.deprecated) {\n context.logger.warn(`Method ${request.method} is deprecated`, {\n since: deprecation.since,\n replacement: deprecation.replacement,\n });\n }\n\n // Build middleware chain\n const chain = this.buildMiddlewareChain(request, context, handler);\n\n // Execute with timeout\n const timeout = getMethodTimeout(\n this.definition,\n request.method,\n request.type,\n this.defaultTimeout\n );\n\n const output = await Promise.race([\n chain(),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(\"Handler timeout\")), timeout)\n ),\n ]);\n\n const duration = Date.now() - startTime;\n context.logger.info(`${request.type} ${request.method} completed`, { durationMs: duration });\n\n const successResponse: RpcResponse<TOutput> = {\n id: request.id,\n success: true,\n version: this.definition.version,\n output: output as TOutput,\n };\n if (request.traceContext) {\n successResponse.traceContext = request.traceContext;\n }\n return successResponse;\n } catch (error) {\n const duration = Date.now() - startTime;\n const rpcError = toRpcError(error);\n\n context.logger.error(`${request.type} ${request.method} failed`, error as Error, {\n durationMs: duration,\n errorCode: rpcError.code,\n });\n\n const errorData: RpcResponse<TOutput>[\"error\"] = {\n code: rpcError.code,\n message: rpcError.message,\n retryable: rpcError.retryable,\n };\n if (rpcError.details) {\n errorData!.details = rpcError.details;\n }\n if (rpcError.retryAfter !== undefined) {\n errorData!.retryAfter = rpcError.retryAfter;\n }\n\n const errorResponse: RpcResponse<TOutput> = {\n id: request.id,\n success: false,\n version: this.definition.version,\n error: errorData,\n };\n if (request.traceContext) {\n errorResponse.traceContext = request.traceContext;\n }\n return errorResponse;\n }\n }\n\n /**\n * Get handler for a method\n */\n private getHandler(method: string, type: \"query\" | \"mutation\"): RpcHandler | undefined {\n const handlers = type === \"query\" ? this.handlers.queries : this.handlers.mutations;\n return handlers?.[method];\n }\n\n /**\n * Build middleware chain\n */\n private buildMiddlewareChain(\n request: RpcRequest,\n context: RpcHandlerContext,\n handler: RpcHandler\n ): () => Promise<unknown> {\n let index = -1;\n\n const dispatch = async (i: number): Promise<unknown> => {\n if (i <= index) {\n throw new Error(\"next() called multiple times\");\n }\n index = i;\n\n if (i < this.middleware.length) {\n const mw = this.middleware[i]!;\n return mw(request, context, () => dispatch(i + 1));\n }\n\n return handler(request.input, context);\n };\n\n return () => dispatch(0);\n }\n\n /**\n * Get service definition\n */\n getDefinition(): ServiceDefinition {\n return this.definition;\n }\n\n /**\n * Get registered methods\n */\n getMethods(): { queries: string[]; mutations: string[] } {\n return {\n queries: Object.keys(this.handlers.queries ?? {}),\n mutations: Object.keys(this.handlers.mutations ?? {}),\n };\n }\n}\n\n/**\n * Create an RPC server\n */\nexport function createRpcServer(options: RpcServerOptions): RpcServer {\n return new RpcServer(options);\n}\n\n// ============================================================================\n// BUILT-IN MIDDLEWARE\n// ============================================================================\n\n/**\n * Logging middleware\n */\nexport function loggingMiddleware(): RpcMiddleware {\n return async (request, context, next) => {\n context.logger.debug(`Handling ${request.type} ${request.method}`, {\n inputKeys: Object.keys(request.input as object),\n });\n\n const result = await next();\n\n context.logger.debug(`Completed ${request.type} ${request.method}`);\n\n return result;\n };\n}\n\n/**\n * Validation middleware (placeholder - integrate with ArkType)\n */\nexport function validationMiddleware(\n validators: Record<string, (input: unknown) => unknown>\n): RpcMiddleware {\n return async (request, _context, next) => {\n const validator = validators[request.method];\n if (validator) {\n request.input = validator(request.input);\n }\n return next();\n };\n}\n\n/**\n * Tenant context middleware\n */\nexport function tenantMiddleware(): RpcMiddleware {\n return async (_request, context, next) => {\n const tenantId = context.metadata[\"tenantId\"];\n if (tenantId) {\n context.logger = context.logger.child({ tenantId });\n }\n return next();\n };\n}\n","/**\n * @parsrun/service - Event Emitter\n * Service-level event emission\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type {\n EventTransport,\n TraceContext,\n ServiceDefinition,\n} from \"../types.js\";\nimport { createEvent, type CreateEventOptions } from \"./format.js\";\n\n// ============================================================================\n// EVENT EMITTER\n// ============================================================================\n\nexport interface EventEmitterOptions {\n /** Service name (source) */\n service: string;\n /** Service definition (for validation) */\n definition?: ServiceDefinition;\n /** Event transport */\n transport: EventTransport;\n /** Logger */\n logger?: Logger;\n /** Default tenant ID */\n defaultTenantId?: string;\n /** Validate events against definition */\n validateEvents?: boolean;\n}\n\n/**\n * Event emitter for service events\n */\nexport class EventEmitter {\n private readonly service: string;\n private readonly definition?: ServiceDefinition;\n private readonly transport: EventTransport;\n private readonly logger: Logger;\n private readonly defaultTenantId?: string;\n private readonly validateEvents: boolean;\n\n constructor(options: EventEmitterOptions) {\n this.service = options.service;\n if (options.definition) {\n this.definition = options.definition;\n }\n this.transport = options.transport;\n this.logger = options.logger ?? createLogger({ name: `events:${options.service}` });\n if (options.defaultTenantId) {\n this.defaultTenantId = options.defaultTenantId;\n }\n this.validateEvents = options.validateEvents ?? true;\n }\n\n /**\n * Emit an event\n */\n async emit<T = unknown>(\n type: string,\n data: T,\n options?: EmitOptions\n ): Promise<string> {\n // Validate event type if definition provided\n if (this.validateEvents && this.definition?.events?.emits) {\n const emits = this.definition.events.emits;\n if (!(type in emits)) {\n this.logger.warn(`Event type not declared in service definition: ${type}`);\n }\n }\n\n // Get delivery guarantee from definition\n let delivery: \"at-most-once\" | \"at-least-once\" | undefined;\n if (this.definition?.events?.emits?.[type]) {\n delivery = this.definition.events.emits[type].delivery;\n }\n\n // Create event options\n const eventOptions: CreateEventOptions<T> = {\n type,\n source: this.service,\n data,\n };\n\n if (options?.eventId) eventOptions.id = options.eventId;\n if (options?.subject) eventOptions.subject = options.subject;\n\n const tenantId = options?.tenantId ?? this.defaultTenantId;\n if (tenantId) eventOptions.tenantId = tenantId;\n\n if (options?.requestId) eventOptions.requestId = options.requestId;\n if (options?.traceContext) eventOptions.traceContext = options.traceContext;\n\n const eventDelivery = options?.delivery ?? delivery;\n if (eventDelivery) eventOptions.delivery = eventDelivery;\n\n // Create event\n const event = createEvent(eventOptions);\n\n // Emit via transport\n try {\n await this.transport.emit(event);\n this.logger.debug(`Event emitted: ${type}`, {\n eventId: event.id,\n tenantId: event.parstenantid,\n });\n return event.id;\n } catch (error) {\n this.logger.error(`Failed to emit event: ${type}`, error as Error, {\n eventId: event.id,\n });\n throw error;\n }\n }\n\n /**\n * Emit multiple events\n */\n async emitBatch<T = unknown>(\n events: Array<{ type: string; data: T; options?: EmitOptions }>\n ): Promise<string[]> {\n const results: string[] = [];\n\n for (const { type, data, options } of events) {\n const eventId = await this.emit(type, data, options);\n results.push(eventId);\n }\n\n return results;\n }\n\n /**\n * Create a scoped emitter with preset options\n */\n scoped(options: Partial<EmitOptions>): ScopedEmitter {\n return new ScopedEmitter(this, options);\n }\n\n /**\n * Get service name\n */\n get serviceName(): string {\n return this.service;\n }\n}\n\n/**\n * Emit options\n */\nexport interface EmitOptions {\n /** Custom event ID */\n eventId?: string;\n /** Event subject */\n subject?: string;\n /** Tenant ID */\n tenantId?: string;\n /** Request ID for correlation */\n requestId?: string;\n /** Trace context */\n traceContext?: TraceContext;\n /** Override delivery guarantee */\n delivery?: \"at-most-once\" | \"at-least-once\";\n}\n\n/**\n * Scoped emitter with preset options\n */\nexport class ScopedEmitter {\n private readonly emitter: EventEmitter;\n private readonly defaultOptions: Partial<EmitOptions>;\n\n constructor(emitter: EventEmitter, defaultOptions: Partial<EmitOptions>) {\n this.emitter = emitter;\n this.defaultOptions = defaultOptions;\n }\n\n async emit<T = unknown>(\n type: string,\n data: T,\n options?: EmitOptions\n ): Promise<string> {\n return this.emitter.emit(type, data, {\n ...this.defaultOptions,\n ...options,\n });\n }\n}\n\n/**\n * Create an event emitter\n */\nexport function createEventEmitter(options: EventEmitterOptions): EventEmitter {\n return new EventEmitter(options);\n}\n\n// ============================================================================\n// TYPED EVENT EMITTER\n// ============================================================================\n\n/**\n * Create a typed event emitter from service definition\n * Provides type-safe event emission\n */\nexport function createTypedEmitter<TDef extends ServiceDefinition>(\n definition: TDef,\n options: Omit<EventEmitterOptions, \"service\" | \"definition\">\n): TypedEventEmitter<TDef> {\n const emitter = new EventEmitter({\n ...options,\n service: definition.name,\n definition,\n });\n\n return emitter as TypedEventEmitter<TDef>;\n}\n\n/**\n * Typed event emitter type\n * Provides type-safe event emission with specific event types\n */\nexport type TypedEventEmitter<TDef extends ServiceDefinition> = EventEmitter & {\n emit<K extends keyof NonNullable<TDef[\"events\"]>[\"emits\"]>(\n type: K,\n data: NonNullable<TDef[\"events\"]>[\"emits\"][K] extends { data?: infer D } ? D : unknown,\n options?: EmitOptions\n ): Promise<string>;\n};\n","/**\n * @parsrun/service - Dead Letter Queue\n * Storage for failed events\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger, generateId } from \"@parsrun/core\";\nimport type { ParsEvent } from \"../types.js\";\n\n// ============================================================================\n// DEAD LETTER QUEUE\n// ============================================================================\n\nexport interface DeadLetterEntry {\n /** Unique ID */\n id: string;\n /** Original event */\n event: ParsEvent;\n /** Error message */\n error: string;\n /** Handler pattern that failed */\n pattern: string;\n /** Number of attempts made */\n attempts: number;\n /** Timestamp when added */\n addedAt: Date;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\nexport interface DeadLetterQueueOptions {\n /** Maximum entries to keep */\n maxSize?: number;\n /** Retention period in ms */\n retentionMs?: number;\n /** Callback when entry is added */\n onAdd?: (entry: DeadLetterEntry) => void;\n /** Callback when threshold is reached */\n onThreshold?: (count: number) => void;\n /** Alert threshold */\n alertThreshold?: number;\n /** Logger */\n logger?: Logger;\n}\n\nexport interface AddEntryOptions {\n /** Original event */\n event: ParsEvent;\n /** Error message */\n error: string;\n /** Handler pattern */\n pattern: string;\n /** Number of attempts */\n attempts: number;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Resolved DLQ options\n */\ninterface ResolvedDlqOptions {\n maxSize: number;\n retentionMs: number;\n alertThreshold: number;\n onAdd?: (entry: DeadLetterEntry) => void;\n onThreshold?: (count: number) => void;\n logger?: Logger;\n}\n\n/**\n * In-memory Dead Letter Queue\n */\nexport class DeadLetterQueue {\n private readonly entries: Map<string, DeadLetterEntry> = new Map();\n private readonly resolvedOptions: ResolvedDlqOptions;\n private readonly logger: Logger;\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: DeadLetterQueueOptions = {}) {\n this.resolvedOptions = {\n maxSize: options.maxSize ?? 1000,\n retentionMs: options.retentionMs ?? 30 * 24 * 60 * 60 * 1000, // 30 days\n alertThreshold: options.alertThreshold ?? 10,\n };\n\n if (options.onAdd) this.resolvedOptions.onAdd = options.onAdd;\n if (options.onThreshold) this.resolvedOptions.onThreshold = options.onThreshold;\n if (options.logger) this.resolvedOptions.logger = options.logger;\n\n this.logger = options.logger ?? createLogger({ name: \"dlq\" });\n\n // Start cleanup timer\n this.cleanupTimer = setInterval(() => this.cleanup(), 60 * 60 * 1000); // Every hour\n }\n\n /**\n * Add an entry to the DLQ\n */\n async add(options: AddEntryOptions): Promise<string> {\n const entry: DeadLetterEntry = {\n id: generateId(),\n event: options.event,\n error: options.error,\n pattern: options.pattern,\n attempts: options.attempts,\n addedAt: new Date(),\n };\n\n if (options.metadata) {\n entry.metadata = options.metadata;\n }\n\n // Check max size\n if (this.entries.size >= this.resolvedOptions.maxSize) {\n // Remove oldest entry\n const oldest = this.getOldest();\n if (oldest) {\n this.entries.delete(oldest.id);\n this.logger.debug(`DLQ: Removed oldest entry to make room`, {\n removedId: oldest.id,\n });\n }\n }\n\n this.entries.set(entry.id, entry);\n\n this.logger.warn(`DLQ: Entry added`, {\n id: entry.id,\n eventId: entry.event.id,\n eventType: entry.event.type,\n error: entry.error,\n });\n\n // Callbacks\n this.resolvedOptions.onAdd?.(entry);\n\n // Check threshold\n if (this.entries.size >= this.resolvedOptions.alertThreshold) {\n this.resolvedOptions.onThreshold?.(this.entries.size);\n }\n\n return entry.id;\n }\n\n /**\n * Get an entry by ID\n */\n get(id: string): DeadLetterEntry | undefined {\n return this.entries.get(id);\n }\n\n /**\n * Get all entries\n */\n getAll(): DeadLetterEntry[] {\n return Array.from(this.entries.values());\n }\n\n /**\n * Get entries by event type\n */\n getByEventType(eventType: string): DeadLetterEntry[] {\n return Array.from(this.entries.values()).filter(\n (e) => e.event.type === eventType\n );\n }\n\n /**\n * Get entries by pattern\n */\n getByPattern(pattern: string): DeadLetterEntry[] {\n return Array.from(this.entries.values()).filter(\n (e) => e.pattern === pattern\n );\n }\n\n /**\n * Remove an entry\n */\n remove(id: string): boolean {\n const deleted = this.entries.delete(id);\n if (deleted) {\n this.logger.debug(`DLQ: Entry removed`, { id });\n }\n return deleted;\n }\n\n /**\n * Retry an entry (remove from DLQ and return event)\n */\n retry(id: string): ParsEvent | undefined {\n const entry = this.entries.get(id);\n if (!entry) return undefined;\n\n this.entries.delete(id);\n this.logger.info(`DLQ: Entry removed for retry`, {\n id,\n eventId: entry.event.id,\n });\n\n return entry.event;\n }\n\n /**\n * Get count\n */\n get size(): number {\n return this.entries.size;\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.entries.clear();\n this.logger.info(`DLQ: Cleared all entries`);\n }\n\n /**\n * Cleanup expired entries\n */\n private cleanup(): void {\n const now = Date.now();\n let removed = 0;\n\n for (const [id, entry] of this.entries) {\n const age = now - entry.addedAt.getTime();\n if (age > this.resolvedOptions.retentionMs) {\n this.entries.delete(id);\n removed++;\n }\n }\n\n if (removed > 0) {\n this.logger.debug(`DLQ: Cleaned up ${removed} expired entries`);\n }\n }\n\n /**\n * Get oldest entry\n */\n private getOldest(): DeadLetterEntry | undefined {\n let oldest: DeadLetterEntry | undefined;\n\n for (const entry of this.entries.values()) {\n if (!oldest || entry.addedAt < oldest.addedAt) {\n oldest = entry;\n }\n }\n\n return oldest;\n }\n\n /**\n * Stop cleanup timer\n */\n close(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n }\n\n /**\n * Export entries for persistence\n */\n export(): DeadLetterEntry[] {\n return Array.from(this.entries.values()).map((e) => ({\n ...e,\n addedAt: e.addedAt,\n }));\n }\n\n /**\n * Import entries from persistence\n */\n import(entries: DeadLetterEntry[]): void {\n for (const entry of entries) {\n this.entries.set(entry.id, {\n ...entry,\n addedAt: new Date(entry.addedAt),\n });\n }\n this.logger.info(`DLQ: Imported ${entries.length} entries`);\n }\n}\n\n/**\n * Create a dead letter queue\n */\nexport function createDeadLetterQueue(\n options?: DeadLetterQueueOptions\n): DeadLetterQueue {\n return new DeadLetterQueue(options);\n}\n"],"mappings":"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","names":["generateId","createLogger","generateId","sleep","createLogger","createLogger","formatTraceparent","parseTraceparent","createLogger","createLogger","createLogger","generateId","createLogger","createLogger","createLogger","createLogger","createLogger","generateId"]}
|
|
1
|
+
{"version":3,"sources":["../src/define.ts","../src/client.ts","../src/config.ts","../src/rpc/client.ts","../src/rpc/errors.ts","../src/resilience/circuit-breaker.ts","../src/resilience/bulkhead.ts","../src/resilience/retry.ts","../src/resilience/timeout.ts","../src/rpc/transports/embedded.ts","../src/serialization/index.ts","../src/rpc/transports/http.ts","../src/events/transports/memory.ts","../src/events/handler.ts","../src/events/format.ts","../src/tracing/tracer.ts","../src/tracing/context.ts","../src/tracing/spans.ts","../src/tracing/exporters.ts","../src/rpc/server.ts","../src/events/emitter.ts","../src/events/dead-letter.ts"],"sourcesContent":["/**\n * @parsrun/service - Service Definition\n * Factory function for defining services\n */\n\nimport type {\n ServiceDefinition,\n QueryDefinition,\n MutationDefinition,\n EventDefinition,\n} from \"./types.js\";\n\n// ============================================================================\n// SERVICE DEFINITION FACTORY\n// ============================================================================\n\n/**\n * Define a service with type-safe queries, mutations, and events\n *\n * @example\n * ```typescript\n * const paymentsService = defineService({\n * name: 'payments',\n * version: '1.0.0',\n *\n * queries: {\n * getSubscription: {\n * input: { subscriptionId: 'string' },\n * output: { status: 'string', plan: 'string' },\n * },\n * },\n *\n * mutations: {\n * subscribe: {\n * input: { email: 'string', planId: 'string' },\n * output: { checkoutUrl: 'string' },\n * },\n * },\n *\n * events: {\n * emits: {\n * 'subscription.created': {\n * data: { customerId: 'string', planId: 'string' },\n * delivery: 'at-least-once',\n * },\n * },\n * handles: ['user.deleted', 'tenant.suspended'],\n * },\n * });\n * ```\n */\nexport function defineService<\n TQueries extends Record<string, QueryDefinition> = Record<string, QueryDefinition>,\n TMutations extends Record<string, MutationDefinition> = Record<string, MutationDefinition>,\n TEmits extends Record<string, EventDefinition> = Record<string, EventDefinition>,\n THandles extends string[] = string[],\n>(\n definition: ServiceDefinition<TQueries, TMutations, TEmits, THandles>\n): ServiceDefinition<TQueries, TMutations, TEmits, THandles> {\n // Validate service definition\n validateServiceDefinition(definition);\n\n // Freeze the definition to prevent mutation\n return Object.freeze({\n ...definition,\n queries: definition.queries ? Object.freeze({ ...definition.queries }) : undefined,\n mutations: definition.mutations ? Object.freeze({ ...definition.mutations }) : undefined,\n events: definition.events\n ? Object.freeze({\n emits: definition.events.emits\n ? Object.freeze({ ...definition.events.emits })\n : undefined,\n handles: definition.events.handles\n ? Object.freeze([...definition.events.handles])\n : undefined,\n })\n : undefined,\n }) as ServiceDefinition<TQueries, TMutations, TEmits, THandles>;\n}\n\n/**\n * Validate service definition\n */\nfunction validateServiceDefinition(definition: ServiceDefinition): void {\n if (!definition.name) {\n throw new Error(\"Service name is required\");\n }\n\n if (!definition.version) {\n throw new Error(\"Service version is required\");\n }\n\n // Validate version format (semver-like)\n const versionRegex = /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.]+)?$/;\n if (!versionRegex.test(definition.version)) {\n throw new Error(`Invalid version format: ${definition.version}. Expected semver (e.g., 1.0.0)`);\n }\n\n // Validate query/mutation names (no dots or special chars)\n const nameRegex = /^[a-zA-Z][a-zA-Z0-9_]*$/;\n\n if (definition.queries) {\n for (const name of Object.keys(definition.queries)) {\n if (!nameRegex.test(name)) {\n throw new Error(\n `Invalid query name: ${name}. Must start with letter and contain only alphanumeric and underscore`\n );\n }\n }\n }\n\n if (definition.mutations) {\n for (const name of Object.keys(definition.mutations)) {\n if (!nameRegex.test(name)) {\n throw new Error(\n `Invalid mutation name: ${name}. Must start with letter and contain only alphanumeric and underscore`\n );\n }\n }\n }\n\n // Validate event names (dot notation allowed)\n const eventNameRegex = /^[a-zA-Z][a-zA-Z0-9_.]*$/;\n\n if (definition.events?.emits) {\n for (const name of Object.keys(definition.events.emits)) {\n if (!eventNameRegex.test(name)) {\n throw new Error(\n `Invalid event name: ${name}. Must start with letter and contain only alphanumeric, underscore, and dot`\n );\n }\n }\n }\n\n if (definition.events?.handles) {\n for (const name of definition.events.handles) {\n if (!eventNameRegex.test(name)) {\n throw new Error(\n `Invalid handled event name: ${name}. Must start with letter and contain only alphanumeric, underscore, and dot`\n );\n }\n }\n }\n}\n\n// ============================================================================\n// SERVICE DEFINITION UTILITIES\n// ============================================================================\n\n/**\n * Get all method names from a service definition.\n *\n * @param definition - The service definition\n * @returns Object containing arrays of query and mutation names\n */\nexport function getServiceMethods(definition: ServiceDefinition): {\n queries: string[];\n mutations: string[];\n} {\n return {\n queries: definition.queries ? Object.keys(definition.queries) : [],\n mutations: definition.mutations ? Object.keys(definition.mutations) : [],\n };\n}\n\n/**\n * Get all event types from a service definition.\n *\n * @param definition - The service definition\n * @returns Object containing arrays of emitted and handled event types\n */\nexport function getServiceEvents(definition: ServiceDefinition): {\n emits: string[];\n handles: string[];\n} {\n return {\n emits: definition.events?.emits ? Object.keys(definition.events.emits) : [],\n handles: definition.events?.handles ?? [],\n };\n}\n\n/**\n * Check if a service version satisfies a version requirement.\n * Supports wildcards (x or *) in version requirements.\n *\n * @param version - The actual version to check\n * @param requirement - The version requirement with optional wildcards\n * @returns True if the version satisfies the requirement\n *\n * @example\n * ```typescript\n * satisfiesVersion('1.2.3', '1.x') // true\n * satisfiesVersion('1.2.3', '1.2.x') // true\n * satisfiesVersion('2.0.0', '1.x') // false\n * ```\n */\nexport function satisfiesVersion(version: string, requirement: string): boolean {\n const versionParts = version.split(\".\").map((p) => parseInt(p, 10));\n const requirementParts = requirement.split(\".\");\n\n for (let i = 0; i < requirementParts.length; i++) {\n const req = requirementParts[i];\n if (req === \"x\" || req === \"*\") {\n continue;\n }\n\n const reqNum = parseInt(req ?? \"0\", 10);\n const verNum = versionParts[i] ?? 0;\n\n if (verNum !== reqNum) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Check if a method is deprecated in the service definition.\n *\n * @param definition - The service definition\n * @param methodName - Name of the method to check\n * @param type - Type of method (\"query\" or \"mutation\")\n * @returns Object with deprecation status and optional metadata\n */\nexport function isMethodDeprecated(\n definition: ServiceDefinition,\n methodName: string,\n type: \"query\" | \"mutation\"\n): { deprecated: boolean; since?: string; replacement?: string } {\n const methods = type === \"query\" ? definition.queries : definition.mutations;\n const method = methods?.[methodName];\n\n if (!method?.deprecated) {\n return { deprecated: false };\n }\n\n const result: { deprecated: boolean; since?: string; replacement?: string } = {\n deprecated: true,\n since: method.deprecated,\n };\n\n if (method.replacement) {\n result.replacement = method.replacement;\n }\n\n return result;\n}\n\n/**\n * Get method timeout from the service definition.\n * Uses method-specific timeout if defined, otherwise falls back to default.\n *\n * @param definition - The service definition\n * @param methodName - Name of the method\n * @param type - Type of method (\"query\" or \"mutation\")\n * @param defaultTimeout - Default timeout to use if not specified\n * @returns Timeout value in milliseconds\n */\nexport function getMethodTimeout(\n definition: ServiceDefinition,\n methodName: string,\n type: \"query\" | \"mutation\",\n defaultTimeout: number\n): number {\n const methods = type === \"query\" ? definition.queries : definition.mutations;\n const method = methods?.[methodName];\n\n return method?.timeout ?? defaultTimeout;\n}\n","/**\n * @parsrun/service - Service Client\n * High-level client API for consuming services\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { generateId } from \"@parsrun/core\";\nimport type {\n ServiceDefinition,\n ServiceClient,\n ServiceClientOptions,\n ServiceConfig,\n RpcTransport,\n EventTransport,\n EventHandler,\n EventHandlerOptions,\n Unsubscribe,\n ParsEvent,\n QueryInput,\n QueryOutput,\n MutationInput,\n MutationOutput,\n EventData,\n} from \"./types.js\";\nimport { mergeConfig } from \"./config.js\";\nimport { RpcClient } from \"./rpc/client.js\";\nimport { getEmbeddedRegistry } from \"./rpc/transports/embedded.js\";\nimport { createHttpTransport } from \"./rpc/transports/http.js\";\nimport { createMemoryEventTransport, getGlobalEventBus } from \"./events/transports/memory.js\";\nimport { Tracer, getGlobalTracer } from \"./tracing/tracer.js\";\n\n// ============================================================================\n// SERVICE CLIENT IMPLEMENTATION\n// ============================================================================\n\n/**\n * Full service client with RPC and Events\n */\nclass ServiceClientImpl<TDef extends ServiceDefinition> implements ServiceClient<TDef> {\n readonly name: string;\n private readonly rpcClient: RpcClient;\n private readonly eventTransport: EventTransport;\n private readonly config: Required<ServiceConfig>;\n private readonly tracer: Tracer | null;\n\n constructor(\n definition: TDef,\n rpcTransport: RpcTransport,\n eventTransport: EventTransport,\n config: ServiceConfig,\n _logger?: Logger\n ) {\n this.name = definition.name;\n this.config = mergeConfig(config);\n this.tracer = getGlobalTracer();\n\n this.rpcClient = new RpcClient({\n service: definition.name,\n transport: rpcTransport,\n config: this.config,\n });\n\n this.eventTransport = eventTransport;\n }\n\n /**\n * Execute a query\n */\n async query<K extends keyof TDef[\"queries\"]>(\n method: K,\n input: QueryInput<TDef[\"queries\"], K>\n ): Promise<QueryOutput<TDef[\"queries\"], K>> {\n const methodName = String(method);\n const traceContext = this.tracer?.currentContext();\n\n // Trace if available\n if (this.tracer && traceContext) {\n return this.tracer.trace(\n `rpc.${this.name}.${methodName}`,\n async () => {\n return this.rpcClient.query(methodName, input, {\n traceContext,\n }) as Promise<QueryOutput<TDef[\"queries\"], K>>;\n },\n { kind: \"client\" }\n ) as Promise<QueryOutput<TDef[\"queries\"], K>>;\n }\n\n return this.rpcClient.query(methodName, input) as Promise<QueryOutput<TDef[\"queries\"], K>>;\n }\n\n /**\n * Execute a mutation\n */\n async mutate<K extends keyof TDef[\"mutations\"]>(\n method: K,\n input: MutationInput<TDef[\"mutations\"], K>\n ): Promise<MutationOutput<TDef[\"mutations\"], K>> {\n const methodName = String(method);\n const traceContext = this.tracer?.currentContext();\n\n // Trace if available\n if (this.tracer && traceContext) {\n return this.tracer.trace(\n `rpc.${this.name}.${methodName}`,\n async () => {\n return this.rpcClient.mutate(methodName, input, {\n traceContext,\n }) as Promise<MutationOutput<TDef[\"mutations\"], K>>;\n },\n { kind: \"client\" }\n ) as Promise<MutationOutput<TDef[\"mutations\"], K>>;\n }\n\n return this.rpcClient.mutate(methodName, input) as Promise<MutationOutput<TDef[\"mutations\"], K>>;\n }\n\n /**\n * Emit an event\n */\n async emit<K extends keyof NonNullable<TDef[\"events\"]>[\"emits\"]>(\n eventType: K,\n data: EventData<NonNullable<TDef[\"events\"]>[\"emits\"], K>\n ): Promise<void> {\n const type = String(eventType);\n const traceContext = this.tracer?.currentContext();\n\n const event: ParsEvent = {\n specversion: \"1.0\",\n type,\n source: this.name,\n id: generateId(),\n time: new Date().toISOString(),\n data,\n };\n\n // Add trace context if available\n if (traceContext) {\n event.parstracecontext = `00-${traceContext.traceId}-${traceContext.spanId}-01`;\n }\n\n await this.eventTransport.emit(event);\n }\n\n /**\n * Subscribe to events\n */\n on<T = unknown>(\n eventType: string,\n handler: EventHandler<T>,\n options?: EventHandlerOptions\n ): Unsubscribe {\n return this.eventTransport.subscribe(eventType, handler as EventHandler, options);\n }\n\n /**\n * Get circuit breaker state\n */\n getCircuitState(): \"closed\" | \"open\" | \"half-open\" | null {\n return this.rpcClient.getCircuitState();\n }\n\n /**\n * Close the client\n */\n async close(): Promise<void> {\n await this.rpcClient.close();\n await this.eventTransport.close?.();\n }\n}\n\n// ============================================================================\n// USE SERVICE FACTORY\n// ============================================================================\n\n/**\n * Create a service client\n *\n * @example\n * ```typescript\n * // Embedded mode (same process)\n * const payments = useService('payments');\n *\n * // HTTP mode (remote service)\n * const payments = useService('payments', {\n * mode: 'http',\n * baseUrl: 'https://payments.example.com',\n * });\n *\n * // Cloudflare binding mode\n * const payments = useService('payments', {\n * mode: 'binding',\n * binding: env.PAYMENTS,\n * });\n * ```\n */\nexport function useService<TDef extends ServiceDefinition = ServiceDefinition>(\n serviceName: string,\n options: ServiceClientOptions = {}\n): ServiceClient<TDef> {\n const mode = options.mode ?? \"embedded\";\n const config = options.config ?? {};\n\n let rpcTransport: RpcTransport;\n let eventTransport: EventTransport;\n\n switch (mode) {\n case \"embedded\": {\n // Use embedded registry\n const registry = getEmbeddedRegistry();\n if (!registry.has(serviceName)) {\n throw new Error(\n `Service not found in embedded registry: ${serviceName}. ` +\n `Make sure the service is registered before using it.`\n );\n }\n rpcTransport = registry.createTransport(serviceName);\n\n // Use global event bus\n const eventBus = getGlobalEventBus();\n const services = eventBus.getServices();\n if (services.includes(serviceName)) {\n // Get existing transport from bus\n eventTransport = createMemoryEventTransport();\n } else {\n eventTransport = createMemoryEventTransport();\n }\n break;\n }\n\n case \"http\": {\n if (!options.baseUrl) {\n throw new Error(\"baseUrl is required for HTTP mode\");\n }\n rpcTransport = createHttpTransport({\n baseUrl: options.baseUrl,\n });\n // Events over HTTP would need webhook or polling - use memory for now\n eventTransport = createMemoryEventTransport();\n break;\n }\n\n case \"binding\": {\n if (!options.binding) {\n throw new Error(\"binding is required for binding mode\");\n }\n // Cloudflare service binding transport\n rpcTransport = createBindingTransport(serviceName, options.binding);\n eventTransport = createMemoryEventTransport();\n break;\n }\n\n default:\n throw new Error(`Unknown service client mode: ${mode}`);\n }\n\n // Use custom transports if provided\n if (options.rpcTransport) {\n rpcTransport = options.rpcTransport;\n }\n if (options.eventTransport) {\n eventTransport = options.eventTransport;\n }\n\n // Create a minimal definition for the client\n const definition: ServiceDefinition = {\n name: serviceName,\n version: \"1.x\",\n };\n\n return new ServiceClientImpl<TDef>(\n definition as TDef,\n rpcTransport,\n eventTransport,\n config\n );\n}\n\n/**\n * Create a typed service client from a service definition.\n * Provides full type safety for queries, mutations, and events.\n *\n * @param definition - The service definition\n * @param options - Client configuration options\n * @returns A typed service client\n *\n * @example\n * ```typescript\n * const payments = useTypedService(paymentsServiceDefinition, {\n * mode: 'http',\n * baseUrl: 'https://payments.example.com',\n * });\n * // Full type safety for all operations\n * const sub = await payments.query('getSubscription', { subscriptionId: '123' });\n * ```\n */\nexport function useTypedService<TDef extends ServiceDefinition>(\n definition: TDef,\n options: ServiceClientOptions = {}\n): ServiceClient<TDef> {\n return useService<TDef>(definition.name, options);\n}\n\n// ============================================================================\n// BINDING TRANSPORT HELPER\n// ============================================================================\n\nimport type { Fetcher, RpcRequest, RpcResponse } from \"./types.js\";\n\n/**\n * Create RPC transport for Cloudflare service binding\n */\nfunction createBindingTransport(_serviceName: string, binding: Fetcher): RpcTransport {\n return {\n name: \"binding\",\n async call<TInput, TOutput>(request: RpcRequest<TInput>) {\n const response = await binding.fetch(\"http://internal/rpc\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Request-ID\": request.id,\n \"X-Service\": request.service,\n \"X-Method\": request.method,\n },\n body: JSON.stringify(request),\n });\n\n return response.json() as Promise<RpcResponse<TOutput>>;\n },\n async close() {\n // No cleanup needed for bindings\n },\n };\n}\n\n// ============================================================================\n// SERVICE REGISTRY CLIENT\n// ============================================================================\n\n/**\n * Service registry for managing multiple service clients\n */\nexport class ServiceRegistry {\n private readonly clients: Map<string, ServiceClient> = new Map();\n private readonly config: ServiceConfig;\n\n constructor(config?: ServiceConfig) {\n this.config = config ?? {};\n }\n\n /**\n * Get or create a service client\n */\n get<TDef extends ServiceDefinition = ServiceDefinition>(\n serviceName: string,\n options?: ServiceClientOptions\n ): ServiceClient<TDef> {\n let client = this.clients.get(serviceName);\n if (!client) {\n client = useService<TDef>(serviceName, {\n ...options,\n config: { ...this.config, ...options?.config },\n });\n this.clients.set(serviceName, client);\n }\n return client as ServiceClient<TDef>;\n }\n\n /**\n * Close all clients\n */\n async closeAll(): Promise<void> {\n const closePromises = Array.from(this.clients.values()).map((client) => {\n if (\"close\" in client && typeof client.close === \"function\") {\n return (client as { close: () => Promise<void> }).close();\n }\n return Promise.resolve();\n });\n await Promise.all(closePromises);\n this.clients.clear();\n }\n}\n\n/**\n * Create a service registry for managing multiple service clients.\n *\n * @param config - Optional shared configuration for all clients\n * @returns A new service registry instance\n *\n * @example\n * ```typescript\n * const registry = createServiceRegistry({ tracing: { enabled: true } });\n * const payments = registry.get('payments');\n * const users = registry.get('users');\n * // Later, clean up all connections\n * await registry.closeAll();\n * ```\n */\nexport function createServiceRegistry(config?: ServiceConfig): ServiceRegistry {\n return new ServiceRegistry(config);\n}\n","/**\n * @parsrun/service - Configuration\n * Default configuration and config utilities\n */\n\nimport type {\n ServiceConfig,\n EventFormatConfig,\n SerializationConfig,\n TracingConfig,\n VersioningConfig,\n ResilienceConfig,\n DeadLetterConfig,\n} from \"./types.js\";\n\n// ============================================================================\n// DEFAULT CONFIGURATIONS\n// ============================================================================\n\n/**\n * Default event format configuration.\n * Uses CloudEvents format with compact internal communication.\n */\nexport const DEFAULT_EVENT_CONFIG: Required<EventFormatConfig> = {\n format: \"cloudevents\",\n internalCompact: true,\n};\n\n/**\n * Default serialization configuration.\n * Uses JSON format for data encoding.\n */\nexport const DEFAULT_SERIALIZATION_CONFIG: Required<SerializationConfig> = {\n format: \"json\",\n};\n\n/**\n * Default tracing configuration.\n * Enables tracing with 10% sampling ratio and console exporter.\n */\nexport const DEFAULT_TRACING_CONFIG: Required<TracingConfig> = {\n enabled: true,\n sampler: { ratio: 0.1 },\n exporter: \"console\",\n endpoint: \"\",\n serviceName: \"pars-service\",\n};\n\n/**\n * Default versioning configuration.\n * Uses header-based versioning with \"1.x\" as the default version.\n */\nexport const DEFAULT_VERSIONING_CONFIG: Required<VersioningConfig> = {\n strategy: \"header\",\n defaultVersion: \"1.x\",\n};\n\n/**\n * Default resilience configuration.\n * Configures circuit breaker, bulkhead, timeout, and retry settings.\n */\nexport const DEFAULT_RESILIENCE_CONFIG: Required<ResilienceConfig> = {\n circuitBreaker: {\n enabled: true,\n failureThreshold: 5,\n resetTimeout: 30_000,\n successThreshold: 2,\n },\n bulkhead: {\n maxConcurrent: 100,\n maxQueue: 50,\n },\n timeout: 5_000,\n retry: {\n attempts: 3,\n backoff: \"exponential\",\n initialDelay: 100,\n maxDelay: 10_000,\n },\n};\n\n/**\n * Default dead letter queue configuration.\n * Enables DLQ with 30-day retention and alerting at 10 messages.\n */\nexport const DEFAULT_DEAD_LETTER_CONFIG: Required<DeadLetterConfig> = {\n enabled: true,\n retention: \"30d\",\n onFail: \"alert\",\n alertThreshold: 10,\n};\n\n/**\n * Default complete service configuration.\n * Combines all default sub-configurations.\n */\nexport const DEFAULT_SERVICE_CONFIG: Required<ServiceConfig> = {\n events: DEFAULT_EVENT_CONFIG,\n serialization: DEFAULT_SERIALIZATION_CONFIG,\n tracing: DEFAULT_TRACING_CONFIG,\n versioning: DEFAULT_VERSIONING_CONFIG,\n resilience: DEFAULT_RESILIENCE_CONFIG,\n deadLetter: DEFAULT_DEAD_LETTER_CONFIG,\n};\n\n// ============================================================================\n// CONFIG UTILITIES\n// ============================================================================\n\n/**\n * Merge user config with defaults.\n * Deep merges the user configuration with default values.\n *\n * @param userConfig - Optional partial service configuration\n * @returns Complete service configuration with all required fields\n */\nexport function mergeConfig(userConfig?: Partial<ServiceConfig>): Required<ServiceConfig> {\n if (!userConfig) {\n return { ...DEFAULT_SERVICE_CONFIG };\n }\n\n return {\n events: {\n ...DEFAULT_EVENT_CONFIG,\n ...userConfig.events,\n },\n serialization: {\n ...DEFAULT_SERIALIZATION_CONFIG,\n ...userConfig.serialization,\n },\n tracing: {\n ...DEFAULT_TRACING_CONFIG,\n ...userConfig.tracing,\n },\n versioning: {\n ...DEFAULT_VERSIONING_CONFIG,\n ...userConfig.versioning,\n },\n resilience: {\n ...DEFAULT_RESILIENCE_CONFIG,\n ...userConfig.resilience,\n circuitBreaker: {\n ...DEFAULT_RESILIENCE_CONFIG.circuitBreaker,\n ...userConfig.resilience?.circuitBreaker,\n },\n bulkhead: {\n ...DEFAULT_RESILIENCE_CONFIG.bulkhead,\n ...userConfig.resilience?.bulkhead,\n },\n retry: {\n ...DEFAULT_RESILIENCE_CONFIG.retry,\n ...userConfig.resilience?.retry,\n },\n },\n deadLetter: {\n ...DEFAULT_DEAD_LETTER_CONFIG,\n ...userConfig.deadLetter,\n },\n };\n}\n\n/**\n * Create configuration optimized for development.\n * Enables full tracing, disables circuit breaker, and uses longer timeouts.\n *\n * @param overrides - Optional configuration overrides\n * @returns Complete service configuration for development\n */\nexport function createDevConfig(overrides?: Partial<ServiceConfig>): Required<ServiceConfig> {\n return mergeConfig({\n tracing: {\n enabled: true,\n sampler: \"always\",\n exporter: \"console\",\n },\n resilience: {\n circuitBreaker: { enabled: false },\n timeout: 30_000,\n },\n ...overrides,\n });\n}\n\n/**\n * Create configuration optimized for production.\n * Uses 10% sampling ratio, OTLP exporter, and enables circuit breaker.\n *\n * @param overrides - Optional configuration overrides\n * @returns Complete service configuration for production\n */\nexport function createProdConfig(overrides?: Partial<ServiceConfig>): Required<ServiceConfig> {\n return mergeConfig({\n tracing: {\n enabled: true,\n sampler: { ratio: 0.1 },\n exporter: \"otlp\",\n },\n resilience: {\n circuitBreaker: { enabled: true },\n timeout: 5_000,\n },\n ...overrides,\n });\n}\n\n/**\n * Validate service configuration.\n * Checks for valid ranges and values in the configuration.\n *\n * @param config - Service configuration to validate\n * @returns Object containing validation result and any error messages\n */\nexport function validateConfig(config: ServiceConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // Validate tracing\n if (config.tracing?.sampler && typeof config.tracing.sampler === \"object\") {\n const ratio = config.tracing.sampler.ratio;\n if (ratio < 0 || ratio > 1) {\n errors.push(\"tracing.sampler.ratio must be between 0 and 1\");\n }\n }\n\n // Validate resilience\n if (config.resilience?.timeout !== undefined && config.resilience.timeout < 0) {\n errors.push(\"resilience.timeout must be non-negative\");\n }\n\n if (config.resilience?.circuitBreaker?.failureThreshold !== undefined) {\n if (config.resilience.circuitBreaker.failureThreshold < 1) {\n errors.push(\"resilience.circuitBreaker.failureThreshold must be at least 1\");\n }\n }\n\n if (config.resilience?.bulkhead?.maxConcurrent !== undefined) {\n if (config.resilience.bulkhead.maxConcurrent < 1) {\n errors.push(\"resilience.bulkhead.maxConcurrent must be at least 1\");\n }\n }\n\n if (config.resilience?.retry?.attempts !== undefined) {\n if (config.resilience.retry.attempts < 0) {\n errors.push(\"resilience.retry.attempts must be non-negative\");\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","/**\n * @parsrun/service - RPC Client\n * Client for making RPC calls to services\n */\n\nimport { generateId } from \"@parsrun/core\";\nimport type {\n RpcRequest,\n RpcTransport,\n RpcMetadata,\n TraceContext,\n ServiceConfig,\n} from \"../types.js\";\nimport { mergeConfig } from \"../config.js\";\nimport { TimeoutError, toRpcError } from \"./errors.js\";\nimport {\n CircuitBreaker,\n Bulkhead,\n withRetry,\n withTimeout,\n} from \"../resilience/index.js\";\n\n// ============================================================================\n// RPC CLIENT\n// ============================================================================\n\n/**\n * Options for creating an RPC client.\n */\nexport interface RpcClientOptions {\n /** Service name */\n service: string;\n /** RPC transport */\n transport: RpcTransport;\n /** Service configuration */\n config?: ServiceConfig;\n /** Default metadata for all requests */\n defaultMetadata?: RpcMetadata;\n}\n\n/**\n * RPC Client for making service calls\n */\nexport class RpcClient {\n private readonly service: string;\n private readonly transport: RpcTransport;\n private readonly config: Required<ServiceConfig>;\n private readonly defaultMetadata: RpcMetadata;\n private readonly circuitBreaker: CircuitBreaker | null;\n private readonly bulkhead: Bulkhead | null;\n\n constructor(options: RpcClientOptions) {\n this.service = options.service;\n this.transport = options.transport;\n this.config = mergeConfig(options.config);\n this.defaultMetadata = options.defaultMetadata ?? {};\n\n // Initialize circuit breaker\n const cbConfig = this.config.resilience?.circuitBreaker;\n if (\n cbConfig &&\n cbConfig.enabled &&\n cbConfig.failureThreshold !== undefined &&\n cbConfig.resetTimeout !== undefined &&\n cbConfig.successThreshold !== undefined\n ) {\n this.circuitBreaker = new CircuitBreaker({\n failureThreshold: cbConfig.failureThreshold,\n resetTimeout: cbConfig.resetTimeout,\n successThreshold: cbConfig.successThreshold,\n });\n } else {\n this.circuitBreaker = null;\n }\n\n // Initialize bulkhead\n const bhConfig = this.config.resilience?.bulkhead;\n if (bhConfig && bhConfig.maxConcurrent !== undefined && bhConfig.maxQueue !== undefined) {\n this.bulkhead = new Bulkhead({\n maxConcurrent: bhConfig.maxConcurrent,\n maxQueue: bhConfig.maxQueue,\n });\n } else {\n this.bulkhead = null;\n }\n }\n\n /**\n * Execute a query\n */\n async query<TInput, TOutput>(\n method: string,\n input: TInput,\n options?: CallOptions\n ): Promise<TOutput> {\n return this.call<TInput, TOutput>(\"query\", method, input, options);\n }\n\n /**\n * Execute a mutation\n */\n async mutate<TInput, TOutput>(\n method: string,\n input: TInput,\n options?: CallOptions\n ): Promise<TOutput> {\n return this.call<TInput, TOutput>(\"mutation\", method, input, options);\n }\n\n /**\n * Internal call implementation\n */\n private async call<TInput, TOutput>(\n type: \"query\" | \"mutation\",\n method: string,\n input: TInput,\n options?: CallOptions\n ): Promise<TOutput> {\n const request: RpcRequest<TInput> = {\n id: generateId(),\n service: this.service,\n method,\n type,\n input,\n metadata: {\n ...this.defaultMetadata,\n ...options?.metadata,\n },\n };\n\n const version = options?.version ?? this.config.versioning.defaultVersion;\n if (version) {\n request.version = version;\n }\n if (options?.traceContext) {\n request.traceContext = options.traceContext;\n }\n\n const timeout = options?.timeout ?? this.config.resilience.timeout ?? 30_000;\n const retryConfig = options?.retry ?? this.config.resilience.retry;\n\n // Build the execution chain\n let execute = async (): Promise<TOutput> => {\n const response = await this.transport.call<TInput, TOutput>(request);\n\n if (!response.success) {\n const error = toRpcError(\n new Error(response.error?.message ?? \"Unknown error\")\n );\n throw error;\n }\n\n return response.output as TOutput;\n };\n\n // Wrap with timeout\n execute = withTimeout(execute, timeout, () => {\n throw new TimeoutError(this.service, method, timeout);\n });\n\n // Wrap with retry\n const attempts = retryConfig?.attempts ?? 0;\n if (attempts > 0) {\n execute = withRetry(execute, {\n attempts,\n backoff: retryConfig?.backoff ?? \"exponential\",\n initialDelay: retryConfig?.initialDelay ?? 100,\n maxDelay: retryConfig?.maxDelay ?? 5000,\n shouldRetry: (error) => {\n if (error instanceof Error && \"retryable\" in error) {\n return (error as { retryable: boolean }).retryable;\n }\n return false;\n },\n });\n }\n\n // Wrap with circuit breaker\n if (this.circuitBreaker) {\n const cb = this.circuitBreaker;\n const originalExecute = execute;\n execute = async () => {\n return cb.execute(originalExecute);\n };\n }\n\n // Wrap with bulkhead\n if (this.bulkhead) {\n const bh = this.bulkhead;\n const originalExecute = execute;\n execute = async () => {\n return bh.execute(originalExecute);\n };\n }\n\n return execute();\n }\n\n /**\n * Get circuit breaker state\n */\n getCircuitState(): \"closed\" | \"open\" | \"half-open\" | null {\n return this.circuitBreaker?.state ?? null;\n }\n\n /**\n * Get bulkhead stats\n */\n getBulkheadStats(): { concurrent: number; queued: number } | null {\n if (!this.bulkhead) return null;\n return {\n concurrent: this.bulkhead.concurrent,\n queued: this.bulkhead.queued,\n };\n }\n\n /**\n * Close the client and release resources\n */\n async close(): Promise<void> {\n await this.transport.close?.();\n }\n}\n\n/**\n * Options for individual RPC calls.\n * Allows overriding default client settings per-call.\n */\nexport interface CallOptions {\n /** Timeout in ms */\n timeout?: number;\n /** Version requirement */\n version?: string;\n /** Trace context */\n traceContext?: TraceContext;\n /** Request metadata */\n metadata?: RpcMetadata;\n /** Retry configuration override */\n retry?: {\n attempts?: number;\n backoff?: \"linear\" | \"exponential\";\n initialDelay?: number;\n maxDelay?: number;\n };\n}\n\n/**\n * Create an RPC client for making service calls.\n *\n * @param options - Client configuration options\n * @returns A new RPC client instance\n *\n * @example\n * ```typescript\n * const client = createRpcClient({\n * service: 'payments',\n * transport: httpTransport,\n * config: { resilience: { timeout: 5000 } },\n * });\n * const result = await client.query('getSubscription', { id: '123' });\n * ```\n */\nexport function createRpcClient(options: RpcClientOptions): RpcClient {\n return new RpcClient(options);\n}\n","/**\n * @parsrun/service - RPC Errors\n */\n\nimport { ParsError } from \"@parsrun/core\";\n\n/**\n * Base RPC error\n */\nexport class RpcError extends ParsError {\n public readonly retryable: boolean;\n public readonly retryAfter?: number;\n\n constructor(\n message: string,\n code: string,\n statusCode: number = 500,\n options?: {\n retryable?: boolean;\n retryAfter?: number;\n details?: Record<string, unknown>;\n }\n ) {\n super(message, code, statusCode, options?.details);\n this.name = \"RpcError\";\n this.retryable = options?.retryable ?? false;\n if (options?.retryAfter !== undefined) {\n this.retryAfter = options.retryAfter;\n }\n }\n}\n\n/**\n * Service not found error\n */\nexport class ServiceNotFoundError extends RpcError {\n constructor(serviceName: string) {\n super(`Service not found: ${serviceName}`, \"SERVICE_NOT_FOUND\", 404, {\n retryable: false,\n details: { service: serviceName },\n });\n this.name = \"ServiceNotFoundError\";\n }\n}\n\n/**\n * Method not found error\n */\nexport class MethodNotFoundError extends RpcError {\n constructor(serviceName: string, methodName: string) {\n super(\n `Method not found: ${serviceName}.${methodName}`,\n \"METHOD_NOT_FOUND\",\n 404,\n {\n retryable: false,\n details: { service: serviceName, method: methodName },\n }\n );\n this.name = \"MethodNotFoundError\";\n }\n}\n\n/**\n * Version mismatch error\n */\nexport class VersionMismatchError extends RpcError {\n constructor(serviceName: string, requested: string, available: string) {\n super(\n `Version mismatch for ${serviceName}: requested ${requested}, available ${available}`,\n \"VERSION_MISMATCH\",\n 400,\n {\n retryable: false,\n details: { service: serviceName, requested, available },\n }\n );\n this.name = \"VersionMismatchError\";\n }\n}\n\n/**\n * Timeout error\n */\nexport class TimeoutError extends RpcError {\n constructor(serviceName: string, methodName: string, timeoutMs: number) {\n super(\n `Request to ${serviceName}.${methodName} timed out after ${timeoutMs}ms`,\n \"TIMEOUT\",\n 504,\n {\n retryable: true,\n details: { service: serviceName, method: methodName, timeout: timeoutMs },\n }\n );\n this.name = \"TimeoutError\";\n }\n}\n\n/**\n * Circuit breaker open error\n */\nexport class CircuitOpenError extends RpcError {\n constructor(serviceName: string, resetAfterMs: number) {\n super(\n `Circuit breaker open for ${serviceName}`,\n \"CIRCUIT_OPEN\",\n 503,\n {\n retryable: true,\n retryAfter: Math.ceil(resetAfterMs / 1000),\n details: { service: serviceName, resetAfterMs },\n }\n );\n this.name = \"CircuitOpenError\";\n }\n}\n\n/**\n * Bulkhead rejected error\n */\nexport class BulkheadRejectedError extends RpcError {\n constructor(serviceName: string) {\n super(\n `Request rejected by bulkhead for ${serviceName}: too many concurrent requests`,\n \"BULKHEAD_REJECTED\",\n 503,\n {\n retryable: true,\n retryAfter: 1,\n details: { service: serviceName },\n }\n );\n this.name = \"BulkheadRejectedError\";\n }\n}\n\n/**\n * Transport error\n */\nexport class TransportError extends RpcError {\n constructor(message: string, cause?: Error) {\n const options: { retryable: boolean; details?: Record<string, unknown> } = {\n retryable: true,\n };\n if (cause) {\n options.details = { cause: cause.message };\n }\n super(message, \"TRANSPORT_ERROR\", 502, options);\n this.name = \"TransportError\";\n }\n}\n\n/**\n * Serialization error\n */\nexport class SerializationError extends RpcError {\n constructor(message: string, cause?: Error) {\n const options: { retryable: boolean; details?: Record<string, unknown> } = {\n retryable: false,\n };\n if (cause) {\n options.details = { cause: cause.message };\n }\n super(message, \"SERIALIZATION_ERROR\", 400, options);\n this.name = \"SerializationError\";\n }\n}\n\n/**\n * Convert unknown error to RpcError\n */\nexport function toRpcError(error: unknown): RpcError {\n if (error instanceof RpcError) {\n return error;\n }\n\n if (error instanceof Error) {\n return new RpcError(error.message, \"INTERNAL_ERROR\", 500, {\n retryable: false,\n details: { originalError: error.name },\n });\n }\n\n return new RpcError(String(error), \"UNKNOWN_ERROR\", 500, {\n retryable: false,\n });\n}\n","/**\n * @parsrun/service - Circuit Breaker\n * Prevents cascading failures by failing fast when a service is unhealthy\n */\n\nimport { CircuitOpenError } from \"../rpc/errors.js\";\n\n// ============================================================================\n// CIRCUIT BREAKER\n// ============================================================================\n\n/**\n * Options for configuring a circuit breaker.\n */\nexport interface CircuitBreakerOptions {\n /** Number of failures before opening circuit */\n failureThreshold: number;\n /** Time to wait before half-open state (ms) */\n resetTimeout: number;\n /** Number of successes in half-open to close circuit */\n successThreshold: number;\n /** Optional callback on state change */\n onStateChange?: (from: CircuitState, to: CircuitState) => void;\n}\n\n/**\n * Circuit breaker state.\n * - \"closed\": Normal operation, requests pass through\n * - \"open\": Failing fast, requests are rejected immediately\n * - \"half-open\": Testing if service recovered, limited requests allowed\n */\nexport type CircuitState = \"closed\" | \"open\" | \"half-open\";\n\n/**\n * Circuit Breaker implementation\n *\n * States:\n * - CLOSED: Normal operation, requests pass through\n * - OPEN: Failing fast, requests are rejected immediately\n * - HALF-OPEN: Testing if service recovered, limited requests allowed\n */\nexport class CircuitBreaker {\n private _state: CircuitState = \"closed\";\n private failures = 0;\n private successes = 0;\n private lastFailureTime = 0;\n private readonly options: CircuitBreakerOptions;\n\n constructor(options: CircuitBreakerOptions) {\n this.options = options;\n }\n\n /**\n * Get current state\n */\n get state(): CircuitState {\n // Check if we should transition from open to half-open\n if (this._state === \"open\") {\n const timeSinceFailure = Date.now() - this.lastFailureTime;\n if (timeSinceFailure >= this.options.resetTimeout) {\n this.transitionTo(\"half-open\");\n }\n }\n return this._state;\n }\n\n /**\n * Execute a function with circuit breaker protection\n */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n // Check state (this may transition from open to half-open)\n const currentState = this.state;\n\n if (currentState === \"open\") {\n const resetAfter = this.options.resetTimeout - (Date.now() - this.lastFailureTime);\n throw new CircuitOpenError(\"service\", Math.max(0, resetAfter));\n }\n\n try {\n const result = await fn();\n this.onSuccess();\n return result;\n } catch (error) {\n this.onFailure();\n throw error;\n }\n }\n\n /**\n * Record a successful call\n */\n private onSuccess(): void {\n if (this._state === \"half-open\") {\n this.successes++;\n if (this.successes >= this.options.successThreshold) {\n this.transitionTo(\"closed\");\n }\n } else if (this._state === \"closed\") {\n // Reset failure count on success\n this.failures = 0;\n }\n }\n\n /**\n * Record a failed call\n */\n private onFailure(): void {\n this.lastFailureTime = Date.now();\n\n if (this._state === \"half-open\") {\n // Any failure in half-open goes back to open\n this.transitionTo(\"open\");\n } else if (this._state === \"closed\") {\n this.failures++;\n if (this.failures >= this.options.failureThreshold) {\n this.transitionTo(\"open\");\n }\n }\n }\n\n /**\n * Transition to a new state\n */\n private transitionTo(newState: CircuitState): void {\n const oldState = this._state;\n this._state = newState;\n\n // Reset counters on state change\n if (newState === \"closed\") {\n this.failures = 0;\n this.successes = 0;\n } else if (newState === \"half-open\") {\n this.successes = 0;\n }\n\n this.options.onStateChange?.(oldState, newState);\n }\n\n /**\n * Manually reset the circuit breaker\n */\n reset(): void {\n this.transitionTo(\"closed\");\n }\n\n /**\n * Get circuit breaker statistics\n */\n getStats(): {\n state: CircuitState;\n failures: number;\n successes: number;\n lastFailureTime: number;\n } {\n return {\n state: this.state,\n failures: this.failures,\n successes: this.successes,\n lastFailureTime: this.lastFailureTime,\n };\n }\n}\n","/**\n * @parsrun/service - Bulkhead\n * Limits concurrent requests to prevent resource exhaustion\n */\n\nimport { BulkheadRejectedError } from \"../rpc/errors.js\";\n\n// ============================================================================\n// BULKHEAD\n// ============================================================================\n\n/**\n * Options for configuring a bulkhead.\n */\nexport interface BulkheadOptions {\n /** Maximum concurrent requests */\n maxConcurrent: number;\n /** Maximum queue size (0 = no queue) */\n maxQueue: number;\n /** Optional callback when request is rejected */\n onRejected?: () => void;\n}\n\ninterface QueuedRequest<T> {\n fn: () => Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Bulkhead implementation\n *\n * Limits the number of concurrent requests to protect resources.\n * Excess requests can be queued up to maxQueue limit.\n */\nexport class Bulkhead {\n private _concurrent = 0;\n private readonly queue: QueuedRequest<unknown>[] = [];\n private readonly options: BulkheadOptions;\n\n constructor(options: BulkheadOptions) {\n this.options = options;\n }\n\n /**\n * Get current concurrent count\n */\n get concurrent(): number {\n return this._concurrent;\n }\n\n /**\n * Get current queue size\n */\n get queued(): number {\n return this.queue.length;\n }\n\n /**\n * Check if bulkhead is full\n */\n get isFull(): boolean {\n return (\n this._concurrent >= this.options.maxConcurrent &&\n this.queue.length >= this.options.maxQueue\n );\n }\n\n /**\n * Execute a function with bulkhead protection\n */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n // Check if we can execute immediately\n if (this._concurrent < this.options.maxConcurrent) {\n return this.doExecute(fn);\n }\n\n // Check if we can queue\n if (this.queue.length < this.options.maxQueue) {\n return this.enqueue(fn);\n }\n\n // Reject\n this.options.onRejected?.();\n throw new BulkheadRejectedError(\"service\");\n }\n\n /**\n * Execute immediately\n */\n private async doExecute<T>(fn: () => Promise<T>): Promise<T> {\n this._concurrent++;\n try {\n return await fn();\n } finally {\n this._concurrent--;\n this.processQueue();\n }\n }\n\n /**\n * Add to queue\n */\n private enqueue<T>(fn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n this.queue.push({\n fn,\n resolve: resolve as (value: unknown) => void,\n reject,\n });\n });\n }\n\n /**\n * Process queued requests\n */\n private processQueue(): void {\n if (this.queue.length === 0) return;\n if (this._concurrent >= this.options.maxConcurrent) return;\n\n const queued = this.queue.shift();\n if (!queued) return;\n\n this.doExecute(queued.fn)\n .then(queued.resolve)\n .catch(queued.reject);\n }\n\n /**\n * Get bulkhead statistics\n */\n getStats(): {\n concurrent: number;\n queued: number;\n maxConcurrent: number;\n maxQueue: number;\n } {\n return {\n concurrent: this._concurrent,\n queued: this.queue.length,\n maxConcurrent: this.options.maxConcurrent,\n maxQueue: this.options.maxQueue,\n };\n }\n\n /**\n * Clear the queue (reject all pending)\n */\n clearQueue(): void {\n const error = new BulkheadRejectedError(\"service\");\n while (this.queue.length > 0) {\n const queued = this.queue.shift();\n queued?.reject(error);\n }\n }\n}\n","/**\n * @parsrun/service - Retry\n * Retry failed operations with backoff\n */\n\n// ============================================================================\n// RETRY\n// ============================================================================\n\n/**\n * Options for configuring retry behavior.\n */\nexport interface RetryOptions {\n /** Number of retry attempts (not including initial attempt) */\n attempts: number;\n /** Backoff strategy */\n backoff: \"linear\" | \"exponential\";\n /** Initial delay in ms */\n initialDelay: number;\n /** Maximum delay in ms */\n maxDelay: number;\n /** Jitter factor (0-1) to add randomness */\n jitter?: number;\n /** Should retry predicate */\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n /** Callback on retry */\n onRetry?: (error: unknown, attempt: number, delay: number) => void;\n}\n\n/**\n * Default retry predicate - retry on retryable errors\n */\nconst defaultShouldRetry = (error: unknown): boolean => {\n if (error && typeof error === \"object\" && \"retryable\" in error) {\n return (error as { retryable: boolean }).retryable;\n }\n return false;\n};\n\n/**\n * Calculate delay for retry attempt\n */\nfunction calculateDelay(\n attempt: number,\n options: RetryOptions\n): number {\n let delay: number;\n\n if (options.backoff === \"exponential\") {\n // Exponential backoff: initialDelay * 2^attempt\n delay = options.initialDelay * Math.pow(2, attempt);\n } else {\n // Linear backoff: initialDelay * (attempt + 1)\n delay = options.initialDelay * (attempt + 1);\n }\n\n // Apply max delay\n delay = Math.min(delay, options.maxDelay);\n\n // Apply jitter\n if (options.jitter && options.jitter > 0) {\n const jitterRange = delay * options.jitter;\n delay = delay - jitterRange / 2 + Math.random() * jitterRange;\n }\n\n return Math.round(delay);\n}\n\n/**\n * Sleep for a given duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Wrap a function with retry logic.\n * Returns a new function that will retry on failure.\n *\n * @param fn - The function to wrap\n * @param options - Retry configuration\n * @returns A wrapped function with retry behavior\n *\n * @example\n * ```typescript\n * const fetchWithRetry = withRetry(\n * () => fetch('/api/data'),\n * { attempts: 3, backoff: 'exponential', initialDelay: 100, maxDelay: 5000 }\n * );\n * const response = await fetchWithRetry();\n * ```\n */\nexport function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions\n): () => Promise<T> {\n const shouldRetry = options.shouldRetry ?? defaultShouldRetry;\n\n return async (): Promise<T> => {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= options.attempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Check if we should retry\n if (attempt >= options.attempts || !shouldRetry(error, attempt)) {\n throw error;\n }\n\n // Calculate delay\n const delay = calculateDelay(attempt, options);\n\n // Callback\n options.onRetry?.(error, attempt + 1, delay);\n\n // Wait before retry\n await sleep(delay);\n }\n }\n\n throw lastError;\n };\n}\n\n/**\n * Execute a function with retry logic immediately.\n *\n * @param fn - The function to execute\n * @param options - Retry configuration\n * @returns Promise resolving to the function result\n */\nexport async function executeWithRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions\n): Promise<T> {\n return withRetry(fn, options)();\n}\n\n/**\n * Create a reusable retry wrapper with preset default options.\n *\n * @param defaultOptions - Default retry configuration\n * @returns A function that executes with retry using the defaults\n *\n * @example\n * ```typescript\n * const retry = createRetryWrapper({ attempts: 3, backoff: 'exponential' });\n * const result = await retry(() => fetchData());\n * ```\n */\nexport function createRetryWrapper(\n defaultOptions: Partial<RetryOptions>\n): <T>(fn: () => Promise<T>, options?: Partial<RetryOptions>) => Promise<T> {\n const defaults: RetryOptions = {\n attempts: defaultOptions.attempts ?? 3,\n backoff: defaultOptions.backoff ?? \"exponential\",\n initialDelay: defaultOptions.initialDelay ?? 100,\n maxDelay: defaultOptions.maxDelay ?? 10_000,\n jitter: defaultOptions.jitter ?? 0.1,\n };\n\n if (defaultOptions.shouldRetry) {\n defaults.shouldRetry = defaultOptions.shouldRetry;\n }\n if (defaultOptions.onRetry) {\n defaults.onRetry = defaultOptions.onRetry;\n }\n\n return async <T>(\n fn: () => Promise<T>,\n options?: Partial<RetryOptions>\n ): Promise<T> => {\n return executeWithRetry(fn, { ...defaults, ...options });\n };\n}\n","/**\n * @parsrun/service - Timeout\n * Timeout wrapper for async operations\n */\n\n// ============================================================================\n// TIMEOUT\n// ============================================================================\n\n/**\n * Error thrown when an operation exceeds its timeout.\n */\nexport class TimeoutExceededError extends Error {\n /** The timeout value in milliseconds that was exceeded */\n readonly timeout: number;\n\n constructor(timeout: number) {\n super(`Operation timed out after ${timeout}ms`);\n this.name = \"TimeoutExceededError\";\n this.timeout = timeout;\n }\n}\n\n/**\n * Wrap a function with a timeout.\n * Returns a new function that will reject if the timeout is exceeded.\n *\n * @param fn - The function to wrap\n * @param timeoutMs - Timeout in milliseconds\n * @param onTimeout - Optional callback or throw function when timeout occurs\n * @returns A wrapped function with timeout behavior\n */\nexport function withTimeout<T>(\n fn: () => Promise<T>,\n timeoutMs: number,\n onTimeout?: () => void | never\n): () => Promise<T> {\n return async (): Promise<T> => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n if (onTimeout) {\n try {\n onTimeout();\n } catch (error) {\n reject(error);\n return;\n }\n }\n reject(new TimeoutExceededError(timeoutMs));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([fn(), timeoutPromise]);\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n }\n };\n}\n\n/**\n * Execute a function with timeout immediately.\n *\n * @param fn - The function to execute\n * @param timeoutMs - Timeout in milliseconds\n * @param onTimeout - Optional callback or throw function when timeout occurs\n * @returns Promise resolving to the function result or rejecting on timeout\n */\nexport async function executeWithTimeout<T>(\n fn: () => Promise<T>,\n timeoutMs: number,\n onTimeout?: () => void | never\n): Promise<T> {\n return withTimeout(fn, timeoutMs, onTimeout)();\n}\n\n/**\n * Create a reusable timeout wrapper with preset duration.\n *\n * @param defaultTimeoutMs - Default timeout in milliseconds\n * @returns A function that executes with timeout\n */\nexport function createTimeoutWrapper(\n defaultTimeoutMs: number\n): <T>(fn: () => Promise<T>, timeoutMs?: number) => Promise<T> {\n return async <T>(fn: () => Promise<T>, timeoutMs?: number): Promise<T> => {\n return executeWithTimeout(fn, timeoutMs ?? defaultTimeoutMs);\n };\n}\n\n/**\n * Race multiple promises with a timeout.\n * Returns the first promise to resolve, or rejects on timeout.\n *\n * @param promises - Array of promises to race\n * @param timeoutMs - Timeout in milliseconds\n * @returns Promise resolving to the first result\n */\nexport async function raceWithTimeout<T>(\n promises: Promise<T>[],\n timeoutMs: number\n): Promise<T> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new TimeoutExceededError(timeoutMs));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([...promises, timeoutPromise]);\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n }\n}\n\n/**\n * Execute a function with an absolute deadline.\n * Converts the deadline to a relative timeout.\n *\n * @param fn - The function to execute\n * @param deadline - Absolute deadline as a Date\n * @returns Promise resolving to the function result\n */\nexport async function executeWithDeadline<T>(\n fn: () => Promise<T>,\n deadline: Date\n): Promise<T> {\n const now = Date.now();\n const deadlineMs = deadline.getTime();\n const timeoutMs = Math.max(0, deadlineMs - now);\n\n if (timeoutMs === 0) {\n throw new TimeoutExceededError(0);\n }\n\n return executeWithTimeout(fn, timeoutMs);\n}\n","/**\n * @parsrun/service - Embedded RPC Transport\n * Direct function call transport for monolithic/embedded mode\n */\n\nimport type { RpcRequest, RpcResponse, RpcTransport } from \"../../types.js\";\nimport type { RpcServer } from \"../server.js\";\n\n// ============================================================================\n// EMBEDDED TRANSPORT\n// ============================================================================\n\n/**\n * Embedded transport that calls handlers directly\n * Used when services are in the same process\n */\nexport class EmbeddedTransport implements RpcTransport {\n readonly name = \"embedded\";\n private readonly server: RpcServer;\n\n constructor(server: RpcServer) {\n this.server = server;\n }\n\n async call<TInput, TOutput>(request: RpcRequest<TInput>): Promise<RpcResponse<TOutput>> {\n // Direct call to server - no serialization needed\n return this.server.handle<TInput, TOutput>(request);\n }\n\n async close(): Promise<void> {\n // No cleanup needed for embedded transport\n }\n}\n\n/**\n * Create an embedded transport for direct function calls.\n * Used when the service is in the same process.\n *\n * @param server - The RPC server to call directly\n * @returns A new embedded transport instance\n *\n * @example\n * ```typescript\n * const transport = createEmbeddedTransport(rpcServer);\n * const client = createRpcClient({ service: 'payments', transport });\n * ```\n */\nexport function createEmbeddedTransport(server: RpcServer): EmbeddedTransport {\n return new EmbeddedTransport(server);\n}\n\n// ============================================================================\n// EMBEDDED TRANSPORT REGISTRY\n// ============================================================================\n\n/**\n * Registry for embedded services\n * Allows services to find each other in embedded mode\n */\nexport class EmbeddedRegistry {\n private static instance: EmbeddedRegistry | null = null;\n private readonly servers: Map<string, RpcServer> = new Map();\n\n private constructor() {}\n\n static getInstance(): EmbeddedRegistry {\n if (!EmbeddedRegistry.instance) {\n EmbeddedRegistry.instance = new EmbeddedRegistry();\n }\n return EmbeddedRegistry.instance;\n }\n\n /**\n * Register a service\n */\n register(name: string, server: RpcServer): void {\n if (this.servers.has(name)) {\n throw new Error(`Service already registered: ${name}`);\n }\n this.servers.set(name, server);\n }\n\n /**\n * Unregister a service\n */\n unregister(name: string): boolean {\n return this.servers.delete(name);\n }\n\n /**\n * Get a service by name\n */\n get(name: string): RpcServer | undefined {\n return this.servers.get(name);\n }\n\n /**\n * Check if a service is registered\n */\n has(name: string): boolean {\n return this.servers.has(name);\n }\n\n /**\n * Get all registered service names\n */\n getServiceNames(): string[] {\n return Array.from(this.servers.keys());\n }\n\n /**\n * Create a transport for a registered service\n */\n createTransport(name: string): EmbeddedTransport {\n const server = this.servers.get(name);\n if (!server) {\n throw new Error(`Service not found: ${name}`);\n }\n return new EmbeddedTransport(server);\n }\n\n /**\n * Clear all registered services\n */\n clear(): void {\n this.servers.clear();\n }\n\n /**\n * Reset the singleton instance (for testing)\n */\n static reset(): void {\n EmbeddedRegistry.instance = null;\n }\n}\n\n/**\n * Get the global embedded registry singleton.\n * Provides access to the shared registry for service discovery.\n *\n * @returns The global embedded registry instance\n *\n * @example\n * ```typescript\n * const registry = getEmbeddedRegistry();\n * registry.register('payments', paymentsServer);\n * const transport = registry.createTransport('payments');\n * ```\n */\nexport function getEmbeddedRegistry(): EmbeddedRegistry {\n return EmbeddedRegistry.getInstance();\n}\n","/**\n * @parsrun/service - Serialization\n * JSON and MessagePack serializers\n */\n\n// ============================================================================\n// SERIALIZER INTERFACE\n// ============================================================================\n\n/**\n * Serializer interface for encoding/decoding data\n */\nexport interface Serializer {\n /** Encode data to string or buffer */\n encode(data: unknown): string | ArrayBuffer;\n /** Decode string or buffer to data */\n decode(raw: string | ArrayBuffer): unknown;\n /** Content type for HTTP headers */\n contentType: string;\n}\n\n// ============================================================================\n// JSON SERIALIZER\n// ============================================================================\n\n/**\n * JSON serializer (default)\n */\nexport const jsonSerializer: Serializer = {\n encode(data: unknown): string {\n return JSON.stringify(data);\n },\n\n decode(raw: string | ArrayBuffer): unknown {\n if (raw instanceof ArrayBuffer) {\n const decoder = new TextDecoder();\n return JSON.parse(decoder.decode(raw));\n }\n return JSON.parse(raw);\n },\n\n contentType: \"application/json\",\n};\n\n// ============================================================================\n// MESSAGEPACK SERIALIZER (Lightweight implementation)\n// ============================================================================\n\n/**\n * Lightweight MessagePack encoder\n * Supports: null, boolean, number, string, array, object\n */\nfunction msgpackEncode(value: unknown): Uint8Array {\n const parts: Uint8Array[] = [];\n\n function encode(val: unknown): void {\n if (val === null || val === undefined) {\n parts.push(new Uint8Array([0xc0])); // nil\n return;\n }\n\n if (typeof val === \"boolean\") {\n parts.push(new Uint8Array([val ? 0xc3 : 0xc2]));\n return;\n }\n\n if (typeof val === \"number\") {\n if (Number.isInteger(val)) {\n if (val >= 0 && val <= 127) {\n // positive fixint\n parts.push(new Uint8Array([val]));\n } else if (val < 0 && val >= -32) {\n // negative fixint\n parts.push(new Uint8Array([val & 0xff]));\n } else if (val >= 0 && val <= 0xff) {\n // uint8\n parts.push(new Uint8Array([0xcc, val]));\n } else if (val >= 0 && val <= 0xffff) {\n // uint16\n parts.push(new Uint8Array([0xcd, (val >> 8) & 0xff, val & 0xff]));\n } else if (val >= 0 && val <= 0xffffffff) {\n // uint32\n parts.push(\n new Uint8Array([\n 0xce,\n (val >> 24) & 0xff,\n (val >> 16) & 0xff,\n (val >> 8) & 0xff,\n val & 0xff,\n ])\n );\n } else if (val >= -128 && val <= 127) {\n // int8\n parts.push(new Uint8Array([0xd0, val & 0xff]));\n } else if (val >= -32768 && val <= 32767) {\n // int16\n parts.push(new Uint8Array([0xd1, (val >> 8) & 0xff, val & 0xff]));\n } else if (val >= -2147483648 && val <= 2147483647) {\n // int32\n parts.push(\n new Uint8Array([\n 0xd2,\n (val >> 24) & 0xff,\n (val >> 16) & 0xff,\n (val >> 8) & 0xff,\n val & 0xff,\n ])\n );\n } else {\n // Fall back to float64 for large integers\n const buffer = new ArrayBuffer(9);\n const view = new DataView(buffer);\n view.setUint8(0, 0xcb);\n view.setFloat64(1, val, false);\n parts.push(new Uint8Array(buffer));\n }\n } else {\n // float64\n const buffer = new ArrayBuffer(9);\n const view = new DataView(buffer);\n view.setUint8(0, 0xcb);\n view.setFloat64(1, val, false);\n parts.push(new Uint8Array(buffer));\n }\n return;\n }\n\n if (typeof val === \"string\") {\n const encoded = new TextEncoder().encode(val);\n const len = encoded.length;\n\n if (len <= 31) {\n // fixstr\n parts.push(new Uint8Array([0xa0 | len]));\n } else if (len <= 0xff) {\n // str8\n parts.push(new Uint8Array([0xd9, len]));\n } else if (len <= 0xffff) {\n // str16\n parts.push(new Uint8Array([0xda, (len >> 8) & 0xff, len & 0xff]));\n } else {\n // str32\n parts.push(\n new Uint8Array([\n 0xdb,\n (len >> 24) & 0xff,\n (len >> 16) & 0xff,\n (len >> 8) & 0xff,\n len & 0xff,\n ])\n );\n }\n parts.push(encoded);\n return;\n }\n\n if (Array.isArray(val)) {\n const len = val.length;\n\n if (len <= 15) {\n // fixarray\n parts.push(new Uint8Array([0x90 | len]));\n } else if (len <= 0xffff) {\n // array16\n parts.push(new Uint8Array([0xdc, (len >> 8) & 0xff, len & 0xff]));\n } else {\n // array32\n parts.push(\n new Uint8Array([\n 0xdd,\n (len >> 24) & 0xff,\n (len >> 16) & 0xff,\n (len >> 8) & 0xff,\n len & 0xff,\n ])\n );\n }\n\n for (const item of val) {\n encode(item);\n }\n return;\n }\n\n if (typeof val === \"object\") {\n const keys = Object.keys(val as object);\n const len = keys.length;\n\n if (len <= 15) {\n // fixmap\n parts.push(new Uint8Array([0x80 | len]));\n } else if (len <= 0xffff) {\n // map16\n parts.push(new Uint8Array([0xde, (len >> 8) & 0xff, len & 0xff]));\n } else {\n // map32\n parts.push(\n new Uint8Array([\n 0xdf,\n (len >> 24) & 0xff,\n (len >> 16) & 0xff,\n (len >> 8) & 0xff,\n len & 0xff,\n ])\n );\n }\n\n for (const key of keys) {\n encode(key);\n encode((val as Record<string, unknown>)[key]);\n }\n return;\n }\n\n // Unsupported type - encode as null\n parts.push(new Uint8Array([0xc0]));\n }\n\n encode(value);\n\n // Merge all parts\n const totalLength = parts.reduce((sum, p) => sum + p.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n\n return result;\n}\n\n/**\n * Lightweight MessagePack decoder\n */\nfunction msgpackDecode(buffer: Uint8Array): unknown {\n let offset = 0;\n\n function decode(): unknown {\n if (offset >= buffer.length) {\n throw new Error(\"Unexpected end of buffer\");\n }\n\n const byte = buffer[offset++]!;\n\n // Positive fixint (0x00 - 0x7f)\n if (byte <= 0x7f) {\n return byte;\n }\n\n // Negative fixint (0xe0 - 0xff)\n if (byte >= 0xe0) {\n return byte - 256;\n }\n\n // Fixmap (0x80 - 0x8f)\n if (byte >= 0x80 && byte <= 0x8f) {\n const len = byte - 0x80;\n const result: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n const key = decode() as string;\n result[key] = decode();\n }\n return result;\n }\n\n // Fixarray (0x90 - 0x9f)\n if (byte >= 0x90 && byte <= 0x9f) {\n const len = byte - 0x90;\n const result: unknown[] = [];\n for (let i = 0; i < len; i++) {\n result.push(decode());\n }\n return result;\n }\n\n // Fixstr (0xa0 - 0xbf)\n if (byte >= 0xa0 && byte <= 0xbf) {\n const len = byte - 0xa0;\n const str = new TextDecoder().decode(buffer.subarray(offset, offset + len));\n offset += len;\n return str;\n }\n\n switch (byte) {\n case 0xc0: // nil\n return null;\n case 0xc2: // false\n return false;\n case 0xc3: // true\n return true;\n\n case 0xcc: // uint8\n return buffer[offset++];\n case 0xcd: // uint16\n return (buffer[offset++]! << 8) | buffer[offset++]!;\n case 0xce: // uint32\n return (\n ((buffer[offset++]! << 24) >>> 0) +\n (buffer[offset++]! << 16) +\n (buffer[offset++]! << 8) +\n buffer[offset++]!\n );\n\n case 0xd0: // int8\n {\n const val = buffer[offset++]!;\n return val > 127 ? val - 256 : val;\n }\n case 0xd1: // int16\n {\n const val = (buffer[offset++]! << 8) | buffer[offset++]!;\n return val > 32767 ? val - 65536 : val;\n }\n case 0xd2: // int32\n {\n const val =\n (buffer[offset++]! << 24) |\n (buffer[offset++]! << 16) |\n (buffer[offset++]! << 8) |\n buffer[offset++]!;\n return val;\n }\n\n case 0xcb: // float64\n {\n const view = new DataView(buffer.buffer, buffer.byteOffset + offset, 8);\n offset += 8;\n return view.getFloat64(0, false);\n }\n\n case 0xd9: // str8\n {\n const len = buffer[offset++]!;\n const str = new TextDecoder().decode(buffer.subarray(offset, offset + len));\n offset += len;\n return str;\n }\n case 0xda: // str16\n {\n const len = (buffer[offset++]! << 8) | buffer[offset++]!;\n const str = new TextDecoder().decode(buffer.subarray(offset, offset + len));\n offset += len;\n return str;\n }\n case 0xdb: // str32\n {\n const len =\n (buffer[offset++]! << 24) |\n (buffer[offset++]! << 16) |\n (buffer[offset++]! << 8) |\n buffer[offset++]!;\n const str = new TextDecoder().decode(buffer.subarray(offset, offset + len));\n offset += len;\n return str;\n }\n\n case 0xdc: // array16\n {\n const len = (buffer[offset++]! << 8) | buffer[offset++]!;\n const result: unknown[] = [];\n for (let i = 0; i < len; i++) {\n result.push(decode());\n }\n return result;\n }\n case 0xdd: // array32\n {\n const len =\n (buffer[offset++]! << 24) |\n (buffer[offset++]! << 16) |\n (buffer[offset++]! << 8) |\n buffer[offset++]!;\n const result: unknown[] = [];\n for (let i = 0; i < len; i++) {\n result.push(decode());\n }\n return result;\n }\n\n case 0xde: // map16\n {\n const len = (buffer[offset++]! << 8) | buffer[offset++]!;\n const result: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n const key = decode() as string;\n result[key] = decode();\n }\n return result;\n }\n case 0xdf: // map32\n {\n const len =\n (buffer[offset++]! << 24) |\n (buffer[offset++]! << 16) |\n (buffer[offset++]! << 8) |\n buffer[offset++]!;\n const result: Record<string, unknown> = {};\n for (let i = 0; i < len; i++) {\n const key = decode() as string;\n result[key] = decode();\n }\n return result;\n }\n\n default:\n throw new Error(`Unknown MessagePack type: 0x${byte.toString(16)}`);\n }\n }\n\n return decode();\n}\n\n/**\n * MessagePack serializer\n */\nexport const msgpackSerializer: Serializer = {\n encode(data: unknown): ArrayBuffer {\n const encoded = msgpackEncode(data);\n // Create a new ArrayBuffer with the exact bytes from the Uint8Array\n const buffer = new ArrayBuffer(encoded.byteLength);\n new Uint8Array(buffer).set(encoded);\n return buffer;\n },\n\n decode(raw: string | ArrayBuffer): unknown {\n if (typeof raw === \"string\") {\n // If string is passed, assume it's base64 encoded\n const binary = atob(raw);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return msgpackDecode(bytes);\n }\n return msgpackDecode(new Uint8Array(raw));\n },\n\n contentType: \"application/msgpack\",\n};\n\n// ============================================================================\n// SERIALIZER FACTORY\n// ============================================================================\n\n/**\n * Get a serializer by format name.\n *\n * @param format - The serialization format (\"json\" or \"msgpack\")\n * @returns The corresponding serializer instance\n *\n * @example\n * ```typescript\n * const serializer = getSerializer('json');\n * const encoded = serializer.encode({ foo: 'bar' });\n * const decoded = serializer.decode(encoded);\n * ```\n */\nexport function getSerializer(format: \"json\" | \"msgpack\"): Serializer {\n switch (format) {\n case \"json\":\n return jsonSerializer;\n case \"msgpack\":\n return msgpackSerializer;\n default:\n return jsonSerializer;\n }\n}\n\n/**\n * Create a custom serializer with provided encode/decode functions.\n *\n * @param options - Serializer configuration\n * @param options.encode - Function to encode data to string or ArrayBuffer\n * @param options.decode - Function to decode string or ArrayBuffer to data\n * @param options.contentType - HTTP content type for the serialization format\n * @returns A custom serializer instance\n *\n * @example\n * ```typescript\n * const customSerializer = createSerializer({\n * encode: (data) => btoa(JSON.stringify(data)),\n * decode: (raw) => JSON.parse(atob(raw as string)),\n * contentType: 'application/x-custom',\n * });\n * ```\n */\nexport function createSerializer(options: {\n encode: (data: unknown) => string | ArrayBuffer;\n decode: (raw: string | ArrayBuffer) => unknown;\n contentType: string;\n}): Serializer {\n return options;\n}\n","/**\n * @parsrun/service - HTTP RPC Transport\n * HTTP-based transport for distributed services\n */\n\nimport type { RpcRequest, RpcResponse, RpcTransport } from \"../../types.js\";\nimport { type Serializer, jsonSerializer } from \"../../serialization/index.js\";\nimport { TransportError, SerializationError } from \"../errors.js\";\n\n// ============================================================================\n// HTTP TRANSPORT\n// ============================================================================\n\n/**\n * Options for creating an HTTP transport.\n */\nexport interface HttpTransportOptions {\n /** Base URL of the service */\n baseUrl: string;\n /** Custom serializer (default: JSON) */\n serializer?: Serializer;\n /** Custom headers */\n headers?: Record<string, string>;\n /** Fetch function (for testing or custom implementations) */\n fetch?: typeof globalThis.fetch;\n /** Request timeout in ms */\n timeout?: number;\n}\n\n/**\n * HTTP transport for RPC calls over HTTP/HTTPS.\n * Makes POST requests to /rpc endpoint with serialized request body.\n */\nexport class HttpTransport implements RpcTransport {\n readonly name = \"http\";\n private readonly baseUrl: string;\n private readonly serializer: Serializer;\n private readonly headers: Record<string, string>;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly timeout: number;\n\n constructor(options: HttpTransportOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\"); // Remove trailing slash\n this.serializer = options.serializer ?? jsonSerializer;\n this.headers = options.headers ?? {};\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.timeout = options.timeout ?? 30_000;\n }\n\n async call<TInput, TOutput>(request: RpcRequest<TInput>): Promise<RpcResponse<TOutput>> {\n const url = `${this.baseUrl}/rpc`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n // Serialize request\n let body: string | ArrayBuffer;\n try {\n body = this.serializer.encode(request);\n } catch (error) {\n throw new SerializationError(\n \"Failed to serialize request\",\n error instanceof Error ? error : undefined\n );\n }\n\n // Make HTTP request\n const response = await this.fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": this.serializer.contentType,\n Accept: this.serializer.contentType,\n \"X-Request-ID\": request.id,\n \"X-Service\": request.service,\n \"X-Method\": request.method,\n \"X-Method-Type\": request.type,\n ...(request.version ? { \"X-Service-Version\": request.version } : {}),\n ...(request.traceContext\n ? {\n traceparent: formatTraceparent(request.traceContext),\n ...(request.traceContext.traceState\n ? { tracestate: request.traceContext.traceState }\n : {}),\n }\n : {}),\n ...this.headers,\n },\n body: body instanceof ArrayBuffer ? body : body,\n signal: controller.signal,\n });\n\n // Parse response\n let responseData: RpcResponse<TOutput>;\n try {\n const contentType = response.headers.get(\"Content-Type\") ?? \"\";\n if (contentType.includes(\"msgpack\")) {\n const buffer = await response.arrayBuffer();\n responseData = this.serializer.decode(buffer) as RpcResponse<TOutput>;\n } else {\n const text = await response.text();\n responseData = this.serializer.decode(text) as RpcResponse<TOutput>;\n }\n } catch (error) {\n throw new SerializationError(\n \"Failed to deserialize response\",\n error instanceof Error ? error : undefined\n );\n }\n\n return responseData;\n } catch (error) {\n if (error instanceof SerializationError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new TransportError(`Request timeout after ${this.timeout}ms`);\n }\n throw new TransportError(`HTTP request failed: ${error.message}`, error);\n }\n\n throw new TransportError(\"Unknown transport error\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n async close(): Promise<void> {\n // No persistent connection to close\n }\n}\n\n/**\n * Create an HTTP transport for RPC calls.\n *\n * @param options - Transport configuration options\n * @returns A new HTTP transport instance\n *\n * @example\n * ```typescript\n * const transport = createHttpTransport({\n * baseUrl: 'https://api.example.com',\n * timeout: 5000,\n * });\n * ```\n */\nexport function createHttpTransport(options: HttpTransportOptions): HttpTransport {\n return new HttpTransport(options);\n}\n\n// ============================================================================\n// TRACE CONTEXT HELPERS\n// ============================================================================\n\nimport type { TraceContext } from \"../../types.js\";\n\n/**\n * Format trace context as W3C traceparent header\n */\nfunction formatTraceparent(ctx: TraceContext): string {\n const flags = ctx.traceFlags.toString(16).padStart(2, \"0\");\n return `00-${ctx.traceId}-${ctx.spanId}-${flags}`;\n}\n\n/**\n * Parse W3C traceparent header to extract trace context.\n *\n * @param header - The traceparent header value\n * @returns Parsed trace context or null if invalid\n *\n * @example\n * ```typescript\n * const ctx = parseTraceparent('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');\n * // { traceId: '0af7651916cd43dd8448eb211c80319c', spanId: 'b7ad6b7169203331', traceFlags: 1 }\n * ```\n */\nexport function parseTraceparent(header: string): TraceContext | null {\n const parts = header.split(\"-\");\n if (parts.length !== 4) {\n return null;\n }\n\n const [version, traceId, spanId, flags] = parts;\n if (version !== \"00\" || !traceId || !spanId || !flags) {\n return null;\n }\n\n if (traceId.length !== 32 || spanId.length !== 16 || flags.length !== 2) {\n return null;\n }\n\n return {\n traceId,\n spanId,\n traceFlags: parseInt(flags, 16),\n };\n}\n\n// ============================================================================\n// HTTP SERVER ADAPTER\n// ============================================================================\n\nimport type { RpcServer } from \"../server.js\";\n\n/**\n * Create HTTP request handler for RPC server.\n * Can be used with Hono, Express, or any HTTP framework.\n *\n * @param server - The RPC server to handle requests\n * @returns Request handler function for HTTP frameworks\n *\n * @example\n * ```typescript\n * const handler = createHttpHandler(rpcServer);\n * // With Hono\n * app.post('/rpc', (c) => handler(c.req.raw));\n * ```\n */\nexport function createHttpHandler(server: RpcServer) {\n return async (request: Request): Promise<Response> => {\n try {\n // Parse request body\n const contentType = request.headers.get(\"Content-Type\") ?? \"application/json\";\n let body: unknown;\n\n if (contentType.includes(\"msgpack\")) {\n const buffer = await request.arrayBuffer();\n // For msgpack, we'd need to decode - using JSON for now\n body = JSON.parse(new TextDecoder().decode(buffer));\n } else {\n body = await request.json();\n }\n\n const rpcRequest = body as RpcRequest;\n\n // Parse trace context\n const traceparent = request.headers.get(\"traceparent\");\n if (traceparent) {\n const traceContext = parseTraceparent(traceparent);\n if (traceContext) {\n const tracestate = request.headers.get(\"tracestate\");\n if (tracestate) {\n traceContext.traceState = tracestate;\n }\n rpcRequest.traceContext = traceContext;\n }\n }\n\n // Handle request\n const response = await server.handle(rpcRequest);\n\n // Return response\n return new Response(JSON.stringify(response), {\n status: response.success ? 200 : getHttpStatus(response.error?.code),\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Request-ID\": rpcRequest.id,\n },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return new Response(\n JSON.stringify({\n success: false,\n error: {\n code: \"INTERNAL_ERROR\",\n message,\n },\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\n }\n };\n}\n\n/**\n * Map error code to HTTP status\n */\nfunction getHttpStatus(code?: string): number {\n switch (code) {\n case \"METHOD_NOT_FOUND\":\n case \"SERVICE_NOT_FOUND\":\n return 404;\n case \"VERSION_MISMATCH\":\n case \"VALIDATION_ERROR\":\n case \"SERIALIZATION_ERROR\":\n return 400;\n case \"UNAUTHORIZED\":\n return 401;\n case \"FORBIDDEN\":\n return 403;\n case \"TIMEOUT\":\n return 504;\n case \"CIRCUIT_OPEN\":\n case \"BULKHEAD_REJECTED\":\n return 503;\n default:\n return 500;\n }\n}\n","/**\n * @parsrun/service - Memory Event Transport\n * In-memory event transport for embedded mode and testing\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type {\n ParsEvent,\n EventTransport,\n EventHandler,\n EventHandlerOptions,\n Unsubscribe,\n} from \"../../types.js\";\nimport { EventHandlerRegistry, type EventHandlerRegistryOptions } from \"../handler.js\";\n\n// ============================================================================\n// MEMORY EVENT TRANSPORT\n// ============================================================================\n\n/**\n * Options for creating a memory event transport.\n */\nexport interface MemoryEventTransportOptions {\n /** Logger */\n logger?: Logger;\n /** Process events synchronously (default: false) */\n sync?: boolean;\n /** Default handler options */\n defaultHandlerOptions?: EventHandlerOptions;\n}\n\n/**\n * In-memory event transport\n * Events are processed immediately without persistence\n */\nexport class MemoryEventTransport implements EventTransport {\n readonly name = \"memory\";\n private readonly registry: EventHandlerRegistry;\n private readonly logger: Logger;\n private readonly sync: boolean;\n private readonly pendingEvents: ParsEvent[] = [];\n private processing = false;\n\n constructor(options: MemoryEventTransportOptions = {}) {\n this.logger = options.logger ?? createLogger({ name: \"memory-transport\" });\n this.sync = options.sync ?? false;\n\n const registryOptions: EventHandlerRegistryOptions = {\n logger: this.logger,\n };\n if (options.defaultHandlerOptions) {\n registryOptions.defaultOptions = options.defaultHandlerOptions;\n }\n this.registry = new EventHandlerRegistry(registryOptions);\n }\n\n /**\n * Emit an event\n */\n async emit<T>(event: ParsEvent<T>): Promise<void> {\n this.logger.debug(`Event emitted: ${event.type}`, {\n eventId: event.id,\n tenantId: event.parstenantid,\n });\n\n if (this.sync) {\n // Process synchronously\n await this.registry.handle(event);\n } else {\n // Queue for async processing\n this.pendingEvents.push(event);\n this.processQueue();\n }\n }\n\n /**\n * Subscribe to events\n */\n subscribe(\n eventType: string,\n handler: EventHandler,\n options?: EventHandlerOptions\n ): Unsubscribe {\n return this.registry.register(eventType, handler, options);\n }\n\n /**\n * Process pending events asynchronously\n */\n private async processQueue(): Promise<void> {\n if (this.processing) return;\n this.processing = true;\n\n try {\n while (this.pendingEvents.length > 0) {\n const event = this.pendingEvents.shift();\n if (event) {\n await this.registry.handle(event);\n }\n }\n } finally {\n this.processing = false;\n }\n }\n\n /**\n * Wait for all pending events to be processed\n */\n async flush(): Promise<void> {\n while (this.pendingEvents.length > 0 || this.processing) {\n await new Promise((resolve) => setTimeout(resolve, 10));\n }\n }\n\n /**\n * Get pending event count\n */\n get pendingCount(): number {\n return this.pendingEvents.length;\n }\n\n /**\n * Get registered patterns\n */\n getPatterns(): string[] {\n return this.registry.getPatterns();\n }\n\n /**\n * Clear all subscriptions\n */\n clear(): void {\n this.registry.clear();\n this.pendingEvents.length = 0;\n }\n\n /**\n * Close the transport\n */\n async close(): Promise<void> {\n await this.flush();\n this.clear();\n }\n}\n\n/**\n * Create a memory event transport for in-process event handling.\n * Suitable for testing and embedded mode.\n *\n * @param options - Transport configuration options\n * @returns A new memory event transport instance\n *\n * @example\n * ```typescript\n * const transport = createMemoryEventTransport({ sync: true });\n * transport.subscribe('user.created', async (event) => {\n * console.log('User created:', event.data);\n * });\n * await transport.emit({ type: 'user.created', data: { id: '123' } });\n * ```\n */\nexport function createMemoryEventTransport(\n options?: MemoryEventTransportOptions\n): MemoryEventTransport {\n return new MemoryEventTransport(options);\n}\n\n// ============================================================================\n// GLOBAL EVENT BUS (for embedded multi-service)\n// ============================================================================\n\n/**\n * Global event bus for communication between embedded services\n */\nexport class GlobalEventBus {\n private static instance: GlobalEventBus | null = null;\n private readonly transports: Map<string, MemoryEventTransport> = new Map();\n private readonly logger: Logger;\n\n private constructor() {\n this.logger = createLogger({ name: \"global-event-bus\" });\n }\n\n static getInstance(): GlobalEventBus {\n if (!GlobalEventBus.instance) {\n GlobalEventBus.instance = new GlobalEventBus();\n }\n return GlobalEventBus.instance;\n }\n\n /**\n * Register a service's event transport\n */\n register(serviceName: string, transport: MemoryEventTransport): void {\n if (this.transports.has(serviceName)) {\n throw new Error(`Service already registered: ${serviceName}`);\n }\n this.transports.set(serviceName, transport);\n this.logger.debug(`Service registered: ${serviceName}`);\n }\n\n /**\n * Unregister a service\n */\n unregister(serviceName: string): boolean {\n const deleted = this.transports.delete(serviceName);\n if (deleted) {\n this.logger.debug(`Service unregistered: ${serviceName}`);\n }\n return deleted;\n }\n\n /**\n * Broadcast an event to all services (except source)\n */\n async broadcast(event: ParsEvent, excludeSource?: string): Promise<void> {\n const promises: Promise<void>[] = [];\n\n for (const [name, transport] of this.transports) {\n if (name !== excludeSource) {\n promises.push(transport.emit(event));\n }\n }\n\n await Promise.allSettled(promises);\n }\n\n /**\n * Send an event to a specific service\n */\n async send(serviceName: string, event: ParsEvent): Promise<void> {\n const transport = this.transports.get(serviceName);\n if (!transport) {\n this.logger.warn(`Target service not found: ${serviceName}`, {\n eventId: event.id,\n });\n return;\n }\n\n await transport.emit(event);\n }\n\n /**\n * Get all registered service names\n */\n getServices(): string[] {\n return Array.from(this.transports.keys());\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.transports.clear();\n }\n\n /**\n * Reset singleton (for testing)\n */\n static reset(): void {\n GlobalEventBus.instance = null;\n }\n}\n\n/**\n * Get the global event bus singleton.\n * Provides a shared event bus for communication between embedded services.\n *\n * @returns The global event bus instance\n *\n * @example\n * ```typescript\n * const bus = getGlobalEventBus();\n * bus.register('payments', paymentsTransport);\n * await bus.broadcast(event, 'payments'); // Exclude payments\n * ```\n */\nexport function getGlobalEventBus(): GlobalEventBus {\n return GlobalEventBus.getInstance();\n}\n","/**\n * @parsrun/service - Event Handler\n * Event handler registration and execution\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type {\n ParsEvent,\n EventHandler,\n EventHandlerContext,\n EventHandlerOptions,\n Unsubscribe,\n} from \"../types.js\";\nimport { matchEventType } from \"./format.js\";\nimport type { DeadLetterQueue } from \"./dead-letter.js\";\n\n// ============================================================================\n// EVENT HANDLER REGISTRY\n// ============================================================================\n\n/**\n * Resolved handler options with required fields\n */\nexport interface ResolvedHandlerOptions {\n retries: number;\n backoff: \"linear\" | \"exponential\";\n maxDelay: number;\n onExhausted: \"alert\" | \"log\" | \"discard\";\n deadLetter?: string;\n}\n\n/**\n * Registration entry for an event handler.\n */\nexport interface HandlerRegistration {\n /** Event type pattern (supports wildcards) */\n pattern: string;\n /** Handler function */\n handler: EventHandler;\n /** Handler options */\n options: ResolvedHandlerOptions;\n}\n\n/**\n * Options for creating an event handler registry.\n */\nexport interface EventHandlerRegistryOptions {\n /** Logger */\n logger?: Logger;\n /** Dead letter queue */\n deadLetterQueue?: DeadLetterQueue;\n /** Default handler options */\n defaultOptions?: Partial<EventHandlerOptions>;\n}\n\n/**\n * Registry for event handlers\n */\nexport class EventHandlerRegistry {\n private readonly handlers: Map<string, HandlerRegistration[]> = new Map();\n private readonly logger: Logger;\n private readonly deadLetterQueue?: DeadLetterQueue;\n private readonly defaultOptions: ResolvedHandlerOptions;\n\n constructor(options: EventHandlerRegistryOptions = {}) {\n this.logger = options.logger ?? createLogger({ name: \"event-handler\" });\n if (options.deadLetterQueue) {\n this.deadLetterQueue = options.deadLetterQueue;\n }\n const defaultOpts: ResolvedHandlerOptions = {\n retries: options.defaultOptions?.retries ?? 3,\n backoff: options.defaultOptions?.backoff ?? \"exponential\",\n maxDelay: options.defaultOptions?.maxDelay ?? 30_000,\n onExhausted: options.defaultOptions?.onExhausted ?? \"log\",\n };\n if (options.defaultOptions?.deadLetter) {\n defaultOpts.deadLetter = options.defaultOptions.deadLetter;\n }\n this.defaultOptions = defaultOpts;\n }\n\n /**\n * Register an event handler\n */\n register(\n pattern: string,\n handler: EventHandler,\n options?: EventHandlerOptions\n ): Unsubscribe {\n const registration: HandlerRegistration = {\n pattern,\n handler,\n options: {\n ...this.defaultOptions,\n ...options,\n },\n };\n\n const handlers = this.handlers.get(pattern) ?? [];\n handlers.push(registration);\n this.handlers.set(pattern, handlers);\n\n this.logger.debug(`Handler registered for pattern: ${pattern}`);\n\n // Return unsubscribe function\n return () => {\n const currentHandlers = this.handlers.get(pattern);\n if (currentHandlers) {\n const index = currentHandlers.indexOf(registration);\n if (index !== -1) {\n currentHandlers.splice(index, 1);\n if (currentHandlers.length === 0) {\n this.handlers.delete(pattern);\n }\n this.logger.debug(`Handler unregistered for pattern: ${pattern}`);\n }\n }\n };\n }\n\n /**\n * Handle an event\n */\n async handle(event: ParsEvent): Promise<void> {\n const matchingHandlers = this.getMatchingHandlers(event.type);\n\n if (matchingHandlers.length === 0) {\n this.logger.debug(`No handlers for event type: ${event.type}`, {\n eventId: event.id,\n });\n return;\n }\n\n this.logger.debug(`Handling event: ${event.type}`, {\n eventId: event.id,\n handlerCount: matchingHandlers.length,\n });\n\n // Execute handlers in parallel\n const results = await Promise.allSettled(\n matchingHandlers.map((reg) => this.executeHandler(event, reg))\n );\n\n // Log failures\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n if (result?.status === \"rejected\") {\n this.logger.error(\n `Handler failed for ${event.type}`,\n result.reason as Error,\n { eventId: event.id, pattern: matchingHandlers[i]?.pattern }\n );\n }\n }\n }\n\n /**\n * Execute a single handler with retry logic\n */\n private async executeHandler(\n event: ParsEvent,\n registration: HandlerRegistration\n ): Promise<void> {\n const { handler, options } = registration;\n const maxAttempts = options.retries + 1;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const context: EventHandlerContext = {\n logger: this.logger.child({\n eventId: event.id,\n pattern: registration.pattern,\n attempt,\n }),\n attempt,\n maxAttempts,\n isRetry: attempt > 1,\n };\n\n // Add trace context if available\n if (event.parstracecontext) {\n const traceCtx = parseTraceContext(event.parstracecontext);\n if (traceCtx) {\n context.traceContext = traceCtx;\n }\n }\n\n await handler(event, context);\n return; // Success\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < maxAttempts) {\n const delay = this.calculateBackoff(attempt, options);\n this.logger.warn(\n `Handler failed, retrying in ${delay}ms`,\n { eventId: event.id, attempt, maxAttempts }\n );\n await sleep(delay);\n }\n }\n }\n\n // All retries exhausted\n await this.handleExhausted(event, registration, lastError!);\n }\n\n /**\n * Calculate backoff delay\n */\n private calculateBackoff(\n attempt: number,\n options: ResolvedHandlerOptions\n ): number {\n const baseDelay = 100;\n\n if (options.backoff === \"exponential\") {\n return Math.min(baseDelay * Math.pow(2, attempt - 1), options.maxDelay);\n }\n\n // Linear\n return Math.min(baseDelay * attempt, options.maxDelay);\n }\n\n /**\n * Handle exhausted retries\n */\n private async handleExhausted(\n event: ParsEvent,\n registration: HandlerRegistration,\n error: Error\n ): Promise<void> {\n const { options } = registration;\n\n // Send to dead letter queue\n if (options.deadLetter && this.deadLetterQueue) {\n await this.deadLetterQueue.add({\n event,\n error: error.message,\n pattern: registration.pattern,\n attempts: options.retries + 1,\n });\n }\n\n // Handle based on onExhausted option\n switch (options.onExhausted) {\n case \"alert\":\n this.logger.error(\n `[ALERT] Event handler exhausted all retries`,\n error,\n {\n eventId: event.id,\n eventType: event.type,\n pattern: registration.pattern,\n }\n );\n break;\n case \"discard\":\n this.logger.debug(`Event discarded after exhausted retries`, {\n eventId: event.id,\n });\n break;\n case \"log\":\n default:\n this.logger.warn(`Event handler exhausted all retries`, {\n eventId: event.id,\n error: error.message,\n });\n }\n }\n\n /**\n * Get handlers matching an event type\n */\n private getMatchingHandlers(eventType: string): HandlerRegistration[] {\n const matching: HandlerRegistration[] = [];\n\n for (const [pattern, handlers] of this.handlers) {\n if (matchEventType(eventType, pattern)) {\n matching.push(...handlers);\n }\n }\n\n return matching;\n }\n\n /**\n * Get all registered patterns\n */\n getPatterns(): string[] {\n return Array.from(this.handlers.keys());\n }\n\n /**\n * Check if a pattern has handlers\n */\n hasHandlers(pattern: string): boolean {\n return this.handlers.has(pattern);\n }\n\n /**\n * Clear all handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/**\n * Create an event handler registry for managing event subscriptions.\n *\n * @param options - Registry configuration options\n * @returns A new event handler registry instance\n *\n * @example\n * ```typescript\n * const registry = createEventHandlerRegistry({\n * deadLetterQueue: dlq,\n * defaultOptions: { retries: 3 },\n * });\n * registry.register('subscription.*', async (event, ctx) => {\n * console.log('Received event:', event.type);\n * });\n * ```\n */\nexport function createEventHandlerRegistry(\n options?: EventHandlerRegistryOptions\n): EventHandlerRegistry {\n return new EventHandlerRegistry(options);\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseTraceContext(traceparent: string): {\n traceId: string;\n spanId: string;\n traceFlags: number;\n} | undefined {\n const parts = traceparent.split(\"-\");\n if (parts.length !== 4) return undefined;\n\n const [, traceId, spanId, flags] = parts;\n if (!traceId || !spanId || !flags) return undefined;\n\n return {\n traceId,\n spanId,\n traceFlags: parseInt(flags, 16),\n };\n}\n","/**\n * @parsrun/service - Event Format\n * CloudEvents and compact event format utilities\n */\n\nimport { generateId } from \"@parsrun/core\";\nimport type { ParsEvent, CompactEvent, TraceContext } from \"../types.js\";\n\n// ============================================================================\n// EVENT CREATION\n// ============================================================================\n\n/**\n * Options for creating a CloudEvents-compatible event.\n */\nexport interface CreateEventOptions<T = unknown> {\n /** Event type (e.g., \"subscription.created\") */\n type: string;\n /** Source service */\n source: string;\n /** Event data */\n data: T;\n /** Optional event ID (auto-generated if not provided) */\n id?: string;\n /** Optional subject */\n subject?: string;\n /** Tenant ID */\n tenantId?: string;\n /** Request ID for correlation */\n requestId?: string;\n /** Trace context */\n traceContext?: TraceContext;\n /** Delivery guarantee */\n delivery?: \"at-most-once\" | \"at-least-once\";\n}\n\n/**\n * Create a CloudEvents-compatible event.\n *\n * @param options - Event creation options\n * @returns A new ParsEvent conforming to CloudEvents spec\n */\nexport function createEvent<T = unknown>(options: CreateEventOptions<T>): ParsEvent<T> {\n const event: ParsEvent<T> = {\n specversion: \"1.0\",\n type: options.type,\n source: options.source,\n id: options.id ?? generateId(),\n time: new Date().toISOString(),\n datacontenttype: \"application/json\",\n data: options.data,\n };\n\n if (options.subject) event.subject = options.subject;\n if (options.tenantId) event.parstenantid = options.tenantId;\n if (options.requestId) event.parsrequestid = options.requestId;\n if (options.traceContext) event.parstracecontext = formatTraceContext(options.traceContext);\n if (options.delivery) event.parsdelivery = options.delivery;\n\n return event;\n}\n\n// ============================================================================\n// FORMAT CONVERSION\n// ============================================================================\n\n/**\n * Convert to full CloudEvents format (creates a copy).\n *\n * @param event - The event to convert\n * @returns A copy of the event in CloudEvents format\n */\nexport function toCloudEvent<T>(event: ParsEvent<T>): ParsEvent<T> {\n return { ...event };\n}\n\n/**\n * Convert to compact internal format for efficient transport.\n *\n * @param event - The CloudEvents event to convert\n * @returns A compact representation of the event\n */\nexport function toCompactEvent<T>(event: ParsEvent<T>): CompactEvent<T> {\n const compact: CompactEvent<T> = {\n e: event.type,\n s: event.source,\n i: event.id,\n t: new Date(event.time).getTime(),\n d: event.data,\n };\n\n if (event.parstracecontext) compact.ctx = event.parstracecontext;\n if (event.parstenantid) compact.tid = event.parstenantid;\n\n return compact;\n}\n\n/**\n * Convert from compact format to CloudEvents format.\n *\n * @param compact - The compact event to convert\n * @param source - Optional source override\n * @returns A full CloudEvents event\n */\nexport function fromCompactEvent<T>(compact: CompactEvent<T>, source?: string): ParsEvent<T> {\n const event: ParsEvent<T> = {\n specversion: \"1.0\",\n type: compact.e,\n source: source ?? compact.s,\n id: compact.i,\n time: new Date(compact.t).toISOString(),\n datacontenttype: \"application/json\",\n data: compact.d,\n };\n\n if (compact.ctx) event.parstracecontext = compact.ctx;\n if (compact.tid) event.parstenantid = compact.tid;\n\n return event;\n}\n\n// ============================================================================\n// EVENT TYPE UTILITIES\n// ============================================================================\n\n/**\n * Format full event type with source prefix.\n *\n * @param source - The source service name\n * @param type - The event type\n * @returns Fully qualified event type\n *\n * @example\n * ```typescript\n * formatEventType('payments', 'subscription.created')\n * // Returns: 'com.pars.payments.subscription.created'\n * ```\n */\nexport function formatEventType(source: string, type: string): string {\n return `com.pars.${source}.${type}`;\n}\n\n/**\n * Parse event type to extract source and type.\n *\n * @param fullType - The fully qualified event type\n * @returns Parsed source and type, or null if invalid\n *\n * @example\n * ```typescript\n * parseEventType('com.pars.payments.subscription.created')\n * // Returns: { source: 'payments', type: 'subscription.created' }\n * ```\n */\nexport function parseEventType(fullType: string): { source: string; type: string } | null {\n const prefix = \"com.pars.\";\n if (!fullType.startsWith(prefix)) {\n // Try to parse as simple type (source.type)\n const parts = fullType.split(\".\");\n if (parts.length >= 2) {\n const [source, ...rest] = parts;\n return { source: source!, type: rest.join(\".\") };\n }\n return null;\n }\n\n const withoutPrefix = fullType.slice(prefix.length);\n const dotIndex = withoutPrefix.indexOf(\".\");\n if (dotIndex === -1) {\n return null;\n }\n\n return {\n source: withoutPrefix.slice(0, dotIndex),\n type: withoutPrefix.slice(dotIndex + 1),\n };\n}\n\n/**\n * Check if event type matches a pattern.\n * Supports wildcards: * matches one segment, ** matches multiple segments.\n *\n * @param type - The event type to check\n * @param pattern - The pattern to match against\n * @returns True if the type matches the pattern\n *\n * @example\n * ```typescript\n * matchEventType('subscription.created', 'subscription.*') // true\n * matchEventType('payment.invoice.paid', 'payment.**') // true\n * matchEventType('subscription.created', 'payment.*') // false\n * ```\n */\nexport function matchEventType(type: string, pattern: string): boolean {\n if (pattern === \"*\" || pattern === \"**\") {\n return true;\n }\n\n const typeParts = type.split(\".\");\n const patternParts = pattern.split(\".\");\n\n let ti = 0;\n let pi = 0;\n\n while (ti < typeParts.length && pi < patternParts.length) {\n const pp = patternParts[pi];\n\n if (pp === \"**\") {\n // ** matches rest of type\n if (pi === patternParts.length - 1) {\n return true;\n }\n // Try to match remaining pattern\n for (let i = ti; i <= typeParts.length; i++) {\n const remaining = typeParts.slice(i).join(\".\");\n const remainingPattern = patternParts.slice(pi + 1).join(\".\");\n if (matchEventType(remaining, remainingPattern)) {\n return true;\n }\n }\n return false;\n }\n\n if (pp === \"*\") {\n // * matches single segment\n ti++;\n pi++;\n continue;\n }\n\n if (pp !== typeParts[ti]) {\n return false;\n }\n\n ti++;\n pi++;\n }\n\n return ti === typeParts.length && pi === patternParts.length;\n}\n\n// ============================================================================\n// TRACE CONTEXT HELPERS\n// ============================================================================\n\n/**\n * Format trace context to W3C traceparent string\n */\nfunction formatTraceContext(ctx: TraceContext): string {\n const flags = ctx.traceFlags.toString(16).padStart(2, \"0\");\n return `00-${ctx.traceId}-${ctx.spanId}-${flags}`;\n}\n\n/**\n * Parse W3C traceparent string to trace context.\n *\n * @param traceparent - The traceparent header value\n * @returns Parsed trace context, or null if invalid\n */\nexport function parseTraceContext(traceparent: string): TraceContext | null {\n const parts = traceparent.split(\"-\");\n if (parts.length !== 4) {\n return null;\n }\n\n const [version, traceId, spanId, flags] = parts;\n if (version !== \"00\" || !traceId || !spanId || !flags) {\n return null;\n }\n\n return {\n traceId,\n spanId,\n traceFlags: parseInt(flags, 16),\n };\n}\n\n// ============================================================================\n// VALIDATION\n// ============================================================================\n\n/**\n * Validate that an object conforms to CloudEvents structure.\n *\n * @param event - The object to validate\n * @returns True if the object is a valid ParsEvent\n */\nexport function validateEvent(event: unknown): event is ParsEvent {\n if (!event || typeof event !== \"object\") {\n return false;\n }\n\n const e = event as Record<string, unknown>;\n\n // Required fields\n if (e[\"specversion\"] !== \"1.0\") return false;\n if (typeof e[\"type\"] !== \"string\" || (e[\"type\"] as string).length === 0) return false;\n if (typeof e[\"source\"] !== \"string\" || (e[\"source\"] as string).length === 0) return false;\n if (typeof e[\"id\"] !== \"string\" || (e[\"id\"] as string).length === 0) return false;\n if (typeof e[\"time\"] !== \"string\") return false;\n\n return true;\n}\n\n/**\n * Validate that an object conforms to compact event structure.\n *\n * @param event - The object to validate\n * @returns True if the object is a valid CompactEvent\n */\nexport function validateCompactEvent(event: unknown): event is CompactEvent {\n if (!event || typeof event !== \"object\") {\n return false;\n }\n\n const e = event as Record<string, unknown>;\n\n if (typeof e[\"e\"] !== \"string\" || (e[\"e\"] as string).length === 0) return false;\n if (typeof e[\"s\"] !== \"string\" || (e[\"s\"] as string).length === 0) return false;\n if (typeof e[\"i\"] !== \"string\" || (e[\"i\"] as string).length === 0) return false;\n if (typeof e[\"t\"] !== \"number\") return false;\n\n return true;\n}\n","/**\n * @parsrun/service - Tracer\n * High-level tracing API\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type { Span, TraceContext, SpanKind, SpanAttributeValue } from \"../types.js\";\nimport type { TracingConfig } from \"../types.js\";\nimport {\n TraceContextManager,\n shouldSample,\n type Sampler,\n} from \"./context.js\";\nimport { SpanManager, SpanAttributes } from \"./spans.js\";\nimport type { SpanExporter } from \"./exporters.js\";\nimport { ConsoleExporter } from \"./exporters.js\";\n\n// ============================================================================\n// TRACER\n// ============================================================================\n\n/**\n * Options for creating a tracer.\n */\nexport interface TracerOptions {\n /** Service name */\n serviceName: string;\n /** Service version */\n serviceVersion?: string;\n /** Tracing config */\n config?: TracingConfig;\n /** Span exporter */\n exporter?: SpanExporter;\n /** Logger */\n logger?: Logger;\n}\n\n/**\n * Main tracer class for distributed tracing\n */\nexport class Tracer {\n private readonly serviceName: string;\n private readonly serviceVersion: string;\n private readonly sampler: Sampler;\n private readonly exporter: SpanExporter;\n private readonly logger: Logger;\n private readonly contextManager: TraceContextManager;\n private readonly spanManager: SpanManager;\n private readonly enabled: boolean;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: TracerOptions) {\n this.serviceName = options.serviceName;\n this.serviceVersion = options.serviceVersion ?? \"1.0.0\";\n this.enabled = options.config?.enabled ?? true;\n this.sampler = options.config?.sampler ?? { ratio: 0.1 };\n this.exporter = options.exporter ?? new ConsoleExporter();\n this.logger = options.logger ?? createLogger({ name: `tracer:${options.serviceName}` });\n this.contextManager = new TraceContextManager();\n this.spanManager = new SpanManager();\n\n // Auto-flush spans periodically\n if (this.enabled) {\n this.flushTimer = setInterval(() => this.flush(), 5000);\n }\n }\n\n /**\n * Start a new span\n */\n startSpan(\n name: string,\n options?: {\n kind?: SpanKind;\n parent?: TraceContext;\n attributes?: Record<string, SpanAttributeValue>;\n }\n ): Span | null {\n if (!this.enabled) return null;\n\n // Get parent from options or current context\n const parent = options?.parent ?? this.contextManager.current();\n\n // Check sampling\n if (!parent && !shouldSample(this.sampler)) {\n return null;\n }\n\n const spanOptions: Parameters<typeof this.spanManager.startSpan>[0] = {\n name,\n kind: options?.kind ?? \"internal\",\n attributes: {\n [SpanAttributes.SERVICE_NAME]: this.serviceName,\n [SpanAttributes.SERVICE_VERSION]: this.serviceVersion,\n ...options?.attributes,\n },\n };\n\n if (parent) {\n spanOptions.parent = parent;\n }\n\n const span = this.spanManager.startSpan(spanOptions);\n\n return span;\n }\n\n /**\n * End a span\n */\n endSpan(span: Span | null, error?: Error): void {\n if (!span) return;\n\n if (error) {\n this.spanManager.recordException(span, error);\n }\n\n this.spanManager.endSpan(span, error ? \"error\" : \"ok\");\n }\n\n /**\n * Run a function with automatic span creation\n */\n async trace<T>(\n name: string,\n fn: (span: Span | null) => Promise<T>,\n options?: {\n kind?: SpanKind;\n attributes?: Record<string, SpanAttributeValue>;\n }\n ): Promise<T> {\n const span = this.startSpan(name, options);\n\n if (!span) {\n return fn(null);\n }\n\n try {\n const result = await this.contextManager.run(span.traceContext, () => fn(span));\n this.endSpan(span);\n return result;\n } catch (error) {\n this.endSpan(span, error as Error);\n throw error;\n }\n }\n\n /**\n * Add attribute to current span\n */\n setAttribute(key: string, value: SpanAttributeValue): void {\n const ctx = this.contextManager.current();\n if (!ctx) return;\n\n const span = this.spanManager.getSpan(ctx.spanId);\n if (span) {\n this.spanManager.setAttribute(span, key, value);\n }\n }\n\n /**\n * Add event to current span\n */\n addEvent(name: string, attributes?: Record<string, SpanAttributeValue>): void {\n const ctx = this.contextManager.current();\n if (!ctx) return;\n\n const span = this.spanManager.getSpan(ctx.spanId);\n if (span) {\n this.spanManager.addEvent(span, name, attributes);\n }\n }\n\n /**\n * Get current trace context\n */\n currentContext(): TraceContext | undefined {\n return this.contextManager.current();\n }\n\n /**\n * Get context manager for advanced use\n */\n getContextManager(): TraceContextManager {\n return this.contextManager;\n }\n\n /**\n * Extract trace context from incoming request\n */\n extract(headers: Headers | Record<string, string>): TraceContext | undefined {\n return this.contextManager.fromHeaders(headers);\n }\n\n /**\n * Inject trace context into outgoing request headers\n */\n inject(ctx?: TraceContext): Record<string, string> {\n const context = ctx ?? this.contextManager.current();\n if (!context) return {};\n return this.contextManager.toHeaders(context);\n }\n\n /**\n * Flush completed spans to exporter\n */\n async flush(): Promise<void> {\n const spans = this.spanManager.flush();\n if (spans.length > 0) {\n try {\n await this.exporter.export(spans);\n } catch (error) {\n this.logger.error(\"Failed to export spans\", error as Error);\n }\n }\n }\n\n /**\n * Shutdown tracer\n */\n async shutdown(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n await this.flush();\n await this.exporter.shutdown();\n this.spanManager.clear();\n this.contextManager.clear();\n }\n}\n\n/**\n * Create a tracer for distributed tracing.\n *\n * @param options - Tracer configuration options\n * @returns A new tracer instance\n *\n * @example\n * ```typescript\n * const tracer = createTracer({\n * serviceName: 'payments',\n * config: { sampler: { ratio: 0.1 } },\n * });\n * await tracer.trace('processPayment', async (span) => {\n * // Processing logic\n * });\n * ```\n */\nexport function createTracer(options: TracerOptions): Tracer {\n return new Tracer(options);\n}\n\n// ============================================================================\n// GLOBAL TRACER\n// ============================================================================\n\nlet globalTracer: Tracer | null = null;\n\n/**\n * Get the global tracer instance\n */\nexport function getGlobalTracer(): Tracer | null {\n return globalTracer;\n}\n\n/**\n * Set the global tracer instance\n */\nexport function setGlobalTracer(tracer: Tracer): void {\n globalTracer = tracer;\n}\n\n/**\n * Reset the global tracer (for testing)\n */\nexport function resetGlobalTracer(): void {\n globalTracer = null;\n}\n\n// ============================================================================\n// MIDDLEWARE HELPERS\n// ============================================================================\n\n/**\n * Create HTTP server tracing middleware.\n * Automatically creates spans for incoming HTTP requests.\n *\n * @param tracer - The tracer instance to use\n * @returns Middleware function for HTTP frameworks\n */\nexport function createTracingMiddleware(tracer: Tracer) {\n return async (\n request: Request,\n next: () => Promise<Response>\n ): Promise<Response> => {\n // Extract trace context from incoming request\n const parentCtx = tracer.extract(request.headers);\n\n // Start server span\n const url = new URL(request.url);\n const spanOpts: {\n kind: SpanKind;\n parent?: TraceContext;\n attributes: Record<string, SpanAttributeValue>;\n } = {\n kind: \"server\",\n attributes: {\n [SpanAttributes.HTTP_METHOD]: request.method,\n [SpanAttributes.HTTP_URL]: request.url,\n },\n };\n if (parentCtx) {\n spanOpts.parent = parentCtx;\n }\n const span = tracer.startSpan(`${request.method} ${url.pathname}`, spanOpts);\n\n if (!span) {\n return next();\n }\n\n try {\n const response = await tracer.getContextManager().run(span.traceContext, next);\n\n tracer.endSpan(span);\n span.attributes[SpanAttributes.HTTP_STATUS_CODE] = response.status;\n\n return response;\n } catch (error) {\n tracer.endSpan(span, error as Error);\n throw error;\n }\n };\n}\n\n/**\n * Create RPC tracing helpers for instrumenting RPC calls.\n * Provides methods to trace outgoing calls and incoming handlers.\n *\n * @param tracer - The tracer instance to use\n * @returns Object with traceCall and traceHandler methods\n */\nexport function createRpcTracing(tracer: Tracer) {\n return {\n /**\n * Trace an outgoing RPC call\n */\n async traceCall<T>(\n service: string,\n method: string,\n fn: () => Promise<T>\n ): Promise<T> {\n return tracer.trace(\n `rpc.${service}.${method}`,\n fn,\n {\n kind: \"client\",\n attributes: {\n [SpanAttributes.RPC_SYSTEM]: \"pars\",\n [SpanAttributes.RPC_SERVICE]: service,\n [SpanAttributes.RPC_METHOD]: method,\n },\n }\n );\n },\n\n /**\n * Trace an incoming RPC request\n */\n async traceHandler<T>(\n service: string,\n method: string,\n fn: () => Promise<T>,\n parentCtx?: TraceContext\n ): Promise<T> {\n const handlerOpts: {\n kind: SpanKind;\n parent?: TraceContext;\n attributes: Record<string, SpanAttributeValue>;\n } = {\n kind: \"server\",\n attributes: {\n [SpanAttributes.RPC_SYSTEM]: \"pars\",\n [SpanAttributes.RPC_SERVICE]: service,\n [SpanAttributes.RPC_METHOD]: method,\n },\n };\n if (parentCtx) {\n handlerOpts.parent = parentCtx;\n }\n const span = tracer.startSpan(`rpc.${service}.${method}`, handlerOpts);\n\n if (!span) {\n return fn();\n }\n\n try {\n const result = await tracer.getContextManager().run(span.traceContext, fn);\n tracer.endSpan(span);\n return result;\n } catch (error) {\n tracer.endSpan(span, error as Error);\n throw error;\n }\n },\n };\n}\n","/**\n * @parsrun/service - Trace Context\n * W3C Trace Context implementation\n */\n\nimport type { TraceContext } from \"../types.js\";\n\n// ============================================================================\n// TRACE ID GENERATION\n// ============================================================================\n\n/**\n * Generate a trace ID (32 hex characters)\n */\nexport function generateTraceId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Generate a span ID (16 hex characters)\n */\nexport function generateSpanId(): string {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n// ============================================================================\n// TRACE CONTEXT\n// ============================================================================\n\n/**\n * Create a new trace context\n */\nexport function createTraceContext(options?: {\n traceId?: string;\n spanId?: string;\n traceFlags?: number;\n traceState?: string;\n}): TraceContext {\n const ctx: TraceContext = {\n traceId: options?.traceId ?? generateTraceId(),\n spanId: options?.spanId ?? generateSpanId(),\n traceFlags: options?.traceFlags ?? 1, // Default: sampled\n };\n\n if (options?.traceState) {\n ctx.traceState = options.traceState;\n }\n\n return ctx;\n}\n\n/**\n * Create child trace context (new span in same trace)\n */\nexport function createChildContext(parent: TraceContext): TraceContext {\n const ctx: TraceContext = {\n traceId: parent.traceId,\n spanId: generateSpanId(),\n traceFlags: parent.traceFlags,\n };\n\n if (parent.traceState) {\n ctx.traceState = parent.traceState;\n }\n\n return ctx;\n}\n\n// ============================================================================\n// W3C TRACEPARENT HEADER\n// ============================================================================\n\n/**\n * Format trace context as W3C traceparent header\n *\n * Format: {version}-{trace-id}-{span-id}-{trace-flags}\n * Example: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01\n */\nexport function formatTraceparent(ctx: TraceContext): string {\n const version = \"00\";\n const flags = ctx.traceFlags.toString(16).padStart(2, \"0\");\n return `${version}-${ctx.traceId}-${ctx.spanId}-${flags}`;\n}\n\n/**\n * Parse W3C traceparent header\n */\nexport function parseTraceparent(header: string): TraceContext | null {\n const parts = header.trim().split(\"-\");\n if (parts.length !== 4) {\n return null;\n }\n\n const [version, traceId, spanId, flags] = parts;\n\n // Validate version\n if (version !== \"00\") {\n return null;\n }\n\n // Validate trace ID (32 hex chars)\n if (!traceId || traceId.length !== 32 || !/^[0-9a-f]+$/i.test(traceId)) {\n return null;\n }\n\n // Validate span ID (16 hex chars)\n if (!spanId || spanId.length !== 16 || !/^[0-9a-f]+$/i.test(spanId)) {\n return null;\n }\n\n // Validate flags (2 hex chars)\n if (!flags || flags.length !== 2 || !/^[0-9a-f]+$/i.test(flags)) {\n return null;\n }\n\n return {\n traceId: traceId.toLowerCase(),\n spanId: spanId.toLowerCase(),\n traceFlags: parseInt(flags, 16),\n };\n}\n\n// ============================================================================\n// W3C TRACESTATE HEADER\n// ============================================================================\n\n/**\n * Format trace state as W3C tracestate header\n *\n * Format: key1=value1,key2=value2\n */\nexport function formatTracestate(state: Record<string, string>): string {\n return Object.entries(state)\n .map(([key, value]) => `${key}=${value}`)\n .join(\",\");\n}\n\n/**\n * Parse W3C tracestate header\n */\nexport function parseTracestate(header: string): Record<string, string> {\n const state: Record<string, string> = {};\n\n for (const pair of header.split(\",\")) {\n const [key, value] = pair.trim().split(\"=\");\n if (key && value) {\n state[key] = value;\n }\n }\n\n return state;\n}\n\n// ============================================================================\n// TRACE CONTEXT MANAGER\n// ============================================================================\n\n/**\n * Async-local-storage-like context manager for tracing\n * Uses a simple stack for edge compatibility\n */\nexport class TraceContextManager {\n private readonly stack: TraceContext[] = [];\n\n /**\n * Get current trace context\n */\n current(): TraceContext | undefined {\n return this.stack[this.stack.length - 1];\n }\n\n /**\n * Run a function with a trace context\n */\n async run<T>(ctx: TraceContext, fn: () => Promise<T>): Promise<T> {\n this.stack.push(ctx);\n try {\n return await fn();\n } finally {\n this.stack.pop();\n }\n }\n\n /**\n * Run a function with a new child context\n */\n async runChild<T>(fn: () => Promise<T>): Promise<T> {\n const parent = this.current();\n const child = parent ? createChildContext(parent) : createTraceContext();\n return this.run(child, fn);\n }\n\n /**\n * Create context from incoming request headers\n */\n fromHeaders(headers: Headers | Record<string, string>): TraceContext | undefined {\n const traceparent =\n headers instanceof Headers\n ? headers.get(\"traceparent\")\n : headers[\"traceparent\"];\n\n if (!traceparent) {\n return undefined;\n }\n\n const ctx = parseTraceparent(traceparent);\n if (!ctx) {\n return undefined;\n }\n\n const tracestate =\n headers instanceof Headers\n ? headers.get(\"tracestate\")\n : headers[\"tracestate\"];\n\n if (tracestate) {\n ctx.traceState = tracestate;\n }\n\n return ctx;\n }\n\n /**\n * Add trace context to outgoing request headers\n */\n toHeaders(ctx: TraceContext): Record<string, string> {\n const headers: Record<string, string> = {\n traceparent: formatTraceparent(ctx),\n };\n\n if (ctx.traceState) {\n headers[\"tracestate\"] = ctx.traceState;\n }\n\n return headers;\n }\n\n /**\n * Check if current context is sampled\n */\n isSampled(): boolean {\n const ctx = this.current();\n return ctx ? (ctx.traceFlags & 0x01) === 1 : false;\n }\n\n /**\n * Clear all contexts (for testing)\n */\n clear(): void {\n this.stack.length = 0;\n }\n}\n\n// ============================================================================\n// SAMPLING\n// ============================================================================\n\n/**\n * Sampling configuration for tracing.\n * - \"always\": Sample all traces\n * - \"never\": Never sample traces\n * - { ratio: number }: Sample a percentage of traces (0-1)\n */\nexport type Sampler = \"always\" | \"never\" | { ratio: number };\n\n/**\n * Determine if a trace should be sampled based on the sampler configuration.\n *\n * @param sampler - Sampling configuration\n * @param traceId - Optional trace ID for deterministic sampling\n * @returns Whether the trace should be sampled\n */\nexport function shouldSample(sampler: Sampler, traceId?: string): boolean {\n if (sampler === \"always\") {\n return true;\n }\n\n if (sampler === \"never\") {\n return false;\n }\n\n // Ratio-based sampling\n if (traceId) {\n // Use trace ID for deterministic sampling\n const hash = parseInt(traceId.slice(-8), 16);\n const threshold = Math.floor(sampler.ratio * 0xffffffff);\n return hash < threshold;\n }\n\n // Random sampling\n return Math.random() < sampler.ratio;\n}\n","/**\n * @parsrun/service - Spans\n * Span creation and management\n */\n\nimport type {\n Span,\n SpanKind,\n SpanStatus,\n SpanAttributeValue,\n SpanEvent,\n TraceContext,\n} from \"../types.js\";\nimport { generateSpanId, createTraceContext } from \"./context.js\";\n\n// ============================================================================\n// SPAN CREATION\n// ============================================================================\n\n/**\n * Options for creating a span.\n */\nexport interface SpanOptions {\n /** Span name */\n name: string;\n /** Span kind */\n kind?: SpanKind;\n /** Parent trace context */\n parent?: TraceContext;\n /** Initial attributes */\n attributes?: Record<string, SpanAttributeValue>;\n /** Start time (default: now) */\n startTime?: number;\n}\n\n/**\n * Create a new span for tracing an operation.\n *\n * @param options - Span configuration options\n * @returns A new span instance\n */\nexport function createSpan(options: SpanOptions): Span {\n let traceContext: TraceContext;\n\n if (options.parent) {\n traceContext = {\n traceId: options.parent.traceId,\n spanId: generateSpanId(),\n traceFlags: options.parent.traceFlags,\n };\n if (options.parent.traceState) {\n traceContext.traceState = options.parent.traceState;\n }\n } else {\n traceContext = createTraceContext();\n }\n\n const span: Span = {\n name: options.name,\n kind: options.kind ?? \"internal\",\n traceContext,\n startTime: options.startTime ?? Date.now(),\n status: \"unset\",\n attributes: options.attributes ?? {},\n events: [],\n };\n\n if (options.parent?.spanId) {\n span.parentSpanId = options.parent.spanId;\n }\n\n return span;\n}\n\n// ============================================================================\n// SPAN MANAGER\n// ============================================================================\n\n/**\n * Span manager for creating and managing spans\n */\nexport class SpanManager {\n private readonly spans: Map<string, Span> = new Map();\n\n /**\n * Start a new span\n */\n startSpan(options: SpanOptions): Span {\n const span = createSpan(options);\n this.spans.set(span.traceContext.spanId, span);\n return span;\n }\n\n /**\n * End a span\n */\n endSpan(span: Span, status?: SpanStatus): Span {\n span.endTime = Date.now();\n if (status) {\n span.status = status;\n } else if (span.status === \"unset\") {\n span.status = \"ok\";\n }\n return span;\n }\n\n /**\n * Set span attribute\n */\n setAttribute(span: Span, key: string, value: SpanAttributeValue): void {\n span.attributes[key] = value;\n }\n\n /**\n * Set multiple span attributes\n */\n setAttributes(span: Span, attributes: Record<string, SpanAttributeValue>): void {\n Object.assign(span.attributes, attributes);\n }\n\n /**\n * Add span event\n */\n addEvent(\n span: Span,\n name: string,\n attributes?: Record<string, SpanAttributeValue>\n ): void {\n const event: SpanEvent = {\n name,\n time: Date.now(),\n };\n if (attributes) {\n event.attributes = attributes;\n }\n span.events.push(event);\n }\n\n /**\n * Set span status\n */\n setStatus(span: Span, status: SpanStatus): void {\n span.status = status;\n }\n\n /**\n * Record exception on span\n */\n recordException(span: Span, error: Error): void {\n span.status = \"error\";\n this.addEvent(span, \"exception\", {\n \"exception.type\": error.name,\n \"exception.message\": error.message,\n \"exception.stacktrace\": error.stack ?? \"\",\n });\n }\n\n /**\n * Get span by ID\n */\n getSpan(spanId: string): Span | undefined {\n return this.spans.get(spanId);\n }\n\n /**\n * Get all completed spans and clear\n */\n flush(): Span[] {\n const completed = Array.from(this.spans.values()).filter((s) => s.endTime);\n for (const span of completed) {\n this.spans.delete(span.traceContext.spanId);\n }\n return completed;\n }\n\n /**\n * Clear all spans\n */\n clear(): void {\n this.spans.clear();\n }\n}\n\n// ============================================================================\n// SPAN UTILITIES\n// ============================================================================\n\n/**\n * Calculate span duration in milliseconds.\n *\n * @param span - The span to measure\n * @returns Duration in milliseconds, or undefined if not ended\n */\nexport function getSpanDuration(span: Span): number | undefined {\n if (!span.endTime) return undefined;\n return span.endTime - span.startTime;\n}\n\n/**\n * Check if a span is completed (has an end time).\n *\n * @param span - The span to check\n * @returns True if the span has been ended\n */\nexport function isSpanCompleted(span: Span): boolean {\n return span.endTime !== undefined;\n}\n\n/**\n * Convert a span to a simplified object for logging.\n *\n * @param span - The span to convert\n * @returns A plain object representation of the span\n */\nexport function spanToLogObject(span: Span): Record<string, unknown> {\n return {\n traceId: span.traceContext.traceId,\n spanId: span.traceContext.spanId,\n parentSpanId: span.parentSpanId,\n name: span.name,\n kind: span.kind,\n status: span.status,\n startTime: new Date(span.startTime).toISOString(),\n endTime: span.endTime ? new Date(span.endTime).toISOString() : undefined,\n durationMs: getSpanDuration(span),\n attributes: span.attributes,\n events: span.events.map((e) => ({\n name: e.name,\n time: new Date(e.time).toISOString(),\n attributes: e.attributes,\n })),\n };\n}\n\n// ============================================================================\n// SEMANTIC CONVENTIONS\n// ============================================================================\n\n/**\n * Common span attribute keys (OpenTelemetry semantic conventions)\n */\nexport const SpanAttributes = {\n // HTTP\n HTTP_METHOD: \"http.method\",\n HTTP_URL: \"http.url\",\n HTTP_STATUS_CODE: \"http.status_code\",\n HTTP_REQUEST_CONTENT_LENGTH: \"http.request_content_length\",\n HTTP_RESPONSE_CONTENT_LENGTH: \"http.response_content_length\",\n\n // RPC\n RPC_SYSTEM: \"rpc.system\",\n RPC_SERVICE: \"rpc.service\",\n RPC_METHOD: \"rpc.method\",\n\n // Database\n DB_SYSTEM: \"db.system\",\n DB_NAME: \"db.name\",\n DB_OPERATION: \"db.operation\",\n DB_STATEMENT: \"db.statement\",\n\n // Messaging\n MESSAGING_SYSTEM: \"messaging.system\",\n MESSAGING_DESTINATION: \"messaging.destination\",\n MESSAGING_MESSAGE_ID: \"messaging.message_id\",\n\n // Service\n SERVICE_NAME: \"service.name\",\n SERVICE_VERSION: \"service.version\",\n\n // Error\n EXCEPTION_TYPE: \"exception.type\",\n EXCEPTION_MESSAGE: \"exception.message\",\n EXCEPTION_STACKTRACE: \"exception.stacktrace\",\n\n // Custom Pars attributes\n PARS_TENANT_ID: \"pars.tenant_id\",\n PARS_USER_ID: \"pars.user_id\",\n PARS_REQUEST_ID: \"pars.request_id\",\n} as const;\n","/**\n * @parsrun/service - Trace Exporters\n * Console and OTLP exporters for spans\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type { Span } from \"../types.js\";\nimport { spanToLogObject, getSpanDuration } from \"./spans.js\";\n\n// ============================================================================\n// EXPORTER INTERFACE\n// ============================================================================\n\n/**\n * Interface for span exporters.\n * Exporters receive completed spans and send them to a backend.\n */\nexport interface SpanExporter {\n /** Exporter name */\n readonly name: string;\n /** Export spans to the backend */\n export(spans: Span[]): Promise<void>;\n /** Shutdown exporter and flush pending spans */\n shutdown(): Promise<void>;\n}\n\n/**\n * Base options for span exporters.\n */\nexport interface ExporterOptions {\n /** Logger */\n logger?: Logger;\n}\n\n// ============================================================================\n// CONSOLE EXPORTER\n// ============================================================================\n\n/**\n * Options for the console exporter.\n */\nexport interface ConsoleExporterOptions extends ExporterOptions {\n /** Pretty print (default: true in dev) */\n pretty?: boolean;\n /** Include attributes (default: true) */\n includeAttributes?: boolean;\n /** Include events (default: true) */\n includeEvents?: boolean;\n}\n\n/**\n * Console exporter for development and debugging.\n * Outputs spans to the console with optional pretty formatting.\n */\nexport class ConsoleExporter implements SpanExporter {\n readonly name = \"console\";\n private readonly logger: Logger;\n private readonly pretty: boolean;\n private readonly includeAttributes: boolean;\n private readonly includeEvents: boolean;\n\n constructor(options: ConsoleExporterOptions = {}) {\n this.logger = options.logger ?? createLogger({ name: \"trace-exporter\" });\n this.pretty = options.pretty ?? true;\n this.includeAttributes = options.includeAttributes ?? true;\n this.includeEvents = options.includeEvents ?? true;\n }\n\n async export(spans: Span[]): Promise<void> {\n for (const span of spans) {\n const duration = getSpanDuration(span);\n const status = span.status === \"error\" ? \"ERROR\" : span.status === \"ok\" ? \"OK\" : \"UNSET\";\n\n if (this.pretty) {\n const indent = span.parentSpanId ? \" └─\" : \"──\";\n const statusIcon = span.status === \"error\" ? \"✗\" : span.status === \"ok\" ? \"✓\" : \"○\";\n const durationStr = duration !== undefined ? `${duration}ms` : \"?ms\";\n\n console.log(\n `${indent} ${statusIcon} [${span.kind}] ${span.name} (${durationStr}) trace=${span.traceContext.traceId.slice(0, 8)}`\n );\n\n if (this.includeAttributes && Object.keys(span.attributes).length > 0) {\n console.log(` attributes:`, span.attributes);\n }\n\n if (this.includeEvents && span.events.length > 0) {\n for (const event of span.events) {\n console.log(` event: ${event.name}`, event.attributes ?? \"\");\n }\n }\n } else {\n const logObj = spanToLogObject(span);\n this.logger.info(`Span: ${span.name}`, {\n ...logObj,\n status,\n durationMs: duration,\n });\n }\n }\n }\n\n async shutdown(): Promise<void> {\n // No cleanup needed\n }\n}\n\n/**\n * Create a console exporter for local development.\n *\n * @param options - Exporter configuration options\n * @returns A new console exporter instance\n */\nexport function createConsoleExporter(options?: ConsoleExporterOptions): ConsoleExporter {\n return new ConsoleExporter(options);\n}\n\n// ============================================================================\n// OTLP EXPORTER\n// ============================================================================\n\n/**\n * Options for the OTLP exporter.\n */\nexport interface OtlpExporterOptions extends ExporterOptions {\n /** OTLP endpoint URL */\n endpoint: string;\n /** Service name */\n serviceName: string;\n /** Service version */\n serviceVersion?: string;\n /** Custom headers */\n headers?: Record<string, string>;\n /** Timeout in ms */\n timeout?: number;\n /** Batch size */\n batchSize?: number;\n /** Flush interval in ms */\n flushInterval?: number;\n}\n\n/**\n * OTLP exporter for production tracing.\n * Sends spans to an OpenTelemetry-compatible backend via HTTP.\n */\nexport class OtlpExporter implements SpanExporter {\n readonly name = \"otlp\";\n private readonly endpoint: string;\n private readonly serviceName: string;\n private readonly serviceVersion: string;\n private readonly headers: Record<string, string>;\n private readonly timeout: number;\n private readonly batchSize: number;\n private readonly flushInterval: number;\n private readonly logger: Logger;\n private readonly buffer: Span[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: OtlpExporterOptions) {\n this.endpoint = options.endpoint.replace(/\\/$/, \"\");\n this.serviceName = options.serviceName;\n this.serviceVersion = options.serviceVersion ?? \"1.0.0\";\n this.headers = options.headers ?? {};\n this.timeout = options.timeout ?? 10_000;\n this.batchSize = options.batchSize ?? 100;\n this.flushInterval = options.flushInterval ?? 5_000;\n this.logger = options.logger ?? createLogger({ name: \"otlp-exporter\" });\n\n // Start flush timer\n this.flushTimer = setInterval(() => this.flush(), this.flushInterval);\n }\n\n async export(spans: Span[]): Promise<void> {\n this.buffer.push(...spans);\n\n if (this.buffer.length >= this.batchSize) {\n await this.flush();\n }\n }\n\n private async flush(): Promise<void> {\n if (this.buffer.length === 0) return;\n\n const spansToExport = this.buffer.splice(0, this.batchSize);\n\n try {\n const payload = this.buildOtlpPayload(spansToExport);\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.endpoint}/v1/traces`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.headers,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`OTLP export failed: ${response.status} ${response.statusText}`);\n }\n\n this.logger.debug(`Exported ${spansToExport.length} spans to OTLP`);\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (error) {\n this.logger.error(`Failed to export spans to OTLP`, error as Error);\n // Put spans back in buffer for retry\n this.buffer.unshift(...spansToExport);\n }\n }\n\n private buildOtlpPayload(spans: Span[]): OtlpTracePayload {\n return {\n resourceSpans: [\n {\n resource: {\n attributes: [\n { key: \"service.name\", value: { stringValue: this.serviceName } },\n { key: \"service.version\", value: { stringValue: this.serviceVersion } },\n ],\n },\n scopeSpans: [\n {\n scope: {\n name: \"@parsrun/service\",\n version: \"0.1.0\",\n },\n spans: spans.map((span) => this.convertSpan(span)),\n },\n ],\n },\n ],\n };\n }\n\n private convertSpan(span: Span): OtlpSpan {\n const otlpSpan: OtlpSpan = {\n traceId: span.traceContext.traceId,\n spanId: span.traceContext.spanId,\n name: span.name,\n kind: this.convertSpanKind(span.kind),\n startTimeUnixNano: String(span.startTime * 1_000_000),\n attributes: Object.entries(span.attributes).map(([key, value]) => ({\n key,\n value: this.convertAttributeValue(value),\n })),\n events: span.events.map((event) => ({\n name: event.name,\n timeUnixNano: String(event.time * 1_000_000),\n attributes: event.attributes\n ? Object.entries(event.attributes).map(([key, value]) => ({\n key,\n value: this.convertAttributeValue(value),\n }))\n : [],\n })),\n status: {\n code: span.status === \"error\" ? 2 : span.status === \"ok\" ? 1 : 0,\n },\n };\n\n if (span.parentSpanId) {\n otlpSpan.parentSpanId = span.parentSpanId;\n }\n if (span.endTime) {\n otlpSpan.endTimeUnixNano = String(span.endTime * 1_000_000);\n }\n\n return otlpSpan;\n }\n\n private convertSpanKind(kind: string): number {\n switch (kind) {\n case \"internal\":\n return 1;\n case \"server\":\n return 2;\n case \"client\":\n return 3;\n case \"producer\":\n return 4;\n case \"consumer\":\n return 5;\n default:\n return 0;\n }\n }\n\n private convertAttributeValue(value: unknown): OtlpAttributeValue {\n if (typeof value === \"string\") {\n return { stringValue: value };\n }\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) {\n return { intValue: String(value) };\n }\n return { doubleValue: value };\n }\n if (typeof value === \"boolean\") {\n return { boolValue: value };\n }\n if (Array.isArray(value)) {\n return {\n arrayValue: {\n values: value.map((v) => this.convertAttributeValue(v)),\n },\n };\n }\n return { stringValue: String(value) };\n }\n\n async shutdown(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n}\n\n/**\n * Create an OTLP exporter for production tracing.\n *\n * @param options - Exporter configuration options\n * @returns A new OTLP exporter instance\n *\n * @example\n * ```typescript\n * const exporter = createOtlpExporter({\n * endpoint: 'https://otel-collector.example.com:4318',\n * serviceName: 'payments',\n * });\n * ```\n */\nexport function createOtlpExporter(options: OtlpExporterOptions): OtlpExporter {\n return new OtlpExporter(options);\n}\n\n// ============================================================================\n// OTLP TYPES\n// ============================================================================\n\ninterface OtlpTracePayload {\n resourceSpans: Array<{\n resource: {\n attributes: OtlpAttribute[];\n };\n scopeSpans: Array<{\n scope: {\n name: string;\n version: string;\n };\n spans: OtlpSpan[];\n }>;\n }>;\n}\n\ninterface OtlpSpan {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n name: string;\n kind: number;\n startTimeUnixNano: string;\n endTimeUnixNano?: string;\n attributes: OtlpAttribute[];\n events: Array<{\n name: string;\n timeUnixNano: string;\n attributes: OtlpAttribute[];\n }>;\n status: {\n code: number;\n };\n}\n\ninterface OtlpAttribute {\n key: string;\n value: OtlpAttributeValue;\n}\n\ninterface OtlpAttributeValue {\n stringValue?: string;\n intValue?: string;\n doubleValue?: number;\n boolValue?: boolean;\n arrayValue?: {\n values: OtlpAttributeValue[];\n };\n}\n","/**\n * @parsrun/service - RPC Server\n * Server for handling RPC requests\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type {\n RpcRequest,\n RpcResponse,\n ServiceDefinition,\n TraceContext,\n} from \"../types.js\";\nimport { satisfiesVersion, isMethodDeprecated, getMethodTimeout } from \"../define.js\";\nimport { MethodNotFoundError, VersionMismatchError, toRpcError } from \"./errors.js\";\n\n// ============================================================================\n// RPC HANDLER TYPES\n// ============================================================================\n\n/**\n * RPC handler context\n */\nexport interface RpcHandlerContext {\n /** Request ID */\n requestId: string;\n /** Service name */\n service: string;\n /** Method name */\n method: string;\n /** Method type */\n type: \"query\" | \"mutation\";\n /** Request metadata */\n metadata: Record<string, unknown>;\n /** Trace context */\n traceContext?: TraceContext;\n /** Logger */\n logger: Logger;\n}\n\n/**\n * RPC handler function\n */\nexport type RpcHandler<TInput = unknown, TOutput = unknown> = (\n input: TInput,\n context: RpcHandlerContext\n) => Promise<TOutput>;\n\n/**\n * RPC handlers record\n */\nexport type RpcHandlers = {\n queries?: Record<string, RpcHandler>;\n mutations?: Record<string, RpcHandler>;\n};\n\n// ============================================================================\n// RPC SERVER\n// ============================================================================\n\n/**\n * Options for creating an RPC server.\n */\nexport interface RpcServerOptions {\n /** Service definition */\n definition: ServiceDefinition;\n /** RPC handlers */\n handlers: RpcHandlers;\n /** Logger */\n logger?: Logger;\n /** Default timeout in ms */\n defaultTimeout?: number;\n /** Middleware */\n middleware?: RpcMiddleware[];\n}\n\n/**\n * RPC middleware function for request processing.\n * Middleware can intercept, modify, or handle requests before/after handlers.\n *\n * @param request - The incoming RPC request\n * @param context - Handler context with logger and metadata\n * @param next - Function to call the next middleware or handler\n * @returns Promise resolving to the handler result\n */\nexport type RpcMiddleware = (\n request: RpcRequest,\n context: RpcHandlerContext,\n next: () => Promise<unknown>\n) => Promise<unknown>;\n\n/**\n * RPC Server for handling incoming requests\n */\nexport class RpcServer {\n private readonly definition: ServiceDefinition;\n private readonly handlers: RpcHandlers;\n private readonly logger: Logger;\n private readonly defaultTimeout: number;\n private readonly middleware: RpcMiddleware[];\n\n constructor(options: RpcServerOptions) {\n this.definition = options.definition;\n this.handlers = options.handlers;\n this.logger = options.logger ?? createLogger({ name: `rpc:${options.definition.name}` });\n this.defaultTimeout = options.defaultTimeout ?? 30_000;\n this.middleware = options.middleware ?? [];\n }\n\n /**\n * Handle an RPC request\n */\n async handle<TInput, TOutput>(request: RpcRequest<TInput>): Promise<RpcResponse<TOutput>> {\n const startTime = Date.now();\n const context: RpcHandlerContext = {\n requestId: request.id,\n service: request.service,\n method: request.method,\n type: request.type,\n metadata: request.metadata ?? {},\n logger: this.logger.child({ requestId: request.id, method: request.method }),\n };\n\n if (request.traceContext) {\n context.traceContext = request.traceContext;\n }\n\n try {\n // Check version compatibility\n if (request.version && !satisfiesVersion(this.definition.version, request.version)) {\n throw new VersionMismatchError(\n this.definition.name,\n request.version,\n this.definition.version\n );\n }\n\n // Get handler\n const handler = this.getHandler(request.method, request.type);\n if (!handler) {\n throw new MethodNotFoundError(this.definition.name, request.method);\n }\n\n // Check deprecation\n const deprecation = isMethodDeprecated(this.definition, request.method, request.type);\n if (deprecation.deprecated) {\n context.logger.warn(`Method ${request.method} is deprecated`, {\n since: deprecation.since,\n replacement: deprecation.replacement,\n });\n }\n\n // Build middleware chain\n const chain = this.buildMiddlewareChain(request, context, handler);\n\n // Execute with timeout\n const timeout = getMethodTimeout(\n this.definition,\n request.method,\n request.type,\n this.defaultTimeout\n );\n\n const output = await Promise.race([\n chain(),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(\"Handler timeout\")), timeout)\n ),\n ]);\n\n const duration = Date.now() - startTime;\n context.logger.info(`${request.type} ${request.method} completed`, { durationMs: duration });\n\n const successResponse: RpcResponse<TOutput> = {\n id: request.id,\n success: true,\n version: this.definition.version,\n output: output as TOutput,\n };\n if (request.traceContext) {\n successResponse.traceContext = request.traceContext;\n }\n return successResponse;\n } catch (error) {\n const duration = Date.now() - startTime;\n const rpcError = toRpcError(error);\n\n context.logger.error(`${request.type} ${request.method} failed`, error as Error, {\n durationMs: duration,\n errorCode: rpcError.code,\n });\n\n const errorData: RpcResponse<TOutput>[\"error\"] = {\n code: rpcError.code,\n message: rpcError.message,\n retryable: rpcError.retryable,\n };\n if (rpcError.details) {\n errorData!.details = rpcError.details;\n }\n if (rpcError.retryAfter !== undefined) {\n errorData!.retryAfter = rpcError.retryAfter;\n }\n\n const errorResponse: RpcResponse<TOutput> = {\n id: request.id,\n success: false,\n version: this.definition.version,\n error: errorData,\n };\n if (request.traceContext) {\n errorResponse.traceContext = request.traceContext;\n }\n return errorResponse;\n }\n }\n\n /**\n * Get handler for a method\n */\n private getHandler(method: string, type: \"query\" | \"mutation\"): RpcHandler | undefined {\n const handlers = type === \"query\" ? this.handlers.queries : this.handlers.mutations;\n return handlers?.[method];\n }\n\n /**\n * Build middleware chain\n */\n private buildMiddlewareChain(\n request: RpcRequest,\n context: RpcHandlerContext,\n handler: RpcHandler\n ): () => Promise<unknown> {\n let index = -1;\n\n const dispatch = async (i: number): Promise<unknown> => {\n if (i <= index) {\n throw new Error(\"next() called multiple times\");\n }\n index = i;\n\n if (i < this.middleware.length) {\n const mw = this.middleware[i]!;\n return mw(request, context, () => dispatch(i + 1));\n }\n\n return handler(request.input, context);\n };\n\n return () => dispatch(0);\n }\n\n /**\n * Get service definition\n */\n getDefinition(): ServiceDefinition {\n return this.definition;\n }\n\n /**\n * Get registered methods\n */\n getMethods(): { queries: string[]; mutations: string[] } {\n return {\n queries: Object.keys(this.handlers.queries ?? {}),\n mutations: Object.keys(this.handlers.mutations ?? {}),\n };\n }\n}\n\n/**\n * Create an RPC server for handling incoming requests.\n *\n * @param options - Server configuration options\n * @returns A new RPC server instance\n *\n * @example\n * ```typescript\n * const server = createRpcServer({\n * definition: paymentsService,\n * handlers: {\n * queries: {\n * getSubscription: async (input, ctx) => {\n * return { status: 'active', plan: 'pro' };\n * },\n * },\n * },\n * middleware: [loggingMiddleware()],\n * });\n * ```\n */\nexport function createRpcServer(options: RpcServerOptions): RpcServer {\n return new RpcServer(options);\n}\n\n// ============================================================================\n// BUILT-IN MIDDLEWARE\n// ============================================================================\n\n/**\n * Create logging middleware for RPC requests.\n * Logs request start and completion with input keys.\n *\n * @returns RPC middleware that logs requests\n */\nexport function loggingMiddleware(): RpcMiddleware {\n return async (request, context, next) => {\n context.logger.debug(`Handling ${request.type} ${request.method}`, {\n inputKeys: Object.keys(request.input as object),\n });\n\n const result = await next();\n\n context.logger.debug(`Completed ${request.type} ${request.method}`);\n\n return result;\n };\n}\n\n/**\n * Create validation middleware for RPC request inputs.\n * Applies validators to request inputs by method name.\n *\n * @param validators - Map of method names to validation functions\n * @returns RPC middleware that validates inputs\n *\n * @example\n * ```typescript\n * const middleware = validationMiddleware({\n * createUser: (input) => validateUserInput(input),\n * });\n * ```\n */\nexport function validationMiddleware(\n validators: Record<string, (input: unknown) => unknown>\n): RpcMiddleware {\n return async (request, _context, next) => {\n const validator = validators[request.method];\n if (validator) {\n request.input = validator(request.input);\n }\n return next();\n };\n}\n\n/**\n * Create tenant context middleware.\n * Extracts tenant ID from request metadata and adds it to the logger context.\n *\n * @returns RPC middleware that enriches logger with tenant context\n */\nexport function tenantMiddleware(): RpcMiddleware {\n return async (_request, context, next) => {\n const tenantId = context.metadata[\"tenantId\"];\n if (tenantId) {\n context.logger = context.logger.child({ tenantId });\n }\n return next();\n };\n}\n","/**\n * @parsrun/service - Event Emitter\n * Service-level event emission\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type {\n EventTransport,\n TraceContext,\n ServiceDefinition,\n} from \"../types.js\";\nimport { createEvent, type CreateEventOptions } from \"./format.js\";\n\n// ============================================================================\n// EVENT EMITTER\n// ============================================================================\n\n/**\n * Options for creating an event emitter.\n */\nexport interface EventEmitterOptions {\n /** Service name (source) */\n service: string;\n /** Service definition (for validation) */\n definition?: ServiceDefinition;\n /** Event transport */\n transport: EventTransport;\n /** Logger */\n logger?: Logger;\n /** Default tenant ID */\n defaultTenantId?: string;\n /** Validate events against definition */\n validateEvents?: boolean;\n}\n\n/**\n * Event emitter for service events\n */\nexport class EventEmitter {\n private readonly service: string;\n private readonly definition?: ServiceDefinition;\n private readonly transport: EventTransport;\n private readonly logger: Logger;\n private readonly defaultTenantId?: string;\n private readonly validateEvents: boolean;\n\n constructor(options: EventEmitterOptions) {\n this.service = options.service;\n if (options.definition) {\n this.definition = options.definition;\n }\n this.transport = options.transport;\n this.logger = options.logger ?? createLogger({ name: `events:${options.service}` });\n if (options.defaultTenantId) {\n this.defaultTenantId = options.defaultTenantId;\n }\n this.validateEvents = options.validateEvents ?? true;\n }\n\n /**\n * Emit an event\n */\n async emit<T = unknown>(\n type: string,\n data: T,\n options?: EmitOptions\n ): Promise<string> {\n // Validate event type if definition provided\n if (this.validateEvents && this.definition?.events?.emits) {\n const emits = this.definition.events.emits;\n if (!(type in emits)) {\n this.logger.warn(`Event type not declared in service definition: ${type}`);\n }\n }\n\n // Get delivery guarantee from definition\n let delivery: \"at-most-once\" | \"at-least-once\" | undefined;\n if (this.definition?.events?.emits?.[type]) {\n delivery = this.definition.events.emits[type].delivery;\n }\n\n // Create event options\n const eventOptions: CreateEventOptions<T> = {\n type,\n source: this.service,\n data,\n };\n\n if (options?.eventId) eventOptions.id = options.eventId;\n if (options?.subject) eventOptions.subject = options.subject;\n\n const tenantId = options?.tenantId ?? this.defaultTenantId;\n if (tenantId) eventOptions.tenantId = tenantId;\n\n if (options?.requestId) eventOptions.requestId = options.requestId;\n if (options?.traceContext) eventOptions.traceContext = options.traceContext;\n\n const eventDelivery = options?.delivery ?? delivery;\n if (eventDelivery) eventOptions.delivery = eventDelivery;\n\n // Create event\n const event = createEvent(eventOptions);\n\n // Emit via transport\n try {\n await this.transport.emit(event);\n this.logger.debug(`Event emitted: ${type}`, {\n eventId: event.id,\n tenantId: event.parstenantid,\n });\n return event.id;\n } catch (error) {\n this.logger.error(`Failed to emit event: ${type}`, error as Error, {\n eventId: event.id,\n });\n throw error;\n }\n }\n\n /**\n * Emit multiple events\n */\n async emitBatch<T = unknown>(\n events: Array<{ type: string; data: T; options?: EmitOptions }>\n ): Promise<string[]> {\n const results: string[] = [];\n\n for (const { type, data, options } of events) {\n const eventId = await this.emit(type, data, options);\n results.push(eventId);\n }\n\n return results;\n }\n\n /**\n * Create a scoped emitter with preset options\n */\n scoped(options: Partial<EmitOptions>): ScopedEmitter {\n return new ScopedEmitter(this, options);\n }\n\n /**\n * Get service name\n */\n get serviceName(): string {\n return this.service;\n }\n}\n\n/**\n * Emit options\n */\nexport interface EmitOptions {\n /** Custom event ID */\n eventId?: string;\n /** Event subject */\n subject?: string;\n /** Tenant ID */\n tenantId?: string;\n /** Request ID for correlation */\n requestId?: string;\n /** Trace context */\n traceContext?: TraceContext;\n /** Override delivery guarantee */\n delivery?: \"at-most-once\" | \"at-least-once\";\n}\n\n/**\n * Scoped emitter with preset options\n */\nexport class ScopedEmitter {\n private readonly emitter: EventEmitter;\n private readonly defaultOptions: Partial<EmitOptions>;\n\n constructor(emitter: EventEmitter, defaultOptions: Partial<EmitOptions>) {\n this.emitter = emitter;\n this.defaultOptions = defaultOptions;\n }\n\n async emit<T = unknown>(\n type: string,\n data: T,\n options?: EmitOptions\n ): Promise<string> {\n return this.emitter.emit(type, data, {\n ...this.defaultOptions,\n ...options,\n });\n }\n}\n\n/**\n * Create an event emitter for publishing service events.\n *\n * @param options - Emitter configuration options\n * @returns A new event emitter instance\n *\n * @example\n * ```typescript\n * const emitter = createEventEmitter({\n * service: 'payments',\n * transport: memoryTransport,\n * });\n * await emitter.emit('subscription.created', { customerId: '123' });\n * ```\n */\nexport function createEventEmitter(options: EventEmitterOptions): EventEmitter {\n return new EventEmitter(options);\n}\n\n// ============================================================================\n// TYPED EVENT EMITTER\n// ============================================================================\n\n/**\n * Create a typed event emitter from service definition\n * Provides type-safe event emission\n */\nexport function createTypedEmitter<TDef extends ServiceDefinition>(\n definition: TDef,\n options: Omit<EventEmitterOptions, \"service\" | \"definition\">\n): TypedEventEmitter<TDef> {\n const emitter = new EventEmitter({\n ...options,\n service: definition.name,\n definition,\n });\n\n return emitter as TypedEventEmitter<TDef>;\n}\n\n/**\n * Typed event emitter type\n * Provides type-safe event emission with specific event types\n */\nexport type TypedEventEmitter<TDef extends ServiceDefinition> = EventEmitter & {\n emit<K extends keyof NonNullable<TDef[\"events\"]>[\"emits\"]>(\n type: K,\n data: NonNullable<TDef[\"events\"]>[\"emits\"][K] extends { data?: infer D } ? D : unknown,\n options?: EmitOptions\n ): Promise<string>;\n};\n","/**\n * @parsrun/service - Dead Letter Queue\n * Storage for failed events\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger, generateId } from \"@parsrun/core\";\nimport type { ParsEvent } from \"../types.js\";\n\n// ============================================================================\n// DEAD LETTER QUEUE\n// ============================================================================\n\n/**\n * Entry stored in the dead letter queue.\n * Contains the failed event and metadata about the failure.\n */\nexport interface DeadLetterEntry {\n /** Unique ID */\n id: string;\n /** Original event */\n event: ParsEvent;\n /** Error message */\n error: string;\n /** Handler pattern that failed */\n pattern: string;\n /** Number of attempts made */\n attempts: number;\n /** Timestamp when added */\n addedAt: Date;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Options for creating a dead letter queue.\n */\nexport interface DeadLetterQueueOptions {\n /** Maximum entries to keep */\n maxSize?: number;\n /** Retention period in ms */\n retentionMs?: number;\n /** Callback when entry is added */\n onAdd?: (entry: DeadLetterEntry) => void;\n /** Callback when threshold is reached */\n onThreshold?: (count: number) => void;\n /** Alert threshold */\n alertThreshold?: number;\n /** Logger */\n logger?: Logger;\n}\n\n/**\n * Options for adding an entry to the dead letter queue.\n */\nexport interface AddEntryOptions {\n /** Original event */\n event: ParsEvent;\n /** Error message */\n error: string;\n /** Handler pattern */\n pattern: string;\n /** Number of attempts */\n attempts: number;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Resolved DLQ options\n */\ninterface ResolvedDlqOptions {\n maxSize: number;\n retentionMs: number;\n alertThreshold: number;\n onAdd?: (entry: DeadLetterEntry) => void;\n onThreshold?: (count: number) => void;\n logger?: Logger;\n}\n\n/**\n * In-memory Dead Letter Queue\n */\nexport class DeadLetterQueue {\n private readonly entries: Map<string, DeadLetterEntry> = new Map();\n private readonly resolvedOptions: ResolvedDlqOptions;\n private readonly logger: Logger;\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: DeadLetterQueueOptions = {}) {\n this.resolvedOptions = {\n maxSize: options.maxSize ?? 1000,\n retentionMs: options.retentionMs ?? 30 * 24 * 60 * 60 * 1000, // 30 days\n alertThreshold: options.alertThreshold ?? 10,\n };\n\n if (options.onAdd) this.resolvedOptions.onAdd = options.onAdd;\n if (options.onThreshold) this.resolvedOptions.onThreshold = options.onThreshold;\n if (options.logger) this.resolvedOptions.logger = options.logger;\n\n this.logger = options.logger ?? createLogger({ name: \"dlq\" });\n\n // Start cleanup timer\n this.cleanupTimer = setInterval(() => this.cleanup(), 60 * 60 * 1000); // Every hour\n }\n\n /**\n * Add an entry to the DLQ\n */\n async add(options: AddEntryOptions): Promise<string> {\n const entry: DeadLetterEntry = {\n id: generateId(),\n event: options.event,\n error: options.error,\n pattern: options.pattern,\n attempts: options.attempts,\n addedAt: new Date(),\n };\n\n if (options.metadata) {\n entry.metadata = options.metadata;\n }\n\n // Check max size\n if (this.entries.size >= this.resolvedOptions.maxSize) {\n // Remove oldest entry\n const oldest = this.getOldest();\n if (oldest) {\n this.entries.delete(oldest.id);\n this.logger.debug(`DLQ: Removed oldest entry to make room`, {\n removedId: oldest.id,\n });\n }\n }\n\n this.entries.set(entry.id, entry);\n\n this.logger.warn(`DLQ: Entry added`, {\n id: entry.id,\n eventId: entry.event.id,\n eventType: entry.event.type,\n error: entry.error,\n });\n\n // Callbacks\n this.resolvedOptions.onAdd?.(entry);\n\n // Check threshold\n if (this.entries.size >= this.resolvedOptions.alertThreshold) {\n this.resolvedOptions.onThreshold?.(this.entries.size);\n }\n\n return entry.id;\n }\n\n /**\n * Get an entry by ID\n */\n get(id: string): DeadLetterEntry | undefined {\n return this.entries.get(id);\n }\n\n /**\n * Get all entries\n */\n getAll(): DeadLetterEntry[] {\n return Array.from(this.entries.values());\n }\n\n /**\n * Get entries by event type\n */\n getByEventType(eventType: string): DeadLetterEntry[] {\n return Array.from(this.entries.values()).filter(\n (e) => e.event.type === eventType\n );\n }\n\n /**\n * Get entries by pattern\n */\n getByPattern(pattern: string): DeadLetterEntry[] {\n return Array.from(this.entries.values()).filter(\n (e) => e.pattern === pattern\n );\n }\n\n /**\n * Remove an entry\n */\n remove(id: string): boolean {\n const deleted = this.entries.delete(id);\n if (deleted) {\n this.logger.debug(`DLQ: Entry removed`, { id });\n }\n return deleted;\n }\n\n /**\n * Retry an entry (remove from DLQ and return event)\n */\n retry(id: string): ParsEvent | undefined {\n const entry = this.entries.get(id);\n if (!entry) return undefined;\n\n this.entries.delete(id);\n this.logger.info(`DLQ: Entry removed for retry`, {\n id,\n eventId: entry.event.id,\n });\n\n return entry.event;\n }\n\n /**\n * Get count\n */\n get size(): number {\n return this.entries.size;\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.entries.clear();\n this.logger.info(`DLQ: Cleared all entries`);\n }\n\n /**\n * Cleanup expired entries\n */\n private cleanup(): void {\n const now = Date.now();\n let removed = 0;\n\n for (const [id, entry] of this.entries) {\n const age = now - entry.addedAt.getTime();\n if (age > this.resolvedOptions.retentionMs) {\n this.entries.delete(id);\n removed++;\n }\n }\n\n if (removed > 0) {\n this.logger.debug(`DLQ: Cleaned up ${removed} expired entries`);\n }\n }\n\n /**\n * Get oldest entry\n */\n private getOldest(): DeadLetterEntry | undefined {\n let oldest: DeadLetterEntry | undefined;\n\n for (const entry of this.entries.values()) {\n if (!oldest || entry.addedAt < oldest.addedAt) {\n oldest = entry;\n }\n }\n\n return oldest;\n }\n\n /**\n * Stop cleanup timer\n */\n close(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n }\n\n /**\n * Export entries for persistence\n */\n export(): DeadLetterEntry[] {\n return Array.from(this.entries.values()).map((e) => ({\n ...e,\n addedAt: e.addedAt,\n }));\n }\n\n /**\n * Import entries from persistence\n */\n import(entries: DeadLetterEntry[]): void {\n for (const entry of entries) {\n this.entries.set(entry.id, {\n ...entry,\n addedAt: new Date(entry.addedAt),\n });\n }\n this.logger.info(`DLQ: Imported ${entries.length} entries`);\n }\n}\n\n/**\n * Create a dead letter queue for storing failed events.\n *\n * @param options - DLQ configuration options\n * @returns A new dead letter queue instance\n *\n * @example\n * ```typescript\n * const dlq = createDeadLetterQueue({\n * maxSize: 1000,\n * alertThreshold: 50,\n * onThreshold: (count) => alert(`DLQ has ${count} entries`),\n * });\n * ```\n */\nexport function createDeadLetterQueue(\n options?: DeadLetterQueueOptions\n): DeadLetterQueue {\n return new DeadLetterQueue(options);\n}\n"],"mappings":";AAmDO,SAAS,cAMd,YAC2D;AAE3D,4BAA0B,UAAU;AAGpC,SAAO,OAAO,OAAO;AAAA,IACnB,GAAG;AAAA,IACH,SAAS,WAAW,UAAU,OAAO,OAAO,EAAE,GAAG,WAAW,QAAQ,CAAC,IAAI;AAAA,IACzE,WAAW,WAAW,YAAY,OAAO,OAAO,EAAE,GAAG,WAAW,UAAU,CAAC,IAAI;AAAA,IAC/E,QAAQ,WAAW,SACf,OAAO,OAAO;AAAA,MACZ,OAAO,WAAW,OAAO,QACrB,OAAO,OAAO,EAAE,GAAG,WAAW,OAAO,MAAM,CAAC,IAC5C;AAAA,MACJ,SAAS,WAAW,OAAO,UACvB,OAAO,OAAO,CAAC,GAAG,WAAW,OAAO,OAAO,CAAC,IAC5C;AAAA,IACN,CAAC,IACD;AAAA,EACN,CAAC;AACH;AAKA,SAAS,0BAA0B,YAAqC;AACtE,MAAI,CAAC,WAAW,MAAM;AACpB,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,MAAI,CAAC,WAAW,SAAS;AACvB,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AAGA,QAAM,eAAe;AACrB,MAAI,CAAC,aAAa,KAAK,WAAW,OAAO,GAAG;AAC1C,UAAM,IAAI,MAAM,2BAA2B,WAAW,OAAO,iCAAiC;AAAA,EAChG;AAGA,QAAM,YAAY;AAElB,MAAI,WAAW,SAAS;AACtB,eAAW,QAAQ,OAAO,KAAK,WAAW,OAAO,GAAG;AAClD,UAAI,CAAC,UAAU,KAAK,IAAI,GAAG;AACzB,cAAM,IAAI;AAAA,UACR,uBAAuB,IAAI;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,WAAW;AACxB,eAAW,QAAQ,OAAO,KAAK,WAAW,SAAS,GAAG;AACpD,UAAI,CAAC,UAAU,KAAK,IAAI,GAAG;AACzB,cAAM,IAAI;AAAA,UACR,0BAA0B,IAAI;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,iBAAiB;AAEvB,MAAI,WAAW,QAAQ,OAAO;AAC5B,eAAW,QAAQ,OAAO,KAAK,WAAW,OAAO,KAAK,GAAG;AACvD,UAAI,CAAC,eAAe,KAAK,IAAI,GAAG;AAC9B,cAAM,IAAI;AAAA,UACR,uBAAuB,IAAI;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,QAAQ,SAAS;AAC9B,eAAW,QAAQ,WAAW,OAAO,SAAS;AAC5C,UAAI,CAAC,eAAe,KAAK,IAAI,GAAG;AAC9B,cAAM,IAAI;AAAA,UACR,+BAA+B,IAAI;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAYO,SAAS,kBAAkB,YAGhC;AACA,SAAO;AAAA,IACL,SAAS,WAAW,UAAU,OAAO,KAAK,WAAW,OAAO,IAAI,CAAC;AAAA,IACjE,WAAW,WAAW,YAAY,OAAO,KAAK,WAAW,SAAS,IAAI,CAAC;AAAA,EACzE;AACF;AAQO,SAAS,iBAAiB,YAG/B;AACA,SAAO;AAAA,IACL,OAAO,WAAW,QAAQ,QAAQ,OAAO,KAAK,WAAW,OAAO,KAAK,IAAI,CAAC;AAAA,IAC1E,SAAS,WAAW,QAAQ,WAAW,CAAC;AAAA,EAC1C;AACF;AAiBO,SAAS,iBAAiB,SAAiB,aAA8B;AAC9E,QAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAClE,QAAM,mBAAmB,YAAY,MAAM,GAAG;AAE9C,WAAS,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAK;AAChD,UAAM,MAAM,iBAAiB,CAAC;AAC9B,QAAI,QAAQ,OAAO,QAAQ,KAAK;AAC9B;AAAA,IACF;AAEA,UAAM,SAAS,SAAS,OAAO,KAAK,EAAE;AACtC,UAAM,SAAS,aAAa,CAAC,KAAK;AAElC,QAAI,WAAW,QAAQ;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAUO,SAAS,mBACd,YACA,YACA,MAC+D;AAC/D,QAAM,UAAU,SAAS,UAAU,WAAW,UAAU,WAAW;AACnE,QAAM,SAAS,UAAU,UAAU;AAEnC,MAAI,CAAC,QAAQ,YAAY;AACvB,WAAO,EAAE,YAAY,MAAM;AAAA,EAC7B;AAEA,QAAM,SAAwE;AAAA,IAC5E,YAAY;AAAA,IACZ,OAAO,OAAO;AAAA,EAChB;AAEA,MAAI,OAAO,aAAa;AACtB,WAAO,cAAc,OAAO;AAAA,EAC9B;AAEA,SAAO;AACT;AAYO,SAAS,iBACd,YACA,YACA,MACA,gBACQ;AACR,QAAM,UAAU,SAAS,UAAU,WAAW,UAAU,WAAW;AACnE,QAAM,SAAS,UAAU,UAAU;AAEnC,SAAO,QAAQ,WAAW;AAC5B;;;ACvQA,SAAS,cAAAA,mBAAkB;;;ACiBpB,IAAM,uBAAoD;AAAA,EAC/D,QAAQ;AAAA,EACR,iBAAiB;AACnB;AAMO,IAAM,+BAA8D;AAAA,EACzE,QAAQ;AACV;AAMO,IAAM,yBAAkD;AAAA,EAC7D,SAAS;AAAA,EACT,SAAS,EAAE,OAAO,IAAI;AAAA,EACtB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AACf;AAMO,IAAM,4BAAwD;AAAA,EACnE,UAAU;AAAA,EACV,gBAAgB;AAClB;AAMO,IAAM,4BAAwD;AAAA,EACnE,gBAAgB;AAAA,IACd,SAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,kBAAkB;AAAA,EACpB;AAAA,EACA,UAAU;AAAA,IACR,eAAe;AAAA,IACf,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,EACT,OAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU;AAAA,EACZ;AACF;AAMO,IAAM,6BAAyD;AAAA,EACpE,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,gBAAgB;AAClB;AAMO,IAAM,yBAAkD;AAAA,EAC7D,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AACd;AAaO,SAAS,YAAY,YAA8D;AACxF,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,GAAG,uBAAuB;AAAA,EACrC;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,GAAG,WAAW;AAAA,IAChB;AAAA,IACA,eAAe;AAAA,MACb,GAAG;AAAA,MACH,GAAG,WAAW;AAAA,IAChB;AAAA,IACA,SAAS;AAAA,MACP,GAAG;AAAA,MACH,GAAG,WAAW;AAAA,IAChB;AAAA,IACA,YAAY;AAAA,MACV,GAAG;AAAA,MACH,GAAG,WAAW;AAAA,IAChB;AAAA,IACA,YAAY;AAAA,MACV,GAAG;AAAA,MACH,GAAG,WAAW;AAAA,MACd,gBAAgB;AAAA,QACd,GAAG,0BAA0B;AAAA,QAC7B,GAAG,WAAW,YAAY;AAAA,MAC5B;AAAA,MACA,UAAU;AAAA,QACR,GAAG,0BAA0B;AAAA,QAC7B,GAAG,WAAW,YAAY;AAAA,MAC5B;AAAA,MACA,OAAO;AAAA,QACL,GAAG,0BAA0B;AAAA,QAC7B,GAAG,WAAW,YAAY;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,YAAY;AAAA,MACV,GAAG;AAAA,MACH,GAAG,WAAW;AAAA,IAChB;AAAA,EACF;AACF;AASO,SAAS,gBAAgB,WAA6D;AAC3F,SAAO,YAAY;AAAA,IACjB,SAAS;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,MACV,gBAAgB,EAAE,SAAS,MAAM;AAAA,MACjC,SAAS;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACH;AASO,SAAS,iBAAiB,WAA6D;AAC5F,SAAO,YAAY;AAAA,IACjB,SAAS;AAAA,MACP,SAAS;AAAA,MACT,SAAS,EAAE,OAAO,IAAI;AAAA,MACtB,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,MACV,gBAAgB,EAAE,SAAS,KAAK;AAAA,MAChC,SAAS;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACH;AASO,SAAS,eAAe,QAA6D;AAC1F,QAAM,SAAmB,CAAC;AAG1B,MAAI,OAAO,SAAS,WAAW,OAAO,OAAO,QAAQ,YAAY,UAAU;AACzE,UAAM,QAAQ,OAAO,QAAQ,QAAQ;AACrC,QAAI,QAAQ,KAAK,QAAQ,GAAG;AAC1B,aAAO,KAAK,+CAA+C;AAAA,IAC7D;AAAA,EACF;AAGA,MAAI,OAAO,YAAY,YAAY,UAAa,OAAO,WAAW,UAAU,GAAG;AAC7E,WAAO,KAAK,yCAAyC;AAAA,EACvD;AAEA,MAAI,OAAO,YAAY,gBAAgB,qBAAqB,QAAW;AACrE,QAAI,OAAO,WAAW,eAAe,mBAAmB,GAAG;AACzD,aAAO,KAAK,+DAA+D;AAAA,IAC7E;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,UAAU,kBAAkB,QAAW;AAC5D,QAAI,OAAO,WAAW,SAAS,gBAAgB,GAAG;AAChD,aAAO,KAAK,sDAAsD;AAAA,IACpE;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,OAAO,aAAa,QAAW;AACpD,QAAI,OAAO,WAAW,MAAM,WAAW,GAAG;AACxC,aAAO,KAAK,gDAAgD;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,EACF;AACF;;;ACrPA,SAAS,kBAAkB;;;ACD3B,SAAS,iBAAiB;AAKnB,IAAM,WAAN,cAAuB,UAAU;AAAA,EACtB;AAAA,EACA;AAAA,EAEhB,YACE,SACA,MACA,aAAqB,KACrB,SAKA;AACA,UAAM,SAAS,MAAM,YAAY,SAAS,OAAO;AACjD,SAAK,OAAO;AACZ,SAAK,YAAY,SAAS,aAAa;AACvC,QAAI,SAAS,eAAe,QAAW;AACrC,WAAK,aAAa,QAAQ;AAAA,IAC5B;AAAA,EACF;AACF;AAKO,IAAM,uBAAN,cAAmC,SAAS;AAAA,EACjD,YAAY,aAAqB;AAC/B,UAAM,sBAAsB,WAAW,IAAI,qBAAqB,KAAK;AAAA,MACnE,WAAW;AAAA,MACX,SAAS,EAAE,SAAS,YAAY;AAAA,IAClC,CAAC;AACD,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,sBAAN,cAAkC,SAAS;AAAA,EAChD,YAAY,aAAqB,YAAoB;AACnD;AAAA,MACE,qBAAqB,WAAW,IAAI,UAAU;AAAA,MAC9C;AAAA,MACA;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS,EAAE,SAAS,aAAa,QAAQ,WAAW;AAAA,MACtD;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,uBAAN,cAAmC,SAAS;AAAA,EACjD,YAAY,aAAqB,WAAmB,WAAmB;AACrE;AAAA,MACE,wBAAwB,WAAW,eAAe,SAAS,eAAe,SAAS;AAAA,MACnF;AAAA,MACA;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS,EAAE,SAAS,aAAa,WAAW,UAAU;AAAA,MACxD;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,eAAN,cAA2B,SAAS;AAAA,EACzC,YAAY,aAAqB,YAAoB,WAAmB;AACtE;AAAA,MACE,cAAc,WAAW,IAAI,UAAU,oBAAoB,SAAS;AAAA,MACpE;AAAA,MACA;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS,EAAE,SAAS,aAAa,QAAQ,YAAY,SAAS,UAAU;AAAA,MAC1E;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,mBAAN,cAA+B,SAAS;AAAA,EAC7C,YAAY,aAAqB,cAAsB;AACrD;AAAA,MACE,4BAA4B,WAAW;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,YAAY,KAAK,KAAK,eAAe,GAAI;AAAA,QACzC,SAAS,EAAE,SAAS,aAAa,aAAa;AAAA,MAChD;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,wBAAN,cAAoC,SAAS;AAAA,EAClD,YAAY,aAAqB;AAC/B;AAAA,MACE,oCAAoC,WAAW;AAAA,MAC/C;AAAA,MACA;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,SAAS,EAAE,SAAS,YAAY;AAAA,MAClC;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,iBAAN,cAA6B,SAAS;AAAA,EAC3C,YAAY,SAAiB,OAAe;AAC1C,UAAM,UAAqE;AAAA,MACzE,WAAW;AAAA,IACb;AACA,QAAI,OAAO;AACT,cAAQ,UAAU,EAAE,OAAO,MAAM,QAAQ;AAAA,IAC3C;AACA,UAAM,SAAS,mBAAmB,KAAK,OAAO;AAC9C,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,qBAAN,cAAiC,SAAS;AAAA,EAC/C,YAAY,SAAiB,OAAe;AAC1C,UAAM,UAAqE;AAAA,MACzE,WAAW;AAAA,IACb;AACA,QAAI,OAAO;AACT,cAAQ,UAAU,EAAE,OAAO,MAAM,QAAQ;AAAA,IAC3C;AACA,UAAM,SAAS,uBAAuB,KAAK,OAAO;AAClD,SAAK,OAAO;AAAA,EACd;AACF;AAKO,SAAS,WAAW,OAA0B;AACnD,MAAI,iBAAiB,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,OAAO;AAC1B,WAAO,IAAI,SAAS,MAAM,SAAS,kBAAkB,KAAK;AAAA,MACxD,WAAW;AAAA,MACX,SAAS,EAAE,eAAe,MAAM,KAAK;AAAA,IACvC,CAAC;AAAA,EACH;AAEA,SAAO,IAAI,SAAS,OAAO,KAAK,GAAG,iBAAiB,KAAK;AAAA,IACvD,WAAW;AAAA,EACb,CAAC;AACH;;;AClJO,IAAM,iBAAN,MAAqB;AAAA,EAClB,SAAuB;AAAA,EACvB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EACT;AAAA,EAEjB,YAAY,SAAgC;AAC1C,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAsB;AAExB,QAAI,KAAK,WAAW,QAAQ;AAC1B,YAAM,mBAAmB,KAAK,IAAI,IAAI,KAAK;AAC3C,UAAI,oBAAoB,KAAK,QAAQ,cAAc;AACjD,aAAK,aAAa,WAAW;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAW,IAAkC;AAEjD,UAAM,eAAe,KAAK;AAE1B,QAAI,iBAAiB,QAAQ;AAC3B,YAAM,aAAa,KAAK,QAAQ,gBAAgB,KAAK,IAAI,IAAI,KAAK;AAClE,YAAM,IAAI,iBAAiB,WAAW,KAAK,IAAI,GAAG,UAAU,CAAC;AAAA,IAC/D;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,GAAG;AACxB,WAAK,UAAU;AACf,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,UAAU;AACf,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAkB;AACxB,QAAI,KAAK,WAAW,aAAa;AAC/B,WAAK;AACL,UAAI,KAAK,aAAa,KAAK,QAAQ,kBAAkB;AACnD,aAAK,aAAa,QAAQ;AAAA,MAC5B;AAAA,IACF,WAAW,KAAK,WAAW,UAAU;AAEnC,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAkB;AACxB,SAAK,kBAAkB,KAAK,IAAI;AAEhC,QAAI,KAAK,WAAW,aAAa;AAE/B,WAAK,aAAa,MAAM;AAAA,IAC1B,WAAW,KAAK,WAAW,UAAU;AACnC,WAAK;AACL,UAAI,KAAK,YAAY,KAAK,QAAQ,kBAAkB;AAClD,aAAK,aAAa,MAAM;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,UAA8B;AACjD,UAAM,WAAW,KAAK;AACtB,SAAK,SAAS;AAGd,QAAI,aAAa,UAAU;AACzB,WAAK,WAAW;AAChB,WAAK,YAAY;AAAA,IACnB,WAAW,aAAa,aAAa;AACnC,WAAK,YAAY;AAAA,IACnB;AAEA,SAAK,QAAQ,gBAAgB,UAAU,QAAQ;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,aAAa,QAAQ;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,WAKE;AACA,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,WAAW,KAAK;AAAA,MAChB,iBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AACF;;;AC9HO,IAAM,WAAN,MAAe;AAAA,EACZ,cAAc;AAAA,EACL,QAAkC,CAAC;AAAA,EACnC;AAAA,EAEjB,YAAY,SAA0B;AACpC,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAiB;AACnB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAkB;AACpB,WACE,KAAK,eAAe,KAAK,QAAQ,iBACjC,KAAK,MAAM,UAAU,KAAK,QAAQ;AAAA,EAEtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAW,IAAkC;AAEjD,QAAI,KAAK,cAAc,KAAK,QAAQ,eAAe;AACjD,aAAO,KAAK,UAAU,EAAE;AAAA,IAC1B;AAGA,QAAI,KAAK,MAAM,SAAS,KAAK,QAAQ,UAAU;AAC7C,aAAO,KAAK,QAAQ,EAAE;AAAA,IACxB;AAGA,SAAK,QAAQ,aAAa;AAC1B,UAAM,IAAI,sBAAsB,SAAS;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAa,IAAkC;AAC3D,SAAK;AACL,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,UAAE;AACA,WAAK;AACL,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAW,IAAkC;AACnD,WAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACzC,WAAK,MAAM,KAAK;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAqB;AAC3B,QAAI,KAAK,MAAM,WAAW,EAAG;AAC7B,QAAI,KAAK,eAAe,KAAK,QAAQ,cAAe;AAEpD,UAAM,SAAS,KAAK,MAAM,MAAM;AAChC,QAAI,CAAC,OAAQ;AAEb,SAAK,UAAU,OAAO,EAAE,EACrB,KAAK,OAAO,OAAO,EACnB,MAAM,OAAO,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,WAKE;AACA,WAAO;AAAA,MACL,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK,MAAM;AAAA,MACnB,eAAe,KAAK,QAAQ;AAAA,MAC5B,UAAU,KAAK,QAAQ;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,UAAM,QAAQ,IAAI,sBAAsB,SAAS;AACjD,WAAO,KAAK,MAAM,SAAS,GAAG;AAC5B,YAAM,SAAS,KAAK,MAAM,MAAM;AAChC,cAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,EACF;AACF;;;AC3HA,IAAM,qBAAqB,CAAC,UAA4B;AACtD,MAAI,SAAS,OAAO,UAAU,YAAY,eAAe,OAAO;AAC9D,WAAQ,MAAiC;AAAA,EAC3C;AACA,SAAO;AACT;AAKA,SAAS,eACP,SACA,SACQ;AACR,MAAI;AAEJ,MAAI,QAAQ,YAAY,eAAe;AAErC,YAAQ,QAAQ,eAAe,KAAK,IAAI,GAAG,OAAO;AAAA,EACpD,OAAO;AAEL,YAAQ,QAAQ,gBAAgB,UAAU;AAAA,EAC5C;AAGA,UAAQ,KAAK,IAAI,OAAO,QAAQ,QAAQ;AAGxC,MAAI,QAAQ,UAAU,QAAQ,SAAS,GAAG;AACxC,UAAM,cAAc,QAAQ,QAAQ;AACpC,YAAQ,QAAQ,cAAc,IAAI,KAAK,OAAO,IAAI;AAAA,EACpD;AAEA,SAAO,KAAK,MAAM,KAAK;AACzB;AAKA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAmBO,SAAS,UACd,IACA,SACkB;AAClB,QAAM,cAAc,QAAQ,eAAe;AAE3C,SAAO,YAAwB;AAC7B,QAAI;AAEJ,aAAS,UAAU,GAAG,WAAW,QAAQ,UAAU,WAAW;AAC5D,UAAI;AACF,eAAO,MAAM,GAAG;AAAA,MAClB,SAAS,OAAO;AACd,oBAAY;AAGZ,YAAI,WAAW,QAAQ,YAAY,CAAC,YAAY,OAAO,OAAO,GAAG;AAC/D,gBAAM;AAAA,QACR;AAGA,cAAM,QAAQ,eAAe,SAAS,OAAO;AAG7C,gBAAQ,UAAU,OAAO,UAAU,GAAG,KAAK;AAG3C,cAAM,MAAM,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,UAAM;AAAA,EACR;AACF;AASA,eAAsB,iBACpB,IACA,SACY;AACZ,SAAO,UAAU,IAAI,OAAO,EAAE;AAChC;AAcO,SAAS,mBACd,gBAC0E;AAC1E,QAAM,WAAyB;AAAA,IAC7B,UAAU,eAAe,YAAY;AAAA,IACrC,SAAS,eAAe,WAAW;AAAA,IACnC,cAAc,eAAe,gBAAgB;AAAA,IAC7C,UAAU,eAAe,YAAY;AAAA,IACrC,QAAQ,eAAe,UAAU;AAAA,EACnC;AAEA,MAAI,eAAe,aAAa;AAC9B,aAAS,cAAc,eAAe;AAAA,EACxC;AACA,MAAI,eAAe,SAAS;AAC1B,aAAS,UAAU,eAAe;AAAA,EACpC;AAEA,SAAO,OACL,IACA,YACe;AACf,WAAO,iBAAiB,IAAI,EAAE,GAAG,UAAU,GAAG,QAAQ,CAAC;AAAA,EACzD;AACF;;;ACrKO,IAAM,uBAAN,cAAmC,MAAM;AAAA;AAAA,EAErC;AAAA,EAET,YAAY,SAAiB;AAC3B,UAAM,6BAA6B,OAAO,IAAI;AAC9C,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACjB;AACF;AAWO,SAAS,YACd,IACA,WACA,WACkB;AAClB,SAAO,YAAwB;AAC7B,QAAI;AAEJ,UAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,kBAAY,WAAW,MAAM;AAC3B,YAAI,WAAW;AACb,cAAI;AACF,sBAAU;AAAA,UACZ,SAAS,OAAO;AACd,mBAAO,KAAK;AACZ;AAAA,UACF;AAAA,QACF;AACA,eAAO,IAAI,qBAAqB,SAAS,CAAC;AAAA,MAC5C,GAAG,SAAS;AAAA,IACd,CAAC;AAED,QAAI;AACF,aAAO,MAAM,QAAQ,KAAK,CAAC,GAAG,GAAG,cAAc,CAAC;AAAA,IAClD,UAAE;AACA,UAAI,cAAc,QAAW;AAC3B,qBAAa,SAAS;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;AAUA,eAAsB,mBACpB,IACA,WACA,WACY;AACZ,SAAO,YAAY,IAAI,WAAW,SAAS,EAAE;AAC/C;AAQO,SAAS,qBACd,kBAC6D;AAC7D,SAAO,OAAU,IAAsB,cAAmC;AACxE,WAAO,mBAAmB,IAAI,aAAa,gBAAgB;AAAA,EAC7D;AACF;AAUA,eAAsB,gBACpB,UACA,WACY;AACZ,MAAI;AAEJ,QAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,gBAAY,WAAW,MAAM;AAC3B,aAAO,IAAI,qBAAqB,SAAS,CAAC;AAAA,IAC5C,GAAG,SAAS;AAAA,EACd,CAAC;AAED,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,CAAC,GAAG,UAAU,cAAc,CAAC;AAAA,EACzD,UAAE;AACA,QAAI,cAAc,QAAW;AAC3B,mBAAa,SAAS;AAAA,IACxB;AAAA,EACF;AACF;AAUA,eAAsB,oBACpB,IACA,UACY;AACZ,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,aAAa,SAAS,QAAQ;AACpC,QAAM,YAAY,KAAK,IAAI,GAAG,aAAa,GAAG;AAE9C,MAAI,cAAc,GAAG;AACnB,UAAM,IAAI,qBAAqB,CAAC;AAAA,EAClC;AAEA,SAAO,mBAAmB,IAAI,SAAS;AACzC;;;ALrGO,IAAM,YAAN,MAAgB;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAA2B;AACrC,SAAK,UAAU,QAAQ;AACvB,SAAK,YAAY,QAAQ;AACzB,SAAK,SAAS,YAAY,QAAQ,MAAM;AACxC,SAAK,kBAAkB,QAAQ,mBAAmB,CAAC;AAGnD,UAAM,WAAW,KAAK,OAAO,YAAY;AACzC,QACE,YACA,SAAS,WACT,SAAS,qBAAqB,UAC9B,SAAS,iBAAiB,UAC1B,SAAS,qBAAqB,QAC9B;AACA,WAAK,iBAAiB,IAAI,eAAe;AAAA,QACvC,kBAAkB,SAAS;AAAA,QAC3B,cAAc,SAAS;AAAA,QACvB,kBAAkB,SAAS;AAAA,MAC7B,CAAC;AAAA,IACH,OAAO;AACL,WAAK,iBAAiB;AAAA,IACxB;AAGA,UAAM,WAAW,KAAK,OAAO,YAAY;AACzC,QAAI,YAAY,SAAS,kBAAkB,UAAa,SAAS,aAAa,QAAW;AACvF,WAAK,WAAW,IAAI,SAAS;AAAA,QAC3B,eAAe,SAAS;AAAA,QACxB,UAAU,SAAS;AAAA,MACrB,CAAC;AAAA,IACH,OAAO;AACL,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MACJ,QACA,OACA,SACkB;AAClB,WAAO,KAAK,KAAsB,SAAS,QAAQ,OAAO,OAAO;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,QACA,OACA,SACkB;AAClB,WAAO,KAAK,KAAsB,YAAY,QAAQ,OAAO,OAAO;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,KACZ,MACA,QACA,OACA,SACkB;AAClB,UAAM,UAA8B;AAAA,MAClC,IAAI,WAAW;AAAA,MACf,SAAS,KAAK;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,QACR,GAAG,KAAK;AAAA,QACR,GAAG,SAAS;AAAA,MACd;AAAA,IACF;AAEA,UAAM,UAAU,SAAS,WAAW,KAAK,OAAO,WAAW;AAC3D,QAAI,SAAS;AACX,cAAQ,UAAU;AAAA,IACpB;AACA,QAAI,SAAS,cAAc;AACzB,cAAQ,eAAe,QAAQ;AAAA,IACjC;AAEA,UAAM,UAAU,SAAS,WAAW,KAAK,OAAO,WAAW,WAAW;AACtE,UAAM,cAAc,SAAS,SAAS,KAAK,OAAO,WAAW;AAG7D,QAAI,UAAU,YAA8B;AAC1C,YAAM,WAAW,MAAM,KAAK,UAAU,KAAsB,OAAO;AAEnE,UAAI,CAAC,SAAS,SAAS;AACrB,cAAM,QAAQ;AAAA,UACZ,IAAI,MAAM,SAAS,OAAO,WAAW,eAAe;AAAA,QACtD;AACA,cAAM;AAAA,MACR;AAEA,aAAO,SAAS;AAAA,IAClB;AAGA,cAAU,YAAY,SAAS,SAAS,MAAM;AAC5C,YAAM,IAAI,aAAa,KAAK,SAAS,QAAQ,OAAO;AAAA,IACtD,CAAC;AAGD,UAAM,WAAW,aAAa,YAAY;AAC1C,QAAI,WAAW,GAAG;AAChB,gBAAU,UAAU,SAAS;AAAA,QAC3B;AAAA,QACA,SAAS,aAAa,WAAW;AAAA,QACjC,cAAc,aAAa,gBAAgB;AAAA,QAC3C,UAAU,aAAa,YAAY;AAAA,QACnC,aAAa,CAAC,UAAU;AACtB,cAAI,iBAAiB,SAAS,eAAe,OAAO;AAClD,mBAAQ,MAAiC;AAAA,UAC3C;AACA,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,gBAAgB;AACvB,YAAM,KAAK,KAAK;AAChB,YAAM,kBAAkB;AACxB,gBAAU,YAAY;AACpB,eAAO,GAAG,QAAQ,eAAe;AAAA,MACnC;AAAA,IACF;AAGA,QAAI,KAAK,UAAU;AACjB,YAAM,KAAK,KAAK;AAChB,YAAM,kBAAkB;AACxB,gBAAU,YAAY;AACpB,eAAO,GAAG,QAAQ,eAAe;AAAA,MACnC;AAAA,IACF;AAEA,WAAO,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAA0D;AACxD,WAAO,KAAK,gBAAgB,SAAS;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAkE;AAChE,QAAI,CAAC,KAAK,SAAU,QAAO;AAC3B,WAAO;AAAA,MACL,YAAY,KAAK,SAAS;AAAA,MAC1B,QAAQ,KAAK,SAAS;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,UAAM,KAAK,UAAU,QAAQ;AAAA,EAC/B;AACF;AAwCO,SAAS,gBAAgB,SAAsC;AACpE,SAAO,IAAI,UAAU,OAAO;AAC9B;;;AMxPO,IAAM,oBAAN,MAAgD;AAAA,EAC5C,OAAO;AAAA,EACC;AAAA,EAEjB,YAAY,QAAmB;AAC7B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KAAsB,SAA4D;AAEtF,WAAO,KAAK,OAAO,OAAwB,OAAO;AAAA,EACpD;AAAA,EAEA,MAAM,QAAuB;AAAA,EAE7B;AACF;AAeO,SAAS,wBAAwB,QAAsC;AAC5E,SAAO,IAAI,kBAAkB,MAAM;AACrC;AAUO,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EAC5B,OAAe,WAAoC;AAAA,EAClC,UAAkC,oBAAI,IAAI;AAAA,EAEnD,cAAc;AAAA,EAAC;AAAA,EAEvB,OAAO,cAAgC;AACrC,QAAI,CAAC,kBAAiB,UAAU;AAC9B,wBAAiB,WAAW,IAAI,kBAAiB;AAAA,IACnD;AACA,WAAO,kBAAiB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAc,QAAyB;AAC9C,QAAI,KAAK,QAAQ,IAAI,IAAI,GAAG;AAC1B,YAAM,IAAI,MAAM,+BAA+B,IAAI,EAAE;AAAA,IACvD;AACA,SAAK,QAAQ,IAAI,MAAM,MAAM;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAuB;AAChC,WAAO,KAAK,QAAQ,OAAO,IAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAqC;AACvC,WAAO,KAAK,QAAQ,IAAI,IAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAuB;AACzB,WAAO,KAAK,QAAQ,IAAI,IAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,kBAA4B;AAC1B,WAAO,MAAM,KAAK,KAAK,QAAQ,KAAK,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAiC;AAC/C,UAAM,SAAS,KAAK,QAAQ,IAAI,IAAI;AACpC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,sBAAsB,IAAI,EAAE;AAAA,IAC9C;AACA,WAAO,IAAI,kBAAkB,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAc;AACnB,sBAAiB,WAAW;AAAA,EAC9B;AACF;AAeO,SAAS,sBAAwC;AACtD,SAAO,iBAAiB,YAAY;AACtC;;;AC3HO,IAAM,iBAA6B;AAAA,EACxC,OAAO,MAAuB;AAC5B,WAAO,KAAK,UAAU,IAAI;AAAA,EAC5B;AAAA,EAEA,OAAO,KAAoC;AACzC,QAAI,eAAe,aAAa;AAC9B,YAAM,UAAU,IAAI,YAAY;AAChC,aAAO,KAAK,MAAM,QAAQ,OAAO,GAAG,CAAC;AAAA,IACvC;AACA,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB;AAAA,EAEA,aAAa;AACf;AAUA,SAAS,cAAc,OAA4B;AACjD,QAAM,QAAsB,CAAC;AAE7B,WAAS,OAAO,KAAoB;AAClC,QAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,YAAM,KAAK,IAAI,WAAW,CAAC,GAAI,CAAC,CAAC;AACjC;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,WAAW;AAC5B,YAAM,KAAK,IAAI,WAAW,CAAC,MAAM,MAAO,GAAI,CAAC,CAAC;AAC9C;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,UAAU;AAC3B,UAAI,OAAO,UAAU,GAAG,GAAG;AACzB,YAAI,OAAO,KAAK,OAAO,KAAK;AAE1B,gBAAM,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;AAAA,QAClC,WAAW,MAAM,KAAK,OAAO,KAAK;AAEhC,gBAAM,KAAK,IAAI,WAAW,CAAC,MAAM,GAAI,CAAC,CAAC;AAAA,QACzC,WAAW,OAAO,KAAK,OAAO,KAAM;AAElC,gBAAM,KAAK,IAAI,WAAW,CAAC,KAAM,GAAG,CAAC,CAAC;AAAA,QACxC,WAAW,OAAO,KAAK,OAAO,OAAQ;AAEpC,gBAAM,KAAK,IAAI,WAAW,CAAC,KAAO,OAAO,IAAK,KAAM,MAAM,GAAI,CAAC,CAAC;AAAA,QAClE,WAAW,OAAO,KAAK,OAAO,YAAY;AAExC,gBAAM;AAAA,YACJ,IAAI,WAAW;AAAA,cACb;AAAA,cACC,OAAO,KAAM;AAAA,cACb,OAAO,KAAM;AAAA,cACb,OAAO,IAAK;AAAA,cACb,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF,WAAW,OAAO,QAAQ,OAAO,KAAK;AAEpC,gBAAM,KAAK,IAAI,WAAW,CAAC,KAAM,MAAM,GAAI,CAAC,CAAC;AAAA,QAC/C,WAAW,OAAO,UAAU,OAAO,OAAO;AAExC,gBAAM,KAAK,IAAI,WAAW,CAAC,KAAO,OAAO,IAAK,KAAM,MAAM,GAAI,CAAC,CAAC;AAAA,QAClE,WAAW,OAAO,eAAe,OAAO,YAAY;AAElD,gBAAM;AAAA,YACJ,IAAI,WAAW;AAAA,cACb;AAAA,cACC,OAAO,KAAM;AAAA,cACb,OAAO,KAAM;AAAA,cACb,OAAO,IAAK;AAAA,cACb,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AAEL,gBAAM,SAAS,IAAI,YAAY,CAAC;AAChC,gBAAM,OAAO,IAAI,SAAS,MAAM;AAChC,eAAK,SAAS,GAAG,GAAI;AACrB,eAAK,WAAW,GAAG,KAAK,KAAK;AAC7B,gBAAM,KAAK,IAAI,WAAW,MAAM,CAAC;AAAA,QACnC;AAAA,MACF,OAAO;AAEL,cAAM,SAAS,IAAI,YAAY,CAAC;AAChC,cAAM,OAAO,IAAI,SAAS,MAAM;AAChC,aAAK,SAAS,GAAG,GAAI;AACrB,aAAK,WAAW,GAAG,KAAK,KAAK;AAC7B,cAAM,KAAK,IAAI,WAAW,MAAM,CAAC;AAAA,MACnC;AACA;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,UAAU;AAC3B,YAAM,UAAU,IAAI,YAAY,EAAE,OAAO,GAAG;AAC5C,YAAM,MAAM,QAAQ;AAEpB,UAAI,OAAO,IAAI;AAEb,cAAM,KAAK,IAAI,WAAW,CAAC,MAAO,GAAG,CAAC,CAAC;AAAA,MACzC,WAAW,OAAO,KAAM;AAEtB,cAAM,KAAK,IAAI,WAAW,CAAC,KAAM,GAAG,CAAC,CAAC;AAAA,MACxC,WAAW,OAAO,OAAQ;AAExB,cAAM,KAAK,IAAI,WAAW,CAAC,KAAO,OAAO,IAAK,KAAM,MAAM,GAAI,CAAC,CAAC;AAAA,MAClE,OAAO;AAEL,cAAM;AAAA,UACJ,IAAI,WAAW;AAAA,YACb;AAAA,YACC,OAAO,KAAM;AAAA,YACb,OAAO,KAAM;AAAA,YACb,OAAO,IAAK;AAAA,YACb,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AACA,YAAM,KAAK,OAAO;AAClB;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,YAAM,MAAM,IAAI;AAEhB,UAAI,OAAO,IAAI;AAEb,cAAM,KAAK,IAAI,WAAW,CAAC,MAAO,GAAG,CAAC,CAAC;AAAA,MACzC,WAAW,OAAO,OAAQ;AAExB,cAAM,KAAK,IAAI,WAAW,CAAC,KAAO,OAAO,IAAK,KAAM,MAAM,GAAI,CAAC,CAAC;AAAA,MAClE,OAAO;AAEL,cAAM;AAAA,UACJ,IAAI,WAAW;AAAA,YACb;AAAA,YACC,OAAO,KAAM;AAAA,YACb,OAAO,KAAM;AAAA,YACb,OAAO,IAAK;AAAA,YACb,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAEA,iBAAW,QAAQ,KAAK;AACtB,eAAO,IAAI;AAAA,MACb;AACA;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,UAAU;AAC3B,YAAM,OAAO,OAAO,KAAK,GAAa;AACtC,YAAM,MAAM,KAAK;AAEjB,UAAI,OAAO,IAAI;AAEb,cAAM,KAAK,IAAI,WAAW,CAAC,MAAO,GAAG,CAAC,CAAC;AAAA,MACzC,WAAW,OAAO,OAAQ;AAExB,cAAM,KAAK,IAAI,WAAW,CAAC,KAAO,OAAO,IAAK,KAAM,MAAM,GAAI,CAAC,CAAC;AAAA,MAClE,OAAO;AAEL,cAAM;AAAA,UACJ,IAAI,WAAW;AAAA,YACb;AAAA,YACC,OAAO,KAAM;AAAA,YACb,OAAO,KAAM;AAAA,YACb,OAAO,IAAK;AAAA,YACb,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAEA,iBAAW,OAAO,MAAM;AACtB,eAAO,GAAG;AACV,eAAQ,IAAgC,GAAG,CAAC;AAAA,MAC9C;AACA;AAAA,IACF;AAGA,UAAM,KAAK,IAAI,WAAW,CAAC,GAAI,CAAC,CAAC;AAAA,EACnC;AAEA,SAAO,KAAK;AAGZ,QAAM,cAAc,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AAC9D,QAAM,SAAS,IAAI,WAAW,WAAW;AACzC,MAAI,SAAS;AACb,aAAW,QAAQ,OAAO;AACxB,WAAO,IAAI,MAAM,MAAM;AACvB,cAAU,KAAK;AAAA,EACjB;AAEA,SAAO;AACT;AAKA,SAAS,cAAc,QAA6B;AAClD,MAAI,SAAS;AAEb,WAAS,SAAkB;AACzB,QAAI,UAAU,OAAO,QAAQ;AAC3B,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,UAAM,OAAO,OAAO,QAAQ;AAG5B,QAAI,QAAQ,KAAM;AAChB,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,KAAM;AAChB,aAAO,OAAO;AAAA,IAChB;AAGA,QAAI,QAAQ,OAAQ,QAAQ,KAAM;AAChC,YAAM,MAAM,OAAO;AACnB,YAAM,SAAkC,CAAC;AACzC,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,cAAM,MAAM,OAAO;AACnB,eAAO,GAAG,IAAI,OAAO;AAAA,MACvB;AACA,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,OAAQ,QAAQ,KAAM;AAChC,YAAM,MAAM,OAAO;AACnB,YAAM,SAAoB,CAAC;AAC3B,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,eAAO,KAAK,OAAO,CAAC;AAAA,MACtB;AACA,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,OAAQ,QAAQ,KAAM;AAChC,YAAM,MAAM,OAAO;AACnB,YAAM,MAAM,IAAI,YAAY,EAAE,OAAO,OAAO,SAAS,QAAQ,SAAS,GAAG,CAAC;AAC1E,gBAAU;AACV,aAAO;AAAA,IACT;AAEA,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MAET,KAAK;AACH,eAAO,OAAO,QAAQ;AAAA,MACxB,KAAK;AACH,eAAQ,OAAO,QAAQ,KAAM,IAAK,OAAO,QAAQ;AAAA,MACnD,KAAK;AACH,gBACI,OAAO,QAAQ,KAAM,OAAQ,MAC9B,OAAO,QAAQ,KAAM,OACrB,OAAO,QAAQ,KAAM,KACtB,OAAO,QAAQ;AAAA,MAGnB,KAAK,KACH;AACE,cAAM,MAAM,OAAO,QAAQ;AAC3B,eAAO,MAAM,MAAM,MAAM,MAAM;AAAA,MACjC;AAAA,MACF,KAAK,KACH;AACE,cAAM,MAAO,OAAO,QAAQ,KAAM,IAAK,OAAO,QAAQ;AACtD,eAAO,MAAM,QAAQ,MAAM,QAAQ;AAAA,MACrC;AAAA,MACF,KAAK,KACH;AACE,cAAM,MACH,OAAO,QAAQ,KAAM,KACrB,OAAO,QAAQ,KAAM,KACrB,OAAO,QAAQ,KAAM,IACtB,OAAO,QAAQ;AACjB,eAAO;AAAA,MACT;AAAA,MAEF,KAAK,KACH;AACE,cAAM,OAAO,IAAI,SAAS,OAAO,QAAQ,OAAO,aAAa,QAAQ,CAAC;AACtE,kBAAU;AACV,eAAO,KAAK,WAAW,GAAG,KAAK;AAAA,MACjC;AAAA,MAEF,KAAK,KACH;AACE,cAAM,MAAM,OAAO,QAAQ;AAC3B,cAAM,MAAM,IAAI,YAAY,EAAE,OAAO,OAAO,SAAS,QAAQ,SAAS,GAAG,CAAC;AAC1E,kBAAU;AACV,eAAO;AAAA,MACT;AAAA,MACF,KAAK,KACH;AACE,cAAM,MAAO,OAAO,QAAQ,KAAM,IAAK,OAAO,QAAQ;AACtD,cAAM,MAAM,IAAI,YAAY,EAAE,OAAO,OAAO,SAAS,QAAQ,SAAS,GAAG,CAAC;AAC1E,kBAAU;AACV,eAAO;AAAA,MACT;AAAA,MACF,KAAK,KACH;AACE,cAAM,MACH,OAAO,QAAQ,KAAM,KACrB,OAAO,QAAQ,KAAM,KACrB,OAAO,QAAQ,KAAM,IACtB,OAAO,QAAQ;AACjB,cAAM,MAAM,IAAI,YAAY,EAAE,OAAO,OAAO,SAAS,QAAQ,SAAS,GAAG,CAAC;AAC1E,kBAAU;AACV,eAAO;AAAA,MACT;AAAA,MAEF,KAAK,KACH;AACE,cAAM,MAAO,OAAO,QAAQ,KAAM,IAAK,OAAO,QAAQ;AACtD,cAAM,SAAoB,CAAC;AAC3B,iBAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,iBAAO,KAAK,OAAO,CAAC;AAAA,QACtB;AACA,eAAO;AAAA,MACT;AAAA,MACF,KAAK,KACH;AACE,cAAM,MACH,OAAO,QAAQ,KAAM,KACrB,OAAO,QAAQ,KAAM,KACrB,OAAO,QAAQ,KAAM,IACtB,OAAO,QAAQ;AACjB,cAAM,SAAoB,CAAC;AAC3B,iBAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,iBAAO,KAAK,OAAO,CAAC;AAAA,QACtB;AACA,eAAO;AAAA,MACT;AAAA,MAEF,KAAK,KACH;AACE,cAAM,MAAO,OAAO,QAAQ,KAAM,IAAK,OAAO,QAAQ;AACtD,cAAM,SAAkC,CAAC;AACzC,iBAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,gBAAM,MAAM,OAAO;AACnB,iBAAO,GAAG,IAAI,OAAO;AAAA,QACvB;AACA,eAAO;AAAA,MACT;AAAA,MACF,KAAK,KACH;AACE,cAAM,MACH,OAAO,QAAQ,KAAM,KACrB,OAAO,QAAQ,KAAM,KACrB,OAAO,QAAQ,KAAM,IACtB,OAAO,QAAQ;AACjB,cAAM,SAAkC,CAAC;AACzC,iBAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,gBAAM,MAAM,OAAO;AACnB,iBAAO,GAAG,IAAI,OAAO;AAAA,QACvB;AACA,eAAO;AAAA,MACT;AAAA,MAEF;AACE,cAAM,IAAI,MAAM,+BAA+B,KAAK,SAAS,EAAE,CAAC,EAAE;AAAA,IACtE;AAAA,EACF;AAEA,SAAO,OAAO;AAChB;AAKO,IAAM,oBAAgC;AAAA,EAC3C,OAAO,MAA4B;AACjC,UAAM,UAAU,cAAc,IAAI;AAElC,UAAM,SAAS,IAAI,YAAY,QAAQ,UAAU;AACjD,QAAI,WAAW,MAAM,EAAE,IAAI,OAAO;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,KAAoC;AACzC,QAAI,OAAO,QAAQ,UAAU;AAE3B,YAAM,SAAS,KAAK,GAAG;AACvB,YAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAC1C,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,cAAM,CAAC,IAAI,OAAO,WAAW,CAAC;AAAA,MAChC;AACA,aAAO,cAAc,KAAK;AAAA,IAC5B;AACA,WAAO,cAAc,IAAI,WAAW,GAAG,CAAC;AAAA,EAC1C;AAAA,EAEA,aAAa;AACf;AAmBO,SAAS,cAAc,QAAwC;AACpE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAoBO,SAAS,iBAAiB,SAIlB;AACb,SAAO;AACT;;;AC5cO,IAAM,gBAAN,MAA4C;AAAA,EACxC,OAAO;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAA+B;AACzC,SAAK,UAAU,QAAQ,QAAQ,QAAQ,OAAO,EAAE;AAChD,SAAK,aAAa,QAAQ,cAAc;AACxC,SAAK,UAAU,QAAQ,WAAW,CAAC;AACnC,SAAK,UAAU,QAAQ,SAAS,WAAW,MAAM,KAAK,UAAU;AAChE,SAAK,UAAU,QAAQ,WAAW;AAAA,EACpC;AAAA,EAEA,MAAM,KAAsB,SAA4D;AACtF,UAAM,MAAM,GAAG,KAAK,OAAO;AAC3B,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,OAAO;AAEnE,QAAI;AAEF,UAAI;AACJ,UAAI;AACF,eAAO,KAAK,WAAW,OAAO,OAAO;AAAA,MACvC,SAAS,OAAO;AACd,cAAM,IAAI;AAAA,UACR;AAAA,UACA,iBAAiB,QAAQ,QAAQ;AAAA,QACnC;AAAA,MACF;AAGA,YAAM,WAAW,MAAM,KAAK,QAAQ,KAAK;AAAA,QACvC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB,KAAK,WAAW;AAAA,UAChC,QAAQ,KAAK,WAAW;AAAA,UACxB,gBAAgB,QAAQ;AAAA,UACxB,aAAa,QAAQ;AAAA,UACrB,YAAY,QAAQ;AAAA,UACpB,iBAAiB,QAAQ;AAAA,UACzB,GAAI,QAAQ,UAAU,EAAE,qBAAqB,QAAQ,QAAQ,IAAI,CAAC;AAAA,UAClE,GAAI,QAAQ,eACR;AAAA,YACE,aAAa,kBAAkB,QAAQ,YAAY;AAAA,YACnD,GAAI,QAAQ,aAAa,aACrB,EAAE,YAAY,QAAQ,aAAa,WAAW,IAC9C,CAAC;AAAA,UACP,IACA,CAAC;AAAA,UACL,GAAG,KAAK;AAAA,QACV;AAAA,QACA,MAAM,gBAAgB,cAAc,OAAO;AAAA,QAC3C,QAAQ,WAAW;AAAA,MACrB,CAAC;AAGD,UAAI;AACJ,UAAI;AACF,cAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,YAAI,YAAY,SAAS,SAAS,GAAG;AACnC,gBAAM,SAAS,MAAM,SAAS,YAAY;AAC1C,yBAAe,KAAK,WAAW,OAAO,MAAM;AAAA,QAC9C,OAAO;AACL,gBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,yBAAe,KAAK,WAAW,OAAO,IAAI;AAAA,QAC5C;AAAA,MACF,SAAS,OAAO;AACd,cAAM,IAAI;AAAA,UACR;AAAA,UACA,iBAAiB,QAAQ,QAAQ;AAAA,QACnC;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,oBAAoB;AACvC,cAAM;AAAA,MACR;AAEA,UAAI,iBAAiB,OAAO;AAC1B,YAAI,MAAM,SAAS,cAAc;AAC/B,gBAAM,IAAI,eAAe,yBAAyB,KAAK,OAAO,IAAI;AAAA,QACpE;AACA,cAAM,IAAI,eAAe,wBAAwB,MAAM,OAAO,IAAI,KAAK;AAAA,MACzE;AAEA,YAAM,IAAI,eAAe,yBAAyB;AAAA,IACpD,UAAE;AACA,mBAAa,SAAS;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAAA,EAE7B;AACF;AAgBO,SAAS,oBAAoB,SAA8C;AAChF,SAAO,IAAI,cAAc,OAAO;AAClC;AAWA,SAAS,kBAAkB,KAA2B;AACpD,QAAM,QAAQ,IAAI,WAAW,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACzD,SAAO,MAAM,IAAI,OAAO,IAAI,IAAI,MAAM,IAAI,KAAK;AACjD;AAcO,SAAS,iBAAiB,QAAqC;AACpE,QAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,SAAS,SAAS,QAAQ,KAAK,IAAI;AAC1C,MAAI,YAAY,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO;AACrD,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW,MAAM,OAAO,WAAW,MAAM,MAAM,WAAW,GAAG;AACvE,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,SAAS,OAAO,EAAE;AAAA,EAChC;AACF;AAsBO,SAAS,kBAAkB,QAAmB;AACnD,SAAO,OAAO,YAAwC;AACpD,QAAI;AAEF,YAAM,cAAc,QAAQ,QAAQ,IAAI,cAAc,KAAK;AAC3D,UAAI;AAEJ,UAAI,YAAY,SAAS,SAAS,GAAG;AACnC,cAAM,SAAS,MAAM,QAAQ,YAAY;AAEzC,eAAO,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,MAAM,CAAC;AAAA,MACpD,OAAO;AACL,eAAO,MAAM,QAAQ,KAAK;AAAA,MAC5B;AAEA,YAAM,aAAa;AAGnB,YAAM,cAAc,QAAQ,QAAQ,IAAI,aAAa;AACrD,UAAI,aAAa;AACf,cAAM,eAAe,iBAAiB,WAAW;AACjD,YAAI,cAAc;AAChB,gBAAM,aAAa,QAAQ,QAAQ,IAAI,YAAY;AACnD,cAAI,YAAY;AACd,yBAAa,aAAa;AAAA,UAC5B;AACA,qBAAW,eAAe;AAAA,QAC5B;AAAA,MACF;AAGA,YAAM,WAAW,MAAM,OAAO,OAAO,UAAU;AAG/C,aAAO,IAAI,SAAS,KAAK,UAAU,QAAQ,GAAG;AAAA,QAC5C,QAAQ,SAAS,UAAU,MAAM,cAAc,SAAS,OAAO,IAAI;AAAA,QACnE,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,gBAAgB,WAAW;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,aAAO,IAAI;AAAA,QACT,KAAK,UAAU;AAAA,UACb,SAAS;AAAA,UACT,OAAO;AAAA,YACL,MAAM;AAAA,YACN;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QACD;AAAA,UACE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKA,SAAS,cAAc,MAAuB;AAC5C,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;ACzSA,SAAS,gBAAAC,qBAAoB;;;ACA7B,SAAS,oBAAoB;;;ACD7B,SAAS,cAAAC,mBAAkB;AAqCpB,SAAS,YAAyB,SAA8C;AACrF,QAAM,QAAsB;AAAA,IAC1B,aAAa;AAAA,IACb,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,IAAI,QAAQ,MAAMA,YAAW;AAAA,IAC7B,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC7B,iBAAiB;AAAA,IACjB,MAAM,QAAQ;AAAA,EAChB;AAEA,MAAI,QAAQ,QAAS,OAAM,UAAU,QAAQ;AAC7C,MAAI,QAAQ,SAAU,OAAM,eAAe,QAAQ;AACnD,MAAI,QAAQ,UAAW,OAAM,gBAAgB,QAAQ;AACrD,MAAI,QAAQ,aAAc,OAAM,mBAAmB,mBAAmB,QAAQ,YAAY;AAC1F,MAAI,QAAQ,SAAU,OAAM,eAAe,QAAQ;AAEnD,SAAO;AACT;AAYO,SAAS,aAAgB,OAAmC;AACjE,SAAO,EAAE,GAAG,MAAM;AACpB;AAQO,SAAS,eAAkB,OAAsC;AACtE,QAAM,UAA2B;AAAA,IAC/B,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,IACT,GAAG,IAAI,KAAK,MAAM,IAAI,EAAE,QAAQ;AAAA,IAChC,GAAG,MAAM;AAAA,EACX;AAEA,MAAI,MAAM,iBAAkB,SAAQ,MAAM,MAAM;AAChD,MAAI,MAAM,aAAc,SAAQ,MAAM,MAAM;AAE5C,SAAO;AACT;AASO,SAAS,iBAAoB,SAA0B,QAA+B;AAC3F,QAAM,QAAsB;AAAA,IAC1B,aAAa;AAAA,IACb,MAAM,QAAQ;AAAA,IACd,QAAQ,UAAU,QAAQ;AAAA,IAC1B,IAAI,QAAQ;AAAA,IACZ,MAAM,IAAI,KAAK,QAAQ,CAAC,EAAE,YAAY;AAAA,IACtC,iBAAiB;AAAA,IACjB,MAAM,QAAQ;AAAA,EAChB;AAEA,MAAI,QAAQ,IAAK,OAAM,mBAAmB,QAAQ;AAClD,MAAI,QAAQ,IAAK,OAAM,eAAe,QAAQ;AAE9C,SAAO;AACT;AAmBO,SAAS,gBAAgB,QAAgB,MAAsB;AACpE,SAAO,YAAY,MAAM,IAAI,IAAI;AACnC;AAcO,SAAS,eAAe,UAA2D;AACxF,QAAM,SAAS;AACf,MAAI,CAAC,SAAS,WAAW,MAAM,GAAG;AAEhC,UAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,QAAI,MAAM,UAAU,GAAG;AACrB,YAAM,CAAC,QAAQ,GAAG,IAAI,IAAI;AAC1B,aAAO,EAAE,QAAiB,MAAM,KAAK,KAAK,GAAG,EAAE;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,SAAS,MAAM,OAAO,MAAM;AAClD,QAAM,WAAW,cAAc,QAAQ,GAAG;AAC1C,MAAI,aAAa,IAAI;AACnB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,QAAQ,cAAc,MAAM,GAAG,QAAQ;AAAA,IACvC,MAAM,cAAc,MAAM,WAAW,CAAC;AAAA,EACxC;AACF;AAiBO,SAAS,eAAe,MAAc,SAA0B;AACrE,MAAI,YAAY,OAAO,YAAY,MAAM;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,KAAK,MAAM,GAAG;AAChC,QAAM,eAAe,QAAQ,MAAM,GAAG;AAEtC,MAAI,KAAK;AACT,MAAI,KAAK;AAET,SAAO,KAAK,UAAU,UAAU,KAAK,aAAa,QAAQ;AACxD,UAAM,KAAK,aAAa,EAAE;AAE1B,QAAI,OAAO,MAAM;AAEf,UAAI,OAAO,aAAa,SAAS,GAAG;AAClC,eAAO;AAAA,MACT;AAEA,eAAS,IAAI,IAAI,KAAK,UAAU,QAAQ,KAAK;AAC3C,cAAM,YAAY,UAAU,MAAM,CAAC,EAAE,KAAK,GAAG;AAC7C,cAAM,mBAAmB,aAAa,MAAM,KAAK,CAAC,EAAE,KAAK,GAAG;AAC5D,YAAI,eAAe,WAAW,gBAAgB,GAAG;AAC/C,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,KAAK;AAEd;AACA;AACA;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,EAAE,GAAG;AACxB,aAAO;AAAA,IACT;AAEA;AACA;AAAA,EACF;AAEA,SAAO,OAAO,UAAU,UAAU,OAAO,aAAa;AACxD;AASA,SAAS,mBAAmB,KAA2B;AACrD,QAAM,QAAQ,IAAI,WAAW,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACzD,SAAO,MAAM,IAAI,OAAO,IAAI,IAAI,MAAM,IAAI,KAAK;AACjD;AAoCO,SAAS,cAAc,OAAoC;AAChE,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAGV,MAAI,EAAE,aAAa,MAAM,MAAO,QAAO;AACvC,MAAI,OAAO,EAAE,MAAM,MAAM,YAAa,EAAE,MAAM,EAAa,WAAW,EAAG,QAAO;AAChF,MAAI,OAAO,EAAE,QAAQ,MAAM,YAAa,EAAE,QAAQ,EAAa,WAAW,EAAG,QAAO;AACpF,MAAI,OAAO,EAAE,IAAI,MAAM,YAAa,EAAE,IAAI,EAAa,WAAW,EAAG,QAAO;AAC5E,MAAI,OAAO,EAAE,MAAM,MAAM,SAAU,QAAO;AAE1C,SAAO;AACT;AAQO,SAAS,qBAAqB,OAAuC;AAC1E,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAEV,MAAI,OAAO,EAAE,GAAG,MAAM,YAAa,EAAE,GAAG,EAAa,WAAW,EAAG,QAAO;AAC1E,MAAI,OAAO,EAAE,GAAG,MAAM,YAAa,EAAE,GAAG,EAAa,WAAW,EAAG,QAAO;AAC1E,MAAI,OAAO,EAAE,GAAG,MAAM,YAAa,EAAE,GAAG,EAAa,WAAW,EAAG,QAAO;AAC1E,MAAI,OAAO,EAAE,GAAG,MAAM,SAAU,QAAO;AAEvC,SAAO;AACT;;;ADxQO,IAAM,uBAAN,MAA2B;AAAA,EACf,WAA+C,oBAAI,IAAI;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,UAAuC,CAAC,GAAG;AACrD,SAAK,SAAS,QAAQ,UAAU,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACtE,QAAI,QAAQ,iBAAiB;AAC3B,WAAK,kBAAkB,QAAQ;AAAA,IACjC;AACA,UAAM,cAAsC;AAAA,MAC1C,SAAS,QAAQ,gBAAgB,WAAW;AAAA,MAC5C,SAAS,QAAQ,gBAAgB,WAAW;AAAA,MAC5C,UAAU,QAAQ,gBAAgB,YAAY;AAAA,MAC9C,aAAa,QAAQ,gBAAgB,eAAe;AAAA,IACtD;AACA,QAAI,QAAQ,gBAAgB,YAAY;AACtC,kBAAY,aAAa,QAAQ,eAAe;AAAA,IAClD;AACA,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,SACE,SACA,SACA,SACa;AACb,UAAM,eAAoC;AAAA,MACxC;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,GAAG,KAAK;AAAA,QACR,GAAG;AAAA,MACL;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC;AAChD,aAAS,KAAK,YAAY;AAC1B,SAAK,SAAS,IAAI,SAAS,QAAQ;AAEnC,SAAK,OAAO,MAAM,mCAAmC,OAAO,EAAE;AAG9D,WAAO,MAAM;AACX,YAAM,kBAAkB,KAAK,SAAS,IAAI,OAAO;AACjD,UAAI,iBAAiB;AACnB,cAAM,QAAQ,gBAAgB,QAAQ,YAAY;AAClD,YAAI,UAAU,IAAI;AAChB,0BAAgB,OAAO,OAAO,CAAC;AAC/B,cAAI,gBAAgB,WAAW,GAAG;AAChC,iBAAK,SAAS,OAAO,OAAO;AAAA,UAC9B;AACA,eAAK,OAAO,MAAM,qCAAqC,OAAO,EAAE;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAiC;AAC5C,UAAM,mBAAmB,KAAK,oBAAoB,MAAM,IAAI;AAE5D,QAAI,iBAAiB,WAAW,GAAG;AACjC,WAAK,OAAO,MAAM,+BAA+B,MAAM,IAAI,IAAI;AAAA,QAC7D,SAAS,MAAM;AAAA,MACjB,CAAC;AACD;AAAA,IACF;AAEA,SAAK,OAAO,MAAM,mBAAmB,MAAM,IAAI,IAAI;AAAA,MACjD,SAAS,MAAM;AAAA,MACf,cAAc,iBAAiB;AAAA,IACjC,CAAC;AAGD,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,iBAAiB,IAAI,CAAC,QAAQ,KAAK,eAAe,OAAO,GAAG,CAAC;AAAA,IAC/D;AAGA,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,SAAS,QAAQ,CAAC;AACxB,UAAI,QAAQ,WAAW,YAAY;AACjC,aAAK,OAAO;AAAA,UACV,sBAAsB,MAAM,IAAI;AAAA,UAChC,OAAO;AAAA,UACP,EAAE,SAAS,MAAM,IAAI,SAAS,iBAAiB,CAAC,GAAG,QAAQ;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eACZ,OACA,cACe;AACf,UAAM,EAAE,SAAS,QAAQ,IAAI;AAC7B,UAAM,cAAc,QAAQ,UAAU;AACtC,QAAI;AAEJ,aAAS,UAAU,GAAG,WAAW,aAAa,WAAW;AACvD,UAAI;AACF,cAAM,UAA+B;AAAA,UACnC,QAAQ,KAAK,OAAO,MAAM;AAAA,YACxB,SAAS,MAAM;AAAA,YACf,SAAS,aAAa;AAAA,YACtB;AAAA,UACF,CAAC;AAAA,UACD;AAAA,UACA;AAAA,UACA,SAAS,UAAU;AAAA,QACrB;AAGA,YAAI,MAAM,kBAAkB;AAC1B,gBAAM,WAAW,kBAAkB,MAAM,gBAAgB;AACzD,cAAI,UAAU;AACZ,oBAAQ,eAAe;AAAA,UACzB;AAAA,QACF;AAEA,cAAM,QAAQ,OAAO,OAAO;AAC5B;AAAA,MACF,SAAS,OAAO;AACd,oBAAY;AAEZ,YAAI,UAAU,aAAa;AACzB,gBAAM,QAAQ,KAAK,iBAAiB,SAAS,OAAO;AACpD,eAAK,OAAO;AAAA,YACV,+BAA+B,KAAK;AAAA,YACpC,EAAE,SAAS,MAAM,IAAI,SAAS,YAAY;AAAA,UAC5C;AACA,gBAAMC,OAAM,KAAK;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAGA,UAAM,KAAK,gBAAgB,OAAO,cAAc,SAAU;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKQ,iBACN,SACA,SACQ;AACR,UAAM,YAAY;AAElB,QAAI,QAAQ,YAAY,eAAe;AACrC,aAAO,KAAK,IAAI,YAAY,KAAK,IAAI,GAAG,UAAU,CAAC,GAAG,QAAQ,QAAQ;AAAA,IACxE;AAGA,WAAO,KAAK,IAAI,YAAY,SAAS,QAAQ,QAAQ;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBACZ,OACA,cACA,OACe;AACf,UAAM,EAAE,QAAQ,IAAI;AAGpB,QAAI,QAAQ,cAAc,KAAK,iBAAiB;AAC9C,YAAM,KAAK,gBAAgB,IAAI;AAAA,QAC7B;AAAA,QACA,OAAO,MAAM;AAAA,QACb,SAAS,aAAa;AAAA,QACtB,UAAU,QAAQ,UAAU;AAAA,MAC9B,CAAC;AAAA,IACH;AAGA,YAAQ,QAAQ,aAAa;AAAA,MAC3B,KAAK;AACH,aAAK,OAAO;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,YACE,SAAS,MAAM;AAAA,YACf,WAAW,MAAM;AAAA,YACjB,SAAS,aAAa;AAAA,UACxB;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,aAAK,OAAO,MAAM,2CAA2C;AAAA,UAC3D,SAAS,MAAM;AAAA,QACjB,CAAC;AACD;AAAA,MACF,KAAK;AAAA,MACL;AACE,aAAK,OAAO,KAAK,uCAAuC;AAAA,UACtD,SAAS,MAAM;AAAA,UACf,OAAO,MAAM;AAAA,QACf,CAAC;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,WAA0C;AACpE,UAAM,WAAkC,CAAC;AAEzC,eAAW,CAAC,SAAS,QAAQ,KAAK,KAAK,UAAU;AAC/C,UAAI,eAAe,WAAW,OAAO,GAAG;AACtC,iBAAS,KAAK,GAAG,QAAQ;AAAA,MAC3B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAwB;AACtB,WAAO,MAAM,KAAK,KAAK,SAAS,KAAK,CAAC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAA0B;AACpC,WAAO,KAAK,SAAS,IAAI,OAAO;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,SAAS,MAAM;AAAA,EACtB;AACF;AAmBO,SAAS,2BACd,SACsB;AACtB,SAAO,IAAI,qBAAqB,OAAO;AACzC;AAMA,SAASA,OAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,SAAS,kBAAkB,aAIb;AACZ,QAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,CAAC,EAAE,SAAS,QAAQ,KAAK,IAAI;AACnC,MAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAO,QAAO;AAE1C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,SAAS,OAAO,EAAE;AAAA,EAChC;AACF;;;ADjUO,IAAM,uBAAN,MAAqD;AAAA,EACjD,OAAO;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAA6B,CAAC;AAAA,EACvC,aAAa;AAAA,EAErB,YAAY,UAAuC,CAAC,GAAG;AACrD,SAAK,SAAS,QAAQ,UAAUC,cAAa,EAAE,MAAM,mBAAmB,CAAC;AACzE,SAAK,OAAO,QAAQ,QAAQ;AAE5B,UAAM,kBAA+C;AAAA,MACnD,QAAQ,KAAK;AAAA,IACf;AACA,QAAI,QAAQ,uBAAuB;AACjC,sBAAgB,iBAAiB,QAAQ;AAAA,IAC3C;AACA,SAAK,WAAW,IAAI,qBAAqB,eAAe;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAQ,OAAoC;AAChD,SAAK,OAAO,MAAM,kBAAkB,MAAM,IAAI,IAAI;AAAA,MAChD,SAAS,MAAM;AAAA,MACf,UAAU,MAAM;AAAA,IAClB,CAAC;AAED,QAAI,KAAK,MAAM;AAEb,YAAM,KAAK,SAAS,OAAO,KAAK;AAAA,IAClC,OAAO;AAEL,WAAK,cAAc,KAAK,KAAK;AAC7B,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UACE,WACA,SACA,SACa;AACb,WAAO,KAAK,SAAS,SAAS,WAAW,SAAS,OAAO;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAA8B;AAC1C,QAAI,KAAK,WAAY;AACrB,SAAK,aAAa;AAElB,QAAI;AACF,aAAO,KAAK,cAAc,SAAS,GAAG;AACpC,cAAM,QAAQ,KAAK,cAAc,MAAM;AACvC,YAAI,OAAO;AACT,gBAAM,KAAK,SAAS,OAAO,KAAK;AAAA,QAClC;AAAA,MACF;AAAA,IACF,UAAE;AACA,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,WAAO,KAAK,cAAc,SAAS,KAAK,KAAK,YAAY;AACvD,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAuB;AACzB,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAwB;AACtB,WAAO,KAAK,SAAS,YAAY;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,SAAS,MAAM;AACpB,SAAK,cAAc,SAAS;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,UAAM,KAAK,MAAM;AACjB,SAAK,MAAM;AAAA,EACb;AACF;AAkBO,SAAS,2BACd,SACsB;AACtB,SAAO,IAAI,qBAAqB,OAAO;AACzC;AASO,IAAM,iBAAN,MAAM,gBAAe;AAAA,EAC1B,OAAe,WAAkC;AAAA,EAChC,aAAgD,oBAAI,IAAI;AAAA,EACxD;AAAA,EAET,cAAc;AACpB,SAAK,SAASA,cAAa,EAAE,MAAM,mBAAmB,CAAC;AAAA,EACzD;AAAA,EAEA,OAAO,cAA8B;AACnC,QAAI,CAAC,gBAAe,UAAU;AAC5B,sBAAe,WAAW,IAAI,gBAAe;AAAA,IAC/C;AACA,WAAO,gBAAe;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,aAAqB,WAAuC;AACnE,QAAI,KAAK,WAAW,IAAI,WAAW,GAAG;AACpC,YAAM,IAAI,MAAM,+BAA+B,WAAW,EAAE;AAAA,IAC9D;AACA,SAAK,WAAW,IAAI,aAAa,SAAS;AAC1C,SAAK,OAAO,MAAM,uBAAuB,WAAW,EAAE;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,aAA8B;AACvC,UAAM,UAAU,KAAK,WAAW,OAAO,WAAW;AAClD,QAAI,SAAS;AACX,WAAK,OAAO,MAAM,yBAAyB,WAAW,EAAE;AAAA,IAC1D;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,OAAkB,eAAuC;AACvE,UAAM,WAA4B,CAAC;AAEnC,eAAW,CAAC,MAAM,SAAS,KAAK,KAAK,YAAY;AAC/C,UAAI,SAAS,eAAe;AAC1B,iBAAS,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,MACrC;AAAA,IACF;AAEA,UAAM,QAAQ,WAAW,QAAQ;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,aAAqB,OAAiC;AAC/D,UAAM,YAAY,KAAK,WAAW,IAAI,WAAW;AACjD,QAAI,CAAC,WAAW;AACd,WAAK,OAAO,KAAK,6BAA6B,WAAW,IAAI;AAAA,QAC3D,SAAS,MAAM;AAAA,MACjB,CAAC;AACD;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAwB;AACtB,WAAO,MAAM,KAAK,KAAK,WAAW,KAAK,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,WAAW,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAc;AACnB,oBAAe,WAAW;AAAA,EAC5B;AACF;AAeO,SAAS,oBAAoC;AAClD,SAAO,eAAe,YAAY;AACpC;;;AGlRA,SAAS,gBAAAC,qBAAoB;;;ACQtB,SAAS,kBAA0B;AACxC,QAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,SAAO,gBAAgB,KAAK;AAC5B,SAAO,MAAM,KAAK,KAAK,EACpB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AACZ;AAKO,SAAS,iBAAyB;AACvC,QAAM,QAAQ,IAAI,WAAW,CAAC;AAC9B,SAAO,gBAAgB,KAAK;AAC5B,SAAO,MAAM,KAAK,KAAK,EACpB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AACZ;AASO,SAAS,mBAAmB,SAKlB;AACf,QAAM,MAAoB;AAAA,IACxB,SAAS,SAAS,WAAW,gBAAgB;AAAA,IAC7C,QAAQ,SAAS,UAAU,eAAe;AAAA,IAC1C,YAAY,SAAS,cAAc;AAAA;AAAA,EACrC;AAEA,MAAI,SAAS,YAAY;AACvB,QAAI,aAAa,QAAQ;AAAA,EAC3B;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,QAAoC;AACrE,QAAM,MAAoB;AAAA,IACxB,SAAS,OAAO;AAAA,IAChB,QAAQ,eAAe;AAAA,IACvB,YAAY,OAAO;AAAA,EACrB;AAEA,MAAI,OAAO,YAAY;AACrB,QAAI,aAAa,OAAO;AAAA,EAC1B;AAEA,SAAO;AACT;AAYO,SAASC,mBAAkB,KAA2B;AAC3D,QAAM,UAAU;AAChB,QAAM,QAAQ,IAAI,WAAW,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACzD,SAAO,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI,IAAI,MAAM,IAAI,KAAK;AACzD;AAKO,SAASC,kBAAiB,QAAqC;AACpE,QAAM,QAAQ,OAAO,KAAK,EAAE,MAAM,GAAG;AACrC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,SAAS,SAAS,QAAQ,KAAK,IAAI;AAG1C,MAAI,YAAY,MAAM;AACpB,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,WAAW,QAAQ,WAAW,MAAM,CAAC,eAAe,KAAK,OAAO,GAAG;AACtE,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,UAAU,OAAO,WAAW,MAAM,CAAC,eAAe,KAAK,MAAM,GAAG;AACnE,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,SAAS,MAAM,WAAW,KAAK,CAAC,eAAe,KAAK,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,QAAQ,YAAY;AAAA,IAC7B,QAAQ,OAAO,YAAY;AAAA,IAC3B,YAAY,SAAS,OAAO,EAAE;AAAA,EAChC;AACF;AAWO,SAAS,iBAAiB,OAAuC;AACtE,SAAO,OAAO,QAAQ,KAAK,EACxB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,EACvC,KAAK,GAAG;AACb;AAKO,SAAS,gBAAgB,QAAwC;AACtE,QAAM,QAAgC,CAAC;AAEvC,aAAW,QAAQ,OAAO,MAAM,GAAG,GAAG;AACpC,UAAM,CAAC,KAAK,KAAK,IAAI,KAAK,KAAK,EAAE,MAAM,GAAG;AAC1C,QAAI,OAAO,OAAO;AAChB,YAAM,GAAG,IAAI;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AAUO,IAAM,sBAAN,MAA0B;AAAA,EACd,QAAwB,CAAC;AAAA;AAAA;AAAA;AAAA,EAK1C,UAAoC;AAClC,WAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAO,KAAmB,IAAkC;AAChE,SAAK,MAAM,KAAK,GAAG;AACnB,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,UAAE;AACA,WAAK,MAAM,IAAI;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAY,IAAkC;AAClD,UAAM,SAAS,KAAK,QAAQ;AAC5B,UAAM,QAAQ,SAAS,mBAAmB,MAAM,IAAI,mBAAmB;AACvE,WAAO,KAAK,IAAI,OAAO,EAAE;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAqE;AAC/E,UAAM,cACJ,mBAAmB,UACf,QAAQ,IAAI,aAAa,IACzB,QAAQ,aAAa;AAE3B,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,MAAMA,kBAAiB,WAAW;AACxC,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AAEA,UAAM,aACJ,mBAAmB,UACf,QAAQ,IAAI,YAAY,IACxB,QAAQ,YAAY;AAE1B,QAAI,YAAY;AACd,UAAI,aAAa;AAAA,IACnB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,KAA2C;AACnD,UAAM,UAAkC;AAAA,MACtC,aAAaD,mBAAkB,GAAG;AAAA,IACpC;AAEA,QAAI,IAAI,YAAY;AAClB,cAAQ,YAAY,IAAI,IAAI;AAAA,IAC9B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,UAAM,MAAM,KAAK,QAAQ;AACzB,WAAO,OAAO,IAAI,aAAa,OAAU,IAAI;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,MAAM,SAAS;AAAA,EACtB;AACF;AAqBO,SAAS,aAAa,SAAkB,SAA2B;AACxE,MAAI,YAAY,UAAU;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,SAAS;AACvB,WAAO;AAAA,EACT;AAGA,MAAI,SAAS;AAEX,UAAM,OAAO,SAAS,QAAQ,MAAM,EAAE,GAAG,EAAE;AAC3C,UAAM,YAAY,KAAK,MAAM,QAAQ,QAAQ,UAAU;AACvD,WAAO,OAAO;AAAA,EAChB;AAGA,SAAO,KAAK,OAAO,IAAI,QAAQ;AACjC;;;AClQO,SAAS,WAAW,SAA4B;AACrD,MAAI;AAEJ,MAAI,QAAQ,QAAQ;AAClB,mBAAe;AAAA,MACb,SAAS,QAAQ,OAAO;AAAA,MACxB,QAAQ,eAAe;AAAA,MACvB,YAAY,QAAQ,OAAO;AAAA,IAC7B;AACA,QAAI,QAAQ,OAAO,YAAY;AAC7B,mBAAa,aAAa,QAAQ,OAAO;AAAA,IAC3C;AAAA,EACF,OAAO;AACL,mBAAe,mBAAmB;AAAA,EACpC;AAEA,QAAM,OAAa;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ,QAAQ;AAAA,IACtB;AAAA,IACA,WAAW,QAAQ,aAAa,KAAK,IAAI;AAAA,IACzC,QAAQ;AAAA,IACR,YAAY,QAAQ,cAAc,CAAC;AAAA,IACnC,QAAQ,CAAC;AAAA,EACX;AAEA,MAAI,QAAQ,QAAQ,QAAQ;AAC1B,SAAK,eAAe,QAAQ,OAAO;AAAA,EACrC;AAEA,SAAO;AACT;AASO,IAAM,cAAN,MAAkB;AAAA,EACN,QAA2B,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA,EAKpD,UAAU,SAA4B;AACpC,UAAM,OAAO,WAAW,OAAO;AAC/B,SAAK,MAAM,IAAI,KAAK,aAAa,QAAQ,IAAI;AAC7C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAY,QAA2B;AAC7C,SAAK,UAAU,KAAK,IAAI;AACxB,QAAI,QAAQ;AACV,WAAK,SAAS;AAAA,IAChB,WAAW,KAAK,WAAW,SAAS;AAClC,WAAK,SAAS;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAY,KAAa,OAAiC;AACrE,SAAK,WAAW,GAAG,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,MAAY,YAAsD;AAC9E,WAAO,OAAO,KAAK,YAAY,UAAU;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,SACE,MACA,MACA,YACM;AACN,UAAM,QAAmB;AAAA,MACvB;AAAA,MACA,MAAM,KAAK,IAAI;AAAA,IACjB;AACA,QAAI,YAAY;AACd,YAAM,aAAa;AAAA,IACrB;AACA,SAAK,OAAO,KAAK,KAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAY,QAA0B;AAC9C,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAY,OAAoB;AAC9C,SAAK,SAAS;AACd,SAAK,SAAS,MAAM,aAAa;AAAA,MAC/B,kBAAkB,MAAM;AAAA,MACxB,qBAAqB,MAAM;AAAA,MAC3B,wBAAwB,MAAM,SAAS;AAAA,IACzC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAkC;AACxC,WAAO,KAAK,MAAM,IAAI,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAgB;AACd,UAAM,YAAY,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO;AACzE,eAAW,QAAQ,WAAW;AAC5B,WAAK,MAAM,OAAO,KAAK,aAAa,MAAM;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AACF;AAYO,SAAS,gBAAgB,MAAgC;AAC9D,MAAI,CAAC,KAAK,QAAS,QAAO;AAC1B,SAAO,KAAK,UAAU,KAAK;AAC7B;AAQO,SAAS,gBAAgB,MAAqB;AACnD,SAAO,KAAK,YAAY;AAC1B;AAQO,SAAS,gBAAgB,MAAqC;AACnE,SAAO;AAAA,IACL,SAAS,KAAK,aAAa;AAAA,IAC3B,QAAQ,KAAK,aAAa;AAAA,IAC1B,cAAc,KAAK;AAAA,IACnB,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK;AAAA,IACb,WAAW,IAAI,KAAK,KAAK,SAAS,EAAE,YAAY;AAAA,IAChD,SAAS,KAAK,UAAU,IAAI,KAAK,KAAK,OAAO,EAAE,YAAY,IAAI;AAAA,IAC/D,YAAY,gBAAgB,IAAI;AAAA,IAChC,YAAY,KAAK;AAAA,IACjB,QAAQ,KAAK,OAAO,IAAI,CAAC,OAAO;AAAA,MAC9B,MAAM,EAAE;AAAA,MACR,MAAM,IAAI,KAAK,EAAE,IAAI,EAAE,YAAY;AAAA,MACnC,YAAY,EAAE;AAAA,IAChB,EAAE;AAAA,EACJ;AACF;AASO,IAAM,iBAAiB;AAAA;AAAA,EAE5B,aAAa;AAAA,EACb,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA;AAAA,EAG9B,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA;AAAA,EAGZ,WAAW;AAAA,EACX,SAAS;AAAA,EACT,cAAc;AAAA,EACd,cAAc;AAAA;AAAA,EAGd,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA;AAAA,EAGtB,cAAc;AAAA,EACd,iBAAiB;AAAA;AAAA,EAGjB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA;AAAA,EAGtB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,iBAAiB;AACnB;;;AChRA,SAAS,gBAAAE,qBAAoB;AAiDtB,IAAM,kBAAN,MAA8C;AAAA,EAC1C,OAAO;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,UAAkC,CAAC,GAAG;AAChD,SAAK,SAAS,QAAQ,UAAUC,cAAa,EAAE,MAAM,iBAAiB,CAAC;AACvE,SAAK,SAAS,QAAQ,UAAU;AAChC,SAAK,oBAAoB,QAAQ,qBAAqB;AACtD,SAAK,gBAAgB,QAAQ,iBAAiB;AAAA,EAChD;AAAA,EAEA,MAAM,OAAO,OAA8B;AACzC,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAW,gBAAgB,IAAI;AACrC,YAAM,SAAS,KAAK,WAAW,UAAU,UAAU,KAAK,WAAW,OAAO,OAAO;AAEjF,UAAI,KAAK,QAAQ;AACf,cAAM,SAAS,KAAK,eAAe,mBAAS;AAC5C,cAAM,aAAa,KAAK,WAAW,UAAU,WAAM,KAAK,WAAW,OAAO,WAAM;AAChF,cAAM,cAAc,aAAa,SAAY,GAAG,QAAQ,OAAO;AAE/D,gBAAQ;AAAA,UACN,GAAG,MAAM,IAAI,UAAU,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,WAAW,WAAW,KAAK,aAAa,QAAQ,MAAM,GAAG,CAAC,CAAC;AAAA,QACrH;AAEA,YAAI,KAAK,qBAAqB,OAAO,KAAK,KAAK,UAAU,EAAE,SAAS,GAAG;AACrE,kBAAQ,IAAI,oBAAoB,KAAK,UAAU;AAAA,QACjD;AAEA,YAAI,KAAK,iBAAiB,KAAK,OAAO,SAAS,GAAG;AAChD,qBAAW,SAAS,KAAK,QAAQ;AAC/B,oBAAQ,IAAI,eAAe,MAAM,IAAI,IAAI,MAAM,cAAc,EAAE;AAAA,UACjE;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,SAAS,gBAAgB,IAAI;AACnC,aAAK,OAAO,KAAK,SAAS,KAAK,IAAI,IAAI;AAAA,UACrC,GAAG;AAAA,UACH;AAAA,UACA,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAA0B;AAAA,EAEhC;AACF;AAQO,SAAS,sBAAsB,SAAmD;AACvF,SAAO,IAAI,gBAAgB,OAAO;AACpC;AA8BO,IAAM,eAAN,MAA2C;AAAA,EACvC,OAAO;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAiB,CAAC;AAAA,EAC3B,aAAoD;AAAA,EAE5D,YAAY,SAA8B;AACxC,SAAK,WAAW,QAAQ,SAAS,QAAQ,OAAO,EAAE;AAClD,SAAK,cAAc,QAAQ;AAC3B,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,UAAU,QAAQ,WAAW,CAAC;AACnC,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,gBAAgB,QAAQ,iBAAiB;AAC9C,SAAK,SAAS,QAAQ,UAAUA,cAAa,EAAE,MAAM,gBAAgB,CAAC;AAGtE,SAAK,aAAa,YAAY,MAAM,KAAK,MAAM,GAAG,KAAK,aAAa;AAAA,EACtE;AAAA,EAEA,MAAM,OAAO,OAA8B;AACzC,SAAK,OAAO,KAAK,GAAG,KAAK;AAEzB,QAAI,KAAK,OAAO,UAAU,KAAK,WAAW;AACxC,YAAM,KAAK,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAc,QAAuB;AACnC,QAAI,KAAK,OAAO,WAAW,EAAG;AAE9B,UAAM,gBAAgB,KAAK,OAAO,OAAO,GAAG,KAAK,SAAS;AAE1D,QAAI;AACF,YAAM,UAAU,KAAK,iBAAiB,aAAa;AACnD,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,OAAO;AAEnE,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,cAAc;AAAA,UACzD,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,GAAG,KAAK;AAAA,UACV;AAAA,UACA,MAAM,KAAK,UAAU,OAAO;AAAA,UAC5B,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,QACjF;AAEA,aAAK,OAAO,MAAM,YAAY,cAAc,MAAM,gBAAgB;AAAA,MACpE,UAAE;AACA,qBAAa,SAAS;AAAA,MACxB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,kCAAkC,KAAc;AAElE,WAAK,OAAO,QAAQ,GAAG,aAAa;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,iBAAiB,OAAiC;AACxD,WAAO;AAAA,MACL,eAAe;AAAA,QACb;AAAA,UACE,UAAU;AAAA,YACR,YAAY;AAAA,cACV,EAAE,KAAK,gBAAgB,OAAO,EAAE,aAAa,KAAK,YAAY,EAAE;AAAA,cAChE,EAAE,KAAK,mBAAmB,OAAO,EAAE,aAAa,KAAK,eAAe,EAAE;AAAA,YACxE;AAAA,UACF;AAAA,UACA,YAAY;AAAA,YACV;AAAA,cACE,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,SAAS;AAAA,cACX;AAAA,cACA,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,YAAY,IAAI,CAAC;AAAA,YACnD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,MAAsB;AACxC,UAAM,WAAqB;AAAA,MACzB,SAAS,KAAK,aAAa;AAAA,MAC3B,QAAQ,KAAK,aAAa;AAAA,MAC1B,MAAM,KAAK;AAAA,MACX,MAAM,KAAK,gBAAgB,KAAK,IAAI;AAAA,MACpC,mBAAmB,OAAO,KAAK,YAAY,GAAS;AAAA,MACpD,YAAY,OAAO,QAAQ,KAAK,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,QACjE;AAAA,QACA,OAAO,KAAK,sBAAsB,KAAK;AAAA,MACzC,EAAE;AAAA,MACF,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW;AAAA,QAClC,MAAM,MAAM;AAAA,QACZ,cAAc,OAAO,MAAM,OAAO,GAAS;AAAA,QAC3C,YAAY,MAAM,aACd,OAAO,QAAQ,MAAM,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,UACtD;AAAA,UACA,OAAO,KAAK,sBAAsB,KAAK;AAAA,QACzC,EAAE,IACF,CAAC;AAAA,MACP,EAAE;AAAA,MACF,QAAQ;AAAA,QACN,MAAM,KAAK,WAAW,UAAU,IAAI,KAAK,WAAW,OAAO,IAAI;AAAA,MACjE;AAAA,IACF;AAEA,QAAI,KAAK,cAAc;AACrB,eAAS,eAAe,KAAK;AAAA,IAC/B;AACA,QAAI,KAAK,SAAS;AAChB,eAAS,kBAAkB,OAAO,KAAK,UAAU,GAAS;AAAA,IAC5D;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,MAAsB;AAC5C,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,sBAAsB,OAAoC;AAChE,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,EAAE,aAAa,MAAM;AAAA,IAC9B;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,OAAO,UAAU,KAAK,GAAG;AAC3B,eAAO,EAAE,UAAU,OAAO,KAAK,EAAE;AAAA,MACnC;AACA,aAAO,EAAE,aAAa,MAAM;AAAA,IAC9B;AACA,QAAI,OAAO,UAAU,WAAW;AAC9B,aAAO,EAAE,WAAW,MAAM;AAAA,IAC5B;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO;AAAA,QACL,YAAY;AAAA,UACV,QAAQ,MAAM,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,CAAC;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,aAAa,OAAO,KAAK,EAAE;AAAA,EACtC;AAAA,EAEA,MAAM,WAA0B;AAC9B,QAAI,KAAK,YAAY;AACnB,oBAAc,KAAK,UAAU;AAC7B,WAAK,aAAa;AAAA,IACpB;AACA,UAAM,KAAK,MAAM;AAAA,EACnB;AACF;AAgBO,SAAS,mBAAmB,SAA4C;AAC7E,SAAO,IAAI,aAAa,OAAO;AACjC;;;AH7SO,IAAM,SAAN,MAAa;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,aAAoD;AAAA,EAE5D,YAAY,SAAwB;AAClC,SAAK,cAAc,QAAQ;AAC3B,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,UAAU,QAAQ,QAAQ,WAAW;AAC1C,SAAK,UAAU,QAAQ,QAAQ,WAAW,EAAE,OAAO,IAAI;AACvD,SAAK,WAAW,QAAQ,YAAY,IAAI,gBAAgB;AACxD,SAAK,SAAS,QAAQ,UAAUC,cAAa,EAAE,MAAM,UAAU,QAAQ,WAAW,GAAG,CAAC;AACtF,SAAK,iBAAiB,IAAI,oBAAoB;AAC9C,SAAK,cAAc,IAAI,YAAY;AAGnC,QAAI,KAAK,SAAS;AAChB,WAAK,aAAa,YAAY,MAAM,KAAK,MAAM,GAAG,GAAI;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UACE,MACA,SAKa;AACb,QAAI,CAAC,KAAK,QAAS,QAAO;AAG1B,UAAM,SAAS,SAAS,UAAU,KAAK,eAAe,QAAQ;AAG9D,QAAI,CAAC,UAAU,CAAC,aAAa,KAAK,OAAO,GAAG;AAC1C,aAAO;AAAA,IACT;AAEA,UAAM,cAAgE;AAAA,MACpE;AAAA,MACA,MAAM,SAAS,QAAQ;AAAA,MACvB,YAAY;AAAA,QACV,CAAC,eAAe,YAAY,GAAG,KAAK;AAAA,QACpC,CAAC,eAAe,eAAe,GAAG,KAAK;AAAA,QACvC,GAAG,SAAS;AAAA,MACd;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,kBAAY,SAAS;AAAA,IACvB;AAEA,UAAM,OAAO,KAAK,YAAY,UAAU,WAAW;AAEnD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAmB,OAAqB;AAC9C,QAAI,CAAC,KAAM;AAEX,QAAI,OAAO;AACT,WAAK,YAAY,gBAAgB,MAAM,KAAK;AAAA,IAC9C;AAEA,SAAK,YAAY,QAAQ,MAAM,QAAQ,UAAU,IAAI;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MACJ,MACA,IACA,SAIY;AACZ,UAAM,OAAO,KAAK,UAAU,MAAM,OAAO;AAEzC,QAAI,CAAC,MAAM;AACT,aAAO,GAAG,IAAI;AAAA,IAChB;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,eAAe,IAAI,KAAK,cAAc,MAAM,GAAG,IAAI,CAAC;AAC9E,WAAK,QAAQ,IAAI;AACjB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,QAAQ,MAAM,KAAc;AACjC,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAa,OAAiC;AACzD,UAAM,MAAM,KAAK,eAAe,QAAQ;AACxC,QAAI,CAAC,IAAK;AAEV,UAAM,OAAO,KAAK,YAAY,QAAQ,IAAI,MAAM;AAChD,QAAI,MAAM;AACR,WAAK,YAAY,aAAa,MAAM,KAAK,KAAK;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAc,YAAuD;AAC5E,UAAM,MAAM,KAAK,eAAe,QAAQ;AACxC,QAAI,CAAC,IAAK;AAEV,UAAM,OAAO,KAAK,YAAY,QAAQ,IAAI,MAAM;AAChD,QAAI,MAAM;AACR,WAAK,YAAY,SAAS,MAAM,MAAM,UAAU;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAA2C;AACzC,WAAO,KAAK,eAAe,QAAQ;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAyC;AACvC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,SAAqE;AAC3E,WAAO,KAAK,eAAe,YAAY,OAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAA4C;AACjD,UAAM,UAAU,OAAO,KAAK,eAAe,QAAQ;AACnD,QAAI,CAAC,QAAS,QAAO,CAAC;AACtB,WAAO,KAAK,eAAe,UAAU,OAAO;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,UAAM,QAAQ,KAAK,YAAY,MAAM;AACrC,QAAI,MAAM,SAAS,GAAG;AACpB,UAAI;AACF,cAAM,KAAK,SAAS,OAAO,KAAK;AAAA,MAClC,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,0BAA0B,KAAc;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAA0B;AAC9B,QAAI,KAAK,YAAY;AACnB,oBAAc,KAAK,UAAU;AAC7B,WAAK,aAAa;AAAA,IACpB;AAEA,UAAM,KAAK,MAAM;AACjB,UAAM,KAAK,SAAS,SAAS;AAC7B,SAAK,YAAY,MAAM;AACvB,SAAK,eAAe,MAAM;AAAA,EAC5B;AACF;AAmBO,SAAS,aAAa,SAAgC;AAC3D,SAAO,IAAI,OAAO,OAAO;AAC3B;AAMA,IAAI,eAA8B;AAK3B,SAAS,kBAAiC;AAC/C,SAAO;AACT;AAKO,SAAS,gBAAgB,QAAsB;AACpD,iBAAe;AACjB;AAKO,SAAS,oBAA0B;AACxC,iBAAe;AACjB;AAaO,SAAS,wBAAwB,QAAgB;AACtD,SAAO,OACL,SACA,SACsB;AAEtB,UAAM,YAAY,OAAO,QAAQ,QAAQ,OAAO;AAGhD,UAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,UAAM,WAIF;AAAA,MACF,MAAM;AAAA,MACN,YAAY;AAAA,QACV,CAAC,eAAe,WAAW,GAAG,QAAQ;AAAA,QACtC,CAAC,eAAe,QAAQ,GAAG,QAAQ;AAAA,MACrC;AAAA,IACF;AACA,QAAI,WAAW;AACb,eAAS,SAAS;AAAA,IACpB;AACA,UAAM,OAAO,OAAO,UAAU,GAAG,QAAQ,MAAM,IAAI,IAAI,QAAQ,IAAI,QAAQ;AAE3E,QAAI,CAAC,MAAM;AACT,aAAO,KAAK;AAAA,IACd;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,kBAAkB,EAAE,IAAI,KAAK,cAAc,IAAI;AAE7E,aAAO,QAAQ,IAAI;AACnB,WAAK,WAAW,eAAe,gBAAgB,IAAI,SAAS;AAE5D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,aAAO,QAAQ,MAAM,KAAc;AACnC,YAAM;AAAA,IACR;AAAA,EACF;AACF;AASO,SAAS,iBAAiB,QAAgB;AAC/C,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,MAAM,UACJ,SACA,QACA,IACY;AACZ,aAAO,OAAO;AAAA,QACZ,OAAO,OAAO,IAAI,MAAM;AAAA,QACxB;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,YAAY;AAAA,YACV,CAAC,eAAe,UAAU,GAAG;AAAA,YAC7B,CAAC,eAAe,WAAW,GAAG;AAAA,YAC9B,CAAC,eAAe,UAAU,GAAG;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,aACJ,SACA,QACA,IACA,WACY;AACZ,YAAM,cAIF;AAAA,QACF,MAAM;AAAA,QACN,YAAY;AAAA,UACV,CAAC,eAAe,UAAU,GAAG;AAAA,UAC7B,CAAC,eAAe,WAAW,GAAG;AAAA,UAC9B,CAAC,eAAe,UAAU,GAAG;AAAA,QAC/B;AAAA,MACF;AACA,UAAI,WAAW;AACb,oBAAY,SAAS;AAAA,MACvB;AACA,YAAM,OAAO,OAAO,UAAU,OAAO,OAAO,IAAI,MAAM,IAAI,WAAW;AAErE,UAAI,CAAC,MAAM;AACT,eAAO,GAAG;AAAA,MACZ;AAEA,UAAI;AACF,cAAM,SAAS,MAAM,OAAO,kBAAkB,EAAE,IAAI,KAAK,cAAc,EAAE;AACzE,eAAO,QAAQ,IAAI;AACnB,eAAO;AAAA,MACT,SAAS,OAAO;AACd,eAAO,QAAQ,MAAM,KAAc;AACnC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;AdlXA,IAAM,oBAAN,MAAuF;AAAA,EAC5E;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YACE,YACA,cACA,gBACA,QACA,SACA;AACA,SAAK,OAAO,WAAW;AACvB,SAAK,SAAS,YAAY,MAAM;AAChC,SAAK,SAAS,gBAAgB;AAE9B,SAAK,YAAY,IAAI,UAAU;AAAA,MAC7B,SAAS,WAAW;AAAA,MACpB,WAAW;AAAA,MACX,QAAQ,KAAK;AAAA,IACf,CAAC;AAED,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MACJ,QACA,OAC0C;AAC1C,UAAM,aAAa,OAAO,MAAM;AAChC,UAAM,eAAe,KAAK,QAAQ,eAAe;AAGjD,QAAI,KAAK,UAAU,cAAc;AAC/B,aAAO,KAAK,OAAO;AAAA,QACjB,OAAO,KAAK,IAAI,IAAI,UAAU;AAAA,QAC9B,YAAY;AACV,iBAAO,KAAK,UAAU,MAAM,YAAY,OAAO;AAAA,YAC7C;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,EAAE,MAAM,SAAS;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,KAAK,UAAU,MAAM,YAAY,KAAK;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,QACA,OAC+C;AAC/C,UAAM,aAAa,OAAO,MAAM;AAChC,UAAM,eAAe,KAAK,QAAQ,eAAe;AAGjD,QAAI,KAAK,UAAU,cAAc;AAC/B,aAAO,KAAK,OAAO;AAAA,QACjB,OAAO,KAAK,IAAI,IAAI,UAAU;AAAA,QAC9B,YAAY;AACV,iBAAO,KAAK,UAAU,OAAO,YAAY,OAAO;AAAA,YAC9C;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,EAAE,MAAM,SAAS;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,KAAK,UAAU,OAAO,YAAY,KAAK;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KACJ,WACA,MACe;AACf,UAAM,OAAO,OAAO,SAAS;AAC7B,UAAM,eAAe,KAAK,QAAQ,eAAe;AAEjD,UAAM,QAAmB;AAAA,MACvB,aAAa;AAAA,MACb;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,IAAIC,YAAW;AAAA,MACf,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC7B;AAAA,IACF;AAGA,QAAI,cAAc;AAChB,YAAM,mBAAmB,MAAM,aAAa,OAAO,IAAI,aAAa,MAAM;AAAA,IAC5E;AAEA,UAAM,KAAK,eAAe,KAAK,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,GACE,WACA,SACA,SACa;AACb,WAAO,KAAK,eAAe,UAAU,WAAW,SAAyB,OAAO;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAA0D;AACxD,WAAO,KAAK,UAAU,gBAAgB;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,UAAM,KAAK,UAAU,MAAM;AAC3B,UAAM,KAAK,eAAe,QAAQ;AAAA,EACpC;AACF;AA2BO,SAAS,WACd,aACA,UAAgC,CAAC,GACZ;AACrB,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,SAAS,QAAQ,UAAU,CAAC;AAElC,MAAI;AACJ,MAAI;AAEJ,UAAQ,MAAM;AAAA,IACZ,KAAK,YAAY;AAEf,YAAM,WAAW,oBAAoB;AACrC,UAAI,CAAC,SAAS,IAAI,WAAW,GAAG;AAC9B,cAAM,IAAI;AAAA,UACR,2CAA2C,WAAW;AAAA,QAExD;AAAA,MACF;AACA,qBAAe,SAAS,gBAAgB,WAAW;AAGnD,YAAM,WAAW,kBAAkB;AACnC,YAAM,WAAW,SAAS,YAAY;AACtC,UAAI,SAAS,SAAS,WAAW,GAAG;AAElC,yBAAiB,2BAA2B;AAAA,MAC9C,OAAO;AACL,yBAAiB,2BAA2B;AAAA,MAC9C;AACA;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,UAAI,CAAC,QAAQ,SAAS;AACpB,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD;AACA,qBAAe,oBAAoB;AAAA,QACjC,SAAS,QAAQ;AAAA,MACnB,CAAC;AAED,uBAAiB,2BAA2B;AAC5C;AAAA,IACF;AAAA,IAEA,KAAK,WAAW;AACd,UAAI,CAAC,QAAQ,SAAS;AACpB,cAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AAEA,qBAAe,uBAAuB,aAAa,QAAQ,OAAO;AAClE,uBAAiB,2BAA2B;AAC5C;AAAA,IACF;AAAA,IAEA;AACE,YAAM,IAAI,MAAM,gCAAgC,IAAI,EAAE;AAAA,EAC1D;AAGA,MAAI,QAAQ,cAAc;AACxB,mBAAe,QAAQ;AAAA,EACzB;AACA,MAAI,QAAQ,gBAAgB;AAC1B,qBAAiB,QAAQ;AAAA,EAC3B;AAGA,QAAM,aAAgC;AAAA,IACpC,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAEA,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAoBO,SAAS,gBACd,YACA,UAAgC,CAAC,GACZ;AACrB,SAAO,WAAiB,WAAW,MAAM,OAAO;AAClD;AAWA,SAAS,uBAAuB,cAAsB,SAAgC;AACpF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,KAAsB,SAA6B;AACvD,YAAM,WAAW,MAAM,QAAQ,MAAM,uBAAuB;AAAA,QAC1D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,gBAAgB,QAAQ;AAAA,UACxB,aAAa,QAAQ;AAAA,UACrB,YAAY,QAAQ;AAAA,QACtB;AAAA,QACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B,CAAC;AAED,aAAO,SAAS,KAAK;AAAA,IACvB;AAAA,IACA,MAAM,QAAQ;AAAA,IAEd;AAAA,EACF;AACF;AASO,IAAM,kBAAN,MAAsB;AAAA,EACV,UAAsC,oBAAI,IAAI;AAAA,EAC9C;AAAA,EAEjB,YAAY,QAAwB;AAClC,SAAK,SAAS,UAAU,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,IACE,aACA,SACqB;AACrB,QAAI,SAAS,KAAK,QAAQ,IAAI,WAAW;AACzC,QAAI,CAAC,QAAQ;AACX,eAAS,WAAiB,aAAa;AAAA,QACrC,GAAG;AAAA,QACH,QAAQ,EAAE,GAAG,KAAK,QAAQ,GAAG,SAAS,OAAO;AAAA,MAC/C,CAAC;AACD,WAAK,QAAQ,IAAI,aAAa,MAAM;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAA0B;AAC9B,UAAM,gBAAgB,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW;AACtE,UAAI,WAAW,UAAU,OAAO,OAAO,UAAU,YAAY;AAC3D,eAAQ,OAA0C,MAAM;AAAA,MAC1D;AACA,aAAO,QAAQ,QAAQ;AAAA,IACzB,CAAC;AACD,UAAM,QAAQ,IAAI,aAAa;AAC/B,SAAK,QAAQ,MAAM;AAAA,EACrB;AACF;AAiBO,SAAS,sBAAsB,QAAyC;AAC7E,SAAO,IAAI,gBAAgB,MAAM;AACnC;;;AkB1YA,SAAS,gBAAAC,qBAAoB;AAwFtB,IAAM,YAAN,MAAgB;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAA2B;AACrC,SAAK,aAAa,QAAQ;AAC1B,SAAK,WAAW,QAAQ;AACxB,SAAK,SAAS,QAAQ,UAAUC,cAAa,EAAE,MAAM,OAAO,QAAQ,WAAW,IAAI,GAAG,CAAC;AACvF,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,aAAa,QAAQ,cAAc,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAwB,SAA4D;AACxF,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,UAA6B;AAAA,MACjC,WAAW,QAAQ;AAAA,MACnB,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ,YAAY,CAAC;AAAA,MAC/B,QAAQ,KAAK,OAAO,MAAM,EAAE,WAAW,QAAQ,IAAI,QAAQ,QAAQ,OAAO,CAAC;AAAA,IAC7E;AAEA,QAAI,QAAQ,cAAc;AACxB,cAAQ,eAAe,QAAQ;AAAA,IACjC;AAEA,QAAI;AAEF,UAAI,QAAQ,WAAW,CAAC,iBAAiB,KAAK,WAAW,SAAS,QAAQ,OAAO,GAAG;AAClF,cAAM,IAAI;AAAA,UACR,KAAK,WAAW;AAAA,UAChB,QAAQ;AAAA,UACR,KAAK,WAAW;AAAA,QAClB;AAAA,MACF;AAGA,YAAM,UAAU,KAAK,WAAW,QAAQ,QAAQ,QAAQ,IAAI;AAC5D,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,oBAAoB,KAAK,WAAW,MAAM,QAAQ,MAAM;AAAA,MACpE;AAGA,YAAM,cAAc,mBAAmB,KAAK,YAAY,QAAQ,QAAQ,QAAQ,IAAI;AACpF,UAAI,YAAY,YAAY;AAC1B,gBAAQ,OAAO,KAAK,UAAU,QAAQ,MAAM,kBAAkB;AAAA,UAC5D,OAAO,YAAY;AAAA,UACnB,aAAa,YAAY;AAAA,QAC3B,CAAC;AAAA,MACH;AAGA,YAAM,QAAQ,KAAK,qBAAqB,SAAS,SAAS,OAAO;AAGjE,YAAM,UAAU;AAAA,QACd,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,KAAK;AAAA,MACP;AAEA,YAAM,SAAS,MAAM,QAAQ,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,IAAI;AAAA,UAAe,CAAC,GAAG,WACrB,WAAW,MAAM,OAAO,IAAI,MAAM,iBAAiB,CAAC,GAAG,OAAO;AAAA,QAChE;AAAA,MACF,CAAC;AAED,YAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,cAAQ,OAAO,KAAK,GAAG,QAAQ,IAAI,IAAI,QAAQ,MAAM,cAAc,EAAE,YAAY,SAAS,CAAC;AAE3F,YAAM,kBAAwC;AAAA,QAC5C,IAAI,QAAQ;AAAA,QACZ,SAAS;AAAA,QACT,SAAS,KAAK,WAAW;AAAA,QACzB;AAAA,MACF;AACA,UAAI,QAAQ,cAAc;AACxB,wBAAgB,eAAe,QAAQ;AAAA,MACzC;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,YAAM,WAAW,WAAW,KAAK;AAEjC,cAAQ,OAAO,MAAM,GAAG,QAAQ,IAAI,IAAI,QAAQ,MAAM,WAAW,OAAgB;AAAA,QAC/E,YAAY;AAAA,QACZ,WAAW,SAAS;AAAA,MACtB,CAAC;AAED,YAAM,YAA2C;AAAA,QAC/C,MAAM,SAAS;AAAA,QACf,SAAS,SAAS;AAAA,QAClB,WAAW,SAAS;AAAA,MACtB;AACA,UAAI,SAAS,SAAS;AACpB,kBAAW,UAAU,SAAS;AAAA,MAChC;AACA,UAAI,SAAS,eAAe,QAAW;AACrC,kBAAW,aAAa,SAAS;AAAA,MACnC;AAEA,YAAM,gBAAsC;AAAA,QAC1C,IAAI,QAAQ;AAAA,QACZ,SAAS;AAAA,QACT,SAAS,KAAK,WAAW;AAAA,QACzB,OAAO;AAAA,MACT;AACA,UAAI,QAAQ,cAAc;AACxB,sBAAc,eAAe,QAAQ;AAAA,MACvC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,QAAgB,MAAoD;AACrF,UAAM,WAAW,SAAS,UAAU,KAAK,SAAS,UAAU,KAAK,SAAS;AAC1E,WAAO,WAAW,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,qBACN,SACA,SACA,SACwB;AACxB,QAAI,QAAQ;AAEZ,UAAM,WAAW,OAAO,MAAgC;AACtD,UAAI,KAAK,OAAO;AACd,cAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AACA,cAAQ;AAER,UAAI,IAAI,KAAK,WAAW,QAAQ;AAC9B,cAAM,KAAK,KAAK,WAAW,CAAC;AAC5B,eAAO,GAAG,SAAS,SAAS,MAAM,SAAS,IAAI,CAAC,CAAC;AAAA,MACnD;AAEA,aAAO,QAAQ,QAAQ,OAAO,OAAO;AAAA,IACvC;AAEA,WAAO,MAAM,SAAS,CAAC;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAmC;AACjC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,aAAyD;AACvD,WAAO;AAAA,MACL,SAAS,OAAO,KAAK,KAAK,SAAS,WAAW,CAAC,CAAC;AAAA,MAChD,WAAW,OAAO,KAAK,KAAK,SAAS,aAAa,CAAC,CAAC;AAAA,IACtD;AAAA,EACF;AACF;AAuBO,SAAS,gBAAgB,SAAsC;AACpE,SAAO,IAAI,UAAU,OAAO;AAC9B;AAYO,SAAS,oBAAmC;AACjD,SAAO,OAAO,SAAS,SAAS,SAAS;AACvC,YAAQ,OAAO,MAAM,YAAY,QAAQ,IAAI,IAAI,QAAQ,MAAM,IAAI;AAAA,MACjE,WAAW,OAAO,KAAK,QAAQ,KAAe;AAAA,IAChD,CAAC;AAED,UAAM,SAAS,MAAM,KAAK;AAE1B,YAAQ,OAAO,MAAM,aAAa,QAAQ,IAAI,IAAI,QAAQ,MAAM,EAAE;AAElE,WAAO;AAAA,EACT;AACF;AAgBO,SAAS,qBACd,YACe;AACf,SAAO,OAAO,SAAS,UAAU,SAAS;AACxC,UAAM,YAAY,WAAW,QAAQ,MAAM;AAC3C,QAAI,WAAW;AACb,cAAQ,QAAQ,UAAU,QAAQ,KAAK;AAAA,IACzC;AACA,WAAO,KAAK;AAAA,EACd;AACF;AAQO,SAAS,mBAAkC;AAChD,SAAO,OAAO,UAAU,SAAS,SAAS;AACxC,UAAM,WAAW,QAAQ,SAAS,UAAU;AAC5C,QAAI,UAAU;AACZ,cAAQ,SAAS,QAAQ,OAAO,MAAM,EAAE,SAAS,CAAC;AAAA,IACpD;AACA,WAAO,KAAK;AAAA,EACd;AACF;;;ACjWA,SAAS,gBAAAC,qBAAoB;AAiCtB,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAA8B;AACxC,SAAK,UAAU,QAAQ;AACvB,QAAI,QAAQ,YAAY;AACtB,WAAK,aAAa,QAAQ;AAAA,IAC5B;AACA,SAAK,YAAY,QAAQ;AACzB,SAAK,SAAS,QAAQ,UAAUC,cAAa,EAAE,MAAM,UAAU,QAAQ,OAAO,GAAG,CAAC;AAClF,QAAI,QAAQ,iBAAiB;AAC3B,WAAK,kBAAkB,QAAQ;AAAA,IACjC;AACA,SAAK,iBAAiB,QAAQ,kBAAkB;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KACJ,MACA,MACA,SACiB;AAEjB,QAAI,KAAK,kBAAkB,KAAK,YAAY,QAAQ,OAAO;AACzD,YAAM,QAAQ,KAAK,WAAW,OAAO;AACrC,UAAI,EAAE,QAAQ,QAAQ;AACpB,aAAK,OAAO,KAAK,kDAAkD,IAAI,EAAE;AAAA,MAC3E;AAAA,IACF;AAGA,QAAI;AACJ,QAAI,KAAK,YAAY,QAAQ,QAAQ,IAAI,GAAG;AAC1C,iBAAW,KAAK,WAAW,OAAO,MAAM,IAAI,EAAE;AAAA,IAChD;AAGA,UAAM,eAAsC;AAAA,MAC1C;AAAA,MACA,QAAQ,KAAK;AAAA,MACb;AAAA,IACF;AAEA,QAAI,SAAS,QAAS,cAAa,KAAK,QAAQ;AAChD,QAAI,SAAS,QAAS,cAAa,UAAU,QAAQ;AAErD,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,QAAI,SAAU,cAAa,WAAW;AAEtC,QAAI,SAAS,UAAW,cAAa,YAAY,QAAQ;AACzD,QAAI,SAAS,aAAc,cAAa,eAAe,QAAQ;AAE/D,UAAM,gBAAgB,SAAS,YAAY;AAC3C,QAAI,cAAe,cAAa,WAAW;AAG3C,UAAM,QAAQ,YAAY,YAAY;AAGtC,QAAI;AACF,YAAM,KAAK,UAAU,KAAK,KAAK;AAC/B,WAAK,OAAO,MAAM,kBAAkB,IAAI,IAAI;AAAA,QAC1C,SAAS,MAAM;AAAA,QACf,UAAU,MAAM;AAAA,MAClB,CAAC;AACD,aAAO,MAAM;AAAA,IACf,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,yBAAyB,IAAI,IAAI,OAAgB;AAAA,QACjE,SAAS,MAAM;AAAA,MACjB,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJ,QACmB;AACnB,UAAM,UAAoB,CAAC;AAE3B,eAAW,EAAE,MAAM,MAAM,QAAQ,KAAK,QAAQ;AAC5C,YAAM,UAAU,MAAM,KAAK,KAAK,MAAM,MAAM,OAAO;AACnD,cAAQ,KAAK,OAAO;AAAA,IACtB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAA8C;AACnD,WAAO,IAAI,cAAc,MAAM,OAAO;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAsB;AACxB,WAAO,KAAK;AAAA,EACd;AACF;AAuBO,IAAM,gBAAN,MAAoB;AAAA,EACR;AAAA,EACA;AAAA,EAEjB,YAAY,SAAuB,gBAAsC;AACvE,SAAK,UAAU;AACf,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,MAAM,KACJ,MACA,MACA,SACiB;AACjB,WAAO,KAAK,QAAQ,KAAK,MAAM,MAAM;AAAA,MACnC,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AACF;AAiBO,SAAS,mBAAmB,SAA4C;AAC7E,SAAO,IAAI,aAAa,OAAO;AACjC;AAUO,SAAS,mBACd,YACA,SACyB;AACzB,QAAM,UAAU,IAAI,aAAa;AAAA,IAC/B,GAAG;AAAA,IACH,SAAS,WAAW;AAAA,IACpB;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ACjOA,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AA6ElC,IAAM,kBAAN,MAAsB;AAAA,EACV,UAAwC,oBAAI,IAAI;AAAA,EAChD;AAAA,EACA;AAAA,EACT,eAAsD;AAAA,EAE9D,YAAY,UAAkC,CAAC,GAAG;AAChD,SAAK,kBAAkB;AAAA,MACrB,SAAS,QAAQ,WAAW;AAAA,MAC5B,aAAa,QAAQ,eAAe,KAAK,KAAK,KAAK,KAAK;AAAA;AAAA,MACxD,gBAAgB,QAAQ,kBAAkB;AAAA,IAC5C;AAEA,QAAI,QAAQ,MAAO,MAAK,gBAAgB,QAAQ,QAAQ;AACxD,QAAI,QAAQ,YAAa,MAAK,gBAAgB,cAAc,QAAQ;AACpE,QAAI,QAAQ,OAAQ,MAAK,gBAAgB,SAAS,QAAQ;AAE1D,SAAK,SAAS,QAAQ,UAAUD,cAAa,EAAE,MAAM,MAAM,CAAC;AAG5D,SAAK,eAAe,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAK,KAAK,GAAI;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,SAA2C;AACnD,UAAM,QAAyB;AAAA,MAC7B,IAAIC,YAAW;AAAA,MACf,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,SAAS,oBAAI,KAAK;AAAA,IACpB;AAEA,QAAI,QAAQ,UAAU;AACpB,YAAM,WAAW,QAAQ;AAAA,IAC3B;AAGA,QAAI,KAAK,QAAQ,QAAQ,KAAK,gBAAgB,SAAS;AAErD,YAAM,SAAS,KAAK,UAAU;AAC9B,UAAI,QAAQ;AACV,aAAK,QAAQ,OAAO,OAAO,EAAE;AAC7B,aAAK,OAAO,MAAM,0CAA0C;AAAA,UAC1D,WAAW,OAAO;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,QAAQ,IAAI,MAAM,IAAI,KAAK;AAEhC,SAAK,OAAO,KAAK,oBAAoB;AAAA,MACnC,IAAI,MAAM;AAAA,MACV,SAAS,MAAM,MAAM;AAAA,MACrB,WAAW,MAAM,MAAM;AAAA,MACvB,OAAO,MAAM;AAAA,IACf,CAAC;AAGD,SAAK,gBAAgB,QAAQ,KAAK;AAGlC,QAAI,KAAK,QAAQ,QAAQ,KAAK,gBAAgB,gBAAgB;AAC5D,WAAK,gBAAgB,cAAc,KAAK,QAAQ,IAAI;AAAA,IACtD;AAEA,WAAO,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAyC;AAC3C,WAAO,KAAK,QAAQ,IAAI,EAAE;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,SAA4B;AAC1B,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,WAAsC;AACnD,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,EAAE;AAAA,MACvC,CAAC,MAAM,EAAE,MAAM,SAAS;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAAoC;AAC/C,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,EAAE;AAAA,MACvC,CAAC,MAAM,EAAE,YAAY;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,IAAqB;AAC1B,UAAM,UAAU,KAAK,QAAQ,OAAO,EAAE;AACtC,QAAI,SAAS;AACX,WAAK,OAAO,MAAM,sBAAsB,EAAE,GAAG,CAAC;AAAA,IAChD;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAmC;AACvC,UAAM,QAAQ,KAAK,QAAQ,IAAI,EAAE;AACjC,QAAI,CAAC,MAAO,QAAO;AAEnB,SAAK,QAAQ,OAAO,EAAE;AACtB,SAAK,OAAO,KAAK,gCAAgC;AAAA,MAC/C;AAAA,MACA,SAAS,MAAM,MAAM;AAAA,IACvB,CAAC;AAED,WAAO,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAe;AACjB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,QAAQ,MAAM;AACnB,SAAK,OAAO,KAAK,0BAA0B;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAgB;AACtB,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,UAAU;AAEd,eAAW,CAAC,IAAI,KAAK,KAAK,KAAK,SAAS;AACtC,YAAM,MAAM,MAAM,MAAM,QAAQ,QAAQ;AACxC,UAAI,MAAM,KAAK,gBAAgB,aAAa;AAC1C,aAAK,QAAQ,OAAO,EAAE;AACtB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,UAAU,GAAG;AACf,WAAK,OAAO,MAAM,mBAAmB,OAAO,kBAAkB;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAyC;AAC/C,QAAI;AAEJ,eAAW,SAAS,KAAK,QAAQ,OAAO,GAAG;AACzC,UAAI,CAAC,UAAU,MAAM,UAAU,OAAO,SAAS;AAC7C,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,QAAI,KAAK,cAAc;AACrB,oBAAc,KAAK,YAAY;AAC/B,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAA4B;AAC1B,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO;AAAA,MACnD,GAAG;AAAA,MACH,SAAS,EAAE;AAAA,IACb,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAkC;AACvC,eAAW,SAAS,SAAS;AAC3B,WAAK,QAAQ,IAAI,MAAM,IAAI;AAAA,QACzB,GAAG;AAAA,QACH,SAAS,IAAI,KAAK,MAAM,OAAO;AAAA,MACjC,CAAC;AAAA,IACH;AACA,SAAK,OAAO,KAAK,iBAAiB,QAAQ,MAAM,UAAU;AAAA,EAC5D;AACF;AAiBO,SAAS,sBACd,SACiB;AACjB,SAAO,IAAI,gBAAgB,OAAO;AACpC;","names":["generateId","createLogger","generateId","sleep","createLogger","createLogger","formatTraceparent","parseTraceparent","createLogger","createLogger","createLogger","generateId","createLogger","createLogger","createLogger","createLogger","createLogger","generateId"]}
|