@igniter-js/jobs 0.1.0
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/AGENTS.md +557 -0
- package/README.md +410 -0
- package/dist/adapter-CcQCatSa.d.mts +1411 -0
- package/dist/adapter-CcQCatSa.d.ts +1411 -0
- package/dist/adapters/bullmq.adapter.d.mts +131 -0
- package/dist/adapters/bullmq.adapter.d.ts +131 -0
- package/dist/adapters/bullmq.adapter.js +598 -0
- package/dist/adapters/bullmq.adapter.js.map +1 -0
- package/dist/adapters/bullmq.adapter.mjs +596 -0
- package/dist/adapters/bullmq.adapter.mjs.map +1 -0
- package/dist/adapters/index.d.mts +5 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.js +1129 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/index.mjs +1126 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/adapters/memory.adapter.d.mts +118 -0
- package/dist/adapters/memory.adapter.d.ts +118 -0
- package/dist/adapters/memory.adapter.js +571 -0
- package/dist/adapters/memory.adapter.js.map +1 -0
- package/dist/adapters/memory.adapter.mjs +569 -0
- package/dist/adapters/memory.adapter.mjs.map +1 -0
- package/dist/index.d.mts +1107 -0
- package/dist/index.d.ts +1107 -0
- package/dist/index.js +1137 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1128 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors/igniter-jobs.error.ts","../src/builders/igniter-worker.builder.ts","../src/core/igniter-jobs.ts","../src/builders/igniter-jobs.builder.ts","../src/builders/igniter-queue.builder.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @fileoverview Error class and error codes for @igniter-js/jobs\n * @module @igniter-js/jobs/errors\n */\n\nimport { IgniterError, type IgniterLogger } from '@igniter-js/core'\n\n/**\n * All possible error codes for IgniterJobs.\n * Use these codes for programmatic error handling.\n *\n * @example\n * ```typescript\n * try {\n * await jobs.email.sendWelcome.dispatch(input)\n * } catch (error) {\n * if (error instanceof IgniterJobsError) {\n * switch (error.code) {\n * case 'JOBS_ADAPTER_REQUIRED':\n * // Handle missing adapter\n * break\n * case 'JOBS_DISPATCH_FAILED':\n * // Handle dispatch failure\n * break\n * }\n * }\n * }\n * ```\n */\nexport const IGNITER_JOBS_ERROR_CODES = {\n // Configuration errors\n JOBS_ADAPTER_REQUIRED: 'JOBS_ADAPTER_REQUIRED',\n JOBS_CONTEXT_REQUIRED: 'JOBS_CONTEXT_REQUIRED',\n JOBS_QUEUE_REQUIRED: 'JOBS_QUEUE_REQUIRED',\n JOBS_CONFIGURATION_INVALID: 'JOBS_CONFIGURATION_INVALID',\n\n // Queue errors\n JOBS_QUEUE_NOT_FOUND: 'JOBS_QUEUE_NOT_FOUND',\n JOBS_QUEUE_ALREADY_EXISTS: 'JOBS_QUEUE_ALREADY_EXISTS',\n JOBS_QUEUE_NAME_INVALID: 'JOBS_QUEUE_NAME_INVALID',\n JOBS_QUEUE_PAUSE_FAILED: 'JOBS_QUEUE_PAUSE_FAILED',\n JOBS_QUEUE_RESUME_FAILED: 'JOBS_QUEUE_RESUME_FAILED',\n JOBS_QUEUE_DRAIN_FAILED: 'JOBS_QUEUE_DRAIN_FAILED',\n JOBS_QUEUE_CLEAN_FAILED: 'JOBS_QUEUE_CLEAN_FAILED',\n JOBS_QUEUE_OBLITERATE_FAILED: 'JOBS_QUEUE_OBLITERATE_FAILED',\n\n // Job definition errors\n JOBS_JOB_NOT_FOUND: 'JOBS_JOB_NOT_FOUND',\n JOBS_JOB_ALREADY_EXISTS: 'JOBS_JOB_ALREADY_EXISTS',\n JOBS_JOB_NAME_INVALID: 'JOBS_JOB_NAME_INVALID',\n JOBS_JOB_HANDLER_REQUIRED: 'JOBS_JOB_HANDLER_REQUIRED',\n\n // Cron errors\n JOBS_CRON_NOT_FOUND: 'JOBS_CRON_NOT_FOUND',\n JOBS_CRON_ALREADY_EXISTS: 'JOBS_CRON_ALREADY_EXISTS',\n JOBS_CRON_EXPRESSION_INVALID: 'JOBS_CRON_EXPRESSION_INVALID',\n JOBS_CRON_HANDLER_REQUIRED: 'JOBS_CRON_HANDLER_REQUIRED',\n\n // Dispatch errors\n JOBS_DISPATCH_FAILED: 'JOBS_DISPATCH_FAILED',\n JOBS_SCHEDULE_FAILED: 'JOBS_SCHEDULE_FAILED',\n JOBS_INPUT_REQUIRED: 'JOBS_INPUT_REQUIRED',\n JOBS_INPUT_VALIDATION_FAILED: 'JOBS_INPUT_VALIDATION_FAILED',\n\n // Scope errors\n JOBS_SCOPE_REQUIRED: 'JOBS_SCOPE_REQUIRED',\n JOBS_SCOPE_ALREADY_DEFINED: 'JOBS_SCOPE_ALREADY_DEFINED',\n JOBS_SCOPE_INVALID: 'JOBS_SCOPE_INVALID',\n\n // Actor errors\n JOBS_ACTOR_ALREADY_DEFINED: 'JOBS_ACTOR_ALREADY_DEFINED',\n JOBS_ACTOR_INVALID: 'JOBS_ACTOR_INVALID',\n\n // Job management errors\n JOBS_GET_FAILED: 'JOBS_GET_FAILED',\n JOBS_RETRY_FAILED: 'JOBS_RETRY_FAILED',\n JOBS_REMOVE_FAILED: 'JOBS_REMOVE_FAILED',\n JOBS_PROMOTE_FAILED: 'JOBS_PROMOTE_FAILED',\n JOBS_MOVE_FAILED: 'JOBS_MOVE_FAILED',\n JOBS_STATE_FAILED: 'JOBS_STATE_FAILED',\n JOBS_PROGRESS_FAILED: 'JOBS_PROGRESS_FAILED',\n JOBS_LOGS_FAILED: 'JOBS_LOGS_FAILED',\n\n // Worker errors\n JOBS_WORKER_CREATE_FAILED: 'JOBS_WORKER_CREATE_FAILED',\n JOBS_WORKER_START_FAILED: 'JOBS_WORKER_START_FAILED',\n JOBS_WORKER_STOP_FAILED: 'JOBS_WORKER_STOP_FAILED',\n JOBS_WORKER_NOT_FOUND: 'JOBS_WORKER_NOT_FOUND',\n JOBS_WORKER_ALREADY_RUNNING: 'JOBS_WORKER_ALREADY_RUNNING',\n\n // Event/Subscribe errors\n JOBS_SUBSCRIBE_FAILED: 'JOBS_SUBSCRIBE_FAILED',\n JOBS_UNSUBSCRIBE_FAILED: 'JOBS_UNSUBSCRIBE_FAILED',\n JOBS_EVENT_EMIT_FAILED: 'JOBS_EVENT_EMIT_FAILED',\n\n // Search errors\n JOBS_SEARCH_FAILED: 'JOBS_SEARCH_FAILED',\n JOBS_SEARCH_INVALID_TARGET: 'JOBS_SEARCH_INVALID_TARGET',\n\n // Shutdown errors\n JOBS_SHUTDOWN_FAILED: 'JOBS_SHUTDOWN_FAILED',\n\n // Handler errors\n JOBS_HANDLER_FAILED: 'JOBS_HANDLER_FAILED',\n JOBS_HANDLER_TIMEOUT: 'JOBS_HANDLER_TIMEOUT',\n} as const\n\n/**\n * Type for all possible error codes.\n */\nexport type IgniterJobsErrorCode = keyof typeof IGNITER_JOBS_ERROR_CODES\n\n/**\n * Options for creating an IgniterJobsError.\n */\nexport interface IgniterJobsErrorOptions {\n /**\n * Error code from IGNITER_JOBS_ERROR_CODES.\n */\n code: IgniterJobsErrorCode\n\n /**\n * Human-readable error message.\n */\n message: string\n\n /**\n * HTTP status code (for REST API responses).\n * @default 500\n */\n statusCode?: number\n\n /**\n * Original error that caused this error.\n */\n cause?: Error\n\n /**\n * Additional details for debugging.\n */\n details?: Record<string, unknown>\n\n /**\n * Logger instance for logging the error.\n */\n logger?: IgniterLogger\n}\n\n/**\n * Custom error class for @igniter-js/jobs.\n * Extends IgniterError for consistent error handling across the Igniter ecosystem.\n *\n * @example\n * ```typescript\n * throw new IgniterJobsError({\n * code: 'JOBS_DISPATCH_FAILED',\n * message: 'Failed to dispatch job to queue',\n * statusCode: 500,\n * details: { queue: 'email', job: 'sendWelcome' },\n * })\n * ```\n */\nexport class IgniterJobsError extends IgniterError {\n /**\n * Error code for programmatic handling.\n */\n public readonly code: IgniterJobsErrorCode\n\n /**\n * Additional error details.\n */\n public readonly details?: Record<string, unknown>\n\n constructor(options: IgniterJobsErrorOptions) {\n super({\n code: options.code,\n message: options.message,\n statusCode: options.statusCode ?? 500,\n causer: '@igniter-js/jobs',\n cause: options.cause,\n details: options.details,\n logger: options.logger,\n })\n\n this.code = options.code\n this.details = options.details\n this.name = 'IgniterJobsError'\n\n // Maintain proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, IgniterJobsError)\n }\n }\n\n /**\n * Convert error to a plain object for serialization.\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n statusCode: this.statusCode,\n details: this.details,\n stack: this.stack,\n }\n }\n}\n","/**\n * @fileoverview Builder for creating workers\n * @module @igniter-js/jobs/builders/igniter-worker\n */\n\nimport type { IgniterWorkerBuilderState, IgniterWorkerHandle } from '../types'\nimport type { IgniterJobsAdapter, AdapterJobHandler } from '../types/adapter'\nimport { IgniterJobsError } from '../errors'\n\n/**\n * Builder for configuring and starting workers.\n *\n * @example\n * ```typescript\n * const worker = await jobs.worker\n * .create()\n * .forQueues('email', 'payment')\n * .withConcurrency(10)\n * .withLimiter({ max: 100, duration: 60000 })\n * .start()\n * ```\n */\nexport class IgniterWorkerBuilder {\n private state: IgniterWorkerBuilderState\n private adapter: IgniterJobsAdapter\n private jobHandler: AdapterJobHandler\n private availableQueues: string[]\n\n constructor(\n adapter: IgniterJobsAdapter,\n jobHandler: AdapterJobHandler,\n availableQueues: string[]\n ) {\n this.adapter = adapter\n this.jobHandler = jobHandler\n this.availableQueues = availableQueues\n this.state = {\n queues: [],\n concurrency: 1,\n }\n }\n\n /**\n * Specify which queues this worker should process.\n * If not called, worker processes all queues.\n *\n * @param queues - Queue names to process\n * @returns The builder for chaining\n *\n * @example\n * ```typescript\n * .forQueues('email', 'payment')\n * ```\n */\n forQueues(...queues: string[]): this {\n // Validate queue names exist\n for (const queue of queues) {\n if (!this.availableQueues.includes(queue)) {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_NOT_FOUND',\n message: `Queue \"${queue}\" is not registered. Available queues: ${this.availableQueues.join(', ')}`,\n statusCode: 400,\n details: { queue, availableQueues: this.availableQueues },\n })\n }\n }\n\n this.state.queues = queues\n return this\n }\n\n /**\n * Set the concurrency level (jobs processed in parallel per queue).\n *\n * @param concurrency - Number of parallel jobs\n * @returns The builder for chaining\n *\n * @example\n * ```typescript\n * .withConcurrency(10)\n * ```\n */\n withConcurrency(concurrency: number): this {\n if (concurrency < 1) {\n throw new IgniterJobsError({\n code: 'JOBS_CONFIGURATION_INVALID',\n message: 'Concurrency must be at least 1',\n statusCode: 400,\n details: { concurrency },\n })\n }\n\n this.state.concurrency = concurrency\n return this\n }\n\n /**\n * Set the lock duration in milliseconds.\n * Jobs are locked for this duration while being processed.\n *\n * @param duration - Lock duration in milliseconds\n * @returns The builder for chaining\n *\n * @example\n * ```typescript\n * .withLockDuration(30000) // 30 seconds\n * ```\n */\n withLockDuration(duration: number): this {\n if (duration < 1000) {\n throw new IgniterJobsError({\n code: 'JOBS_CONFIGURATION_INVALID',\n message: 'Lock duration must be at least 1000ms',\n statusCode: 400,\n details: { duration },\n })\n }\n\n this.state.lockDuration = duration\n return this\n }\n\n /**\n * Configure rate limiting for the worker.\n *\n * @param config - Rate limiter configuration\n * @returns The builder for chaining\n *\n * @example\n * ```typescript\n * .withLimiter({ max: 100, duration: 60000 }) // 100 jobs per minute\n * ```\n */\n withLimiter(config: { max: number; duration: number }): this {\n if (config.max < 1) {\n throw new IgniterJobsError({\n code: 'JOBS_CONFIGURATION_INVALID',\n message: 'Limiter max must be at least 1',\n statusCode: 400,\n details: { max: config.max },\n })\n }\n\n if (config.duration < 1) {\n throw new IgniterJobsError({\n code: 'JOBS_CONFIGURATION_INVALID',\n message: 'Limiter duration must be at least 1ms',\n statusCode: 400,\n details: { duration: config.duration },\n })\n }\n\n this.state.limiter = config\n return this\n }\n\n /**\n * Set a callback to be called when the worker becomes idle.\n *\n * @param callback - Idle callback\n * @returns The builder for chaining\n *\n * @example\n * ```typescript\n * .onIdle(() => console.log('Worker is idle'))\n * ```\n */\n onIdle(callback: () => void): this {\n this.state.onIdle = callback\n return this\n }\n\n /**\n * Start the worker.\n *\n * @returns Worker handle for management\n *\n * @example\n * ```typescript\n * const worker = await jobs.worker\n * .create()\n * .forQueues('email')\n * .start()\n *\n * // Later\n * await worker.pause()\n * await worker.close()\n * ```\n */\n async start(): Promise<IgniterWorkerHandle> {\n // If no queues specified, use all available queues\n const queuesToProcess = this.state.queues.length > 0\n ? this.state.queues\n : this.availableQueues\n\n try {\n const handle = await this.adapter.createWorker(\n {\n queues: queuesToProcess,\n concurrency: this.state.concurrency,\n lockDuration: this.state.lockDuration,\n limiter: this.state.limiter,\n onIdle: this.state.onIdle,\n },\n this.jobHandler\n )\n\n return {\n id: handle.id,\n pause: () => handle.pause(),\n resume: () => handle.resume(),\n close: () => handle.close(),\n isRunning: () => handle.isRunning(),\n isPaused: () => handle.isPaused(),\n getMetrics: () => handle.getMetrics(),\n }\n } catch (error) {\n throw new IgniterJobsError({\n code: 'JOBS_WORKER_START_FAILED',\n message: 'Failed to start worker',\n statusCode: 500,\n cause: error instanceof Error ? error : undefined,\n details: { queues: queuesToProcess },\n })\n }\n }\n}\n","/**\n * @fileoverview IgniterJobs runtime class with proxy-based API\n * @module @igniter-js/jobs/core/igniter-jobs\n */\n\nimport type { IgniterLogger } from '@igniter-js/core'\nimport type { IgniterTelemetry } from '@igniter-js/telemetry'\nimport type {\n IgniterJobsAdapter,\n IgniterQueueBuilderState,\n IgniterJobDefinition,\n IgniterCronDefinition,\n IgniterJobScopeEntry,\n IgniterJobActorEntry,\n IgniterJobHandlerContext,\n IgniterCronHandlerContext,\n AdapterDispatchParams,\n AdapterScheduleParams,\n IgniterJobScopeOptions,\n IgniterJobActorOptions,\n IgniterJobEventHandler,\n IgniterJobUnsubscribeFn,\n IgniterQueueInfo,\n IgniterJobSearchResult,\n} from '../types'\nimport { IgniterJobsError } from '../errors'\nimport { IgniterWorkerBuilder } from '../builders/igniter-worker.builder'\n\n/**\n * Standard prefix for all job queues.\n */\nconst IGNITER_JOBS_PREFIX = 'igniter:jobs'\n\n/**\n * Get the full queue name with prefix.\n */\nfunction getFullQueueName(queueName: string): string {\n return `${IGNITER_JOBS_PREFIX}:${queueName}`\n}\n\n/**\n * Configuration passed to IgniterJobsRuntime.\n */\nexport interface IgniterJobsRuntimeConfig<\n TContext,\n TQueues extends Record<string, IgniterQueueBuilderState<TContext, any, any>>,\n TScope extends string,\n TActor extends string,\n> {\n adapter: IgniterJobsAdapter\n context: () => TContext | Promise<TContext>\n queues: TQueues\n scope?: { key: TScope; options?: IgniterJobScopeOptions }\n actor?: { key: TActor; options?: IgniterJobActorOptions }\n telemetry?: IgniterTelemetry\n logger?: IgniterLogger\n defaults?: {\n retry?: { attempts?: number; backoff?: any }\n timeout?: number\n removeOnComplete?: boolean | { count?: number; age?: number }\n removeOnFail?: boolean | { count?: number; age?: number }\n }\n}\n\n/**\n * Main runtime class for IgniterJobs.\n * Creates proxy-based API for type-safe job access.\n */\nexport class IgniterJobsRuntime<\n TContext,\n TQueues extends Record<string, IgniterQueueBuilderState<TContext, any, any>>,\n TScope extends string,\n TActor extends string,\n> {\n private readonly config: IgniterJobsRuntimeConfig<TContext, TQueues, TScope, TActor>\n private readonly queueNames: string[]\n\n constructor(config: IgniterJobsRuntimeConfig<TContext, TQueues, TScope, TActor>) {\n this.config = config\n this.queueNames = Object.keys(config.queues)\n\n // Return a proxy that provides the full API\n return this.createProxy()\n }\n\n /**\n * Create the main proxy that provides queue access and global methods.\n */\n private createProxy(): any {\n const self = this\n\n return new Proxy({}, {\n get(_, prop: string) {\n // Global methods\n if (prop === 'subscribe') {\n return self.createGlobalSubscribe()\n }\n\n if (prop === 'search') {\n return self.createSearch()\n }\n\n if (prop === 'worker') {\n return self.createWorkerBuilder()\n }\n\n if (prop === 'shutdown') {\n return () => self.shutdown()\n }\n\n // Queue access\n if (self.queueNames.includes(prop)) {\n return self.createQueueProxy(prop)\n }\n\n return undefined\n },\n\n has(_, prop: string) {\n return ['subscribe', 'search', 'worker', 'shutdown', ...self.queueNames].includes(prop)\n },\n\n ownKeys() {\n return ['subscribe', 'search', 'worker', 'shutdown', ...self.queueNames]\n },\n\n getOwnPropertyDescriptor(_, prop) {\n if (['subscribe', 'search', 'worker', 'shutdown', ...self.queueNames].includes(prop as string)) {\n return { configurable: true, enumerable: true }\n }\n return undefined\n },\n })\n }\n\n /**\n * Create a proxy for a specific queue.\n */\n private createQueueProxy(queueName: string): any {\n const self = this\n const queueConfig = this.config.queues[queueName]\n const jobNames = Object.keys(queueConfig.jobs)\n\n return new Proxy({}, {\n get(_, prop: string) {\n // Queue-level methods\n if (prop === 'subscribe') {\n return self.createQueueSubscribe(queueName)\n }\n\n if (prop === 'list') {\n return (options?: { status?: string[]; limit?: number }) =>\n self.listQueueJobs(queueName, options)\n }\n\n if (prop === 'get') {\n return () => self.createQueueManagement(queueName)\n }\n\n // Job access\n if (jobNames.includes(prop)) {\n return self.createJobProxy(queueName, prop)\n }\n\n return undefined\n },\n })\n }\n\n /**\n * Create a proxy for a specific job.\n */\n private createJobProxy(queueName: string, jobName: string): any {\n const self = this\n\n return {\n dispatch: (input: unknown, options?: any) =>\n self.dispatchJob(queueName, jobName, input, options),\n\n schedule: (params: any) =>\n self.scheduleJob(queueName, jobName, params),\n\n get: (jobId: string) =>\n self.createJobManagement(queueName, jobId),\n\n many: (jobIds: string[]) =>\n self.createJobBatchManagement(queueName, jobIds),\n\n pause: () =>\n self.pauseJobType(queueName, jobName),\n\n resume: () =>\n self.resumeJobType(queueName, jobName),\n\n subscribe: (handler: IgniterJobEventHandler) =>\n self.subscribeToJob(queueName, jobName, handler),\n }\n }\n\n /**\n * Dispatch a job.\n */\n private async dispatchJob(\n queueName: string,\n jobName: string,\n input: unknown,\n options?: {\n jobId?: string\n delay?: number\n priority?: number\n scope?: IgniterJobScopeEntry\n actor?: IgniterJobActorEntry\n }\n ): Promise<string> {\n const queueConfig = this.config.queues[queueName]\n const jobDef = queueConfig.jobs[jobName] as IgniterJobDefinition<TContext, any, any>\n\n // Validate input if schema provided\n if (jobDef.input) {\n try {\n const result = await (jobDef.input as any)['~standard'].validate(input)\n if (result.issues) {\n throw new IgniterJobsError({\n code: 'JOBS_INPUT_VALIDATION_FAILED',\n message: `Input validation failed for job \"${jobName}\"`,\n statusCode: 400,\n details: { issues: result.issues },\n })\n }\n input = result.value\n } catch (error) {\n if (error instanceof IgniterJobsError) throw error\n // Fallback to Zod-style validation\n if (typeof (jobDef.input as any).parse === 'function') {\n input = (jobDef.input as any).parse(input)\n }\n }\n }\n\n // Validate scope if required\n if (this.config.scope?.options?.required && !options?.scope) {\n throw new IgniterJobsError({\n code: 'JOBS_SCOPE_REQUIRED',\n message: `Scope \"${this.config.scope.key}\" is required for job dispatch`,\n statusCode: 400,\n details: { queue: queueName, job: jobName },\n })\n }\n\n const params: AdapterDispatchParams = {\n queue: getFullQueueName(queueName),\n name: jobName,\n data: input,\n jobId: options?.jobId,\n delay: options?.delay,\n priority: options?.priority ?? jobDef.priority,\n attempts: jobDef.retry?.attempts ?? this.config.defaults?.retry?.attempts ?? 3,\n backoff: jobDef.retry?.backoff ?? this.config.defaults?.retry?.backoff,\n removeOnComplete: jobDef.removeOnComplete ?? this.config.defaults?.removeOnComplete,\n removeOnFail: jobDef.removeOnFail ?? this.config.defaults?.removeOnFail,\n scope: options?.scope,\n actor: options?.actor,\n }\n\n try {\n const jobId = await this.config.adapter.dispatch(params)\n\n // Emit telemetry event\n if (this.config.telemetry) {\n // Telemetry emission would go here\n }\n\n return jobId\n } catch (error) {\n throw new IgniterJobsError({\n code: 'JOBS_DISPATCH_FAILED',\n message: `Failed to dispatch job \"${jobName}\" to queue \"${queueName}\"`,\n statusCode: 500,\n cause: error instanceof Error ? error : undefined,\n details: { queue: queueName, job: jobName },\n })\n }\n }\n\n /**\n * Schedule a job for future execution.\n */\n private async scheduleJob(\n queueName: string,\n jobName: string,\n params: {\n input: unknown\n at?: Date\n cron?: string\n every?: number\n timezone?: string\n jobId?: string\n scope?: IgniterJobScopeEntry\n actor?: IgniterJobActorEntry\n }\n ): Promise<string> {\n const queueConfig = this.config.queues[queueName]\n const jobDef = queueConfig.jobs[jobName] as IgniterJobDefinition<TContext, any, any>\n\n // Validate input if schema provided\n let validatedInput = params.input\n if (jobDef.input) {\n try {\n const result = await (jobDef.input as any)['~standard'].validate(params.input)\n if (result.issues) {\n throw new IgniterJobsError({\n code: 'JOBS_INPUT_VALIDATION_FAILED',\n message: `Input validation failed for job \"${jobName}\"`,\n statusCode: 400,\n details: { issues: result.issues },\n })\n }\n validatedInput = result.value\n } catch (error) {\n if (error instanceof IgniterJobsError) throw error\n if (typeof (jobDef.input as any).parse === 'function') {\n validatedInput = (jobDef.input as any).parse(params.input)\n }\n }\n }\n\n const scheduleParams: AdapterScheduleParams = {\n queue: getFullQueueName(queueName),\n name: jobName,\n data: validatedInput,\n jobId: params.jobId,\n at: params.at,\n cron: params.cron,\n every: params.every,\n timezone: params.timezone,\n attempts: jobDef.retry?.attempts ?? this.config.defaults?.retry?.attempts ?? 3,\n backoff: jobDef.retry?.backoff ?? this.config.defaults?.retry?.backoff,\n removeOnComplete: jobDef.removeOnComplete ?? this.config.defaults?.removeOnComplete,\n removeOnFail: jobDef.removeOnFail ?? this.config.defaults?.removeOnFail,\n scope: params.scope,\n actor: params.actor,\n }\n\n try {\n return await this.config.adapter.schedule(scheduleParams)\n } catch (error) {\n throw new IgniterJobsError({\n code: 'JOBS_SCHEDULE_FAILED',\n message: `Failed to schedule job \"${jobName}\" in queue \"${queueName}\"`,\n statusCode: 500,\n cause: error instanceof Error ? error : undefined,\n details: { queue: queueName, job: jobName },\n })\n }\n }\n\n /**\n * Create job management methods.\n */\n private createJobManagement(queueName: string, jobId: string) {\n const adapter = this.config.adapter\n const fullQueueName = getFullQueueName(queueName)\n\n return {\n retrieve: () => adapter.getJob(fullQueueName, jobId),\n retry: () => adapter.retryJob(fullQueueName, jobId),\n remove: () => adapter.removeJob(fullQueueName, jobId),\n state: () => adapter.getJobState(fullQueueName, jobId),\n progress: () => adapter.getJobProgress(fullQueueName, jobId),\n logs: () => adapter.getJobLogs(fullQueueName, jobId),\n promote: () => adapter.promoteJob(fullQueueName, jobId),\n move: (state: 'failed' | 'completed', reason?: string) =>\n adapter.moveJob(fullQueueName, jobId, state, reason),\n }\n }\n\n /**\n * Create batch job management methods.\n */\n private createJobBatchManagement(queueName: string, jobIds: string[]) {\n const adapter = this.config.adapter\n const fullQueueName = getFullQueueName(queueName)\n\n return {\n retry: () => adapter.retryJobs(fullQueueName, jobIds),\n remove: () => adapter.removeJobs(fullQueueName, jobIds),\n }\n }\n\n /**\n * Create queue management methods.\n */\n private createQueueManagement(queueName: string) {\n const adapter = this.config.adapter\n const fullQueueName = getFullQueueName(queueName)\n\n return {\n retrieve: () => adapter.getQueue(fullQueueName),\n pause: () => adapter.pauseQueue(fullQueueName),\n resume: () => adapter.resumeQueue(fullQueueName),\n drain: () => adapter.drainQueue(fullQueueName),\n clean: (options: { status: string | string[]; olderThan?: number; limit?: number }) =>\n adapter.cleanQueue(fullQueueName, {\n status: options.status as any,\n olderThan: options.olderThan,\n limit: options.limit,\n }),\n obliterate: (options?: { force?: boolean }) =>\n adapter.obliterateQueue(fullQueueName, options),\n retryAll: () => adapter.retryAllFailed(fullQueueName),\n }\n }\n\n /**\n * Pause a specific job type.\n */\n private async pauseJobType(queueName: string, jobName: string): Promise<void> {\n const fullQueueName = getFullQueueName(queueName)\n await this.config.adapter.pauseJobType(fullQueueName, jobName)\n }\n\n /**\n * Resume a specific job type.\n */\n private async resumeJobType(queueName: string, jobName: string): Promise<void> {\n const fullQueueName = getFullQueueName(queueName)\n await this.config.adapter.resumeJobType(fullQueueName, jobName)\n }\n\n /**\n * Subscribe to events for a specific job.\n */\n private async subscribeToJob(\n queueName: string,\n jobName: string,\n handler: IgniterJobEventHandler\n ): Promise<IgniterJobUnsubscribeFn> {\n const pattern = `${queueName}:${jobName}:*`\n return this.config.adapter.subscribe(pattern, handler)\n }\n\n /**\n * Create queue-level subscribe.\n */\n private createQueueSubscribe(queueName: string) {\n return async (handler: IgniterJobEventHandler): Promise<IgniterJobUnsubscribeFn> => {\n const pattern = `${queueName}:*`\n return this.config.adapter.subscribe(pattern, handler)\n }\n }\n\n /**\n * List jobs in a queue.\n */\n private async listQueueJobs(\n queueName: string,\n options?: { status?: string[]; limit?: number }\n ): Promise<IgniterJobSearchResult[]> {\n const fullQueueName = getFullQueueName(queueName)\n return this.config.adapter.listJobs(fullQueueName, {\n status: options?.status as any,\n end: options?.limit,\n })\n }\n\n /**\n * Create global subscribe.\n */\n private createGlobalSubscribe() {\n return async (handler: IgniterJobEventHandler): Promise<IgniterJobUnsubscribeFn> => {\n return this.config.adapter.subscribe('*', handler)\n }\n }\n\n /**\n * Create search function.\n */\n private createSearch() {\n const adapter = this.config.adapter\n\n return async (target: 'queues' | 'jobs' | 'workers', filter?: any) => {\n switch (target) {\n case 'queues':\n return adapter.searchQueues(filter || {})\n case 'jobs':\n return adapter.searchJobs(filter || {})\n case 'workers':\n // Workers search would return active worker info\n return []\n default:\n throw new IgniterJobsError({\n code: 'JOBS_SEARCH_INVALID_TARGET',\n message: `Invalid search target \"${target}\". Use \"queues\", \"jobs\", or \"workers\".`,\n statusCode: 400,\n })\n }\n }\n }\n\n /**\n * Create worker builder.\n */\n private createWorkerBuilder() {\n const self = this\n\n return {\n create: () => new IgniterWorkerBuilder(\n this.config.adapter,\n this.createJobHandler(),\n this.queueNames.map(q => getFullQueueName(q))\n ),\n }\n }\n\n /**\n * Create the job handler function for workers.\n */\n private createJobHandler() {\n const self = this\n\n return async (job: {\n id: string\n name: string\n queue: string\n data: unknown\n attempt: number\n timestamp: number\n scope?: IgniterJobScopeEntry\n actor?: IgniterJobActorEntry\n log: (level: 'info' | 'warn' | 'error', message: string) => Promise<void>\n updateProgress: (progress: number) => Promise<void>\n }): Promise<unknown> => {\n // Extract queue name from full queue name\n const queueName = job.queue.replace(`${IGNITER_JOBS_PREFIX}:`, '')\n const queueConfig = self.config.queues[queueName]\n\n if (!queueConfig) {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_NOT_FOUND',\n message: `Queue \"${queueName}\" not found`,\n statusCode: 404,\n })\n }\n\n const jobDef = queueConfig.jobs[job.name] as IgniterJobDefinition<TContext, any, any>\n\n if (!jobDef) {\n throw new IgniterJobsError({\n code: 'JOBS_JOB_NOT_FOUND',\n message: `Job \"${job.name}\" not found in queue \"${queueName}\"`,\n statusCode: 404,\n })\n }\n\n // Get application context\n const context = await self.config.context()\n\n // Create handler context\n const ctx: IgniterJobHandlerContext<TContext, unknown> = {\n input: job.data,\n context,\n job: {\n id: job.id,\n name: job.name,\n queue: queueName,\n timestamp: job.timestamp,\n },\n attempt: job.attempt,\n scope: job.scope,\n actor: job.actor,\n log: job.log,\n updateProgress: job.updateProgress,\n }\n\n try {\n const result = await jobDef.handler(ctx)\n\n // Call onComplete hook if defined\n if (jobDef.onComplete) {\n await jobDef.onComplete(ctx, result)\n }\n\n return result\n } catch (error) {\n // Call onFailure hook if defined\n if (jobDef.onFailure) {\n await jobDef.onFailure(ctx, error instanceof Error ? error : new Error(String(error)))\n }\n\n throw error\n }\n }\n }\n\n /**\n * Shutdown the jobs instance.\n */\n private async shutdown(): Promise<void> {\n try {\n await this.config.adapter.shutdown()\n } catch (error) {\n throw new IgniterJobsError({\n code: 'JOBS_SHUTDOWN_FAILED',\n message: 'Failed to shutdown jobs instance',\n statusCode: 500,\n cause: error instanceof Error ? error : undefined,\n })\n }\n }\n}\n","/**\n * @fileoverview Builder for creating IgniterJobs instances\n * @module @igniter-js/jobs/builders/igniter-jobs\n *\n * @description\n * Provides a fluent builder API for configuring and creating IgniterJobs instances.\n * Supports adapter configuration, context provider, queues, scopes, actors, and telemetry.\n *\n * @example\n * ```typescript\n * import { IgniterJobs, IgniterQueue } from '@igniter-js/jobs'\n * import { BullMQAdapter } from '@igniter-js/jobs/adapters'\n * import Redis from 'ioredis'\n *\n * const redis = new Redis()\n *\n * const emailQueue = IgniterQueue.create<AppContext>('email')\n * .addJob('sendWelcome', { ... })\n * .build()\n *\n * const jobs = IgniterJobs.create<AppContext>()\n * .withAdapter(BullMQAdapter.create({ redis }))\n * .withContext(() => ({ db, mailer }))\n * .addQueue(emailQueue)\n * .addScope('organization')\n * .addActor('user')\n * .build()\n * ```\n */\n\nimport type { IgniterLogger } from '@igniter-js/core'\nimport type { IgniterTelemetry } from '@igniter-js/telemetry'\nimport type {\n IgniterJobsAdapter,\n IgniterJobsBuilderState,\n IgniterQueueBuilderState,\n IgniterJobDefinition,\n IgniterCronDefinition,\n IgniterJobScopeOptions,\n IgniterJobActorOptions,\n} from '../types'\nimport { IgniterJobsError } from '../errors'\nimport { IgniterJobsRuntime } from '../core/igniter-jobs'\n\n/**\n * Builder for creating IgniterJobs instances.\n *\n * @typeParam TContext - Application context type\n * @typeParam TQueues - Map of queue names to queue configs\n * @typeParam TScope - Scope key (only one allowed)\n * @typeParam TActor - Actor key (only one allowed)\n */\nexport class IgniterJobsBuilder<\n TContext = unknown,\n TQueues extends Record<string, IgniterQueueBuilderState<TContext, any, any>> = Record<string, never>,\n TScope extends string = never,\n TActor extends string = never,\n> {\n private readonly state: IgniterJobsBuilderState<TContext, TQueues, TScope, TActor>\n\n private constructor(state: IgniterJobsBuilderState<TContext, TQueues, TScope, TActor>) {\n this.state = state\n }\n\n /**\n * Create a new IgniterJobs builder.\n *\n * @returns A new IgniterJobsBuilder instance\n *\n * @example\n * ```typescript\n * const jobs = IgniterJobs.create<AppContext>()\n * .withAdapter(...)\n * .build()\n * ```\n */\n static create<TContext = unknown>(): IgniterJobsBuilder<TContext> {\n return new IgniterJobsBuilder<TContext>({\n queues: {} as Record<string, never>,\n })\n }\n\n /**\n * Configure the queue adapter (required).\n *\n * @param adapter - The queue adapter (e.g., BullMQAdapter)\n * @returns The builder with adapter configured\n *\n * @example\n * ```typescript\n * .withAdapter(BullMQAdapter.create({ redis }))\n * ```\n */\n withAdapter(\n adapter: IgniterJobsAdapter\n ): IgniterJobsBuilder<TContext, TQueues, TScope, TActor> {\n return new IgniterJobsBuilder({\n ...this.state,\n adapter,\n })\n }\n\n /**\n * Configure the application context provider (required).\n * This function is called for each job to provide the application context.\n *\n * @param contextFn - Function that returns the application context\n * @returns The builder with context configured\n *\n * @example\n * ```typescript\n * .withContext(() => ({\n * db: prisma,\n * mailer: mailerService,\n * cache: redis,\n * }))\n * ```\n */\n withContext(\n contextFn: () => TContext | Promise<TContext>\n ): IgniterJobsBuilder<TContext, TQueues, TScope, TActor> {\n return new IgniterJobsBuilder({\n ...this.state,\n context: contextFn,\n })\n }\n\n /**\n * Add a queue to the jobs instance.\n *\n * @param queue - Queue configuration from IgniterQueue.create().build()\n * @returns The builder with the queue added\n *\n * @example\n * ```typescript\n * const emailQueue = IgniterQueue.create<AppContext>('email')\n * .addJob('sendWelcome', { ... })\n * .build()\n *\n * const jobs = IgniterJobs.create<AppContext>()\n * .addQueue(emailQueue)\n * .build()\n * ```\n */\n addQueue<\n TQueueState extends IgniterQueueBuilderState<TContext, any, any>,\n >(\n queue: TQueueState\n ): IgniterJobsBuilder<\n TContext,\n TQueues & { [K in TQueueState['name']]: TQueueState },\n TScope,\n TActor\n > {\n const queueName = queue.name\n\n if (queueName in this.state.queues) {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_ALREADY_EXISTS',\n message: `Queue \"${queueName}\" has already been added`,\n statusCode: 400,\n details: { queue: queueName },\n })\n }\n\n return new IgniterJobsBuilder({\n ...this.state,\n queues: {\n ...this.state.queues,\n [queueName]: queue,\n },\n } as IgniterJobsBuilderState<\n TContext,\n TQueues & { [K in TQueueState['name']]: TQueueState },\n TScope,\n TActor\n >)\n }\n\n /**\n * Add a scope for multi-tenancy (only one scope allowed).\n * Scopes are used to isolate jobs by organization, tenant, etc.\n *\n * @param key - Scope key (e.g., 'organization', 'tenant')\n * @param options - Optional scope configuration\n * @returns The builder with scope configured\n *\n * @example\n * ```typescript\n * .addScope('organization', { required: true })\n * ```\n */\n addScope<TScopeKey extends string>(\n key: TScope extends never ? TScopeKey : never,\n options?: IgniterJobScopeOptions\n ): IgniterJobsBuilder<TContext, TQueues, TScopeKey, TActor> {\n if (this.state.scope) {\n throw new IgniterJobsError({\n code: 'JOBS_SCOPE_ALREADY_DEFINED',\n message: `Scope \"${this.state.scope.key}\" is already defined. Only one scope is allowed.`,\n statusCode: 400,\n details: { existingScope: this.state.scope.key, newScope: key },\n })\n }\n\n return new IgniterJobsBuilder({\n ...this.state,\n scope: { key, options },\n } as unknown as IgniterJobsBuilderState<TContext, TQueues, TScopeKey, TActor>)\n }\n\n /**\n * Add an actor for auditing (only one actor type allowed).\n * Actors are used to track who initiated jobs.\n *\n * @param key - Actor key (e.g., 'user', 'system')\n * @param options - Optional actor configuration\n * @returns The builder with actor configured\n *\n * @example\n * ```typescript\n * .addActor('user', { description: 'The user who initiated the job' })\n * ```\n */\n addActor<TActorKey extends string>(\n key: TActor extends never ? TActorKey : never,\n options?: IgniterJobActorOptions\n ): IgniterJobsBuilder<TContext, TQueues, TScope, TActorKey> {\n if (this.state.actor) {\n throw new IgniterJobsError({\n code: 'JOBS_ACTOR_ALREADY_DEFINED',\n message: `Actor \"${this.state.actor.key}\" is already defined. Only one actor is allowed.`,\n statusCode: 400,\n details: { existingActor: this.state.actor.key, newActor: key },\n })\n }\n\n return new IgniterJobsBuilder({\n ...this.state,\n actor: { key, options },\n } as unknown as IgniterJobsBuilderState<TContext, TQueues, TScope, TActorKey>)\n }\n\n /**\n * Configure telemetry for observability (optional).\n *\n * @param telemetry - IgniterTelemetry instance\n * @returns The builder with telemetry configured\n *\n * @example\n * ```typescript\n * .withTelemetry(telemetry)\n * ```\n */\n withTelemetry(\n telemetry: IgniterTelemetry\n ): IgniterJobsBuilder<TContext, TQueues, TScope, TActor> {\n return new IgniterJobsBuilder({\n ...this.state,\n telemetry,\n })\n }\n\n /**\n * Configure a custom logger (optional).\n *\n * @param logger - Logger instance\n * @returns The builder with logger configured\n *\n * @example\n * ```typescript\n * .withLogger(customLogger)\n * ```\n */\n withLogger(\n logger: IgniterLogger\n ): IgniterJobsBuilder<TContext, TQueues, TScope, TActor> {\n return new IgniterJobsBuilder({\n ...this.state,\n logger,\n })\n }\n\n /**\n * Configure default job options applied to all jobs.\n *\n * @param defaults - Default job configuration\n * @returns The builder with defaults configured\n *\n * @example\n * ```typescript\n * .withDefaults({\n * retry: { attempts: 3, backoff: { type: 'exponential', delay: 1000 } },\n * timeout: 30000,\n * removeOnComplete: { count: 1000 },\n * })\n * ```\n */\n withDefaults(defaults: {\n retry?: {\n attempts?: number\n backoff?: {\n type: 'exponential' | 'fixed' | 'linear'\n delay: number\n maxDelay?: number\n }\n }\n timeout?: number\n removeOnComplete?: boolean | { count?: number; age?: number }\n removeOnFail?: boolean | { count?: number; age?: number }\n }): IgniterJobsBuilder<TContext, TQueues, TScope, TActor> {\n return new IgniterJobsBuilder({\n ...this.state,\n defaults,\n })\n }\n\n /**\n * Build the IgniterJobs instance.\n * Validates configuration and returns a fully typed jobs instance.\n *\n * @returns The IgniterJobs instance with proxy for typed access\n *\n * @throws {IgniterJobsError} If adapter is not configured\n * @throws {IgniterJobsError} If context is not configured\n * @throws {IgniterJobsError} If no queues are defined\n *\n * @example\n * ```typescript\n * const jobs = IgniterJobs.create<AppContext>()\n * .withAdapter(adapter)\n * .withContext(() => context)\n * .addQueue(emailQueue)\n * .build()\n *\n * // Now use with full type safety\n * await jobs.email.sendWelcome.dispatch({ userId: '123' })\n * ```\n */\n build(): IgniterJobsInstance<TContext, TQueues, TScope, TActor> {\n // Validate required configuration\n if (!this.state.adapter) {\n throw new IgniterJobsError({\n code: 'JOBS_ADAPTER_REQUIRED',\n message: 'Adapter is required. Use .withAdapter() to configure.',\n statusCode: 400,\n })\n }\n\n if (!this.state.context) {\n throw new IgniterJobsError({\n code: 'JOBS_CONTEXT_REQUIRED',\n message: 'Context provider is required. Use .withContext() to configure.',\n statusCode: 400,\n })\n }\n\n if (Object.keys(this.state.queues).length === 0) {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_REQUIRED',\n message: 'At least one queue is required. Use .addQueue() to add queues.',\n statusCode: 400,\n })\n }\n\n // Create the runtime instance\n return new IgniterJobsRuntime<TContext, TQueues, TScope, TActor>(\n this.state as Required<Pick<typeof this.state, 'adapter' | 'context'>> & typeof this.state\n ) as unknown as IgniterJobsInstance<TContext, TQueues, TScope, TActor>\n }\n}\n\n/**\n * Type for the built IgniterJobs instance.\n * Provides typed access to queues, jobs, and management APIs.\n */\nexport type IgniterJobsInstance<\n TContext,\n TQueues extends Record<string, IgniterQueueBuilderState<TContext, any, any>>,\n TScope extends string,\n TActor extends string,\n> = {\n // Queue proxies (jobs.email.sendWelcome.dispatch(...))\n [QueueName in keyof TQueues]: IgniterQueueProxy<\n TContext,\n TQueues[QueueName]['jobs'],\n TQueues[QueueName]['crons'],\n TScope,\n TActor\n >\n} & {\n // Global subscribe\n subscribe: IgniterJobsGlobalSubscribe\n\n // Global search\n search: IgniterJobsSearch\n\n // Worker builder\n worker: IgniterJobsWorkerBuilder<TQueues>\n\n // Shutdown\n shutdown: () => Promise<void>\n}\n\n/**\n * Queue proxy type providing access to jobs and queue management.\n */\nexport type IgniterQueueProxy<\n TContext,\n TJobs extends Record<string, IgniterJobDefinition<TContext, any, any>>,\n TCrons extends Record<string, IgniterCronDefinition<TContext, any>>,\n TScope extends string,\n TActor extends string,\n> = {\n // Job proxies (jobs.email.sendWelcome)\n [JobName in keyof TJobs]: IgniterJobProxy<\n TContext,\n TJobs[JobName] extends IgniterJobDefinition<TContext, infer TInput, infer TOutput>\n ? TInput\n : unknown,\n TJobs[JobName] extends IgniterJobDefinition<TContext, infer TInput, infer TOutput>\n ? TOutput\n : unknown,\n TScope,\n TActor\n >\n} & {\n // Queue-level subscribe\n subscribe: (handler: (event: any) => void | Promise<void>) => Promise<() => Promise<void>>\n\n // Queue-level list\n list: (options?: { status?: string[]; limit?: number }) => Promise<any[]>\n\n // Queue management via .get()\n get: () => IgniterQueueManagement\n}\n\n/**\n * Job proxy type providing dispatch, schedule, and job management.\n */\nexport interface IgniterJobProxy<\n TContext,\n TInput,\n TOutput,\n TScope extends string,\n TActor extends string,\n> {\n // Dispatch job\n dispatch: IgniterJobDispatch<TInput, TScope, TActor>\n\n // Schedule job\n schedule: IgniterJobSchedule<TInput, TScope, TActor>\n\n // Get specific job by ID\n get: (jobId: string) => IgniterJobManagement\n\n // Batch operations\n many: (jobIds: string[]) => IgniterJobBatchManagement\n\n // Pause/Resume this job type\n pause: () => Promise<void>\n resume: () => Promise<void>\n\n // Subscribe to events for this job type\n subscribe: (handler: (event: any) => void | Promise<void>) => Promise<() => Promise<void>>\n}\n\n/**\n * Job dispatch function type.\n */\nexport type IgniterJobDispatch<TInput, TScope extends string, TActor extends string> = (\n input: TInput,\n options?: IgniterJobDispatchOptions<TScope, TActor>\n) => Promise<string>\n\n/**\n * Job dispatch options.\n */\nexport interface IgniterJobDispatchOptions<TScope extends string, TActor extends string> {\n jobId?: string\n delay?: number\n priority?: number\n scope?: TScope extends never ? never : { id: string; tags?: Record<string, string | number | boolean> }\n actor?: TActor extends never ? never : { id?: string; tags?: Record<string, string | number | boolean> }\n}\n\n/**\n * Job schedule function type.\n */\nexport type IgniterJobSchedule<TInput, TScope extends string, TActor extends string> = (params: {\n input: TInput\n at?: Date\n cron?: string\n every?: number\n timezone?: string\n jobId?: string\n scope?: TScope extends never ? never : { id: string; tags?: Record<string, string | number | boolean> }\n actor?: TActor extends never ? never : { id?: string; tags?: Record<string, string | number | boolean> }\n}) => Promise<string>\n\n/**\n * Single job management operations.\n */\nexport interface IgniterJobManagement {\n retrieve: () => Promise<any>\n retry: () => Promise<void>\n remove: () => Promise<void>\n state: () => Promise<string | null>\n progress: () => Promise<number>\n logs: () => Promise<any[]>\n promote: () => Promise<void>\n move: (state: 'failed' | 'completed', reason?: string) => Promise<void>\n}\n\n/**\n * Batch job management operations.\n */\nexport interface IgniterJobBatchManagement {\n retry: () => Promise<void>\n remove: () => Promise<void>\n}\n\n/**\n * Queue management operations.\n */\nexport interface IgniterQueueManagement {\n retrieve: () => Promise<any>\n pause: () => Promise<void>\n resume: () => Promise<void>\n drain: () => Promise<number>\n clean: (options: { status: string | string[]; olderThan?: number; limit?: number }) => Promise<number>\n obliterate: (options?: { force?: boolean }) => Promise<void>\n retryAll: () => Promise<number>\n}\n\n/**\n * Global subscribe function.\n */\nexport type IgniterJobsGlobalSubscribe = (\n handler: (event: any) => void | Promise<void>\n) => Promise<() => Promise<void>>\n\n/**\n * Search function.\n */\nexport interface IgniterJobsSearch {\n (target: 'queues', filter?: any): Promise<any[]>\n (target: 'jobs', filter?: any): Promise<any[]>\n (target: 'workers', filter?: any): Promise<any[]>\n}\n\n/**\n * Worker builder interface.\n */\nexport interface IgniterJobsWorkerBuilder<TQueues> {\n create: () => IgniterJobsWorkerConfig<TQueues>\n}\n\n/**\n * Worker configuration builder.\n */\nexport interface IgniterJobsWorkerConfig<TQueues> {\n forQueues: (...queues: (keyof TQueues)[]) => IgniterJobsWorkerConfig<TQueues>\n withConcurrency: (concurrency: number) => IgniterJobsWorkerConfig<TQueues>\n withLockDuration: (duration: number) => IgniterJobsWorkerConfig<TQueues>\n withLimiter: (config: { max: number; duration: number }) => IgniterJobsWorkerConfig<TQueues>\n onIdle: (callback: () => void) => IgniterJobsWorkerConfig<TQueues>\n start: () => Promise<any>\n}\n\n/**\n * Convenience alias for IgniterJobsBuilder.create().\n *\n * @example\n * ```typescript\n * import { IgniterJobs } from '@igniter-js/jobs'\n *\n * const jobs = IgniterJobs.create<AppContext>()\n * .withAdapter(adapter)\n * .withContext(() => context)\n * .addQueue(emailQueue)\n * .build()\n * ```\n */\nexport const IgniterJobs = {\n create: IgniterJobsBuilder.create,\n}\n","/**\n * @fileoverview Builder for creating IgniterQueue instances\n * @module @igniter-js/jobs/builders/igniter-queue\n *\n * @description\n * Provides a fluent builder API for defining queues with jobs and cron jobs.\n * Queues group related jobs together and provide type-safe job definitions.\n *\n * @example\n * ```typescript\n * import { IgniterQueue } from '@igniter-js/jobs'\n * import { z } from 'zod'\n *\n * const emailQueue = IgniterQueue.create<AppContext>('email')\n * .addJob('sendWelcome', {\n * input: z.object({\n * userId: z.string(),\n * email: z.string().email(),\n * }),\n * retry: { attempts: 3 },\n * handler: async (ctx) => {\n * await ctx.context.mailer.send({\n * to: ctx.input.email,\n * template: 'welcome',\n * })\n * },\n * })\n * .addCron('cleanupExpired', {\n * expression: '0 0 * * *',\n * handler: async (ctx) => {\n * await ctx.context.db.cleanup.expiredSessions()\n * },\n * })\n * .build()\n * ```\n */\n\nimport type { StandardSchemaV1 } from '@igniter-js/core'\nimport type {\n IgniterJobDefinition,\n IgniterCronDefinition,\n IgniterQueueBuilderState,\n} from '../types'\nimport { IgniterJobsError } from '../errors'\n\n/**\n * Validates a queue name.\n */\nfunction validateQueueName(name: string): void {\n if (!name || typeof name !== 'string') {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_NAME_INVALID',\n message: 'Queue name must be a non-empty string',\n statusCode: 400,\n })\n }\n\n if (!/^[a-z][a-z0-9-]*$/.test(name)) {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_NAME_INVALID',\n message: `Queue name \"${name}\" must start with a lowercase letter and contain only lowercase letters, numbers, and hyphens`,\n statusCode: 400,\n details: { name },\n })\n }\n}\n\n/**\n * Validates a job name.\n */\nfunction validateJobName(name: string): void {\n if (!name || typeof name !== 'string') {\n throw new IgniterJobsError({\n code: 'JOBS_JOB_NAME_INVALID',\n message: 'Job name must be a non-empty string',\n statusCode: 400,\n })\n }\n\n if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(name)) {\n throw new IgniterJobsError({\n code: 'JOBS_JOB_NAME_INVALID',\n message: `Job name \"${name}\" must start with a letter and contain only letters and numbers (camelCase recommended)`,\n statusCode: 400,\n details: { name },\n })\n }\n}\n\n/**\n * Builder for creating queue configurations.\n *\n * @typeParam TContext - Application context type\n * @typeParam TJobs - Map of job names to definitions\n * @typeParam TCrons - Map of cron names to definitions\n */\nexport class IgniterQueueBuilder<\n TContext = unknown,\n TJobs extends Record<string, IgniterJobDefinition<TContext, any, any>> = Record<string, never>,\n TCrons extends Record<string, IgniterCronDefinition<TContext, any>> = Record<string, never>,\n> {\n private readonly state: IgniterQueueBuilderState<TContext, TJobs, TCrons>\n\n private constructor(state: IgniterQueueBuilderState<TContext, TJobs, TCrons>) {\n this.state = state\n }\n\n /**\n * Create a new queue builder.\n *\n * @param name - Queue name (kebab-case, e.g., 'email', 'payment-processing')\n * @returns A new IgniterQueueBuilder instance\n *\n * @example\n * ```typescript\n * const emailQueue = IgniterQueue.create<AppContext>('email')\n * ```\n */\n static create<TContext = unknown>(name: string): IgniterQueueBuilder<TContext> {\n validateQueueName(name)\n\n return new IgniterQueueBuilder<TContext>({\n name,\n jobs: {} as Record<string, never>,\n crons: {} as Record<string, never>,\n })\n }\n\n /**\n * Add a job definition to the queue.\n *\n * @param name - Job name (camelCase, e.g., 'sendWelcome', 'processPayment')\n * @param definition - Job definition with input schema, handler, retry config, etc.\n * @returns The builder with the new job added\n *\n * @example\n * ```typescript\n * .addJob('sendWelcome', {\n * input: z.object({\n * userId: z.string(),\n * email: z.string().email(),\n * }),\n * retry: { attempts: 3, backoff: { type: 'exponential', delay: 1000 } },\n * handler: async (ctx) => {\n * await ctx.context.mailer.send({\n * to: ctx.input.email,\n * template: 'welcome',\n * })\n * },\n * })\n * ```\n */\n addJob<\n TName extends string,\n TInput,\n TOutput = void,\n >(\n name: TName extends keyof TJobs ? never : TName,\n definition: IgniterJobDefinition<TContext, TInput, TOutput>\n ): IgniterQueueBuilder<\n TContext,\n TJobs & { [K in TName]: IgniterJobDefinition<TContext, TInput, TOutput> },\n TCrons\n > {\n validateJobName(name)\n\n if (name in this.state.jobs) {\n throw new IgniterJobsError({\n code: 'JOBS_JOB_ALREADY_EXISTS',\n message: `Job \"${name}\" already exists in queue \"${this.state.name}\"`,\n statusCode: 400,\n details: { queue: this.state.name, job: name },\n })\n }\n\n if (!definition.handler || typeof definition.handler !== 'function') {\n throw new IgniterJobsError({\n code: 'JOBS_JOB_HANDLER_REQUIRED',\n message: `Job \"${name}\" must have a handler function`,\n statusCode: 400,\n details: { queue: this.state.name, job: name },\n })\n }\n\n return new IgniterQueueBuilder({\n ...this.state,\n jobs: {\n ...this.state.jobs,\n [name]: definition,\n },\n } as IgniterQueueBuilderState<\n TContext,\n TJobs & { [K in TName]: IgniterJobDefinition<TContext, TInput, TOutput> },\n TCrons\n >)\n }\n\n /**\n * Add a cron job definition to the queue.\n *\n * @param name - Cron job name (camelCase)\n * @param definition - Cron definition with expression, handler, etc.\n * @returns The builder with the new cron added\n *\n * @example\n * ```typescript\n * .addCron('cleanupExpired', {\n * expression: '0 0 * * *', // Every day at midnight\n * timezone: 'America/New_York',\n * handler: async (ctx) => {\n * await ctx.context.db.cleanup.expiredSessions()\n * },\n * })\n * ```\n */\n addCron<TName extends string, TOutput = void>(\n name: TName extends keyof TCrons ? never : TName,\n definition: IgniterCronDefinition<TContext, TOutput>\n ): IgniterQueueBuilder<\n TContext,\n TJobs,\n TCrons & { [K in TName]: IgniterCronDefinition<TContext, TOutput> }\n > {\n validateJobName(name)\n\n if (name in this.state.crons) {\n throw new IgniterJobsError({\n code: 'JOBS_CRON_ALREADY_EXISTS',\n message: `Cron \"${name}\" already exists in queue \"${this.state.name}\"`,\n statusCode: 400,\n details: { queue: this.state.name, cron: name },\n })\n }\n\n if (!definition.expression || typeof definition.expression !== 'string') {\n throw new IgniterJobsError({\n code: 'JOBS_CRON_EXPRESSION_INVALID',\n message: `Cron \"${name}\" must have a valid expression`,\n statusCode: 400,\n details: { queue: this.state.name, cron: name },\n })\n }\n\n if (!definition.handler || typeof definition.handler !== 'function') {\n throw new IgniterJobsError({\n code: 'JOBS_CRON_HANDLER_REQUIRED',\n message: `Cron \"${name}\" must have a handler function`,\n statusCode: 400,\n details: { queue: this.state.name, cron: name },\n })\n }\n\n return new IgniterQueueBuilder({\n ...this.state,\n crons: {\n ...this.state.crons,\n [name]: definition,\n },\n } as IgniterQueueBuilderState<\n TContext,\n TJobs,\n TCrons & { [K in TName]: IgniterCronDefinition<TContext, TOutput> }\n >)\n }\n\n /**\n * Build the queue configuration.\n *\n * @returns The queue configuration ready to be registered with IgniterJobs\n *\n * @example\n * ```typescript\n * const emailQueue = IgniterQueue.create<AppContext>('email')\n * .addJob('sendWelcome', { ... })\n * .build()\n * ```\n */\n build(): IgniterQueueBuilderState<TContext, TJobs, TCrons> {\n return { ...this.state }\n }\n}\n\n/**\n * Convenience alias for IgniterQueueBuilder.create().\n * Use this to create queue configurations with a fluent API.\n *\n * @example\n * ```typescript\n * import { IgniterQueue } from '@igniter-js/jobs'\n *\n * const emailQueue = IgniterQueue.create<AppContext>('email')\n * .addJob('sendWelcome', { ... })\n * .build()\n * ```\n */\nexport const IgniterQueue = {\n create: IgniterQueueBuilder.create,\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@igniter-js/jobs",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Type-safe background job processing library for Igniter.js with BullMQ support, typed queues, cron jobs, and distributed management APIs",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"README.md",
|
|
11
|
+
"CHANGELOG.md",
|
|
12
|
+
"AGENTS.md"
|
|
13
|
+
],
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js",
|
|
18
|
+
"require": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./adapters": {
|
|
21
|
+
"types": "./dist/adapters/index.d.ts",
|
|
22
|
+
"import": "./dist/adapters/index.mjs",
|
|
23
|
+
"require": "./dist/adapters/index.cjs"
|
|
24
|
+
},
|
|
25
|
+
"./adapters/*": {
|
|
26
|
+
"types": "./dist/adapters/*.d.ts",
|
|
27
|
+
"import": "./dist/adapters/*.mjs",
|
|
28
|
+
"require": "./dist/adapters/*.cjs"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"dev": "tsup --watch",
|
|
33
|
+
"build": "tsup",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"test:watch": "vitest",
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"lint": "eslint src",
|
|
38
|
+
"clean": "rm -rf dist"
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"igniter",
|
|
42
|
+
"igniterjs",
|
|
43
|
+
"jobs",
|
|
44
|
+
"queue",
|
|
45
|
+
"background",
|
|
46
|
+
"bullmq",
|
|
47
|
+
"redis",
|
|
48
|
+
"cron",
|
|
49
|
+
"worker",
|
|
50
|
+
"distributed",
|
|
51
|
+
"typescript",
|
|
52
|
+
"type-safe"
|
|
53
|
+
],
|
|
54
|
+
"author": "Felipe Barcelos <felipebarcelospro@gmail.com>",
|
|
55
|
+
"license": "MIT",
|
|
56
|
+
"repository": {
|
|
57
|
+
"type": "git",
|
|
58
|
+
"url": "https://github.com/felipebarcelospro/igniter-js.git",
|
|
59
|
+
"directory": "packages/jobs"
|
|
60
|
+
},
|
|
61
|
+
"bugs": {
|
|
62
|
+
"url": "https://github.com/felipebarcelospro/igniter-js/issues"
|
|
63
|
+
},
|
|
64
|
+
"homepage": "https://igniterjs.com/docs/jobs",
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@igniter-js/core": "*",
|
|
67
|
+
"@igniter-js/telemetry": "*",
|
|
68
|
+
"bullmq": "^5.0.0",
|
|
69
|
+
"ioredis": "^5.3.2",
|
|
70
|
+
"tsup": "^8.3.5",
|
|
71
|
+
"typescript": "^5.6.3",
|
|
72
|
+
"vitest": "^2.1.4",
|
|
73
|
+
"zod": "^4.2.0"
|
|
74
|
+
},
|
|
75
|
+
"peerDependencies": {
|
|
76
|
+
"@igniter-js/core": "*",
|
|
77
|
+
"@igniter-js/telemetry": "*",
|
|
78
|
+
"bullmq": ">=4.0.0",
|
|
79
|
+
"ioredis": ">=5.0.0",
|
|
80
|
+
"zod": ">=3.0.0"
|
|
81
|
+
},
|
|
82
|
+
"peerDependenciesMeta": {
|
|
83
|
+
"@igniter-js/telemetry": {
|
|
84
|
+
"optional": true
|
|
85
|
+
},
|
|
86
|
+
"bullmq": {
|
|
87
|
+
"optional": true
|
|
88
|
+
},
|
|
89
|
+
"zod": {
|
|
90
|
+
"optional": true
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|