UNPKG

vim-webgl-component

Version:

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

91 lines (90 loc) 3.02 kB
"use strict"; /** * @module vim-ts */ Object.defineProperty(exports, "__esModule", { value: true }); exports.RemoteBuffer = exports.setRemoteBufferMaxConcurency = void 0; const requestTracker_1 = require("./requestTracker"); const logging_1 = require("./logging"); const retriableRequest_1 = require("./retriableRequest"); let RemoteBufferMaxConcurency = 10; function setRemoteBufferMaxConcurency(value) { RemoteBufferMaxConcurency = value; } exports.setRemoteBufferMaxConcurency = setRemoteBufferMaxConcurency; /** * Wrapper to provide tracking for all webrequests via request logger. */ class RemoteBuffer { constructor(url, headers) { this.headers = {}; this.maxConcurency = RemoteBufferMaxConcurency; this._queue = []; this._active = new Set(); this.url = url; this.logs = new logging_1.NoLog(); this.headers = headers ?? {}; this._tracker = new requestTracker_1.RequestTracker(url, 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(range, label) { const rangeStr = range ? `bytes=${range.start}-${range.end - 1}` : undefined; const request = new retriableRequest_1.RetriableRequest(this.url, this.headers, rangeStr, 'arraybuffer'); request.msg = range ? `${label} : [${range.start}, ${range.end}] of ${this.url}` : `${label} of ${this.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(request) { this._queue.push(request); this.next(); } retry(request) { this._active.delete(request); this.maxConcurency = Math.max(1, this.maxConcurency - 1); setTimeout(() => this.enqueue(request), 2000); } end(request) { this.logs.log('Finished ' + request.msg); this._active.delete(request); 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('Started ' + next.msg); } } exports.RemoteBuffer = RemoteBuffer;