UNPKG

vim-webgl-component

Version:

A demonstration app built on top of the vim-webgl-viewer

74 lines (73 loc) 2.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Requester = void 0; const logging_1 = require("./logging"); const retriableRequest_1 = require("./retriableRequest"); const requestTracker_1 = require("./requestTracker"); /** * Wrapper to provide tracking for all webrequests via request logger. */ class Requester { constructor(verbose = false) { this.maxConcurency = 10; this._queue = []; this._active = new Set(); this._logs = verbose ? new logging_1.DefaultLog() : new logging_1.NoLog(); this._tracker = new requestTracker_1.RequestTracker(undefined, this._logs); this._tracker.onUpdate = (p) => this.onProgress?.(p); } abort() { this._active.forEach(request => { request.abort(); }); this._active.clear(); this._queue.length = 0; } async http(url, label) { const request = new retriableRequest_1.RetriableRequest(url, undefined, 'arraybuffer'); request.msg = url; this.enqueue(request); return new Promise((resolve, reject) => { this._tracker.start(label); request.onProgress = (e) => { this._tracker.update(label, e); }; request.onLoad = (result) => { this._tracker.end(label); resolve(result); this.end(request); }; request.onError = () => { this._tracker.fail(label); this.retry(request); }; }); } enqueue(xhr) { this._queue.push(xhr); this.next(); } retry(xhr) { this._active.delete(xhr); this.maxConcurency = Math.max(1, this.maxConcurency - 1); setTimeout(() => this.enqueue(xhr), 2000); } end(xhr) { this._active.delete(xhr); this.next(); } next() { if (this._queue.length === 0) { return; } if (this._active.size >= this.maxConcurency) { return; } const next = this._queue[0]; this._queue.shift(); this._active.add(next); next.send(); this._logs.log('Starting ' + next.msg); } } exports.Requester = Requester;