# @darkobits/sleep

> Async wait utility.

Latest version **3.0.0** (published 2023-10-20) · Hippocratic license · 0 weekly downloads

## Install

```sh
npm install @darkobits/sleep
pnpm add @darkobits/sleep
yarn add @darkobits/sleep
bun add @darkobits/sleep
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities.

Warnings: low downloads.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 3.0.0 |
| Published | 2023-10-20 |
| First published | 2019-02-26 |
| Weekly downloads | 0 |
| License | Hippocratic |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 1 |
| Unpacked size | 26.9 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | darkobits |
| Maintainers | darkobits |
| Keywords | async, asynchronous, sleep, sync, synchronous, wait |

## Links

- npm: https://www.npmjs.com/package/@darkobits/sleep
- Repository: https://github.com/darkobits/sleep
- Homepage: https://github.com/darkobits/sleep#readme
- Issues: https://github.com/darkobits/sleep/issues
- npm.io page: https://npm.io/package/@darkobits/sleep

## Dependencies (1)

- [ms](https://npm.io/package/ms.md) ^2.1.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

- 3.0.0 (latest) — 2023-10-20
- 2.1.5 — 2023-10-20
- 2.1.4 — 2023-02-22
- 2.1.3 — 2023-01-16
- 2.1.2 — 2022-08-12
- 2.1.1 — 2022-08-12
- 2.1.0 — 2022-08-09
- 2.0.1 — 2022-02-11
- 2.0.0 — 2022-02-11
- 1.0.4 — 2020-12-21
- 1.0.3 — 2020-12-16
- 1.0.2 — 2019-08-04
- 1.0.1 — 2019-04-29
- 1.0.0 — 2019-02-26

## README

<p align="center">
  <picture>
    <source
      media="(prefers-color-scheme: dark)"
      srcset="https://github.com/darkobits/sleep/assets/441546/8bf6427f-142f-46a9-bd79-51eb78f85e52"
      width="100%"
    >
    <img
      src="https://github.com/darkobits/sleep/assets/441546/2f4e8e4a-ebed-4bd7-bb0f-704e925a5a37"
      width="100%"
    >
  </picture>
</p>
<p align="center">
  <a
    href="https://www.npmjs.com/package/@darkobits/sleep"
  ><img
    src="https://img.shields.io/npm/v/@darkobits/sleep.svg?style=flat-square"
  ></a>
  <a
    href="https://github.com/darkobits/sleep/actions?query=workflow%3Aci"
  ><img
    src="https://img.shields.io/github/actions/workflow/status/darkobits/sleep/ci.yml?style=flat-square"
  ></a>
  <a
    href="https://depfu.com/repos/github/darkobits/sleep"
  ><img
    src="https://img.shields.io/depfu/darkobits/sleep?style=flat-square"
  ></a>
  <a
    href="https://conventionalcommits.org"
  ><img
    src="https://img.shields.io/static/v1?label=commits&message=conventional&style=flat-square&color=398AFB"
  ></a>
  <a
    href="https://firstdonoharm.dev"
  ><img
    src="https://img.shields.io/static/v1?label=license&message=hippocratic&style=flat-square&color=753065"
  ></a>
</p>

This package provides a means to pause JavaScript execution.

# Install

```
npm install @darkobits/sleep
```

# Use

The most common way to use this tool is asynchronously using `async` / `await`. This will pause the
execution of code within the current function without blocking the main thread.

If a second parameter is provided, the following rules will be followed:

1. If the value is an instance of `Error` (including anything that subclasses it), reject with the error
   after the provided delay.
2. If any other value is provided, resolve after the provided delay with the value.

```ts
import sleep from '@darkobits/sleep';

// Wait for 5 seconds:
await sleep(5000);

// Or, wait for 5 seconds:
await sleep('5 seconds');

// Or, wait for 5 seconds:
await sleep('5s');

// Or, wait for 5 seconds and resolve with a value:
const foo = await sleep('5 seconds', 'foo');

// Or, wait for 5 seconds and reject with an error:
try {
  await sleep('5s', new Error('Barnacles!'));
} catch (err) {
  console.error(err.message) // 'Barnacles!'
}
```

## Synchronous Usage

This package provides a means to pause execution of the main JavaScript thread using `SharedArrayBuffer`
and `Atomics.wait`, which will not spike CPU usage like `while` loops and other approaches.

```ts
import sleep from '@darkobits/sleep';

// Wait for 5 seconds:
sleep.sync(5000);

// Or, wait for 5 seconds:
sleep.sync('5 seconds');

// Or, wait for 5 seconds:
sleep.sync('5s');

// Or, wait for 5 seconds and return a value:
const foo = sleep.sync('5 seconds', 'foo');

// Or, wait for 5 seconds and throw an error:
try {
  sleep.sync('5s', new Error('Barnacles!'));
} catch (err) {
  console.error(err.message) // 'Barnacles!'
}
```

## Caveats

- The APIs required for `sleep.sync` to work (specifically `SharedArrayBuffer`) may not be available in
  all browser contexts. For more information, see [this article](https://blog.logrocket.com/understanding-sharedarraybuffer-and-cross-origin-isolation/).
- The maximum timeout value that can be passed to `setTimeout` is `2_147_483_647` milliseconds; the
  maximum value that can be represented in a signed 32-bit integer. Passing a value larger than this
  will cause a `TimeoutOverflowWarning` and the timeout will be set to `1`. This value turns out to be
  just under 25 days, and is therefore far longer than any reasonable use should require. However, since
  this is primarily a tool for debugging and development, any timeout value that exceeds the maximum
  will be coerced to the maximum value so that things like `sleep(Infinity)` will not violate the
  [Principle of Least Astonishment](https://en.wikipedia.org/wiki/Principle_of_least_astonishment).

<br />
<a href="#top">
  <img src="https://user-images.githubusercontent.com/441546/189774318-67cf3578-f4b4-4dcc-ab5a-c8210fbb6838.png" style="max-width: 100%;">
</a>

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