sync-queue
Sync Queue
At-least-once work queue. Server version is Redis-backed and durable, browser version uses in-memory state. Messages are delivered to exactly one consumer per delivery attempt.
Consumer Pattern
for await (const msg of q.stream({ signal: ac.signal })) {
try {
await handle(msg.data);
await msg.ack();
} catch (error) {
await msg.nack({ delayMs: 3000, reason: "handler_error" });
}
}
Decision Guide
More from valentinkolb/sync
sync-job
Use this skill when implementing durable background jobs with @valentinkolb/sync job: defining typed process handlers with ctx.step/ctx.heartbeat/ctx.signal, submit/join/cancel flows, idempotent submission via key, retries with exponential backoff, lease timeouts, and per-job event streams for audit. Also use when choosing between job (durable execution with state) vs queue (simple work distribution). Also works in the browser via `@valentinkolb/sync/browser` with in-memory state — same API, no Redis needed.
9sync-retry
Use this skill when handling transient transport failures with @valentinkolb/sync retry utility: wrapping Redis/network calls with exponential backoff, configuring per-call retry overrides, using AbortSignal for cooperative cancellation, and classifying errors with retryIf. Also use when writing stream reader loops that must survive brief outages. Works identically in the browser via `@valentinkolb/sync/browser` — no Redis dependency, uses setTimeout-based sleep.
9sync-ephemeral
Use this skill when implementing short-lived typed state with @valentinkolb/sync ephemeral: TTL-based key/value with upsert/touch/remove, snapshot-plus-cursor reconciliation for cache hydration, streaming upsert/touch/delete/expire events, capacity/payload limits, and presence-style use cases where entries should naturally expire. Also works in the browser via `@valentinkolb/sync/browser` with in-memory state — same API, no Redis needed.
9sync-scheduler
Use this skill when implementing distributed cron scheduling with @valentinkolb/sync scheduler: registering idempotent schedules across pods, leader-fenced dispatch via job.submit, misfire policy (skip/catch_up_one/catch_up_all), triggerNow for manual dispatch, unregister, metrics/health, and multi-pod leader election. Depends on sync-job for execution and sync-mutex for leader lock. Also works in the browser via `@valentinkolb/sync/browser` for single-tab cron scheduling — same API, no Redis needed.
9sync-topic
Use this skill when implementing event streams with @valentinkolb/sync topic: publishing typed events with idempotency, consumer-group processing with commit for at-least-once delivery, live replay from any cursor, retention tuning, and multi-tenant stream isolation. Also use when choosing between topic (pub/sub events) vs queue (work distribution). Also works in the browser via `@valentinkolb/sync/browser` as an in-memory event bus — same API, no Redis needed.
9sync-mutex
Use this skill when working with @valentinkolb/sync distributed locks: exclusive critical sections across pods with withLock/withLockOrThrow, manual acquire/release, lease extension for long work, retry tuning, owner-safe release via Lua, and LockError handling. Also works in the browser via `@valentinkolb/sync/browser` with an in-memory store for single-tab lock coordination.
9