UNPKG

3.94 kBJavaScriptView Raw
1'use strict';
2
3/**
4 * Class representing an event.
5 *
6 * @private
7 */
8class Event {
9 /**
10 * Create a new `Event`.
11 *
12 * @param {String} type The name of the event
13 * @param {Object} target A reference to the target to which the event was dispatched
14 */
15 constructor(type, target) {
16 this.target = target;
17 this.type = type;
18 }
19}
20
21/**
22 * Class representing a message event.
23 *
24 * @extends Event
25 * @private
26 */
27class MessageEvent extends Event {
28 /**
29 * Create a new `MessageEvent`.
30 *
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
33 */
34 constructor(data, target) {
35 super('message', target);
36
37 this.data = data;
38 }
39}
40
41/**
42 * Class representing a close event.
43 *
44 * @extends Event
45 * @private
46 */
47class CloseEvent extends Event {
48 /**
49 * Create a new `CloseEvent`.
50 *
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
54 */
55 constructor(code, reason, target) {
56 super('close', target);
57
58 this.wasClean = target._closeFrameReceived && target._closeFrameSent;
59 this.reason = reason;
60 this.code = code;
61 }
62}
63
64/**
65 * Class representing an open event.
66 *
67 * @extends Event
68 * @private
69 */
70class OpenEvent extends Event {
71 /**
72 * Create a new `OpenEvent`.
73 *
74 * @param {WebSocket} target A reference to the target to which the event was dispatched
75 */
76 constructor(target) {
77 super('open', target);
78 }
79}
80
81/**
82 * Class representing an error event.
83 *
84 * @extends Event
85 * @private
86 */
87class ErrorEvent extends Event {
88 /**
89 * Create a new `ErrorEvent`.
90 *
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
93 */
94 constructor(error, target) {
95 super('error', target);
96
97 this.message = error.message;
98 this.error = error;
99 }
100}
101
102/**
103 * This provides methods for emulating the `EventTarget` interface. It's not
104 * meant to be used directly.
105 *
106 * @mixin
107 */
108const EventTarget = {
109 /**
110 * Register an event listener.
111 *
112 * @param {String} method A string representing the event type to listen for
113 * @param {Function} listener The listener to add
114 * @public
115 */
116 addEventListener(method, listener) {
117 if (typeof listener !== 'function') return;
118
119 function onMessage(data) {
120 listener.call(this, new MessageEvent(data, this));
121 }
122
123 function onClose(code, message) {
124 listener.call(this, new CloseEvent(code, message, this));
125 }
126
127 function onError(error) {
128 listener.call(this, new ErrorEvent(error, this));
129 }
130
131 function onOpen() {
132 listener.call(this, new OpenEvent(this));
133 }
134
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);
147 } else {
148 this.on(method, listener);
149 }
150 },
151
152 /**
153 * Remove an event listener.
154 *
155 * @param {String} method A string representing the event type to remove
156 * @param {Function} listener The listener to remove
157 * @public
158 */
159 removeEventListener(method, listener) {
160 const listeners = this.listeners(method);
161
162 for (var i = 0; i < listeners.length; i++) {
163 if (listeners[i] === listener || listeners[i]._listener === listener) {
164 this.removeListener(method, listeners[i]);
165 }
166 }
167 }
168};
169
170module.exports = EventTarget;