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 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 signal from "./signal.js";
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();export let state=async r=>{let i=2;r.then(()=>{i=1},()=>{i=0;return r});await nextTick;return i};export let timeout=(e,r)=>new Promise((i,a)=>{e.then(i,r=>{a(r);return e});setTimeout(i,r)});export let sleep=globalThis.Bun?.sleep??globalThis.process?.getBuiltinModule?.(`timers/promises`).setTimeout??(e=>new Promise(r=>{setTimeout(r,e)}));let sharedBuf=new Int32Array(new SharedArrayBuffer(4));export let sleepSync=globalThis.Bun?.sleepSync??(e=>{Atomics.wait(sharedBuf,0,0,e)});export*as signal from"./signal.js";export*as rateLimit from"./rate-limit.js";export*as semaphore from"./semaphore.js";
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.1",
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
- "main": "./index.js",
14
- "types": "./index.d.ts"
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
@@ -1,7 +1,4 @@
1
1
  /**
2
- * @module Rate limit
3
- */
4
- /**
5
2
  * Describe a rate limiter
6
3
  */
7
4
  export type Limiter = (limit: number, ms: number) => () => boolean;
package/rate-limit.js CHANGED
@@ -1 +1 @@
1
- export let fixed=(e,t)=>{let n=e;let r=()=>{n=e};return()=>{if(n===0)return false;if(n--===e)setTimeout(r,t);return true}};export let sliding=(e,t)=>{let n=e;let r=()=>{n++};return()=>{if(n===0)return false;n--;setTimeout(r,t);return true}};export let bucket=(e,t)=>{let n=e;t/=e;let r=()=>{if(n++<e)setTimeout(r,t)};return()=>{if(n===0)return false;if(n--===e)setTimeout(r,t);return true}};
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 | undefined, value: () => void];
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, permits: number) => 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, task: () => Promise<R>) => Promise<R>;
35
+ export declare const queue: <R>(s: Extend<Semaphore>, task: () => Promise<R>) => Promise<R>;
package/semaphore.js CHANGED
@@ -1 +1 @@
1
- export let init=e=>{let r=[,];let i=[r,r,e,e=>{i[0]=i[0][0]=[,e]}];return i};export let acquire=e=>{if(--e[2]<0)return new Promise(e[3])};export let release=e=>{if(e[2]++<0)(e[1]=e[1][0])[1]()};export let control=(e,r)=>async(...a)=>{if(--r[2]<0)await new Promise(r[3]);try{return await e(...a)}finally{release(r)}};export let permits=(r,i)=>control(r,init(i));export let queue=async(e,r)=>{if(--e[2]<0)await new Promise(e[3]);try{return await r()}finally{release(e)}};
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) => Promise<void>;
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
- import{sleep}from"./index.js";export let init=()=>[false];export let any=(...e)=>{let a=[false];for(let o=0;o<e.length;o++)e[o].push(a);return a};export let aborted=e=>e[0];export let abort=e=>{if(!e[0]){e[0]=true;if(e.length>1)for(let a=1;a<e.length;a++)abort(e[a])}};export let abortAfter=async(a,o)=>{await sleep(a);abort(o)};export let timeout=e=>{let a=[false];abortAfter(e,a);return a};
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{};