export default class XHRRetry { private url: any; private headers: any; private maxAttempts: number; private retryPeriod: number; private responseChecker: Function; constructor(url: any, headers: any, params: any) { this.url = url; this.headers = headers; this.maxAttempts = params.maxAttempts || 5; this.retryPeriod = params.retryPeriod || 5000; this.responseChecker = params.responseChecker; } retrieve() { let maxAttempts = this.maxAttempts; let retryPeriod = this.retryPeriod; return new Promise((resolve, reject) => { this.retrieveInternal() .then((responseText) => { resolve(responseText); }) .catch(() => { let interval = setInterval(() => { this.retrieveInternal() .then((responseText) => { clearInterval(interval); resolve(responseText); return; }) .catch((err) => { maxAttempts--; if (maxAttempts <= 0) { clearInterval(interval); reject(err); } }); }, retryPeriod); }); }); } checkXHRResponse(response: any) { if (this.responseChecker) { return this.responseChecker(response); } return true; } retrieveInternal() { return new Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); xhr.onreadystatechange = () => { if (xhr.readyState === XMLHttpRequest.DONE) { if (xhr.status >= 200 && xhr.status < 300 && this.checkXHRResponse(xhr.responseText)) { resolve(xhr.responseText); } else { reject(xhr.status); } } }; xhr.open('GET', this.url, true); this.setHeaders(xhr); xhr.send(); }); } setHeaders(xhr: any) { if (Array.isArray(this.headers)) { this.headers.forEach((x) => xhr.setRequestHeader(x.key, x.value)); } else { xhr.setRequestHeader(this.headers.key, this.headers.value); } } }