@motiadev/plugin-bullmq 0.14.0-beta.165-454838 → 0.14.0-beta.165-210612
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.css +1159 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +62 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2992 -4509
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +6 -2
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +630 -384
- package/dist/plugin.js.map +1 -0
- package/package.json +17 -24
- package/dist/api.d.ts +0 -4
- package/dist/api.d.ts.map +0 -1
- package/dist/components/dlq-panel.d.ts +0 -2
- package/dist/components/dlq-panel.d.ts.map +0 -1
- package/dist/components/job-detail.d.ts +0 -2
- package/dist/components/job-detail.d.ts.map +0 -1
- package/dist/components/jobs-table.d.ts +0 -2
- package/dist/components/jobs-table.d.ts.map +0 -1
- package/dist/components/queue-detail.d.ts +0 -2
- package/dist/components/queue-detail.d.ts.map +0 -1
- package/dist/components/queue-list.d.ts +0 -2
- package/dist/components/queue-list.d.ts.map +0 -1
- package/dist/components/queues-page.d.ts +0 -2
- package/dist/components/queues-page.d.ts.map +0 -1
- package/dist/hooks/use-jobs-mutations.d.ts +0 -23
- package/dist/hooks/use-jobs-mutations.d.ts.map +0 -1
- package/dist/hooks/use-jobs-query.d.ts +0 -5
- package/dist/hooks/use-jobs-query.d.ts.map +0 -1
- package/dist/hooks/use-queues.d.ts +0 -11
- package/dist/hooks/use-queues.d.ts.map +0 -1
- package/dist/index.cjs +0 -98
- package/dist/plugin-bullmq.css +0 -1
- package/dist/plugin.cjs +0 -1
- package/dist/providers/query-provider.d.ts +0 -7
- package/dist/providers/query-provider.d.ts.map +0 -1
- package/dist/stores/use-bullmq-store.d.ts +0 -22
- package/dist/stores/use-bullmq-store.d.ts.map +0 -1
- package/dist/streams/queues-stream.d.ts +0 -33
- package/dist/streams/queues-stream.d.ts.map +0 -1
- package/dist/types/queue.d.ts +0 -54
- package/dist/types/queue.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","names":["StreamAdapter","Queue","QueueEvents","Redis","QueueInfo","queues","Map","queueEvents","getOrCreateQueue","name","connection","prefix","existing","get","queue","set","discoverQueueNames","Promise","Set","pattern","keys","queueNames","key","withoutPrefix","slice","length","withoutId","add","getQueueInfo","dlqSuffix","isPaused","counts","all","getJobCounts","displayName","isDLQ","endsWith","stats","waiting","active","completed","failed","delayed","paused","prioritized","StreamQueueInfo","id","DEBOUNCE_MS","QueuesStream","knownQueues","onQueueUpdate","queueInfo","lastStatsCache","debounceTimers","NodeJS","Timeout","constructor","setUpdateCallback","callback","_groupId","info","_id","data","delete","getGroup","queueInfos","streamInfo","push","JSON","stringify","refreshQueue","newStatsKey","lastStatsKey","debouncedRefresh","queueName","clearTimeout","timer","setTimeout","setupQueueEvents","has","events","refreshOnEvent","on","setupAllQueueEvents","closeAllQueueEvents","values","clear","close","getKnownQueues","ApiRequest","ApiResponse","MotiaPluginContext","Redis","discoverQueueNames","getOrCreateQueue","getQueueInfo","CleanOptions","JobInfo","JobStatus","QueueInfo","discoverQueues","connection","prefix","dlqSuffix","Promise","queueNames","queueInfos","name","info","push","api","registerApi","method","path","queues","status","body","error","Error","message","req","pathParams","queue","isPaused","counts","all","getJobCounts","displayName","isDLQ","endsWith","stats","waiting","active","completed","failed","delayed","paused","prioritized","pause","resume","Partial","options","grace","limit","deletedIds","clean","deleted","length","ids","drain","queryParams","start","parseInt","end","rawJobs","getJobs","jobs","map","job","id","data","opts","Record","progress","JSON","stringify","timestamp","attemptsMade","processedOn","finishedOn","returnvalue","failedReason","stacktrace","queueName","jobId","getJob","jobInfo","retry","remove","promote","dlqName","originalEvent","failureReason","failureTimestamp","dlqQueue","originalQueueName","replace","originalQueue","jobData","topic","traceId","flows","messageGroupId","add","count","obliterate","force","MotiaPlugin","MotiaPluginContext","IORedis","api","QueuesStream","STREAM_NAME","isBullMQAdapter","adapter","connection","prefix","dlqSuffix","plugin","motia","ownsConnection","eventAdapter","host","process","env","BULLMQ_REDIS_HOST","REDIS_HOST","port","parseInt","BULLMQ_REDIS_PORT","REDIS_PORT","password","BULLMQ_REDIS_PASSWORD","REDIS_PASSWORD","undefined","BULLMQ_PREFIX","BULLMQ_DLQ_SUFFIX","maxRetriesPerRequest","queuesStream","stream","lockedData","createStream","filePath","hidden","config","name","baseConfig","storageType","factory","schema","setUpdateCallback","queueInfo","set","id","setupAllQueueEvents","then","getGroup","queues","queue","workbench","packageName","cssImports","label","position","componentName","labelIcon","onShutdown","closeAllQueueEvents","quit"],"sources":["../src/streams/queues-stream.ts","../src/api.ts","../src/plugin.ts"],"sourcesContent":["import { StreamAdapter } from '@motiadev/core'\nimport { Queue, QueueEvents } from 'bullmq'\nimport type { Redis } from 'ioredis'\nimport type { QueueInfo } from '../types/queue'\n\nconst queues: Map<string, Queue> = new Map()\nconst queueEvents: Map<string, QueueEvents> = new Map()\n\nexport const getOrCreateQueue = (name: string, connection: Redis, prefix: string): Queue => {\n const existing = queues.get(name)\n if (existing) {\n return existing\n }\n const queue = new Queue(name, { connection, prefix })\n queues.set(name, queue)\n return queue\n}\n\nexport const discoverQueueNames = async (connection: Redis, prefix: string): Promise<Set<string>> => {\n const pattern = `${prefix}:*:id`\n const keys = await connection.keys(pattern)\n const queueNames = new Set<string>()\n\n for (const key of keys) {\n const withoutPrefix = key.slice(prefix.length + 1)\n const withoutId = withoutPrefix.slice(0, -3)\n queueNames.add(withoutId)\n }\n\n return queueNames\n}\n\nexport const getQueueInfo = async (\n name: string,\n connection: Redis,\n prefix: string,\n dlqSuffix: string,\n): Promise<QueueInfo> => {\n const queue = getOrCreateQueue(name, connection, prefix)\n const [isPaused, counts] = await Promise.all([queue.isPaused(), queue.getJobCounts()])\n\n return {\n name,\n displayName: name,\n isPaused,\n isDLQ: name.endsWith(dlqSuffix),\n stats: {\n waiting: counts.waiting || 0,\n active: counts.active || 0,\n completed: counts.completed || 0,\n failed: counts.failed || 0,\n delayed: counts.delayed || 0,\n paused: counts.paused || 0,\n prioritized: counts.prioritized || 0,\n },\n }\n}\n\ntype StreamQueueInfo = QueueInfo & { id: string }\n\nconst DEBOUNCE_MS = 500\n\nexport class QueuesStream extends StreamAdapter<StreamQueueInfo> {\n private connection: Redis\n private prefix: string\n private dlqSuffix: string\n private knownQueues: Set<string> = new Set()\n private onQueueUpdate?: (queueInfo: StreamQueueInfo) => void\n private lastStatsCache: Map<string, string> = new Map()\n private debounceTimers: Map<string, NodeJS.Timeout> = new Map()\n\n constructor(connection: Redis, prefix: string, dlqSuffix: string) {\n super('__motia.bullmq-queues')\n this.connection = connection\n this.prefix = prefix\n this.dlqSuffix = dlqSuffix\n }\n\n setUpdateCallback(callback: (queueInfo: StreamQueueInfo) => void): void {\n this.onQueueUpdate = callback\n }\n\n async get(_groupId: string, id: string): Promise<StreamQueueInfo | null> {\n try {\n const info = await getQueueInfo(id, this.connection, this.prefix, this.dlqSuffix)\n return { ...info, id: info.name }\n } catch {\n return null\n }\n }\n\n async set(_groupId: string, _id: string, data: StreamQueueInfo): Promise<StreamQueueInfo> {\n return data\n }\n\n async delete(_groupId: string, id: string): Promise<StreamQueueInfo | null> {\n this.knownQueues.delete(id)\n this.lastStatsCache.delete(id)\n return { id } as StreamQueueInfo\n }\n\n async getGroup(_groupId: string): Promise<StreamQueueInfo[]> {\n const queueNames = await discoverQueueNames(this.connection, this.prefix)\n const queueInfos: StreamQueueInfo[] = []\n\n for (const name of queueNames) {\n this.knownQueues.add(name)\n const info = await getQueueInfo(name, this.connection, this.prefix, this.dlqSuffix)\n const streamInfo = { ...info, id: info.name }\n queueInfos.push(streamInfo)\n this.lastStatsCache.set(name, JSON.stringify({ stats: info.stats, isPaused: info.isPaused }))\n }\n\n return queueInfos\n }\n\n async refreshQueue(name: string): Promise<StreamQueueInfo> {\n const info = await getQueueInfo(name, this.connection, this.prefix, this.dlqSuffix)\n const streamInfo = { ...info, id: info.name }\n this.knownQueues.add(name)\n\n const newStatsKey = JSON.stringify({ stats: info.stats, isPaused: info.isPaused })\n const lastStatsKey = this.lastStatsCache.get(name)\n\n if (lastStatsKey !== newStatsKey) {\n this.lastStatsCache.set(name, newStatsKey)\n this.onQueueUpdate?.(streamInfo)\n }\n\n return streamInfo\n }\n\n private debouncedRefresh(queueName: string): void {\n const existing = this.debounceTimers.get(queueName)\n if (existing) {\n clearTimeout(existing)\n }\n\n const timer = setTimeout(() => {\n this.debounceTimers.delete(queueName)\n this.refreshQueue(queueName)\n }, DEBOUNCE_MS)\n\n this.debounceTimers.set(queueName, timer)\n }\n\n setupQueueEvents(queueName: string): void {\n if (queueEvents.has(queueName)) {\n return\n }\n\n const events = new QueueEvents(queueName, {\n connection: this.connection,\n prefix: this.prefix,\n })\n\n const refreshOnEvent = () => {\n this.debouncedRefresh(queueName)\n }\n\n events.on('waiting', refreshOnEvent)\n events.on('active', refreshOnEvent)\n events.on('completed', refreshOnEvent)\n events.on('failed', refreshOnEvent)\n events.on('delayed', refreshOnEvent)\n events.on('removed', refreshOnEvent)\n }\n\n async setupAllQueueEvents(): Promise<void> {\n const queueNames = await discoverQueueNames(this.connection, this.prefix)\n for (const name of queueNames) {\n this.setupQueueEvents(name)\n }\n }\n\n async closeAllQueueEvents(): Promise<void> {\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer)\n }\n this.debounceTimers.clear()\n\n for (const [, events] of queueEvents) {\n await events.close()\n }\n queueEvents.clear()\n }\n\n getKnownQueues(): Set<string> {\n return this.knownQueues\n }\n}\n","import type { ApiRequest, ApiResponse, MotiaPluginContext } from '@motiadev/core'\nimport type { Redis } from 'ioredis'\nimport { discoverQueueNames, getOrCreateQueue, getQueueInfo } from './streams/queues-stream'\nimport type { CleanOptions, JobInfo, JobStatus, QueueInfo } from './types/queue'\n\nconst discoverQueues = async (connection: Redis, prefix: string, dlqSuffix: string): Promise<QueueInfo[]> => {\n const queueNames = await discoverQueueNames(connection, prefix)\n const queueInfos: QueueInfo[] = []\n\n for (const name of queueNames) {\n const info = await getQueueInfo(name, connection, prefix, dlqSuffix)\n queueInfos.push(info)\n }\n\n return queueInfos\n}\n\nexport const api = (\n { registerApi }: MotiaPluginContext,\n prefix: string,\n dlqSuffix: string,\n connection: Redis,\n): void => {\n registerApi({ method: 'GET', path: '/__motia/bullmq/queues' }, async (): Promise<ApiResponse> => {\n try {\n const queues = await discoverQueues(connection, prefix, dlqSuffix)\n return { status: 200, body: { queues } }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n })\n\n registerApi(\n { method: 'GET', path: '/__motia/bullmq/queues/:name' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const name = req.pathParams.name as string\n const queue = getOrCreateQueue(name, connection, prefix)\n\n const [isPaused, counts] = await Promise.all([queue.isPaused(), queue.getJobCounts()])\n\n return {\n status: 200,\n body: {\n name,\n displayName: name,\n isPaused,\n isDLQ: name.endsWith(dlqSuffix),\n stats: {\n waiting: counts.waiting || 0,\n active: counts.active || 0,\n completed: counts.completed || 0,\n failed: counts.failed || 0,\n delayed: counts.delayed || 0,\n paused: counts.paused || 0,\n prioritized: counts.prioritized || 0,\n },\n },\n }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n\n registerApi(\n { method: 'POST', path: '/__motia/bullmq/queues/:name/pause' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const name = req.pathParams.name as string\n const queue = getOrCreateQueue(name, connection, prefix)\n await queue.pause()\n return { status: 200, body: { message: 'Queue paused' } }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n\n registerApi(\n { method: 'POST', path: '/__motia/bullmq/queues/:name/resume' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const name = req.pathParams.name as string\n const queue = getOrCreateQueue(name, connection, prefix)\n await queue.resume()\n return { status: 200, body: { message: 'Queue resumed' } }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n\n registerApi(\n { method: 'POST', path: '/__motia/bullmq/queues/:name/clean' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const name = req.pathParams.name as string\n const body = req.body as Partial<CleanOptions>\n const options: CleanOptions = {\n grace: body.grace ?? 0,\n limit: body.limit ?? 1000,\n status: body.status ?? 'completed',\n }\n const queue = getOrCreateQueue(name, connection, prefix)\n const deletedIds = await queue.clean(options.grace, options.limit, options.status)\n return { status: 200, body: { deleted: deletedIds.length, ids: deletedIds } }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n\n registerApi(\n { method: 'POST', path: '/__motia/bullmq/queues/:name/drain' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const name = req.pathParams.name as string\n const queue = getOrCreateQueue(name, connection, prefix)\n await queue.drain()\n return { status: 200, body: { message: 'Queue drained' } }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n\n registerApi(\n { method: 'GET', path: '/__motia/bullmq/queues/:name/jobs' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const name = req.pathParams.name as string\n const status = (req.queryParams.status as JobStatus) || 'waiting'\n const start = parseInt(req.queryParams.start as string, 10) || 0\n const end = parseInt(req.queryParams.end as string, 10) || 100\n\n const queue = getOrCreateQueue(name, connection, prefix)\n const rawJobs = await queue.getJobs([status], start, end)\n\n const jobs: JobInfo[] = rawJobs.map((job) => ({\n id: job.id || '',\n name: job.name,\n data: job.data,\n opts: job.opts as Record<string, unknown>,\n progress: typeof job.progress === 'object' ? JSON.stringify(job.progress) : job.progress,\n timestamp: job.timestamp,\n attemptsMade: job.attemptsMade,\n processedOn: job.processedOn,\n finishedOn: job.finishedOn,\n returnvalue: job.returnvalue,\n failedReason: job.failedReason,\n stacktrace: job.stacktrace,\n }))\n\n return { status: 200, body: { jobs } }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n\n registerApi(\n { method: 'GET', path: '/__motia/bullmq/queues/:queueName/jobs/:jobId' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const queueName = req.pathParams.queueName as string\n const jobId = req.pathParams.jobId as string\n\n const queue = getOrCreateQueue(queueName, connection, prefix)\n const job = await queue.getJob(jobId)\n\n if (!job) {\n return { status: 404, body: { error: 'Job not found' } }\n }\n\n const jobInfo: JobInfo = {\n id: job.id || '',\n name: job.name,\n data: job.data,\n opts: job.opts as Record<string, unknown>,\n progress: typeof job.progress === 'object' ? JSON.stringify(job.progress) : job.progress,\n timestamp: job.timestamp,\n attemptsMade: job.attemptsMade,\n processedOn: job.processedOn,\n finishedOn: job.finishedOn,\n returnvalue: job.returnvalue,\n failedReason: job.failedReason,\n stacktrace: job.stacktrace,\n }\n\n return { status: 200, body: jobInfo }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n\n registerApi(\n { method: 'POST', path: '/__motia/bullmq/queues/:queueName/jobs/:jobId/retry' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const queueName = req.pathParams.queueName as string\n const jobId = req.pathParams.jobId as string\n\n const queue = getOrCreateQueue(queueName, connection, prefix)\n const job = await queue.getJob(jobId)\n\n if (!job) {\n return { status: 404, body: { error: 'Job not found' } }\n }\n\n await job.retry()\n return { status: 200, body: { message: 'Job retried' } }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n\n registerApi(\n { method: 'POST', path: '/__motia/bullmq/queues/:queueName/jobs/:jobId/remove' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const queueName = req.pathParams.queueName as string\n const jobId = req.pathParams.jobId as string\n\n const queue = getOrCreateQueue(queueName, connection, prefix)\n const job = await queue.getJob(jobId)\n\n if (!job) {\n return { status: 404, body: { error: 'Job not found' } }\n }\n\n await job.remove()\n return { status: 200, body: { message: 'Job removed' } }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n\n registerApi(\n { method: 'POST', path: '/__motia/bullmq/queues/:queueName/jobs/:jobId/promote' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const queueName = req.pathParams.queueName as string\n const jobId = req.pathParams.jobId as string\n\n const queue = getOrCreateQueue(queueName, connection, prefix)\n const job = await queue.getJob(jobId)\n\n if (!job) {\n return { status: 404, body: { error: 'Job not found' } }\n }\n\n await job.promote()\n return { status: 200, body: { message: 'Job promoted' } }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n\n registerApi(\n { method: 'GET', path: '/__motia/bullmq/dlq/:name/jobs' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const name = req.pathParams.name as string\n const start = parseInt(req.queryParams.start as string, 10) || 0\n const end = parseInt(req.queryParams.end as string, 10) || 100\n\n const dlqName = name.endsWith(dlqSuffix) ? name : `${name}${dlqSuffix}`\n const queue = getOrCreateQueue(dlqName, connection, prefix)\n const rawJobs = await queue.getJobs(['waiting', 'completed'], start, end)\n\n const jobs = rawJobs.map((job) => ({\n id: job.id || '',\n name: job.name,\n data: job.data,\n timestamp: job.timestamp,\n originalEvent: job.data?.originalEvent,\n failureReason: job.data?.failureReason || job.failedReason,\n failureTimestamp: job.data?.failureTimestamp || job.finishedOn,\n attemptsMade: job.data?.attemptsMade || job.attemptsMade,\n }))\n\n return { status: 200, body: { jobs } }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n\n registerApi(\n { method: 'POST', path: '/__motia/bullmq/dlq/:name/retry/:jobId' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const name = req.pathParams.name as string\n const jobId = req.pathParams.jobId as string\n\n const dlqName = name.endsWith(dlqSuffix) ? name : `${name}${dlqSuffix}`\n const dlqQueue = getOrCreateQueue(dlqName, connection, prefix)\n const job = await dlqQueue.getJob(jobId)\n\n if (!job) {\n return { status: 404, body: { error: 'Job not found in DLQ' } }\n }\n\n const originalEvent = job.data?.originalEvent\n if (originalEvent) {\n const originalQueueName = dlqName.replace(dlqSuffix, '')\n const originalQueue = getOrCreateQueue(originalQueueName, connection, prefix)\n\n const jobData: Record<string, unknown> = {\n topic: originalEvent.topic,\n data: originalEvent.data,\n traceId: originalEvent.traceId,\n }\n\n if (originalEvent.flows) {\n jobData.flows = originalEvent.flows\n }\n if (originalEvent.messageGroupId) {\n jobData.messageGroupId = originalEvent.messageGroupId\n }\n\n await originalQueue.add(originalEvent.topic || job.name, jobData)\n }\n\n await job.remove()\n return { status: 200, body: { message: 'Job retried from DLQ' } }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n\n registerApi(\n { method: 'POST', path: '/__motia/bullmq/dlq/:name/retry-all' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const name = req.pathParams.name as string\n\n const dlqName = name.endsWith(dlqSuffix) ? name : `${name}${dlqSuffix}`\n const dlqQueue = getOrCreateQueue(dlqName, connection, prefix)\n const jobs = await dlqQueue.getJobs(['waiting', 'completed'])\n\n const originalQueueName = dlqName.replace(dlqSuffix, '')\n const originalQueue = getOrCreateQueue(originalQueueName, connection, prefix)\n\n let count = 0\n for (const job of jobs) {\n const originalEvent = job.data?.originalEvent\n if (originalEvent) {\n const jobData: Record<string, unknown> = {\n topic: originalEvent.topic,\n data: originalEvent.data,\n traceId: originalEvent.traceId,\n }\n\n if (originalEvent.flows) {\n jobData.flows = originalEvent.flows\n }\n if (originalEvent.messageGroupId) {\n jobData.messageGroupId = originalEvent.messageGroupId\n }\n\n await originalQueue.add(originalEvent.topic || job.name, jobData)\n }\n await job.remove()\n count++\n }\n\n return { status: 200, body: { message: `Retried ${count} jobs from DLQ`, count } }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n\n registerApi(\n { method: 'POST', path: '/__motia/bullmq/dlq/:name/clear' },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const name = req.pathParams.name as string\n\n const dlqName = name.endsWith(dlqSuffix) ? name : `${name}${dlqSuffix}`\n const queue = getOrCreateQueue(dlqName, connection, prefix)\n await queue.obliterate({ force: true })\n\n return { status: 200, body: { message: 'DLQ cleared' } }\n } catch (error) {\n return { status: 500, body: { error: error instanceof Error ? error.message : 'Unknown error' } }\n }\n },\n )\n}\n","import type { MotiaPlugin, MotiaPluginContext } from '@motiadev/core'\nimport IORedis from 'ioredis'\nimport { api } from './api'\nimport { QueuesStream } from './streams/queues-stream'\n\nconst STREAM_NAME = '__motia.bullmq-queues'\n\nconst isBullMQAdapter = (adapter: unknown): adapter is { connection: IORedis; prefix: string; dlqSuffix: string } => {\n return (\n adapter !== null &&\n typeof adapter === 'object' &&\n 'connection' in adapter &&\n 'prefix' in adapter &&\n 'dlqSuffix' in adapter\n )\n}\n\nexport default function plugin(motia: MotiaPluginContext): MotiaPlugin {\n let connection: IORedis\n let prefix: string\n let dlqSuffix: string\n let ownsConnection = false\n\n if (isBullMQAdapter(motia.eventAdapter)) {\n connection = motia.eventAdapter.connection as IORedis\n prefix = motia.eventAdapter.prefix\n dlqSuffix = motia.eventAdapter.dlqSuffix\n } else {\n const host = process.env.BULLMQ_REDIS_HOST || process.env.REDIS_HOST || 'localhost'\n const port = parseInt(process.env.BULLMQ_REDIS_PORT || process.env.REDIS_PORT || '6379', 10)\n const password = process.env.BULLMQ_REDIS_PASSWORD || process.env.REDIS_PASSWORD || undefined\n prefix = process.env.BULLMQ_PREFIX || 'motia:events'\n dlqSuffix = process.env.BULLMQ_DLQ_SUFFIX || '.dlq'\n\n connection = new IORedis({ host, port, password, maxRetriesPerRequest: null })\n ownsConnection = true\n }\n\n const queuesStream = new QueuesStream(connection, prefix, dlqSuffix)\n\n const stream = motia.lockedData.createStream({\n filePath: `${STREAM_NAME}.ts`,\n hidden: true,\n config: {\n name: STREAM_NAME,\n baseConfig: { storageType: 'custom', factory: () => queuesStream },\n schema: null as never,\n },\n })()\n\n queuesStream.setUpdateCallback((queueInfo) => {\n stream.set('default', queueInfo.id, queueInfo)\n })\n\n queuesStream.setupAllQueueEvents().then(() => {\n queuesStream.getGroup('default').then((queues) => {\n for (const queue of queues) {\n stream.set('default', queue.id, queue)\n }\n })\n })\n\n api(motia, prefix, dlqSuffix, connection)\n\n return {\n workbench: [\n {\n packageName: '@motiadev/plugin-bullmq',\n cssImports: ['@motiadev/plugin-bullmq/dist/index.css'],\n label: 'Queues',\n position: 'top',\n componentName: 'QueuesPage',\n labelIcon: 'layers',\n },\n ],\n onShutdown: async () => {\n await queuesStream.closeAllQueueEvents()\n if (ownsConnection) {\n await connection.quit()\n }\n },\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,22 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@motiadev/plugin-bullmq",
|
|
3
|
-
"version": "0.14.0-beta.165-
|
|
3
|
+
"version": "0.14.0-beta.165-210612",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"exports": {
|
|
9
|
-
".":
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"require": "./dist/index.cjs"
|
|
13
|
-
},
|
|
14
|
-
"./plugin": {
|
|
15
|
-
"types": "./dist/plugin.d.ts",
|
|
16
|
-
"import": "./dist/plugin.js",
|
|
17
|
-
"require": "./dist/plugin.cjs"
|
|
18
|
-
},
|
|
19
|
-
"./styles.css": "./dist/plugin-bullmq.css"
|
|
9
|
+
".": "./dist/index.js",
|
|
10
|
+
"./plugin": "./dist/plugin.js",
|
|
11
|
+
"./package.json": "./package.json"
|
|
20
12
|
},
|
|
21
13
|
"files": [
|
|
22
14
|
"dist"
|
|
@@ -31,26 +23,27 @@
|
|
|
31
23
|
"zustand": "^5.0.8"
|
|
32
24
|
},
|
|
33
25
|
"peerDependencies": {
|
|
34
|
-
"@motiadev/adapter-bullmq-events": "0.14.0-beta.165-
|
|
35
|
-
"@motiadev/
|
|
36
|
-
"@motiadev/ui": "0.14.0-beta.165-
|
|
37
|
-
"@motiadev/
|
|
26
|
+
"@motiadev/adapter-bullmq-events": "0.14.0-beta.165-210612",
|
|
27
|
+
"@motiadev/core": "0.14.0-beta.165-210612",
|
|
28
|
+
"@motiadev/ui": "0.14.0-beta.165-210612",
|
|
29
|
+
"@motiadev/stream-client-react": "0.14.0-beta.165-210612"
|
|
38
30
|
},
|
|
39
31
|
"devDependencies": {
|
|
40
|
-
"@
|
|
32
|
+
"@rollup/plugin-babel": "^6.1.0",
|
|
33
|
+
"@tailwindcss/postcss": "^4.1.17",
|
|
34
|
+
"rollup-plugin-postcss": "^4.0.2",
|
|
41
35
|
"@types/node": "^24.7.2",
|
|
42
36
|
"@types/react": "^19.2.2",
|
|
43
|
-
"
|
|
37
|
+
"babel-plugin-react-compiler": "^1.0.0",
|
|
44
38
|
"react": "^19.2.0",
|
|
45
|
-
"tailwindcss": "^4.1.
|
|
39
|
+
"tailwindcss": "^4.1.17",
|
|
40
|
+
"tsdown": "^0.16.8",
|
|
46
41
|
"tw-animate-css": "^1.2.9",
|
|
47
|
-
"typescript": "^5.9.3"
|
|
48
|
-
"vite": "^7.1.10",
|
|
49
|
-
"vite-plugin-dts": "^4.5.4"
|
|
42
|
+
"typescript": "^5.9.3"
|
|
50
43
|
},
|
|
51
44
|
"scripts": {
|
|
52
|
-
"build": "
|
|
53
|
-
"dev": "
|
|
45
|
+
"build": "tsdown",
|
|
46
|
+
"dev": "tsdown --watch",
|
|
54
47
|
"clean": "rm -rf dist"
|
|
55
48
|
}
|
|
56
49
|
}
|
package/dist/api.d.ts
DELETED
package/dist/api.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACjF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAgBpC,eAAO,MAAM,GAAG,GACd,iBAAiB,kBAAkB,EACnC,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,YAAY,KAAK,KAChB,IAsXF,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dlq-panel.d.ts","sourceRoot":"","sources":["../../src/components/dlq-panel.tsx"],"names":[],"mappings":"AAoBA,OAAO,iCAAiC,CAAA;AAoDxC,eAAO,MAAM,QAAQ,2FA0KnB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"job-detail.d.ts","sourceRoot":"","sources":["../../src/components/job-detail.tsx"],"names":[],"mappings":"AAQA,OAAO,iCAAiC,CAAA;AA2CxC,eAAO,MAAM,SAAS,2FA4HpB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jobs-table.d.ts","sourceRoot":"","sources":["../../src/components/jobs-table.tsx"],"names":[],"mappings":"AAyHA,eAAO,MAAM,SAAS,oFAsDpB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queue-detail.d.ts","sourceRoot":"","sources":["../../src/components/queue-detail.tsx"],"names":[],"mappings":"AAoCA,eAAO,MAAM,WAAW,oFA0LtB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queue-list.d.ts","sourceRoot":"","sources":["../../src/components/queue-list.tsx"],"names":[],"mappings":"AAyEA,eAAO,MAAM,SAAS,oFA8EpB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queues-page.d.ts","sourceRoot":"","sources":["../../src/components/queues-page.tsx"],"names":[],"mappings":"AAmCA,eAAO,MAAM,UAAU,oFAMrB,CAAA"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export declare const useRetryJob: () => import('@tanstack/react-query').UseMutationResult<void, Error, {
|
|
2
|
-
queueName: string;
|
|
3
|
-
jobId: string;
|
|
4
|
-
}, unknown>;
|
|
5
|
-
export declare const useRemoveJob: () => import('@tanstack/react-query').UseMutationResult<void, Error, {
|
|
6
|
-
queueName: string;
|
|
7
|
-
jobId: string;
|
|
8
|
-
}, unknown>;
|
|
9
|
-
export declare const usePromoteJob: () => import('@tanstack/react-query').UseMutationResult<void, Error, {
|
|
10
|
-
queueName: string;
|
|
11
|
-
jobId: string;
|
|
12
|
-
}, unknown>;
|
|
13
|
-
export declare const useRetryFromDLQ: () => import('@tanstack/react-query').UseMutationResult<void, Error, {
|
|
14
|
-
queueName: string;
|
|
15
|
-
jobId: string;
|
|
16
|
-
}, unknown>;
|
|
17
|
-
export declare const useRetryAllFromDLQ: () => import('@tanstack/react-query').UseMutationResult<void, Error, {
|
|
18
|
-
queueName: string;
|
|
19
|
-
}, unknown>;
|
|
20
|
-
export declare const useClearDLQ: () => import('@tanstack/react-query').UseMutationResult<void, Error, {
|
|
21
|
-
queueName: string;
|
|
22
|
-
}, unknown>;
|
|
23
|
-
//# sourceMappingURL=use-jobs-mutations.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-jobs-mutations.d.ts","sourceRoot":"","sources":["../../src/hooks/use-jobs-mutations.ts"],"names":[],"mappings":"AAyDA,eAAO,MAAM,WAAW;eAtDqC,MAAM;WAAS,MAAM;WAmEjF,CAAA;AAED,eAAO,MAAM,YAAY;eA3DqC,MAAM;WAAS,MAAM;WAwElF,CAAA;AAED,eAAO,MAAM,aAAa;eAhEqC,MAAM;WAAS,MAAM;WA6EnF,CAAA;AAED,eAAO,MAAM,eAAe;eArEqC,MAAM;WAAS,MAAM;WAkFrF,CAAA;AAED,eAAO,MAAM,kBAAkB;eA1E8B,MAAM;WAuFlE,CAAA;AAED,eAAO,MAAM,WAAW;eAlF8B,MAAM;WA+F3D,CAAA"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { DLQJobInfo, JobInfo } from '../types/queue';
|
|
2
|
-
export declare const useJobsQuery: () => import('@tanstack/react-query').UseQueryResult<JobInfo[], Error>;
|
|
3
|
-
export declare const useJobQuery: (queueName: string | undefined, jobId: string | undefined) => import('@tanstack/react-query').UseQueryResult<JobInfo | null, Error>;
|
|
4
|
-
export declare const useDLQJobsQuery: (queueName: string | undefined) => import('@tanstack/react-query').UseQueryResult<DLQJobInfo[], Error>;
|
|
5
|
-
//# sourceMappingURL=use-jobs-query.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-jobs-query.d.ts","sourceRoot":"","sources":["../../src/hooks/use-jobs-query.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAa,MAAM,gBAAgB,CAAA;AAgCpE,eAAO,MAAM,YAAY,wEAaxB,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,WAAW,MAAM,GAAG,SAAS,EAAE,OAAO,MAAM,GAAG,SAAS,0EAMnF,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,WAAW,MAAM,GAAG,SAAS,wEAM5D,CAAA"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { QueueInfo } from '../types/queue';
|
|
2
|
-
export declare const useQueues: () => {
|
|
3
|
-
queues: QueueInfo[];
|
|
4
|
-
error: string | null;
|
|
5
|
-
refreshQueue: (name: string) => Promise<QueueInfo | null>;
|
|
6
|
-
pauseQueue: (name: string) => Promise<void>;
|
|
7
|
-
resumeQueue: (name: string) => Promise<void>;
|
|
8
|
-
cleanQueue: (name: string, status: string, grace?: number, limit?: number) => Promise<void>;
|
|
9
|
-
drainQueue: (name: string) => Promise<void>;
|
|
10
|
-
};
|
|
11
|
-
//# sourceMappingURL=use-queues.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-queues.d.ts","sourceRoot":"","sources":["../../src/hooks/use-queues.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAM/C,eAAO,MAAM,SAAS;;;yBA2B0B,MAAM,KAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;uBAajE,MAAM;wBAWN,MAAM;uBAWN,MAAM,UAAU,MAAM;uBAetB,MAAM;CAmBtB,CAAA"}
|