este-library-oldschool
Version:
Library for github.com/steida/este.git
201 lines (182 loc) • 4.91 kB
JavaScript
// 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;