UNPKG

este-library-oldschool

Version:

Library for github.com/steida/este.git

201 lines (182 loc) 4.91 kB
// Generated by github.com/steida/coffee2closure 900.1.18 /** @fileoverview Algorithm for pending navigation pattern. It maps browser behavior, don't show unloaded page and allow user to load another page before first page load is resolved. @see https://medium.com/joys-of-javascript/4353246f4480 */ goog.provide('este.labs.app.LastWinUrlLoader'); goog.require('este.labs.app.UrlLoader'); goog.require('goog.async.nextTick'); goog.require('goog.Promise'); goog.require('goog.object'); /** @constructor @implements {este.labs.app.UrlLoader} */ este.labs.app.LastWinUrlLoader = function() { this.emptyPendings(); } /** @enum {string} */ este.labs.app.LastWinUrlLoader.CancelResolution = { ABORT: 'abort', PENDING: 'pending', TIMEOUT: 'timeout' }; /** @type {number} */ este.labs.app.LastWinUrlLoader.prototype.timeoutMs = 15 * 1000; /** @type {?string} @protected */ este.labs.app.LastWinUrlLoader.prototype.lastLoadedUrl = null; /** @type {Object} @protected */ este.labs.app.LastWinUrlLoader.prototype.pendings = null; /** @type {?number} @protected */ este.labs.app.LastWinUrlLoader.prototype.timeoutTimer = null; /** @override */ este.labs.app.LastWinUrlLoader.prototype.load = function(url, load) { this.lastLoadedUrl = url; if (this.pendings[url]) { return this.createRejectedWithPendingPromise(); } if (goog.object.isEmpty(this.pendings)) { this.timeoutTimer = setTimeout(((function(_this) { return function() { return _this.onTimeout(); }; })(this)), this.timeoutMs); } return this.pendings[url] = new goog.Promise((function(_this) { return function(resolve, reject) { load().then(_this.onFulfill.bind(_this, url, resolve, reject), _this.onReject.bind(_this, url, resolve, reject)); }; })(this)); }; /** @param {string} url @param {Function} resolve @param {Function} reject @param {*} value @protected */ este.labs.app.LastWinUrlLoader.prototype.onFulfill = function(url, resolve, reject, value) { var urlIsLastLoaded; this.resetPendingsIfUrlWasLastLoaded(url); urlIsLastLoaded = url === this.lastLoadedUrl; return goog.async.nextTick((function(_this) { return function() { if (urlIsLastLoaded) { return resolve(value); } else { return reject(_this.createCancellationError(este.labs.app.LastWinUrlLoader.CancelResolution.ABORT)); } }; })(this)); }; /** @param {string} url @param {Function} reject @param {*} reason @protected */ este.labs.app.LastWinUrlLoader.prototype.onReject = function(url, resolve, reject, reason) { var error; this.resetPendingsIfUrlWasLastLoaded(url); error = new este.labs.app.LastWinUrlLoader.Error(reason); error.isSilent = url !== this.lastLoadedUrl; return goog.async.nextTick(function() { return reject(error); }); }; /** @protected */ este.labs.app.LastWinUrlLoader.prototype.createRejectedWithPendingPromise = function() { var error; error = this.createCancellationError(este.labs.app.LastWinUrlLoader.CancelResolution.PENDING); return goog.Promise.reject(error); }; /** @param {string} url @protected */ este.labs.app.LastWinUrlLoader.prototype.resetPendingsIfUrlWasLastLoaded = function(url) { if (url !== this.lastLoadedUrl) { return; } return this.resetPendings(url); }; /** @param {?string} url @param {string=} resolution @protected */ este.labs.app.LastWinUrlLoader.prototype.resetPendings = function(url, resolution) { this.cancelPendingPromises(url, resolution); this.emptyPendings(); return clearTimeout(this.timeoutTimer); }; /** @param {?string} url @param {string=} resolution @protected */ este.labs.app.LastWinUrlLoader.prototype.cancelPendingPromises = function(url, resolution) { var promise, promiseUrl, ref; ref = this.pendings; for (promiseUrl in ref) { promise = ref[promiseUrl]; if (promiseUrl === url) { continue; } promise.cancel(resolution != null ? resolution : este.labs.app.LastWinUrlLoader.CancelResolution.ABORT); } }; /** @protected */ este.labs.app.LastWinUrlLoader.prototype.emptyPendings = function() { return this.pendings = Object.create(null); }; /** @param {string} resolution @protected */ este.labs.app.LastWinUrlLoader.prototype.createCancellationError = function(resolution) { return new goog.Promise.CancellationError(resolution); }; /** @protected */ este.labs.app.LastWinUrlLoader.prototype.onTimeout = function() { return this.resetPendings(null, este.labs.app.LastWinUrlLoader.CancelResolution.TIMEOUT); }; /** @param {*} reason @constructor @final */ este.labs.app.LastWinUrlLoader.Error = function(reason1) { this.reason = reason1; } /** @type {*} */ este.labs.app.LastWinUrlLoader.Error.prototype.reason = null; /** @type {boolean} */ este.labs.app.LastWinUrlLoader.Error.prototype.isSilent = false;