ciorent 0.12.1 → 0.12.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +8 -5
- package/index.js +1 -1
- package/mutex.d.ts +12 -0
- package/mutex.js +1 -0
- package/package.json +9 -3
- package/rate-limit.d.ts +0 -3
- package/rate-limit.js +1 -1
- package/semaphore.d.ts +7 -9
- package/semaphore.js +1 -1
- package/signal.d.ts +1 -1
- package/signal.js +1 -1
- package/types.d.ts +1 -0
- package/types.js +1 -0
package/index.d.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module Other utilities
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
2
|
* Continue the execution on next event loop cycle.
|
|
6
3
|
*
|
|
7
4
|
* You can `await` this **occasionally** in an expensive synchronous operation to avoid
|
|
8
|
-
*
|
|
9
5
|
* blocking the main thread and let other asynchronous task to run.
|
|
10
6
|
*/
|
|
11
7
|
export declare const nextTick: Promise<void>;
|
|
@@ -17,6 +13,12 @@ export declare const nextTick: Promise<void>;
|
|
|
17
13
|
*/
|
|
18
14
|
export declare const state: (p: Promise<any>) => Promise<0 | 1 | 2>;
|
|
19
15
|
/**
|
|
16
|
+
* Check whether a value is awaitable
|
|
17
|
+
* @param p
|
|
18
|
+
* @returns
|
|
19
|
+
*/
|
|
20
|
+
export declare const isThenable: <T>(p: unknown) => p is PromiseLike<T>;
|
|
21
|
+
/**
|
|
20
22
|
* Timeout a promise
|
|
21
23
|
* @param p
|
|
22
24
|
* @param ms
|
|
@@ -36,6 +38,7 @@ export declare const sleep: (ms: number) => Promise<void>;
|
|
|
36
38
|
* @param ms - Sleep duration in milliseconds
|
|
37
39
|
*/
|
|
38
40
|
export declare const sleepSync: (ms: number) => void;
|
|
39
|
-
export * as
|
|
41
|
+
export * as mutex from "./mutex.js";
|
|
40
42
|
export * as rateLimit from "./rate-limit.js";
|
|
41
43
|
export * as semaphore from "./semaphore.js";
|
|
44
|
+
export * as signal from "./signal.js";
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export let nextTick=Promise.resolve();
|
|
1
|
+
export let nextTick=Promise.resolve();let getFinishedState=async(s,p)=>{try{await p;s[0]=1}catch(e){s[0]=0;return p}};export let state=async p=>{let res=[2];getFinishedState(res,p);await nextTick;return res[0]};export let isThenable=p=>p!==null&&typeof p===`object`&&!Array.isArray(p)&&typeof p.then===`function`;let resolvePromise=async(resolver,p)=>{try{resolver.resolve(await p)}catch(e){resolver.reject(e);return p}};export let timeout=(p,ms)=>{let resolver=Promise.withResolvers();setTimeout(resolver.resolve,ms);resolvePromise(resolver,p);return resolver.promise};export let sleep=globalThis.Bun?.sleep??globalThis.process?.getBuiltinModule?.(`timers/promises`).setTimeout??(ms=>new Promise(res=>{setTimeout(res,ms)}));let sharedBuf=new Int32Array(new SharedArrayBuffer(4));export let sleepSync=globalThis.Bun?.sleepSync??(ms=>{Atomics.wait(sharedBuf,0,0,ms)});export*as mutex from"./mutex.js";export*as rateLimit from"./rate-limit.js";export*as semaphore from"./semaphore.js";export*as signal from"./signal.js";
|
package/mutex.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Describe a mutex
|
|
3
|
+
*/
|
|
4
|
+
export type Mutex = () => Promise<() => void>;
|
|
5
|
+
/**
|
|
6
|
+
* Create a mutex.
|
|
7
|
+
*/
|
|
8
|
+
export declare const init: () => Mutex;
|
|
9
|
+
/**
|
|
10
|
+
* Equivalent to `semaphore.permits(fn, 1)` but way faster.
|
|
11
|
+
*/
|
|
12
|
+
export declare const permits: <const T extends (...args: any[]) => Promise<any>>(fn: T) => T;
|
package/mutex.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{nextTick}from"./index.js";export let init=()=>{let lock=nextTick;let resolve;let callback=res=>{resolve=res};return async()=>{let currentLock=lock;lock=new Promise(callback);let release=resolve;await currentLock;return release}};let chainLock=async(lock,fn,...args)=>{try{await lock}catch{}return fn(...args)};export let permits=fn=>{let lock=nextTick;return(...args)=>lock=chainLock(lock,fn,...args)};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ciorent",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.3",
|
|
4
4
|
"description": "A lightweight, low-overhead concurrency library",
|
|
5
5
|
"homepage": "https://re-utils.pages.dev/concurrency",
|
|
6
6
|
"repository": {
|
|
@@ -10,6 +10,12 @@
|
|
|
10
10
|
"keywords": ["low-overhead", "lightweight", "concurrency", "cross-runtime"],
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"type": "module",
|
|
13
|
-
"
|
|
14
|
-
"types": "./
|
|
13
|
+
"exports": {
|
|
14
|
+
"./types": "./types.js",
|
|
15
|
+
".": "./index.js",
|
|
16
|
+
"./semaphore": "./semaphore.js",
|
|
17
|
+
"./mutex": "./mutex.js",
|
|
18
|
+
"./signal": "./signal.js",
|
|
19
|
+
"./rate-limit": "./rate-limit.js"
|
|
20
|
+
}
|
|
15
21
|
}
|
package/rate-limit.d.ts
CHANGED
package/rate-limit.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export let fixed=(
|
|
1
|
+
export let fixed=(limit,ms)=>{let cur=limit;let unlock=()=>{cur=limit};return()=>{if(cur===0)return false;if(cur--===limit)setTimeout(unlock,ms);return true}};export let sliding=(limit,ms)=>{let cur=limit;let unlock=()=>{cur++};return()=>{if(cur===0)return false;cur--;setTimeout(unlock,ms);return true}};export let bucket=(limit,ms)=>{let cur=limit;ms/=limit;let unlock=()=>{if(cur++<limit)setTimeout(unlock,ms)};return()=>{if(cur===0)return false;if(cur--===limit)setTimeout(unlock,ms);return true}};
|
package/semaphore.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
* @module Semaphores
|
|
3
|
-
*/
|
|
1
|
+
import type { Extend } from "./types.js";
|
|
4
2
|
/**
|
|
5
3
|
* Describe a singly linked list node
|
|
6
4
|
*/
|
|
7
|
-
export type QueueNode = [next: QueueNode |
|
|
5
|
+
export type QueueNode = [next: QueueNode | null, value: () => void];
|
|
8
6
|
/**
|
|
9
7
|
* Describe a semaphore
|
|
10
8
|
*/
|
|
@@ -16,22 +14,22 @@ export declare const init: (n: number) => Semaphore;
|
|
|
16
14
|
/**
|
|
17
15
|
* Wait until the semaphore allows access
|
|
18
16
|
*/
|
|
19
|
-
export declare const acquire: (s: Semaphore) => Promise<void> | void;
|
|
17
|
+
export declare const acquire: (s: Extend<Semaphore>) => Promise<void> | void;
|
|
20
18
|
/**
|
|
21
19
|
* Signal to the semaphore to release access
|
|
22
20
|
*/
|
|
23
|
-
export declare const release: (s: Semaphore) => void;
|
|
21
|
+
export declare const release: (s: Extend<Semaphore>) => void;
|
|
24
22
|
/**
|
|
25
23
|
* Control concurrency of a task with a semaphore
|
|
26
24
|
*/
|
|
27
|
-
export declare const control: <T extends (...args: any[]) => Promise<any>>(task: T, s: Semaphore) => T;
|
|
25
|
+
export declare const control: <T extends (...args: any[]) => Promise<any>>(task: T, s: Extend<Semaphore>) => T;
|
|
28
26
|
/**
|
|
29
27
|
* Set maximum concurrency for a task (fast path)
|
|
30
28
|
*/
|
|
31
|
-
export declare const permits: <T extends (...args: any[]) => Promise<any>>(task: T,
|
|
29
|
+
export declare const permits: <T extends (...args: any[]) => Promise<any>>(task: T, perms: number) => T;
|
|
32
30
|
/**
|
|
33
31
|
* Queue a task
|
|
34
32
|
* @param s
|
|
35
33
|
* @param task
|
|
36
34
|
*/
|
|
37
|
-
export declare const queue: <R>(s: Semaphore
|
|
35
|
+
export declare const queue: <R>(s: Extend<Semaphore>, task: () => Promise<R>) => Promise<R>;
|
package/semaphore.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export let init=
|
|
1
|
+
export let init=n=>{let r=[null,null];let s=[r,r,n,f=>{s[0]=s[0][0]=[null,f]}];return s};export let acquire=s=>{if(--s[2]<0)return new Promise(s[3])};export let release=s=>{if(s[2]++<0)(s[1]=s[1][0])[1]()};export let control=(task,s)=>async(...args)=>{if(--s[2]<0)await new Promise(s[3]);try{return await task(...args)}finally{release(s)}};export let permits=(task,perms)=>control(task,init(perms));export let queue=async(s,task)=>{try{return await(--s[2]<0?new Promise(s[3]).then(task):task())}finally{release(s)}};
|
package/signal.d.ts
CHANGED
|
@@ -25,7 +25,7 @@ export declare const abort: (t: Signal) => void;
|
|
|
25
25
|
* Abort a signal after a duration
|
|
26
26
|
* @param t
|
|
27
27
|
*/
|
|
28
|
-
export declare const abortAfter: (ms: number, t: Signal) =>
|
|
28
|
+
export declare const abortAfter: (ms: number, t: Signal) => void;
|
|
29
29
|
/**
|
|
30
30
|
* Create a signal that aborts after ms
|
|
31
31
|
* @param ms
|
package/signal.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export let init=()=>[false];export let any=(...sigs)=>{let sig=[false];for(let i=0;i<sigs.length;i++)sigs[i].push(sig);return sig};export let aborted=t=>t[0];export let abort=t=>{if(!t[0]){t[0]=true;if(t.length>1)for(let i=1;i<t.length;i++)abort(t[i])}};export let abortAfter=(ms,t)=>{setTimeout(()=>abort(t),ms)};export let timeout=ms=>{let sig=[false];abortAfter(ms,sig);return sig};
|
package/types.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type Extend<T extends any[]> = [...T, ...any[]];
|
package/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|