ciorent 0.4.2 → 0.5.0

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/fiber.d.ts CHANGED
@@ -51,7 +51,7 @@ export declare function join<T extends Process>(t: T): Generator<Awaited<T[0]>,
51
51
  * Wait for a fiber to finish and retrieve its result
52
52
  * @param t
53
53
  */
54
- export declare const done: <T extends Process>(t: T) => T[0];
54
+ export declare const complete: <T extends Process>(t: T) => T[0];
55
55
  /**
56
56
  * Mount child fiber lifetime to parent lifetime
57
57
  * @param child
package/fiber.js CHANGED
@@ -1 +1 @@
1
- import{nextTick,sleep}from"./index.js";export let running=e=>e[1]===1;export let completed=e=>e[1]===2;export let interrupted=e=>e[1]===3;let invoke=async(f,p)=>{await nextTick;try{let e=f.next();for(;!e.done;){let m=await e.value;if(p[1]===3)return;e=f.next(m)}return p[1]=2,e.value}finally{p[1]!==2&&(p[1]=3),p[2].forEach(interrupt)}};export let fn=e=>e;export let spawn=(e,...f)=>{let p=[null,1,[]];return p[0]=invoke(e(p,...f),p),p};export let interrupt=e=>{e[1]!==2&&(e[1]=3)};export let timeout=async(e,p)=>{await sleep(p),interrupt(e)};export function*join(e){return yield e[0]}export let done=e=>e[0];export let mount=(e,f)=>{f[2].push(e)};export let control=(e,f)=>{f.addEventListener(`abort`,()=>{interrupt(e)})};export function*unwrap(e){return yield e}
1
+ import{nextTick,sleep}from"./index.js";export let running=e=>e[1]===1;export let completed=e=>e[1]===2;export let interrupted=e=>e[1]===3;let invoke=async(f,p)=>{await nextTick;try{let e=f.next();while(!e.done){let m=await e.value;if(p[1]===3)return;e=f.next(m)}p[1]=2;return e.value}finally{if(p[1]!==2)p[1]=3;p[2].forEach(interrupt)}};export let fn=e=>e;export let spawn=(e,...f)=>{let p=[null,1,[]];p[0]=invoke(e(p,...f),p);return p};export let interrupt=e=>{if(e[1]!==2)e[1]=3};export let timeout=async(e,p)=>{await sleep(p);interrupt(e)};export function*join(e){return yield e[0]}export let complete=e=>e[0];export let mount=(e,f)=>{f[2].push(e)};export let control=(e,f)=>{f.addEventListener(`abort`,()=>{interrupt(e)})};export function*unwrap(e){return yield e}
package/index.d.ts CHANGED
@@ -12,6 +12,12 @@ export declare const nextTick: Promise<void>;
12
12
  */
13
13
  export declare const sleep: (ms: number) => Promise<void>;
14
14
  /**
15
+ * Timeout a promise after ms milliseconds
16
+ * @param promise - Target promise to timeout
17
+ * @param ms - Timeout duration
18
+ */
19
+ export declare const timeout: <T>(promise: Promise<T>, ms: number) => Promise<T | void>;
20
+ /**
15
21
  * Sleep for a duration synchronously.
16
22
  *
17
23
  * This method blocks the current thread.
package/index.js CHANGED
@@ -1 +1 @@
1
- export let nextTick=Promise.resolve();export let sleep=globalThis.Bun?.sleep??globalThis.process?.getBuiltinModule?.(`timers/promises`).setTimeout??(e=>new Promise(t=>{setTimeout(t,e)}));let sharedBuf=new Int32Array(new SharedArrayBuffer(4));export let sleepSync=globalThis.Bun?.sleepSync??(e=>{Atomics.wait(sharedBuf,0,0,e)});export let sequential=async(e,t,...n)=>{for(let r=0;r<e;r++)await t(...n,r)};export let spawn=(e,t,...n)=>{let r=Array(e);for(let i=0;i<e;i++)r[i]=t(...n,i);return r};export let throttle=(e,t)=>{let n=[null],r=n,i=e=>{n=n[0]=[null,e]},a=t,o=!1,s=()=>{if(a=t,r===n){o=!1;return}do a--,(r=r[0])[1]();while(a>0&&r!==n);setTimeout(s,e)};return async()=>{if(a===0)return new Promise(i);o||(o=!0,setTimeout(s,e)),a--}};
1
+ export let nextTick=Promise.resolve();export let sleep=globalThis.Bun?.sleep??globalThis.process?.getBuiltinModule?.(`timers/promises`).setTimeout??(e=>new Promise(t=>{setTimeout(t,e)}));export let timeout=(e,n)=>Promise.race([e,sleep(n)]);let sharedBuf=new Int32Array(new SharedArrayBuffer(4));export let sleepSync=globalThis.Bun?.sleepSync??(e=>{Atomics.wait(sharedBuf,0,0,e)});export let sequential=async(e,t,...n)=>{for(let r=0;r<e;r++)await t(...n,r)};export let spawn=(e,t,...n)=>{let r=new Array(e);for(let i=0;i<e;i++)r[i]=t(...n,i);return r};export let throttle=(e,t)=>{let n=[null];let r=n;let i=e=>{n=n[0]=[null,e]};let a=t;let o=false;let s=()=>{a=t;if(r===n){o=false;return}do{a--;(r=r[0])[1]()}while(a>0&&r!==n);setTimeout(s,e)};return async()=>{if(a===0)return new Promise(i);if(!o){o=true;setTimeout(s,e)}a--}};
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "ciorent",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "description": "A lightweight, low-overhead concurrency library",
5
5
  "homepage": "https://ciorent.netlify.app",
6
6
  "repository": {
7
- "type": "github",
8
- "url": "https://github.com/re-utils/ciorent"
7
+ "type": "git",
8
+ "url": "git+https://github.com/re-utils/ciorent.git"
9
9
  },
10
10
  "keywords": ["low-overhead", "lightweight", "concurrency", "cross-runtime"],
11
11
  "license": "MIT",
@@ -16,7 +16,7 @@
16
16
  "./queue": "./queue.js",
17
17
  "./fiber": "./fiber.js",
18
18
  ".": "./index.js",
19
- "./semaphore": "./semaphore.js",
20
- "./stream": "./stream.js"
19
+ "./rate-limit": "./rate-limit.js",
20
+ "./semaphore": "./semaphore.js"
21
21
  }
22
22
  }
package/queue.d.ts CHANGED
@@ -1,11 +1,8 @@
1
1
  /**
2
- * @module Queue utilities
2
+ * @module Queue types
3
+ * @private
3
4
  */
4
5
  /**
5
- * Describe a fixed-sized queue
6
- */
7
- export type FixedQueue<T extends {} = {}> = [buffer: (T | undefined | null)[], capacity: number, head: number, tail: number];
8
- /**
9
6
  * Describe a queue node (singly linked list node)
10
7
  */
11
8
  export type QueueNode<T> = [next: QueueNode<T> | null, value: T];
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @module Rate limit
3
+ */
4
+ /**
5
+ * Describe a rate limiter
6
+ */
7
+ export type Limiter = (calls: number, ms: number) => () => boolean;
8
+ /**
9
+ * Fixed window strategy
10
+ * @param limit
11
+ * @param ms
12
+ */
13
+ export declare const fixed: Limiter;
14
+ /**
15
+ * Sliding window strategy
16
+ * @param limit
17
+ * @param ms
18
+ */
19
+ export declare const sliding: Limiter;
20
+ /**
21
+ * Token bucket strategy
22
+ * @param limit
23
+ * @param ms
24
+ */
25
+ export declare const bucket: Limiter;
package/rate-limit.js ADDED
@@ -0,0 +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);n--;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=()=>{n++;if(n<e)setTimeout(r,t)};return()=>{if(n===0)return false;if(n===e)setTimeout(r,t);n--;return true}};
package/semaphore.js CHANGED
@@ -1 +1 @@
1
- export let init=e=>{let n=[null],r=[n,n,e=>{r[0]=r[0][0]=[null,e]},e];return r};export let acquire=async e=>{if(e[3]--,e[3]<0)return new Promise(e[2])};export let release=e=>{e[3]<0&&(e[1]=e[1][0])[1](),e[3]++};export let bind=(e,n)=>async(...r)=>{n[3]--,n[3]<0&&await new Promise(n[2]);try{return await e(...r)}finally{n[3]<0&&(n[1]=n[1][0])[1](),n[3]++}};
1
+ export let init=e=>{let n=[null];let r=[n,n,e=>{r[0]=r[0][0]=[null,e]},e];return r};export let acquire=async e=>{e[3]--;if(e[3]<0)return new Promise(e[2])};export let release=e=>{if(e[3]<0)(e[1]=e[1][0])[1]();e[3]++};export let bind=(e,n)=>async(...r)=>{n[3]--;if(n[3]<0)await new Promise(n[2]);try{return await e(...r)}finally{if(n[3]<0)(n[1]=n[1][0])[1]();n[3]++}};
package/stream.d.ts DELETED
@@ -1,27 +0,0 @@
1
- /**
2
- * @module Streams
3
- */
4
- import type { PromiseFn, UnboundedQueue } from "./queue.js";
5
- /**
6
- * Describe a stream
7
- */
8
- export type Stream<T extends {} = {}> = [...UnboundedQueue<T | ((val?: T) => void)>, callback: PromiseFn<T>, queueing: boolean];
9
- /**
10
- * Create a stream
11
- */
12
- export declare const init: <T extends {} = {}>() => Stream<T>;
13
- /**
14
- * Write a value to the stream
15
- * @param s
16
- * @param v
17
- */
18
- export declare const write: <T extends {} = {}>(s: Stream<T>, v: T) => void;
19
- /**
20
- * Read a value from the stream
21
- * @param s
22
- */
23
- export declare const read: <T extends {} = {}>(s: Stream<T>) => Promise<T | undefined>;
24
- /**
25
- * Release all pending read with undefined
26
- */
27
- export declare const flush: (s: Stream) => void;
package/stream.js DELETED
@@ -1 +0,0 @@
1
- export let init=()=>{let e=[null],r=[e,e,e=>{r[0]=r[0][0]=[null,e]},!1];return r};export let write=(e,r)=>{if(!e[3]){if(e[1][0]!==null){(e[1]=e[1][0])[1](r);return}e[3]=!0}e[0]=e[0][0]=[null,r]};export let read=async e=>e[3]?(e[1]=e[1][0],e[1][0]===null&&(e[3]=!1),e[1][1]):new Promise(e[2]);export let flush=e=>{if(!e[3])for(;e[1][0]!==null;)(e[1]=e[1][0])[1]()};