4 * Class representing an event.
10 * Create a new `Event`.
12 * @param {String} type The name of the event
13 * @param {Object} target A reference to the target to which the event was dispatched
15 constructor (type, target) {
22 * Class representing a message event.
27 class MessageEvent extends Event {
29 * Create a new `MessageEvent`.
31 * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The received data
32 * @param {WebSocket} target A reference to the target to which the event was dispatched
34 constructor (data, target) {
35 super('message', target);
42 * Class representing a close event.
47 class CloseEvent extends Event {
49 * Create a new `CloseEvent`.
51 * @param {Number} code The status code explaining why the connection is being closed
52 * @param {String} reason A human-readable string explaining why the connection is closing
53 * @param {WebSocket} target A reference to the target to which the event was dispatched
55 constructor (code, reason, target) {
56 super('close', target);
58 this.wasClean = target._closeFrameReceived && target._closeFrameSent;
65 * Class representing an open event.
70 class OpenEvent extends Event {
72 * Create a new `OpenEvent`.
74 * @param {WebSocket} target A reference to the target to which the event was dispatched
76 constructor (target) {
77 super('open', target);
82 * Class representing an error event.
87 class ErrorEvent extends Event {
89 * Create a new `ErrorEvent`.
91 * @param {Object} error The error that generated this event
92 * @param {WebSocket} target A reference to the target to which the event was dispatched
94 constructor (error, target) {
95 super('error', target);
97 this.message = error.message;
103 * This provides methods for emulating the `EventTarget` interface. It's not
104 * meant to be used directly.
108 const EventTarget = {
110 * Register an event listener.
112 * @param {String} method A string representing the event type to listen for
113 * @param {Function} listener The listener to add
116 addEventListener (method, listener) {
117 if (typeof listener !== 'function') return;
119 function onMessage (data) {
120 listener.call(this, new MessageEvent(data, this));
123 function onClose (code, message) {
124 listener.call(this, new CloseEvent(code, message, this));
127 function onError (error) {
128 listener.call(this, new ErrorEvent(error, this));
132 listener.call(this, new OpenEvent(this));
135 if (method === 'message') {
136 onMessage._listener = listener;
137 this.on(method, onMessage);
138 } else if (method === 'close') {
139 onClose._listener = listener;
140 this.on(method, onClose);
141 } else if (method === 'error') {
142 onError._listener = listener;
143 this.on(method, onError);
144 } else if (method === 'open') {
145 onOpen._listener = listener;
146 this.on(method, onOpen);
148 this.on(method, listener);
153 * Remove an event listener.
155 * @param {String} method A string representing the event type to remove
156 * @param {Function} listener The listener to remove
159 removeEventListener (method, listener) {
160 const listeners = this.listeners(method);
162 for (var i = 0; i < listeners.length; i++) {
163 if (listeners[i] === listener || listeners[i]._listener === listener) {
164 this.removeListener(method, listeners[i]);
170 module.exports = EventTarget;