Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | 120x 35x | /**
* blongEvents — typed event bus for blong-browser.
*
* A thin wrapper around the native browser `EventTarget` API, typed for the
* events that blong-browser emits internally. Using `EventTarget` means zero extra
* dependencies and native browser performance.
*
* ## Events
*
* | Type | Fired when |
* |--------------------|-------------------------------------------------|
* | `action:before` | Before any dispatch call |
* | `action:success` | After a dispatch call resolves successfully |
* | `action:error` | After a dispatch call rejects |
*
* ## Usage
*
* ```ts
* import {blongEvents} from '@feasibleone/blong-browser';
*
* // Subscribe
* const off = blongEvents.on('action:success', ({method, result}) => {
* console.log(method, result);
* });
*
* // Unsubscribe
* off();
* ```
*/
/** All event payloads emitted by blong-browser */
export interface BlongEventMap {
/** Emitted before every dispatch call */
'action:before': {method: string; params: unknown};
/** Emitted after a dispatch call resolves */
'action:success': {method: string; params: unknown; result: unknown};
/** Emitted after a dispatch call rejects */
'action:error': {method: string; params: unknown; error: unknown};
}
type BlongEventType = keyof BlongEventMap;
type BlongListener<K extends BlongEventType> = (detail: BlongEventMap[K]) => void;
class BlongEventBus extends EventTarget {
/**
* Subscribe to an event. Returns an `off` function that removes the listener.
*
* @example
* const off = blongEvents.on('action:success', ({method, result}) => { ... });
* // later:
* off();
*/
on<K extends BlongEventType>(type: K, listener: BlongListener<K>): () => void {
const handler = (e: Event) => listener((e as CustomEvent<BlongEventMap[K]>).detail);
this.addEventListener(type, handler);
return () => this.removeEventListener(type, handler);
}
/**
* Emit an event with a typed payload. Called internally by blong-browser — user
* code rarely needs to call this directly.
*/
emit<K extends BlongEventType>(type: K, detail: BlongEventMap[K]): void {
this.dispatchEvent(new CustomEvent(type, {detail}));
}
}
/** Singleton event bus — import and subscribe from anywhere */
export const blongEvents = new BlongEventBus();
|