https://github.com/cameronhunter/pending-promises
A map of pending promises that can be resolved/rejected at a later time.
https://github.com/cameronhunter/pending-promises
Last synced: 8 months ago
JSON representation
A map of pending promises that can be resolved/rejected at a later time.
- Host: GitHub
- URL: https://github.com/cameronhunter/pending-promises
- Owner: cameronhunter
- Created: 2023-11-19T00:12:14.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2024-02-19T01:54:47.000Z (over 2 years ago)
- Last Synced: 2025-02-07T05:49:33.462Z (over 1 year ago)
- Language: TypeScript
- Size: 327 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
Awesome Lists containing this project
README
# `@cameronhunter/pending-promises`
[](https://www.npmjs.com/package/@cameronhunter/pending-promises)
[](https://www.npmjs.com/package/@cameronhunter/pending-promises)
[](https://github.com/cameronhunter/pending-promises/actions/workflows/post-merge.yml)
> A map of pending promises that can be resolved/rejected at a later time.
This data structure helps convert event-based APIs to promise-based. Here's an
example that wraps a WebSocket client, providing a promise-based API.
```ts
import { PendingPromises } from '@cameronhunter/pending-promises';
class MyAPI {
readonly #responses: PendingPromises = new PendingPromises();
readonly #ws: WebSocket;
constructor(ws: WebSocket) {
this.#ws = ws;
this.#ws.on('message', this.#onMessage.bind(this));
}
send(message: string): Promise {
// Create a new pending promise
const [id, promise] = this.#responses.create();
ws.send(JSON.stringify({ id, message }), (err) => {
if (err) {
// Reject immediately if sending fails.
this.#responses.reject(id, err);
}
});
return promise;
}
#onMessage(event: WebSocket.MessageEvent): void {
const { id, result, error } = JSON.parse(event.data as string);
if (id) {
if (error) {
this.#responses.reject(id, error);
} else {
this.#responses.resolve(id, result);
}
}
}
}
```