@igniter-js/jobs 0.1.13 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +119 -243
- package/README.md +352 -158
- package/dist/{adapter-CXZxomI9.d.mts → adapter-DDyMVche.d.mts} +125 -20
- package/dist/{adapter-CXZxomI9.d.ts → adapter-DDyMVche.d.ts} +125 -20
- package/dist/adapters/bun.d.mts +101 -0
- package/dist/adapters/bun.d.ts +101 -0
- package/dist/adapters/bun.js +1048 -0
- package/dist/adapters/bun.js.map +1 -0
- package/dist/adapters/bun.mjs +1046 -0
- package/dist/adapters/bun.mjs.map +1 -0
- package/dist/adapters/{memory.adapter.d.ts → mock.d.mts} +7 -3
- package/dist/adapters/{memory.adapter.d.mts → mock.d.ts} +7 -3
- package/dist/adapters/{memory.adapter.js → mock.js} +122 -25
- package/dist/adapters/mock.js.map +1 -0
- package/dist/adapters/{memory.adapter.mjs → mock.mjs} +122 -25
- package/dist/adapters/mock.mjs.map +1 -0
- package/dist/adapters/{bullmq.adapter.d.mts → node.d.mts} +8 -3
- package/dist/adapters/{bullmq.adapter.d.ts → node.d.ts} +8 -3
- package/dist/adapters/{bullmq.adapter.js → node.js} +194 -40
- package/dist/adapters/node.js.map +1 -0
- package/dist/adapters/{bullmq.adapter.mjs → node.mjs} +194 -40
- package/dist/adapters/node.mjs.map +1 -0
- package/dist/index.d.mts +41 -38
- package/dist/index.d.ts +41 -38
- package/dist/index.js +145 -1856
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +146 -1854
- package/dist/index.mjs.map +1 -1
- package/package.json +29 -41
- package/CHANGELOG.md +0 -13
- package/dist/adapters/bullmq.adapter.js.map +0 -1
- package/dist/adapters/bullmq.adapter.mjs.map +0 -1
- package/dist/adapters/index.d.mts +0 -143
- package/dist/adapters/index.d.ts +0 -143
- package/dist/adapters/index.js +0 -1891
- package/dist/adapters/index.js.map +0 -1
- package/dist/adapters/index.mjs +0 -1887
- package/dist/adapters/index.mjs.map +0 -1
- package/dist/adapters/memory.adapter.js.map +0 -1
- package/dist/adapters/memory.adapter.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/id-generator.ts","../../src/errors/jobs.error.ts","../../src/adapters/bun-sqlite.adapter.ts"],"names":["job"],"mappings":"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","file":"bun.mjs","sourcesContent":["/**\n * Generates consistent identifiers for jobs, workers, and schedules.\n */\nexport class IgniterJobsIdGenerator {\n /**\n * Generates a unique identifier with a prefix.\n *\n * @example\n * ```typescript\n * const jobId = IgniterJobsIdGenerator.generate('job')\n * ```\n */\n public static generate(prefix: string): string {\n const now = Date.now().toString(36)\n const random = Math.random().toString(36).slice(2, 8)\n return `${prefix}_${now}_${random}`\n }\n}\n","import { IgniterError } from \"@igniter-js/common\";\n\n/**\n * Canonical error codes for `@igniter-js/jobs`.\n */\nexport const IGNITER_JOBS_ERROR_CODES = {\n JOBS_ADAPTER_REQUIRED: 'JOBS_ADAPTER_REQUIRED',\n JOBS_SERVICE_REQUIRED: 'JOBS_SERVICE_REQUIRED',\n JOBS_CONTEXT_REQUIRED: 'JOBS_CONTEXT_REQUIRED',\n JOBS_CONFIGURATION_INVALID: 'JOBS_CONFIGURATION_INVALID',\n JOBS_QUEUE_NOT_FOUND: 'JOBS_QUEUE_NOT_FOUND',\n JOBS_QUEUE_DUPLICATE: 'JOBS_QUEUE_DUPLICATE',\n JOBS_QUEUE_OPERATION_FAILED: 'JOBS_QUEUE_OPERATION_FAILED',\n JOBS_INVALID_DEFINITION: 'JOBS_INVALID_DEFINITION',\n JOBS_HANDLER_REQUIRED: 'JOBS_HANDLER_REQUIRED',\n JOBS_DUPLICATE_JOB: 'JOBS_DUPLICATE_JOB',\n JOBS_NOT_FOUND: 'JOBS_NOT_FOUND',\n JOBS_NOT_REGISTERED: 'JOBS_NOT_REGISTERED',\n JOBS_EXECUTION_FAILED: 'JOBS_EXECUTION_FAILED',\n JOBS_TIMEOUT: 'JOBS_TIMEOUT',\n JOBS_CONTEXT_FACTORY_FAILED: 'JOBS_CONTEXT_FACTORY_FAILED',\n JOBS_VALIDATION_FAILED: 'JOBS_VALIDATION_FAILED',\n JOBS_INVALID_INPUT: 'JOBS_INVALID_INPUT',\n JOBS_INVALID_CRON: 'JOBS_INVALID_CRON',\n JOBS_INVALID_SCHEDULE: 'JOBS_INVALID_SCHEDULE',\n JOBS_SCOPE_ALREADY_DEFINED: 'JOBS_SCOPE_ALREADY_DEFINED',\n JOBS_WORKER_FAILED: 'JOBS_WORKER_FAILED',\n JOBS_ADAPTER_ERROR: 'JOBS_ADAPTER_ERROR',\n JOBS_ADAPTER_CONNECTION_FAILED: 'JOBS_ADAPTER_CONNECTION_FAILED',\n JOBS_SUBSCRIBE_FAILED: 'JOBS_SUBSCRIBE_FAILED',\n} as const\n\nexport type IgniterJobsErrorCode = keyof typeof IGNITER_JOBS_ERROR_CODES\n\nexport interface IgniterJobsErrorOptions {\n /** Error code scoped to Igniter Jobs. */\n code: IgniterJobsErrorCode\n /** Human-readable message. */\n message: string\n /** HTTP-like status code hint (default: 500). */\n statusCode?: number\n /** Optional structured details for debugging and clients. */\n details?: unknown\n /** Optional metadata for logs and tracing. */\n metadata?: Record<string, unknown>\n /** Optional causer tag used by some Igniter tooling. */\n causer?: string\n /** Underlying cause for debugging (optional). */\n cause?: Error\n /** Optional logger passthrough to align with other Igniter errors. */\n logger?: any\n}\n\n/**\n * Typed error class for the Jobs package.\n *\n * @example\n * ```typescript\n * throw new IgniterJobsError({\n * code: 'JOBS_INVALID_INPUT',\n * message: 'Input payload failed validation',\n * })\n * ```\n */\nexport class IgniterJobsError extends IgniterError {\n constructor(options: IgniterJobsErrorOptions) {\n super(options)\n }\n}\n","/**\n * @fileoverview Bun SQLite adapter for @igniter-js/jobs\n * @module @igniter-js/jobs/adapters/bun-sqlite\n */\n\nimport { mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type {\n Job as BunqueueJob,\n JobOptions as BunqueueJobOptions,\n Queue as BunqueueQueue,\n Worker as BunqueueWorker,\n} from \"bunqueue/client\";\n\nimport type {\n IgniterJobsAdapterJobStreamReadParams,\n IgniterJobsAdapterJobStreamSubscribeParams,\n IgniterJobsAdapterJobStreamWriteParams,\n IgniterCronDefinition,\n IgniterJobCounts,\n IgniterJobDefinition,\n IgniterJobSearchResult,\n IgniterJobStatus,\n IgniterJobsAdapter,\n IgniterJobsAdapterDispatchParams,\n IgniterJobsAdapterScheduleParams,\n IgniterJobsBunSQLiteAdapterOptions,\n IgniterJobsEventHandler,\n IgniterJobsJobLog,\n IgniterJobsQueueCleanOptions,\n IgniterJobsQueueInfo,\n IgniterJobsQueueManager,\n IgniterJobsWorkerBuilderConfig,\n IgniterJobsWorkerHandle,\n IgniterJobsWorkerMetrics,\n IgniterJobsScopeEntry,\n} from \"../types\";\nimport { IgniterJobsIdGenerator } from \"../utils/id-generator\";\nimport { IgniterJobsError } from \"../errors\";\nimport type {\n IgniterJobsJobStreamEvent,\n IgniterJobsJobStreamReadResult,\n} from \"../types/stream\";\n\ntype BunqueueClientModule = typeof import(\"bunqueue/client\");\n\ntype JobsEnvelope = {\n __igniterJobs: true;\n input?: unknown;\n metadata?: Record<string, unknown>;\n scope?: IgniterJobsScopeEntry;\n schedule?: {\n skipWeekends?: boolean;\n onlyBusinessHours?: boolean;\n businessHours?: {\n start: number;\n end: number;\n timezone?: string;\n };\n onlyWeekdays?: number[];\n skipDates?: string[];\n };\n};\n\ntype QueueRuntime = {\n queue: BunqueueQueue<JobsEnvelope>;\n cronsSynced: boolean;\n};\n\ntype WorkerState = {\n id: string;\n queues: string[];\n concurrency: number;\n paused: boolean;\n closed: boolean;\n startedAt: Date;\n activeJobs: Set<string>;\n metrics: {\n processed: number;\n failed: number;\n totalDuration: number;\n };\n workers: Map<string, BunqueueWorker<JobsEnvelope, unknown>>;\n handlers?: IgniterJobsWorkerBuilderConfig[\"handlers\"];\n};\n\ntype StructuredLog = {\n timestamp: string;\n level: \"info\" | \"warn\" | \"error\";\n message: string;\n};\n\ntype SQLiteDatabase = {\n exec(sql: string): void;\n prepare<T = unknown>(\n sql: string,\n ): {\n run(...params: unknown[]): {\n changes: number;\n lastInsertRowid: number | bigint;\n };\n get(...params: unknown[]): T | undefined;\n all(...params: unknown[]): T[];\n };\n close(): void;\n};\n\nconst SUPPORTED_JOB_STATES = new Set([\n \"waiting\",\n \"prioritized\",\n \"delayed\",\n \"active\",\n \"completed\",\n \"failed\",\n \"paused\",\n]);\n\n/**\n * Bun-native SQLite adapter for local, embedded, and desktop workloads.\n */\nexport class IgniterJobsBunSQLiteAdapter implements IgniterJobsAdapter {\n public readonly client: { type: \"bun-sqlite\"; path: string };\n\n public readonly queues: IgniterJobsQueueManager = {\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 this.searchJobs({\n queue: name,\n status: filter?.status,\n limit: filter?.limit,\n offset: filter?.offset,\n }),\n pause: async (name) => this.pauseQueue(name),\n resume: async (name) => this.resumeQueue(name),\n isPaused: async (name) =>\n (await this.getQueueInfo(name))?.isPaused ?? false,\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 private readonly options: Required<IgniterJobsBunSQLiteAdapterOptions>;\n private bunqueueModulePromise: Promise<BunqueueClientModule> | null = null;\n private readonly queueRuntimes = new Map<string, QueueRuntime>();\n private readonly workers = new Map<string, WorkerState>();\n private readonly subscribers = new Map<\n string,\n Set<IgniterJobsEventHandler>\n >();\n private readonly streamSubscribers = new Map<\n string,\n Set<\n (\n event: IgniterJobsJobStreamEvent<string, unknown>,\n ) => void | Promise<void>\n >\n >();\n private readonly registeredJobs = new Map<\n string,\n Map<string, IgniterJobDefinition<any, any, any>>\n >();\n private streamDatabasePromise: Promise<SQLiteDatabase> | null = null;\n private readonly registeredCrons = new Map<\n string,\n Map<string, IgniterCronDefinition<any, any>>\n >();\n\n private constructor(options: IgniterJobsBunSQLiteAdapterOptions) {\n this.options = {\n path: options.path,\n durable: options.durable ?? false,\n heartbeatInterval: options.heartbeatInterval ?? 10_000,\n pollTimeout: options.pollTimeout ?? 0,\n batchSize: options.batchSize ?? 10,\n lockDuration: options.lockDuration ?? 30_000,\n maxStalledCount: options.maxStalledCount ?? 1,\n };\n\n this.client = {\n type: \"bun-sqlite\",\n path: this.options.path,\n };\n }\n\n public static create(\n options: IgniterJobsBunSQLiteAdapterOptions,\n ): IgniterJobsAdapter {\n return new IgniterJobsBunSQLiteAdapter(options);\n }\n\n public registerJob(\n queueName: string,\n jobName: string,\n definition: IgniterJobDefinition<any, any, any>,\n ): void {\n const jobs =\n this.registeredJobs.get(queueName) ??\n new Map<string, IgniterJobDefinition<any, any, any>>();\n\n if (jobs.has(jobName)) {\n throw new IgniterJobsError({\n code: \"JOBS_DUPLICATE_JOB\",\n message: `Job \"${jobName}\" already registered for queue \"${queueName}\".`,\n });\n }\n\n jobs.set(jobName, definition);\n this.registeredJobs.set(queueName, jobs);\n this.markQueueCronsDirty(queueName);\n }\n\n public registerCron(\n queueName: string,\n cronName: string,\n definition: IgniterCronDefinition<any, any>,\n ): void {\n const crons =\n this.registeredCrons.get(queueName) ??\n new Map<string, IgniterCronDefinition<any, any>>();\n\n if (crons.has(cronName)) {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_CRON\",\n message: `Cron \"${cronName}\" already registered for queue \"${queueName}\".`,\n });\n }\n\n crons.set(cronName, definition);\n this.registeredCrons.set(queueName, crons);\n this.markQueueCronsDirty(queueName);\n }\n\n public async dispatch(\n params: IgniterJobsAdapterDispatchParams,\n ): Promise<string> {\n const queue = await this.getQueue(params.queue);\n const job = await queue.add(\n params.jobName,\n this.createEnvelope(params.input, params.metadata, params.scope),\n this.toJobOptions(params),\n );\n\n return job.id;\n }\n\n public async schedule(\n params: IgniterJobsAdapterScheduleParams,\n ): Promise<string> {\n const queue = await this.getQueue(params.queue);\n\n if (params.at) {\n const delay = params.at.getTime() - Date.now();\n if (delay <= 0) {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_SCHEDULE\",\n message: \"Scheduled time must be in the future.\",\n });\n }\n\n const job = await queue.add(\n params.jobName,\n this.createEnvelope(params.input, params.metadata, params.scope),\n this.toJobOptions({ ...params, delay }),\n );\n return job.id;\n }\n\n const scheduleEnvelope = this.createEnvelope(\n params.input,\n params.metadata,\n params.scope,\n params,\n );\n\n if (params.cron || params.every) {\n const job = await queue.add(\n params.jobName,\n scheduleEnvelope,\n this.toJobOptions(params, {\n repeat: {\n pattern: params.cron,\n every: params.every,\n limit: params.maxExecutions,\n tz: params.tz,\n },\n }),\n );\n return job.id;\n }\n\n const job = await queue.add(\n params.jobName,\n scheduleEnvelope,\n this.toJobOptions(params),\n );\n return job.id;\n }\n\n public async getJob(\n jobId: string,\n queue?: string,\n ): Promise<IgniterJobSearchResult | null> {\n if (queue) {\n const job = await this.getQueue(queue).then((q) => q.getJob(jobId));\n return job ? this.mapJob(job, queue) : null;\n }\n\n for (const queueName of await this.getAllQueueNames()) {\n const job = await this.getQueue(queueName).then((q) => q.getJob(jobId));\n if (job) return this.mapJob(job, queueName);\n }\n\n return null;\n }\n\n public async getJobState(\n jobId: string,\n queue?: string,\n ): Promise<IgniterJobStatus | null> {\n const job = await this.getJob(jobId, queue);\n return job?.status ?? null;\n }\n\n public async getJobLogs(\n jobId: string,\n queue?: string,\n ): Promise<IgniterJobsJobLog[]> {\n const queueName = queue ?? (await this.findQueueByJobId(jobId));\n if (!queueName) return [];\n\n const logs = await this.getQueue(queueName).then((q) =>\n q.getJobLogs(jobId),\n );\n\n return logs.logs.map((entry) => this.parseLogEntry(entry));\n }\n\n public async getJobProgress(jobId: string, queue?: string): Promise<number> {\n const job = await this.getJob(jobId, queue);\n return job?.progress ?? 0;\n }\n\n public async retryJob(jobId: string, queue?: string): Promise<void> {\n const job = await this.requireJob(jobId, queue);\n await job.retry();\n }\n\n public async removeJob(jobId: string, queue?: string): Promise<void> {\n const job = await this.requireJob(jobId, queue);\n await job.remove();\n }\n\n public async promoteJob(jobId: string, queue?: string): Promise<void> {\n const job = await this.requireJob(jobId, queue);\n await job.promote();\n }\n\n public async moveJobToFailed(\n jobId: string,\n reason: string,\n queue?: string,\n ): Promise<void> {\n const queueName = queue ?? (await this.findQueueByJobId(jobId));\n if (!queueName) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found.`,\n });\n }\n\n await this.getQueue(queueName).then((q) =>\n q.moveJobToFailed(jobId, new Error(reason)),\n );\n }\n\n public async retryManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await Promise.all(jobIds.map((jobId) => this.retryJob(jobId, queue)));\n }\n\n public async removeManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await Promise.all(jobIds.map((jobId) => this.removeJob(jobId, queue)));\n }\n\n public async getQueueInfo(\n queue: string,\n ): Promise<IgniterJobsQueueInfo | null> {\n const counts = await this.getQueueJobCounts(queue);\n return {\n name: queue,\n isPaused: await this.getQueue(queue).then((q) => q.isPausedAsync()),\n jobCounts: counts,\n };\n }\n\n public async getQueueJobCounts(queue: string): Promise<IgniterJobCounts> {\n const counts = await this.getQueue(queue).then((q) =>\n q.getJobCountsAsync(),\n );\n return {\n waiting: counts.waiting + counts.prioritized,\n active: counts.active,\n completed: counts.completed,\n failed: counts.failed,\n delayed: counts.delayed,\n paused: counts.paused,\n };\n }\n\n public async listQueues(): Promise<IgniterJobsQueueInfo[]> {\n const queueNames = await this.getAllQueueNames();\n return Promise.all(\n queueNames.map((queueName) => this.getQueueInfo(queueName)),\n ).then((queues) => queues.filter(Boolean) as IgniterJobsQueueInfo[]);\n }\n\n public async pauseQueue(queue: string): Promise<void> {\n const queueClient = await this.getQueue(queue);\n queueClient.pause();\n for (const worker of this.workers.values()) {\n if (worker.workers.has(queue)) {\n worker.paused = true;\n worker.workers.get(queue)?.pause();\n }\n }\n }\n\n public async resumeQueue(queue: string): Promise<void> {\n const queueClient = await this.getQueue(queue);\n queueClient.resume();\n for (const worker of this.workers.values()) {\n if (worker.workers.has(queue)) {\n worker.paused = false;\n worker.workers.get(queue)?.resume();\n }\n }\n }\n\n public async drainQueue(queue: string): Promise<number> {\n const queueClient = await this.getQueue(queue);\n const before = await this.getQueueJobCounts(queue);\n queueClient.drain();\n const after = await this.getQueueJobCounts(queue);\n return Math.max(\n 0,\n before.waiting +\n before.delayed +\n before.paused -\n after.waiting -\n after.delayed -\n after.paused,\n );\n }\n\n public async cleanQueue(\n queue: string,\n options: IgniterJobsQueueCleanOptions,\n ): Promise<number> {\n const statuses = Array.isArray(options.status)\n ? options.status\n : [options.status];\n\n let cleaned = 0;\n const queueClient = await this.getQueue(queue);\n for (const status of statuses) {\n const removed = await queueClient.cleanAsync(\n options.olderThan ?? 0,\n options.limit ?? 1_000,\n this.toBunqueueStatus(status),\n );\n cleaned += removed.length;\n }\n\n return cleaned;\n }\n\n public async obliterateQueue(\n queue: string,\n _options?: { force?: boolean },\n ): Promise<void> {\n const queueClient = await this.getQueue(queue);\n queueClient.obliterate();\n this.registeredJobs.delete(queue);\n this.registeredCrons.delete(queue);\n this.queueRuntimes.delete(queue);\n }\n\n public async retryAllInQueue(queue: string): Promise<number> {\n const queueClient = await this.getQueue(queue);\n const failedJobs = await queueClient.getFailedAsync(0, 10_000);\n await queueClient.retryJobs({\n state: \"failed\",\n count: failedJobs.length || 10_000,\n });\n return failedJobs.length;\n }\n\n public async searchJobs(\n filter: Record<string, unknown>,\n ): Promise<IgniterJobSearchResult[]> {\n const queueName = filter.queue as string | undefined;\n const statuses = filter.status as IgniterJobStatus[] | undefined;\n const limit = (filter.limit as number | undefined) ?? 100;\n const offset = (filter.offset as number | undefined) ?? 0;\n\n const queueNames = queueName ? [queueName] : await this.getAllQueueNames();\n const mappedStates = statuses?.flatMap((status) =>\n this.toBunqueueStates(status),\n );\n const results: IgniterJobSearchResult[] = [];\n\n for (const currentQueue of queueNames) {\n const queueClient = await this.getQueue(currentQueue);\n const jobs = await queueClient.getJobsAsync({\n state: mappedStates,\n start: 0,\n end: offset + limit - 1,\n });\n\n for (const job of jobs) {\n results.push(\n await this.mapJob(job as BunqueueJob<JobsEnvelope>, currentQueue),\n );\n }\n }\n\n return results.slice(offset, offset + limit);\n }\n\n public async searchQueues(\n filter: Record<string, unknown>,\n ): Promise<IgniterJobsQueueInfo[]> {\n const queues = await this.listQueues();\n const name = filter.name as string | undefined;\n const isPaused = filter.isPaused as boolean | undefined;\n\n return queues\n .filter((queue) => (name ? queue.name.includes(name) : true))\n .filter((queue) =>\n typeof isPaused === \"boolean\" ? queue.isPaused === isPaused : true,\n );\n }\n\n public async searchWorkers(\n filter: Record<string, unknown>,\n ): Promise<IgniterJobsWorkerHandle[]> {\n const queue = filter.queue as string | undefined;\n const isRunning = filter.isRunning as boolean | undefined;\n\n return Array.from(this.workers.values())\n .filter((worker) => (queue ? worker.queues.includes(queue) : true))\n .filter((worker) =>\n typeof isRunning === \"boolean\"\n ? isRunning\n ? !worker.closed && !worker.paused\n : worker.closed || worker.paused\n : true,\n )\n .map((worker) => this.toWorkerHandle(worker));\n }\n\n public async createWorker(\n config: IgniterJobsWorkerBuilderConfig,\n ): Promise<IgniterJobsWorkerHandle> {\n const bunqueue = await this.loadBunqueue();\n const queueNames = config.queues.length\n ? config.queues\n : await this.getAllQueueNames();\n\n const workerId = IgniterJobsIdGenerator.generate(\"worker\");\n const workerState: WorkerState = {\n id: workerId,\n queues: [...queueNames],\n concurrency: config.concurrency ?? 1,\n paused: false,\n closed: false,\n startedAt: new Date(),\n activeJobs: new Set<string>(),\n metrics: { processed: 0, failed: 0, totalDuration: 0 },\n workers: new Map(),\n handlers: config.handlers,\n };\n\n const perQueueConcurrency = this.distributeConcurrency(\n workerState.concurrency,\n queueNames,\n );\n\n for (const queueName of queueNames) {\n await this.getQueue(queueName);\n await this.syncCronSchedulers(queueName);\n\n const worker = new bunqueue.Worker<JobsEnvelope, unknown>(\n queueName,\n async (job) => this.processJob(workerState, queueName, job),\n {\n embedded: true,\n dataPath: this.options.path,\n autorun: false,\n concurrency: perQueueConcurrency.get(queueName) ?? 1,\n heartbeatInterval: this.options.heartbeatInterval,\n batchSize: this.options.batchSize,\n pollTimeout: this.options.pollTimeout,\n lockDuration: this.options.lockDuration,\n maxStalledCount: this.options.maxStalledCount,\n limiter: config.limiter\n ? { max: config.limiter.max, duration: config.limiter.duration }\n : undefined,\n },\n );\n\n this.attachWorkerEvents(workerState, queueName, worker);\n worker.run();\n workerState.workers.set(queueName, worker);\n }\n\n this.workers.set(workerId, workerState);\n return this.toWorkerHandle(workerState);\n }\n\n public getWorkers(): Map<string, IgniterJobsWorkerHandle> {\n return new Map(\n Array.from(this.workers.entries()).map(([id, worker]) => [\n id,\n this.toWorkerHandle(worker),\n ]),\n );\n }\n\n public async publishEvent(channel: string, payload: unknown): Promise<void> {\n const handlers = this.subscribers.get(channel);\n if (!handlers) return;\n\n await Promise.all(\n Array.from(handlers).map(async (handler) => handler(payload as never)),\n );\n }\n\n public async subscribeEvent(\n channel: string,\n handler: IgniterJobsEventHandler,\n ): Promise<() => Promise<void>> {\n const handlers =\n this.subscribers.get(channel) ?? new Set<IgniterJobsEventHandler>();\n handlers.add(handler);\n this.subscribers.set(channel, handlers);\n\n return async () => {\n const current = this.subscribers.get(channel);\n if (!current) return;\n current.delete(handler);\n if (current.size === 0) this.subscribers.delete(channel);\n };\n }\n\n public async writeJobStreamEvent(\n params: IgniterJobsAdapterJobStreamWriteParams,\n ): Promise<string> {\n const key = this.getStreamKey(params.queue, params.jobId);\n let eventId = String(Date.now());\n\n if (params.persistence?.enabled) {\n const db = await this.getStreamDatabase();\n const result = db\n .prepare(\n `\n INSERT INTO igniter_jobs_stream_events (\n queue, job_id, job_name, type, data, timestamp, scope\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `,\n )\n .run(\n params.queue,\n params.jobId,\n params.jobName,\n params.event.type,\n JSON.stringify(params.event.data),\n params.event.timestamp.toISOString(),\n params.scope ? JSON.stringify(params.scope) : null,\n );\n\n eventId = String(result.lastInsertRowid);\n\n const maxEvents = params.persistence.maxEvents;\n if (typeof maxEvents === \"number\" && maxEvents > 0) {\n db.prepare(\n `\n DELETE FROM igniter_jobs_stream_events\n WHERE id IN (\n SELECT id FROM igniter_jobs_stream_events\n WHERE queue = ? AND job_id = ?\n ORDER BY id DESC\n LIMIT -1 OFFSET ?\n )\n `,\n ).run(params.queue, params.jobId, maxEvents);\n }\n }\n\n const event: IgniterJobsJobStreamEvent<string, unknown> = {\n ...params.event,\n id: eventId,\n };\n\n const handlers = this.streamSubscribers.get(key);\n if (handlers?.size) {\n await Promise.all(\n Array.from(handlers).map(async (handler) => handler(event)),\n );\n }\n\n return eventId;\n }\n\n public async readJobStream(\n params: IgniterJobsAdapterJobStreamReadParams,\n ): Promise<\n IgniterJobsJobStreamReadResult<IgniterJobsJobStreamEvent<string, unknown>>\n > {\n const db = await this.getStreamDatabase();\n const after = params.after ? Number(params.after) : 0;\n const limit = params.limit ?? 100;\n const rows = db\n .prepare<{\n id: number;\n type: string;\n data: string;\n timestamp: string;\n job_id: string;\n job_name: string;\n queue: string;\n scope: string | null;\n }>(\n `\n SELECT id, type, data, timestamp, job_id, job_name, queue, scope\n FROM igniter_jobs_stream_events\n WHERE queue = ? AND job_id = ? AND id > ?\n ORDER BY id ASC\n LIMIT ?\n `,\n )\n .all(params.queue, params.jobId, after, limit + 1);\n\n const hasMore = rows.length > limit;\n const items = rows.slice(0, limit).map((row) => this.mapStreamRow(row));\n return {\n items,\n nextCursor: items.at(-1)?.id,\n hasMore,\n };\n }\n\n public async subscribeJobStream(\n params: IgniterJobsAdapterJobStreamSubscribeParams,\n ): Promise<() => Promise<void>> {\n const key = this.getStreamKey(params.queue, params.jobId);\n const set = this.streamSubscribers.get(key) ?? new Set();\n set.add(params.handler);\n this.streamSubscribers.set(key, set);\n\n return async () => {\n const current = this.streamSubscribers.get(key);\n if (!current) return;\n current.delete(params.handler);\n if (current.size === 0) this.streamSubscribers.delete(key);\n };\n }\n\n public async shutdown(): Promise<void> {\n for (const worker of this.workers.values()) {\n await this.closeWorkerState(worker);\n }\n this.workers.clear();\n\n for (const runtime of this.queueRuntimes.values()) {\n runtime.queue.close();\n }\n this.queueRuntimes.clear();\n this.subscribers.clear();\n this.streamSubscribers.clear();\n\n if (this.streamDatabasePromise) {\n const db = await this.streamDatabasePromise;\n db.close();\n this.streamDatabasePromise = null;\n }\n\n if (this.bunqueueModulePromise) {\n const bunqueue = await this.bunqueueModulePromise;\n bunqueue.shutdownManager();\n }\n }\n\n private async loadBunqueue(): Promise<BunqueueClientModule> {\n if (typeof (globalThis as { Bun?: unknown }).Bun === \"undefined\") {\n throw new IgniterJobsError({\n code: \"JOBS_ADAPTER_ERROR\",\n message:\n \"The Bun SQLite adapter can only run inside Bun. Use the BullMQ adapter in Node.js runtimes.\",\n });\n }\n\n this.bunqueueModulePromise ??= import(\"bunqueue/client\");\n return this.bunqueueModulePromise;\n }\n\n private async getStreamDatabase(): Promise<SQLiteDatabase> {\n this.streamDatabasePromise ??= (async () => {\n await mkdir(dirname(this.options.path), { recursive: true });\n const sqlite = await import(\"bun:sqlite\");\n const db = new sqlite.Database(this.options.path, {\n create: true,\n }) as SQLiteDatabase;\n\n db.exec(`\n CREATE TABLE IF NOT EXISTS igniter_jobs_stream_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n queue TEXT NOT NULL,\n job_id TEXT NOT NULL,\n job_name TEXT NOT NULL,\n type TEXT NOT NULL,\n data TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n scope TEXT\n );\n CREATE INDEX IF NOT EXISTS idx_igniter_jobs_stream_events_job\n ON igniter_jobs_stream_events(queue, job_id, id);\n `);\n\n return db;\n })();\n\n return this.streamDatabasePromise;\n }\n\n private async getQueue(\n queueName: string,\n ): Promise<BunqueueQueue<JobsEnvelope>> {\n const existing = this.queueRuntimes.get(queueName);\n if (existing) return existing.queue;\n\n const bunqueue = await this.loadBunqueue();\n await mkdir(dirname(this.options.path), { recursive: true });\n const queue = new bunqueue.Queue<JobsEnvelope>(queueName, {\n embedded: true,\n dataPath: this.options.path,\n defaultJobOptions: {\n durable: this.options.durable,\n },\n });\n\n await queue.waitUntilReady();\n this.queueRuntimes.set(queueName, { queue, cronsSynced: false });\n return queue;\n }\n\n private async getAllQueueNames(): Promise<string[]> {\n return Array.from(\n new Set([\n ...this.registeredJobs.keys(),\n ...this.registeredCrons.keys(),\n ...this.queueRuntimes.keys(),\n ]),\n );\n }\n\n private markQueueCronsDirty(queueName: string): void {\n const runtime = this.queueRuntimes.get(queueName);\n if (runtime) runtime.cronsSynced = false;\n }\n\n private async syncCronSchedulers(queueName: string): Promise<void> {\n const runtime = this.queueRuntimes.get(queueName);\n if (!runtime || runtime.cronsSynced) return;\n\n const cronDefinitions = this.registeredCrons.get(queueName) ?? new Map();\n const existing = await runtime.queue.getJobSchedulers(0, 10_000);\n const existingIds = new Set(existing.map((scheduler) => scheduler.id));\n\n for (const [cronName, definition] of cronDefinitions.entries()) {\n await runtime.queue.upsertJobScheduler(\n cronName,\n {\n pattern: definition.cron,\n limit: definition.maxExecutions,\n timezone: definition.tz,\n },\n {\n name: cronName,\n data: this.createEnvelope(\n undefined,\n undefined,\n undefined,\n definition,\n ),\n opts: { durable: this.options.durable },\n },\n );\n existingIds.delete(cronName);\n }\n\n for (const schedulerId of existingIds) {\n await runtime.queue.removeJobScheduler(schedulerId);\n }\n\n runtime.cronsSynced = true;\n }\n\n private createEnvelope(\n input?: unknown,\n metadata?: Record<string, unknown>,\n scope?: IgniterJobsScopeEntry,\n scheduleSource?:\n | IgniterJobsAdapterScheduleParams\n | IgniterCronDefinition<any, any>,\n ): JobsEnvelope {\n return {\n __igniterJobs: true,\n input,\n metadata,\n scope,\n schedule: scheduleSource\n ? {\n skipWeekends: scheduleSource.skipWeekends,\n onlyBusinessHours: scheduleSource.onlyBusinessHours,\n businessHours: scheduleSource.businessHours,\n onlyWeekdays: scheduleSource.onlyWeekdays,\n skipDates: scheduleSource.skipDates?.map((value) =>\n value instanceof Date ? value.toISOString() : value,\n ),\n }\n : undefined,\n };\n }\n\n private toJobOptions(\n params: IgniterJobsAdapterDispatchParams | IgniterJobsAdapterScheduleParams,\n overrides?: Partial<BunqueueJobOptions>,\n ): BunqueueJobOptions {\n return {\n jobId: params.jobId,\n priority: params.priority,\n delay: params.delay,\n attempts: params.attempts,\n removeOnComplete: params.removeOnComplete,\n removeOnFail: params.removeOnFail,\n durable: this.options.durable,\n ...overrides,\n };\n }\n\n private async processJob(\n workerState: WorkerState,\n queueName: string,\n job: BunqueueJob<JobsEnvelope>,\n ): Promise<unknown> {\n const envelope = this.normalizeEnvelope(job.data);\n\n if (!this.shouldExecuteScheduledJob(envelope.schedule, new Date())) {\n await this.writeLog(\n queueName,\n job.id,\n \"info\",\n \"Scheduled run skipped by adapter rules.\",\n );\n return { skipped: true };\n }\n\n const registeredJob = this.registeredJobs.get(queueName)?.get(job.name);\n if (registeredJob) {\n return this.processRegisteredDefinition(\n workerState,\n queueName,\n job,\n envelope,\n registeredJob,\n );\n }\n\n const registeredCron = this.registeredCrons.get(queueName)?.get(job.name);\n if (registeredCron) {\n return this.processRegisteredCron(\n queueName,\n job,\n envelope,\n registeredCron,\n );\n }\n\n throw new IgniterJobsError({\n code: \"JOBS_NOT_REGISTERED\",\n message: `Job \"${job.name}\" is not registered for queue \"${queueName}\".`,\n });\n }\n\n private async processRegisteredDefinition(\n workerState: WorkerState,\n queueName: string,\n job: BunqueueJob<JobsEnvelope>,\n envelope: JobsEnvelope,\n definition: IgniterJobDefinition<any, any, any>,\n ): Promise<unknown> {\n const baseContext = this.createExecutionContext(\n queueName,\n job,\n envelope,\n definition,\n );\n const startedAt = new Date();\n\n await this.writeLog(queueName, job.id, \"info\", \"Job started.\");\n await this.invokeHook(() =>\n definition.onStart?.({ ...baseContext, startedAt } as never),\n );\n\n try {\n const result = await definition.handler(baseContext as never);\n const duration = Date.now() - startedAt.getTime();\n workerState.metrics.processed += 1;\n workerState.metrics.totalDuration += duration;\n\n await this.writeLog(\n queueName,\n job.id,\n \"info\",\n `Job completed in ${duration}ms.`,\n );\n await this.invokeHook(() =>\n definition.onSuccess?.({\n ...baseContext,\n startedAt,\n duration,\n result,\n } as never),\n );\n\n return result;\n } catch (error) {\n const runtimeError =\n error instanceof Error ? error : new Error(String(error));\n const duration = Date.now() - startedAt.getTime();\n const maxAttempts = definition.attempts ?? job.opts.attempts ?? 1;\n const isFinalAttempt = job.attemptsMade >= maxAttempts;\n workerState.metrics.failed += 1;\n\n await this.writeLog(queueName, job.id, \"error\", runtimeError.message);\n await this.invokeHook(() =>\n definition.onFailure?.({\n ...baseContext,\n startedAt,\n duration,\n error: runtimeError,\n isFinalAttempt,\n } as never),\n );\n\n throw runtimeError;\n }\n }\n\n private async processRegisteredCron(\n queueName: string,\n job: BunqueueJob<JobsEnvelope>,\n envelope: JobsEnvelope,\n definition: IgniterCronDefinition<any, any>,\n ): Promise<unknown> {\n await this.writeLog(queueName, job.id, \"info\", \"Cron execution started.\");\n\n try {\n const result = await definition.handler({\n context: {},\n job: {\n id: job.id,\n name: job.name,\n queue: queueName,\n attemptsMade: job.attemptsMade,\n createdAt: new Date(job.timestamp),\n metadata: envelope.metadata,\n },\n scope: envelope.scope,\n } as never);\n\n await this.writeLog(\n queueName,\n job.id,\n \"info\",\n \"Cron execution completed.\",\n );\n return result;\n } catch (error) {\n const runtimeError =\n error instanceof Error ? error : new Error(String(error));\n await this.writeLog(queueName, job.id, \"error\", runtimeError.message);\n throw runtimeError;\n }\n }\n\n private createExecutionContext(\n queueName: string,\n job: BunqueueJob<JobsEnvelope>,\n envelope: JobsEnvelope,\n definition: IgniterJobDefinition<any, any, any>,\n ) {\n const baseContext = {\n input: envelope.input,\n context: {},\n job: {\n id: job.id,\n name: job.name,\n queue: queueName,\n attemptsMade: job.attemptsMade,\n createdAt: new Date(job.timestamp),\n metadata: envelope.metadata,\n updateProgress: async (progress: number, message?: string) => {\n await job.updateProgress(progress, message);\n await this.writeLog(\n queueName,\n job.id,\n \"info\",\n `Progress updated to ${progress}%.`,\n );\n await this.invokeHook(() =>\n definition.onProgress?.({\n ...baseContext,\n progress,\n message,\n } as never),\n );\n },\n },\n scope: envelope.scope,\n };\n\n return baseContext;\n }\n\n private attachWorkerEvents(\n workerState: WorkerState,\n queueName: string,\n worker: BunqueueWorker<JobsEnvelope, unknown>,\n ): void {\n worker.on(\"active\", async (job) => {\n workerState.activeJobs.add(job.id);\n await this.invokeHandler(() =>\n workerState.handlers?.onActive?.({\n job: this.mapJobSync(job, queueName),\n }),\n );\n });\n\n worker.on(\"completed\", async (job, result) => {\n workerState.activeJobs.delete(job.id);\n await this.invokeHandler(() =>\n workerState.handlers?.onSuccess?.({\n job: this.mapJobSync(job, queueName, \"completed\"),\n result,\n }),\n );\n });\n\n worker.on(\"failed\", async (job, error) => {\n workerState.activeJobs.delete(job.id);\n await this.invokeHandler(() =>\n workerState.handlers?.onFailure?.({\n job: this.mapJobSync(job, queueName, \"failed\"),\n error,\n }),\n );\n });\n\n worker.on(\"drained\", async () => {\n if (workerState.activeJobs.size === 0) {\n await this.invokeHandler(() => workerState.handlers?.onIdle?.());\n }\n });\n\n worker.on(\"error\", async (error) => {\n await this.writeQueueLog(\n queueName,\n \"error\",\n `Worker error: ${error.message}`,\n );\n });\n }\n\n private toWorkerHandle(worker: WorkerState): IgniterJobsWorkerHandle {\n return {\n id: worker.id,\n queues: [...worker.queues],\n pause: async () => {\n worker.paused = true;\n for (const runtime of worker.workers.values()) runtime.pause();\n },\n resume: async () => {\n worker.paused = false;\n for (const runtime of worker.workers.values()) runtime.resume();\n },\n close: async () => {\n await this.closeWorkerState(worker);\n },\n isRunning: () => !worker.closed && !worker.paused,\n isPaused: () => worker.paused,\n isClosed: () => worker.closed,\n getMetrics: async () => this.buildWorkerMetrics(worker),\n };\n }\n\n private buildWorkerMetrics(worker: WorkerState): IgniterJobsWorkerMetrics {\n return {\n processed: worker.metrics.processed,\n failed: worker.metrics.failed,\n avgDuration:\n worker.metrics.processed > 0\n ? worker.metrics.totalDuration / worker.metrics.processed\n : 0,\n concurrency: worker.concurrency,\n uptime: Date.now() - worker.startedAt.getTime(),\n };\n }\n\n private async closeWorkerState(worker: WorkerState): Promise<void> {\n worker.closed = true;\n await Promise.all(\n Array.from(worker.workers.values()).map((runtime) => runtime.close()),\n );\n worker.workers.clear();\n }\n\n private async requireJob(\n jobId: string,\n queue?: string,\n ): Promise<BunqueueJob<JobsEnvelope>> {\n const queueName = queue ?? (await this.findQueueByJobId(jobId));\n if (!queueName) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found.`,\n });\n }\n\n const job = await this.getQueue(queueName).then((queueClient) =>\n queueClient.getJob(jobId),\n );\n if (!job) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found${queue ? ` in queue \"${queue}\"` : \"\"}.`,\n });\n }\n\n return job;\n }\n\n private async findQueueByJobId(jobId: string): Promise<string | null> {\n for (const queueName of await this.getAllQueueNames()) {\n const job = await this.getQueue(queueName).then((queueClient) =>\n queueClient.getJob(jobId),\n );\n if (job) return queueName;\n }\n return null;\n }\n\n private getStreamKey(queue: string, jobId: string): string {\n return `${queue}:${jobId}`;\n }\n\n private mapStreamRow(row: {\n id: number;\n type: string;\n data: string;\n timestamp: string;\n job_id: string;\n job_name: string;\n queue: string;\n scope: string | null;\n }): IgniterJobsJobStreamEvent<string, unknown> {\n return {\n id: String(row.id),\n type: row.type,\n data: JSON.parse(row.data),\n timestamp: new Date(row.timestamp),\n jobId: row.job_id,\n jobName: row.job_name,\n queue: row.queue,\n scope: row.scope ? JSON.parse(row.scope) : undefined,\n };\n }\n\n private async mapJob(\n job: BunqueueJob<JobsEnvelope>,\n queueName: string,\n forcedState?: IgniterJobStatus,\n ): Promise<IgniterJobSearchResult> {\n const queue = await this.getQueue(queueName);\n const rawState = await job.getState();\n return this.mapJobSync(\n job,\n queueName,\n forcedState ?? this.toPublicStatus(rawState, queue.isPaused()),\n );\n }\n\n private mapJobSync(\n job: BunqueueJob<JobsEnvelope>,\n queueName: string,\n status?: IgniterJobStatus,\n ): IgniterJobSearchResult {\n const envelope = this.normalizeEnvelope(job.data);\n\n return {\n id: job.id,\n name: job.name,\n queue: queueName,\n status: status ?? this.toPublicStatus(\"waiting\", false),\n input: envelope.input,\n result: job.returnvalue,\n error: job.failedReason ?? undefined,\n progress: typeof job.progress === \"number\" ? job.progress : 0,\n attemptsMade: job.attemptsMade,\n priority: job.priority ?? 0,\n createdAt: new Date(job.timestamp),\n startedAt: job.processedOn ? new Date(job.processedOn) : undefined,\n completedAt: job.finishedOn ? new Date(job.finishedOn) : undefined,\n metadata: envelope.metadata,\n scope: envelope.scope,\n };\n }\n\n private normalizeEnvelope(data: JobsEnvelope | unknown): JobsEnvelope {\n if (\n data &&\n typeof data === \"object\" &&\n (data as JobsEnvelope).__igniterJobs === true\n ) {\n return data as JobsEnvelope;\n }\n\n return {\n __igniterJobs: true,\n input: data,\n };\n }\n\n private toPublicStatus(\n rawState: string,\n isQueuePaused: boolean,\n ): IgniterJobStatus {\n if (\n (rawState === \"waiting\" || rawState === \"prioritized\") &&\n isQueuePaused\n ) {\n return \"paused\";\n }\n\n switch (rawState) {\n case \"prioritized\":\n case \"waiting-children\":\n return \"waiting\";\n case \"waiting\":\n case \"active\":\n case \"completed\":\n case \"failed\":\n case \"delayed\":\n case \"paused\":\n return rawState;\n default:\n return \"waiting\";\n }\n }\n\n private toBunqueueStatus(status: IgniterJobStatus): string {\n switch (status) {\n case \"waiting\":\n return \"waiting\";\n default:\n return status;\n }\n }\n\n private toBunqueueStates(status: IgniterJobStatus): string[] {\n switch (status) {\n case \"waiting\":\n return [\"waiting\", \"prioritized\"];\n case \"paused\":\n return [\"paused\"];\n default:\n return [status];\n }\n }\n\n private distributeConcurrency(\n total: number,\n queues: string[],\n ): Map<string, number> {\n const result = new Map<string, number>();\n if (queues.length === 0) return result;\n\n const base = Math.max(1, Math.floor(total / queues.length));\n let remainder = Math.max(0, total - base * queues.length);\n\n for (const queue of queues) {\n const value = base + (remainder > 0 ? 1 : 0);\n result.set(queue, value);\n remainder = Math.max(0, remainder - 1);\n }\n\n return result;\n }\n\n private shouldExecuteScheduledJob(\n schedule: JobsEnvelope[\"schedule\"],\n now: Date,\n ): boolean {\n if (!schedule) return true;\n const day = now.getDay();\n const isoDate = now.toISOString().slice(0, 10);\n\n if (schedule.skipWeekends && (day === 0 || day === 6)) return false;\n if (schedule.onlyWeekdays?.length && !schedule.onlyWeekdays.includes(day))\n return false;\n if (schedule.skipDates?.some((value) => value.slice(0, 10) === isoDate))\n return false;\n\n if (schedule.onlyBusinessHours && schedule.businessHours) {\n const hour = now.getHours();\n return (\n hour >= schedule.businessHours.start &&\n hour < schedule.businessHours.end\n );\n }\n\n return true;\n }\n\n private parseLogEntry(entry: string): IgniterJobsJobLog {\n try {\n const parsed = JSON.parse(entry) as StructuredLog;\n if (\n parsed &&\n typeof parsed.message === \"string\" &&\n typeof parsed.timestamp === \"string\" &&\n (parsed.level === \"info\" ||\n parsed.level === \"warn\" ||\n parsed.level === \"error\")\n ) {\n return {\n timestamp: new Date(parsed.timestamp),\n level: parsed.level,\n message: parsed.message,\n };\n }\n } catch {\n // fall back to plain string\n }\n\n return {\n timestamp: new Date(),\n level: \"info\",\n message: entry,\n };\n }\n\n private async writeLog(\n queueName: string,\n jobId: string,\n level: \"info\" | \"warn\" | \"error\",\n message: string,\n ): Promise<void> {\n const queue = await this.getQueue(queueName);\n await queue.addJobLog(\n jobId,\n JSON.stringify({ timestamp: new Date().toISOString(), level, message }),\n );\n }\n\n private async writeQueueLog(\n queueName: string,\n level: \"info\" | \"warn\" | \"error\",\n message: string,\n ): Promise<void> {\n void queueName;\n void level;\n void message;\n }\n\n private async invokeHook(fn: () => Promise<void> | void): Promise<void> {\n try {\n await fn();\n } catch {\n // Hooks must not break worker state transitions.\n }\n }\n\n private async invokeHandler(fn: () => Promise<void> | void): Promise<void> {\n try {\n await fn();\n } catch {\n // Worker observers are isolated from backend processing.\n }\n }\n}\n\nexport type { IgniterJobsBunSQLiteAdapterOptions };\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as IgniterJobsAdapter, X as IgniterJobsQueueManager, c as IgniterJobDefinition, r as IgniterCronDefinition, x as IgniterJobsAdapterDispatchParams, B as IgniterJobsAdapterScheduleParams, g as IgniterJobSearchResult, m as IgniterJobStatus, Q as IgniterJobsJobLog, h as IgniterJobsQueueInfo, w as IgniterJobCounts, l as IgniterJobsQueueCleanOptions, i as IgniterJobsWorkerHandle, d as IgniterJobsWorkerBuilderConfig, f as IgniterJobsEventHandler, A as IgniterJobsAdapterJobStreamWriteParams, y as IgniterJobsAdapterJobStreamReadParams, V as IgniterJobsJobStreamReadResult, S as IgniterJobsJobStreamEvent, z as IgniterJobsAdapterJobStreamSubscribeParams } from '../adapter-DDyMVche.mjs';
|
|
2
2
|
import 'ioredis';
|
|
3
3
|
import '@igniter-js/common';
|
|
4
4
|
|
|
@@ -21,6 +21,8 @@ declare class IgniterJobsMemoryAdapter implements IgniterJobsAdapter {
|
|
|
21
21
|
private readonly registeredJobs;
|
|
22
22
|
private readonly registeredCrons;
|
|
23
23
|
private readonly workers;
|
|
24
|
+
private readonly streamRecords;
|
|
25
|
+
private readonly streamSubscribers;
|
|
24
26
|
private readonly subscribers;
|
|
25
27
|
readonly queues: IgniterJobsQueueManager;
|
|
26
28
|
private readonly pausedQueues;
|
|
@@ -50,8 +52,6 @@ declare class IgniterJobsMemoryAdapter implements IgniterJobsAdapter {
|
|
|
50
52
|
force?: boolean;
|
|
51
53
|
}): Promise<void>;
|
|
52
54
|
retryAllInQueue(queue: string): Promise<number>;
|
|
53
|
-
pauseJobType(queue: string, jobName: string): Promise<void>;
|
|
54
|
-
resumeJobType(queue: string, jobName: string): Promise<void>;
|
|
55
55
|
searchJobs(filter: any): Promise<IgniterJobSearchResult[]>;
|
|
56
56
|
searchQueues(filter: any): Promise<IgniterJobsQueueInfo[]>;
|
|
57
57
|
searchWorkers(filter: any): Promise<IgniterJobsWorkerHandle[]>;
|
|
@@ -59,8 +59,12 @@ declare class IgniterJobsMemoryAdapter implements IgniterJobsAdapter {
|
|
|
59
59
|
getWorkers(): Map<string, IgniterJobsWorkerHandle>;
|
|
60
60
|
publishEvent(channel: string, payload: unknown): Promise<void>;
|
|
61
61
|
subscribeEvent(channel: string, handler: IgniterJobsEventHandler): Promise<() => Promise<void>>;
|
|
62
|
+
writeJobStreamEvent(params: IgniterJobsAdapterJobStreamWriteParams): Promise<string>;
|
|
63
|
+
readJobStream(params: IgniterJobsAdapterJobStreamReadParams): Promise<IgniterJobsJobStreamReadResult<IgniterJobsJobStreamEvent<string, unknown>>>;
|
|
64
|
+
subscribeJobStream(params: IgniterJobsAdapterJobStreamSubscribeParams): Promise<() => Promise<void>>;
|
|
62
65
|
shutdown(): Promise<void>;
|
|
63
66
|
private toSearchResult;
|
|
67
|
+
private getStreamKey;
|
|
64
68
|
private toWorkerHandle;
|
|
65
69
|
private toWorkerMetrics;
|
|
66
70
|
private kickWorkers;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as IgniterJobsAdapter, X as IgniterJobsQueueManager, c as IgniterJobDefinition, r as IgniterCronDefinition, x as IgniterJobsAdapterDispatchParams, B as IgniterJobsAdapterScheduleParams, g as IgniterJobSearchResult, m as IgniterJobStatus, Q as IgniterJobsJobLog, h as IgniterJobsQueueInfo, w as IgniterJobCounts, l as IgniterJobsQueueCleanOptions, i as IgniterJobsWorkerHandle, d as IgniterJobsWorkerBuilderConfig, f as IgniterJobsEventHandler, A as IgniterJobsAdapterJobStreamWriteParams, y as IgniterJobsAdapterJobStreamReadParams, V as IgniterJobsJobStreamReadResult, S as IgniterJobsJobStreamEvent, z as IgniterJobsAdapterJobStreamSubscribeParams } from '../adapter-DDyMVche.js';
|
|
2
2
|
import 'ioredis';
|
|
3
3
|
import '@igniter-js/common';
|
|
4
4
|
|
|
@@ -21,6 +21,8 @@ declare class IgniterJobsMemoryAdapter implements IgniterJobsAdapter {
|
|
|
21
21
|
private readonly registeredJobs;
|
|
22
22
|
private readonly registeredCrons;
|
|
23
23
|
private readonly workers;
|
|
24
|
+
private readonly streamRecords;
|
|
25
|
+
private readonly streamSubscribers;
|
|
24
26
|
private readonly subscribers;
|
|
25
27
|
readonly queues: IgniterJobsQueueManager;
|
|
26
28
|
private readonly pausedQueues;
|
|
@@ -50,8 +52,6 @@ declare class IgniterJobsMemoryAdapter implements IgniterJobsAdapter {
|
|
|
50
52
|
force?: boolean;
|
|
51
53
|
}): Promise<void>;
|
|
52
54
|
retryAllInQueue(queue: string): Promise<number>;
|
|
53
|
-
pauseJobType(queue: string, jobName: string): Promise<void>;
|
|
54
|
-
resumeJobType(queue: string, jobName: string): Promise<void>;
|
|
55
55
|
searchJobs(filter: any): Promise<IgniterJobSearchResult[]>;
|
|
56
56
|
searchQueues(filter: any): Promise<IgniterJobsQueueInfo[]>;
|
|
57
57
|
searchWorkers(filter: any): Promise<IgniterJobsWorkerHandle[]>;
|
|
@@ -59,8 +59,12 @@ declare class IgniterJobsMemoryAdapter implements IgniterJobsAdapter {
|
|
|
59
59
|
getWorkers(): Map<string, IgniterJobsWorkerHandle>;
|
|
60
60
|
publishEvent(channel: string, payload: unknown): Promise<void>;
|
|
61
61
|
subscribeEvent(channel: string, handler: IgniterJobsEventHandler): Promise<() => Promise<void>>;
|
|
62
|
+
writeJobStreamEvent(params: IgniterJobsAdapterJobStreamWriteParams): Promise<string>;
|
|
63
|
+
readJobStream(params: IgniterJobsAdapterJobStreamReadParams): Promise<IgniterJobsJobStreamReadResult<IgniterJobsJobStreamEvent<string, unknown>>>;
|
|
64
|
+
subscribeJobStream(params: IgniterJobsAdapterJobStreamSubscribeParams): Promise<() => Promise<void>>;
|
|
62
65
|
shutdown(): Promise<void>;
|
|
63
66
|
private toSearchResult;
|
|
67
|
+
private getStreamKey;
|
|
64
68
|
private toWorkerHandle;
|
|
65
69
|
private toWorkerMetrics;
|
|
66
70
|
private kickWorkers;
|
|
@@ -35,6 +35,8 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
35
35
|
this.registeredJobs = /* @__PURE__ */ new Map();
|
|
36
36
|
this.registeredCrons = /* @__PURE__ */ new Map();
|
|
37
37
|
this.workers = /* @__PURE__ */ new Map();
|
|
38
|
+
this.streamRecords = /* @__PURE__ */ new Map();
|
|
39
|
+
this.streamSubscribers = /* @__PURE__ */ new Map();
|
|
38
40
|
this.subscribers = /* @__PURE__ */ new Map();
|
|
39
41
|
this.queues = {
|
|
40
42
|
list: async () => this.listQueues(),
|
|
@@ -360,25 +362,6 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
360
362
|
}
|
|
361
363
|
return retried;
|
|
362
364
|
}
|
|
363
|
-
async pauseJobType(queue, jobName) {
|
|
364
|
-
const jobIds = this.jobsByQueue.get(queue) ?? [];
|
|
365
|
-
for (const id of jobIds) {
|
|
366
|
-
const job = this.jobsById.get(id);
|
|
367
|
-
if (!job) continue;
|
|
368
|
-
if (job.name === jobName && job.status === "waiting")
|
|
369
|
-
job.status = "paused";
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
async resumeJobType(queue, jobName) {
|
|
373
|
-
const jobIds = this.jobsByQueue.get(queue) ?? [];
|
|
374
|
-
for (const id of jobIds) {
|
|
375
|
-
const job = this.jobsById.get(id);
|
|
376
|
-
if (!job) continue;
|
|
377
|
-
if (job.name === jobName && job.status === "paused")
|
|
378
|
-
job.status = "waiting";
|
|
379
|
-
}
|
|
380
|
-
void this.kickWorkers(queue);
|
|
381
|
-
}
|
|
382
365
|
async searchJobs(filter) {
|
|
383
366
|
const queue = filter?.queue;
|
|
384
367
|
const statuses = filter?.status;
|
|
@@ -442,9 +425,68 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
442
425
|
if (current.size === 0) this.subscribers.delete(channel);
|
|
443
426
|
};
|
|
444
427
|
}
|
|
428
|
+
async writeJobStreamEvent(params) {
|
|
429
|
+
const key = this.getStreamKey(params.queue, params.jobId);
|
|
430
|
+
const record = this.streamRecords.get(key) ?? { events: [], nextId: 1 };
|
|
431
|
+
const id = String(record.nextId++);
|
|
432
|
+
const event = {
|
|
433
|
+
...params.event,
|
|
434
|
+
id
|
|
435
|
+
};
|
|
436
|
+
if (params.persistence?.enabled) {
|
|
437
|
+
record.events.push(event);
|
|
438
|
+
const maxEvents = params.persistence.maxEvents;
|
|
439
|
+
if (typeof maxEvents === "number" && maxEvents > 0 && record.events.length > maxEvents) {
|
|
440
|
+
record.events.splice(0, record.events.length - maxEvents);
|
|
441
|
+
}
|
|
442
|
+
this.streamRecords.set(key, record);
|
|
443
|
+
} else if (!this.streamRecords.has(key)) {
|
|
444
|
+
this.streamRecords.set(key, record);
|
|
445
|
+
}
|
|
446
|
+
const handlers = this.streamSubscribers.get(key);
|
|
447
|
+
if (handlers?.size) {
|
|
448
|
+
await Promise.all(
|
|
449
|
+
Array.from(handlers).map(async (handler) => handler(event))
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
return id;
|
|
453
|
+
}
|
|
454
|
+
async readJobStream(params) {
|
|
455
|
+
const key = this.getStreamKey(params.queue, params.jobId);
|
|
456
|
+
const record = this.streamRecords.get(key);
|
|
457
|
+
if (!record) {
|
|
458
|
+
return { items: [], nextCursor: void 0, hasMore: false };
|
|
459
|
+
}
|
|
460
|
+
const after = params.after ? Number(params.after) : void 0;
|
|
461
|
+
const limit = params.limit ?? 100;
|
|
462
|
+
const filtered = record.events.filter(
|
|
463
|
+
(event) => typeof after === "number" ? Number(event.id) > after : true
|
|
464
|
+
);
|
|
465
|
+
const items = filtered.slice(0, limit);
|
|
466
|
+
const hasMore = filtered.length > items.length;
|
|
467
|
+
return {
|
|
468
|
+
items,
|
|
469
|
+
nextCursor: items.at(-1)?.id,
|
|
470
|
+
hasMore
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
async subscribeJobStream(params) {
|
|
474
|
+
const key = this.getStreamKey(params.queue, params.jobId);
|
|
475
|
+
const set = this.streamSubscribers.get(key) ?? /* @__PURE__ */ new Set();
|
|
476
|
+
set.add(params.handler);
|
|
477
|
+
this.streamSubscribers.set(key, set);
|
|
478
|
+
return async () => {
|
|
479
|
+
const current = this.streamSubscribers.get(key);
|
|
480
|
+
if (!current) return;
|
|
481
|
+
current.delete(params.handler);
|
|
482
|
+
if (current.size === 0) this.streamSubscribers.delete(key);
|
|
483
|
+
};
|
|
484
|
+
}
|
|
445
485
|
async shutdown() {
|
|
446
486
|
this.workers.clear();
|
|
447
487
|
this.subscribers.clear();
|
|
488
|
+
this.streamSubscribers.clear();
|
|
489
|
+
this.streamRecords.clear();
|
|
448
490
|
}
|
|
449
491
|
toSearchResult(job) {
|
|
450
492
|
return {
|
|
@@ -465,6 +507,9 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
465
507
|
scope: job.scope
|
|
466
508
|
};
|
|
467
509
|
}
|
|
510
|
+
getStreamKey(queue, jobId) {
|
|
511
|
+
return `${queue}:${jobId}`;
|
|
512
|
+
}
|
|
468
513
|
toWorkerHandle(worker) {
|
|
469
514
|
return {
|
|
470
515
|
id: worker.id,
|
|
@@ -563,12 +608,61 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
563
608
|
name: job.name,
|
|
564
609
|
queue: job.queue,
|
|
565
610
|
attemptsMade: job.attemptsMade,
|
|
566
|
-
metadata: job.metadata
|
|
611
|
+
metadata: job.metadata,
|
|
612
|
+
updateProgress: async (progress, message) => {
|
|
613
|
+
job.progress = progress;
|
|
614
|
+
if (message) {
|
|
615
|
+
job.logs.push({
|
|
616
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
617
|
+
level: "info",
|
|
618
|
+
message
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
await definition.onProgress?.({
|
|
622
|
+
input: job.input,
|
|
623
|
+
context: {},
|
|
624
|
+
job: {
|
|
625
|
+
id: job.id,
|
|
626
|
+
name: job.name,
|
|
627
|
+
queue: job.queue,
|
|
628
|
+
attemptsMade: job.attemptsMade,
|
|
629
|
+
metadata: job.metadata
|
|
630
|
+
},
|
|
631
|
+
scope: job.scope,
|
|
632
|
+
progress,
|
|
633
|
+
message
|
|
634
|
+
});
|
|
635
|
+
}
|
|
567
636
|
},
|
|
568
637
|
scope: job.scope,
|
|
569
638
|
startedAt: job.startedAt
|
|
570
639
|
});
|
|
571
640
|
}
|
|
641
|
+
const updateProgress = async (progress, message) => {
|
|
642
|
+
job.progress = progress;
|
|
643
|
+
if (message) {
|
|
644
|
+
job.logs.push({
|
|
645
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
646
|
+
level: "info",
|
|
647
|
+
message
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
await definition.onProgress?.({
|
|
651
|
+
input: job.input,
|
|
652
|
+
context: {},
|
|
653
|
+
job: {
|
|
654
|
+
id: job.id,
|
|
655
|
+
name: job.name,
|
|
656
|
+
queue: job.queue,
|
|
657
|
+
attemptsMade: job.attemptsMade,
|
|
658
|
+
metadata: job.metadata,
|
|
659
|
+
updateProgress
|
|
660
|
+
},
|
|
661
|
+
scope: job.scope,
|
|
662
|
+
progress,
|
|
663
|
+
message
|
|
664
|
+
});
|
|
665
|
+
};
|
|
572
666
|
const result = await definition.handler({
|
|
573
667
|
input: job.input,
|
|
574
668
|
context: {},
|
|
@@ -577,7 +671,8 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
577
671
|
name: job.name,
|
|
578
672
|
queue: job.queue,
|
|
579
673
|
attemptsMade: job.attemptsMade,
|
|
580
|
-
metadata: job.metadata
|
|
674
|
+
metadata: job.metadata,
|
|
675
|
+
updateProgress
|
|
581
676
|
},
|
|
582
677
|
scope: job.scope
|
|
583
678
|
});
|
|
@@ -602,7 +697,8 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
602
697
|
name: job.name,
|
|
603
698
|
queue: job.queue,
|
|
604
699
|
attemptsMade: job.attemptsMade,
|
|
605
|
-
metadata: job.metadata
|
|
700
|
+
metadata: job.metadata,
|
|
701
|
+
updateProgress
|
|
606
702
|
},
|
|
607
703
|
scope: job.scope,
|
|
608
704
|
result,
|
|
@@ -636,7 +732,8 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
636
732
|
name: job.name,
|
|
637
733
|
queue: job.queue,
|
|
638
734
|
attemptsMade: job.attemptsMade,
|
|
639
|
-
metadata: job.metadata
|
|
735
|
+
metadata: job.metadata,
|
|
736
|
+
updateProgress: async () => void 0
|
|
640
737
|
},
|
|
641
738
|
scope: job.scope,
|
|
642
739
|
error,
|
|
@@ -657,5 +754,5 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
657
754
|
};
|
|
658
755
|
|
|
659
756
|
exports.IgniterJobsMemoryAdapter = IgniterJobsMemoryAdapter;
|
|
660
|
-
//# sourceMappingURL=
|
|
661
|
-
//# sourceMappingURL=
|
|
757
|
+
//# sourceMappingURL=mock.js.map
|
|
758
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/id-generator.ts","../../src/errors/jobs.error.ts","../../src/adapters/memory.adapter.ts"],"names":["IgniterError"],"mappings":"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","file":"mock.js","sourcesContent":["/**\n * Generates consistent identifiers for jobs, workers, and schedules.\n */\nexport class IgniterJobsIdGenerator {\n /**\n * Generates a unique identifier with a prefix.\n *\n * @example\n * ```typescript\n * const jobId = IgniterJobsIdGenerator.generate('job')\n * ```\n */\n public static generate(prefix: string): string {\n const now = Date.now().toString(36)\n const random = Math.random().toString(36).slice(2, 8)\n return `${prefix}_${now}_${random}`\n }\n}\n","import { IgniterError } from \"@igniter-js/common\";\n\n/**\n * Canonical error codes for `@igniter-js/jobs`.\n */\nexport const IGNITER_JOBS_ERROR_CODES = {\n JOBS_ADAPTER_REQUIRED: 'JOBS_ADAPTER_REQUIRED',\n JOBS_SERVICE_REQUIRED: 'JOBS_SERVICE_REQUIRED',\n JOBS_CONTEXT_REQUIRED: 'JOBS_CONTEXT_REQUIRED',\n JOBS_CONFIGURATION_INVALID: 'JOBS_CONFIGURATION_INVALID',\n JOBS_QUEUE_NOT_FOUND: 'JOBS_QUEUE_NOT_FOUND',\n JOBS_QUEUE_DUPLICATE: 'JOBS_QUEUE_DUPLICATE',\n JOBS_QUEUE_OPERATION_FAILED: 'JOBS_QUEUE_OPERATION_FAILED',\n JOBS_INVALID_DEFINITION: 'JOBS_INVALID_DEFINITION',\n JOBS_HANDLER_REQUIRED: 'JOBS_HANDLER_REQUIRED',\n JOBS_DUPLICATE_JOB: 'JOBS_DUPLICATE_JOB',\n JOBS_NOT_FOUND: 'JOBS_NOT_FOUND',\n JOBS_NOT_REGISTERED: 'JOBS_NOT_REGISTERED',\n JOBS_EXECUTION_FAILED: 'JOBS_EXECUTION_FAILED',\n JOBS_TIMEOUT: 'JOBS_TIMEOUT',\n JOBS_CONTEXT_FACTORY_FAILED: 'JOBS_CONTEXT_FACTORY_FAILED',\n JOBS_VALIDATION_FAILED: 'JOBS_VALIDATION_FAILED',\n JOBS_INVALID_INPUT: 'JOBS_INVALID_INPUT',\n JOBS_INVALID_CRON: 'JOBS_INVALID_CRON',\n JOBS_INVALID_SCHEDULE: 'JOBS_INVALID_SCHEDULE',\n JOBS_SCOPE_ALREADY_DEFINED: 'JOBS_SCOPE_ALREADY_DEFINED',\n JOBS_WORKER_FAILED: 'JOBS_WORKER_FAILED',\n JOBS_ADAPTER_ERROR: 'JOBS_ADAPTER_ERROR',\n JOBS_ADAPTER_CONNECTION_FAILED: 'JOBS_ADAPTER_CONNECTION_FAILED',\n JOBS_SUBSCRIBE_FAILED: 'JOBS_SUBSCRIBE_FAILED',\n} as const\n\nexport type IgniterJobsErrorCode = keyof typeof IGNITER_JOBS_ERROR_CODES\n\nexport interface IgniterJobsErrorOptions {\n /** Error code scoped to Igniter Jobs. */\n code: IgniterJobsErrorCode\n /** Human-readable message. */\n message: string\n /** HTTP-like status code hint (default: 500). */\n statusCode?: number\n /** Optional structured details for debugging and clients. */\n details?: unknown\n /** Optional metadata for logs and tracing. */\n metadata?: Record<string, unknown>\n /** Optional causer tag used by some Igniter tooling. */\n causer?: string\n /** Underlying cause for debugging (optional). */\n cause?: Error\n /** Optional logger passthrough to align with other Igniter errors. */\n logger?: any\n}\n\n/**\n * Typed error class for the Jobs package.\n *\n * @example\n * ```typescript\n * throw new IgniterJobsError({\n * code: 'JOBS_INVALID_INPUT',\n * message: 'Input payload failed validation',\n * })\n * ```\n */\nexport class IgniterJobsError extends IgniterError {\n constructor(options: IgniterJobsErrorOptions) {\n super(options)\n }\n}\n","/**\n * @fileoverview In-memory adapter for @igniter-js/jobs (tests/dev only)\n * @module @igniter-js/jobs/adapters/memory\n */\n\nimport type {\n IgniterJobsAdapterJobStreamReadParams,\n IgniterJobsAdapterJobStreamSubscribeParams,\n IgniterJobsAdapterJobStreamWriteParams,\n IgniterCronDefinition,\n IgniterJobCounts,\n IgniterJobDefinition,\n IgniterJobSearchResult,\n IgniterJobStatus,\n IgniterJobsAdapter,\n IgniterJobsAdapterDispatchParams,\n IgniterJobsAdapterScheduleParams,\n IgniterJobsEventHandler,\n IgniterJobsJobLog,\n IgniterJobsQueueCleanOptions,\n IgniterJobsQueueInfo,\n IgniterJobsQueueManager,\n IgniterJobsWorkerBuilderConfig,\n IgniterJobsWorkerHandle,\n IgniterJobsWorkerMetrics,\n} from \"../types\";\nimport type {\n IgniterJobsJobStreamEvent,\n IgniterJobsJobStreamReadResult,\n} from \"../types/stream\";\nimport { IgniterJobsIdGenerator } from \"../utils/id-generator\";\nimport { IgniterJobsError } from \"../errors\";\n\ntype MemoryJob = {\n id: string;\n name: string;\n queue: string;\n input: unknown;\n status: IgniterJobStatus;\n progress: number;\n attemptsMade: number;\n maxAttempts: number;\n priority: number;\n createdAt: Date;\n startedAt?: Date;\n completedAt?: Date;\n result?: unknown;\n error?: string;\n metadata?: Record<string, unknown>;\n scope?: unknown;\n logs: IgniterJobsJobLog[];\n};\n\ntype MemoryWorkerState = {\n id: string;\n queues: string[];\n concurrency: number;\n paused: boolean;\n closed: boolean;\n startedAt: Date;\n metrics: {\n processed: number;\n failed: number;\n totalDuration: number;\n };\n handlers?: IgniterJobsWorkerBuilderConfig[\"handlers\"];\n};\n\ntype MemoryStreamRecord = {\n events: IgniterJobsJobStreamEvent<string, unknown>[];\n nextId: number;\n};\n\n/**\n * Lightweight in-memory adapter used for unit tests and local development.\n *\n * This adapter is not suitable for production use.\n */\nexport class IgniterJobsMemoryAdapter implements IgniterJobsAdapter {\n public readonly client = {\n type: \"memory\" as const,\n };\n\n private readonly jobsById = new Map<string, MemoryJob>();\n private readonly jobsByQueue = new Map<string, string[]>();\n private readonly registeredJobs = new Map<\n string,\n Map<string, IgniterJobDefinition<any, any, any>>\n >();\n private readonly registeredCrons = new Map<\n string,\n Map<string, IgniterCronDefinition<any, any>>\n >();\n\n private readonly workers = new Map<string, MemoryWorkerState>();\n private readonly streamRecords = new Map<string, MemoryStreamRecord>();\n private readonly streamSubscribers = new Map<\n string,\n Set<\n (\n event: IgniterJobsJobStreamEvent<string, unknown>,\n ) => void | Promise<void>\n >\n >();\n\n private readonly subscribers = new Map<\n string,\n Set<IgniterJobsEventHandler>\n >();\n\n public readonly queues: IgniterJobsQueueManager = {\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 statuses = filter?.status;\n const limit = filter?.limit ?? 100;\n const offset = filter?.offset ?? 0;\n const results = await this.searchJobs({\n queue: name,\n status: statuses,\n limit,\n offset,\n } as any);\n return results;\n },\n pause: async (name) => this.pauseQueue(name),\n resume: async (name) => this.resumeQueue(name),\n isPaused: async (name) => {\n // Queue-level pause is stored as a special marker job list state.\n // For memory adapter, we model it by a metadata flag in queue info.\n const info = await this.getQueueInfo(name);\n return info?.isPaused ?? false;\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 private readonly pausedQueues = new Set<string>();\n\n public static create(): IgniterJobsAdapter {\n return new IgniterJobsMemoryAdapter();\n }\n\n public registerJob(\n queueName: string,\n jobName: string,\n definition: IgniterJobDefinition<any, any, any>,\n ): void {\n const queueJobs =\n this.registeredJobs.get(queueName) ??\n new Map<string, IgniterJobDefinition<any, any, any>>();\n if (queueJobs.has(jobName)) {\n throw new IgniterJobsError({\n code: \"JOBS_DUPLICATE_JOB\",\n message: `Job \"${jobName}\" already registered for queue \"${queueName}\".`,\n });\n }\n queueJobs.set(jobName, definition);\n this.registeredJobs.set(queueName, queueJobs);\n }\n\n public registerCron(\n queueName: string,\n cronName: string,\n definition: IgniterCronDefinition<any, any>,\n ): void {\n const queueCrons =\n this.registeredCrons.get(queueName) ??\n new Map<string, IgniterCronDefinition<any, any>>();\n if (queueCrons.has(cronName)) {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_CRON\",\n message: `Cron \"${cronName}\" already registered for queue \"${queueName}\".`,\n });\n }\n queueCrons.set(cronName, definition);\n this.registeredCrons.set(queueName, queueCrons);\n }\n\n public async dispatch(\n params: IgniterJobsAdapterDispatchParams,\n ): Promise<string> {\n const jobId = params.jobId ?? IgniterJobsIdGenerator.generate(\"job\");\n const maxAttempts = params.attempts ?? 1;\n\n const metadata = params.metadata ?? {};\n\n const job: MemoryJob = {\n id: jobId,\n name: params.jobName,\n queue: params.queue,\n input: params.input,\n status: this.pausedQueues.has(params.queue)\n ? \"paused\"\n : params.delay && params.delay > 0\n ? \"delayed\"\n : \"waiting\",\n progress: 0,\n attemptsMade: 0,\n maxAttempts,\n priority: params.priority ?? 0,\n createdAt: new Date(),\n metadata: metadata as Record<string, unknown>,\n scope: params.scope,\n logs: [],\n };\n\n this.jobsById.set(jobId, job);\n const queueList = this.jobsByQueue.get(params.queue) ?? [];\n queueList.push(jobId);\n this.jobsByQueue.set(params.queue, queueList);\n\n if (params.delay && params.delay > 0) {\n setTimeout(() => {\n const stored = this.jobsById.get(jobId);\n if (!stored) return;\n if (!this.pausedQueues.has(params.queue)) stored.status = \"waiting\";\n void this.kickWorkers(params.queue);\n }, params.delay);\n return jobId;\n }\n\n void this.kickWorkers(params.queue);\n return jobId;\n }\n\n public async schedule(\n params: IgniterJobsAdapterScheduleParams,\n ): Promise<string> {\n if (params.at) {\n const delay = params.at.getTime() - Date.now();\n if (delay <= 0) {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_SCHEDULE\",\n message: \"Scheduled time must be in the future.\",\n });\n }\n return this.dispatch({ ...params, delay });\n }\n if (params.cron || params.every) {\n // Memory adapter does not implement a cron engine. It stores the job as delayed and relies on tests\n // to invoke dispatch manually if needed.\n return this.dispatch({ ...params, delay: params.delay ?? 0 });\n }\n return this.dispatch(params);\n }\n\n public async getJob(\n jobId: string,\n queue?: string,\n ): Promise<IgniterJobSearchResult | null> {\n const job = this.jobsById.get(jobId);\n if (!job) return null;\n if (queue && job.queue !== queue) return null;\n return this.toSearchResult(job);\n }\n\n public async getJobState(\n jobId: string,\n queue?: string,\n ): Promise<IgniterJobStatus | null> {\n const job = this.jobsById.get(jobId);\n if (!job) return null;\n if (queue && job.queue !== queue) return null;\n return job.status;\n }\n\n public async getJobLogs(\n jobId: string,\n queue?: string,\n ): Promise<IgniterJobsJobLog[]> {\n const job = this.jobsById.get(jobId);\n if (!job) return [];\n if (queue && job.queue !== queue) return [];\n return job.logs;\n }\n\n public async getJobProgress(jobId: string, queue?: string): Promise<number> {\n const job = this.jobsById.get(jobId);\n if (!job) return 0;\n if (queue && job.queue !== queue) return 0;\n return job.progress;\n }\n\n public async retryJob(jobId: string, queue?: string): Promise<void> {\n const job = this.jobsById.get(jobId);\n if (!job) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found.`,\n });\n }\n if (queue && job.queue !== queue) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found in queue \"${queue}\".`,\n });\n }\n job.status = \"waiting\";\n job.error = undefined;\n job.completedAt = undefined;\n job.progress = 0;\n void this.kickWorkers(job.queue);\n }\n\n public async removeJob(jobId: string, queue?: string): Promise<void> {\n const job = this.jobsById.get(jobId);\n if (!job) return;\n if (queue && job.queue !== queue) return;\n this.jobsById.delete(jobId);\n const list = this.jobsByQueue.get(job.queue);\n if (list)\n this.jobsByQueue.set(\n job.queue,\n list.filter((id) => id !== jobId),\n );\n }\n\n public async promoteJob(jobId: string, queue?: string): Promise<void> {\n const job = this.jobsById.get(jobId);\n if (!job) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found.`,\n });\n }\n if (queue && job.queue !== queue) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found in queue \"${queue}\".`,\n });\n }\n if (job.status === \"delayed\" || job.status === \"paused\") {\n job.status = this.pausedQueues.has(job.queue) ? \"paused\" : \"waiting\";\n void this.kickWorkers(job.queue);\n }\n }\n\n public async moveJobToFailed(\n jobId: string,\n reason: string,\n queue?: string,\n ): Promise<void> {\n const job = this.jobsById.get(jobId);\n if (!job) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found.`,\n });\n }\n if (queue && job.queue !== queue) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found in queue \"${queue}\".`,\n });\n }\n job.status = \"failed\";\n job.error = reason;\n job.completedAt = new Date();\n }\n\n public async retryManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await Promise.all(jobIds.map((id) => this.retryJob(id, queue)));\n }\n\n public async removeManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await Promise.all(jobIds.map((id) => this.removeJob(id, queue)));\n }\n\n public async getQueueInfo(\n queue: string,\n ): Promise<IgniterJobsQueueInfo | null> {\n const counts = await this.getQueueJobCounts(queue);\n return {\n name: queue,\n isPaused: this.pausedQueues.has(queue),\n jobCounts: counts,\n };\n }\n\n public async getQueueJobCounts(queue: string): Promise<IgniterJobCounts> {\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n const counts: IgniterJobCounts = {\n waiting: 0,\n active: 0,\n completed: 0,\n failed: 0,\n delayed: 0,\n paused: 0,\n };\n for (const id of jobIds) {\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (job.status in counts) {\n (counts as any)[job.status]++;\n }\n }\n return counts;\n }\n\n public async listQueues(): Promise<IgniterJobsQueueInfo[]> {\n const queues = Array.from(\n new Set([\n ...this.jobsByQueue.keys(),\n ...this.registeredJobs.keys(),\n ...this.registeredCrons.keys(),\n ]),\n );\n const result: IgniterJobsQueueInfo[] = [];\n for (const q of queues) {\n result.push((await this.getQueueInfo(q))!);\n }\n return result;\n }\n\n public async pauseQueue(queue: string): Promise<void> {\n this.pausedQueues.add(queue);\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n for (const id of jobIds) {\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (job.status === \"waiting\") job.status = \"paused\";\n }\n }\n\n public async resumeQueue(queue: string): Promise<void> {\n this.pausedQueues.delete(queue);\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n for (const id of jobIds) {\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (job.status === \"paused\") job.status = \"waiting\";\n }\n void this.kickWorkers(queue);\n }\n\n public async drainQueue(queue: string): Promise<number> {\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n let removed = 0;\n for (const id of jobIds) {\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (job.status === \"waiting\" || job.status === \"paused\") {\n this.jobsById.delete(id);\n removed++;\n }\n }\n this.jobsByQueue.set(\n queue,\n jobIds.filter((id) => this.jobsById.has(id)),\n );\n return removed;\n }\n\n public async cleanQueue(\n queue: string,\n options: IgniterJobsQueueCleanOptions,\n ): Promise<number> {\n const statuses = Array.isArray(options.status)\n ? options.status\n : [options.status];\n const olderThan = options.olderThan ?? 0;\n const limit = options.limit ?? Number.POSITIVE_INFINITY;\n\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n const now = Date.now();\n let cleaned = 0;\n\n for (const id of [...jobIds]) {\n if (cleaned >= limit) break;\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (!statuses.includes(job.status)) continue;\n const ageMs = now - job.createdAt.getTime();\n if (ageMs < olderThan) continue;\n this.jobsById.delete(id);\n cleaned++;\n }\n\n this.jobsByQueue.set(\n queue,\n jobIds.filter((id) => this.jobsById.has(id)),\n );\n return cleaned;\n }\n\n public async obliterateQueue(\n queue: string,\n options?: { force?: boolean },\n ): Promise<void> {\n void options;\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n for (const id of jobIds) this.jobsById.delete(id);\n this.jobsByQueue.delete(queue);\n this.registeredJobs.delete(queue);\n this.registeredCrons.delete(queue);\n this.pausedQueues.delete(queue);\n }\n\n public async retryAllInQueue(queue: string): Promise<number> {\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n let retried = 0;\n for (const id of jobIds) {\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (job.status === \"failed\") {\n await this.retryJob(id, queue);\n retried++;\n }\n }\n return retried;\n }\n\n public async searchJobs(filter: any): Promise<IgniterJobSearchResult[]> {\n const queue = filter?.queue as string | undefined;\n const statuses: IgniterJobStatus[] | undefined = filter?.status;\n const limit = filter?.limit ?? 100;\n const offset = filter?.offset ?? 0;\n\n const all = Array.from(this.jobsById.values())\n .filter((j) => (queue ? j.queue === queue : true))\n .filter((j) => (statuses ? statuses.includes(j.status) : true))\n .sort(\n (a, b) =>\n b.priority - a.priority ||\n a.createdAt.getTime() - b.createdAt.getTime(),\n );\n\n return all.slice(offset, offset + limit).map((j) => this.toSearchResult(j));\n }\n\n public async searchQueues(filter: any): Promise<IgniterJobsQueueInfo[]> {\n const name = filter?.name as string | undefined;\n const isPaused = filter?.isPaused as boolean | undefined;\n const all = await this.listQueues();\n return all\n .filter((q) => (name ? q.name.includes(name) : true))\n .filter((q) =>\n typeof isPaused === \"boolean\" ? q.isPaused === isPaused : true,\n );\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 return Array.from(this.workers.values())\n .filter((w) => (queue ? w.queues.includes(queue) : true))\n .filter((w) =>\n typeof isRunning === \"boolean\"\n ? isRunning\n ? !w.closed\n : w.closed\n : true,\n )\n .map((w) => this.toWorkerHandle(w));\n }\n\n public async createWorker(\n config: IgniterJobsWorkerBuilderConfig,\n ): Promise<IgniterJobsWorkerHandle> {\n const workerId = IgniterJobsIdGenerator.generate(\"worker\");\n const state: MemoryWorkerState = {\n id: workerId,\n queues: config.queues ?? [],\n concurrency: config.concurrency ?? 1,\n paused: false,\n closed: false,\n startedAt: new Date(),\n metrics: { processed: 0, failed: 0, totalDuration: 0 },\n handlers: config.handlers,\n };\n this.workers.set(workerId, state);\n\n // Kick initial processing.\n for (const q of state.queues) void this.kickWorkers(q);\n\n return this.toWorkerHandle(state);\n }\n\n public getWorkers(): Map<string, IgniterJobsWorkerHandle> {\n const out = new Map<string, IgniterJobsWorkerHandle>();\n for (const [id, state] of this.workers)\n out.set(id, this.toWorkerHandle(state));\n return out;\n }\n\n public async publishEvent(channel: string, payload: unknown): Promise<void> {\n const handlers = this.subscribers.get(channel);\n if (!handlers) return;\n await Promise.all(Array.from(handlers).map(async (h) => h(payload as any)));\n }\n\n public async subscribeEvent(\n channel: string,\n handler: IgniterJobsEventHandler,\n ): Promise<() => Promise<void>> {\n const set =\n this.subscribers.get(channel) ?? new Set<IgniterJobsEventHandler>();\n set.add(handler);\n this.subscribers.set(channel, set);\n\n return async () => {\n const current = this.subscribers.get(channel);\n if (!current) return;\n current.delete(handler);\n if (current.size === 0) this.subscribers.delete(channel);\n };\n }\n\n public async writeJobStreamEvent(\n params: IgniterJobsAdapterJobStreamWriteParams,\n ): Promise<string> {\n const key = this.getStreamKey(params.queue, params.jobId);\n const record = this.streamRecords.get(key) ?? { events: [], nextId: 1 };\n const id = String(record.nextId++);\n const event: IgniterJobsJobStreamEvent<string, unknown> = {\n ...params.event,\n id,\n };\n\n if (params.persistence?.enabled) {\n record.events.push(event);\n const maxEvents = params.persistence.maxEvents;\n if (\n typeof maxEvents === \"number\" &&\n maxEvents > 0 &&\n record.events.length > maxEvents\n ) {\n record.events.splice(0, record.events.length - maxEvents);\n }\n this.streamRecords.set(key, record);\n } else if (!this.streamRecords.has(key)) {\n this.streamRecords.set(key, record);\n }\n\n const handlers = this.streamSubscribers.get(key);\n if (handlers?.size) {\n await Promise.all(\n Array.from(handlers).map(async (handler) => handler(event)),\n );\n }\n\n return id;\n }\n\n public async readJobStream(\n params: IgniterJobsAdapterJobStreamReadParams,\n ): Promise<\n IgniterJobsJobStreamReadResult<IgniterJobsJobStreamEvent<string, unknown>>\n > {\n const key = this.getStreamKey(params.queue, params.jobId);\n const record = this.streamRecords.get(key);\n if (!record) {\n return { items: [], nextCursor: undefined, hasMore: false };\n }\n\n const after = params.after ? Number(params.after) : undefined;\n const limit = params.limit ?? 100;\n const filtered = record.events.filter((event) =>\n typeof after === \"number\" ? Number(event.id) > after : true,\n );\n const items = filtered.slice(0, limit);\n const hasMore = filtered.length > items.length;\n\n return {\n items,\n nextCursor: items.at(-1)?.id,\n hasMore,\n };\n }\n\n public async subscribeJobStream(\n params: IgniterJobsAdapterJobStreamSubscribeParams,\n ): Promise<() => Promise<void>> {\n const key = this.getStreamKey(params.queue, params.jobId);\n const set = this.streamSubscribers.get(key) ?? new Set();\n set.add(params.handler);\n this.streamSubscribers.set(key, set);\n\n return async () => {\n const current = this.streamSubscribers.get(key);\n if (!current) return;\n current.delete(params.handler);\n if (current.size === 0) this.streamSubscribers.delete(key);\n };\n }\n\n public async shutdown(): Promise<void> {\n this.workers.clear();\n this.subscribers.clear();\n this.streamSubscribers.clear();\n this.streamRecords.clear();\n }\n\n private toSearchResult(job: MemoryJob): IgniterJobSearchResult {\n return {\n id: job.id,\n name: job.name,\n queue: job.queue,\n status: job.status,\n input: job.input,\n result: job.result,\n error: job.error,\n progress: job.progress,\n attemptsMade: job.attemptsMade,\n priority: job.priority,\n createdAt: job.createdAt,\n startedAt: job.startedAt,\n completedAt: job.completedAt,\n metadata: job.metadata,\n scope: job.scope as any,\n };\n }\n\n private getStreamKey(queue: string, jobId: string): string {\n return `${queue}:${jobId}`;\n }\n\n private toWorkerHandle(worker: MemoryWorkerState): IgniterJobsWorkerHandle {\n return {\n id: worker.id,\n queues: worker.queues,\n pause: async () => {\n worker.paused = true;\n },\n resume: async () => {\n worker.paused = false;\n for (const q of worker.queues) void this.kickWorkers(q);\n },\n close: async () => {\n worker.closed = true;\n },\n isRunning: () => !worker.closed && !worker.paused,\n isPaused: () => worker.paused,\n isClosed: () => worker.closed,\n getMetrics: async () => this.toWorkerMetrics(worker),\n };\n }\n\n private toWorkerMetrics(worker: MemoryWorkerState): IgniterJobsWorkerMetrics {\n const uptime = Date.now() - worker.startedAt.getTime();\n const processed = worker.metrics.processed;\n return {\n processed,\n failed: worker.metrics.failed,\n avgDuration: processed > 0 ? worker.metrics.totalDuration / processed : 0,\n concurrency: worker.concurrency,\n uptime,\n };\n }\n\n private async kickWorkers(queue: string): Promise<void> {\n if (this.pausedQueues.has(queue)) return;\n const relevant = Array.from(this.workers.values()).filter(\n (w) =>\n !w.closed &&\n !w.paused &&\n (w.queues.length === 0 || w.queues.includes(queue)),\n );\n if (relevant.length === 0) return;\n\n for (const w of relevant) {\n void this.processLoop(w, queue);\n }\n }\n\n private async processLoop(\n worker: MemoryWorkerState,\n queue: string,\n ): Promise<void> {\n if (worker.closed || worker.paused) return;\n const concurrency = Math.max(1, worker.concurrency);\n\n const running = (worker as any).__running as number | undefined;\n const currentRunning = running ?? 0;\n if (currentRunning >= concurrency) return;\n (worker as any).__running = currentRunning + 1;\n\n try {\n const next = this.nextJob(queue);\n if (!next) return;\n await this.processJob(worker, next);\n } finally {\n (worker as any).__running = ((worker as any).__running as number) - 1;\n // Continue draining if more work exists.\n if (this.nextJob(queue)) void this.processLoop(worker, queue);\n else if (worker.handlers?.onIdle) await worker.handlers.onIdle();\n }\n }\n\n private nextJob(queue: string): MemoryJob | null {\n const ids = this.jobsByQueue.get(queue) ?? [];\n const candidates = ids\n .map((id) => this.jobsById.get(id))\n .filter((j): j is MemoryJob => Boolean(j))\n .filter((j) => j.status === \"waiting\")\n .sort(\n (a, b) =>\n b.priority - a.priority ||\n a.createdAt.getTime() - b.createdAt.getTime(),\n );\n return candidates[0] ?? null;\n }\n\n private async processJob(\n worker: MemoryWorkerState,\n job: MemoryJob,\n ): Promise<void> {\n if (this.pausedQueues.has(job.queue)) {\n job.status = \"paused\";\n return;\n }\n\n job.status = \"active\";\n job.startedAt = new Date();\n job.attemptsMade += 1;\n job.logs.push({\n timestamp: new Date(),\n level: \"info\",\n message: \"Job started\",\n });\n\n if (worker.handlers?.onActive)\n await worker.handlers.onActive({ job: this.toSearchResult(job) });\n\n const start = Date.now();\n\n try {\n const definition = this.registeredJobs.get(job.queue)?.get(job.name);\n if (!definition) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_REGISTERED\",\n message: `Job \"${job.name}\" is not registered for queue \"${job.queue}\".`,\n });\n }\n\n if (definition.onStart) {\n await definition.onStart({\n input: job.input as any,\n context: {} as any,\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: job.attemptsMade,\n metadata: job.metadata,\n updateProgress: async (progress: number, message?: string) => {\n job.progress = progress;\n if (message) {\n job.logs.push({\n timestamp: new Date(),\n level: \"info\",\n message,\n });\n }\n await definition.onProgress?.({\n input: job.input as any,\n context: {} as any,\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: job.attemptsMade,\n metadata: job.metadata,\n },\n scope: job.scope as any,\n progress,\n message,\n } as any);\n },\n },\n scope: job.scope as any,\n startedAt: job.startedAt,\n } as any);\n }\n\n const updateProgress = async (progress: number, message?: string) => {\n job.progress = progress;\n if (message) {\n job.logs.push({\n timestamp: new Date(),\n level: \"info\",\n message,\n });\n }\n\n await definition.onProgress?.({\n input: job.input as any,\n context: {} as any,\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: job.attemptsMade,\n metadata: job.metadata,\n updateProgress,\n },\n scope: job.scope as any,\n progress,\n message,\n } as any);\n };\n\n const result = await definition.handler({\n input: job.input as any,\n context: {} as any,\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: job.attemptsMade,\n metadata: job.metadata,\n updateProgress,\n },\n scope: job.scope as any,\n } as any);\n\n const duration = Date.now() - start;\n job.status = \"completed\";\n job.completedAt = new Date();\n job.result = result;\n job.progress = 100;\n job.logs.push({\n timestamp: new Date(),\n level: \"info\",\n message: `Job completed in ${duration}ms`,\n });\n\n worker.metrics.processed += 1;\n worker.metrics.totalDuration += duration;\n\n if (definition.onSuccess) {\n await definition.onSuccess({\n input: job.input as any,\n context: {} as any,\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: job.attemptsMade,\n metadata: job.metadata,\n updateProgress,\n },\n scope: job.scope as any,\n result,\n duration,\n } as any);\n }\n\n if (worker.handlers?.onSuccess)\n await worker.handlers.onSuccess({\n job: this.toSearchResult(job),\n result,\n });\n } catch (error: any) {\n const duration = Date.now() - start;\n job.error = error?.message ?? String(error);\n job.logs.push({\n timestamp: new Date(),\n level: \"error\",\n message: job.error ?? \"Unknown error\",\n });\n\n const isFinalAttempt = job.attemptsMade >= job.maxAttempts;\n if (isFinalAttempt) {\n job.status = \"failed\";\n job.completedAt = new Date();\n worker.metrics.failed += 1;\n\n const definition = this.registeredJobs.get(job.queue)?.get(job.name);\n if (definition?.onFailure) {\n await definition.onFailure({\n input: job.input as any,\n context: {} as any,\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: job.attemptsMade,\n metadata: job.metadata,\n updateProgress: async () => undefined,\n },\n scope: job.scope as any,\n error,\n isFinalAttempt: true,\n } as any);\n }\n\n if (worker.handlers?.onFailure)\n await worker.handlers.onFailure({\n job: this.toSearchResult(job),\n error,\n });\n } else {\n job.status = \"waiting\";\n void this.kickWorkers(job.queue);\n }\n }\n }\n}\n"]}
|