Queue
Depending on the framework, creating a queue works a bit different. Take a look at the sidebar to find a guide for your framework.
.enqueue
async enqueue(
  payload: T,
  options: {
    id?: string;
    override?: boolean;
    runAt?: Date;
    delay?: number | string;
    repeat?: {
      every?: number | string;
      times?: number;
      cron?: string | [schedule: string, timezone: string];
    }
    retry?: (number | string)[];
    exclusive?: boolean;
  }
): Promise<Job<T>>
Enqueues a new Job and returns it.
Schedule for a specified date
birthdayQueue.enqueue(user.id, {
  runAt: user.birthday,
});
Delay by a week
welcomeUserQueue.enqueue(user.id, {
  delay: "7d", // same as 7 * 24 * 60 * 60 * 1000
});
Repeated job
todoReminders.enqueue(todo.id, {
  runAt: todo.scheduled_date,
  id: todo.id,
  repeat: {
    every: "1d",
    times: 3,
  },
});
Runs three times: At scheduled_date, one day later and two days later.
CRON Schedule
This example is about regular Jobs, executed on a cron schedule.
If you're looking for Cron Jobs, take a look at the more idiomatic CronJob.
billingQueue.enqueue(undefined, {
  id: "billing", // makes sure job isn't duplicated
  override: true, // if another job with that ID already exists, override it
  repeat: {
    cron: ["* * * * 1 *", "Europe/Berlin"],
  },
});
If no timezone is specified, it defaults to Etc/UTC.
Order Queue
orderQueue.enqueue(
  { ... },
  {
    id: "1234", // if two jobs share the same `runAt`, they're ordered by ID.
    exclusive: true, // make sure only one job is executed at once
  }
);
You can also specify { exclusive: true } as the third argument to the Queue constructor.
Retryable
apiIntegrationQueue.enqueue(
  { ... },
  {
    retry: ["10sec", "5min", "1h"]
  }
);
Retries a jobs three times, until it successd: After 10 seconds, 5 minutes and 1 hour.
You can also specify { retry: [ ... ] } as the third argument to the Queue constructor.
Currently, there's a hard limit of 10 retry attempts.
.enqueueMany
async enqueueMany(
  jobs: { payload: T; options?: EnqueueJobOpts }[]
): Promise<Job<T>[]>
Works just like .enqueue, but creates multiple jobs at once.
Currently, there's a hard limit of 1000 jobs to be created at once.
.get
*get(): AsyncIterator<Job<T>[]>
A generator function that can be used to iterate over pending jobs:
for await (const jobs of queue.get()) {
  // do something
}
.getById
getById(id: string): Promise<Job<T> | null>
Returns a job's representation, if it exists.
.invoke
invoke(id: string): Promise<Job<T> | null>
Gets a job and invokes it, if it exists. Returns the job's representation.
.delete
delete(id: string): Promise<Job<T> | null>
Gets a job and deletes it, if it exists. Returns the job's representation.
Job
A representation of a pending job.
Can be retrieved using Queue methods.
id
id: string;
The job's id.
If not specified during .enqueue, it's a random UUID generated by Quirrel.
endpoint
endpoint: string;
The HTTP endpoint the job will be executed against. Is always the same.
body
body: T;
The job's payload.
runAt
runAt: Date;
The date the job is scheduled for.
count
count: number;
The repetition of this execution. Starts at 1, increments with each repetition / retry.
repeat
{
  cron?: string;
  times?: number;
  every?: number;
  count: number;
}
Repetition options of the job.
count starts at 1 and is incremented with every execution.
exclusive
exclusive: boolean;
If a job is marked as exclusive, that means there won't be any other job (in the same queue) executed at the same time.
If applied to all jobs in a queue, that effectively guarantees serial execution.
.invoke
invoke(): Promise<boolean>
Invokes the job.
Returns false if it's already been executed / deleted.
.delete
delete(): Promise<boolean>
Deletes the job.
Returns false if it's already been deleted / executed.