@igniter-js/jobs 0.1.13 → 0.1.14
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 +117 -243
- package/README.md +311 -153
- package/dist/{adapter-CXZxomI9.d.mts → adapter-Cax_40HW.d.mts} +27 -6
- package/dist/{adapter-CXZxomI9.d.ts → adapter-Cax_40HW.d.ts} +27 -6
- package/dist/adapters/bun.d.mts +93 -0
- package/dist/adapters/bun.d.ts +93 -0
- package/dist/adapters/bun.js +914 -0
- package/dist/adapters/bun.js.map +1 -0
- package/dist/adapters/bun.mjs +912 -0
- package/dist/adapters/bun.mjs.map +1 -0
- package/dist/adapters/{memory.adapter.d.ts → mock.d.mts} +1 -3
- package/dist/adapters/{memory.adapter.d.mts → mock.d.ts} +1 -3
- package/dist/adapters/{memory.adapter.js → mock.js} +58 -25
- package/dist/adapters/mock.js.map +1 -0
- package/dist/adapters/{memory.adapter.mjs → mock.mjs} +58 -25
- package/dist/adapters/mock.mjs.map +1 -0
- package/dist/adapters/{bullmq.adapter.d.ts → node.d.mts} +1 -3
- package/dist/adapters/{bullmq.adapter.d.mts → node.d.ts} +1 -3
- package/dist/adapters/{bullmq.adapter.js → node.js} +117 -40
- package/dist/adapters/node.js.map +1 -0
- package/dist/adapters/{bullmq.adapter.mjs → node.mjs} +117 -40
- package/dist/adapters/node.mjs.map +1 -0
- package/dist/index.d.mts +17 -21
- package/dist/index.d.ts +17 -21
- package/dist/index.js +20 -1854
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +21 -1852
- package/dist/index.mjs.map +1 -1
- package/package.json +28 -40
- 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 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 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\";\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\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 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 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 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\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 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 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 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, H as IgniterJobsQueueManager, c as IgniterJobDefinition, q as IgniterCronDefinition, v as IgniterJobsAdapterDispatchParams, w as IgniterJobsAdapterScheduleParams, g as IgniterJobSearchResult, m as IgniterJobStatus, F as IgniterJobsJobLog, h as IgniterJobsQueueInfo, u as IgniterJobCounts, l as IgniterJobsQueueCleanOptions, i as IgniterJobsWorkerHandle, d as IgniterJobsWorkerBuilderConfig, f as IgniterJobsEventHandler } from '../adapter-Cax_40HW.mjs';
|
|
2
2
|
import 'ioredis';
|
|
3
3
|
import '@igniter-js/common';
|
|
4
4
|
|
|
@@ -50,8 +50,6 @@ declare class IgniterJobsMemoryAdapter implements IgniterJobsAdapter {
|
|
|
50
50
|
force?: boolean;
|
|
51
51
|
}): Promise<void>;
|
|
52
52
|
retryAllInQueue(queue: string): Promise<number>;
|
|
53
|
-
pauseJobType(queue: string, jobName: string): Promise<void>;
|
|
54
|
-
resumeJobType(queue: string, jobName: string): Promise<void>;
|
|
55
53
|
searchJobs(filter: any): Promise<IgniterJobSearchResult[]>;
|
|
56
54
|
searchQueues(filter: any): Promise<IgniterJobsQueueInfo[]>;
|
|
57
55
|
searchWorkers(filter: any): Promise<IgniterJobsWorkerHandle[]>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as IgniterJobsAdapter, H as IgniterJobsQueueManager, c as IgniterJobDefinition, q as IgniterCronDefinition, v as IgniterJobsAdapterDispatchParams, w as IgniterJobsAdapterScheduleParams, g as IgniterJobSearchResult, m as IgniterJobStatus, F as IgniterJobsJobLog, h as IgniterJobsQueueInfo, u as IgniterJobCounts, l as IgniterJobsQueueCleanOptions, i as IgniterJobsWorkerHandle, d as IgniterJobsWorkerBuilderConfig, f as IgniterJobsEventHandler } from '../adapter-Cax_40HW.js';
|
|
2
2
|
import 'ioredis';
|
|
3
3
|
import '@igniter-js/common';
|
|
4
4
|
|
|
@@ -50,8 +50,6 @@ declare class IgniterJobsMemoryAdapter implements IgniterJobsAdapter {
|
|
|
50
50
|
force?: boolean;
|
|
51
51
|
}): Promise<void>;
|
|
52
52
|
retryAllInQueue(queue: string): Promise<number>;
|
|
53
|
-
pauseJobType(queue: string, jobName: string): Promise<void>;
|
|
54
|
-
resumeJobType(queue: string, jobName: string): Promise<void>;
|
|
55
53
|
searchJobs(filter: any): Promise<IgniterJobSearchResult[]>;
|
|
56
54
|
searchQueues(filter: any): Promise<IgniterJobsQueueInfo[]>;
|
|
57
55
|
searchWorkers(filter: any): Promise<IgniterJobsWorkerHandle[]>;
|
|
@@ -360,25 +360,6 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
360
360
|
}
|
|
361
361
|
return retried;
|
|
362
362
|
}
|
|
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
363
|
async searchJobs(filter) {
|
|
383
364
|
const queue = filter?.queue;
|
|
384
365
|
const statuses = filter?.status;
|
|
@@ -563,12 +544,61 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
563
544
|
name: job.name,
|
|
564
545
|
queue: job.queue,
|
|
565
546
|
attemptsMade: job.attemptsMade,
|
|
566
|
-
metadata: job.metadata
|
|
547
|
+
metadata: job.metadata,
|
|
548
|
+
updateProgress: async (progress, message) => {
|
|
549
|
+
job.progress = progress;
|
|
550
|
+
if (message) {
|
|
551
|
+
job.logs.push({
|
|
552
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
553
|
+
level: "info",
|
|
554
|
+
message
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
await definition.onProgress?.({
|
|
558
|
+
input: job.input,
|
|
559
|
+
context: {},
|
|
560
|
+
job: {
|
|
561
|
+
id: job.id,
|
|
562
|
+
name: job.name,
|
|
563
|
+
queue: job.queue,
|
|
564
|
+
attemptsMade: job.attemptsMade,
|
|
565
|
+
metadata: job.metadata
|
|
566
|
+
},
|
|
567
|
+
scope: job.scope,
|
|
568
|
+
progress,
|
|
569
|
+
message
|
|
570
|
+
});
|
|
571
|
+
}
|
|
567
572
|
},
|
|
568
573
|
scope: job.scope,
|
|
569
574
|
startedAt: job.startedAt
|
|
570
575
|
});
|
|
571
576
|
}
|
|
577
|
+
const updateProgress = async (progress, message) => {
|
|
578
|
+
job.progress = progress;
|
|
579
|
+
if (message) {
|
|
580
|
+
job.logs.push({
|
|
581
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
582
|
+
level: "info",
|
|
583
|
+
message
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
await definition.onProgress?.({
|
|
587
|
+
input: job.input,
|
|
588
|
+
context: {},
|
|
589
|
+
job: {
|
|
590
|
+
id: job.id,
|
|
591
|
+
name: job.name,
|
|
592
|
+
queue: job.queue,
|
|
593
|
+
attemptsMade: job.attemptsMade,
|
|
594
|
+
metadata: job.metadata,
|
|
595
|
+
updateProgress
|
|
596
|
+
},
|
|
597
|
+
scope: job.scope,
|
|
598
|
+
progress,
|
|
599
|
+
message
|
|
600
|
+
});
|
|
601
|
+
};
|
|
572
602
|
const result = await definition.handler({
|
|
573
603
|
input: job.input,
|
|
574
604
|
context: {},
|
|
@@ -577,7 +607,8 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
577
607
|
name: job.name,
|
|
578
608
|
queue: job.queue,
|
|
579
609
|
attemptsMade: job.attemptsMade,
|
|
580
|
-
metadata: job.metadata
|
|
610
|
+
metadata: job.metadata,
|
|
611
|
+
updateProgress
|
|
581
612
|
},
|
|
582
613
|
scope: job.scope
|
|
583
614
|
});
|
|
@@ -602,7 +633,8 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
602
633
|
name: job.name,
|
|
603
634
|
queue: job.queue,
|
|
604
635
|
attemptsMade: job.attemptsMade,
|
|
605
|
-
metadata: job.metadata
|
|
636
|
+
metadata: job.metadata,
|
|
637
|
+
updateProgress
|
|
606
638
|
},
|
|
607
639
|
scope: job.scope,
|
|
608
640
|
result,
|
|
@@ -636,7 +668,8 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
636
668
|
name: job.name,
|
|
637
669
|
queue: job.queue,
|
|
638
670
|
attemptsMade: job.attemptsMade,
|
|
639
|
-
metadata: job.metadata
|
|
671
|
+
metadata: job.metadata,
|
|
672
|
+
updateProgress: async () => void 0
|
|
640
673
|
},
|
|
641
674
|
scope: job.scope,
|
|
642
675
|
error,
|
|
@@ -657,5 +690,5 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
657
690
|
};
|
|
658
691
|
|
|
659
692
|
exports.IgniterJobsMemoryAdapter = IgniterJobsMemoryAdapter;
|
|
660
|
-
//# sourceMappingURL=
|
|
661
|
-
//# sourceMappingURL=
|
|
693
|
+
//# sourceMappingURL=mock.js.map
|
|
694
|
+
//# 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 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 { 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\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\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 shutdown(): Promise<void> {\n this.workers.clear();\n this.subscribers.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 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"]}
|
|
@@ -358,25 +358,6 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
358
358
|
}
|
|
359
359
|
return retried;
|
|
360
360
|
}
|
|
361
|
-
async pauseJobType(queue, jobName) {
|
|
362
|
-
const jobIds = this.jobsByQueue.get(queue) ?? [];
|
|
363
|
-
for (const id of jobIds) {
|
|
364
|
-
const job = this.jobsById.get(id);
|
|
365
|
-
if (!job) continue;
|
|
366
|
-
if (job.name === jobName && job.status === "waiting")
|
|
367
|
-
job.status = "paused";
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
async resumeJobType(queue, jobName) {
|
|
371
|
-
const jobIds = this.jobsByQueue.get(queue) ?? [];
|
|
372
|
-
for (const id of jobIds) {
|
|
373
|
-
const job = this.jobsById.get(id);
|
|
374
|
-
if (!job) continue;
|
|
375
|
-
if (job.name === jobName && job.status === "paused")
|
|
376
|
-
job.status = "waiting";
|
|
377
|
-
}
|
|
378
|
-
void this.kickWorkers(queue);
|
|
379
|
-
}
|
|
380
361
|
async searchJobs(filter) {
|
|
381
362
|
const queue = filter?.queue;
|
|
382
363
|
const statuses = filter?.status;
|
|
@@ -561,12 +542,61 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
561
542
|
name: job.name,
|
|
562
543
|
queue: job.queue,
|
|
563
544
|
attemptsMade: job.attemptsMade,
|
|
564
|
-
metadata: job.metadata
|
|
545
|
+
metadata: job.metadata,
|
|
546
|
+
updateProgress: async (progress, message) => {
|
|
547
|
+
job.progress = progress;
|
|
548
|
+
if (message) {
|
|
549
|
+
job.logs.push({
|
|
550
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
551
|
+
level: "info",
|
|
552
|
+
message
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
await definition.onProgress?.({
|
|
556
|
+
input: job.input,
|
|
557
|
+
context: {},
|
|
558
|
+
job: {
|
|
559
|
+
id: job.id,
|
|
560
|
+
name: job.name,
|
|
561
|
+
queue: job.queue,
|
|
562
|
+
attemptsMade: job.attemptsMade,
|
|
563
|
+
metadata: job.metadata
|
|
564
|
+
},
|
|
565
|
+
scope: job.scope,
|
|
566
|
+
progress,
|
|
567
|
+
message
|
|
568
|
+
});
|
|
569
|
+
}
|
|
565
570
|
},
|
|
566
571
|
scope: job.scope,
|
|
567
572
|
startedAt: job.startedAt
|
|
568
573
|
});
|
|
569
574
|
}
|
|
575
|
+
const updateProgress = async (progress, message) => {
|
|
576
|
+
job.progress = progress;
|
|
577
|
+
if (message) {
|
|
578
|
+
job.logs.push({
|
|
579
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
580
|
+
level: "info",
|
|
581
|
+
message
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
await definition.onProgress?.({
|
|
585
|
+
input: job.input,
|
|
586
|
+
context: {},
|
|
587
|
+
job: {
|
|
588
|
+
id: job.id,
|
|
589
|
+
name: job.name,
|
|
590
|
+
queue: job.queue,
|
|
591
|
+
attemptsMade: job.attemptsMade,
|
|
592
|
+
metadata: job.metadata,
|
|
593
|
+
updateProgress
|
|
594
|
+
},
|
|
595
|
+
scope: job.scope,
|
|
596
|
+
progress,
|
|
597
|
+
message
|
|
598
|
+
});
|
|
599
|
+
};
|
|
570
600
|
const result = await definition.handler({
|
|
571
601
|
input: job.input,
|
|
572
602
|
context: {},
|
|
@@ -575,7 +605,8 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
575
605
|
name: job.name,
|
|
576
606
|
queue: job.queue,
|
|
577
607
|
attemptsMade: job.attemptsMade,
|
|
578
|
-
metadata: job.metadata
|
|
608
|
+
metadata: job.metadata,
|
|
609
|
+
updateProgress
|
|
579
610
|
},
|
|
580
611
|
scope: job.scope
|
|
581
612
|
});
|
|
@@ -600,7 +631,8 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
600
631
|
name: job.name,
|
|
601
632
|
queue: job.queue,
|
|
602
633
|
attemptsMade: job.attemptsMade,
|
|
603
|
-
metadata: job.metadata
|
|
634
|
+
metadata: job.metadata,
|
|
635
|
+
updateProgress
|
|
604
636
|
},
|
|
605
637
|
scope: job.scope,
|
|
606
638
|
result,
|
|
@@ -634,7 +666,8 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
634
666
|
name: job.name,
|
|
635
667
|
queue: job.queue,
|
|
636
668
|
attemptsMade: job.attemptsMade,
|
|
637
|
-
metadata: job.metadata
|
|
669
|
+
metadata: job.metadata,
|
|
670
|
+
updateProgress: async () => void 0
|
|
638
671
|
},
|
|
639
672
|
scope: job.scope,
|
|
640
673
|
error,
|
|
@@ -655,5 +688,5 @@ var IgniterJobsMemoryAdapter = class _IgniterJobsMemoryAdapter {
|
|
|
655
688
|
};
|
|
656
689
|
|
|
657
690
|
export { IgniterJobsMemoryAdapter };
|
|
658
|
-
//# sourceMappingURL=
|
|
659
|
-
//# sourceMappingURL=
|
|
691
|
+
//# sourceMappingURL=mock.mjs.map
|
|
692
|
+
//# sourceMappingURL=mock.mjs.map
|