Skip to content

Jobs

Copy page

Mutators receive a jobs scheduler in context:

defineMutator(input, async ({ tx, jobs, actor }, args) => {
await tx.insert(ledgerEntries).values({ ... });
jobs.schedule("smsReminder", { entryId, at: reminderAt });
return { affectedBuckets: [shopId] };
});
import { createJobScheduler, createJobWorker } from "@nizhal/server";
const jobs = {
smsReminder: { handler: smsReminderHandler },
};
createNizhalServer({ ..., jobs });

createJobScheduler buffers tasks inside the mutator transaction. createJobWorker drains _nizhal_jobs durably after commit.

  • Enqueue is atomic with the mutator write
  • At-least-once delivery — handlers must be idempotent
  • Failed jobs retry with backoff (see server implementation)

Credit-ledger’s smsReminderHandler is the reference pattern for scheduled side effects that must not block the user’s offline write path.