171 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			171 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Class representing an event. | ||
|  |  * | ||
|  |  * @private | ||
|  |  */ | ||
|  | class Event { | ||
|  |   /** | ||
|  |    * Create a new `Event`. | ||
|  |    * | ||
|  |    * @param {String} type The name of the event | ||
|  |    * @param {Object} target A reference to the target to which the event was dispatched | ||
|  |    */ | ||
|  |   constructor (type, target) { | ||
|  |     this.target = target; | ||
|  |     this.type = type; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Class representing a message event. | ||
|  |  * | ||
|  |  * @extends Event | ||
|  |  * @private | ||
|  |  */ | ||
|  | class MessageEvent extends Event { | ||
|  |   /** | ||
|  |    * Create a new `MessageEvent`. | ||
|  |    * | ||
|  |    * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The received data | ||
|  |    * @param {WebSocket} target A reference to the target to which the event was dispatched | ||
|  |    */ | ||
|  |   constructor (data, target) { | ||
|  |     super('message', target); | ||
|  | 
 | ||
|  |     this.data = data; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Class representing a close event. | ||
|  |  * | ||
|  |  * @extends Event | ||
|  |  * @private | ||
|  |  */ | ||
|  | class CloseEvent extends Event { | ||
|  |   /** | ||
|  |    * Create a new `CloseEvent`. | ||
|  |    * | ||
|  |    * @param {Number} code The status code explaining why the connection is being closed | ||
|  |    * @param {String} reason A human-readable string explaining why the connection is closing | ||
|  |    * @param {WebSocket} target A reference to the target to which the event was dispatched | ||
|  |    */ | ||
|  |   constructor (code, reason, target) { | ||
|  |     super('close', target); | ||
|  | 
 | ||
|  |     this.wasClean = target._closeFrameReceived && target._closeFrameSent; | ||
|  |     this.reason = reason; | ||
|  |     this.code = code; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Class representing an open event. | ||
|  |  * | ||
|  |  * @extends Event | ||
|  |  * @private | ||
|  |  */ | ||
|  | class OpenEvent extends Event { | ||
|  |   /** | ||
|  |    * Create a new `OpenEvent`. | ||
|  |    * | ||
|  |    * @param {WebSocket} target A reference to the target to which the event was dispatched | ||
|  |    */ | ||
|  |   constructor (target) { | ||
|  |     super('open', target); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Class representing an error event. | ||
|  |  * | ||
|  |  * @extends Event | ||
|  |  * @private | ||
|  |  */ | ||
|  | class ErrorEvent extends Event { | ||
|  |   /** | ||
|  |    * Create a new `ErrorEvent`. | ||
|  |    * | ||
|  |    * @param {Object} error The error that generated this event | ||
|  |    * @param {WebSocket} target A reference to the target to which the event was dispatched | ||
|  |    */ | ||
|  |   constructor (error, target) { | ||
|  |     super('error', target); | ||
|  | 
 | ||
|  |     this.message = error.message; | ||
|  |     this.error = error; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * This provides methods for emulating the `EventTarget` interface. It's not | ||
|  |  * meant to be used directly. | ||
|  |  * | ||
|  |  * @mixin | ||
|  |  */ | ||
|  | const EventTarget = { | ||
|  |   /** | ||
|  |    * Register an event listener. | ||
|  |    * | ||
|  |    * @param {String} method A string representing the event type to listen for | ||
|  |    * @param {Function} listener The listener to add | ||
|  |    * @public | ||
|  |    */ | ||
|  |   addEventListener (method, listener) { | ||
|  |     if (typeof listener !== 'function') return; | ||
|  | 
 | ||
|  |     function onMessage (data) { | ||
|  |       listener.call(this, new MessageEvent(data, this)); | ||
|  |     } | ||
|  | 
 | ||
|  |     function onClose (code, message) { | ||
|  |       listener.call(this, new CloseEvent(code, message, this)); | ||
|  |     } | ||
|  | 
 | ||
|  |     function onError (error) { | ||
|  |       listener.call(this, new ErrorEvent(error, this)); | ||
|  |     } | ||
|  | 
 | ||
|  |     function onOpen () { | ||
|  |       listener.call(this, new OpenEvent(this)); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (method === 'message') { | ||
|  |       onMessage._listener = listener; | ||
|  |       this.on(method, onMessage); | ||
|  |     } else if (method === 'close') { | ||
|  |       onClose._listener = listener; | ||
|  |       this.on(method, onClose); | ||
|  |     } else if (method === 'error') { | ||
|  |       onError._listener = listener; | ||
|  |       this.on(method, onError); | ||
|  |     } else if (method === 'open') { | ||
|  |       onOpen._listener = listener; | ||
|  |       this.on(method, onOpen); | ||
|  |     } else { | ||
|  |       this.on(method, listener); | ||
|  |     } | ||
|  |   }, | ||
|  | 
 | ||
|  |   /** | ||
|  |    * Remove an event listener. | ||
|  |    * | ||
|  |    * @param {String} method A string representing the event type to remove | ||
|  |    * @param {Function} listener The listener to remove | ||
|  |    * @public | ||
|  |    */ | ||
|  |   removeEventListener (method, listener) { | ||
|  |     const listeners = this.listeners(method); | ||
|  | 
 | ||
|  |     for (var i = 0; i < listeners.length; i++) { | ||
|  |       if (listeners[i] === listener || listeners[i]._listener === listener) { | ||
|  |         this.removeListener(method, listeners[i]); | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | module.exports = EventTarget; |