@igniter-js/jobs 0.1.0 → 0.1.1
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 +115 -541
- package/CHANGELOG.md +5 -0
- package/README.md +118 -356
- package/dist/adapter-PiDCQWQd.d.mts +529 -0
- package/dist/adapter-PiDCQWQd.d.ts +529 -0
- package/dist/adapters/bullmq.adapter.d.mts +55 -110
- package/dist/adapters/bullmq.adapter.d.ts +55 -110
- package/dist/adapters/bullmq.adapter.js +431 -529
- package/dist/adapters/bullmq.adapter.js.map +1 -1
- package/dist/adapters/bullmq.adapter.mjs +431 -529
- package/dist/adapters/bullmq.adapter.mjs.map +1 -1
- package/dist/adapters/index.d.mts +3 -3
- package/dist/adapters/index.d.ts +3 -3
- package/dist/adapters/index.js +889 -960
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/index.mjs +888 -959
- package/dist/adapters/index.mjs.map +1 -1
- package/dist/adapters/memory.adapter.d.mts +52 -98
- package/dist/adapters/memory.adapter.d.ts +52 -98
- package/dist/adapters/memory.adapter.js +471 -473
- package/dist/adapters/memory.adapter.js.map +1 -1
- package/dist/adapters/memory.adapter.mjs +471 -473
- package/dist/adapters/memory.adapter.mjs.map +1 -1
- package/dist/index.d.mts +485 -958
- package/dist/index.d.ts +485 -958
- package/dist/index.js +2053 -917
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2051 -917
- package/dist/index.mjs.map +1 -1
- package/package.json +34 -16
- package/dist/adapter-CcQCatSa.d.mts +0 -1411
- package/dist/adapter-CcQCatSa.d.ts +0 -1411
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/errors/igniter-jobs.error.ts","../../src/adapters/bullmq.adapter.ts"],"names":["IgniterError"],"mappings":"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","file":"bullmq.adapter.js","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 BullMQ adapter for @igniter-js/jobs\n * @module @igniter-js/jobs/adapters/bullmq\n *\n * @description\n * Provides BullMQ-based implementation of the IgniterJobsAdapter interface.\n * Requires Redis connection via ioredis.\n *\n * @example\n * ```typescript\n * import { BullMQAdapter } from '@igniter-js/jobs/adapters'\n * import Redis from 'ioredis'\n *\n * const redis = new Redis()\n * const adapter = BullMQAdapter.create({ redis })\n *\n * const jobs = IgniterJobs.create<AppContext>()\n * .withAdapter(adapter)\n * .build()\n * ```\n */\n\nimport type { Redis } from 'ioredis'\nimport type {\n Queue,\n Worker,\n Job,\n QueueEvents,\n JobsOptions,\n WorkerOptions,\n} from 'bullmq'\nimport type {\n IgniterJobsAdapter,\n AdapterDispatchParams,\n AdapterScheduleParams,\n AdapterWorkerConfig,\n AdapterWorkerHandle,\n AdapterJobHandler,\n IgniterJobInfo,\n IgniterJobStatus,\n IgniterJobCounts,\n IgniterJobLog,\n IgniterQueueInfo,\n IgniterQueueCleanOptions,\n IgniterJobSearchResult,\n IgniterJobEventHandler,\n IgniterJobUnsubscribeFn,\n} from '../types'\nimport { IgniterJobsError } from '../errors'\n\n/**\n * BullMQ adapter options.\n */\nexport interface BullMQAdapterOptions {\n /**\n * Redis connection (ioredis instance).\n */\n redis: Redis\n}\n\n/**\n * BullMQ implementation of IgniterJobsAdapter.\n */\nexport class BullMQAdapter implements IgniterJobsAdapter {\n private readonly redis: Redis\n private readonly queues: Map<string, Queue> = new Map()\n private readonly workers: Map<string, Worker> = new Map()\n private readonly queueEvents: Map<string, QueueEvents> = new Map()\n private BullMQ: typeof import('bullmq') | null = null\n\n private constructor(options: BullMQAdapterOptions) {\n this.redis = options.redis\n }\n\n /**\n * Create a new BullMQ adapter.\n *\n * @param options - Adapter options with Redis connection\n * @returns A new BullMQAdapter instance\n */\n static create(options: BullMQAdapterOptions): BullMQAdapter {\n return new BullMQAdapter(options)\n }\n\n /**\n * Get the underlying Redis client.\n */\n get client(): Redis {\n return this.redis\n }\n\n /**\n * Lazily load BullMQ module.\n */\n private async getBullMQ(): Promise<typeof import('bullmq')> {\n if (!this.BullMQ) {\n this.BullMQ = await import('bullmq')\n }\n return this.BullMQ\n }\n\n /**\n * Get or create a queue instance.\n */\n private async getOrCreateQueue(name: string): Promise<Queue> {\n if (!this.queues.has(name)) {\n const { Queue } = await this.getBullMQ()\n const queue = new Queue(name, {\n connection: this.redis,\n })\n this.queues.set(name, queue)\n }\n return this.queues.get(name)!\n }\n\n /**\n * Get or create queue events instance.\n */\n private async getQueueEvents(name: string): Promise<QueueEvents> {\n if (!this.queueEvents.has(name)) {\n const { QueueEvents } = await this.getBullMQ()\n const events = new QueueEvents(name, {\n connection: this.redis,\n })\n this.queueEvents.set(name, events)\n }\n return this.queueEvents.get(name)!\n }\n\n /**\n * Convert BullMQ job state to IgniterJobStatus.\n */\n private mapJobState(state: string): IgniterJobStatus {\n const stateMap: Record<string, IgniterJobStatus> = {\n waiting: 'waiting',\n active: 'active',\n completed: 'completed',\n failed: 'failed',\n delayed: 'delayed',\n paused: 'paused',\n 'waiting-children': 'waiting',\n }\n return stateMap[state] || 'waiting'\n }\n\n /**\n * Convert BullMQ job to IgniterJobInfo.\n */\n private async mapJobToInfo(job: Job): Promise<IgniterJobInfo> {\n const data = job.data as Record<string, unknown>\n const state = await job.getState()\n\n return {\n id: job.id!,\n name: job.name,\n queue: job.queueName,\n state: this.mapJobState(state || 'waiting'),\n data: data.input ?? data,\n result: job.returnvalue,\n error: job.failedReason,\n progress: typeof job.progress === 'number' ? job.progress : 0,\n attempts: job.attemptsMade,\n timestamp: job.timestamp,\n processedOn: job.processedOn,\n finishedOn: job.finishedOn,\n delay: job.delay,\n priority: job.opts?.priority,\n scope: data.scope as any,\n actor: data.actor as any,\n metadata: data.metadata as any,\n }\n }\n\n // ==========================================\n // JOB OPERATIONS\n // ==========================================\n\n async dispatch(params: AdapterDispatchParams): Promise<string> {\n const queue = await this.getOrCreateQueue(params.queue)\n\n const jobOptions: JobsOptions = {\n jobId: params.jobId,\n delay: params.delay,\n priority: params.priority,\n attempts: params.attempts ?? 3,\n backoff: params.backoff ? {\n type: params.backoff.type === 'custom' ? 'fixed' : params.backoff.type,\n delay: params.backoff.type === 'custom'\n ? params.backoff.delays[0]\n : params.backoff.delay,\n } : undefined,\n removeOnComplete: params.removeOnComplete,\n removeOnFail: params.removeOnFail,\n }\n\n const jobData = {\n input: params.data,\n scope: params.scope,\n actor: params.actor,\n }\n\n const job = await queue.add(params.name, jobData, jobOptions)\n return job.id!\n }\n\n async schedule(params: AdapterScheduleParams): Promise<string> {\n const queue = await this.getOrCreateQueue(params.queue)\n\n const jobOptions: JobsOptions = {\n jobId: params.jobId,\n delay: params.at ? params.at.getTime() - Date.now() : params.delay,\n priority: params.priority,\n attempts: params.attempts ?? 3,\n backoff: params.backoff ? {\n type: params.backoff.type === 'custom' ? 'fixed' : params.backoff.type,\n delay: params.backoff.type === 'custom'\n ? params.backoff.delays[0]\n : params.backoff.delay,\n } : undefined,\n removeOnComplete: params.removeOnComplete,\n removeOnFail: params.removeOnFail,\n repeat: params.cron ? {\n pattern: params.cron,\n tz: params.timezone,\n } : params.every ? {\n every: params.every,\n } : undefined,\n }\n\n const jobData = {\n input: params.data,\n scope: params.scope,\n actor: params.actor,\n }\n\n const job = await queue.add(params.name, jobData, jobOptions)\n return job.id!\n }\n\n async getJob(queue: string, jobId: string): Promise<IgniterJobInfo | null> {\n const q = await this.getOrCreateQueue(queue)\n const job = await q.getJob(jobId)\n\n if (!job) return null\n return await this.mapJobToInfo(job)\n }\n\n async getJobState(queue: string, jobId: string): Promise<IgniterJobStatus | null> {\n const q = await this.getOrCreateQueue(queue)\n const job = await q.getJob(jobId)\n\n if (!job) return null\n const state = await job.getState()\n return this.mapJobState(state)\n }\n\n async getJobProgress(queue: string, jobId: string): Promise<number> {\n const q = await this.getOrCreateQueue(queue)\n const job = await q.getJob(jobId)\n\n if (!job) return 0\n return typeof job.progress === 'number' ? job.progress : 0\n }\n\n async getJobLogs(queue: string, jobId: string): Promise<IgniterJobLog[]> {\n const q = await this.getOrCreateQueue(queue)\n const job = await q.getJob(jobId)\n\n if (!job) return []\n\n const { logs } = await q.getJobLogs(jobId)\n return logs.map((log, index) => ({\n timestamp: new Date(),\n message: log,\n level: 'info' as const,\n }))\n }\n\n async retryJob(queue: string, jobId: string): Promise<void> {\n const q = await this.getOrCreateQueue(queue)\n const job = await q.getJob(jobId)\n\n if (!job) {\n throw new IgniterJobsError({\n code: 'JOBS_JOB_NOT_FOUND',\n message: `Job \"${jobId}\" not found in queue \"${queue}\"`,\n statusCode: 404,\n })\n }\n\n await job.retry()\n }\n\n async removeJob(queue: string, jobId: string): Promise<void> {\n const q = await this.getOrCreateQueue(queue)\n const job = await q.getJob(jobId)\n\n if (!job) return\n await job.remove()\n }\n\n async promoteJob(queue: string, jobId: string): Promise<void> {\n const q = await this.getOrCreateQueue(queue)\n const job = await q.getJob(jobId)\n\n if (!job) {\n throw new IgniterJobsError({\n code: 'JOBS_JOB_NOT_FOUND',\n message: `Job \"${jobId}\" not found in queue \"${queue}\"`,\n statusCode: 404,\n })\n }\n\n await job.promote()\n }\n\n async moveJob(\n queue: string,\n jobId: string,\n state: 'failed' | 'completed',\n reason?: string\n ): Promise<void> {\n const q = await this.getOrCreateQueue(queue)\n const job = await q.getJob(jobId)\n\n if (!job) {\n throw new IgniterJobsError({\n code: 'JOBS_JOB_NOT_FOUND',\n message: `Job \"${jobId}\" not found in queue \"${queue}\"`,\n statusCode: 404,\n })\n }\n\n if (state === 'failed') {\n await job.moveToFailed(new Error(reason || 'Manually moved to failed'), 'manual')\n } else {\n await job.moveToCompleted(reason || 'Manually completed', 'manual')\n }\n }\n\n async retryJobs(queue: string, jobIds: string[]): Promise<void> {\n const q = await this.getOrCreateQueue(queue)\n\n await Promise.all(\n jobIds.map(async (jobId) => {\n const job = await q.getJob(jobId)\n if (job) await job.retry()\n })\n )\n }\n\n async removeJobs(queue: string, jobIds: string[]): Promise<void> {\n const q = await this.getOrCreateQueue(queue)\n\n await Promise.all(\n jobIds.map(async (jobId) => {\n const job = await q.getJob(jobId)\n if (job) await job.remove()\n })\n )\n }\n\n // ==========================================\n // QUEUE OPERATIONS\n // ==========================================\n\n async getQueue(queue: string): Promise<IgniterQueueInfo> {\n const q = await this.getOrCreateQueue(queue)\n const isPaused = await q.isPaused()\n const counts = await q.getJobCounts()\n\n return {\n name: queue,\n isPaused,\n jobCounts: {\n waiting: counts.waiting || 0,\n active: counts.active || 0,\n completed: counts.completed || 0,\n failed: counts.failed || 0,\n delayed: counts.delayed || 0,\n paused: counts.paused || 0,\n },\n }\n }\n\n async pauseQueue(queue: string): Promise<void> {\n const q = await this.getOrCreateQueue(queue)\n await q.pause()\n }\n\n async resumeQueue(queue: string): Promise<void> {\n const q = await this.getOrCreateQueue(queue)\n await q.resume()\n }\n\n async drainQueue(queue: string): Promise<number> {\n const q = await this.getOrCreateQueue(queue)\n await q.drain()\n return 0 // BullMQ drain doesn't return count\n }\n\n async cleanQueue(queue: string, options: IgniterQueueCleanOptions): Promise<number> {\n const q = await this.getOrCreateQueue(queue)\n const statuses = Array.isArray(options.status) ? options.status : [options.status]\n\n let total = 0\n for (const status of statuses) {\n const cleaned = await q.clean(\n options.olderThan ?? 0,\n options.limit ?? 1000,\n status as any\n )\n total += cleaned.length\n }\n\n return total\n }\n\n async obliterateQueue(queue: string, options?: { force?: boolean }): Promise<void> {\n const q = await this.getOrCreateQueue(queue)\n await q.obliterate({ force: options?.force })\n }\n\n async retryAllFailed(queue: string): Promise<number> {\n const q = await this.getOrCreateQueue(queue)\n const failed = await q.getFailed()\n\n await Promise.all(failed.map((job) => job.retry()))\n return failed.length\n }\n\n async getJobCounts(queue: string): Promise<IgniterJobCounts> {\n const q = await this.getOrCreateQueue(queue)\n const counts = await q.getJobCounts()\n\n return {\n waiting: counts.waiting || 0,\n active: counts.active || 0,\n completed: counts.completed || 0,\n failed: counts.failed || 0,\n delayed: counts.delayed || 0,\n paused: counts.paused || 0,\n }\n }\n\n async listJobs(\n queue: string,\n options?: { status?: IgniterJobStatus[]; start?: number; end?: number }\n ): Promise<IgniterJobSearchResult[]> {\n const q = await this.getOrCreateQueue(queue)\n const statuses = options?.status || ['waiting', 'active', 'completed', 'failed', 'delayed']\n\n const jobs: Job[] = []\n\n for (const status of statuses) {\n const statusJobs = await q.getJobs([status], options?.start, options?.end)\n jobs.push(...statusJobs)\n }\n\n return Promise.all(jobs.map(async (job) => {\n const data = job.data as Record<string, unknown>\n const state = await job.getState()\n return {\n id: job.id!,\n name: job.name,\n queue: job.queueName,\n state: this.mapJobState(state || 'waiting'),\n data: data.input ?? data,\n result: job.returnvalue,\n error: job.failedReason,\n progress: typeof job.progress === 'number' ? job.progress : 0,\n attempts: job.attemptsMade,\n timestamp: job.timestamp,\n processedOn: job.processedOn,\n finishedOn: job.finishedOn,\n scope: data.scope as any,\n actor: data.actor as any,\n }\n }))\n }\n\n // ==========================================\n // PAUSE/RESUME JOB TYPES\n // ==========================================\n\n async pauseJobType(queue: string, jobName: string): Promise<void> {\n // BullMQ doesn't support pausing specific job types\n // This would require custom implementation using a \"paused jobs\" set\n this.config?.logger?.warn?.(`pauseJobType is not fully supported in BullMQ adapter`)\n }\n\n async resumeJobType(queue: string, jobName: string): Promise<void> {\n // BullMQ doesn't support resuming specific job types\n this.config?.logger?.warn?.(`resumeJobType is not fully supported in BullMQ adapter`)\n }\n\n private config?: { logger?: { warn?: (msg: string) => void } }\n\n // ==========================================\n // EVENTS\n // ==========================================\n\n async subscribe(\n pattern: string,\n handler: IgniterJobEventHandler\n ): Promise<IgniterJobUnsubscribeFn> {\n // For simplicity, subscribe to all queue events\n // In production, you'd want more sophisticated pattern matching\n const subscriptions: Array<() => Promise<void>> = []\n\n for (const [queueName] of this.queues) {\n const events = await this.getQueueEvents(queueName)\n\n const completedHandler = async (args: any) => {\n if (this.matchesPattern(pattern, `${queueName}:${args.jobId}:completed`)) {\n await handler({\n type: 'completed',\n data: args,\n timestamp: new Date().toISOString(),\n })\n }\n }\n\n const failedHandler = async (args: any) => {\n if (this.matchesPattern(pattern, `${queueName}:${args.jobId}:failed`)) {\n await handler({\n type: 'failed',\n data: args,\n timestamp: new Date().toISOString(),\n })\n }\n }\n\n events.on('completed', completedHandler)\n events.on('failed', failedHandler)\n\n subscriptions.push(async () => {\n events.off('completed', completedHandler)\n events.off('failed', failedHandler)\n })\n }\n\n return async () => {\n await Promise.all(subscriptions.map((unsub) => unsub()))\n }\n }\n\n private matchesPattern(pattern: string, eventType: string): boolean {\n if (pattern === '*') return true\n\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n )\n return regex.test(eventType)\n }\n\n // ==========================================\n // WORKERS\n // ==========================================\n\n async createWorker(\n config: AdapterWorkerConfig,\n handler: AdapterJobHandler\n ): Promise<AdapterWorkerHandle> {\n const { Worker } = await this.getBullMQ()\n\n const workerId = `worker-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n const workers: Worker[] = []\n\n for (const queueName of config.queues) {\n const workerOptions: WorkerOptions = {\n connection: this.redis,\n concurrency: config.concurrency,\n lockDuration: config.lockDuration,\n limiter: config.limiter,\n }\n\n const worker = new Worker(\n queueName,\n async (job) => {\n const data = job.data as Record<string, unknown>\n\n return handler({\n id: job.id!,\n name: job.name,\n queue: job.queueName,\n data: data.input ?? data,\n attempt: job.attemptsMade + 1,\n timestamp: job.timestamp,\n scope: data.scope as any,\n actor: data.actor as any,\n log: async (level, message) => {\n await job.log(`[${level.toUpperCase()}] ${message}`)\n },\n updateProgress: async (progress) => {\n await job.updateProgress(progress)\n },\n })\n },\n workerOptions\n )\n\n if (config.onIdle) {\n worker.on('drained', config.onIdle)\n }\n\n workers.push(worker)\n this.workers.set(`${workerId}-${queueName}`, worker)\n }\n\n let isPaused = false\n const startTime = Date.now()\n let processed = 0\n let failed = 0\n let completed = 0\n\n // Track metrics\n for (const worker of workers) {\n worker.on('completed', () => {\n processed++\n completed++\n })\n worker.on('failed', () => {\n processed++\n failed++\n })\n }\n\n return {\n id: workerId,\n\n pause: async () => {\n await Promise.all(workers.map((w) => w.pause()))\n isPaused = true\n },\n\n resume: async () => {\n await Promise.all(workers.map((w) => w.resume()))\n isPaused = false\n },\n\n close: async () => {\n await Promise.all(workers.map((w) => w.close()))\n for (const worker of workers) {\n const key = Array.from(this.workers.entries()).find(\n ([_, w]) => w === worker\n )?.[0]\n if (key) this.workers.delete(key)\n }\n },\n\n isRunning: () => !isPaused && workers.every((w) => w.isRunning()),\n\n isPaused: () => isPaused,\n\n getMetrics: async () => ({\n processed,\n failed,\n completed,\n active: workers.reduce((sum, w) => sum + (w.isRunning() ? 1 : 0), 0),\n uptime: Date.now() - startTime,\n }),\n }\n }\n\n // ==========================================\n // SEARCH\n // ==========================================\n\n async searchJobs(filter: {\n status?: IgniterJobStatus[]\n queue?: string\n jobName?: string\n scopeId?: string\n actorId?: string\n dateRange?: { from?: Date; to?: Date }\n orderBy?: string\n limit?: number\n offset?: number\n }): Promise<IgniterJobSearchResult[]> {\n const results: IgniterJobSearchResult[] = []\n const queuesToSearch = filter.queue\n ? [filter.queue]\n : Array.from(this.queues.keys())\n\n for (const queueName of queuesToSearch) {\n const jobs = await this.listJobs(queueName, {\n status: filter.status,\n start: filter.offset,\n end: filter.limit ? (filter.offset || 0) + filter.limit : undefined,\n })\n\n for (const job of jobs) {\n // Apply filters\n if (filter.jobName && job.name !== filter.jobName) continue\n if (filter.scopeId && job.scope?.id !== filter.scopeId) continue\n if (filter.actorId && job.actor?.id !== filter.actorId) continue\n if (filter.dateRange?.from && job.timestamp < filter.dateRange.from.getTime()) continue\n if (filter.dateRange?.to && job.timestamp > filter.dateRange.to.getTime()) continue\n\n results.push(job)\n }\n }\n\n // Apply sorting\n if (filter.orderBy) {\n const [field, direction] = filter.orderBy.split(':')\n results.sort((a, b) => {\n const aVal = field === 'createdAt' ? a.timestamp : (a as any)[field]\n const bVal = field === 'createdAt' ? b.timestamp : (b as any)[field]\n return direction === 'asc' ? aVal - bVal : bVal - aVal\n })\n }\n\n return results.slice(0, filter.limit || 100)\n }\n\n async searchQueues(filter: {\n name?: string\n isPaused?: boolean\n }): Promise<IgniterQueueInfo[]> {\n const results: IgniterQueueInfo[] = []\n\n for (const [queueName, queue] of this.queues) {\n if (filter.name && !queueName.includes(filter.name)) continue\n\n const isPaused = await queue.isPaused()\n if (filter.isPaused !== undefined && isPaused !== filter.isPaused) continue\n\n const counts = await queue.getJobCounts()\n results.push({\n name: queueName,\n isPaused,\n jobCounts: {\n waiting: counts.waiting || 0,\n active: counts.active || 0,\n completed: counts.completed || 0,\n failed: counts.failed || 0,\n delayed: counts.delayed || 0,\n paused: counts.paused || 0,\n },\n })\n }\n\n return results\n }\n\n // ==========================================\n // LIFECYCLE\n // ==========================================\n\n async shutdown(): Promise<void> {\n // Close all workers\n for (const [_, worker] of this.workers) {\n await worker.close()\n }\n this.workers.clear()\n\n // Close all queue events\n for (const [_, events] of this.queueEvents) {\n await events.close()\n }\n this.queueEvents.clear()\n\n // Close all queues\n for (const [_, queue] of this.queues) {\n await queue.close()\n }\n this.queues.clear()\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/prefix.ts","../../src/errors/igniter-jobs.error.ts","../../src/adapters/bullmq.adapter.ts"],"names":["IgniterError","options","createBullMQAdapter"],"mappings":"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","file":"bullmq.adapter.js","sourcesContent":["/**\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","import { IgniterError } from '@igniter-js/core'\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 BullMQ adapter for @igniter-js/jobs (wraps @igniter-js/adapter-bullmq)\n * @module @igniter-js/jobs/adapters/bullmq\n */\n\nimport type { Redis } from 'ioredis'\nimport type {\n AdvancedScheduleOptions,\n IgniterJobQueueAdapter,\n JobsRouter,\n JobDefinition as CoreJobDefinition,\n JobExecutionContext as CoreJobExecutionContext,\n JobWorkerConfig,\n} from '@igniter-js/core'\nimport { createBullMQAdapter } from '@igniter-js/adapter-bullmq'\nimport type {\n IgniterCronDefinition,\n IgniterJobDefinition,\n IgniterJobSearchResult,\n IgniterJobStatus,\n IgniterJobsAdapter,\n IgniterJobsAdapterDispatchParams,\n IgniterJobsAdapterScheduleParams,\n IgniterJobsBullMQAdapterOptions,\n IgniterJobsEventHandler,\n IgniterJobsJobLog,\n IgniterJobsQueueCleanOptions,\n IgniterJobsQueueInfo,\n IgniterJobsQueueManager,\n IgniterJobsWorkerBuilderConfig,\n IgniterJobsWorkerHandle,\n IgniterJobsWorkerMetrics,\n} from '../types'\nimport { IgniterJobsPrefix } from '../utils/prefix'\nimport { IgniterJobsError } from '../errors'\n\ntype CoreMergedExecutor = ReturnType<IgniterJobQueueAdapter<any>['merge']>\n\nfunction toDateArray(values?: Array<string | Date>): Date[] | undefined {\n if (!values) return undefined\n return values.map((v) => (v instanceof Date ? v : new Date(v)))\n}\n\n/**\n * BullMQ adapter facade.\n *\n * It reuses the mature BullMQ integration from `@igniter-js/adapter-bullmq` to keep\n * feature parity (workers, queue/job management, advanced scheduling, hooks).\n */\nexport class IgniterJobsBullMQAdapter implements IgniterJobsAdapter {\n public readonly client: unknown\n\n private readonly redis: Redis\n private readonly publisher: Redis\n private readonly subscriber: Redis\n private readonly subscribers = new Map<string, Set<(payload: any) => void>>()\n\n private coreAdapter: IgniterJobQueueAdapter<any> | null = null\n private coreExecutor: CoreMergedExecutor | null = null\n private executorDirty = true\n\n private readonly jobsByQueue = new Map<string, Map<string, IgniterJobDefinition<any, any, any>>>()\n private readonly cronsByQueue = new Map<string, Map<string, IgniterCronDefinition<any, any>>>()\n\n public readonly queues: IgniterJobsQueueManager\n\n private constructor(options: IgniterJobsBullMQAdapterOptions) {\n this.redis = options.redis\n this.publisher = this.redis\n this.subscriber = this.redis.duplicate()\n this.client = { redis: this.redis }\n\n this.subscriber.on('message', (channel: string, message: string) => {\n const set = this.subscribers.get(channel)\n if (!set || set.size === 0) return\n let payload: any = message\n try {\n payload = JSON.parse(message)\n } catch {\n // ignore, treat as raw\n }\n for (const handler of set) handler(payload)\n })\n\n this.queues = {\n list: async () => this.listQueues(),\n get: async (name) => this.getQueueInfo(name),\n getJobCounts: async (name) => this.getQueueJobCounts(name),\n getJobs: async (name, filter) => {\n const full = this.toCoreQueueName(name)\n return this.core().queues.getJobs(full, filter as any) as any\n },\n pause: async (name) => this.pauseQueue(name),\n resume: async (name) => this.resumeQueue(name),\n isPaused: async (name) => {\n const full = this.toCoreQueueName(name)\n return this.core().queues.isPaused(full)\n },\n drain: async (name) => this.drainQueue(name),\n clean: async (name, options) => this.cleanQueue(name, options),\n obliterate: async (name, options) => this.obliterateQueue(name, options),\n }\n }\n\n public static create(options: IgniterJobsBullMQAdapterOptions): IgniterJobsAdapter {\n return new IgniterJobsBullMQAdapter(options)\n }\n\n public registerJob(queueName: string, jobName: string, definition: IgniterJobDefinition<any, any, any>): void {\n const map = this.jobsByQueue.get(queueName) ?? new Map()\n if (map.has(jobName)) {\n throw new IgniterJobsError({\n code: 'JOBS_DUPLICATE_JOB',\n message: `Job \"${jobName}\" is already registered in queue \"${queueName}\".`,\n })\n }\n map.set(jobName, definition)\n this.jobsByQueue.set(queueName, map)\n this.executorDirty = true\n }\n\n public registerCron(queueName: string, cronName: string, definition: IgniterCronDefinition<any, any>): void {\n const map = this.cronsByQueue.get(queueName) ?? new Map()\n if (map.has(cronName)) {\n throw new IgniterJobsError({\n code: 'JOBS_INVALID_CRON',\n message: `Cron \"${cronName}\" is already registered in queue \"${queueName}\".`,\n })\n }\n map.set(cronName, definition)\n this.cronsByQueue.set(queueName, map)\n this.executorDirty = true\n }\n\n public async dispatch(params: IgniterJobsAdapterDispatchParams): Promise<string> {\n const executor = await this.executor()\n const namespace = (executor as any)[params.queue]\n if (!namespace) {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_NOT_FOUND',\n message: `Queue \"${params.queue}\" is not registered in the adapter.`,\n })\n }\n return namespace.enqueue({\n task: params.jobName,\n input: params.input,\n jobId: params.jobId,\n delay: params.delay,\n priority: params.priority,\n attempts: params.attempts,\n metadata: params.metadata as any,\n removeOnComplete: params.removeOnComplete as any,\n removeOnFail: params.removeOnFail as any,\n limiter: params.limiter as any,\n })\n }\n\n public async schedule(params: IgniterJobsAdapterScheduleParams): Promise<string> {\n const executor = await this.executor()\n const namespace = (executor as any)[params.queue]\n if (!namespace) {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_NOT_FOUND',\n message: `Queue \"${params.queue}\" is not registered in the adapter.`,\n })\n }\n\n const schedule: AdvancedScheduleOptions = {\n jobId: params.jobId,\n delay: params.delay,\n priority: params.priority,\n attempts: params.attempts,\n metadata: params.metadata as any,\n removeOnComplete: params.removeOnComplete as any,\n removeOnFail: params.removeOnFail as any,\n limiter: params.limiter as any,\n at: params.at,\n repeat:\n params.cron ||\n params.every ||\n params.maxExecutions ||\n params.skipWeekends ||\n params.onlyBusinessHours ||\n params.businessHours ||\n params.onlyWeekdays ||\n params.skipDates\n ? {\n cron: params.cron,\n every: params.every,\n times: params.maxExecutions,\n skipWeekends: params.skipWeekends,\n onlyBusinessHours: params.onlyBusinessHours,\n businessHours: params.businessHours,\n onlyWeekdays: params.onlyWeekdays,\n skipDates: toDateArray(params.skipDates),\n }\n : undefined,\n }\n\n return namespace.schedule({\n task: params.jobName,\n input: params.input,\n ...schedule,\n })\n }\n\n public async getJob(jobId: string, queue?: string): Promise<IgniterJobSearchResult | null> {\n const result = await this.core().job.get(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n return result ? this.mapJob(result, queue) : null\n }\n\n public async getJobState(jobId: string, queue?: string): Promise<IgniterJobStatus | null> {\n const state = await this.core().job.getState(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n return state as any\n }\n\n public async getJobLogs(jobId: string, queue?: string): Promise<IgniterJobsJobLog[]> {\n const logs = await this.core().job.getLogs(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n return logs as any\n }\n\n public async getJobProgress(jobId: string, queue?: string): Promise<number> {\n return this.core().job.getProgress(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async retryJob(jobId: string, queue?: string): Promise<void> {\n await this.core().job.retry(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async removeJob(jobId: string, queue?: string): Promise<void> {\n await this.core().job.remove(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async promoteJob(jobId: string, queue?: string): Promise<void> {\n await this.core().job.promote(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async moveJobToFailed(jobId: string, reason: string, queue?: string): Promise<void> {\n await this.core().job.moveToFailed(jobId, reason, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async retryManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await this.core().job.retryMany(jobIds, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async removeManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await this.core().job.removeMany(jobIds, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async getQueueInfo(queue: string): Promise<IgniterJobsQueueInfo | null> {\n const info = await this.core().queues.get(this.toCoreQueueName(queue))\n if (!info) return null\n return this.mapQueueInfo(info)\n }\n\n public async getQueueJobCounts(queue: string): Promise<any> {\n const counts = await this.core().queues.getJobCounts(this.toCoreQueueName(queue))\n return counts as any\n }\n\n public async listQueues(): Promise<IgniterJobsQueueInfo[]> {\n const list = await this.core().queues.list()\n return list.map((q) => this.mapQueueInfo(q))\n }\n\n public async pauseQueue(queue: string): Promise<void> {\n await this.core().queues.pause(this.toCoreQueueName(queue))\n }\n\n public async resumeQueue(queue: string): Promise<void> {\n await this.core().queues.resume(this.toCoreQueueName(queue))\n }\n\n public async drainQueue(queue: string): Promise<number> {\n return this.core().queues.drain(this.toCoreQueueName(queue))\n }\n\n public async cleanQueue(queue: string, options: IgniterJobsQueueCleanOptions): Promise<number> {\n return this.core().queues.clean(this.toCoreQueueName(queue), options as any)\n }\n\n public async obliterateQueue(queue: string, options?: { force?: boolean }): Promise<void> {\n await this.core().queues.obliterate(this.toCoreQueueName(queue), options)\n }\n\n public async retryAllInQueue(queue: string): Promise<number> {\n const jobs = await this.core().queues.getJobs(this.toCoreQueueName(queue), { status: ['failed'], limit: 1000 } as any)\n await Promise.all(jobs.map((j) => this.core().job.retry(j.id, this.toCoreQueueName(queue))))\n return jobs.length\n }\n\n public async pauseJobType(queue: string, jobName: string): Promise<void> {\n void queue\n void jobName\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_OPERATION_FAILED',\n message: 'BullMQ backend does not support pausing a single job type; pause the queue or adjust worker filters.',\n })\n }\n\n public async resumeJobType(queue: string, jobName: string): Promise<void> {\n void queue\n void jobName\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_OPERATION_FAILED',\n message: 'BullMQ backend does not support resuming a single job type; resume the queue or adjust worker filters.',\n })\n }\n\n public async searchJobs(filter: any): Promise<IgniterJobSearchResult[]> {\n // Minimal implementation: list jobs from a specific queue when provided, otherwise aggregate known queues.\n const queue = filter?.queue as string | undefined\n const status = filter?.status as IgniterJobStatus[] | undefined\n const limit = filter?.limit ?? 100\n const offset = filter?.offset ?? 0\n\n if (queue) {\n const jobs = await this.core().queues.getJobs(this.toCoreQueueName(queue), { status, limit, offset } as any)\n return jobs.map((j) => this.mapJob(j as any, queue))\n }\n\n const queues = await this.listQueues()\n const results: IgniterJobSearchResult[] = []\n for (const q of queues) {\n const jobs = await this.core().queues.getJobs(this.toCoreQueueName(q.name), { status, limit, offset } as any)\n results.push(...jobs.map((j) => this.mapJob(j as any, q.name)))\n if (results.length >= limit) break\n }\n return results.slice(0, limit)\n }\n\n public async searchQueues(filter: any): Promise<IgniterJobsQueueInfo[]> {\n const all = await this.listQueues()\n const name = filter?.name as string | undefined\n const isPaused = filter?.isPaused as boolean | undefined\n return all\n .filter((q) => (name ? q.name.includes(name) : true))\n .filter((q) => (typeof isPaused === 'boolean' ? q.isPaused === isPaused : true))\n }\n\n public async searchWorkers(filter: any): Promise<IgniterJobsWorkerHandle[]> {\n const queue = filter?.queue as string | undefined\n const isRunning = filter?.isRunning as boolean | undefined\n\n const all = Array.from(this.core().getWorkers().values())\n return all\n .filter((w) => {\n if (!queue) return true\n const coreQueue = this.toCoreQueueName(queue)\n const queues = (w as any).config?.queues ?? [(w as any).queueName]\n return Array.isArray(queues) ? queues.includes(coreQueue) : false\n })\n .filter((w) => (typeof isRunning === 'boolean' ? (isRunning ? w.isRunning() : !w.isRunning()) : true))\n .map((w) => this.mapWorker(w))\n }\n\n public async createWorker(config: IgniterJobsWorkerBuilderConfig): Promise<IgniterJobsWorkerHandle> {\n // Ensure jobs/crons are registered in the underlying BullMQ adapter before starting workers.\n await this.executor()\n\n const queuesSource =\n config.queues?.length\n ? config.queues\n : Array.from(new Set([...this.jobsByQueue.keys(), ...this.cronsByQueue.keys()]))\n const queues = queuesSource.map((q) => this.toCoreQueueName(q))\n const coreConfig: JobWorkerConfig = {\n queues,\n concurrency: config.concurrency ?? 1,\n limiter: config.limiter as any,\n onActive: config.handlers?.onActive as any,\n onSuccess: config.handlers?.onSuccess as any,\n onFailure: config.handlers?.onFailure as any,\n onIdle: config.handlers?.onIdle as any,\n }\n const handle = await (this.core() as any).worker(coreConfig)\n return this.mapWorker(handle)\n }\n\n public getWorkers(): Map<string, IgniterJobsWorkerHandle> {\n const out = new Map<string, IgniterJobsWorkerHandle>()\n for (const [id, handle] of this.core().getWorkers()) out.set(id, this.mapWorker(handle))\n return out\n }\n\n public async publishEvent(channel: string, payload: unknown): Promise<void> {\n await this.publisher.publish(channel, JSON.stringify(payload))\n }\n\n public async subscribeEvent(channel: string, handler: IgniterJobsEventHandler): Promise<() => Promise<void>> {\n const set = this.subscribers.get(channel) ?? new Set<(payload: any) => void>()\n const wrapped = (payload: any) => void handler(payload as any)\n set.add(wrapped)\n this.subscribers.set(channel, set)\n\n if (set.size === 1) {\n await this.subscriber.subscribe(channel)\n }\n\n return async () => {\n const current = this.subscribers.get(channel)\n if (!current) return\n current.delete(wrapped)\n if (current.size === 0) {\n this.subscribers.delete(channel)\n await this.subscriber.unsubscribe(channel)\n }\n }\n }\n\n public async shutdown(): Promise<void> {\n await this.subscriber.quit()\n // BullMQ adapter does not expose global shutdown on the core adapter in a single method;\n // queue/worker cleanup is handled by worker close and queue obliterate.\n }\n\n private core(): IgniterJobQueueAdapter<any> {\n if (!this.coreAdapter) {\n // We only need the Redis connection. The wrapped job handlers can create real context.\n this.coreAdapter = createBullMQAdapter<any>({\n store: ({ client: this.redis } as any),\n })\n }\n return this.coreAdapter\n }\n\n private async executor(): Promise<CoreMergedExecutor> {\n if (!this.executorDirty && this.coreExecutor) return this.coreExecutor\n\n const routers: Record<string, JobsRouter<any>> = {}\n const flattened: Record<string, CoreJobDefinition<any, any, any>> = {}\n\n const allQueues = new Set<string>([...this.jobsByQueue.keys(), ...this.cronsByQueue.keys()])\n\n for (const queueName of allQueues) {\n const coreJobs: Record<string, CoreJobDefinition<any, any, any>> = {}\n\n const jobs = this.jobsByQueue.get(queueName)\n if (jobs) {\n for (const [jobName, def] of jobs.entries()) {\n const queue = def.queue ? `${queueName}.${def.queue}` : queueName\n const fullQueue = IgniterJobsPrefix.buildQueueName(queue)\n coreJobs[jobName] = this.toCoreJobDefinition(queueName, jobName, def, fullQueue)\n }\n }\n\n const crons = this.cronsByQueue.get(queueName)\n if (crons) {\n for (const [cronName, def] of crons.entries()) {\n const fullQueue = IgniterJobsPrefix.buildQueueName(queueName)\n coreJobs[cronName] = this.toCoreCronJobDefinition(queueName, cronName, def, fullQueue)\n }\n }\n\n if (Object.keys(coreJobs).length === 0) continue\n\n routers[queueName] = this.core().router({\n jobs: coreJobs as any,\n namespace: queueName,\n })\n\n for (const [jobName, def] of Object.entries(coreJobs)) {\n flattened[`${queueName}.${jobName}`] = def\n }\n }\n\n // Register jobs in bulk so management APIs and workers can resolve handlers.\n await this.core().bulkRegister(flattened as any)\n\n this.coreExecutor = this.core().merge(routers as any) as any\n this.executorDirty = false\n return this.coreExecutor as CoreMergedExecutor\n }\n\n private toCoreQueueName(queueName: string): string {\n return IgniterJobsPrefix.buildQueueName(queueName)\n }\n\n private mapQueueInfo(info: any): IgniterJobsQueueInfo {\n return {\n name: this.fromCoreQueueName(info.name),\n isPaused: info.isPaused,\n jobCounts: info.jobCounts,\n }\n }\n\n private fromCoreQueueName(full: string): string {\n const prefix = `${IgniterJobsPrefix.BASE_PREFIX}:`\n return full.startsWith(prefix) ? full.slice(prefix.length) : full\n }\n\n private mapJob(job: any, queue?: string): IgniterJobSearchResult {\n const q = queue ?? this.fromCoreQueueName(job.metadata?.queue ?? job.queueName ?? '')\n const scope = (job.metadata as any)?.__igniter_jobs_scope\n return {\n id: job.id,\n name: job.name,\n queue: q,\n status: job.status,\n input: job.payload,\n result: job.result,\n error: job.error,\n progress: 0,\n attemptsMade: job.attemptsMade ?? 0,\n priority: job.priority ?? 0,\n createdAt: job.createdAt,\n startedAt: job.processedAt,\n completedAt: job.completedAt,\n metadata: job.metadata,\n scope,\n }\n }\n\n private mapWorker(handle: any): IgniterJobsWorkerHandle {\n const queues = (handle as any).config?.queues ?? [(handle as any).queueName]\n return {\n id: handle.id,\n queues: (queues as string[]).map((q) => this.fromCoreQueueName(q)),\n pause: () => handle.pause(),\n resume: () => handle.resume(),\n close: () => handle.close(),\n isRunning: () => handle.isRunning(),\n isPaused: () => handle.isPaused(),\n isClosed: () => handle.isClosed(),\n getMetrics: async () => handle.getMetrics() as IgniterJobsWorkerMetrics,\n }\n }\n\n private toCoreJobDefinition(\n queueName: string,\n jobName: string,\n def: IgniterJobDefinition<any, any, any>,\n fullQueueName: string,\n ): CoreJobDefinition<any, any, any> {\n const handler = async (ctx: CoreJobExecutionContext<any, any>) => {\n return def.handler({\n input: ctx.input as any,\n context: ctx.context as any,\n job: {\n id: ctx.job.id,\n name: jobName,\n queue: queueName,\n attemptsMade: ctx.job.attemptsMade,\n createdAt: (ctx.job as any).createdAt,\n metadata: ctx.job.metadata,\n },\n scope: (ctx.job.metadata as any)?.__igniter_jobs_scope,\n } as any)\n }\n\n return {\n name: jobName,\n input: def.input as any,\n handler,\n queue: { name: fullQueueName },\n attempts: def.attempts,\n priority: def.priority,\n delay: def.delay,\n removeOnComplete: def.removeOnComplete as any,\n removeOnFail: def.removeOnFail as any,\n metadata: def.metadata as any,\n limiter: def.limiter as any,\n onStart: def.onStart as any,\n onSuccess: def.onSuccess as any,\n onFailure: def.onFailure as any,\n onProgress: def.onProgress as any,\n } as any\n }\n\n private toCoreCronJobDefinition(\n queueName: string,\n cronName: string,\n def: IgniterCronDefinition<any, any>,\n fullQueueName: string,\n ): CoreJobDefinition<any, any, any> {\n const handler = async (ctx: CoreJobExecutionContext<any, any>) => {\n return def.handler({\n context: ctx.context as any,\n job: {\n id: ctx.job.id,\n name: cronName,\n queue: queueName,\n attemptsMade: ctx.job.attemptsMade,\n createdAt: (ctx.job as any).createdAt,\n metadata: ctx.job.metadata,\n },\n scope: (ctx.job.metadata as any)?.__igniter_jobs_scope,\n } as any)\n }\n\n return {\n name: cronName,\n handler,\n queue: { name: fullQueueName },\n repeat: {\n cron: def.cron,\n tz: def.tz,\n limit: def.maxExecutions,\n startDate: def.startDate,\n endDate: def.endDate,\n },\n metadata:\n def.onlyBusinessHours || def.skipWeekends || def.businessHours || def.onlyWeekdays || def.skipDates || (def.startDate && def.endDate)\n ? {\n advancedScheduling: {\n onlyBusinessHours: def.onlyBusinessHours,\n skipWeekends: def.skipWeekends,\n businessHours: def.businessHours,\n skipDates: toDateArray(def.skipDates),\n onlyWeekdays: def.onlyWeekdays,\n between: def.startDate && def.endDate ? [def.startDate, def.endDate] : undefined,\n },\n }\n : undefined,\n } as any\n }\n}\n"]}
|