# client-run-queue

> A client-friendly run queue

Latest version **2.3.12** (published 2025-09-15) · MIT license · 0 weekly downloads

> **Deprecated.** This package is deprecated.

## Install

```sh
npm install client-run-queue
pnpm add client-run-queue
yarn add client-run-queue
bun add client-run-queue
```

## Health

**Score 10/100 (F)** — status: deprecated.

Negative: deprecated.

## Facts

| | |
|---|---|
| Version | 2.3.12 |
| Published | 2025-09-15 |
| First published | 2022-06-17 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 3 |
| Unpacked size | 118.9 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 8 |
| Maintainers | bwestphal |
| Keywords | promise, concurrency, limit, throttle, queue, priority, typescript, client |

## Links

- npm: https://www.npmjs.com/package/client-run-queue
- Repository: https://github.com/TypeScript-OSS/client-run-queue
- Homepage: https://typescript-oss.github.io/client-run-queue/
- Issues: https://github.com/TypeScript-OSS/client-run-queue/issues
- npm.io page: https://npm.io/package/client-run-queue

## Dependencies (3)

- [heap](https://npm.io/package/heap.md) ^0.2.7
- [doublell](https://npm.io/package/doublell.md) ^2.0.1
- [queue-microtask](https://npm.io/package/queue-microtask.md) ^1.2.3

## Alternatives

- [@commercetools/sync-actions](https://npm.io/package/@commercetools/sync-actions.md) — 25.1K weekly downloads
- [cwait](https://npm.io/package/cwait.md) — 21.4K weekly downloads
- [@ledgerhq/hw-app-cosmos](https://npm.io/package/@ledgerhq/hw-app-cosmos.md) — 4.2K weekly downloads
- [@financial-times/o-loading](https://npm.io/package/@financial-times/o-loading.md) — 2.8K weekly downloads
- [fa](https://npm.io/package/fa.md) — 185 weekly downloads

## Recent versions

- 2.3.12 (latest) — 2025-09-15
- 2.3.11 — 2025-04-19
- 2.3.10 — 2025-02-18
- 2.3.9 — 2024-12-06
- 2.3.8 — 2024-11-26
- 2.3.7 — 2024-10-31
- 2.3.6 — 2024-09-25
- 2.3.5 — 2024-09-19
- 2.3.4 — 2024-09-13
- 2.3.3 — 2024-07-30
- 2.3.2 — 2024-06-28
- 2.3.1 — 2024-06-26
- 2.3.0 — 2024-06-25
- 2.2.2 — 2024-02-29
- 2.2.1 — 2023-10-11
- … 22 more at https://npm.io/package/client-run-queue/versions

## README

# client-run-queue

[![Downloads][downloads-badge]][downloads]
[![Size][size-badge]][size]

This package provides a RunQueue implementation for scheduling and managing async or time-consuming functions such that client-side interactivity disruptions are minimized.

## Usage Examples

[Try it Out – CodeSandbox](https://codesandbox.io/s/jolly-mclaren-kmlo7g)

```typescript
import { CANCELED, DEFAULT_PRIORITY, RunQueue } from 'client-run-queue';

const main = async () => {
  const q = new RunQueue('my-queue');

  const doSomeWork = async () => {
    // …do some work – just sleeping for some random time to simulate work here
    await new Promise((resolve) => setTimeout(resolve, Math.random() * 1000));

    return Math.random();
  };

  // Scheduling an entry

  const entry = q.schedule(DEFAULT_PRIORITY, 'my-function', doSomeWork);

  // Checking its various statuses

  console.log('canceled', entry.wasCanceled());
  console.log('completed', entry.wasCompleted());
  console.log('started', entry.wasStarted());

  // Waiting for it to complete

  const result = await entry.promise;
  if (result.ok) {
    console.log('success', result.details);
  } else if (result.details === CANCELED) {
    console.log('canceled');
  } else {
    console.log('failure', result.details);
  }

  // Scheduling more entries using different priorities and options

  q.schedule(2, 'my-function', doSomeWork, { delayMSec: 1000 });
  q.schedule(0, 'my-function', doSomeWork, { neverCancel: true });
  q.schedule(1, 'my-function', doSomeWork);

  // Checking the queue length

  console.log('queue length', q.getQueueLength());

  // Canceling everything

  q.cancelAll();
};
main();
```

## Configuration

With RunQueue, one can specify:

- max parallelism
- max work units and/or continuous work duration per loop iteration
- priority and cancellable per entry (runnable function)

You may then:

- check the status of entries
- request cancellation of specific or all entries
- wait for the promised values of entries

In addition to configuring individual RunQueues in the ways mentioned above, you may also specify:

- a runAfterInteractions function to customize the coordinated scheduling mechanism for your environment (ex. React Native uses `InteractionManager.runAfterInteractions`).  See `setRunAfterInteractions`.  By default, `runAfterInteractions` uses a 0ms timeout.
- Stats tracking functions for debugging and analyzing usage.  See `setStatsHandler`.

## React Native

As noted above, for React Native, it's recommended to use `InteractionManager` for `runAfterInteractions`.  To do that, run code like the following, early in your programs execution:

```typescript
setRunAfterInteractions((_id, func) => {
  const handle = InteractionManager.runAfterInteractions(func);

  return handle.cancel;
})
```

[API Docs](https://typescript-oss.github.io/client-run-queue/)

## Thanks

Thanks for checking it out.  Feel free to create issues or otherwise provide feedback.

Be sure to check out our other [TypeScript OSS](https://github.com/TypeScript-OSS) projects as well.

<!-- Definitions -->

[downloads-badge]: https://img.shields.io/npm/dm/client-run-queue.svg

[downloads]: https://www.npmjs.com/package/client-run-queue

[size-badge]: https://img.shields.io/bundlephobia/minzip/client-run-queue.svg

[size]: https://bundlephobia.com/result?p=client-run-queue

---
_Source: https://npm.io/package/client-run-queue · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
