@qsithub/asynkit
Version:
Easy JS async tooling
258 lines (182 loc) • 6.91 kB
Markdown
# ASynKit
A lightweight JavaScript library for managing asynchronous operations in browser environments using ECMAScript Modules (ESM).
**Version**: 1.0.1
**Created**: September 10, 2025
**Author**: QSIT
**License**: MIT
## Overview
ASynKit simplifies asynchronous programming in browsers with a class-based API for creating synchronizers, managing Promise lifecycles, polling conditions, and converting callbacks to Promises. Designed for ESM, it’s ideal for modern web applications and includes a built-in `promisify` utility for callback conversion, requiring no external dependencies.
Key features:
- Manual Promise synchronization with `syncer`
- Promise lifecycle tracking with `sync`
- Polling for Promises or conditions with `waitFor` and `poll` (with cancellation support)
- Support for multiple synchronizers with `waitForAll`
- Pausing execution with `pause`
- Callback-to-Promise conversion with `awaitCallback`
## Installation
### Using a CDN
Include ASynKit in your HTML using a CDN (replace `1.0.1` with the desired version):
```html
<script type="module">
import ASynKit from 'https://cdn.jsdelivr.net/npm/@qsithub/asynkit@1.0.1/dist/index.js';
const asyncKit = new ASynKit();
</script>
```
### Using npm and a Bundler
Install via npm for use with a bundler like Webpack or Rollup:
bashnpm install asynkit
Bundle the library into your project:
```javascript
import ASynKit from 'asynkit';
const asyncKit = new ASynKit();
```
### Usage
Import the ASynKit class in a browser environment using ESM:
```html
<script type="module">
import ASynKit from 'https://cdn.jsdelivr.net/npm/@qsithub/asynkit@1.0.1/dist/index.js';
const asyncKit = new ASynKit();
// Example usage
async function example() {
const { resume, syncer } = asyncKit.syncer();
setTimeout(() => resume('Done'), 1000);
await syncer;
console.log('Synchronizer resolved');
}
example();
</script>
```
### Methods
#### syncer()
Creates a synchronizer object with a Promise and its resolver for manual control.
Returns: { resume: Function, syncer: Promise }
Example:
```javascript
const { resume, syncer } = asyncKit.syncer();
setTimeout(() => resume('Done'), 1000);
syncer.then((value) => console.log(value)); // Logs: "Done"
```
#### sync(thenable, opts)
Tracks the completion of a Promise-like object, returning a synchronizer object.
Parameters:
thenable: A Promise or Promise-like object (e.g., fetch response).
opts:
timeout (number): Timeout in milliseconds.
onDone (Function): Callback on completion.
discardOnTimeout (boolean): Discard results if timed out.
onTimeout (Function): Callback on timeout.
Returns: { done: boolean, value: any, error: any }
Example:
```javascript
const promise = fetch('https://api.example.com/data').then((res) => res.json());
const synchronizer = asyncKit.sync(promise, {
timeout: 1000,
onDone: (sync) => console.log('Done:', sync.value),
onTimeout: () => console.log('Timed out'),
});
```
#### waitFor(synchronizer, timeout, opts)
Waits for a synchronizer or thenable to complete, with polling and cancellation support.
Parameters:
synchronizer: Synchronizer object or thenable.
timeout (number): Timeout in milliseconds.
opts:
onDone (Function): Callback on completion.
onTimeout (Function): Callback on timeout.
interval (number): Polling interval (minimum 150ms).
Returns: Promise with a cancel method.
Example:
```javascript
const { resume, syncer } = asyncKit.syncer();
const timer = asyncKit.waitFor(syncer, 2000, {
onDone: () => console.log('Completed'),
onTimeout: () => console.log('Timed out'),
});
setTimeout(() => resume('Done'), 1000);
await timer; // Resolves with "Done"
// To cancel: timer.cancel();
```
#### waitForAll(synchronizers, timeout, opts)
Waits for an array of synchronizers or thenables to complete.
Parameters:
synchronizers: Array of synchronizer objects or thenables.
timeout (number): Timeout in milliseconds.
opts: Same as waitFor options.
Returns: Promise resolving to an array of results.
Example:
```javascript
const syncers = [asyncKit.syncer().syncer, asyncKit.syncer().syncer];
asyncKit.waitForAll(syncers, 1000).then((results) => console.log(results));
```
#### pause(timeout, resumeTrigger)
Pauses execution for a specified duration, with optional manual resume.
Parameters:
timeout (number): Duration in milliseconds (default: 0).
resumeTrigger (Object): Object to attach resume function to.
Returns: Promise
Example:
```javascript
const trigger = {};
const timer = asyncKit.pause(1000, trigger);
setTimeout(() => trigger.resume(), 500); // Resumes early
await timer; // Resolves after 500ms
```
#### poll(testFunction, timeout, opts)
Polls a test function until it returns true or times out, with cancellation support.
Parameters:
testFunction: Function to poll (must return a boolean).
timeout (number): Timeout in milliseconds.
opts:
onDone (Function): Callback on completion.
onTimeout (Function): Callback on timeout.
interval (number): Polling interval (minimum 150ms).
Returns: Promise with a cancel method.
Example:
```javascript
let count = 0;
const test = () => (count++ > 3);
const timer = asyncKit.poll(test, 2000, {
onDone: () => console.log('Condition met'),
onTimeout: () => console.log('Timed out'),
});
await timer; // Resolves after ~600ms (4 polls at 150ms)
```
#### awaitCallback(callback, timeout, opts)
Converts a callback-based function to a Promise and waits for it.
Parameters:
callback: Function to promisify (expects a callback as its last argument).
timeout (number): Timeout in milliseconds.
opts: Same as waitFor options.
Returns: Promise
Example:
```javascript
// Example with a callback-based API
function fetchData(url, callback) {
setTimeout(() => callback(null, { data: 'example' }), 500);
}
const fetchAsync = asyncKit.awaitCallback(fetchData, 1000);
const result = await fetchAsync('https://api.example.com');
console.log(result); // { data: 'example' }
```
### Combining Methods
Example:
```javascript
import ASynKit from './dist/ASynKit.js';
const asyncKit = new ASynKit();
async function example() {
const { resume, syncer } = asyncKit.syncer();
const synchronizer = asyncKit.sync(syncer, {
timeout: 2000,
onDone: (sync) => console.log('Synchronizer:', sync),
onTimeout: () => console.log('Timeout occurred'),
});
const timer = asyncKit.waitFor(synchronizer, 3000, {
onDone: () => console.log('Wait completed'),
onTimeout: () => console.log('Wait timed out'),
});
// Simulate async work
setTimeout(() => resume('Task completed'), 1000);
await timer; // Waits for completion
}
example();
```