signal-controller
Advanced tools
+4
-0
@@ -20,2 +20,6 @@ declare const ONCE_SYMBOL: unique symbol; | ||
| on<K extends keyof T>(signalName: K, options: SignalListenerOptions, listener: T[K]): void; | ||
| stream<K extends keyof T>(signalName: K): ReadableStream<Parameters<T[K]>>; | ||
| next<K extends keyof T>(signalName: K, { signal }?: { | ||
| signal?: AbortSignal | undefined; | ||
| }): Promise<Parameters<T[K]>>; | ||
| off(signalName: keyof T, listener: ListenerFunction): void; | ||
@@ -22,0 +26,0 @@ [CLEAR](signalName?: keyof T): void; |
+17
-4
| const ONCE_SYMBOL = Symbol('once'); | ||
| const EMIT = Symbol('emit'); | ||
| const CLEAR = Symbol('clear'); | ||
| // interface SignalControllerOptions { | ||
| // // TODO Events not immediately handled should be queued and, once a listener is added, it's immediately called | ||
| // enqueue?: boolean; | ||
| // } | ||
| export class SignalEmitter { | ||
@@ -56,2 +52,19 @@ #listeners = new Map(); | ||
| } | ||
| stream(signalName) { | ||
| const aborter = new AbortController(); | ||
| return new ReadableStream({ | ||
| start: (controller) => { | ||
| this.on(signalName, { signal: aborter.signal }, ((...args) => { | ||
| controller.enqueue(args); | ||
| })); | ||
| }, | ||
| cancel: reason => aborter.abort(reason), | ||
| }); | ||
| } | ||
| next(signalName, { signal = undefined } = {}) { | ||
| return new Promise((resolve, reject) => { | ||
| signal?.addEventListener('abort', reason => reject(reason)); | ||
| this.on(signalName, { once: true }, ((values) => resolve(values))); | ||
| }); | ||
| } | ||
| off(signalName, listener) { | ||
@@ -58,0 +71,0 @@ delete listener[ONCE_SYMBOL]; |
+1
-1
| { | ||
| "name": "signal-controller", | ||
| "version": "0.1.1", | ||
| "version": "0.2.0", | ||
| "description": "A lightweight event emitter with separation of concerns between emitter and listener inspired by the AbortController interface. It also supports using AbortController to remove listeners.", | ||
@@ -5,0 +5,0 @@ "author": "Leonardo Raele <leonardoraele@gmail.com>", |
5280
14.88%138
14.05%