# slother

> Lazy multi-threading for the web ✨

Latest version **0.3.0** (published 2024-06-10) · MIT license · 0 weekly downloads

## Install

```sh
npm install slother
pnpm add slother
yarn add slother
bun add slother
```

## Health

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

Positive: has types; esm support; no vulnerabilities; high quality score.

Warnings: low downloads; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.3.0 |
| Published | 2024-06-10 |
| First published | 2021-11-14 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 0 |
| Unpacked size | 14.4 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Author | Mitchell Fragala |
| Maintainers | msfragala |
| Keywords | web worker, worker, idle, lazy, thread pool, thread, pool |

## Links

- npm: https://www.npmjs.com/package/slother
- Repository: https://github.com/msfragala/slother
- Homepage: https://github.com/msfragala/slother#readme
- Issues: https://github.com/msfragala/slother/issues
- npm.io page: https://npm.io/package/slother

## Alternatives

- [@sindresorhus/slugify](https://npm.io/package/@sindresorhus/slugify.md) — 3.7M weekly downloads
- [solid-js](https://npm.io/package/solid-js.md) — 2.7M weekly downloads
- [expo-glass-effect](https://npm.io/package/expo-glass-effect.md) — 2.5M weekly downloads
- [nanoassert](https://npm.io/package/nanoassert.md) — 780.8K weekly downloads
- [@ffmpeg/ffmpeg](https://npm.io/package/@ffmpeg/ffmpeg.md) — 529.5K weekly downloads

## Recent versions

- 0.3.0 (latest) — 2024-06-10
- 0.2.1 — 2021-11-27
- 0.2.0 — 2021-11-27
- 0.1.0 — 2021-11-14

## README

# Slother 🦥
Lazy multi-threading for the web ✨


### Features
- 🦥 Lazy-loads workers only once needed
- 🧵 Pool API spawns new workers to scale concurrency
- ✨ Proxy API makes using workers easier
- 👍 Supports ESM, CJS, and TypeScript
- 🔥 Written in TypeScript

## Installation
```
npm install --save slother
```
```
yarn add slother
```
```
pnpm add slother
```

## Usage

**worker.js**

```js
import { expose } from 'slother';

expose({
  async add(numbers) {
    return numbers.reduce((sum, number) => sum + number);
  },
  multiply(numbers) {
    return numbers.reduce((product, number) => product * number);
  },
});
```

**main.js**

```js
import { Thread, Pool } from 'slother';

// Threads lazily spawn only a single worker. They are good when
// you need to handle only a few slow tasks or several quick tasks concurrently
const thread = new Thread(() => new Worker('./worker.js'));
const six = await thread.postMessage({ name: 'add', payload: [1, 2, 3] });

// Pools lazily spawn new threads as needed (up to 12 by default).
// They are good when you need to handle a high amount of
// (either slow or quick) tasks concurrently
const pool = new Pool(() => new Worker('./worker.js'));
const five = await pool.postMessage({ name: 'add', payload: [2, 3] });
```

### Proxy API
```js
import { Thread, Pool } from 'slother';

// Thread.proxy passes its arguments to the Thread constructor
// so accepts the same parameters
const thread = Thread.proxy(() => new Worker('./worker.js'));

// Now you can avoid calling postMessage directly with an action object
// and just call arbitrary methods on the thread proxy
const six = await thread.add([1, 2, 3]);

// The only reserved name is "self"
// which exposes the underlying Thread instance
const three = await thread.self.postMessage({ name: 'add', payload: [1, 2] });

// The same all works for Pool too
const pool = Pool.proxy(() => new Worker('./worker.js'));
const four = await pool.add([1, 1, 2]);
const two = await pool.self.postMessage( name: 'add', payload: [1, 1] });
```

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