Type-safe job queues built on BullMQ and Standard Schema.
npm add @falcondev-oss/queueconst jobs = {
video: {
process: defineJob({
schema: z.object({
path: z.string(),
outputFormat: z.enum(['mp4', 'avi', 'mov']),
}),
async run(payload) {
await processVideo(payload.path, payload.outputFormat)
},
workerOptions: {
// only one video processed at a time
concurrency: 1,
},
}),
},
sendEmail: defineJob({
schema: z.object({
to: z.email(),
subject: z.string(),
body: z.string(),
}),
async run(payload) {
await sendEmail(payload.to, payload.subject, payload.body)
},
}),
}You only need the type of your job definitions, so it's easier to use across your entire backend stack without any runtime dependencies.
const queue = createQueueClient<typeof jobs>()Single jobs:
await queue.video.process.add({
outputFormat: 'mp4',
path: '/path/to/video.mov',
})
await queue.sendEmail.add({
to: '[email protected]',
subject: 'Hello',
body: 'This is a test email',
})Bulk jobs:
await queue.sendEmail.addBulk([
{
payload: {
to: '[email protected]',
subject: 'Hello',
body: 'This is a test email',
},
},
{
payload: {
to: '[email protected]',
subject: 'Hello 2',
body: 'This is another test email',
},
opts: {
attempts: 5, // override default job options
},
},
])await startWorkers(jobs)