Skip to content

Commit cd0d3fc

Browse files
ggazzotassoevan
andauthored
feat: Type Emitter Implementation (#399)
Co-authored-by: Tasso Evangelista <tasso.evangelista@rocket.chat>
1 parent 80e77dc commit cd0d3fc

25 files changed

+346
-97
lines changed

packages/emitter/README.md

+48-18
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,14 @@ yarn add @rocket.chat/emitter
3535

3636
#### Table of Contents
3737

38-
- [EventType](#eventtype)
39-
- [Handler](#handler)
38+
- [DefaultEventMap](#defaulteventmap)
39+
- [AnyEventTypeOf](#anyeventtypeof)
40+
- [AnyEventOf](#anyeventof)
41+
- [AnyEventHandlerOf](#anyeventhandlerof)
42+
- [EventTypeOf](#eventtypeof)
43+
- [EventOf](#eventof)
44+
- [EventHandlerOf](#eventhandlerof)
45+
- [OffCallbackHandler](#offcallbackhandler)
4046
- [IEmitter](#iemitter)
4147
- [Emitter](#emitter)
4248
- [events](#events)
@@ -51,13 +57,37 @@ yarn add @rocket.chat/emitter
5157
- [emit](#emit)
5258
- [Parameters](#parameters-4)
5359

54-
### EventType
60+
### DefaultEventMap
5561

56-
Type: ([string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) \| [symbol](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Symbol))
62+
Type: Record&lt;([string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) \| [symbol](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Symbol)), any>
5763

58-
### Handler
64+
### AnyEventTypeOf
5965

60-
Type: function (event: T): void
66+
Type: any
67+
68+
### AnyEventOf
69+
70+
Type: any
71+
72+
### AnyEventHandlerOf
73+
74+
Type: any
75+
76+
### EventTypeOf
77+
78+
Type: any
79+
80+
### EventOf
81+
82+
Type: any
83+
84+
### EventHandlerOf
85+
86+
Type: any
87+
88+
### OffCallbackHandler
89+
90+
Type: function (): void
6191

6292
### IEmitter
6393

@@ -69,15 +99,15 @@ The event emitter class.
6999

70100
Returns the whole EventType list
71101

72-
Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[EventType](#eventtype)>**
102+
Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[AnyEventTypeOf](#anyeventtypeof)&lt;EventMap>>**
73103

74104
#### has
75105

76106
Returns `true` if this emmiter has a listener attached to the `key` event type
77107

78108
##### Parameters
79109

80-
- `key` **[EventType](#eventtype)**
110+
- `key` **[AnyEventTypeOf](#anyeventtypeof)&lt;EventMap>**
81111

82112
Returns **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)**
83113

@@ -87,30 +117,30 @@ Adds the `handler` function to listen events of the `type` type.
87117

88118
##### Parameters
89119

90-
- `type` **[EventType](#eventtype)**
91-
- `handler` **[Handler](#handler)&lt;T>**
120+
- `type` **EventType**
121+
- `handler` **[EventHandlerOf](#eventhandlerof)&lt;EventMap, EventType>**
92122

93-
Returns **OffCallbackHandler** a function to unsubscribe the handler invoking `this.off(type, handler)`
123+
Returns **[OffCallbackHandler](#offcallbackhandler)** a function to unsubscribe the handler invoking `this.off(type, handler)`
94124

95125
#### once
96126

97127
Adds a _one-time_ `handler` function for the event of the `type` type.
98128

99129
##### Parameters
100130

101-
- `type` **[EventType](#eventtype)**
102-
- `handler` **[Handler](#handler)&lt;T>**
131+
- `type` **EventType**
132+
- `handler` **[EventHandlerOf](#eventhandlerof)&lt;EventMap, EventType>**
103133

104-
Returns **OffCallbackHandler** a function to unsubscribe the handler invoking `this.off(type, handler)`
134+
Returns **[OffCallbackHandler](#offcallbackhandler)** a function to unsubscribe the handler invoking `this.off(type, handler)`
105135

106136
#### off
107137

108138
Removes the specified `handler` from the list of handlers of the event of the `type` type
109139

110140
##### Parameters
111141

112-
- `type` **[EventType](#eventtype)**
113-
- `handler` **[Handler](#handler)&lt;T>**
142+
- `type` **EventType**
143+
- `handler` **[EventHandlerOf](#eventhandlerof)&lt;EventMap, EventType>**
114144

115145
Returns **void**
116146

@@ -121,7 +151,7 @@ order they were registered, passing the supplied argument `e` to each.
121151

122152
##### Parameters
123153

124-
- `type` **[EventType](#eventtype)**
125-
- `e` **T?**
154+
- `type` **EventType**
155+
- `event` **[EventOf](#eventof)&lt;EventMap, EventType>**
126156

127157
Returns **void**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [@rocket.chat/emitter](./emitter.md) &gt; [AnyEventHandlerOf](./emitter.anyeventhandlerof.md)
4+
5+
## AnyEventHandlerOf type
6+
7+
8+
<b>Signature:</b>
9+
10+
```typescript
11+
export declare type AnyEventHandlerOf<EventMap extends DefaultEventMap> = {
12+
[EventType in keyof EventMap]: EventMap[EventType] extends void ? () => void : (event: EventMap[EventType]) => void;
13+
}[keyof EventMap];
14+
```
15+
<b>References:</b> [DefaultEventMap](./emitter.defaulteventmap.md)
16+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [@rocket.chat/emitter](./emitter.md) &gt; [AnyEventOf](./emitter.anyeventof.md)
4+
5+
## AnyEventOf type
6+
7+
8+
<b>Signature:</b>
9+
10+
```typescript
11+
export declare type AnyEventOf<EventMap extends DefaultEventMap> = EventMap[keyof EventMap];
12+
```
13+
<b>References:</b> [DefaultEventMap](./emitter.defaulteventmap.md)
14+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [@rocket.chat/emitter](./emitter.md) &gt; [AnyEventTypeOf](./emitter.anyeventtypeof.md)
4+
5+
## AnyEventTypeOf type
6+
7+
8+
<b>Signature:</b>
9+
10+
```typescript
11+
export declare type AnyEventTypeOf<EventMap extends DefaultEventMap> = keyof EventMap;
12+
```
13+
<b>References:</b> [DefaultEventMap](./emitter.defaulteventmap.md)
14+
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
22

3-
[Home](./index.md) &gt; [@rocket.chat/emitter](./emitter.md) &gt; [Handler](./emitter.handler.md)
3+
[Home](./index.md) &gt; [@rocket.chat/emitter](./emitter.md) &gt; [DefaultEventMap](./emitter.defaulteventmap.md)
44

5-
## Handler type
5+
## DefaultEventMap type
66

77

88
<b>Signature:</b>
99

1010
```typescript
11-
export declare type Handler<T = any> = (event?: T) => void;
11+
export declare type DefaultEventMap = Record<string | symbol, unknown>;
1212
```

packages/emitter/docs/emitter.emitter.emit.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ Calls each of the handlers registered for the event of `type` type, in the order
99
<b>Signature:</b>
1010

1111
```typescript
12-
emit<T = any>(type: EventType, e?: T): void;
12+
emit<T extends AnyEventOf<EventMap>, EventType extends AnyEventTypeOf<EventMap> = EventTypeOf<EventMap, T>>(type: EventType, event: EventOf<EventMap, EventType>): void;
1313
```
1414
1515
## Parameters
1616
1717
| Parameter | Type | Description |
1818
| --- | --- | --- |
19-
| type | [EventType](./emitter.eventtype.md) | |
20-
| e | T | |
19+
| type | EventType | |
20+
| event | [EventOf](./emitter.eventof.md)<!-- -->&lt;EventMap, EventType&gt; | |
2121
2222
<b>Returns:</b>
2323

packages/emitter/docs/emitter.emitter.events.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ Returns the whole EventType list
99
<b>Signature:</b>
1010

1111
```typescript
12-
events(): EventType[];
12+
events(): AnyEventTypeOf<EventMap>[];
1313
```
1414
<b>Returns:</b>
1515

16-
[EventType](./emitter.eventtype.md)<!-- -->\[\]
16+
[AnyEventTypeOf](./emitter.anyeventtypeof.md)<!-- -->&lt;EventMap&gt;\[\]
1717

packages/emitter/docs/emitter.emitter.has.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ Returns `true` if this emmiter has a listener attached to the `key` event type
99
<b>Signature:</b>
1010

1111
```typescript
12-
has(key: EventType): boolean;
12+
has(key: AnyEventTypeOf<EventMap>): boolean;
1313
```
1414

1515
## Parameters
1616

1717
| Parameter | Type | Description |
1818
| --- | --- | --- |
19-
| key | [EventType](./emitter.eventtype.md) | |
19+
| key | [AnyEventTypeOf](./emitter.anyeventtypeof.md)<!-- -->&lt;EventMap&gt; | |
2020

2121
<b>Returns:</b>
2222

packages/emitter/docs/emitter.emitter.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ The event emitter class.
99
<b>Signature:</b>
1010

1111
```typescript
12-
export declare class Emitter implements IEmitter
12+
export declare class Emitter<EventMap extends DefaultEventMap = DefaultEventMap> implements IEmitter<EventMap>
1313
```
14-
<b>Implements:</b> [IEmitter](./emitter.iemitter.md)
14+
<b>Implements:</b> [IEmitter](./emitter.iemitter.md)<!-- -->&lt;EventMap&gt;
1515
1616
## Methods
1717
1818
| Method | Modifiers | Description |
1919
| --- | --- | --- |
20-
| [emit(type, e)](./emitter.emitter.emit.md) | | Calls each of the handlers registered for the event of <code>type</code> type, in the order they were registered, passing the supplied argument <code>e</code> to each. |
20+
| [emit(type, event)](./emitter.emitter.emit.md) | | Calls each of the handlers registered for the event of <code>type</code> type, in the order they were registered, passing the supplied argument <code>e</code> to each. |
2121
| [events()](./emitter.emitter.events.md) | | Returns the whole EventType list |
2222
| [has(key)](./emitter.emitter.has.md) | | Returns <code>true</code> if this emmiter has a listener attached to the <code>key</code> event type |
2323
| [off(type, handler)](./emitter.emitter.off.md) | | Removes the specified <code>handler</code> from the list of handlers of the event of the <code>type</code> type |

packages/emitter/docs/emitter.emitter.off.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ Removes the specified `handler` from the list of handlers of the event of the `t
99
<b>Signature:</b>
1010

1111
```typescript
12-
off<T = any>(type: EventType, handler: Handler<T>): void;
12+
off<T extends AnyEventOf<EventMap>, EventType extends AnyEventTypeOf<EventMap> = EventTypeOf<EventMap, T>>(type: EventType, handler: EventHandlerOf<EventMap, EventType>): void;
1313
```
1414
1515
## Parameters
1616
1717
| Parameter | Type | Description |
1818
| --- | --- | --- |
19-
| type | [EventType](./emitter.eventtype.md) | |
20-
| handler | [Handler](./emitter.handler.md)<!-- -->&lt;T&gt; | |
19+
| type | EventType | |
20+
| handler | [EventHandlerOf](./emitter.eventhandlerof.md)<!-- -->&lt;EventMap, EventType&gt; | |
2121
2222
<b>Returns:</b>
2323

packages/emitter/docs/emitter.emitter.on.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@ Adds the `handler` function to listen events of the `type` type.
99
<b>Signature:</b>
1010

1111
```typescript
12-
on<T = any>(type: EventType, handler: Handler<T>): OffCallbackHandler;
12+
on<T extends AnyEventOf<EventMap>, EventType extends AnyEventTypeOf<EventMap> = EventTypeOf<EventMap, T>>(type: EventType, handler: EventHandlerOf<EventMap, EventType>): OffCallbackHandler;
1313
```
1414
1515
## Parameters
1616
1717
| Parameter | Type | Description |
1818
| --- | --- | --- |
19-
| type | [EventType](./emitter.eventtype.md) | |
20-
| handler | [Handler](./emitter.handler.md)<!-- -->&lt;T&gt; | |
19+
| type | EventType | |
20+
| handler | [EventHandlerOf](./emitter.eventhandlerof.md)<!-- -->&lt;EventMap, EventType&gt; | |
2121
2222
<b>Returns:</b>
2323
24-
OffCallbackHandler
24+
[OffCallbackHandler](./emitter.offcallbackhandler.md)
2525
2626
a function to unsubscribe the handler invoking `this.off(type, handler)`
2727

packages/emitter/docs/emitter.emitter.once.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@ Adds a \*one-time\* `handler` function for the event of the `type` type.
99
<b>Signature:</b>
1010

1111
```typescript
12-
once<T = any>(type: EventType, handler: Handler<T>): OffCallbackHandler;
12+
once<T extends AnyEventOf<EventMap>, EventType extends AnyEventTypeOf<EventMap> = EventTypeOf<EventMap, T>>(type: EventType, handler: EventHandlerOf<EventMap, EventType>): OffCallbackHandler;
1313
```
1414
1515
## Parameters
1616
1717
| Parameter | Type | Description |
1818
| --- | --- | --- |
19-
| type | [EventType](./emitter.eventtype.md) | |
20-
| handler | [Handler](./emitter.handler.md)<!-- -->&lt;T&gt; | |
19+
| type | EventType | |
20+
| handler | [EventHandlerOf](./emitter.eventhandlerof.md)<!-- -->&lt;EventMap, EventType&gt; | |
2121
2222
<b>Returns:</b>
2323
24-
OffCallbackHandler
24+
[OffCallbackHandler](./emitter.offcallbackhandler.md)
2525
2626
a function to unsubscribe the handler invoking `this.off(type, handler)`
2727
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [@rocket.chat/emitter](./emitter.md) &gt; [EventHandlerOf](./emitter.eventhandlerof.md)
4+
5+
## EventHandlerOf type
6+
7+
8+
<b>Signature:</b>
9+
10+
```typescript
11+
export declare type EventHandlerOf<EventMap extends DefaultEventMap, EventType extends AnyEventTypeOf<EventMap>> = EventMap[EventType] extends void ? () => void : (event: EventMap[EventType]) => void;
12+
```
13+
<b>References:</b> [DefaultEventMap](./emitter.defaulteventmap.md)<!-- -->, [AnyEventTypeOf](./emitter.anyeventtypeof.md)
14+
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [@rocket.chat/emitter](./emitter.md) &gt; [EventOf](./emitter.eventof.md)
4+
5+
## EventOf type
6+
7+
8+
<b>Signature:</b>
9+
10+
```typescript
11+
export declare type EventOf<EventMap extends DefaultEventMap, EventType extends AnyEventTypeOf<EventMap>> = EventMap[EventType] extends void ? never : EventMap[EventType];
12+
```
13+
<b>References:</b> [DefaultEventMap](./emitter.defaulteventmap.md)<!-- -->, [AnyEventTypeOf](./emitter.anyeventtypeof.md)
14+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [@rocket.chat/emitter](./emitter.md) &gt; [EventTypeOf](./emitter.eventtypeof.md)
4+
5+
## EventTypeOf type
6+
7+
8+
<b>Signature:</b>
9+
10+
```typescript
11+
export declare type EventTypeOf<EventMap extends DefaultEventMap, EventValue extends EventMap[keyof EventMap]> = {
12+
[EventType in keyof EventMap]: EventMap[EventType] extends EventValue ? EventType : never;
13+
}[keyof EventMap];
14+
```
15+
<b>References:</b> [DefaultEventMap](./emitter.defaulteventmap.md)
16+

packages/emitter/docs/emitter.iemitter.emit.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77
<b>Signature:</b>
88

99
```typescript
10-
emit<T = any>(type: EventType, event?: T): void;
10+
emit<T extends AnyEventOf<EventMap>, EventType extends AnyEventTypeOf<EventMap> = EventTypeOf<EventMap, T>>(type: EventType, event: EventOf<EventMap, EventType>): void;
1111
```
1212
1313
## Parameters
1414
1515
| Parameter | Type | Description |
1616
| --- | --- | --- |
17-
| type | [EventType](./emitter.eventtype.md) | |
18-
| event | T | |
17+
| type | EventType | |
18+
| event | [EventOf](./emitter.eventof.md)<!-- -->&lt;EventMap, EventType&gt; | |
1919
2020
<b>Returns:</b>
2121

0 commit comments

Comments
 (0)