UNPKG

tns-core-modules

Version:

Telerik NativeScript Core Modules

141 lines (140 loc) 4.66 kB
var observable = require("data/observable"); var Cache = (function (_super) { __extends(Cache, _super); function Cache() { _super.apply(this, arguments); this.maxRequests = 5; this._enabled = true; this._pendingDownloads = {}; this._queue = []; this._currentDownloads = 0; } Cache.prototype.enableDownload = function () { if (this._enabled) { return; } this._enabled = true; var request; while (this._queue.length > 0 && this._currentDownloads < this.maxRequests) { request = this._queue.pop(); if (!(request.key in this._pendingDownloads)) { this._download(request); } } }; Cache.prototype.disableDownload = function () { if (!this._enabled) { return; } this._enabled = false; }; Cache.prototype.push = function (request) { this._addRequest(request, true); }; Cache.prototype.enqueue = function (request) { this._addRequest(request, false); }; Cache.prototype._addRequest = function (request, onTop) { if (request.key in this._pendingDownloads) { var existingRequest = this._pendingDownloads[request.key]; this._mergeRequests(existingRequest, request); } else { var queueRequest; for (var i = 0; i < this._queue.length; i++) { if (this._queue[i].key === request.key) { queueRequest = this._queue[i]; break; } } if (queueRequest) { this._mergeRequests(queueRequest, request); } else { if (this._shouldDownload(request, onTop)) { this._download(request); } } } }; Cache.prototype._mergeRequests = function (existingRequest, newRequest) { if (existingRequest.completed) { if (newRequest.completed) { var existingCompleted = existingRequest.completed; var stackCompleted = function (result, key) { existingCompleted(result, key); newRequest.completed(result, key); }; existingRequest.completed = stackCompleted; } } else { existingRequest.completed = newRequest.completed; } }; Cache.prototype.get = function (key) { throw new Error("Abstract"); }; Cache.prototype.set = function (key, image) { throw new Error("Abstract"); }; Cache.prototype.remove = function (key) { throw new Error("Abstract"); }; Cache.prototype.clear = function () { throw new Error("Abstract"); }; Cache.prototype._downloadCore = function (request) { throw new Error("Abstract"); }; Cache.prototype._onDownloadCompleted = function (key, image) { var request = this._pendingDownloads[key]; if (request.key && image) { this.set(request.key, image); } this._currentDownloads--; if (request.completed) { request.completed(image, request.key); } if (this.hasListeners(Cache.downloadedEvent)) { this.notify({ eventName: Cache.downloadedEvent, object: this, key: key, image: image }); } delete this._pendingDownloads[request.key]; this._updateQueue(); }; Cache.prototype._shouldDownload = function (request, onTop) { if (this.get(request.key) || request.key in this._pendingDownloads) { return false; } if (this._currentDownloads >= this.maxRequests || !this._enabled) { if (onTop) { this._queue.push(request); } else { this._queue.unshift(request); } return false; } return true; }; Cache.prototype._download = function (request) { this._currentDownloads++; this._pendingDownloads[request.key] = request; this._downloadCore(request); }; Cache.prototype._updateQueue = function () { if (!this._enabled || this._queue.length === 0 || this._currentDownloads === this.maxRequests) { return; } var request = this._queue.pop(); this._download(request); }; Cache.downloadedEvent = "downloaded"; return Cache; }(observable.Observable)); exports.Cache = Cache;