1+ /**
2+ * `Impl` is a functor which generates FFI bindings to Node's `EventEmitter`
3+ * class for any type `t`. This is not inherently type-safe. Type-safety can
4+ * be achieved by implementing the known `Event.t('a => 'b, t)` types
5+ */
6+ module Impl = (T : {type t ; }) => {
7+ /**
8+ * `addListener(emitter, event, listener)`
9+ *
10+ * Adds a new event listener function to the event emitter.
11+ */
12+ [@ bs . send ]
13+ external addListener : (T . t , Event . t (' a => ' b , T . t ), ' a => ' b ) => T . t =
14+ "addListener" ;
15+
16+ [@ bs . send ]
17+ external emit : (T . t , Event . t (' a => ' b , T . t ), ' a ) => bool = "emit" ;
18+
19+ [@ bs . get ] external errorMonitor : T . t => Js . Types . symbol = "errorMonitor" ;
20+
21+ [@ bs . send ]
22+ external eventNames :
23+ (T . t , Event . t (' a => ' b , T . t )) => array (Event . t (' a => ' b , T . t )) =
24+ "eventNames" ;
25+
26+ [@ bs . send ] external getMaxListeners : T . t => int = "getMaxListeners" ;
27+
28+ [@ bs . send ]
29+ external listenerCount : (T . t , Event . t (' a => ' b , T . t )) => int =
30+ "listenerCount" ;
31+ [@ bs . send ]
32+ external listeners : (T . t , Event . t (' a => ' b , T . t )) => array (' a => ' b ) =
33+ "listeners" ;
34+
35+ /**
36+ * `on(emitter, event, listener)`
37+ *
38+ * Adds a new event listener function to the event emitter.
39+ * Alias for `addListener`.
40+ */
41+ [@ bs . send ]
42+ external on : (T . t , Event . t (' a => ' b , T . t ), ' a => ' b ) => T . t = "on" ;
43+
44+ /**
45+ * `once(emitter, event, listener)`
46+ *
47+ * Adds a new **single-use** event listener function to the event
48+ * emitter. Then next time the given event is emitted, this listener
49+ * will fire exactly once, and then be removed from the emitter's
50+ * internal listener array.
51+ */
52+ [@ bs . send ]
53+ external once : (T . t , Event . t (' a => ' b , T . t ), ' a => ' b ) => T . t = "once" ;
54+
55+ /**
56+ * `off(emitter, event, listener)`
57+ *
58+ * Removes the listener function from the event emitter.
59+ *
60+ * The specified listener function is compared by **referential
61+ * equality** to each function in the emitter's internal listener
62+ * array.
63+ *
64+ * This means that, when the target listener is initially added, that
65+ * exact function reference must be maintained and provided here
66+ * in order to ensure removal.
67+ *
68+ * Alias for `removeListener`.
69+ */
70+ [@ bs . send ]
71+ external off : (T . t , Event . t (' a => ' b , T . t ), ' a => ' b ) => T . t = "off" ;
72+
73+ /**
74+ * `prependListener(emitter, event, listener)`
75+ *
76+ * Adds a new event listener function to the event emitter.
77+ *
78+ * Unlike `on` and `addListener`, `prependListener` adds the listener
79+ * function to the front of the internal listener array, ensuring
80+ * that this function is called before the rest of the listeners for
81+ * the given event.
82+ */
83+ [@ bs . send ]
84+ external prependListener : (T . t , Event . t (' a => ' b , T . t ), ' a => ' b ) => T . t =
85+ "prependListener" ;
86+
87+ /**
88+ * `prependListenerOnce(emitter, event, listener)`
89+ *
90+ * Adds a new **single-use** event listener function to the event
91+ * emitter. Then next time the given event is emitted, this listener
92+ * will fire exactly once, and then be removed from the emitter's
93+ * internal listener array.
94+ *
95+ * Unlike `once`, `prependListenerOnce` adds the listener function
96+ * to the front of the internal listener array, ensuring that this
97+ * function is called before the rest of the listeners for the
98+ * given event.
99+ */
100+ [@ bs . send ]
101+ external prependOnceListener : (T . t , Event . t (' a => ' b , T . t ), ' a => ' b ) => T . t =
102+ "prependOnceListener" ;
103+
104+ [@ bs . send ] external removeAllListeners : T . t => T . t = "removeAllListeners" ;
105+
106+ /**
107+ * `removeListener(emitter, event, listener)`
108+ *
109+ * Removes the listener function from the event emitter.
110+ *
111+ * The specified listener function is compared by **referential
112+ * equality** to each function in the emitter's internal listener
113+ * array.
114+ *
115+ * This means that, when the target listener is initially added, that
116+ * exact function reference must be maintained and provided here
117+ * in order to ensure removal.
118+ */
119+ [@ bs . send ]
120+ external removeListener : (T . t , Event . t (' a => ' b , T . t ), ' a => ' b ) => T . t =
121+ "removeListener" ;
122+
123+ /**
124+ * `setMaxListeners(emitter, numberOfListeners)`
125+ *
126+ * Sets the maximum number of event listeners that may be added to
127+ * an event emitter before Node begins emitting warnings.
128+ *
129+ * By default, each event emitter has this value set to 10. This is
130+ * intended to warn the user about possible memory leaks.
131+ * `setMaxListeners` will increase this threshold.
132+ */
133+ [@ bs . send ]
134+ external setMaxListeners : (T . t , int ) => T . t = "setMaxListeners" ;
135+ };
136+
137+ /**
138+ * A generative functor that creates a unique type `t` with the `EventEmitter`
139+ * interface bindings.
140+ */
141+ module Make = (()) => {
142+ type t ;
143+ include Impl ({
144+ type nonrec t = t ;
145+ });
146+ [@ bs . module "events" ] [@ bs . new ] external make : unit => t = "EventEmitter" ;
147+ };
0 commit comments