evnty 4.6.10 → 4.7.1
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/build/callable.cjs +17 -0
- package/build/callable.cjs.map +1 -0
- package/build/callable.d.ts +16 -0
- package/build/callable.js +7 -0
- package/build/callable.js.map +1 -0
- package/build/index.cjs +34 -166
- package/build/index.cjs.map +1 -1
- package/build/index.d.ts +7 -68
- package/build/index.js +19 -153
- package/build/index.js.map +1 -1
- package/build/sequence.cjs +86 -0
- package/build/sequence.cjs.map +1 -0
- package/build/sequence.d.ts +22 -0
- package/build/sequence.js +76 -0
- package/build/sequence.js.map +1 -0
- package/build/signal.cjs +82 -0
- package/build/signal.cjs.map +1 -0
- package/build/signal.d.ts +28 -0
- package/build/signal.js +72 -0
- package/build/signal.js.map +1 -0
- package/build/types.cjs +6 -0
- package/build/types.cjs.map +1 -0
- package/build/types.d.ts +27 -0
- package/build/types.js +3 -0
- package/build/types.js.map +1 -0
- package/package.json +10 -10
- package/src/index.ts +29 -221
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Callable } from './callable.js';
|
|
2
|
+
/**
|
|
3
|
+
* Sequence<T> is a callable construct for buffering and emitting multiple values in order.
|
|
4
|
+
* It implements both Promise<T> and AsyncIterable<T>, allowing sequential consumption of values.
|
|
5
|
+
* Values pushed before consumption are queued, and consumers await `next()` or iterate via `for await...of`.
|
|
6
|
+
*
|
|
7
|
+
* @template T - The type of values buffered in the sequence.
|
|
8
|
+
* @param abortSignal - Optional AbortSignal to abort iteration and resolve pending next calls.
|
|
9
|
+
*/
|
|
10
|
+
export declare class Sequence<T> extends Callable<[T], boolean> implements Promise<T>, AsyncIterable<T> {
|
|
11
|
+
private readonly abortSignal?;
|
|
12
|
+
private sequence;
|
|
13
|
+
private nextSignal;
|
|
14
|
+
constructor(abortSignal?: AbortSignal | undefined);
|
|
15
|
+
get [Symbol.toStringTag](): string;
|
|
16
|
+
get promise(): Promise<T>;
|
|
17
|
+
next(): Promise<T>;
|
|
18
|
+
catch<OK = never>(onrejected?: ((reason: any) => OK | PromiseLike<OK>) | null): Promise<T | OK>;
|
|
19
|
+
finally(onfinally?: (() => void) | null): Promise<T>;
|
|
20
|
+
then<OK = T, ERR = never>(onfulfilled?: ((value: T) => OK | PromiseLike<OK>) | null, onrejected?: ((reason: unknown) => ERR | PromiseLike<ERR>) | null): Promise<OK | ERR>;
|
|
21
|
+
[Symbol.asyncIterator](): AsyncIterator<T, void, void>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Callable } from "./callable.js";
|
|
2
|
+
import { Signal } from "./signal.js";
|
|
3
|
+
export class Sequence extends Callable {
|
|
4
|
+
abortSignal;
|
|
5
|
+
sequence;
|
|
6
|
+
nextSignal;
|
|
7
|
+
constructor(abortSignal){
|
|
8
|
+
super((value)=>{
|
|
9
|
+
if (this.abortSignal?.aborted) {
|
|
10
|
+
this.nextSignal(false);
|
|
11
|
+
return false;
|
|
12
|
+
} else {
|
|
13
|
+
this.sequence.push(value);
|
|
14
|
+
if (this.sequence.length === 1) {
|
|
15
|
+
this.nextSignal(true);
|
|
16
|
+
}
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
}), this.abortSignal = abortSignal;
|
|
20
|
+
this.sequence = [];
|
|
21
|
+
this.nextSignal = new Signal(this.abortSignal);
|
|
22
|
+
this.abortSignal?.addEventListener('abort', ()=>{
|
|
23
|
+
this.nextSignal(false);
|
|
24
|
+
}, {
|
|
25
|
+
once: true
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
get [Symbol.toStringTag]() {
|
|
29
|
+
return `Sequence(${this.abortSignal?.aborted ? 'stopped' : 'active'})`;
|
|
30
|
+
}
|
|
31
|
+
get promise() {
|
|
32
|
+
return this.next();
|
|
33
|
+
}
|
|
34
|
+
async next() {
|
|
35
|
+
if (!this.sequence.length) {
|
|
36
|
+
await this.nextSignal;
|
|
37
|
+
}
|
|
38
|
+
return this.sequence.shift();
|
|
39
|
+
}
|
|
40
|
+
catch(onrejected) {
|
|
41
|
+
return this.promise.catch(onrejected);
|
|
42
|
+
}
|
|
43
|
+
finally(onfinally) {
|
|
44
|
+
return this.promise.finally(onfinally);
|
|
45
|
+
}
|
|
46
|
+
then(onfulfilled, onrejected) {
|
|
47
|
+
return this.promise.then(onfulfilled, onrejected);
|
|
48
|
+
}
|
|
49
|
+
[Symbol.asyncIterator]() {
|
|
50
|
+
return {
|
|
51
|
+
next: async ()=>{
|
|
52
|
+
try {
|
|
53
|
+
const value = await this;
|
|
54
|
+
return {
|
|
55
|
+
value,
|
|
56
|
+
done: false
|
|
57
|
+
};
|
|
58
|
+
} catch {
|
|
59
|
+
return {
|
|
60
|
+
value: undefined,
|
|
61
|
+
done: true
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
return: ()=>{
|
|
66
|
+
this.nextSignal(false);
|
|
67
|
+
return Promise.resolve({
|
|
68
|
+
value: undefined,
|
|
69
|
+
done: true
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=sequence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sequence.ts"],"sourcesContent":["import { Callable } from './callable.js';\nimport { Signal } from './signal.js';\n\n/**\n * Sequence<T> is a callable construct for buffering and emitting multiple values in order.\n * It implements both Promise<T> and AsyncIterable<T>, allowing sequential consumption of values.\n * Values pushed before consumption are queued, and consumers await `next()` or iterate via `for await...of`.\n *\n * @template T - The type of values buffered in the sequence.\n * @param abortSignal - Optional AbortSignal to abort iteration and resolve pending next calls.\n */\nexport class Sequence<T> extends Callable<[T], boolean> implements Promise<T>, AsyncIterable<T> {\n private sequence: T[];\n private nextSignal: Signal<boolean>;\n\n constructor(private readonly abortSignal?: AbortSignal) {\n super((value: T) => {\n if (this.abortSignal?.aborted) {\n this.nextSignal(false);\n return false;\n } else {\n this.sequence.push(value);\n if (this.sequence.length === 1) {\n this.nextSignal(true);\n }\n return true;\n }\n });\n this.sequence = [];\n this.nextSignal = new Signal<boolean>(this.abortSignal);\n this.abortSignal?.addEventListener(\n 'abort',\n () => {\n this.nextSignal(false);\n },\n { once: true },\n );\n }\n\n get [Symbol.toStringTag](): string {\n return `Sequence(${this.abortSignal?.aborted ? 'stopped' : 'active'})`;\n }\n\n get promise(): Promise<T> {\n return this.next();\n }\n\n async next(): Promise<T> {\n if (!this.sequence.length) {\n await this.nextSignal;\n }\n return this.sequence.shift()!;\n }\n\n catch<OK = never>(onrejected?: ((reason: any) => OK | PromiseLike<OK>) | null): Promise<T | OK> {\n return this.promise.catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.promise.finally(onfinally);\n }\n\n then<OK = T, ERR = never>(\n onfulfilled?: ((value: T) => OK | PromiseLike<OK>) | null,\n onrejected?: ((reason: unknown) => ERR | PromiseLike<ERR>) | null,\n ): Promise<OK | ERR> {\n return this.promise.then(onfulfilled, onrejected);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T, void, void> {\n return {\n next: async () => {\n try {\n const value = await this;\n return { value, done: false };\n } catch {\n return { value: undefined, done: true };\n }\n },\n return: () => {\n this.nextSignal(false);\n return Promise.resolve({ value: undefined, done: true });\n },\n };\n }\n}\n"],"names":["Callable","Signal","Sequence","sequence","nextSignal","constructor","abortSignal","value","aborted","push","length","addEventListener","once","Symbol","toStringTag","promise","next","shift","catch","onrejected","finally","onfinally","then","onfulfilled","asyncIterator","done","undefined","return","Promise","resolve"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,MAAM,QAAQ,cAAc;AAUrC,OAAO,MAAMC,iBAAoBF;;IACvBG,SAAc;IACdC,WAA4B;IAEpCC,YAAY,AAAiBC,WAAyB,CAAE;QACtD,KAAK,CAAC,CAACC;YACL,IAAI,IAAI,CAACD,WAAW,EAAEE,SAAS;gBAC7B,IAAI,CAACJ,UAAU,CAAC;gBAChB,OAAO;YACT,OAAO;gBACL,IAAI,CAACD,QAAQ,CAACM,IAAI,CAACF;gBACnB,IAAI,IAAI,CAACJ,QAAQ,CAACO,MAAM,KAAK,GAAG;oBAC9B,IAAI,CAACN,UAAU,CAAC;gBAClB;gBACA,OAAO;YACT;QACF,SAZ2BE,cAAAA;QAa3B,IAAI,CAACH,QAAQ,GAAG,EAAE;QAClB,IAAI,CAACC,UAAU,GAAG,IAAIH,OAAgB,IAAI,CAACK,WAAW;QACtD,IAAI,CAACA,WAAW,EAAEK,iBAChB,SACA;YACE,IAAI,CAACP,UAAU,CAAC;QAClB,GACA;YAAEQ,MAAM;QAAK;IAEjB;IAEA,IAAI,CAACC,OAAOC,WAAW,CAAC,GAAW;QACjC,OAAO,CAAC,SAAS,EAAE,IAAI,CAACR,WAAW,EAAEE,UAAU,YAAY,SAAS,CAAC,CAAC;IACxE;IAEA,IAAIO,UAAsB;QACxB,OAAO,IAAI,CAACC,IAAI;IAClB;IAEA,MAAMA,OAAmB;QACvB,IAAI,CAAC,IAAI,CAACb,QAAQ,CAACO,MAAM,EAAE;YACzB,MAAM,IAAI,CAACN,UAAU;QACvB;QACA,OAAO,IAAI,CAACD,QAAQ,CAACc,KAAK;IAC5B;IAEAC,MAAkBC,UAA2D,EAAmB;QAC9F,OAAO,IAAI,CAACJ,OAAO,CAACG,KAAK,CAACC;IAC5B;IAEAC,QAAQC,SAA+B,EAAc;QACnD,OAAO,IAAI,CAACN,OAAO,CAACK,OAAO,CAACC;IAC9B;IAEAC,KACEC,WAAyD,EACzDJ,UAAiE,EAC9C;QACnB,OAAO,IAAI,CAACJ,OAAO,CAACO,IAAI,CAACC,aAAaJ;IACxC;IAEA,CAACN,OAAOW,aAAa,CAAC,GAAiC;QACrD,OAAO;YACLR,MAAM;gBACJ,IAAI;oBACF,MAAMT,QAAQ,MAAM,IAAI;oBACxB,OAAO;wBAAEA;wBAAOkB,MAAM;oBAAM;gBAC9B,EAAE,OAAM;oBACN,OAAO;wBAAElB,OAAOmB;wBAAWD,MAAM;oBAAK;gBACxC;YACF;YACAE,QAAQ;gBACN,IAAI,CAACvB,UAAU,CAAC;gBAChB,OAAOwB,QAAQC,OAAO,CAAC;oBAAEtB,OAAOmB;oBAAWD,MAAM;gBAAK;YACxD;QACF;IACF;AACF"}
|
package/build/signal.cjs
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "Signal", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return Signal;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _callablecjs = require("./callable.cjs");
|
|
12
|
+
class Signal extends _callablecjs.Callable {
|
|
13
|
+
abortSignal;
|
|
14
|
+
rx;
|
|
15
|
+
constructor(abortSignal){
|
|
16
|
+
super((value)=>{
|
|
17
|
+
if (this.rx) {
|
|
18
|
+
this.rx.resolve(value);
|
|
19
|
+
this.rx = undefined;
|
|
20
|
+
return true;
|
|
21
|
+
} else {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}), this.abortSignal = abortSignal;
|
|
25
|
+
this.abortSignal?.addEventListener('abort', ()=>{
|
|
26
|
+
this.rx?.reject(this.abortSignal.reason);
|
|
27
|
+
this.rx = undefined;
|
|
28
|
+
}, {
|
|
29
|
+
once: true
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
get [Symbol.toStringTag]() {
|
|
33
|
+
return `Signal(${this.abortSignal?.aborted ? 'stopped' : 'active'})`;
|
|
34
|
+
}
|
|
35
|
+
get promise() {
|
|
36
|
+
return this.next();
|
|
37
|
+
}
|
|
38
|
+
async next() {
|
|
39
|
+
if (this.abortSignal?.aborted) {
|
|
40
|
+
return Promise.reject(this.abortSignal.reason);
|
|
41
|
+
}
|
|
42
|
+
if (!this.rx) {
|
|
43
|
+
this.rx = Promise.withResolvers();
|
|
44
|
+
}
|
|
45
|
+
return this.rx.promise;
|
|
46
|
+
}
|
|
47
|
+
catch(onrejected) {
|
|
48
|
+
return this.promise.catch(onrejected);
|
|
49
|
+
}
|
|
50
|
+
finally(onfinally) {
|
|
51
|
+
return this.promise.finally(onfinally);
|
|
52
|
+
}
|
|
53
|
+
then(onfulfilled, onrejected) {
|
|
54
|
+
return this.promise.then(onfulfilled, onrejected);
|
|
55
|
+
}
|
|
56
|
+
[Symbol.asyncIterator]() {
|
|
57
|
+
return {
|
|
58
|
+
next: async ()=>{
|
|
59
|
+
try {
|
|
60
|
+
const value = await this;
|
|
61
|
+
return {
|
|
62
|
+
value,
|
|
63
|
+
done: false
|
|
64
|
+
};
|
|
65
|
+
} catch {
|
|
66
|
+
return {
|
|
67
|
+
value: undefined,
|
|
68
|
+
done: true
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
return: ()=>{
|
|
73
|
+
return Promise.resolve({
|
|
74
|
+
value: undefined,
|
|
75
|
+
done: true
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
//# sourceMappingURL=signal.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/signal.ts"],"sourcesContent":["import { Callable } from './callable.js';\n\n/**\n * Signal<T> is a callable construct for sending and receiving a single asynchronous value.\n * It implements both Promise<T> and AsyncIterable<T>, allowing it to be awaited once\n * or iterated over with `for await...of`. Once signaled, it resolves the pending promise.\n *\n * @template T - The type of value the signal carries.\n * @param abortSignal - Optional AbortSignal used to abort waiting and reject the promise.\n */\nexport class Signal<T> extends Callable<[T], boolean> implements Promise<T>, AsyncIterable<T> {\n private rx?: PromiseWithResolvers<T>;\n\n constructor(private readonly abortSignal?: AbortSignal) {\n super((value: T) => {\n if (this.rx) {\n this.rx.resolve(value);\n this.rx = undefined;\n return true;\n } else {\n return false;\n }\n });\n this.abortSignal?.addEventListener(\n 'abort',\n () => {\n this.rx?.reject(this.abortSignal!.reason);\n this.rx = undefined;\n },\n { once: true },\n );\n }\n\n get [Symbol.toStringTag](): string {\n return `Signal(${this.abortSignal?.aborted ? 'stopped' : 'active'})`;\n }\n\n /**\n * Returns the internal promise that resolves with the signaled value.\n */\n get promise(): Promise<T> {\n return this.next();\n }\n\n /**\n * Waits for the next signal value or rejects if aborted.\n * @returns A promise resolving to the value of type T.\n */\n async next() {\n if (this.abortSignal?.aborted) {\n return Promise.reject(this.abortSignal.reason);\n }\n if (!this.rx) {\n this.rx = Promise.withResolvers<T>();\n }\n return this.rx.promise;\n }\n\n catch<OK = never>(onrejected?: ((reason: any) => OK | PromiseLike<OK>) | null): Promise<T | OK> {\n return this.promise.catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.promise.finally(onfinally);\n }\n\n then<OK = T, ERR = never>(\n onfulfilled?: ((value: T) => OK | PromiseLike<OK>) | null,\n onrejected?: ((reason: unknown) => ERR | PromiseLike<ERR>) | null,\n ): Promise<OK | ERR> {\n return this.promise.then(onfulfilled, onrejected);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T, void, void> {\n return {\n next: async () => {\n try {\n const value = await this;\n return { value, done: false };\n } catch {\n return { value: undefined, done: true };\n }\n },\n return: () => {\n return Promise.resolve({ value: undefined, done: true });\n },\n };\n }\n}\n"],"names":["Signal","Callable","rx","constructor","abortSignal","value","resolve","undefined","addEventListener","reject","reason","once","Symbol","toStringTag","aborted","promise","next","Promise","withResolvers","catch","onrejected","finally","onfinally","then","onfulfilled","asyncIterator","done","return"],"mappings":";;;;+BAUaA;;;eAAAA;;;6BAVY;AAUlB,MAAMA,eAAkBC,qBAAQ;;IAC7BC,GAA6B;IAErCC,YAAY,AAAiBC,WAAyB,CAAE;QACtD,KAAK,CAAC,CAACC;YACL,IAAI,IAAI,CAACH,EAAE,EAAE;gBACX,IAAI,CAACA,EAAE,CAACI,OAAO,CAACD;gBAChB,IAAI,CAACH,EAAE,GAAGK;gBACV,OAAO;YACT,OAAO;gBACL,OAAO;YACT;QACF,SAT2BH,cAAAA;QAU3B,IAAI,CAACA,WAAW,EAAEI,iBAChB,SACA;YACE,IAAI,CAACN,EAAE,EAAEO,OAAO,IAAI,CAACL,WAAW,CAAEM,MAAM;YACxC,IAAI,CAACR,EAAE,GAAGK;QACZ,GACA;YAAEI,MAAM;QAAK;IAEjB;IAEA,IAAI,CAACC,OAAOC,WAAW,CAAC,GAAW;QACjC,OAAO,CAAC,OAAO,EAAE,IAAI,CAACT,WAAW,EAAEU,UAAU,YAAY,SAAS,CAAC,CAAC;IACtE;IAKA,IAAIC,UAAsB;QACxB,OAAO,IAAI,CAACC,IAAI;IAClB;IAMA,MAAMA,OAAO;QACX,IAAI,IAAI,CAACZ,WAAW,EAAEU,SAAS;YAC7B,OAAOG,QAAQR,MAAM,CAAC,IAAI,CAACL,WAAW,CAACM,MAAM;QAC/C;QACA,IAAI,CAAC,IAAI,CAACR,EAAE,EAAE;YACZ,IAAI,CAACA,EAAE,GAAGe,QAAQC,aAAa;QACjC;QACA,OAAO,IAAI,CAAChB,EAAE,CAACa,OAAO;IACxB;IAEAI,MAAkBC,UAA2D,EAAmB;QAC9F,OAAO,IAAI,CAACL,OAAO,CAACI,KAAK,CAACC;IAC5B;IAEAC,QAAQC,SAA+B,EAAc;QACnD,OAAO,IAAI,CAACP,OAAO,CAACM,OAAO,CAACC;IAC9B;IAEAC,KACEC,WAAyD,EACzDJ,UAAiE,EAC9C;QACnB,OAAO,IAAI,CAACL,OAAO,CAACQ,IAAI,CAACC,aAAaJ;IACxC;IAEA,CAACR,OAAOa,aAAa,CAAC,GAAiC;QACrD,OAAO;YACLT,MAAM;gBACJ,IAAI;oBACF,MAAMX,QAAQ,MAAM,IAAI;oBACxB,OAAO;wBAAEA;wBAAOqB,MAAM;oBAAM;gBAC9B,EAAE,OAAM;oBACN,OAAO;wBAAErB,OAAOE;wBAAWmB,MAAM;oBAAK;gBACxC;YACF;YACAC,QAAQ;gBACN,OAAOV,QAAQX,OAAO,CAAC;oBAAED,OAAOE;oBAAWmB,MAAM;gBAAK;YACxD;QACF;IACF;AACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Callable } from './callable.js';
|
|
2
|
+
/**
|
|
3
|
+
* Signal<T> is a callable construct for sending and receiving a single asynchronous value.
|
|
4
|
+
* It implements both Promise<T> and AsyncIterable<T>, allowing it to be awaited once
|
|
5
|
+
* or iterated over with `for await...of`. Once signaled, it resolves the pending promise.
|
|
6
|
+
*
|
|
7
|
+
* @template T - The type of value the signal carries.
|
|
8
|
+
* @param abortSignal - Optional AbortSignal used to abort waiting and reject the promise.
|
|
9
|
+
*/
|
|
10
|
+
export declare class Signal<T> extends Callable<[T], boolean> implements Promise<T>, AsyncIterable<T> {
|
|
11
|
+
private readonly abortSignal?;
|
|
12
|
+
private rx?;
|
|
13
|
+
constructor(abortSignal?: AbortSignal | undefined);
|
|
14
|
+
get [Symbol.toStringTag](): string;
|
|
15
|
+
/**
|
|
16
|
+
* Returns the internal promise that resolves with the signaled value.
|
|
17
|
+
*/
|
|
18
|
+
get promise(): Promise<T>;
|
|
19
|
+
/**
|
|
20
|
+
* Waits for the next signal value or rejects if aborted.
|
|
21
|
+
* @returns A promise resolving to the value of type T.
|
|
22
|
+
*/
|
|
23
|
+
next(): Promise<T>;
|
|
24
|
+
catch<OK = never>(onrejected?: ((reason: any) => OK | PromiseLike<OK>) | null): Promise<T | OK>;
|
|
25
|
+
finally(onfinally?: (() => void) | null): Promise<T>;
|
|
26
|
+
then<OK = T, ERR = never>(onfulfilled?: ((value: T) => OK | PromiseLike<OK>) | null, onrejected?: ((reason: unknown) => ERR | PromiseLike<ERR>) | null): Promise<OK | ERR>;
|
|
27
|
+
[Symbol.asyncIterator](): AsyncIterator<T, void, void>;
|
|
28
|
+
}
|
package/build/signal.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Callable } from "./callable.js";
|
|
2
|
+
export class Signal extends Callable {
|
|
3
|
+
abortSignal;
|
|
4
|
+
rx;
|
|
5
|
+
constructor(abortSignal){
|
|
6
|
+
super((value)=>{
|
|
7
|
+
if (this.rx) {
|
|
8
|
+
this.rx.resolve(value);
|
|
9
|
+
this.rx = undefined;
|
|
10
|
+
return true;
|
|
11
|
+
} else {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}), this.abortSignal = abortSignal;
|
|
15
|
+
this.abortSignal?.addEventListener('abort', ()=>{
|
|
16
|
+
this.rx?.reject(this.abortSignal.reason);
|
|
17
|
+
this.rx = undefined;
|
|
18
|
+
}, {
|
|
19
|
+
once: true
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
get [Symbol.toStringTag]() {
|
|
23
|
+
return `Signal(${this.abortSignal?.aborted ? 'stopped' : 'active'})`;
|
|
24
|
+
}
|
|
25
|
+
get promise() {
|
|
26
|
+
return this.next();
|
|
27
|
+
}
|
|
28
|
+
async next() {
|
|
29
|
+
if (this.abortSignal?.aborted) {
|
|
30
|
+
return Promise.reject(this.abortSignal.reason);
|
|
31
|
+
}
|
|
32
|
+
if (!this.rx) {
|
|
33
|
+
this.rx = Promise.withResolvers();
|
|
34
|
+
}
|
|
35
|
+
return this.rx.promise;
|
|
36
|
+
}
|
|
37
|
+
catch(onrejected) {
|
|
38
|
+
return this.promise.catch(onrejected);
|
|
39
|
+
}
|
|
40
|
+
finally(onfinally) {
|
|
41
|
+
return this.promise.finally(onfinally);
|
|
42
|
+
}
|
|
43
|
+
then(onfulfilled, onrejected) {
|
|
44
|
+
return this.promise.then(onfulfilled, onrejected);
|
|
45
|
+
}
|
|
46
|
+
[Symbol.asyncIterator]() {
|
|
47
|
+
return {
|
|
48
|
+
next: async ()=>{
|
|
49
|
+
try {
|
|
50
|
+
const value = await this;
|
|
51
|
+
return {
|
|
52
|
+
value,
|
|
53
|
+
done: false
|
|
54
|
+
};
|
|
55
|
+
} catch {
|
|
56
|
+
return {
|
|
57
|
+
value: undefined,
|
|
58
|
+
done: true
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
return: ()=>{
|
|
63
|
+
return Promise.resolve({
|
|
64
|
+
value: undefined,
|
|
65
|
+
done: true
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/signal.ts"],"sourcesContent":["import { Callable } from './callable.js';\n\n/**\n * Signal<T> is a callable construct for sending and receiving a single asynchronous value.\n * It implements both Promise<T> and AsyncIterable<T>, allowing it to be awaited once\n * or iterated over with `for await...of`. Once signaled, it resolves the pending promise.\n *\n * @template T - The type of value the signal carries.\n * @param abortSignal - Optional AbortSignal used to abort waiting and reject the promise.\n */\nexport class Signal<T> extends Callable<[T], boolean> implements Promise<T>, AsyncIterable<T> {\n private rx?: PromiseWithResolvers<T>;\n\n constructor(private readonly abortSignal?: AbortSignal) {\n super((value: T) => {\n if (this.rx) {\n this.rx.resolve(value);\n this.rx = undefined;\n return true;\n } else {\n return false;\n }\n });\n this.abortSignal?.addEventListener(\n 'abort',\n () => {\n this.rx?.reject(this.abortSignal!.reason);\n this.rx = undefined;\n },\n { once: true },\n );\n }\n\n get [Symbol.toStringTag](): string {\n return `Signal(${this.abortSignal?.aborted ? 'stopped' : 'active'})`;\n }\n\n /**\n * Returns the internal promise that resolves with the signaled value.\n */\n get promise(): Promise<T> {\n return this.next();\n }\n\n /**\n * Waits for the next signal value or rejects if aborted.\n * @returns A promise resolving to the value of type T.\n */\n async next() {\n if (this.abortSignal?.aborted) {\n return Promise.reject(this.abortSignal.reason);\n }\n if (!this.rx) {\n this.rx = Promise.withResolvers<T>();\n }\n return this.rx.promise;\n }\n\n catch<OK = never>(onrejected?: ((reason: any) => OK | PromiseLike<OK>) | null): Promise<T | OK> {\n return this.promise.catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.promise.finally(onfinally);\n }\n\n then<OK = T, ERR = never>(\n onfulfilled?: ((value: T) => OK | PromiseLike<OK>) | null,\n onrejected?: ((reason: unknown) => ERR | PromiseLike<ERR>) | null,\n ): Promise<OK | ERR> {\n return this.promise.then(onfulfilled, onrejected);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T, void, void> {\n return {\n next: async () => {\n try {\n const value = await this;\n return { value, done: false };\n } catch {\n return { value: undefined, done: true };\n }\n },\n return: () => {\n return Promise.resolve({ value: undefined, done: true });\n },\n };\n }\n}\n"],"names":["Callable","Signal","rx","constructor","abortSignal","value","resolve","undefined","addEventListener","reject","reason","once","Symbol","toStringTag","aborted","promise","next","Promise","withResolvers","catch","onrejected","finally","onfinally","then","onfulfilled","asyncIterator","done","return"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,gBAAgB;AAUzC,OAAO,MAAMC,eAAkBD;;IACrBE,GAA6B;IAErCC,YAAY,AAAiBC,WAAyB,CAAE;QACtD,KAAK,CAAC,CAACC;YACL,IAAI,IAAI,CAACH,EAAE,EAAE;gBACX,IAAI,CAACA,EAAE,CAACI,OAAO,CAACD;gBAChB,IAAI,CAACH,EAAE,GAAGK;gBACV,OAAO;YACT,OAAO;gBACL,OAAO;YACT;QACF,SAT2BH,cAAAA;QAU3B,IAAI,CAACA,WAAW,EAAEI,iBAChB,SACA;YACE,IAAI,CAACN,EAAE,EAAEO,OAAO,IAAI,CAACL,WAAW,CAAEM,MAAM;YACxC,IAAI,CAACR,EAAE,GAAGK;QACZ,GACA;YAAEI,MAAM;QAAK;IAEjB;IAEA,IAAI,CAACC,OAAOC,WAAW,CAAC,GAAW;QACjC,OAAO,CAAC,OAAO,EAAE,IAAI,CAACT,WAAW,EAAEU,UAAU,YAAY,SAAS,CAAC,CAAC;IACtE;IAKA,IAAIC,UAAsB;QACxB,OAAO,IAAI,CAACC,IAAI;IAClB;IAMA,MAAMA,OAAO;QACX,IAAI,IAAI,CAACZ,WAAW,EAAEU,SAAS;YAC7B,OAAOG,QAAQR,MAAM,CAAC,IAAI,CAACL,WAAW,CAACM,MAAM;QAC/C;QACA,IAAI,CAAC,IAAI,CAACR,EAAE,EAAE;YACZ,IAAI,CAACA,EAAE,GAAGe,QAAQC,aAAa;QACjC;QACA,OAAO,IAAI,CAAChB,EAAE,CAACa,OAAO;IACxB;IAEAI,MAAkBC,UAA2D,EAAmB;QAC9F,OAAO,IAAI,CAACL,OAAO,CAACI,KAAK,CAACC;IAC5B;IAEAC,QAAQC,SAA+B,EAAc;QACnD,OAAO,IAAI,CAACP,OAAO,CAACM,OAAO,CAACC;IAC9B;IAEAC,KACEC,WAAyD,EACzDJ,UAAiE,EAC9C;QACnB,OAAO,IAAI,CAACL,OAAO,CAACQ,IAAI,CAACC,aAAaJ;IACxC;IAEA,CAACR,OAAOa,aAAa,CAAC,GAAiC;QACrD,OAAO;YACLT,MAAM;gBACJ,IAAI;oBACF,MAAMX,QAAQ,MAAM,IAAI;oBACxB,OAAO;wBAAEA;wBAAOqB,MAAM;oBAAM;gBAC9B,EAAE,OAAM;oBACN,OAAO;wBAAErB,OAAOE;wBAAWmB,MAAM;oBAAK;gBACxC;YACF;YACAC,QAAQ;gBACN,OAAOV,QAAQX,OAAO,CAAC;oBAAED,OAAOE;oBAAWmB,MAAM;gBAAK;YACxD;QACF;IACF;AACF"}
|
package/build/types.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/build/types.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface Fn<A extends unknown[], R> {
|
|
2
|
+
(...args: A): R;
|
|
3
|
+
}
|
|
4
|
+
export type MaybePromise<T> = Promise<T> | PromiseLike<T> | T;
|
|
5
|
+
export interface Callback<R = void> extends Fn<[], MaybePromise<R>> {
|
|
6
|
+
}
|
|
7
|
+
export interface Listener<T, R = unknown> extends Fn<[T], MaybePromise<R | void>> {
|
|
8
|
+
}
|
|
9
|
+
export interface FilterFunction<T> {
|
|
10
|
+
(value: T): MaybePromise<boolean>;
|
|
11
|
+
}
|
|
12
|
+
export interface Predicate<T, P extends T> {
|
|
13
|
+
(value: T): value is P;
|
|
14
|
+
}
|
|
15
|
+
export type Filter<T, P extends T> = Predicate<T, P> | FilterFunction<T>;
|
|
16
|
+
export interface Mapper<T, R> {
|
|
17
|
+
(value: T): MaybePromise<R>;
|
|
18
|
+
}
|
|
19
|
+
export interface AsyncGenerable<T, R> {
|
|
20
|
+
(value: T): AsyncGenerator<R, void, unknown>;
|
|
21
|
+
}
|
|
22
|
+
export interface Reducer<T, R> {
|
|
23
|
+
(result: R, value: T): MaybePromise<R>;
|
|
24
|
+
}
|
|
25
|
+
export interface Expander<T, R> {
|
|
26
|
+
(value: T): MaybePromise<R>;
|
|
27
|
+
}
|
package/build/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["export interface Fn<A extends unknown[], R> {\n (...args: A): R;\n}\n\nexport type MaybePromise<T> = Promise<T> | PromiseLike<T> | T;\n\nexport interface Callback<R = void> extends Fn<[], MaybePromise<R>> {}\n\nexport interface Listener<T, R = unknown> extends Fn<[T], MaybePromise<R | void>> {}\n\nexport interface FilterFunction<T> {\n (value: T): MaybePromise<boolean>;\n}\n\nexport interface Predicate<T, P extends T> {\n (value: T): value is P;\n}\n\nexport type Filter<T, P extends T> = Predicate<T, P> | FilterFunction<T>;\n\nexport interface Mapper<T, R> {\n (value: T): MaybePromise<R>;\n}\n\nexport interface AsyncGenerable<T, R> {\n (value: T): AsyncGenerator<R, void, unknown>;\n}\n\nexport interface Reducer<T, R> {\n (result: R, value: T): MaybePromise<R>;\n}\n\nexport interface Expander<T, R> {\n (value: T): MaybePromise<R>;\n}\n"],"names":[],"mappings":"AAgCA,WAEC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "evnty",
|
|
3
3
|
"description": "0-Deps, simple, fast, for browser and node js reactive anonymous event library",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.7.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
7
7
|
"main": "build/index.cjs",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"docs:build": "vuepress build docs",
|
|
25
25
|
"docs:clean-dev": "vuepress dev docs --clean-cache",
|
|
26
26
|
"docs:dev": "vuepress dev docs",
|
|
27
|
-
"docs:gen": "node --loader ts-node/esm ./scripts/docgen.ts
|
|
27
|
+
"docs:gen": "rm -f docs/*.tmp.md && for file in src/*.ts; do node --loader ts-node/esm ./scripts/docgen.ts $file; done",
|
|
28
28
|
"docs:update-package": "pnpm dlx vp-update",
|
|
29
29
|
"prepare": "husky"
|
|
30
30
|
},
|
|
@@ -61,18 +61,17 @@
|
|
|
61
61
|
},
|
|
62
62
|
"homepage": "https://github.com/3axap4eHko/evnty#readme",
|
|
63
63
|
"devDependencies": {
|
|
64
|
+
"@eslint/js": "^9.26.0",
|
|
64
65
|
"@swc/jest": "^0.2.38",
|
|
65
66
|
"@types/jest": "^29.5.14",
|
|
66
|
-
"@types/node": "^22.15.
|
|
67
|
+
"@types/node": "^22.15.17",
|
|
67
68
|
"@typescript-eslint/eslint-plugin": "^8.32.0",
|
|
68
69
|
"@typescript-eslint/parser": "^8.32.0",
|
|
69
70
|
"@typescript-eslint/typescript-estree": "^8.32.0",
|
|
70
|
-
"@vuepress/bundler-vite": "2.0.0-rc.
|
|
71
|
-
"@vuepress/theme-default": "2.0.0-rc.
|
|
71
|
+
"@vuepress/bundler-vite": "2.0.0-rc.23",
|
|
72
|
+
"@vuepress/theme-default": "2.0.0-rc.103",
|
|
72
73
|
"eslint": "^9.26.0",
|
|
73
|
-
"eslint-config-
|
|
74
|
-
"eslint-config-prettier": "^9.1.0",
|
|
75
|
-
"eslint-plugin-import": "^2.31.0",
|
|
74
|
+
"eslint-config-prettier": "^10.1.3",
|
|
76
75
|
"eslint-plugin-prettier": "^5.4.0",
|
|
77
76
|
"husky": "^9.1.7",
|
|
78
77
|
"inop": "^0.7.4",
|
|
@@ -82,8 +81,9 @@
|
|
|
82
81
|
"sass-embedded": "^1.87.0",
|
|
83
82
|
"ts-node": "^10.9.2",
|
|
84
83
|
"typescript": "^5.8.3",
|
|
84
|
+
"typescript-eslint": "^8.32.0",
|
|
85
85
|
"vue": "^3.5.13",
|
|
86
|
-
"vuepress": "2.0.0-rc.
|
|
86
|
+
"vuepress": "2.0.0-rc.23"
|
|
87
87
|
},
|
|
88
|
-
"packageManager": "pnpm@10.10.0"
|
|
88
|
+
"packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39"
|
|
89
89
|
}
|