// Copyright (C) 2018 Zilliqa // // This file is part of zilliqa-js // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . import mitt from 'mitt'; class EventEmitter { off: (type: string, handler: mitt.Handler) => void; emit: (type: string, event?: any) => void; promise: Promise; resolve?: (value: T | PromiseLike) => void; reject?: (reason?: any) => void; then?: any; private handlers?: any = {}; private emitter: mitt.Emitter; constructor() { // TODO: As any added to solve // error TS7009: 'new' expression, whose target lacks a construct signature, implicitly has an 'any' type. this.emitter = new (mitt as any)(this.handlers) as mitt.Emitter; this.off = this.emitter.off.bind(this); this.emit = this.emitter.emit.bind(this); this.promise = new Promise((resolve, reject) => { this.resolve = resolve; this.reject = reject; }); this.then = this.promise.then.bind(this.promise); } resetHandlers() { for (const i in this.handlers) { delete this.handlers[i]; } } on(type: string, handler: mitt.Handler) { this.emitter.on(type, handler); return this; } once(type: string, handler: mitt.Handler) { this.emitter.on(type, (e: any) => { handler(e); this.removeEventListener(type); }); } addEventListener(type: string, handler: mitt.Handler) { this.emitter.on(type, handler); } removeEventListener(type?: string, handler?: mitt.Handler) { if (!type) { this.handlers = {}; return; } if (!handler) { delete this.handlers[type]; } else { return this.emitter.off(type, handler); } } onError(error: any) { this.emitter.on('error', error); this.removeEventListener('*'); } onData(data: any) { this.emitter.on('data', data); this.removeEventListener('*'); } listenerCount(listenKey: any) { let count = 0; Object.keys(this.handlers).forEach((val) => { if (listenKey === val) { count += 1; } }); return count; } } export { EventEmitter };