123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- 'use strict';
- const { kForOnEventAttribute, kListener } = require('./constants');
- const kCode = Symbol('kCode');
- const kData = Symbol('kData');
- const kError = Symbol('kError');
- const kMessage = Symbol('kMessage');
- const kReason = Symbol('kReason');
- const kTarget = Symbol('kTarget');
- const kType = Symbol('kType');
- const kWasClean = Symbol('kWasClean');
- class Event {
-
- constructor(type) {
- this[kTarget] = null;
- this[kType] = type;
- }
-
- get target() {
- return this[kTarget];
- }
-
- get type() {
- return this[kType];
- }
- }
- Object.defineProperty(Event.prototype, 'target', { enumerable: true });
- Object.defineProperty(Event.prototype, 'type', { enumerable: true });
- class CloseEvent extends Event {
-
- constructor(type, options = {}) {
- super(type);
- this[kCode] = options.code === undefined ? 0 : options.code;
- this[kReason] = options.reason === undefined ? '' : options.reason;
- this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;
- }
-
- get code() {
- return this[kCode];
- }
-
- get reason() {
- return this[kReason];
- }
-
- get wasClean() {
- return this[kWasClean];
- }
- }
- Object.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });
- Object.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });
- Object.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });
- class ErrorEvent extends Event {
-
- constructor(type, options = {}) {
- super(type);
- this[kError] = options.error === undefined ? null : options.error;
- this[kMessage] = options.message === undefined ? '' : options.message;
- }
-
- get error() {
- return this[kError];
- }
-
- get message() {
- return this[kMessage];
- }
- }
- Object.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });
- Object.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });
- class MessageEvent extends Event {
-
- constructor(type, options = {}) {
- super(type);
- this[kData] = options.data === undefined ? null : options.data;
- }
-
- get data() {
- return this[kData];
- }
- }
- Object.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });
- const EventTarget = {
-
- addEventListener(type, listener, options = {}) {
- let wrapper;
- if (type === 'message') {
- wrapper = function onMessage(data, isBinary) {
- const event = new MessageEvent('message', {
- data: isBinary ? data : data.toString()
- });
- event[kTarget] = this;
- listener.call(this, event);
- };
- } else if (type === 'close') {
- wrapper = function onClose(code, message) {
- const event = new CloseEvent('close', {
- code,
- reason: message.toString(),
- wasClean: this._closeFrameReceived && this._closeFrameSent
- });
- event[kTarget] = this;
- listener.call(this, event);
- };
- } else if (type === 'error') {
- wrapper = function onError(error) {
- const event = new ErrorEvent('error', {
- error,
- message: error.message
- });
- event[kTarget] = this;
- listener.call(this, event);
- };
- } else if (type === 'open') {
- wrapper = function onOpen() {
- const event = new Event('open');
- event[kTarget] = this;
- listener.call(this, event);
- };
- } else {
- return;
- }
- wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];
- wrapper[kListener] = listener;
- if (options.once) {
- this.once(type, wrapper);
- } else {
- this.on(type, wrapper);
- }
- },
-
- removeEventListener(type, handler) {
- for (const listener of this.listeners(type)) {
- if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {
- this.removeListener(type, listener);
- break;
- }
- }
- }
- };
- module.exports = {
- CloseEvent,
- ErrorEvent,
- Event,
- EventTarget,
- MessageEvent
- };
|