@igniter-js/jobs 0.1.14 → 0.1.15

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors/jobs.error.ts","../src/builders/worker.builder.ts","../src/utils/prefix.ts","../src/utils/events.utils.ts","../src/utils/scope.ts","../src/utils/validation.ts","../src/core/manager.ts","../src/builders/queue.builder.ts","../src/core/queue.ts","../src/builders/main.builder.ts"],"names":["IgniterError"],"mappings":"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","file":"index.js","sourcesContent":["import { IgniterError } from \"@igniter-js/common\";\n\n/**\n * Canonical error codes for `@igniter-js/jobs`.\n */\nexport const IGNITER_JOBS_ERROR_CODES = {\n JOBS_ADAPTER_REQUIRED: 'JOBS_ADAPTER_REQUIRED',\n JOBS_SERVICE_REQUIRED: 'JOBS_SERVICE_REQUIRED',\n JOBS_CONTEXT_REQUIRED: 'JOBS_CONTEXT_REQUIRED',\n JOBS_CONFIGURATION_INVALID: 'JOBS_CONFIGURATION_INVALID',\n JOBS_QUEUE_NOT_FOUND: 'JOBS_QUEUE_NOT_FOUND',\n JOBS_QUEUE_DUPLICATE: 'JOBS_QUEUE_DUPLICATE',\n JOBS_QUEUE_OPERATION_FAILED: 'JOBS_QUEUE_OPERATION_FAILED',\n JOBS_INVALID_DEFINITION: 'JOBS_INVALID_DEFINITION',\n JOBS_HANDLER_REQUIRED: 'JOBS_HANDLER_REQUIRED',\n JOBS_DUPLICATE_JOB: 'JOBS_DUPLICATE_JOB',\n JOBS_NOT_FOUND: 'JOBS_NOT_FOUND',\n JOBS_NOT_REGISTERED: 'JOBS_NOT_REGISTERED',\n JOBS_EXECUTION_FAILED: 'JOBS_EXECUTION_FAILED',\n JOBS_TIMEOUT: 'JOBS_TIMEOUT',\n JOBS_CONTEXT_FACTORY_FAILED: 'JOBS_CONTEXT_FACTORY_FAILED',\n JOBS_VALIDATION_FAILED: 'JOBS_VALIDATION_FAILED',\n JOBS_INVALID_INPUT: 'JOBS_INVALID_INPUT',\n JOBS_INVALID_CRON: 'JOBS_INVALID_CRON',\n JOBS_INVALID_SCHEDULE: 'JOBS_INVALID_SCHEDULE',\n JOBS_SCOPE_ALREADY_DEFINED: 'JOBS_SCOPE_ALREADY_DEFINED',\n JOBS_WORKER_FAILED: 'JOBS_WORKER_FAILED',\n JOBS_ADAPTER_ERROR: 'JOBS_ADAPTER_ERROR',\n JOBS_ADAPTER_CONNECTION_FAILED: 'JOBS_ADAPTER_CONNECTION_FAILED',\n JOBS_SUBSCRIBE_FAILED: 'JOBS_SUBSCRIBE_FAILED',\n} as const\n\nexport type IgniterJobsErrorCode = keyof typeof IGNITER_JOBS_ERROR_CODES\n\nexport interface IgniterJobsErrorOptions {\n /** Error code scoped to Igniter Jobs. */\n code: IgniterJobsErrorCode\n /** Human-readable message. */\n message: string\n /** HTTP-like status code hint (default: 500). */\n statusCode?: number\n /** Optional structured details for debugging and clients. */\n details?: unknown\n /** Optional metadata for logs and tracing. */\n metadata?: Record<string, unknown>\n /** Optional causer tag used by some Igniter tooling. */\n causer?: string\n /** Underlying cause for debugging (optional). */\n cause?: Error\n /** Optional logger passthrough to align with other Igniter errors. */\n logger?: any\n}\n\n/**\n * Typed error class for the Jobs package.\n *\n * @example\n * ```typescript\n * throw new IgniterJobsError({\n * code: 'JOBS_INVALID_INPUT',\n * message: 'Input payload failed validation',\n * })\n * ```\n */\nexport class IgniterJobsError extends IgniterError {\n constructor(options: IgniterJobsErrorOptions) {\n super(options)\n }\n}\n","/**\n * @fileoverview Worker builder for @igniter-js/jobs\n * @module @igniter-js/jobs/builders/igniter-worker\n */\n\nimport type { IgniterJobsAdapter } from '../types/adapter'\nimport type { IgniterJobsLimiter } from '../types/job'\nimport type { IgniterJobsWorkerHandle, IgniterJobsWorkerHandlers } from '../types/worker'\nimport { IgniterJobsError } from '../errors'\n\ntype IgniterJobsWorkerBuilderState<TAllowedQueues extends string> = {\n queues: TAllowedQueues[]\n concurrency?: number\n limiter?: IgniterJobsLimiter\n handlers: IgniterJobsWorkerHandlers\n}\n\n/**\n * Fluent builder for creating workers tied to registered queues.\n *\n * Instances of this builder are created by `jobs.worker.create()` so it can be\n * automatically scoped to registered queue names.\n */\nexport class IgniterWorkerBuilder<TAllowedQueues extends string> {\n private readonly adapter: IgniterJobsAdapter\n private readonly allowedQueues: readonly TAllowedQueues[]\n private readonly state: IgniterJobsWorkerBuilderState<TAllowedQueues>\n\n constructor(params: {\n adapter: IgniterJobsAdapter\n allowedQueues: readonly TAllowedQueues[]\n state?: Partial<IgniterJobsWorkerBuilderState<TAllowedQueues>>\n }) {\n this.adapter = params.adapter\n this.allowedQueues = params.allowedQueues\n this.state = {\n queues: params.state?.queues ?? [],\n concurrency: params.state?.concurrency,\n limiter: params.state?.limiter,\n handlers: params.state?.handlers ?? {},\n }\n }\n\n private clone(patch: Partial<IgniterJobsWorkerBuilderState<TAllowedQueues>>): IgniterWorkerBuilder<TAllowedQueues> {\n return new IgniterWorkerBuilder<TAllowedQueues>({\n adapter: this.adapter,\n allowedQueues: this.allowedQueues,\n state: { ...this.state, ...patch },\n })\n }\n\n /**\n * Adds a queue to the worker.\n *\n * @param queue - Queue name registered on the jobs instance.\n */\n public addQueue(queue: TAllowedQueues): IgniterWorkerBuilder<TAllowedQueues> {\n if (!this.allowedQueues.includes(queue)) {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_NOT_FOUND',\n message: `Queue \"${queue}\" is not registered on this jobs instance.`,\n })\n }\n\n if (this.state.queues.includes(queue)) return this\n return this.clone({ queues: [...this.state.queues, queue] })\n }\n\n /**\n * Sets the worker concurrency.\n */\n public withConcurrency(concurrency: number): IgniterWorkerBuilder<TAllowedQueues> {\n if (!Number.isFinite(concurrency) || concurrency <= 0) {\n throw new IgniterJobsError({\n code: 'JOBS_CONFIGURATION_INVALID',\n message: 'Worker concurrency must be a positive number.',\n })\n }\n return this.clone({ concurrency })\n }\n\n /**\n * Sets a worker-level rate limiter.\n */\n public withLimiter(limiter: IgniterJobsLimiter): IgniterWorkerBuilder<TAllowedQueues> {\n if (!limiter || !Number.isFinite(limiter.max) || !Number.isFinite(limiter.duration) || limiter.max <= 0 || limiter.duration <= 0) {\n throw new IgniterJobsError({\n code: 'JOBS_CONFIGURATION_INVALID',\n message: 'Limiter must include positive max and duration.',\n })\n }\n return this.clone({ limiter })\n }\n\n public onActive(handler: NonNullable<IgniterJobsWorkerHandlers['onActive']>): IgniterWorkerBuilder<TAllowedQueues> {\n return this.clone({ handlers: { ...this.state.handlers, onActive: handler } })\n }\n\n public onSuccess(handler: NonNullable<IgniterJobsWorkerHandlers['onSuccess']>): IgniterWorkerBuilder<TAllowedQueues> {\n return this.clone({ handlers: { ...this.state.handlers, onSuccess: handler } })\n }\n\n public onFailure(handler: NonNullable<IgniterJobsWorkerHandlers['onFailure']>): IgniterWorkerBuilder<TAllowedQueues> {\n return this.clone({ handlers: { ...this.state.handlers, onFailure: handler } })\n }\n\n public onIdle(handler: NonNullable<IgniterJobsWorkerHandlers['onIdle']>): IgniterWorkerBuilder<TAllowedQueues> {\n return this.clone({ handlers: { ...this.state.handlers, onIdle: handler } })\n }\n\n /**\n * Builds and starts the worker.\n *\n * If no queues are added explicitly, the adapter should interpret it as \"all queues\".\n */\n public async start(): Promise<IgniterJobsWorkerHandle> {\n const concurrency = this.state.concurrency ?? 1\n return this.adapter.createWorker({\n queues: this.state.queues,\n concurrency,\n limiter: this.state.limiter,\n handlers: this.state.handlers,\n })\n }\n}\n\n","/**\n * Helpers for building consistent key/queue prefixes.\n */\nexport class IgniterJobsPrefix {\n public static readonly BASE_PREFIX = 'igniter:jobs'\n\n /**\n * Builds a normalized queue name using the global prefix and queue id.\n *\n * @example\n * ```typescript\n * const name = IgniterJobsPrefix.buildQueueName('email')\n * // -> igniter:jobs:email\n * ```\n */\n public static buildQueueName(queue: string): string {\n return `${IgniterJobsPrefix.BASE_PREFIX}:${queue}`\n }\n\n /**\n * Builds the event channel used for pub/sub.\n *\n * Unscoped events are published to a global channel per service/environment.\n * Scoped events are also published to an additional channel for that scope.\n */\n public static buildEventsChannel(params: {\n service: string\n environment: string\n scope?: { type: string; id: string | number }\n }): string {\n const base = `${IgniterJobsPrefix.BASE_PREFIX}:events:${params.environment}:${params.service}`\n if (!params.scope) return base\n return `${base}:scope:${params.scope.type}:${params.scope.id}`\n }\n}\n","/**\n * @fileoverview Event utilities for @igniter-js/jobs\n * @module @igniter-js/jobs/utils/events.utils\n */\n\nimport type { IgniterJobsAdapter } from \"../types/adapter\";\nimport type { IgniterJobsEvent } from \"../types/events\";\nimport type { IgniterJobsScopeEntry } from \"../types/scope\";\nimport { IgniterJobsPrefix } from \"./prefix\";\n\n/**\n * Static utility class for building and publishing job events.\n */\nexport class IgniterJobsEventsUtils {\n /**\n * Constructs a standardized job event type string.\n *\n * @param queue - The queue name.\n * @param jobName - The job name.\n * @param event - The specific event name (e.g., 'started', 'completed').\n * @returns A string in the format `queue:jobName:event`.\n */\n public static buildJobEventType(\n queue: string,\n jobName: string,\n event: string,\n ): string {\n return `${queue}:${jobName}:${event}`;\n }\n\n /**\n * Publishes a job event to the configured adapter.\n * Handles publishing to both the base channel and the scope-specific channel if a scope is provided.\n *\n * @param params - Configuration parameters for publishing the event.\n */\n public static async publishJobsEvent(params: {\n adapter: IgniterJobsAdapter;\n service: string;\n environment: string;\n scope?: IgniterJobsScopeEntry;\n event: IgniterJobsEvent;\n }): Promise<void> {\n const baseChannel = IgniterJobsPrefix.buildEventsChannel({\n service: params.service,\n environment: params.environment,\n });\n await params.adapter.publishEvent(baseChannel, params.event);\n\n if (params.scope) {\n const scopeChannel = IgniterJobsPrefix.buildEventsChannel({\n service: params.service,\n environment: params.environment,\n scope: { type: params.scope.type, id: params.scope.id },\n });\n await params.adapter.publishEvent(scopeChannel, params.event);\n }\n }\n}\n","/**\n * @fileoverview Scope utilities for @igniter-js/jobs\n * @module @igniter-js/jobs/utils/scope.utils\n */\n\nimport type { IgniterJobsScopeEntry } from \"../types/scope\";\n\n/**\n * Static utility class for handling job scopes and metadata.\n */\nexport class IgniterJobsScopeUtils {\n /**\n * The key used to store scope information in job metadata.\n */\n public static readonly SCOPE_METADATA_KEY = \"__igniter_jobs_scope\";\n\n /**\n * Merges a scope entry into a metadata object.\n *\n * @param metadata - Existing metadata object.\n * @param scope - The scope entry to merge.\n * @returns A new metadata object containing the scope information, or the original metadata if no scope is provided.\n */\n public static mergeMetadataWithScope(\n metadata: Record<string, unknown> | undefined,\n scope: IgniterJobsScopeEntry | undefined,\n ): Record<string, unknown> | undefined {\n if (!scope) return metadata;\n return {\n ...(metadata ?? {}),\n [this.SCOPE_METADATA_KEY]: scope,\n };\n }\n\n /**\n * Extracts a scope entry from a metadata object.\n *\n * @param metadata - The metadata object to inspect.\n * @returns The extracted scope entry, or undefined if not found.\n */\n public static extractScopeFromMetadata(\n metadata: Record<string, unknown> | undefined,\n ): IgniterJobsScopeEntry | undefined {\n if (!metadata) return undefined;\n const value = (metadata as any)[this.SCOPE_METADATA_KEY];\n if (!value || typeof value !== \"object\") return undefined;\n if (!(\"type\" in value) || !(\"id\" in value)) return undefined;\n return value as IgniterJobsScopeEntry;\n }\n}\n","/**\n * @fileoverview Validation utilities for @igniter-js/jobs\n * @module @igniter-js/jobs/utils/validation.utils\n */\n\nimport { IgniterJobsError } from \"../errors\";\nimport type { IgniterJobsSchema } from \"../types/schema\";\n\n/**\n * Static utility class for runtime input validation.\n */\nexport class IgniterJobsValidationUtils {\n /**\n * Checks if a value conforms to the Standard Schema V1 interface.\n *\n * @param value - The value to check.\n * @returns True if the value is a Standard Schema.\n */\n public static isStandardSchema(\n value: unknown,\n ): value is { \"~standard\": { validate: (value: unknown) => any } } {\n return Boolean(\n value && typeof value === \"object\" && \"~standard\" in (value as any),\n );\n }\n\n /**\n * Checks if a value conforms to a Zod-like schema interface.\n *\n * @param value - The value to check.\n * @returns True if the value is a Zod-like schema.\n */\n public static isZodLikeSchema(value: unknown): value is {\n safeParse?: (value: unknown) => any;\n parse: (value: unknown) => any;\n } {\n return Boolean(\n value && typeof value === \"object\" && \"parse\" in (value as any),\n );\n }\n\n /**\n * Validates input against a provided schema (Standard Schema or Zod-like).\n *\n * @param schema - The schema definition.\n * @param input - The input data to validate.\n * @returns The validated (and possibly transformed) data.\n * @throws {IgniterJobsError} If validation fails.\n */\n public static async validateInput(\n schema: IgniterJobsSchema,\n input: unknown,\n ): Promise<unknown> {\n if (this.isStandardSchema(schema)) {\n const result = await (schema as any)[\"~standard\"].validate(input);\n if (\"issues\" in result && result.issues) {\n const message = result.issues.map((i: any) => i.message).join(\"; \");\n throw new IgniterJobsError({\n code: \"JOBS_VALIDATION_FAILED\",\n message: `Input validation failed: ${message}`,\n details: { issues: result.issues },\n statusCode: 400,\n });\n }\n return (result as any).value;\n }\n\n if (this.isZodLikeSchema(schema)) {\n if (typeof (schema as any).safeParse === \"function\") {\n const result = (schema as any).safeParse(input);\n if (!result.success) {\n throw new IgniterJobsError({\n code: \"JOBS_VALIDATION_FAILED\",\n message: \"Input validation failed.\",\n details: { error: result.error },\n statusCode: 400,\n });\n }\n return result.data;\n }\n try {\n return (schema as any).parse(input);\n } catch (error) {\n throw new IgniterJobsError({\n code: \"JOBS_VALIDATION_FAILED\",\n message: \"Input validation failed.\",\n details: { error },\n statusCode: 400,\n });\n }\n }\n\n return input;\n }\n}\n","/**\n * @fileoverview Core IgniterJobsManager class with all job operations\n * @module @igniter-js/jobs/core\n *\n * @description\n * The main IgniterJobsManager class provides a type-safe, scoped API for background job processing.\n * It supports job dispatching, scheduling, worker management, queue operations, and scoped instances\n * for multi-tenant applications.\n *\n * @example\n * ```typescript\n * import { IgniterJobs, IgniterJobsMemoryAdapter } from '@igniter-js/jobs'\n * import { z } from 'zod'\n *\n * const emailQueue = IgniterQueue.create('email')\n * .addJob('sendWelcome', {\n * input: z.object({ to: z.string(), name: z.string() }),\n * handler: async (ctx) => {\n * await sendEmail(ctx.input.to, `Welcome ${ctx.input.name}!`)\n * },\n * })\n * .build()\n *\n * const jobs = IgniterJobs.create()\n * .withAdapter(IgniterJobsMemoryAdapter.create())\n * .withService('my-api')\n * .withEnvironment('production')\n * .withContext(async () => ({ db }))\n * .addQueue(emailQueue)\n * .build()\n *\n * // Dispatch a job\n * await jobs.email.sendWelcome.dispatch({ input: { to: 'user@example.com', name: 'Alice' } })\n *\n * // Scoped operations\n * const orgJobs = jobs.scope('organization', 'org_123')\n * await orgJobs.email.sendWelcome.dispatch({ input: { to: 'user@example.com', name: 'Bob' } })\n * ```\n */\n\nimport type { IgniterJobsConfig } from \"../types/config\";\nimport type { IgniterJobsRuntime } from \"../types/runtime\";\nimport type { IgniterJobsAdapter } from \"../types/adapter\";\nimport type {\n IgniterCronDefinition,\n IgniterJobDefinition,\n IgniterJobStatus,\n IgniterJobsDispatchParams,\n IgniterJobsExecutionContext,\n IgniterJobsHookContext,\n IgniterJobsScheduleParams,\n} from \"../types/job\";\nimport type {\n IgniterJobsEvent,\n IgniterJobsEventHandler,\n IgniterJobsTelemetry,\n} from \"../types/events\";\nimport type {\n IgniterJobsScopeEntry,\n IgniterJobsScopeOptions,\n} from \"../types/scope\";\nimport type { IgniterJobsQueue } from \"../types/queue\";\n\nimport { IgniterWorkerBuilder } from \"../builders/worker.builder\";\nimport { IgniterJobsError } from \"../errors\";\nimport { IgniterJobsPrefix } from \"../utils/prefix\";\nimport { IgniterJobsEventsUtils } from \"../utils/events.utils\";\nimport { IgniterJobsScopeUtils } from \"../utils/scope\";\nimport { IgniterJobsValidationUtils } from \"../utils/validation\";\n\n/**\n * WeakSet to track which adapters have already been registered.\n * This ensures that scoped instances don't re-register jobs.\n * @internal\n */\nconst registeredAdapters = new WeakSet<IgniterJobsAdapter>();\n\n/**\n * Main IgniterJobsManager class providing background job processing operations.\n *\n * Features:\n * - **Job Dispatching**: Enqueue jobs for immediate or delayed processing\n * - **Job Scheduling**: Schedule jobs with cron expressions or specific times\n * - **Worker Management**: Create and manage workers with configurable concurrency\n * - **Queue Operations**: Pause, resume, drain, clean queues\n * - **Scopes**: Multi-tenant isolation with scoped job instances\n * - **Telemetry**: Built-in observability with typed telemetry events\n *\n * @typeParam TConfig - The jobs configuration type\n */\nexport class IgniterJobsManager<\n TConfig extends IgniterJobsConfig<any, any, any> = IgniterJobsConfig<\n any,\n any,\n any\n >,\n> {\n /** @internal */\n private readonly config: TConfig;\n\n /** @internal */\n private readonly adapter: IgniterJobsAdapter;\n\n /** @internal */\n private readonly telemetry?: IgniterJobsTelemetry;\n\n /** @internal */\n private readonly scopeEntry?: IgniterJobsScopeEntry;\n\n /**\n * @internal\n * Constructor is internal. Use `IgniterJobs.create()` instead.\n */\n constructor(config: TConfig, scopeEntry?: IgniterJobsScopeEntry) {\n this.config = config;\n this.adapter = config.adapter;\n this.telemetry = config.telemetry;\n this.scopeEntry = scopeEntry;\n }\n\n // ---------------------------------------------------------------------------\n // Public Methods\n // ---------------------------------------------------------------------------\n\n /**\n * Creates a scoped jobs instance.\n *\n * Scopes provide multi-tenant isolation by adding scope metadata to all jobs.\n * Jobs dispatched from a scoped instance will include scope information in their metadata.\n *\n * @param type - The scope type (e.g., 'organization', 'workspace')\n * @param id - The scope identifier (e.g., 'org_123')\n * @param tags - Optional additional tags for the scope\n * @returns A new scoped IgniterJobsManager instance\n *\n * @example\n * ```typescript\n * const orgJobs = jobs.scope('organization', 'org_123')\n * await orgJobs.email.sendWelcome.dispatch({ input: { to: 'user@example.com' } })\n * ```\n */\n public scope(\n type: string,\n id: string | number,\n tags?: Record<string, unknown>,\n ): IgniterJobsManager<TConfig> {\n const entry: IgniterJobsScopeEntry = { type, id: String(id), tags };\n return new IgniterJobsManager(this.config, entry);\n }\n\n /**\n * Subscribes to all job events from this jobs instance.\n *\n * @param handler - The event handler function\n * @returns A function to unsubscribe\n *\n * @example\n * ```typescript\n * const unsubscribe = await jobs.subscribe((event) => {\n * console.log('Job event:', event.type, event.data)\n * })\n * // Later: await unsubscribe()\n * ```\n */\n public async subscribe(\n handler: IgniterJobsEventHandler,\n ): Promise<() => Promise<void>> {\n const channel = this.buildEventsChannel();\n return this.adapter.subscribeEvent(channel, async (payload: unknown) => {\n await handler(payload as IgniterJobsEvent);\n });\n }\n\n /**\n * Searches for jobs, queues, or workers based on filters.\n *\n * @param target - The target to search ('jobs', 'queues', or 'workers')\n * @param filter - The filter criteria\n * @returns The search results\n *\n * @example\n * ```typescript\n * const failedJobs = await jobs.search('jobs', { status: 'failed', queue: 'email' })\n * const queues = await jobs.search('queues', {})\n * ```\n */\n public async search(\n target: \"jobs\" | \"queues\" | \"workers\",\n filter: Record<string, unknown>,\n ): Promise<unknown[]> {\n switch (target) {\n case \"jobs\":\n return this.adapter.searchJobs(filter);\n case \"queues\":\n return this.adapter.searchQueues(filter);\n case \"workers\":\n return this.adapter.searchWorkers(filter);\n default:\n return [];\n }\n }\n\n /**\n * Gracefully shuts down the jobs instance.\n *\n * This will close all connections and stop all workers.\n *\n * @example\n * ```typescript\n * await jobs.shutdown()\n * ```\n */\n public async shutdown(): Promise<void> {\n await this.adapter.shutdown();\n }\n\n /**\n * Creates a new worker builder for processing jobs.\n *\n * @returns A new IgniterWorkerBuilder instance\n *\n * @example\n * ```typescript\n * const worker = await jobs.worker\n * .create()\n * .addQueue('email')\n * .withConcurrency(5)\n * .start()\n * ```\n */\n public get worker() {\n return {\n create: () =>\n new IgniterWorkerBuilder({\n adapter: this.adapter,\n allowedQueues: Object.keys(this.config.queues) as any,\n state: this.config.workerDefaults,\n }),\n };\n }\n\n /**\n * Converts the manager to a runtime proxy with typed queue accessors.\n *\n * @internal\n * @returns The runtime proxy\n */\n public toRuntime(): IgniterJobsRuntime<TConfig> {\n this.ensureRegistered();\n\n const self = this;\n const queueNames = Object.keys(this.config.queues);\n\n // Create proxy to handle dynamic queue access\n const handler: ProxyHandler<IgniterJobsManager<TConfig>> = {\n get(target, prop: string) {\n // Handle known properties\n if (prop === \"config\") return target.config;\n if (prop === \"subscribe\") return target.subscribe.bind(target);\n if (prop === \"search\") return target.search.bind(target);\n if (prop === \"shutdown\") return target.shutdown.bind(target);\n if (prop === \"worker\") return target.worker;\n if (prop === \"scope\" && target.config.scopeDefinition) {\n return (\n type: string,\n id: string | number,\n tags?: Record<string, unknown>,\n ) => target.scope(type, id, tags).toRuntime();\n }\n\n // Handle queue access\n if (queueNames.includes(prop)) {\n return self.createQueueAccessor(prop);\n }\n\n return undefined;\n },\n };\n\n return new Proxy(this, handler) as unknown as IgniterJobsRuntime<TConfig>;\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods - Registration\n // ---------------------------------------------------------------------------\n\n /**\n * Ensures all jobs and crons are registered with the adapter.\n * Uses a shared WeakSet to prevent duplicate registration across scoped instances.\n * @internal\n */\n private ensureRegistered(): void {\n if (registeredAdapters.has(this.adapter)) return;\n\n for (const [queueName, queue] of Object.entries(\n this.config.queues as Record<string, IgniterJobsQueue<any, any, any>>,\n )) {\n // Register jobs\n for (const [jobName, def] of Object.entries(\n queue.jobs as Record<string, IgniterJobDefinition<any, any, any>>,\n )) {\n this.adapter.registerJob(\n queueName,\n jobName,\n this.wrapJobDefinition(\n queueName,\n jobName,\n this.getEffectiveJobDefinition(queueName, jobName, def),\n ),\n );\n }\n\n // Register crons\n for (const [cronName, cron] of Object.entries(\n queue.crons as Record<string, IgniterCronDefinition<any, any>>,\n )) {\n this.adapter.registerCron(\n queueName,\n cronName,\n this.wrapCronDefinition(queueName, cronName, cron),\n );\n }\n }\n\n registeredAdapters.add(this.adapter);\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods - Accessors\n // ---------------------------------------------------------------------------\n\n /**\n * Creates a queue accessor with job accessors and management methods.\n * @internal\n */\n private createQueueAccessor(queueName: string): unknown {\n const queueConfig = this.config.queues[queueName] as IgniterJobsQueue<\n any,\n any,\n any\n >;\n const self = this;\n\n const queueAccessor: Record<string, unknown> = {\n async list(filter?: {\n status?: IgniterJobStatus[];\n limit?: number;\n offset?: number;\n }) {\n return self.adapter.queues.getJobs(queueName, filter);\n },\n\n get() {\n return {\n retrieve: () => self.adapter.getQueueInfo(queueName),\n pause: () => self.adapter.pauseQueue(queueName),\n resume: () => self.adapter.resumeQueue(queueName),\n drain: () => self.adapter.drainQueue(queueName),\n clean: (options: any) => self.adapter.cleanQueue(queueName, options),\n obliterate: (options?: { force?: boolean }) =>\n self.adapter.obliterateQueue(queueName, options),\n retryAll: () => self.adapter.retryAllInQueue(queueName),\n };\n },\n\n async subscribe(handler: IgniterJobsEventHandler) {\n const channel = self.buildEventsChannel();\n return self.adapter.subscribeEvent(channel, async (event: unknown) => {\n const typed = event as IgniterJobsEvent;\n if (\n typeof typed?.type === \"string\" &&\n typed.type.startsWith(`${queueName}:`)\n ) {\n await handler(typed);\n }\n });\n },\n\n jobs: {},\n };\n\n // Create job accessors\n for (const jobName of Object.keys(queueConfig.jobs)) {\n const jobAccessor = this.createJobAccessor(queueName, jobName);\n (queueAccessor.jobs as Record<string, unknown>)[jobName] = jobAccessor;\n queueAccessor[jobName] = jobAccessor;\n }\n\n return queueAccessor;\n }\n\n /**\n * Creates a job accessor with dispatch, schedule, and management methods.\n * @internal\n */\n private createJobAccessor(queueName: string, jobName: string): unknown {\n const self = this;\n\n return {\n async dispatch(params: IgniterJobsDispatchParams<any>) {\n return self.dispatchJob(queueName, jobName, params);\n },\n\n async schedule(params: IgniterJobsScheduleParams<any>) {\n return self.scheduleJob(queueName, jobName, params);\n },\n\n get(id: string) {\n return {\n retrieve: () => self.adapter.getJob(id, queueName),\n retry: () => self.adapter.retryJob(id, queueName),\n remove: () => self.adapter.removeJob(id, queueName),\n promote: () => self.adapter.promoteJob(id, queueName),\n move: (state: \"failed\", reason: string) => {\n if (state !== \"failed\") return Promise.resolve();\n return self.adapter.moveJobToFailed(id, reason, queueName);\n },\n state: () => self.adapter.getJobState(id, queueName),\n progress: () => self.adapter.getJobProgress(id, queueName),\n logs: () => self.adapter.getJobLogs(id, queueName),\n };\n },\n\n many(ids: string[]) {\n return {\n retry: () => self.adapter.retryManyJobs(ids, queueName),\n remove: () => self.adapter.removeManyJobs(ids, queueName),\n };\n },\n\n async subscribe(handler: IgniterJobsEventHandler) {\n const channel = self.buildEventsChannel();\n return self.adapter.subscribeEvent(channel, async (event: unknown) => {\n const typed = event as IgniterJobsEvent;\n if (\n typeof typed?.type === \"string\" &&\n typed.type.startsWith(`${queueName}:${jobName}:`)\n ) {\n await handler(typed);\n }\n });\n },\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods - Job Operations\n // ---------------------------------------------------------------------------\n\n /**\n * Dispatches a job for immediate or delayed processing.\n * @internal\n */\n private async dispatchJob(\n queueName: string,\n jobName: string,\n params: IgniterJobsDispatchParams<any>,\n ): Promise<string> {\n const definition = this.getJobDefinition(queueName, jobName);\n\n // Validate input if schema exists\n if (definition?.input) {\n await IgniterJobsValidationUtils.validateInput(\n definition.input as any,\n params.input,\n );\n }\n\n // Resolve scope\n const scope = this.resolveScope(params.scope);\n const metadata = IgniterJobsScopeUtils.mergeMetadataWithScope(\n params.metadata as any,\n scope,\n );\n\n // Dispatch to adapter\n const jobId = await this.adapter.dispatch({\n queue: queueName,\n jobName,\n ...params,\n scope,\n metadata,\n });\n\n // Publish event\n await this.publishJobEvent(\n queueName,\n jobName,\n \"enqueued\",\n { jobId, queue: queueName, jobName },\n scope,\n );\n\n // Emit telemetry\n this.emitTelemetry(\"igniter.jobs.job.enqueued\", {\n \"ctx.job.id\": jobId,\n \"ctx.job.name\": jobName,\n \"ctx.job.queue\": queueName,\n \"ctx.job.priority\": (params as any).priority ?? null,\n \"ctx.job.delay\": (params as any).delay ?? null,\n });\n\n return jobId;\n }\n\n /**\n * Schedules a job for future processing.\n * @internal\n */\n private async scheduleJob(\n queueName: string,\n jobName: string,\n params: IgniterJobsScheduleParams<any>,\n ): Promise<string> {\n const definition = this.getJobDefinition(queueName, jobName);\n\n // Validate input if schema exists\n if (definition?.input) {\n await IgniterJobsValidationUtils.validateInput(\n definition.input as any,\n params.input,\n );\n }\n\n // Resolve scope\n const scope = this.resolveScope(params.scope);\n const metadata = IgniterJobsScopeUtils.mergeMetadataWithScope(\n params.metadata as any,\n scope,\n );\n\n // Schedule via adapter\n const jobId = await this.adapter.schedule({\n queue: queueName,\n jobName,\n ...params,\n scope,\n metadata,\n } as any);\n\n // Publish event\n await this.publishJobEvent(\n queueName,\n jobName,\n \"scheduled\",\n { jobId, queue: queueName, jobName },\n scope,\n );\n\n // Emit telemetry\n this.emitTelemetry(\"igniter.jobs.job.scheduled\", {\n \"ctx.job.id\": jobId,\n \"ctx.job.name\": jobName,\n \"ctx.job.queue\": queueName,\n \"ctx.job.scheduledAt\": params.at?.toISOString() ?? null,\n \"ctx.job.cron\": (params as any).cron ?? null,\n });\n\n return jobId;\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods - Handler Wrapping\n // ---------------------------------------------------------------------------\n\n /**\n * Wraps a job definition with context building, validation, and telemetry.\n * @internal\n */\n private wrapJobDefinition(\n queueName: string,\n jobName: string,\n definition: IgniterJobDefinition<any, any, any>,\n ): IgniterJobDefinition<any, any, any> {\n const self = this;\n\n return {\n ...definition,\n\n handler: async (ctx: IgniterJobsExecutionContext<any, any>) => {\n const enhanced = await self.buildExecutionContext(\n ctx,\n queueName,\n jobName,\n );\n\n // Validate input if schema exists\n if (definition.input) {\n const validated = await IgniterJobsValidationUtils.validateInput(\n definition.input as any,\n enhanced.input,\n );\n (enhanced as any).input = validated;\n }\n\n return definition.handler(enhanced);\n },\n\n onStart: async (ctx: IgniterJobsHookContext<any, any>) => {\n const enhanced = await self.buildExecutionContext(\n ctx as any,\n queueName,\n jobName,\n );\n\n // Publish lifecycle event\n await self.publishJobEvent(\n queueName,\n jobName,\n \"started\",\n {\n jobId: enhanced.job.id,\n jobName,\n queue: queueName,\n attemptsMade: enhanced.job.attemptsMade,\n startedAt: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n // Emit telemetry\n self.emitTelemetry(\"igniter.jobs.job.started\", {\n \"ctx.job.id\": enhanced.job.id,\n \"ctx.job.name\": jobName,\n \"ctx.job.queue\": queueName,\n \"ctx.job.attempt\": enhanced.job.attemptsMade,\n \"ctx.job.maxAttempts\": definition.attempts ?? 3,\n });\n\n await definition.onStart?.(enhanced as any);\n },\n\n onSuccess: async (ctx: any) => {\n const enhanced = await self.buildExecutionContext(\n ctx as any,\n queueName,\n jobName,\n );\n const duration = ctx.duration ?? ctx.executionTime ?? 0;\n\n // Publish lifecycle event\n await self.publishJobEvent(\n queueName,\n jobName,\n \"completed\",\n {\n jobId: enhanced.job.id,\n jobName,\n queue: queueName,\n result: ctx.result,\n duration,\n completedAt: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n // Emit telemetry\n self.emitTelemetry(\"igniter.jobs.job.completed\", {\n \"ctx.job.id\": enhanced.job.id,\n \"ctx.job.name\": jobName,\n \"ctx.job.queue\": queueName,\n \"ctx.job.duration\": typeof duration === \"number\" ? duration : 0,\n });\n\n await definition.onSuccess?.(enhanced as any);\n },\n\n onFailure: async (ctx: any) => {\n const enhanced = await self.buildExecutionContext(\n ctx as any,\n queueName,\n jobName,\n );\n const duration = ctx.duration ?? ctx.executionTime ?? 0;\n const isFinalAttempt = Boolean(ctx.isFinalAttempt);\n const errorMessage = ctx.error?.message ?? String(ctx.error);\n const errorCode = ctx.error?.code;\n const maxAttempts = definition.attempts ?? 3;\n\n // Publish lifecycle event\n await self.publishJobEvent(\n queueName,\n jobName,\n \"failed\",\n {\n jobId: enhanced.job.id,\n jobName,\n queue: queueName,\n error: { message: errorMessage },\n attemptsMade: enhanced.job.attemptsMade,\n isFinalAttempt,\n duration,\n failedAt: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n // Emit telemetry\n self.emitTelemetry(\n \"igniter.jobs.job.failed\",\n {\n \"ctx.job.id\": enhanced.job.id,\n \"ctx.job.name\": jobName,\n \"ctx.job.queue\": queueName,\n \"ctx.job.error.message\": errorMessage,\n \"ctx.job.error.code\": errorCode ?? null,\n \"ctx.job.attempt\": enhanced.job.attemptsMade,\n \"ctx.job.maxAttempts\": maxAttempts,\n \"ctx.job.isFinalAttempt\": isFinalAttempt,\n },\n \"error\",\n );\n\n await definition.onFailure?.(enhanced as any);\n },\n\n onProgress: definition.onProgress\n ? async (ctx: any) => {\n const enhanced = await self.buildExecutionContext(\n ctx as any,\n queueName,\n jobName,\n );\n const progress = ctx.progress ?? 0;\n const message = ctx.message;\n\n // Publish lifecycle event\n await self.publishJobEvent(\n queueName,\n jobName,\n \"progress\",\n {\n jobId: enhanced.job.id,\n jobName,\n queue: queueName,\n progress,\n message,\n timestamp: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n // Emit telemetry\n self.emitTelemetry(\"igniter.jobs.job.progress\", {\n \"ctx.job.id\": enhanced.job.id,\n \"ctx.job.name\": jobName,\n \"ctx.job.queue\": queueName,\n \"ctx.job.progress\": typeof progress === \"number\" ? progress : 0,\n \"ctx.job.progress.message\": message ?? null,\n });\n\n await definition.onProgress?.(enhanced as any);\n }\n : undefined,\n };\n }\n\n /**\n * Wraps a cron definition with context building and lifecycle events.\n * @internal\n */\n private wrapCronDefinition(\n queueName: string,\n cronName: string,\n definition: IgniterCronDefinition<any, any>,\n ): IgniterCronDefinition<any, any> {\n const self = this;\n\n return {\n ...definition,\n\n handler: async (ctx: any) => {\n const enhanced = await self.buildCronExecutionContext(\n ctx,\n queueName,\n cronName,\n );\n\n // Publish started event\n await self.publishJobEvent(\n queueName,\n cronName,\n \"started\",\n {\n jobId: enhanced.job?.id,\n jobName: cronName,\n queue: queueName,\n startedAt: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n try {\n const result = await definition.handler(enhanced as any);\n\n // Publish completed event\n await self.publishJobEvent(\n queueName,\n cronName,\n \"completed\",\n {\n jobId: enhanced.job?.id,\n jobName: cronName,\n queue: queueName,\n result,\n completedAt: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n return result;\n } catch (error) {\n // Publish failed event\n await self.publishJobEvent(\n queueName,\n cronName,\n \"failed\",\n {\n jobId: enhanced.job?.id,\n jobName: cronName,\n queue: queueName,\n error: { message: (error as any)?.message ?? String(error) },\n failedAt: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n throw error;\n }\n },\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods - Helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Builds the execution context for a job.\n * @internal\n */\n private async buildExecutionContext(\n ctx: IgniterJobsExecutionContext<any, any>,\n queueName: string,\n jobName: string,\n ): Promise<IgniterJobsExecutionContext<any, any>> {\n const realContext = await this.config.contextFactory();\n const scope =\n ctx.scope ??\n IgniterJobsScopeUtils.extractScopeFromMetadata(ctx.job.metadata as any);\n\n return {\n ...ctx,\n context: realContext,\n job: { ...ctx.job, name: jobName, queue: queueName },\n scope,\n };\n }\n\n /**\n * Builds the execution context for a cron job.\n * @internal\n */\n private async buildCronExecutionContext(\n ctx: Omit<IgniterJobsExecutionContext<any, unknown>, \"input\">,\n queueName: string,\n cronName: string,\n ): Promise<Omit<IgniterJobsExecutionContext<any, unknown>, \"input\">> {\n const realContext = await this.config.contextFactory();\n const scope =\n (ctx as any).scope ??\n IgniterJobsScopeUtils.extractScopeFromMetadata(\n (ctx as any).job?.metadata,\n );\n\n return {\n ...ctx,\n context: realContext,\n job: { ...(ctx as any).job, name: cronName, queue: queueName },\n scope,\n } as any;\n }\n\n /**\n * Gets a job definition by queue and job name.\n * @internal\n */\n private getJobDefinition(\n queueName: string,\n jobName: string,\n ): IgniterJobDefinition<any, any, any> | undefined {\n const queue = this.config.queues[queueName] as\n | IgniterJobsQueue<any, any, any>\n | undefined;\n const definition = queue?.jobs?.[jobName];\n return definition\n ? this.getEffectiveJobDefinition(queueName, jobName, definition)\n : undefined;\n }\n\n private getEffectiveJobDefinition(\n queueName: string,\n jobName: string,\n definition: IgniterJobDefinition<any, any, any>,\n ): IgniterJobDefinition<any, any, any> {\n const queue = this.config.queues[queueName] as\n | IgniterJobsQueue<any, any, any>\n | undefined;\n\n return {\n ...this.config.queueDefaults,\n ...queue?.defaultJobOptions,\n ...definition,\n name: jobName,\n } as IgniterJobDefinition<any, any, any>;\n }\n\n /**\n * Resolves the effective scope for a job operation.\n * @internal\n */\n private resolveScope(\n paramsScope?: IgniterJobsScopeEntry,\n ): IgniterJobsScopeEntry | undefined {\n if (!this.config.scopeDefinition) return undefined;\n\n const required =\n Object.values(\n this.config.scopeDefinition as Record<string, IgniterJobsScopeOptions>,\n )[0]?.required ?? false;\n\n const effective = this.scopeEntry ?? paramsScope;\n\n if (required && !effective) {\n throw new IgniterJobsError({\n code: \"JOBS_CONFIGURATION_INVALID\",\n message: \"Scope is required for this jobs instance.\",\n });\n }\n\n if (this.scopeEntry && paramsScope) {\n if (\n this.scopeEntry.type !== paramsScope.type ||\n this.scopeEntry.id !== paramsScope.id\n ) {\n throw new IgniterJobsError({\n code: \"JOBS_CONFIGURATION_INVALID\",\n message: \"Cannot override scope on a scoped jobs instance.\",\n });\n }\n }\n\n return effective;\n }\n\n /**\n * Builds the events channel string for subscriptions.\n * @internal\n */\n private buildEventsChannel(): string {\n return this.scopeEntry\n ? IgniterJobsPrefix.buildEventsChannel({\n service: this.config.service,\n environment: this.config.environment,\n scope: { type: this.scopeEntry.type, id: this.scopeEntry.id },\n })\n : IgniterJobsPrefix.buildEventsChannel({\n service: this.config.service,\n environment: this.config.environment,\n });\n }\n\n /**\n * Publishes a job lifecycle event.\n * @internal\n */\n private async publishJobEvent(\n queueName: string,\n jobName: string,\n eventType: string,\n data: Record<string, unknown>,\n scope?: IgniterJobsScopeEntry,\n ): Promise<void> {\n await IgniterJobsEventsUtils.publishJobsEvent({\n adapter: this.adapter,\n service: this.config.service,\n environment: this.config.environment,\n scope,\n event: {\n type: IgniterJobsEventsUtils.buildJobEventType(\n queueName,\n jobName,\n eventType,\n ),\n data,\n timestamp: new Date(),\n scope,\n },\n });\n }\n\n /**\n * Emits a telemetry event if telemetry is configured.\n * @internal\n */\n private emitTelemetry(\n eventName: string,\n attributes: Record<string, string | number | boolean | null>,\n level: \"debug\" | \"info\" | \"error\" = \"info\",\n ): void {\n if (!this.telemetry) return;\n\n this.telemetry.emit(eventName, {\n attributes: attributes as any,\n level,\n });\n }\n}\n","/**\n * @fileoverview Queue builder for @igniter-js/jobs\n * @module @igniter-js/jobs/builders/igniter-queue\n */\n\nimport type {\n IgniterCronDefinition,\n IgniterJobDefinition,\n IgniterJobsQueue,\n} from '../types'\nimport type { IgniterJobsSchema } from '../types/schema'\nimport { IgniterJobsError } from '../errors'\n\ninterface IgniterQueueBuilderState<\n TContext,\n TJobs extends Record<string, IgniterJobDefinition<TContext, any, any>>,\n TCron extends Record<string, IgniterCronDefinition<TContext, any>>,\n TName extends string,\n> {\n name: TName\n jobs: TJobs\n crons: TCron\n}\n\n/**\n * Builder for defining queues, jobs, and cron tasks.\n *\n * @example\n * ```typescript\n * import { IgniterQueue } from '@igniter-js/jobs'\n * import { z } from 'zod'\n *\n * const emailQueue = IgniterQueue.create('email')\n * .withContext<{ mailer: Mailer }>()\n * .addJob('sendWelcome', {\n * input: z.object({ email: z.string().email() }),\n * handler: async ({ input, context }) => {\n * await context.mailer.send(input)\n * },\n * })\n * .addCron('cleanup', {\n * cron: '0 2 * * *',\n * handler: async ({ context }) => {\n * await context.mailer.cleanup()\n * },\n * })\n * .build()\n * ```\n */\nexport class IgniterQueueBuilder<\n TContext,\n TJobs extends Record<string, IgniterJobDefinition<TContext, any, any>> = {},\n TCron extends Record<string, IgniterCronDefinition<TContext, any>> = {},\n TName extends string = string,\n> {\n private readonly state: IgniterQueueBuilderState<TContext, TJobs, TCron, TName>\n\n private constructor(state: IgniterQueueBuilderState<TContext, TJobs, TCron, TName>) {\n this.state = state\n }\n\n /**\n * Creates a new queue builder for the given queue name.\n */\n public static create<const TName extends string>(\n name: TName,\n ): IgniterQueueBuilder<unknown, {}, {}, TName> {\n if (!name || typeof name !== 'string') {\n throw new IgniterJobsError({\n code: 'JOBS_CONFIGURATION_INVALID',\n message: 'Queue name must be a non-empty string.',\n })\n }\n\n return new IgniterQueueBuilder<unknown, {}, {}, TName>({\n name,\n jobs: {} as Record<string, any>,\n crons: {} as Record<string, any>,\n })\n }\n\n private clone<\n TNewJobs extends Record<string, IgniterJobDefinition<TContext, any, any>> = TJobs,\n TNewCron extends Record<string, IgniterCronDefinition<TContext, any>> = TCron,\n >(\n patch: Partial<IgniterQueueBuilderState<TContext, TNewJobs, TNewCron, TName>>,\n ): IgniterQueueBuilder<TContext, TNewJobs, TNewCron, TName> {\n return new IgniterQueueBuilder<TContext, TNewJobs, TNewCron, TName>({\n ...(this.state as unknown as IgniterQueueBuilderState<TContext, TNewJobs, TNewCron, TName>),\n ...patch,\n })\n }\n\n /**\n * Registers a job on the queue.\n *\n * @param jobName - Unique name of the job inside the queue.\n * @param definition - Job definition (handler, schemas, options, hooks).\n */\n public addJob<\n TJobName extends string,\n TInput extends IgniterJobsSchema | unknown,\n TResult = unknown,\n >(\n jobName: TJobName,\n definition: IgniterJobDefinition<TContext, TInput, TResult>,\n ): IgniterQueueBuilder<\n TContext,\n TJobs & Record<TJobName, IgniterJobDefinition<TContext, TInput, TResult>>,\n TCron,\n TName\n > {\n if (!jobName || typeof jobName !== 'string') {\n throw new IgniterJobsError({\n code: 'JOBS_INVALID_DEFINITION',\n message: 'Job name must be a non-empty string.',\n })\n }\n\n if ((this.state.jobs as Record<string, unknown>)[jobName]) {\n throw new IgniterJobsError({\n code: 'JOBS_DUPLICATE_JOB',\n message: `Job \"${jobName}\" is already registered in queue \"${this.state.name}\".`,\n })\n }\n\n if ((this.state.crons as Record<string, unknown>)[jobName]) {\n throw new IgniterJobsError({\n code: 'JOBS_DUPLICATE_JOB',\n message: `Job \"${jobName}\" conflicts with an existing cron in queue \"${this.state.name}\".`,\n })\n }\n\n if (!definition || typeof definition !== 'object') {\n throw new IgniterJobsError({\n code: 'JOBS_INVALID_DEFINITION',\n message: `Job \"${jobName}\" definition must be an object.`,\n })\n }\n\n if (!definition.handler || typeof definition.handler !== 'function') {\n throw new IgniterJobsError({\n code: 'JOBS_HANDLER_REQUIRED',\n message: `Job \"${jobName}\" handler is required and must be a function.`,\n })\n }\n\n const nextJobs = {\n ...(this.state.jobs as Record<string, any>),\n [jobName]: definition,\n } as TJobs & Record<TJobName, IgniterJobDefinition<TContext, TInput, TResult>>\n\n return this.clone<TJobs & Record<TJobName, IgniterJobDefinition<TContext, TInput, TResult>>>({\n jobs: nextJobs,\n })\n }\n\n /**\n * Registers a cron task on the queue.\n *\n * @param cronName - Unique name of the cron task inside the queue.\n * @param definition - Cron definition (cron string, tz, handler, options).\n */\n public addCron<TCronName extends string, TResult = unknown>(\n cronName: TCronName,\n definition: IgniterCronDefinition<TContext, TResult>,\n ): IgniterQueueBuilder<\n TContext,\n TJobs,\n TCron & Record<TCronName, IgniterCronDefinition<TContext, TResult>>,\n TName\n > {\n if (!cronName || typeof cronName !== 'string') {\n throw new IgniterJobsError({\n code: 'JOBS_INVALID_CRON',\n message: 'Cron name must be a non-empty string.',\n })\n }\n\n if ((this.state.crons as Record<string, unknown>)[cronName]) {\n throw new IgniterJobsError({\n code: 'JOBS_INVALID_CRON',\n message: `Cron \"${cronName}\" is already registered in queue \"${this.state.name}\".`,\n })\n }\n\n if ((this.state.jobs as Record<string, unknown>)[cronName]) {\n throw new IgniterJobsError({\n code: 'JOBS_INVALID_CRON',\n message: `Cron \"${cronName}\" conflicts with an existing job in queue \"${this.state.name}\".`,\n })\n }\n\n if (!definition || typeof definition !== 'object') {\n throw new IgniterJobsError({\n code: 'JOBS_INVALID_CRON',\n message: `Cron \"${cronName}\" definition must be an object.`,\n })\n }\n\n if (!definition.cron || typeof definition.cron !== 'string') {\n throw new IgniterJobsError({\n code: 'JOBS_INVALID_CRON',\n message: `Cron \"${cronName}\" must include a valid cron expression string.`,\n })\n }\n\n if (!definition.handler || typeof definition.handler !== 'function') {\n throw new IgniterJobsError({\n code: 'JOBS_HANDLER_REQUIRED',\n message: `Cron \"${cronName}\" handler is required and must be a function.`,\n })\n }\n\n const nextCrons = {\n ...(this.state.crons as Record<string, any>),\n [cronName]: definition,\n } as TCron & Record<TCronName, IgniterCronDefinition<TContext, TResult>>\n\n return this.clone<TJobs, TCron & Record<TCronName, IgniterCronDefinition<TContext, TResult>>>({\n crons: nextCrons,\n })\n }\n\n /**\n * Finalizes the queue definition.\n */\n public build(): IgniterJobsQueue<TContext, TJobs, TCron> & { name: TName } {\n return {\n name: this.state.name,\n jobs: this.state.jobs,\n crons: this.state.crons,\n } as IgniterJobsQueue<TContext, TJobs, TCron> & { name: TName }\n }\n}\n","/**\n * @fileoverview Public queue entry point for @igniter-js/jobs\n * @module @igniter-js/jobs/core/igniter-queue\n */\n\nimport { IgniterQueueBuilder } from '../builders/queue.builder'\n\n/**\n * Queue facade that exposes the fluent queue builder API.\n */\nexport class IgniterQueue {\n /**\n * Creates a new queue builder for the given name.\n *\n * @example\n * ```typescript\n * const queue = IgniterQueue.create('email')\n * .withContext<AppContext>()\n * .addJob('sendWelcome', { handler: async () => {} })\n * .build()\n * ```\n */\n public static create<const TName extends string>(name: TName) {\n return IgniterQueueBuilder.create(name)\n }\n}\n","/**\n * @fileoverview Builder for creating IgniterJobs instances\n * @module @igniter-js/jobs/builders/main\n *\n * @description\n * Provides a fluent builder API for configuring and creating IgniterJobs instances.\n * Supports adapter configuration, service naming, environment settings, queues,\n * scopes, telemetry, and more.\n *\n * @example\n * ```typescript\n * import { IgniterJobs, IgniterQueue } from '@igniter-js/jobs'\n * import { IgniterJobsMemoryAdapter } from '@igniter-js/jobs/adapters/mock'\n * import { z } from 'zod'\n *\n * const emailQueue = IgniterQueue.create('email')\n * .addJob('sendWelcome', {\n * input: z.object({ to: z.string(), name: z.string() }),\n * handler: async (ctx) => {\n * await sendEmail(ctx.input.to, `Welcome ${ctx.input.name}!`)\n * },\n * })\n * .build()\n *\n * const jobs = IgniterJobs.create()\n * .withAdapter(IgniterJobsMemoryAdapter.create())\n * .withService('my-api')\n * .withEnvironment('production')\n * .withContext(async () => ({ db }))\n * .addQueue(emailQueue)\n * .build()\n * ```\n */\nimport type { IgniterLogger } from \"@igniter-js/common\";\nimport type { IgniterJobsConfig } from \"../types/config\";\nimport type { IgniterJobsRuntime } from \"../types/runtime\";\nimport type { IgniterJobsAdapter } from \"../types/adapter\";\nimport type { IgniterJobsQueue } from \"../types/queue\";\nimport type { IgniterJobsTelemetry } from \"../types/events\";\nimport type { IgniterJobsScopeOptions } from \"../types/scope\";\nimport type { IgniterJobsScopeDefinition } from \"../types/scope\";\nimport type { IgniterJobDefinition, IgniterJobsLimiter } from \"../types/job\";\nimport type { IgniterJobsWorkerBuilderConfig } from \"../types/worker\";\nimport { IgniterJobsError } from \"../errors\";\nimport { IgniterJobsManager } from \"../core/manager\";\n\ninterface IgniterJobsBuilderState<\n TContext,\n TQueues extends Record<string, IgniterJobsQueue<TContext, any, any>>,\n TScope extends string,\n> {\n adapter?: IgniterJobsAdapter;\n service?: string;\n environment?: string;\n contextFactory?: () => TContext | Promise<TContext>;\n queues: TQueues;\n scope?: { name: TScope; options?: IgniterJobsScopeOptions };\n queueDefaults?: Partial<IgniterJobDefinition<TContext, any, any>>;\n workerDefaults?: Partial<IgniterJobsWorkerBuilderConfig>;\n autoStartWorker?: {\n queues: (keyof TQueues)[];\n concurrency?: number;\n limiter?: IgniterJobsLimiter;\n };\n logger?: IgniterLogger;\n telemetry?: IgniterJobsTelemetry;\n}\n\n/**\n * Fluent builder responsible for configuring and constructing an `IgniterJobs` instance.\n *\n * The builder follows the immutable pattern used across Igniter packages: each\n * method returns a new builder with refined types. Only a single scope is\n * supported per the current specification (no actor support).\n */\nexport class IgniterJobsBuilder<\n TContext,\n TQueues extends Record<string, IgniterJobsQueue<TContext, any, any>> = {},\n TScope extends string = never,\n> {\n private readonly state: IgniterJobsBuilderState<TContext, TQueues, TScope>;\n\n private constructor(\n state?: Partial<IgniterJobsBuilderState<TContext, TQueues, TScope>>,\n ) {\n this.state = {\n queues: (state?.queues ?? ({} as TQueues)) as TQueues,\n ...state,\n } as IgniterJobsBuilderState<TContext, TQueues, TScope>;\n }\n\n /**\n * Creates the initial builder with no configuration.\n *\n * Context type is inferred from `withContext()` - no explicit generic needed.\n *\n * @example\n * ```typescript\n * // Context is inferred from the factory return type\n * const jobs = IgniterJobs.create()\n * .withContext(async () => ({ db: prisma, cache: redis }))\n * // TContext is now { db: PrismaClient, cache: Redis }\n * .build()\n * ```\n */\n public static create(): IgniterJobsBuilder<unknown> {\n return new IgniterJobsBuilder<unknown>({\n queues: {} as Record<string, any>,\n });\n }\n\n /**\n * Returns a new builder with updated state while preserving generics.\n */\n private clone<\n TNewQueues extends Record<string, IgniterJobsQueue<TContext, any, any>> =\n TQueues,\n TNewScope extends string = TScope,\n >(\n patch: Partial<IgniterJobsBuilderState<TContext, any, any>>,\n ): IgniterJobsBuilder<TContext, TNewQueues, TNewScope> {\n return new IgniterJobsBuilder<TContext, TNewQueues, TNewScope>({\n ...(this.state as any),\n ...(patch as any),\n queues: ((patch as any).queues ??\n (this.state.queues as unknown as TNewQueues)) as TNewQueues,\n scope: (patch as any).scope ?? (this.state.scope as any),\n });\n }\n\n /**\n * Attaches the jobs adapter.\n *\n * @param adapter - Backend adapter implementation (BullMQ, memory, etc.).\n */\n public withAdapter(\n adapter: IgniterJobsAdapter,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ adapter });\n }\n\n /**\n * Sets the service identifier for telemetry and metrics.\n *\n * @param service - Service name (e.g., \"my-api\").\n */\n public withService(\n service: string,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ service });\n }\n\n /**\n * Sets the environment name (e.g., development, staging, production).\n */\n public withEnvironment(\n environment: string,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ environment });\n }\n\n /**\n * Provides a context factory used when executing jobs.\n *\n * The context type is inferred from the factory return type, eliminating\n * the need for explicit generics on `IgniterJobs.create()`.\n *\n * **Note:** This must be called before adding any queues, as the context\n * type affects queue type compatibility.\n *\n * @param factory - Function that returns the context (sync or async)\n * @returns A new builder with the inferred context type\n *\n * @example\n * ```typescript\n * // Context type is inferred as { db: PrismaClient, cache: Redis }\n * const jobs = IgniterJobs.create()\n * .withContext(async () => ({\n * db: new PrismaClient(),\n * cache: new Redis(),\n * }))\n * .addQueue(emailQueue)\n * .build()\n * ```\n */\n public withContext<TNewContext>(\n this: IgniterJobsBuilder<unknown, {}, TScope>,\n factory: () => TNewContext | Promise<TNewContext>,\n ): IgniterJobsBuilder<TNewContext, {}, TScope> {\n return new IgniterJobsBuilder<TNewContext, {}, TScope>({\n ...(this.state as any),\n contextFactory: factory,\n queues: {},\n });\n }\n\n /**\n * Adds a scope definition (single scope supported).\n */\n public addScope<TNewScope extends string>(\n name: TNewScope,\n options?: IgniterJobsScopeOptions,\n ): IgniterJobsBuilder<TContext, TQueues, TScope | TNewScope> {\n if (this.state.scope) {\n throw new IgniterJobsError({\n code: \"JOBS_SCOPE_ALREADY_DEFINED\",\n message: \"Only one scope can be defined for IgniterJobs.\",\n });\n }\n return this.clone({ scope: { name: name as TScope | TNewScope, options } });\n }\n\n /**\n * Registers a queue definition on the builder.\n */\n public addQueue<\n TName extends string,\n TQueue extends IgniterJobsQueue<TContext, any, any>,\n >(\n queue: TQueue & { name: TName },\n ): IgniterJobsBuilder<TContext, TQueues & Record<TName, TQueue>, TScope> {\n if ((this.state.queues as Record<string, unknown>)[queue.name]) {\n throw new IgniterJobsError({\n code: \"JOBS_QUEUE_DUPLICATE\",\n message: `Queue \"${queue.name}\" is already registered.`,\n });\n }\n const nextQueues = {\n ...(this.state.queues as unknown as Record<string, TQueue>),\n [queue.name]: queue,\n } as TQueues & Record<TName, TQueue>;\n\n return this.clone<TQueues & Record<TName, TQueue>>({ queues: nextQueues });\n }\n\n /**\n * Applies default job options to all queues.\n */\n public withQueueDefaults(\n defaults: Partial<IgniterJobDefinition<TContext, any, any>>,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ queueDefaults: defaults });\n }\n\n /**\n * Applies default worker options.\n */\n public withWorkerDefaults(\n defaults: Partial<IgniterJobsWorkerBuilderConfig>,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ workerDefaults: defaults });\n }\n\n /**\n * Configures automatic worker startup.\n */\n public withAutoStartWorker(config: {\n queues: (keyof TQueues)[];\n concurrency?: number;\n limiter?: IgniterJobsLimiter;\n }): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ autoStartWorker: config });\n }\n\n /**\n * Attaches telemetry support.\n */\n public withTelemetry(\n telemetry: IgniterJobsTelemetry,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ telemetry });\n }\n\n /**\n * Attaches a custom logger.\n */\n public withLogger(\n logger: IgniterLogger,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ logger });\n }\n\n /**\n * Finalizes the configuration and returns the runtime instance.\n */\n public build(): IgniterJobsRuntime<\n IgniterJobsConfig<TContext, TQueues, TScope>\n > {\n if (!this.state.adapter) {\n throw new IgniterJobsError({\n code: \"JOBS_ADAPTER_REQUIRED\",\n message: \"Jobs adapter is required. Call withAdapter() before build().\",\n });\n }\n\n if (!this.state.service) {\n throw new IgniterJobsError({\n code: \"JOBS_SERVICE_REQUIRED\",\n message: \"Service name is required. Call withService() before build().\",\n });\n }\n\n if (!this.state.environment) {\n throw new IgniterJobsError({\n code: \"JOBS_CONFIGURATION_INVALID\",\n message:\n \"Environment is required. Call withEnvironment() before build().\",\n });\n }\n\n if (!this.state.contextFactory) {\n throw new IgniterJobsError({\n code: \"JOBS_CONTEXT_REQUIRED\",\n message:\n \"Context factory is required. Call withContext() before build().\",\n });\n }\n\n const config: IgniterJobsConfig<TContext, TQueues, TScope> = {\n adapter: this.state.adapter,\n service: this.state.service,\n environment: this.state.environment,\n contextFactory: this.state.contextFactory,\n queues: this.state.queues,\n scopeDefinition: this.state.scope\n ? ({\n [this.state.scope.name]: (this.state.scope.options ??\n {}) as IgniterJobsScopeOptions,\n } as IgniterJobsScopeDefinition<TScope>)\n : undefined,\n queueDefaults: this.state.queueDefaults,\n workerDefaults: this.state.workerDefaults,\n autoStartWorker: this.state.autoStartWorker,\n logger: this.state.logger,\n telemetry: this.state.telemetry,\n };\n\n return new IgniterJobsManager(config).toRuntime();\n }\n}\n\n/**\n * Factory for creating and configuring IgniterJobs instances.\n *\n * This is the main entry point for creating a jobs runtime with a fluent builder API.\n * It provides type-safe configuration for adapters, queues, scopes, context, and telemetry.\n *\n * @example\n * ```typescript\n * import { IgniterJobs, IgniterQueue } from '@igniter-js/jobs'\n * import { IgniterJobsMemoryAdapter } from '@igniter-js/jobs/adapters/mock'\n * import { z } from 'zod'\n *\n * const emailQueue = IgniterQueue.create('email')\n * .addJob('sendWelcome', {\n * input: z.object({ to: z.string(), name: z.string() }),\n * handler: async (ctx) => {\n * await sendEmail(ctx.input.to, `Welcome ${ctx.input.name}!`)\n * },\n * })\n * .build()\n *\n * const jobs = IgniterJobs.create()\n * .withAdapter(IgniterJobsMemoryAdapter.create())\n * .withService('my-api')\n * .withEnvironment('production')\n * .withContext(async () => ({ db }))\n * .addQueue(emailQueue)\n * .build()\n *\n * // Dispatch jobs\n * await jobs.email.sendWelcome.dispatch({ input: { to: 'user@example.com', name: 'Alice' } })\n *\n * // Use scopes for multi-tenancy\n * const orgJobs = jobs.scope('organization', 'org_123')\n * await orgJobs.email.sendWelcome.dispatch({ input: { to: 'user@example.com', name: 'Bob' } })\n * ```\n *\n * @see {@link IgniterJobsBuilder} for detailed method documentation\n */\nexport const IgniterJobs = {\n create: IgniterJobsBuilder.create,\n};\n"]}
1
+ {"version":3,"sources":["../src/errors/jobs.error.ts","../src/builders/worker.builder.ts","../src/utils/prefix.ts","../src/utils/events.utils.ts","../src/utils/scope.ts","../src/utils/validation.ts","../src/core/manager.ts","../src/builders/queue.builder.ts","../src/core/queue.ts","../src/builders/main.builder.ts"],"names":["IgniterError"],"mappings":"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","file":"index.js","sourcesContent":["import { IgniterError } from \"@igniter-js/common\";\n\n/**\n * Canonical error codes for `@igniter-js/jobs`.\n */\nexport const IGNITER_JOBS_ERROR_CODES = {\n JOBS_ADAPTER_REQUIRED: 'JOBS_ADAPTER_REQUIRED',\n JOBS_SERVICE_REQUIRED: 'JOBS_SERVICE_REQUIRED',\n JOBS_CONTEXT_REQUIRED: 'JOBS_CONTEXT_REQUIRED',\n JOBS_CONFIGURATION_INVALID: 'JOBS_CONFIGURATION_INVALID',\n JOBS_QUEUE_NOT_FOUND: 'JOBS_QUEUE_NOT_FOUND',\n JOBS_QUEUE_DUPLICATE: 'JOBS_QUEUE_DUPLICATE',\n JOBS_QUEUE_OPERATION_FAILED: 'JOBS_QUEUE_OPERATION_FAILED',\n JOBS_INVALID_DEFINITION: 'JOBS_INVALID_DEFINITION',\n JOBS_HANDLER_REQUIRED: 'JOBS_HANDLER_REQUIRED',\n JOBS_DUPLICATE_JOB: 'JOBS_DUPLICATE_JOB',\n JOBS_NOT_FOUND: 'JOBS_NOT_FOUND',\n JOBS_NOT_REGISTERED: 'JOBS_NOT_REGISTERED',\n JOBS_EXECUTION_FAILED: 'JOBS_EXECUTION_FAILED',\n JOBS_TIMEOUT: 'JOBS_TIMEOUT',\n JOBS_CONTEXT_FACTORY_FAILED: 'JOBS_CONTEXT_FACTORY_FAILED',\n JOBS_VALIDATION_FAILED: 'JOBS_VALIDATION_FAILED',\n JOBS_INVALID_INPUT: 'JOBS_INVALID_INPUT',\n JOBS_INVALID_CRON: 'JOBS_INVALID_CRON',\n JOBS_INVALID_SCHEDULE: 'JOBS_INVALID_SCHEDULE',\n JOBS_SCOPE_ALREADY_DEFINED: 'JOBS_SCOPE_ALREADY_DEFINED',\n JOBS_WORKER_FAILED: 'JOBS_WORKER_FAILED',\n JOBS_ADAPTER_ERROR: 'JOBS_ADAPTER_ERROR',\n JOBS_ADAPTER_CONNECTION_FAILED: 'JOBS_ADAPTER_CONNECTION_FAILED',\n JOBS_SUBSCRIBE_FAILED: 'JOBS_SUBSCRIBE_FAILED',\n} as const\n\nexport type IgniterJobsErrorCode = keyof typeof IGNITER_JOBS_ERROR_CODES\n\nexport interface IgniterJobsErrorOptions {\n /** Error code scoped to Igniter Jobs. */\n code: IgniterJobsErrorCode\n /** Human-readable message. */\n message: string\n /** HTTP-like status code hint (default: 500). */\n statusCode?: number\n /** Optional structured details for debugging and clients. */\n details?: unknown\n /** Optional metadata for logs and tracing. */\n metadata?: Record<string, unknown>\n /** Optional causer tag used by some Igniter tooling. */\n causer?: string\n /** Underlying cause for debugging (optional). */\n cause?: Error\n /** Optional logger passthrough to align with other Igniter errors. */\n logger?: any\n}\n\n/**\n * Typed error class for the Jobs package.\n *\n * @example\n * ```typescript\n * throw new IgniterJobsError({\n * code: 'JOBS_INVALID_INPUT',\n * message: 'Input payload failed validation',\n * })\n * ```\n */\nexport class IgniterJobsError extends IgniterError {\n constructor(options: IgniterJobsErrorOptions) {\n super(options)\n }\n}\n","/**\n * @fileoverview Worker builder for @igniter-js/jobs\n * @module @igniter-js/jobs/builders/igniter-worker\n */\n\nimport type { IgniterJobsAdapter } from '../types/adapter'\nimport type { IgniterJobsLimiter } from '../types/job'\nimport type { IgniterJobsWorkerHandle, IgniterJobsWorkerHandlers } from '../types/worker'\nimport { IgniterJobsError } from '../errors'\n\ntype IgniterJobsWorkerBuilderState<TAllowedQueues extends string> = {\n queues: TAllowedQueues[]\n concurrency?: number\n limiter?: IgniterJobsLimiter\n handlers: IgniterJobsWorkerHandlers\n}\n\n/**\n * Fluent builder for creating workers tied to registered queues.\n *\n * Instances of this builder are created by `jobs.worker.create()` so it can be\n * automatically scoped to registered queue names.\n */\nexport class IgniterWorkerBuilder<TAllowedQueues extends string> {\n private readonly adapter: IgniterJobsAdapter\n private readonly allowedQueues: readonly TAllowedQueues[]\n private readonly state: IgniterJobsWorkerBuilderState<TAllowedQueues>\n\n constructor(params: {\n adapter: IgniterJobsAdapter\n allowedQueues: readonly TAllowedQueues[]\n state?: Partial<IgniterJobsWorkerBuilderState<TAllowedQueues>>\n }) {\n this.adapter = params.adapter\n this.allowedQueues = params.allowedQueues\n this.state = {\n queues: params.state?.queues ?? [],\n concurrency: params.state?.concurrency,\n limiter: params.state?.limiter,\n handlers: params.state?.handlers ?? {},\n }\n }\n\n private clone(patch: Partial<IgniterJobsWorkerBuilderState<TAllowedQueues>>): IgniterWorkerBuilder<TAllowedQueues> {\n return new IgniterWorkerBuilder<TAllowedQueues>({\n adapter: this.adapter,\n allowedQueues: this.allowedQueues,\n state: { ...this.state, ...patch },\n })\n }\n\n /**\n * Adds a queue to the worker.\n *\n * @param queue - Queue name registered on the jobs instance.\n */\n public addQueue(queue: TAllowedQueues): IgniterWorkerBuilder<TAllowedQueues> {\n if (!this.allowedQueues.includes(queue)) {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_NOT_FOUND',\n message: `Queue \"${queue}\" is not registered on this jobs instance.`,\n })\n }\n\n if (this.state.queues.includes(queue)) return this\n return this.clone({ queues: [...this.state.queues, queue] })\n }\n\n /**\n * Sets the worker concurrency.\n */\n public withConcurrency(concurrency: number): IgniterWorkerBuilder<TAllowedQueues> {\n if (!Number.isFinite(concurrency) || concurrency <= 0) {\n throw new IgniterJobsError({\n code: 'JOBS_CONFIGURATION_INVALID',\n message: 'Worker concurrency must be a positive number.',\n })\n }\n return this.clone({ concurrency })\n }\n\n /**\n * Sets a worker-level rate limiter.\n */\n public withLimiter(limiter: IgniterJobsLimiter): IgniterWorkerBuilder<TAllowedQueues> {\n if (!limiter || !Number.isFinite(limiter.max) || !Number.isFinite(limiter.duration) || limiter.max <= 0 || limiter.duration <= 0) {\n throw new IgniterJobsError({\n code: 'JOBS_CONFIGURATION_INVALID',\n message: 'Limiter must include positive max and duration.',\n })\n }\n return this.clone({ limiter })\n }\n\n public onActive(handler: NonNullable<IgniterJobsWorkerHandlers['onActive']>): IgniterWorkerBuilder<TAllowedQueues> {\n return this.clone({ handlers: { ...this.state.handlers, onActive: handler } })\n }\n\n public onSuccess(handler: NonNullable<IgniterJobsWorkerHandlers['onSuccess']>): IgniterWorkerBuilder<TAllowedQueues> {\n return this.clone({ handlers: { ...this.state.handlers, onSuccess: handler } })\n }\n\n public onFailure(handler: NonNullable<IgniterJobsWorkerHandlers['onFailure']>): IgniterWorkerBuilder<TAllowedQueues> {\n return this.clone({ handlers: { ...this.state.handlers, onFailure: handler } })\n }\n\n public onIdle(handler: NonNullable<IgniterJobsWorkerHandlers['onIdle']>): IgniterWorkerBuilder<TAllowedQueues> {\n return this.clone({ handlers: { ...this.state.handlers, onIdle: handler } })\n }\n\n /**\n * Builds and starts the worker.\n *\n * If no queues are added explicitly, the adapter should interpret it as \"all queues\".\n */\n public async start(): Promise<IgniterJobsWorkerHandle> {\n const concurrency = this.state.concurrency ?? 1\n return this.adapter.createWorker({\n queues: this.state.queues,\n concurrency,\n limiter: this.state.limiter,\n handlers: this.state.handlers,\n })\n }\n}\n\n","/**\n * Helpers for building consistent key/queue prefixes.\n */\nexport class IgniterJobsPrefix {\n public static readonly BASE_PREFIX = \"igniter:jobs\";\n\n /**\n * Builds a normalized queue name using the global prefix and queue id.\n *\n * @example\n * ```typescript\n * const name = IgniterJobsPrefix.buildQueueName('email')\n * // -> igniter:jobs:email\n * ```\n */\n public static buildQueueName(queue: string): string {\n return `${IgniterJobsPrefix.BASE_PREFIX}:${queue}`;\n }\n\n /**\n * Builds the event channel used for pub/sub.\n *\n * Unscoped events are published to a global channel per service/environment.\n * Scoped events are also published to an additional channel for that scope.\n */\n public static buildEventsChannel(params: {\n service: string;\n environment: string;\n scope?: { type: string; id: string | number };\n }): string {\n const base = `${IgniterJobsPrefix.BASE_PREFIX}:events:${params.environment}:${params.service}`;\n if (!params.scope) return base;\n return `${base}:scope:${params.scope.type}:${params.scope.id}`;\n }\n\n public static buildJobStreamChannel(params: {\n service: string;\n environment: string;\n queue: string;\n jobId: string;\n scope?: { type: string; id: string | number };\n }): string {\n const base = `${IgniterJobsPrefix.BASE_PREFIX}:stream:${params.environment}:${params.service}:${params.queue}:${params.jobId}`;\n if (!params.scope) return base;\n return `${base}:scope:${params.scope.type}:${params.scope.id}`;\n }\n}\n","/**\n * @fileoverview Event utilities for @igniter-js/jobs\n * @module @igniter-js/jobs/utils/events.utils\n */\n\nimport type { IgniterJobsAdapter } from \"../types/adapter\";\nimport type { IgniterJobsEvent } from \"../types/events\";\nimport type { IgniterJobsScopeEntry } from \"../types/scope\";\nimport { IgniterJobsPrefix } from \"./prefix\";\n\n/**\n * Static utility class for building and publishing job events.\n */\nexport class IgniterJobsEventsUtils {\n /**\n * Constructs a standardized job event type string.\n *\n * @param queue - The queue name.\n * @param jobName - The job name.\n * @param event - The specific event name (e.g., 'started', 'completed').\n * @returns A string in the format `queue:jobName:event`.\n */\n public static buildJobEventType(\n queue: string,\n jobName: string,\n event: string,\n ): string {\n return `${queue}:${jobName}:${event}`;\n }\n\n /**\n * Publishes a job event to the configured adapter.\n * Handles publishing to both the base channel and the scope-specific channel if a scope is provided.\n *\n * @param params - Configuration parameters for publishing the event.\n */\n public static async publishJobsEvent(params: {\n adapter: IgniterJobsAdapter;\n service: string;\n environment: string;\n scope?: IgniterJobsScopeEntry;\n event: IgniterJobsEvent;\n }): Promise<void> {\n const baseChannel = IgniterJobsPrefix.buildEventsChannel({\n service: params.service,\n environment: params.environment,\n });\n await params.adapter.publishEvent(baseChannel, params.event);\n\n if (params.scope) {\n const scopeChannel = IgniterJobsPrefix.buildEventsChannel({\n service: params.service,\n environment: params.environment,\n scope: { type: params.scope.type, id: params.scope.id },\n });\n await params.adapter.publishEvent(scopeChannel, params.event);\n }\n }\n}\n","/**\n * @fileoverview Scope utilities for @igniter-js/jobs\n * @module @igniter-js/jobs/utils/scope.utils\n */\n\nimport type { IgniterJobsScopeEntry } from \"../types/scope\";\n\n/**\n * Static utility class for handling job scopes and metadata.\n */\nexport class IgniterJobsScopeUtils {\n /**\n * The key used to store scope information in job metadata.\n */\n public static readonly SCOPE_METADATA_KEY = \"__igniter_jobs_scope\";\n\n /**\n * Merges a scope entry into a metadata object.\n *\n * @param metadata - Existing metadata object.\n * @param scope - The scope entry to merge.\n * @returns A new metadata object containing the scope information, or the original metadata if no scope is provided.\n */\n public static mergeMetadataWithScope(\n metadata: Record<string, unknown> | undefined,\n scope: IgniterJobsScopeEntry | undefined,\n ): Record<string, unknown> | undefined {\n if (!scope) return metadata;\n return {\n ...(metadata ?? {}),\n [this.SCOPE_METADATA_KEY]: scope,\n };\n }\n\n /**\n * Extracts a scope entry from a metadata object.\n *\n * @param metadata - The metadata object to inspect.\n * @returns The extracted scope entry, or undefined if not found.\n */\n public static extractScopeFromMetadata(\n metadata: Record<string, unknown> | undefined,\n ): IgniterJobsScopeEntry | undefined {\n if (!metadata) return undefined;\n const value = (metadata as any)[this.SCOPE_METADATA_KEY];\n if (!value || typeof value !== \"object\") return undefined;\n if (!(\"type\" in value) || !(\"id\" in value)) return undefined;\n return value as IgniterJobsScopeEntry;\n }\n}\n","/**\n * @fileoverview Validation utilities for @igniter-js/jobs\n * @module @igniter-js/jobs/utils/validation.utils\n */\n\nimport { IgniterJobsError } from \"../errors\";\nimport type { IgniterJobsSchema } from \"../types/schema\";\n\n/**\n * Static utility class for runtime input validation.\n */\nexport class IgniterJobsValidationUtils {\n /**\n * Checks if a value conforms to the Standard Schema V1 interface.\n *\n * @param value - The value to check.\n * @returns True if the value is a Standard Schema.\n */\n public static isStandardSchema(\n value: unknown,\n ): value is { \"~standard\": { validate: (value: unknown) => any } } {\n return Boolean(\n value && typeof value === \"object\" && \"~standard\" in (value as any),\n );\n }\n\n /**\n * Checks if a value conforms to a Zod-like schema interface.\n *\n * @param value - The value to check.\n * @returns True if the value is a Zod-like schema.\n */\n public static isZodLikeSchema(value: unknown): value is {\n safeParse?: (value: unknown) => any;\n parse: (value: unknown) => any;\n } {\n return Boolean(\n value && typeof value === \"object\" && \"parse\" in (value as any),\n );\n }\n\n /**\n * Validates input against a provided schema (Standard Schema or Zod-like).\n *\n * @param schema - The schema definition.\n * @param input - The input data to validate.\n * @returns The validated (and possibly transformed) data.\n * @throws {IgniterJobsError} If validation fails.\n */\n public static async validateInput(\n schema: IgniterJobsSchema,\n input: unknown,\n ): Promise<unknown> {\n if (this.isStandardSchema(schema)) {\n const result = await (schema as any)[\"~standard\"].validate(input);\n if (\"issues\" in result && result.issues) {\n const message = result.issues.map((i: any) => i.message).join(\"; \");\n throw new IgniterJobsError({\n code: \"JOBS_VALIDATION_FAILED\",\n message: `Input validation failed: ${message}`,\n details: { issues: result.issues },\n statusCode: 400,\n });\n }\n return (result as any).value;\n }\n\n if (this.isZodLikeSchema(schema)) {\n if (typeof (schema as any).safeParse === \"function\") {\n const result = (schema as any).safeParse(input);\n if (!result.success) {\n throw new IgniterJobsError({\n code: \"JOBS_VALIDATION_FAILED\",\n message: \"Input validation failed.\",\n details: { error: result.error },\n statusCode: 400,\n });\n }\n return result.data;\n }\n try {\n return (schema as any).parse(input);\n } catch (error) {\n throw new IgniterJobsError({\n code: \"JOBS_VALIDATION_FAILED\",\n message: \"Input validation failed.\",\n details: { error },\n statusCode: 400,\n });\n }\n }\n\n return input;\n }\n}\n","/**\n * @fileoverview Core IgniterJobsManager class with all job operations\n * @module @igniter-js/jobs/core\n *\n * @description\n * The main IgniterJobsManager class provides a type-safe, scoped API for background job processing.\n * It supports job dispatching, scheduling, worker management, queue operations, and scoped instances\n * for multi-tenant applications.\n *\n * @example\n * ```typescript\n * import { IgniterJobs, IgniterJobsMemoryAdapter } from '@igniter-js/jobs'\n * import { z } from 'zod'\n *\n * const emailQueue = IgniterQueue.create('email')\n * .addJob('sendWelcome', {\n * input: z.object({ to: z.string(), name: z.string() }),\n * handler: async (ctx) => {\n * await sendEmail(ctx.input.to, `Welcome ${ctx.input.name}!`)\n * },\n * })\n * .build()\n *\n * const jobs = IgniterJobs.create()\n * .withAdapter(IgniterJobsMemoryAdapter.create())\n * .withService('my-api')\n * .withEnvironment('production')\n * .withContext(async () => ({ db }))\n * .addQueue(emailQueue)\n * .build()\n *\n * // Dispatch a job\n * await jobs.email.sendWelcome.dispatch({ input: { to: 'user@example.com', name: 'Alice' } })\n *\n * // Scoped operations\n * const orgJobs = jobs.scope('organization', 'org_123')\n * await orgJobs.email.sendWelcome.dispatch({ input: { to: 'user@example.com', name: 'Bob' } })\n * ```\n */\n\nimport type { IgniterJobsConfig } from \"../types/config\";\nimport type { IgniterJobsRuntime } from \"../types/runtime\";\nimport type {\n IgniterJobsAdapter,\n IgniterJobsAdapterJobStreamWriteParams,\n} from \"../types/adapter\";\nimport type {\n IgniterCronDefinition,\n IgniterJobDefinition,\n IgniterJobStatus,\n IgniterJobsDispatchParams,\n IgniterJobsExecutionContext,\n IgniterJobsHookContext,\n IgniterJobsScheduleParams,\n} from \"../types/job\";\nimport type {\n IgniterJobsEvent,\n IgniterJobsEventHandler,\n IgniterJobsTelemetry,\n} from \"../types/events\";\nimport type {\n IgniterJobsScopeEntry,\n IgniterJobsScopeOptions,\n} from \"../types/scope\";\nimport type { IgniterJobsQueue } from \"../types/queue\";\nimport type {\n IgniterJobsExecutionStreamEmitter,\n IgniterJobsInferJobStreamEvent,\n IgniterJobsJobStreamDefinition,\n IgniterJobsJobStreamEvent,\n IgniterJobsJobStreamReadResult,\n IgniterJobsJobStreamSchemaMap,\n} from \"../types/stream\";\n\nimport { IgniterWorkerBuilder } from \"../builders/worker.builder\";\nimport { IgniterJobsError } from \"../errors\";\nimport { IgniterJobsPrefix } from \"../utils/prefix\";\nimport { IgniterJobsEventsUtils } from \"../utils/events.utils\";\nimport { IgniterJobsScopeUtils } from \"../utils/scope\";\nimport { IgniterJobsValidationUtils } from \"../utils/validation\";\n\n/**\n * WeakSet to track which adapters have already been registered.\n * This ensures that scoped instances don't re-register jobs.\n * @internal\n */\nconst registeredAdapters = new WeakSet<IgniterJobsAdapter>();\n\n/**\n * Main IgniterJobsManager class providing background job processing operations.\n *\n * Features:\n * - **Job Dispatching**: Enqueue jobs for immediate or delayed processing\n * - **Job Scheduling**: Schedule jobs with cron expressions or specific times\n * - **Worker Management**: Create and manage workers with configurable concurrency\n * - **Queue Operations**: Pause, resume, drain, clean queues\n * - **Scopes**: Multi-tenant isolation with scoped job instances\n * - **Telemetry**: Built-in observability with typed telemetry events\n *\n * @typeParam TConfig - The jobs configuration type\n */\nexport class IgniterJobsManager<\n TConfig extends IgniterJobsConfig<any, any, any> = IgniterJobsConfig<\n any,\n any,\n any\n >,\n> {\n /** @internal */\n private readonly config: TConfig;\n\n /** @internal */\n private readonly adapter: IgniterJobsAdapter;\n\n /** @internal */\n private readonly telemetry?: IgniterJobsTelemetry;\n\n /** @internal */\n private readonly scopeEntry?: IgniterJobsScopeEntry;\n\n /**\n * @internal\n * Constructor is internal. Use `IgniterJobs.create()` instead.\n */\n constructor(config: TConfig, scopeEntry?: IgniterJobsScopeEntry) {\n this.config = config;\n this.adapter = config.adapter;\n this.telemetry = config.telemetry;\n this.scopeEntry = scopeEntry;\n }\n\n // ---------------------------------------------------------------------------\n // Public Methods\n // ---------------------------------------------------------------------------\n\n /**\n * Creates a scoped jobs instance.\n *\n * Scopes provide multi-tenant isolation by adding scope metadata to all jobs.\n * Jobs dispatched from a scoped instance will include scope information in their metadata.\n *\n * @param type - The scope type (e.g., 'organization', 'workspace')\n * @param id - The scope identifier (e.g., 'org_123')\n * @param tags - Optional additional tags for the scope\n * @returns A new scoped IgniterJobsManager instance\n *\n * @example\n * ```typescript\n * const orgJobs = jobs.scope('organization', 'org_123')\n * await orgJobs.email.sendWelcome.dispatch({ input: { to: 'user@example.com' } })\n * ```\n */\n public scope(\n type: string,\n id: string | number,\n tags?: Record<string, unknown>,\n ): IgniterJobsManager<TConfig> {\n const entry: IgniterJobsScopeEntry = { type, id: String(id), tags };\n return new IgniterJobsManager(this.config, entry);\n }\n\n /**\n * Subscribes to all job events from this jobs instance.\n *\n * @param handler - The event handler function\n * @returns A function to unsubscribe\n *\n * @example\n * ```typescript\n * const unsubscribe = await jobs.subscribe((event) => {\n * console.log('Job event:', event.type, event.data)\n * })\n * // Later: await unsubscribe()\n * ```\n */\n public async subscribe(\n handler: IgniterJobsEventHandler,\n ): Promise<() => Promise<void>> {\n const channel = this.buildEventsChannel();\n return this.adapter.subscribeEvent(channel, async (payload: unknown) => {\n await handler(payload as IgniterJobsEvent);\n });\n }\n\n /**\n * Searches for jobs, queues, or workers based on filters.\n *\n * @param target - The target to search ('jobs', 'queues', or 'workers')\n * @param filter - The filter criteria\n * @returns The search results\n *\n * @example\n * ```typescript\n * const failedJobs = await jobs.search('jobs', { status: 'failed', queue: 'email' })\n * const queues = await jobs.search('queues', {})\n * ```\n */\n public async search(\n target: \"jobs\" | \"queues\" | \"workers\",\n filter: Record<string, unknown>,\n ): Promise<unknown[]> {\n switch (target) {\n case \"jobs\":\n return this.adapter.searchJobs(filter);\n case \"queues\":\n return this.adapter.searchQueues(filter);\n case \"workers\":\n return this.adapter.searchWorkers(filter);\n default:\n return [];\n }\n }\n\n /**\n * Gracefully shuts down the jobs instance.\n *\n * This will close all connections and stop all workers.\n *\n * @example\n * ```typescript\n * await jobs.shutdown()\n * ```\n */\n public async shutdown(): Promise<void> {\n await this.adapter.shutdown();\n }\n\n /**\n * Creates a new worker builder for processing jobs.\n *\n * @returns A new IgniterWorkerBuilder instance\n *\n * @example\n * ```typescript\n * const worker = await jobs.worker\n * .create()\n * .addQueue('email')\n * .withConcurrency(5)\n * .start()\n * ```\n */\n public get worker() {\n return {\n create: () =>\n new IgniterWorkerBuilder({\n adapter: this.adapter,\n allowedQueues: Object.keys(this.config.queues) as any,\n state: this.config.workerDefaults,\n }),\n };\n }\n\n /**\n * Converts the manager to a runtime proxy with typed queue accessors.\n *\n * @internal\n * @returns The runtime proxy\n */\n public toRuntime(): IgniterJobsRuntime<TConfig> {\n this.ensureRegistered();\n\n const self = this;\n const queueNames = Object.keys(this.config.queues);\n\n // Create proxy to handle dynamic queue access\n const handler: ProxyHandler<IgniterJobsManager<TConfig>> = {\n get(target, prop: string) {\n // Handle known properties\n if (prop === \"config\") return target.config;\n if (prop === \"subscribe\") return target.subscribe.bind(target);\n if (prop === \"search\") return target.search.bind(target);\n if (prop === \"shutdown\") return target.shutdown.bind(target);\n if (prop === \"worker\") return target.worker;\n if (prop === \"scope\" && target.config.scopeDefinition) {\n return (\n type: string,\n id: string | number,\n tags?: Record<string, unknown>,\n ) => target.scope(type, id, tags).toRuntime();\n }\n\n // Handle queue access\n if (queueNames.includes(prop)) {\n return self.createQueueAccessor(prop);\n }\n\n return undefined;\n },\n };\n\n return new Proxy(this, handler) as unknown as IgniterJobsRuntime<TConfig>;\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods - Registration\n // ---------------------------------------------------------------------------\n\n /**\n * Ensures all jobs and crons are registered with the adapter.\n * Uses a shared WeakSet to prevent duplicate registration across scoped instances.\n * @internal\n */\n private ensureRegistered(): void {\n if (registeredAdapters.has(this.adapter)) return;\n\n for (const [queueName, queue] of Object.entries(\n this.config.queues as Record<string, IgniterJobsQueue<any, any, any>>,\n )) {\n // Register jobs\n for (const [jobName, def] of Object.entries(\n queue.jobs as Record<string, IgniterJobDefinition<any, any, any, any>>,\n )) {\n this.adapter.registerJob(\n queueName,\n jobName,\n this.wrapJobDefinition(\n queueName,\n jobName,\n this.getEffectiveJobDefinition(queueName, jobName, def),\n ),\n );\n }\n\n // Register crons\n for (const [cronName, cron] of Object.entries(\n queue.crons as Record<string, IgniterCronDefinition<any, any>>,\n )) {\n this.adapter.registerCron(\n queueName,\n cronName,\n this.wrapCronDefinition(queueName, cronName, cron),\n );\n }\n }\n\n registeredAdapters.add(this.adapter);\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods - Accessors\n // ---------------------------------------------------------------------------\n\n /**\n * Creates a queue accessor with job accessors and management methods.\n * @internal\n */\n private createQueueAccessor(queueName: string): unknown {\n const queueConfig = this.config.queues[queueName] as IgniterJobsQueue<\n any,\n any,\n any\n >;\n const self = this;\n\n const queueAccessor: Record<string, unknown> = {\n async list(filter?: {\n status?: IgniterJobStatus[];\n limit?: number;\n offset?: number;\n }) {\n return self.adapter.queues.getJobs(queueName, filter);\n },\n\n get() {\n return {\n retrieve: () => self.adapter.getQueueInfo(queueName),\n pause: () => self.adapter.pauseQueue(queueName),\n resume: () => self.adapter.resumeQueue(queueName),\n drain: () => self.adapter.drainQueue(queueName),\n clean: (options: any) => self.adapter.cleanQueue(queueName, options),\n obliterate: (options?: { force?: boolean }) =>\n self.adapter.obliterateQueue(queueName, options),\n retryAll: () => self.adapter.retryAllInQueue(queueName),\n };\n },\n\n async subscribe(handler: IgniterJobsEventHandler) {\n const channel = self.buildEventsChannel();\n return self.adapter.subscribeEvent(channel, async (event: unknown) => {\n const typed = event as IgniterJobsEvent;\n if (\n typeof typed?.type === \"string\" &&\n typed.type.startsWith(`${queueName}:`)\n ) {\n await handler(typed);\n }\n });\n },\n\n jobs: {},\n };\n\n // Create job accessors\n for (const jobName of Object.keys(queueConfig.jobs)) {\n const jobAccessor = this.createJobAccessor(queueName, jobName);\n (queueAccessor.jobs as Record<string, unknown>)[jobName] = jobAccessor;\n queueAccessor[jobName] = jobAccessor;\n }\n\n return queueAccessor;\n }\n\n /**\n * Creates a job accessor with dispatch, schedule, and management methods.\n * @internal\n */\n private createJobAccessor(queueName: string, jobName: string): unknown {\n const self = this;\n\n return {\n async dispatch(params: IgniterJobsDispatchParams<any>) {\n return self.dispatchJob(queueName, jobName, params);\n },\n\n async schedule(params: IgniterJobsScheduleParams<any>) {\n return self.scheduleJob(queueName, jobName, params);\n },\n\n get(id: string) {\n return {\n retrieve: () => self.adapter.getJob(id, queueName),\n retry: () => self.adapter.retryJob(id, queueName),\n remove: () => self.adapter.removeJob(id, queueName),\n promote: () => self.adapter.promoteJob(id, queueName),\n move: (state: \"failed\", reason: string) => {\n if (state !== \"failed\") return Promise.resolve();\n return self.adapter.moveJobToFailed(id, reason, queueName);\n },\n state: () => self.adapter.getJobState(id, queueName),\n progress: () => self.adapter.getJobProgress(id, queueName),\n logs: () => self.adapter.getJobLogs(id, queueName),\n stream: () => self.createJobStreamAccessor(queueName, jobName, id),\n };\n },\n\n many(ids: string[]) {\n return {\n retry: () => self.adapter.retryManyJobs(ids, queueName),\n remove: () => self.adapter.removeManyJobs(ids, queueName),\n };\n },\n\n async subscribe(handler: IgniterJobsEventHandler) {\n const channel = self.buildEventsChannel();\n return self.adapter.subscribeEvent(channel, async (event: unknown) => {\n const typed = event as IgniterJobsEvent;\n if (\n typeof typed?.type === \"string\" &&\n typed.type.startsWith(`${queueName}:${jobName}:`)\n ) {\n await handler(typed);\n }\n });\n },\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods - Job Operations\n // ---------------------------------------------------------------------------\n\n /**\n * Dispatches a job for immediate or delayed processing.\n * @internal\n */\n private async dispatchJob(\n queueName: string,\n jobName: string,\n params: IgniterJobsDispatchParams<any>,\n ): Promise<string> {\n const definition = this.getJobDefinition(queueName, jobName);\n\n // Validate input if schema exists\n if (definition?.input) {\n await IgniterJobsValidationUtils.validateInput(\n definition.input as any,\n params.input,\n );\n }\n\n // Resolve scope\n const scope = this.resolveScope(params.scope);\n const metadata = IgniterJobsScopeUtils.mergeMetadataWithScope(\n params.metadata as any,\n scope,\n );\n\n // Dispatch to adapter\n const jobId = await this.adapter.dispatch({\n queue: queueName,\n jobName,\n ...params,\n scope,\n metadata,\n });\n\n // Publish event\n await this.publishJobEvent(\n queueName,\n jobName,\n \"enqueued\",\n { jobId, queue: queueName, jobName },\n scope,\n );\n\n // Emit telemetry\n this.emitTelemetry(\"igniter.jobs.job.enqueued\", {\n \"ctx.job.id\": jobId,\n \"ctx.job.name\": jobName,\n \"ctx.job.queue\": queueName,\n \"ctx.job.priority\": (params as any).priority ?? null,\n \"ctx.job.delay\": (params as any).delay ?? null,\n });\n\n return jobId;\n }\n\n /**\n * Schedules a job for future processing.\n * @internal\n */\n private async scheduleJob(\n queueName: string,\n jobName: string,\n params: IgniterJobsScheduleParams<any>,\n ): Promise<string> {\n const definition = this.getJobDefinition(queueName, jobName);\n\n // Validate input if schema exists\n if (definition?.input) {\n await IgniterJobsValidationUtils.validateInput(\n definition.input as any,\n params.input,\n );\n }\n\n // Resolve scope\n const scope = this.resolveScope(params.scope);\n const metadata = IgniterJobsScopeUtils.mergeMetadataWithScope(\n params.metadata as any,\n scope,\n );\n\n // Schedule via adapter\n const jobId = await this.adapter.schedule({\n queue: queueName,\n jobName,\n ...params,\n scope,\n metadata,\n } as any);\n\n // Publish event\n await this.publishJobEvent(\n queueName,\n jobName,\n \"scheduled\",\n { jobId, queue: queueName, jobName },\n scope,\n );\n\n // Emit telemetry\n this.emitTelemetry(\"igniter.jobs.job.scheduled\", {\n \"ctx.job.id\": jobId,\n \"ctx.job.name\": jobName,\n \"ctx.job.queue\": queueName,\n \"ctx.job.scheduledAt\": params.at?.toISOString() ?? null,\n \"ctx.job.cron\": (params as any).cron ?? null,\n });\n\n return jobId;\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods - Handler Wrapping\n // ---------------------------------------------------------------------------\n\n /**\n * Wraps a job definition with context building, validation, and telemetry.\n * @internal\n */\n private wrapJobDefinition(\n queueName: string,\n jobName: string,\n definition: IgniterJobDefinition<any, any, any, any>,\n ): IgniterJobDefinition<any, any, any, any> {\n const self = this;\n\n return {\n ...definition,\n\n handler: async (ctx: IgniterJobsExecutionContext<any, any>) => {\n const enhanced = await self.buildExecutionContext(\n ctx,\n queueName,\n jobName,\n );\n\n // Validate input if schema exists\n if (definition.input) {\n const validated = await IgniterJobsValidationUtils.validateInput(\n definition.input as any,\n enhanced.input,\n );\n (enhanced as any).input = validated;\n }\n\n return definition.handler(enhanced);\n },\n\n onStart: async (ctx: IgniterJobsHookContext<any, any>) => {\n const enhanced = await self.buildExecutionContext(\n ctx as any,\n queueName,\n jobName,\n );\n\n // Publish lifecycle event\n await self.publishJobEvent(\n queueName,\n jobName,\n \"started\",\n {\n jobId: enhanced.job.id,\n jobName,\n queue: queueName,\n attemptsMade: enhanced.job.attemptsMade,\n startedAt: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n // Emit telemetry\n self.emitTelemetry(\"igniter.jobs.job.started\", {\n \"ctx.job.id\": enhanced.job.id,\n \"ctx.job.name\": jobName,\n \"ctx.job.queue\": queueName,\n \"ctx.job.attempt\": enhanced.job.attemptsMade,\n \"ctx.job.maxAttempts\": definition.attempts ?? 3,\n });\n\n await definition.onStart?.(enhanced as any);\n },\n\n onSuccess: async (ctx: any) => {\n const enhanced = await self.buildExecutionContext(\n ctx as any,\n queueName,\n jobName,\n );\n const duration = ctx.duration ?? ctx.executionTime ?? 0;\n\n // Publish lifecycle event\n await self.publishJobEvent(\n queueName,\n jobName,\n \"completed\",\n {\n jobId: enhanced.job.id,\n jobName,\n queue: queueName,\n result: ctx.result,\n duration,\n completedAt: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n // Emit telemetry\n self.emitTelemetry(\"igniter.jobs.job.completed\", {\n \"ctx.job.id\": enhanced.job.id,\n \"ctx.job.name\": jobName,\n \"ctx.job.queue\": queueName,\n \"ctx.job.duration\": typeof duration === \"number\" ? duration : 0,\n });\n\n await definition.onSuccess?.(enhanced as any);\n },\n\n onFailure: async (ctx: any) => {\n const enhanced = await self.buildExecutionContext(\n ctx as any,\n queueName,\n jobName,\n );\n const duration = ctx.duration ?? ctx.executionTime ?? 0;\n const isFinalAttempt = Boolean(ctx.isFinalAttempt);\n const errorMessage = ctx.error?.message ?? String(ctx.error);\n const errorCode = ctx.error?.code;\n const maxAttempts = definition.attempts ?? 3;\n\n // Publish lifecycle event\n await self.publishJobEvent(\n queueName,\n jobName,\n \"failed\",\n {\n jobId: enhanced.job.id,\n jobName,\n queue: queueName,\n error: { message: errorMessage },\n attemptsMade: enhanced.job.attemptsMade,\n isFinalAttempt,\n duration,\n failedAt: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n // Emit telemetry\n self.emitTelemetry(\n \"igniter.jobs.job.failed\",\n {\n \"ctx.job.id\": enhanced.job.id,\n \"ctx.job.name\": jobName,\n \"ctx.job.queue\": queueName,\n \"ctx.job.error.message\": errorMessage,\n \"ctx.job.error.code\": errorCode ?? null,\n \"ctx.job.attempt\": enhanced.job.attemptsMade,\n \"ctx.job.maxAttempts\": maxAttempts,\n \"ctx.job.isFinalAttempt\": isFinalAttempt,\n },\n \"error\",\n );\n\n await definition.onFailure?.(enhanced as any);\n },\n\n onProgress: definition.onProgress\n ? async (ctx: any) => {\n const enhanced = await self.buildExecutionContext(\n ctx as any,\n queueName,\n jobName,\n );\n const progress = ctx.progress ?? 0;\n const message = ctx.message;\n\n // Publish lifecycle event\n await self.publishJobEvent(\n queueName,\n jobName,\n \"progress\",\n {\n jobId: enhanced.job.id,\n jobName,\n queue: queueName,\n progress,\n message,\n timestamp: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n // Emit telemetry\n self.emitTelemetry(\"igniter.jobs.job.progress\", {\n \"ctx.job.id\": enhanced.job.id,\n \"ctx.job.name\": jobName,\n \"ctx.job.queue\": queueName,\n \"ctx.job.progress\": typeof progress === \"number\" ? progress : 0,\n \"ctx.job.progress.message\": message ?? null,\n });\n\n await definition.onProgress?.(enhanced as any);\n }\n : undefined,\n };\n }\n\n /**\n * Wraps a cron definition with context building and lifecycle events.\n * @internal\n */\n private wrapCronDefinition(\n queueName: string,\n cronName: string,\n definition: IgniterCronDefinition<any, any>,\n ): IgniterCronDefinition<any, any> {\n const self = this;\n\n return {\n ...definition,\n\n handler: async (ctx: any) => {\n const enhanced = await self.buildCronExecutionContext(\n ctx,\n queueName,\n cronName,\n );\n\n // Publish started event\n await self.publishJobEvent(\n queueName,\n cronName,\n \"started\",\n {\n jobId: enhanced.job?.id,\n jobName: cronName,\n queue: queueName,\n startedAt: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n try {\n const result = await definition.handler(enhanced as any);\n\n // Publish completed event\n await self.publishJobEvent(\n queueName,\n cronName,\n \"completed\",\n {\n jobId: enhanced.job?.id,\n jobName: cronName,\n queue: queueName,\n result,\n completedAt: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n return result;\n } catch (error) {\n // Publish failed event\n await self.publishJobEvent(\n queueName,\n cronName,\n \"failed\",\n {\n jobId: enhanced.job?.id,\n jobName: cronName,\n queue: queueName,\n error: { message: (error as any)?.message ?? String(error) },\n failedAt: new Date().toISOString(),\n },\n (enhanced as any).scope,\n );\n\n throw error;\n }\n },\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods - Helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Builds the execution context for a job.\n * @internal\n */\n private async buildExecutionContext(\n ctx: IgniterJobsExecutionContext<any, any>,\n queueName: string,\n jobName: string,\n ): Promise<IgniterJobsExecutionContext<any, any>> {\n const realContext = await this.config.contextFactory();\n const scope =\n ctx.scope ??\n IgniterJobsScopeUtils.extractScopeFromMetadata(ctx.job.metadata as any);\n const definition = this.getJobDefinition(queueName, jobName);\n const stream = this.createExecutionStreamEmitter(\n queueName,\n jobName,\n ctx.job.id,\n scope,\n definition,\n );\n\n return {\n ...ctx,\n context: realContext,\n job: { ...ctx.job, name: jobName, queue: queueName, stream },\n scope,\n };\n }\n\n /**\n * Builds the execution context for a cron job.\n * @internal\n */\n private async buildCronExecutionContext(\n ctx: Omit<IgniterJobsExecutionContext<any, unknown>, \"input\">,\n queueName: string,\n cronName: string,\n ): Promise<Omit<IgniterJobsExecutionContext<any, unknown>, \"input\">> {\n const realContext = await this.config.contextFactory();\n const scope =\n (ctx as any).scope ??\n IgniterJobsScopeUtils.extractScopeFromMetadata(\n (ctx as any).job?.metadata,\n );\n\n return {\n ...ctx,\n context: realContext,\n job: { ...(ctx as any).job, name: cronName, queue: queueName },\n scope,\n } as any;\n }\n\n /**\n * Gets a job definition by queue and job name.\n * @internal\n */\n private getJobDefinition(\n queueName: string,\n jobName: string,\n ): IgniterJobDefinition<any, any, any, any> | undefined {\n const queue = this.config.queues[queueName] as\n | IgniterJobsQueue<any, any, any>\n | undefined;\n const definition = queue?.jobs?.[jobName];\n return definition\n ? this.getEffectiveJobDefinition(queueName, jobName, definition)\n : undefined;\n }\n\n private getEffectiveJobDefinition(\n queueName: string,\n jobName: string,\n definition: IgniterJobDefinition<any, any, any, any>,\n ): IgniterJobDefinition<any, any, any, any> {\n const queue = this.config.queues[queueName] as\n | IgniterJobsQueue<any, any, any>\n | undefined;\n\n return {\n ...this.config.queueDefaults,\n ...queue?.defaultJobOptions,\n ...definition,\n name: jobName,\n } as IgniterJobDefinition<any, any, any, any>;\n }\n\n private createExecutionStreamEmitter(\n queueName: string,\n jobName: string,\n jobId: string,\n scope: IgniterJobsScopeEntry | undefined,\n definition?: IgniterJobDefinition<any, any, any, any>,\n ): IgniterJobsExecutionStreamEmitter<any> {\n return {\n emit: async (type: string, data: unknown) => {\n const payload = await this.normalizeStreamEmitPayload(\n queueName,\n jobName,\n type,\n data,\n definition,\n );\n\n return this.adapter.writeJobStreamEvent({\n queue: queueName,\n jobName,\n jobId,\n scope,\n persistence: definition?.stream?.persistence,\n event: {\n type,\n data: payload,\n timestamp: new Date(),\n jobId,\n jobName,\n queue: queueName,\n scope,\n },\n });\n },\n };\n }\n\n private createJobStreamAccessor(\n queueName: string,\n jobName: string,\n jobId: string,\n ) {\n const definition = this.getJobDefinition(queueName, jobName);\n\n return {\n subscribe: async (\n handler: (\n event: IgniterJobsInferJobStreamEvent<any>,\n ) => void | Promise<void>,\n ) => {\n return this.adapter.subscribeJobStream({\n queue: queueName,\n jobId,\n handler: async (event) => {\n const normalized = await this.normalizeStreamReadEvent(\n queueName,\n jobName,\n event,\n definition,\n );\n await handler(normalized as any);\n },\n });\n },\n read: async ({\n after,\n limit,\n }: { after?: string; limit?: number } = {}) => {\n if (!definition?.stream?.persistence?.enabled) {\n return {\n items: [],\n nextCursor: undefined,\n hasMore: false,\n } as IgniterJobsJobStreamReadResult<\n IgniterJobsInferJobStreamEvent<any>\n >;\n }\n\n const result = await this.adapter.readJobStream({\n queue: queueName,\n jobId,\n after,\n limit,\n });\n\n return {\n ...result,\n items: await Promise.all(\n result.items.map((event) =>\n this.normalizeStreamReadEvent(\n queueName,\n jobName,\n event,\n definition,\n ),\n ),\n ),\n } as IgniterJobsJobStreamReadResult<\n IgniterJobsInferJobStreamEvent<any>\n >;\n },\n };\n }\n\n private async normalizeStreamEmitPayload(\n queueName: string,\n jobName: string,\n type: string,\n data: unknown,\n definition?: IgniterJobDefinition<any, any, any, any>,\n ): Promise<unknown> {\n const schema = this.getJobStreamSchema(definition, type);\n if (!schema) return data;\n\n return IgniterJobsValidationUtils.validateInput(schema as any, data);\n }\n\n private async normalizeStreamReadEvent(\n queueName: string,\n jobName: string,\n event: IgniterJobsJobStreamEvent<string, unknown>,\n definition?: IgniterJobDefinition<any, any, any, any>,\n ): Promise<IgniterJobsJobStreamEvent<string, unknown>> {\n const schema = this.getJobStreamSchema(definition, event.type);\n if (!schema) return event;\n\n const normalized = await IgniterJobsValidationUtils.validateInput(\n schema as any,\n event.data,\n );\n\n return {\n ...event,\n data: normalized,\n };\n }\n\n private getJobStreamSchema(\n definition: IgniterJobDefinition<any, any, any, any> | undefined,\n type: string,\n ) {\n const events = definition?.stream?.events as\n | IgniterJobsJobStreamSchemaMap\n | undefined;\n\n if (!events) return undefined;\n\n const schema = events[type];\n if (!schema) {\n throw new IgniterJobsError({\n code: \"JOBS_VALIDATION_FAILED\",\n message: `Stream event \"${type}\" is not registered for this job definition.`,\n });\n }\n\n return schema;\n }\n\n /**\n * Resolves the effective scope for a job operation.\n * @internal\n */\n private resolveScope(\n paramsScope?: IgniterJobsScopeEntry,\n ): IgniterJobsScopeEntry | undefined {\n if (!this.config.scopeDefinition) return undefined;\n\n const required =\n Object.values(\n this.config.scopeDefinition as Record<string, IgniterJobsScopeOptions>,\n )[0]?.required ?? false;\n\n const effective = this.scopeEntry ?? paramsScope;\n\n if (required && !effective) {\n throw new IgniterJobsError({\n code: \"JOBS_CONFIGURATION_INVALID\",\n message: \"Scope is required for this jobs instance.\",\n });\n }\n\n if (this.scopeEntry && paramsScope) {\n if (\n this.scopeEntry.type !== paramsScope.type ||\n this.scopeEntry.id !== paramsScope.id\n ) {\n throw new IgniterJobsError({\n code: \"JOBS_CONFIGURATION_INVALID\",\n message: \"Cannot override scope on a scoped jobs instance.\",\n });\n }\n }\n\n return effective;\n }\n\n /**\n * Builds the events channel string for subscriptions.\n * @internal\n */\n private buildEventsChannel(): string {\n return this.scopeEntry\n ? IgniterJobsPrefix.buildEventsChannel({\n service: this.config.service,\n environment: this.config.environment,\n scope: { type: this.scopeEntry.type, id: this.scopeEntry.id },\n })\n : IgniterJobsPrefix.buildEventsChannel({\n service: this.config.service,\n environment: this.config.environment,\n });\n }\n\n /**\n * Publishes a job lifecycle event.\n * @internal\n */\n private async publishJobEvent(\n queueName: string,\n jobName: string,\n eventType: string,\n data: Record<string, unknown>,\n scope?: IgniterJobsScopeEntry,\n ): Promise<void> {\n await IgniterJobsEventsUtils.publishJobsEvent({\n adapter: this.adapter,\n service: this.config.service,\n environment: this.config.environment,\n scope,\n event: {\n type: IgniterJobsEventsUtils.buildJobEventType(\n queueName,\n jobName,\n eventType,\n ),\n data,\n timestamp: new Date(),\n scope,\n },\n });\n }\n\n /**\n * Emits a telemetry event if telemetry is configured.\n * @internal\n */\n private emitTelemetry(\n eventName: string,\n attributes: Record<string, string | number | boolean | null>,\n level: \"debug\" | \"info\" | \"error\" = \"info\",\n ): void {\n if (!this.telemetry) return;\n\n this.telemetry.emit(eventName, {\n attributes: attributes as any,\n level,\n });\n }\n}\n","/**\n * @fileoverview Queue builder for @igniter-js/jobs\n * @module @igniter-js/jobs/builders/igniter-queue\n */\n\nimport type {\n IgniterCronDefinition,\n IgniterJobDefinition,\n IgniterJobsQueue,\n} from \"../types\";\nimport type { IgniterJobsSchema } from \"../types/schema\";\nimport type { IgniterJobsJobStreamSchemaMap } from \"../types/stream\";\nimport { IgniterJobsError } from \"../errors\";\n\ninterface IgniterQueueBuilderState<\n TContext,\n TJobs extends Record<string, IgniterJobDefinition<TContext, any, any, any>>,\n TCron extends Record<string, IgniterCronDefinition<TContext, any>>,\n TName extends string,\n> {\n name: TName;\n jobs: TJobs;\n crons: TCron;\n}\n\n/**\n * Builder for defining queues, jobs, and cron tasks.\n *\n * @example\n * ```typescript\n * import { IgniterQueue } from '@igniter-js/jobs'\n * import { z } from 'zod'\n *\n * const emailQueue = IgniterQueue.create('email')\n * .withContext<{ mailer: Mailer }>()\n * .addJob('sendWelcome', {\n * input: z.object({ email: z.string().email() }),\n * handler: async ({ input, context }) => {\n * await context.mailer.send(input)\n * },\n * })\n * .addCron('cleanup', {\n * cron: '0 2 * * *',\n * handler: async ({ context }) => {\n * await context.mailer.cleanup()\n * },\n * })\n * .build()\n * ```\n */\nexport class IgniterQueueBuilder<\n TContext,\n TJobs extends Record<string, IgniterJobDefinition<TContext, any, any, any>> =\n {},\n TCron extends Record<string, IgniterCronDefinition<TContext, any>> = {},\n TName extends string = string,\n> {\n private readonly state: IgniterQueueBuilderState<\n TContext,\n TJobs,\n TCron,\n TName\n >;\n\n private constructor(\n state: IgniterQueueBuilderState<TContext, TJobs, TCron, TName>,\n ) {\n this.state = state;\n }\n\n /**\n * Creates a new queue builder for the given queue name.\n */\n public static create<const TName extends string>(\n name: TName,\n ): IgniterQueueBuilder<unknown, {}, {}, TName> {\n if (!name || typeof name !== \"string\") {\n throw new IgniterJobsError({\n code: \"JOBS_CONFIGURATION_INVALID\",\n message: \"Queue name must be a non-empty string.\",\n });\n }\n\n return new IgniterQueueBuilder<unknown, {}, {}, TName>({\n name,\n jobs: {} as Record<string, any>,\n crons: {} as Record<string, any>,\n });\n }\n\n private clone<\n TNewJobs extends Record<\n string,\n IgniterJobDefinition<TContext, any, any, any>\n > = TJobs,\n TNewCron extends Record<string, IgniterCronDefinition<TContext, any>> =\n TCron,\n >(\n patch: Partial<\n IgniterQueueBuilderState<TContext, TNewJobs, TNewCron, TName>\n >,\n ): IgniterQueueBuilder<TContext, TNewJobs, TNewCron, TName> {\n return new IgniterQueueBuilder<TContext, TNewJobs, TNewCron, TName>({\n ...(this.state as unknown as IgniterQueueBuilderState<\n TContext,\n TNewJobs,\n TNewCron,\n TName\n >),\n ...patch,\n });\n }\n\n /**\n * Registers a job on the queue.\n *\n * @param jobName - Unique name of the job inside the queue.\n * @param definition - Job definition (handler, schemas, options, hooks).\n */\n public addJob<\n TJobName extends string,\n TInput extends IgniterJobsSchema | unknown,\n TResult = unknown,\n TStreamEvents extends IgniterJobsJobStreamSchemaMap | undefined = undefined,\n >(\n jobName: TJobName,\n definition: IgniterJobDefinition<TContext, TInput, TResult, TStreamEvents>,\n ): IgniterQueueBuilder<\n TContext,\n TJobs &\n Record<\n TJobName,\n IgniterJobDefinition<TContext, TInput, TResult, TStreamEvents>\n >,\n TCron,\n TName\n > {\n if (!jobName || typeof jobName !== \"string\") {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_DEFINITION\",\n message: \"Job name must be a non-empty string.\",\n });\n }\n\n if ((this.state.jobs as Record<string, unknown>)[jobName]) {\n throw new IgniterJobsError({\n code: \"JOBS_DUPLICATE_JOB\",\n message: `Job \"${jobName}\" is already registered in queue \"${this.state.name}\".`,\n });\n }\n\n if ((this.state.crons as Record<string, unknown>)[jobName]) {\n throw new IgniterJobsError({\n code: \"JOBS_DUPLICATE_JOB\",\n message: `Job \"${jobName}\" conflicts with an existing cron in queue \"${this.state.name}\".`,\n });\n }\n\n if (!definition || typeof definition !== \"object\") {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_DEFINITION\",\n message: `Job \"${jobName}\" definition must be an object.`,\n });\n }\n\n if (!definition.handler || typeof definition.handler !== \"function\") {\n throw new IgniterJobsError({\n code: \"JOBS_HANDLER_REQUIRED\",\n message: `Job \"${jobName}\" handler is required and must be a function.`,\n });\n }\n\n const nextJobs = {\n ...(this.state.jobs as Record<string, any>),\n [jobName]: definition,\n } as TJobs &\n Record<\n TJobName,\n IgniterJobDefinition<TContext, TInput, TResult, TStreamEvents>\n >;\n\n return this.clone<\n TJobs &\n Record<\n TJobName,\n IgniterJobDefinition<TContext, TInput, TResult, TStreamEvents>\n >\n >({\n jobs: nextJobs,\n });\n }\n\n /**\n * Registers a cron task on the queue.\n *\n * @param cronName - Unique name of the cron task inside the queue.\n * @param definition - Cron definition (cron string, tz, handler, options).\n */\n public addCron<TCronName extends string, TResult = unknown>(\n cronName: TCronName,\n definition: IgniterCronDefinition<TContext, TResult>,\n ): IgniterQueueBuilder<\n TContext,\n TJobs,\n TCron & Record<TCronName, IgniterCronDefinition<TContext, TResult>>,\n TName\n > {\n if (!cronName || typeof cronName !== \"string\") {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_CRON\",\n message: \"Cron name must be a non-empty string.\",\n });\n }\n\n if ((this.state.crons as Record<string, unknown>)[cronName]) {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_CRON\",\n message: `Cron \"${cronName}\" is already registered in queue \"${this.state.name}\".`,\n });\n }\n\n if ((this.state.jobs as Record<string, unknown>)[cronName]) {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_CRON\",\n message: `Cron \"${cronName}\" conflicts with an existing job in queue \"${this.state.name}\".`,\n });\n }\n\n if (!definition || typeof definition !== \"object\") {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_CRON\",\n message: `Cron \"${cronName}\" definition must be an object.`,\n });\n }\n\n if (!definition.cron || typeof definition.cron !== \"string\") {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_CRON\",\n message: `Cron \"${cronName}\" must include a valid cron expression string.`,\n });\n }\n\n if (!definition.handler || typeof definition.handler !== \"function\") {\n throw new IgniterJobsError({\n code: \"JOBS_HANDLER_REQUIRED\",\n message: `Cron \"${cronName}\" handler is required and must be a function.`,\n });\n }\n\n const nextCrons = {\n ...(this.state.crons as Record<string, any>),\n [cronName]: definition,\n } as TCron & Record<TCronName, IgniterCronDefinition<TContext, TResult>>;\n\n return this.clone<\n TJobs,\n TCron & Record<TCronName, IgniterCronDefinition<TContext, TResult>>\n >({\n crons: nextCrons,\n });\n }\n\n /**\n * Finalizes the queue definition.\n */\n public build(): IgniterJobsQueue<TContext, TJobs, TCron> & { name: TName } {\n return {\n name: this.state.name,\n jobs: this.state.jobs,\n crons: this.state.crons,\n } as IgniterJobsQueue<TContext, TJobs, TCron> & { name: TName };\n }\n}\n","/**\n * @fileoverview Public queue entry point for @igniter-js/jobs\n * @module @igniter-js/jobs/core/igniter-queue\n */\n\nimport { IgniterQueueBuilder } from '../builders/queue.builder'\n\n/**\n * Queue facade that exposes the fluent queue builder API.\n */\nexport class IgniterQueue {\n /**\n * Creates a new queue builder for the given name.\n *\n * @example\n * ```typescript\n * const queue = IgniterQueue.create('email')\n * .withContext<AppContext>()\n * .addJob('sendWelcome', { handler: async () => {} })\n * .build()\n * ```\n */\n public static create<const TName extends string>(name: TName) {\n return IgniterQueueBuilder.create(name)\n }\n}\n","/**\n * @fileoverview Builder for creating IgniterJobs instances\n * @module @igniter-js/jobs/builders/main\n *\n * @description\n * Provides a fluent builder API for configuring and creating IgniterJobs instances.\n * Supports adapter configuration, service naming, environment settings, queues,\n * scopes, telemetry, and more.\n *\n * @example\n * ```typescript\n * import { IgniterJobs, IgniterQueue } from '@igniter-js/jobs'\n * import { IgniterJobsMemoryAdapter } from '@igniter-js/jobs/adapters/mock'\n * import { z } from 'zod'\n *\n * const emailQueue = IgniterQueue.create('email')\n * .addJob('sendWelcome', {\n * input: z.object({ to: z.string(), name: z.string() }),\n * handler: async (ctx) => {\n * await sendEmail(ctx.input.to, `Welcome ${ctx.input.name}!`)\n * },\n * })\n * .build()\n *\n * const jobs = IgniterJobs.create()\n * .withAdapter(IgniterJobsMemoryAdapter.create())\n * .withService('my-api')\n * .withEnvironment('production')\n * .withContext(async () => ({ db }))\n * .addQueue(emailQueue)\n * .build()\n * ```\n */\nimport type { IgniterLogger } from \"@igniter-js/common\";\nimport type { IgniterJobsConfig } from \"../types/config\";\nimport type { IgniterJobsRuntime } from \"../types/runtime\";\nimport type { IgniterJobsAdapter } from \"../types/adapter\";\nimport type { IgniterJobsQueue } from \"../types/queue\";\nimport type { IgniterJobsTelemetry } from \"../types/events\";\nimport type { IgniterJobsScopeOptions } from \"../types/scope\";\nimport type { IgniterJobsScopeDefinition } from \"../types/scope\";\nimport type { IgniterJobDefinition, IgniterJobsLimiter } from \"../types/job\";\nimport type { IgniterJobsWorkerBuilderConfig } from \"../types/worker\";\nimport { IgniterJobsError } from \"../errors\";\nimport { IgniterJobsManager } from \"../core/manager\";\n\ninterface IgniterJobsBuilderState<\n TContext,\n TQueues extends Record<string, IgniterJobsQueue<TContext, any, any>>,\n TScope extends string,\n> {\n adapter?: IgniterJobsAdapter;\n service?: string;\n environment?: string;\n contextFactory?: () => TContext | Promise<TContext>;\n queues: TQueues;\n scope?: { name: TScope; options?: IgniterJobsScopeOptions };\n queueDefaults?: Partial<IgniterJobDefinition<TContext, any, any, any>>;\n workerDefaults?: Partial<IgniterJobsWorkerBuilderConfig>;\n autoStartWorker?: {\n queues: (keyof TQueues)[];\n concurrency?: number;\n limiter?: IgniterJobsLimiter;\n };\n logger?: IgniterLogger;\n telemetry?: IgniterJobsTelemetry;\n}\n\n/**\n * Fluent builder responsible for configuring and constructing an `IgniterJobs` instance.\n *\n * The builder follows the immutable pattern used across Igniter packages: each\n * method returns a new builder with refined types. Only a single scope is\n * supported per the current specification (no actor support).\n */\nexport class IgniterJobsBuilder<\n TContext,\n TQueues extends Record<string, IgniterJobsQueue<TContext, any, any>> = {},\n TScope extends string = never,\n> {\n private readonly state: IgniterJobsBuilderState<TContext, TQueues, TScope>;\n\n private constructor(\n state?: Partial<IgniterJobsBuilderState<TContext, TQueues, TScope>>,\n ) {\n this.state = {\n queues: (state?.queues ?? ({} as TQueues)) as TQueues,\n ...state,\n } as IgniterJobsBuilderState<TContext, TQueues, TScope>;\n }\n\n /**\n * Creates the initial builder with no configuration.\n *\n * Context type is inferred from `withContext()` - no explicit generic needed.\n *\n * @example\n * ```typescript\n * // Context is inferred from the factory return type\n * const jobs = IgniterJobs.create()\n * .withContext(async () => ({ db: prisma, cache: redis }))\n * // TContext is now { db: PrismaClient, cache: Redis }\n * .build()\n * ```\n */\n public static create(): IgniterJobsBuilder<unknown> {\n return new IgniterJobsBuilder<unknown>({\n queues: {} as Record<string, any>,\n });\n }\n\n /**\n * Returns a new builder with updated state while preserving generics.\n */\n private clone<\n TNewQueues extends Record<string, IgniterJobsQueue<TContext, any, any>> =\n TQueues,\n TNewScope extends string = TScope,\n >(\n patch: Partial<IgniterJobsBuilderState<TContext, any, any>>,\n ): IgniterJobsBuilder<TContext, TNewQueues, TNewScope> {\n return new IgniterJobsBuilder<TContext, TNewQueues, TNewScope>({\n ...(this.state as any),\n ...(patch as any),\n queues: ((patch as any).queues ??\n (this.state.queues as unknown as TNewQueues)) as TNewQueues,\n scope: (patch as any).scope ?? (this.state.scope as any),\n });\n }\n\n /**\n * Attaches the jobs adapter.\n *\n * @param adapter - Backend adapter implementation (BullMQ, memory, etc.).\n */\n public withAdapter(\n adapter: IgniterJobsAdapter,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ adapter });\n }\n\n /**\n * Sets the service identifier for telemetry and metrics.\n *\n * @param service - Service name (e.g., \"my-api\").\n */\n public withService(\n service: string,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ service });\n }\n\n /**\n * Sets the environment name (e.g., development, staging, production).\n */\n public withEnvironment(\n environment: string,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ environment });\n }\n\n /**\n * Provides a context factory used when executing jobs.\n *\n * The context type is inferred from the factory return type, eliminating\n * the need for explicit generics on `IgniterJobs.create()`.\n *\n * **Note:** This must be called before adding any queues, as the context\n * type affects queue type compatibility.\n *\n * @param factory - Function that returns the context (sync or async)\n * @returns A new builder with the inferred context type\n *\n * @example\n * ```typescript\n * // Context type is inferred as { db: PrismaClient, cache: Redis }\n * const jobs = IgniterJobs.create()\n * .withContext(async () => ({\n * db: new PrismaClient(),\n * cache: new Redis(),\n * }))\n * .addQueue(emailQueue)\n * .build()\n * ```\n */\n public withContext<TNewContext>(\n this: IgniterJobsBuilder<unknown, {}, TScope>,\n factory: () => TNewContext | Promise<TNewContext>,\n ): IgniterJobsBuilder<TNewContext, {}, TScope> {\n return new IgniterJobsBuilder<TNewContext, {}, TScope>({\n ...(this.state as any),\n contextFactory: factory,\n queues: {},\n });\n }\n\n /**\n * Adds a scope definition (single scope supported).\n */\n public addScope<TNewScope extends string>(\n name: TNewScope,\n options?: IgniterJobsScopeOptions,\n ): IgniterJobsBuilder<TContext, TQueues, TScope | TNewScope> {\n if (this.state.scope) {\n throw new IgniterJobsError({\n code: \"JOBS_SCOPE_ALREADY_DEFINED\",\n message: \"Only one scope can be defined for IgniterJobs.\",\n });\n }\n return this.clone({ scope: { name: name as TScope | TNewScope, options } });\n }\n\n /**\n * Registers a queue definition on the builder.\n */\n public addQueue<\n TName extends string,\n TQueue extends IgniterJobsQueue<TContext, any, any>,\n >(\n queue: TQueue & { name: TName },\n ): IgniterJobsBuilder<TContext, TQueues & Record<TName, TQueue>, TScope> {\n if ((this.state.queues as Record<string, unknown>)[queue.name]) {\n throw new IgniterJobsError({\n code: \"JOBS_QUEUE_DUPLICATE\",\n message: `Queue \"${queue.name}\" is already registered.`,\n });\n }\n const nextQueues = {\n ...(this.state.queues as unknown as Record<string, TQueue>),\n [queue.name]: queue,\n } as TQueues & Record<TName, TQueue>;\n\n return this.clone<TQueues & Record<TName, TQueue>>({ queues: nextQueues });\n }\n\n /**\n * Applies default job options to all queues.\n */\n public withQueueDefaults(\n defaults: Partial<IgniterJobDefinition<TContext, any, any, any>>,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ queueDefaults: defaults });\n }\n\n /**\n * Applies default worker options.\n */\n public withWorkerDefaults(\n defaults: Partial<IgniterJobsWorkerBuilderConfig>,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ workerDefaults: defaults });\n }\n\n /**\n * Configures automatic worker startup.\n */\n public withAutoStartWorker(config: {\n queues: (keyof TQueues)[];\n concurrency?: number;\n limiter?: IgniterJobsLimiter;\n }): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ autoStartWorker: config });\n }\n\n /**\n * Attaches telemetry support.\n */\n public withTelemetry(\n telemetry: IgniterJobsTelemetry,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ telemetry });\n }\n\n /**\n * Attaches a custom logger.\n */\n public withLogger(\n logger: IgniterLogger,\n ): IgniterJobsBuilder<TContext, TQueues, TScope> {\n return this.clone({ logger });\n }\n\n /**\n * Finalizes the configuration and returns the runtime instance.\n */\n public build(): IgniterJobsRuntime<\n IgniterJobsConfig<TContext, TQueues, TScope>\n > {\n if (!this.state.adapter) {\n throw new IgniterJobsError({\n code: \"JOBS_ADAPTER_REQUIRED\",\n message: \"Jobs adapter is required. Call withAdapter() before build().\",\n });\n }\n\n if (!this.state.service) {\n throw new IgniterJobsError({\n code: \"JOBS_SERVICE_REQUIRED\",\n message: \"Service name is required. Call withService() before build().\",\n });\n }\n\n if (!this.state.environment) {\n throw new IgniterJobsError({\n code: \"JOBS_CONFIGURATION_INVALID\",\n message:\n \"Environment is required. Call withEnvironment() before build().\",\n });\n }\n\n if (!this.state.contextFactory) {\n throw new IgniterJobsError({\n code: \"JOBS_CONTEXT_REQUIRED\",\n message:\n \"Context factory is required. Call withContext() before build().\",\n });\n }\n\n const config: IgniterJobsConfig<TContext, TQueues, TScope> = {\n adapter: this.state.adapter,\n service: this.state.service,\n environment: this.state.environment,\n contextFactory: this.state.contextFactory,\n queues: this.state.queues,\n scopeDefinition: this.state.scope\n ? ({\n [this.state.scope.name]: (this.state.scope.options ??\n {}) as IgniterJobsScopeOptions,\n } as IgniterJobsScopeDefinition<TScope>)\n : undefined,\n queueDefaults: this.state.queueDefaults,\n workerDefaults: this.state.workerDefaults,\n autoStartWorker: this.state.autoStartWorker,\n logger: this.state.logger,\n telemetry: this.state.telemetry,\n };\n\n return new IgniterJobsManager(config).toRuntime();\n }\n}\n\n/**\n * Factory for creating and configuring IgniterJobs instances.\n *\n * This is the main entry point for creating a jobs runtime with a fluent builder API.\n * It provides type-safe configuration for adapters, queues, scopes, context, and telemetry.\n *\n * @example\n * ```typescript\n * import { IgniterJobs, IgniterQueue } from '@igniter-js/jobs'\n * import { IgniterJobsMemoryAdapter } from '@igniter-js/jobs/adapters/mock'\n * import { z } from 'zod'\n *\n * const emailQueue = IgniterQueue.create('email')\n * .addJob('sendWelcome', {\n * input: z.object({ to: z.string(), name: z.string() }),\n * handler: async (ctx) => {\n * await sendEmail(ctx.input.to, `Welcome ${ctx.input.name}!`)\n * },\n * })\n * .build()\n *\n * const jobs = IgniterJobs.create()\n * .withAdapter(IgniterJobsMemoryAdapter.create())\n * .withService('my-api')\n * .withEnvironment('production')\n * .withContext(async () => ({ db }))\n * .addQueue(emailQueue)\n * .build()\n *\n * // Dispatch jobs\n * await jobs.email.sendWelcome.dispatch({ input: { to: 'user@example.com', name: 'Alice' } })\n *\n * // Use scopes for multi-tenancy\n * const orgJobs = jobs.scope('organization', 'org_123')\n * await orgJobs.email.sendWelcome.dispatch({ input: { to: 'user@example.com', name: 'Bob' } })\n * ```\n *\n * @see {@link IgniterJobsBuilder} for detailed method documentation\n */\nexport const IgniterJobs = {\n create: IgniterJobsBuilder.create,\n};\n"]}