Skip to content

Commit

Permalink
Emittery generic is an eventName->EventData map
Browse files Browse the repository at this point in the history
  • Loading branch information
dinoboff committed Dec 4, 2017
1 parent 1b983d5 commit 7e8292a
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 15 deletions.
15 changes: 10 additions & 5 deletions examples/typed.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
import Emittery from '../';

type EventType = 'value' | 'end' | 'error';

interface IRecord {
msg: string;
data?: any[];
ts: number;
}

type EventType = {
'value': IRecord,
'end': null,
'error': Error
};

class Logger extends Emittery<EventType> {

log(msg: string, ...data: any[]) {
this.emit<IRecord>('value', {msg, data, ts: Date.now()});
this.emit('end', null)
this.emit('value', {msg, data, ts: Date.now()});
console.log(msg, ...data);
}
}
Expand All @@ -22,11 +27,11 @@ const logger = new Logger();
logger.log('Logging', 'foo');
logger.log('some more', 'bar', 'baz');
logger.log('finally', 'fooz');
logger.emitSerial('end');
logger.emitSerial('end', null);


// Register our listeners
const off = logger.on<IRecord>('value', rec => console.log(`data: ${rec.data}, ts: ${rec.ts}`));
const off = logger.on('value', rec => console.log(`data: ${rec.data}, ts: ${rec.ts}`));

logger.onAny((name: string, data: any) => console.log('Event %d. Called with %d', name, data));

Expand Down
20 changes: 10 additions & 10 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ export default Emittery;
/**
* Simple and modern async event emitter
*
* @template T - An union of literal event name.
* @template T - Map event name to an event data type.
*/
declare class Emittery<T extends string> {
declare class Emittery<T> {

/**
* Subscribe to an event.
Expand All @@ -19,15 +19,15 @@ declare class Emittery<T extends string> {
*
* @returns Unsubscribe method.
*/
on<U>(eventName: T, listener: (eventData: U) => any): () => void;
on<K extends keyof T>(eventName: K, listener: (eventData?: T[K]) => void | Promise<void>): () => void;

/**
* Subscribe to an event only once. It will be unsubscribed after the first
* event.
*
* @returns Promise for the event data when eventName is emitted
*/
once<U>(eventName: T): Promise<U>;
once<K extends keyof T>(eventName: K): Promise<T[K]>;

/**
* Unsubscribe to an event.
Expand All @@ -37,14 +37,14 @@ declare class Emittery<T extends string> {
*
* @param [listener]
*/
off(eventName: T, listener?: (x: any) => any): void;
off<K extends keyof T>(eventName: K, listener?: (eventData?: T[K]) => any): void;

/**
* Subscribe to be notified about any event.
*
* @returns A method to unsubscribe
*/
onAny(listener: (eventName: T, eventData: any) => any): () => void;
onAny<K extends keyof T>(listener: (eventName: K, eventData?: T[K]) => any): () => void;

/**
* Unsubscribe an onAny listener.
Expand All @@ -53,7 +53,7 @@ declare class Emittery<T extends string> {
*
* @param [listener]
*/
offAny(listener?: (eventName: T, eventData: any) => any): void;
offAny<K extends keyof T>(listener?: (eventName: K, eventData?: T[K]) => any): void;

/**
* Trigger an event asynchronously, optionally with some data. Listeners
Expand All @@ -68,7 +68,7 @@ declare class Emittery<T extends string> {
*
* @returns A promise for when all the event listeners are done.
*/
emit<U>(eventName: T, eventData?: U): Promise<void>;
emit<K extends keyof T>(eventName: K, eventData?: T[K]): Promise<void>;

/**
* Same as `emit`, but it waits for each listener to resolve before
Expand All @@ -80,7 +80,7 @@ declare class Emittery<T extends string> {
*
* @returns A promise for the last event listener settle or first one rejecting.
*/
emitSerial<U>(eventName: T, eventData?: U): Promise<void>;
emitSerial<K extends keyof T>(eventName: K, eventData?: T[K]): Promise<void>;

/**
* Clear all event listeners on the instance.
Expand All @@ -93,5 +93,5 @@ declare class Emittery<T extends string> {
* @param eventName
* @returns Listener count.
*/
listenerCount(eventName?: T): number;
listenerCount(eventName?: keyof T): number;
}

0 comments on commit 7e8292a

Please sign in to comment.