UNPKG

@cquiroz/aladin-lite

Version:
128 lines (103 loc) 3.45 kB
// Copyright 2013 - UDS/CNRS // The Aladin Lite program is distributed under the terms // of the GNU General Public License version 3. // // This file is part of Aladin Lite. // // Aladin Lite 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, version 3 of the License. // // Aladin Lite 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. // // The GNU General Public License is available in COPYING file // along with Aladin Lite. // /****************************************************************************** * Aladin Lite project * * File Downloader * Queue downloading for image elements * * Author: Thomas Boch[CDS] * *****************************************************************************/ var Downloader = function () { var NB_MAX_SIMULTANEOUS_DL = 4; // TODO : le fading ne marche pas bien actuellement var FADING_ENABLED = false; var FADING_DURATION = 700; // in milliseconds var Downloader = function Downloader(view) { this.view = view; // reference to the view to be able to request redraw this.nbDownloads = 0; // number of current downloads this.dlQueue = []; // queue of items being downloaded this.urlsInQueue = {}; }; Downloader.prototype.emptyQueue = function () { this.dlQueue = []; this.urlsInQueue = {}; }; Downloader.prototype.requestDownload = function (img, url, cors) { // first check if url already in queue if (url in this.urlsInQueue) { return; } // put in queue this.dlQueue.push({ img: img, url: url, cors: cors }); this.urlsInQueue[url] = 1; this.tryDownload(); }; // try to download next items in queue if possible Downloader.prototype.tryDownload = function () { //if (this.dlQueue.length>0 && this.nbDownloads<NB_MAX_SIMULTANEOUS_DL) { while (this.dlQueue.length > 0 && this.nbDownloads < NB_MAX_SIMULTANEOUS_DL) { this.startDownloadNext(); } }; Downloader.prototype.startDownloadNext = function () { // get next in queue var next = this.dlQueue.shift(); if (!next) { return; } this.nbDownloads++; var downloaderRef = this; next.img.onload = function () { downloaderRef.completeDownload(this, true); // in this context, 'this' is the Image }; next.img.onerror = function () { downloaderRef.completeDownload(this, false); // in this context, 'this' is the Image }; if (next.cors) { next.img.crossOrigin = 'anonymous'; } else { if (next.img.crossOrigin !== undefined) { delete next.img.crossOrigin; } } next.img.src = next.url; }; Downloader.prototype.completeDownload = function (img, success) { delete this.urlsInQueue[img.src]; img.onerror = null; img.onload = null; this.nbDownloads--; if (success) { if (FADING_ENABLED) { var now = new Date().getTime(); img.fadingStart = now; img.fadingEnd = now + FADING_DURATION; } this.view.requestRedraw(); } else { img.dlError = true; } this.tryDownload(); }; return Downloader; }(); export default Downloader;