private _fetchURL() { const startPing: number = Date.now(); const timeout: Promise = new Promise((_, reject) => { setTimeout(() => { reject(new Error('timeout')) }, this.timeout); }); const fetchFunction = new Promise((resolve, reject) => { fetch(this.url, { headers: this.headers }) .then((res) => { resolve({ statusCode: res.status, statusText: res.statusText, ping: Date.now() - startPing }) }) .catch((e) => reject(e)); }); Promise.race([fetchFunction, timeout]) .then((result: any) => { this.ping = result.ping; if (result.statusCode > 299) { this.failures++; log.error(`[@infinitylist/uptime]: monitor failure: ${this.failures}`); if (this.failures > this.retries) { this._emitOutage(result.statusCode, result.statusText); } } else { this.failures = 0; this.available = true; this.uptime = Date.now() - this.startTime; this.lastSuccessCheck = Date.now(); this._emitUp(result.statusCode, result.statusText) } }) .catch((e) => { if (e.message.match('timeout')) { this.failures ++; log.error(`[@infinitylist/uptime]: monitor failure: ${this.failures}`); if (this.failures > this.retries) { this._emitOutage(undefined, 'timeout'); } } else { if (e.message.match('Only absolute URLs are supported')) return this.emit('error', TypeError('[@infinitylist/uptime]: only absolute urls are supported')); if (e.message.match('ECONNREFUSED')) return this.emit('error', TypeError(`[@infinitylist/client]: unknown host: ${this.url} connection refused`)); this.emit('error', e); } }) }