ngx-uploadx
Version:
Angular Resumable Upload Module
80 lines • 9.86 kB
JavaScript
export var ErrorType;
(function (ErrorType) {
ErrorType[ErrorType["NotFound"] = 0] = "NotFound";
ErrorType[ErrorType["Auth"] = 1] = "Auth";
ErrorType[ErrorType["Retryable"] = 2] = "Retryable";
ErrorType[ErrorType["Fatal"] = 3] = "Fatal";
})(ErrorType || (ErrorType = {}));
const defaultRetryConfig = {
maxAttempts: 8,
shouldRestartCodes: [404, 410],
authErrorCodes: [401],
shouldRetryCodes: [408, 423, 429, 460],
shouldRetry(code) {
return code < 400 || code >= 500 || this.shouldRetryCodes.includes(code);
},
minDelay: 500,
maxDelay: 50000,
onBusyDelay: 1000,
timeout: 0,
keepPartial(statusCode) {
return statusCode >= 400;
}
};
/**
* Retryable ErrorHandler
*/
export class RetryHandler {
attempts = 0;
config;
observedValue;
cancel = () => { };
constructor(configOptions = {}) {
this.config = Object.assign({}, defaultRetryConfig, configOptions);
}
/**
* Determine error type based on response code
* @param code - HTTP response status code
*/
kind(code) {
this.attempts++;
if (this.attempts > this.config.maxAttempts) {
return ErrorType.Fatal;
}
if (this.config.authErrorCodes.includes(code)) {
return ErrorType.Auth;
}
if (this.config.shouldRestartCodes.includes(code)) {
return ErrorType.NotFound;
}
if (this.config.shouldRetry(code, this.attempts)) {
return ErrorType.Retryable;
}
return ErrorType.Fatal;
}
/**
* Wait before next retry attempt
* @param time - Delay in ms
*/
wait(time) {
const ms = time || Math.min(2 ** (this.attempts - 1) * this.config.minDelay, this.config.maxDelay);
const jitter = Math.floor(Math.random() * this.config.minDelay * this.attempts);
let id;
return new Promise(resolve => {
this.cancel = () => {
clearTimeout(id);
resolve();
};
id = setTimeout(this.cancel, ms + jitter);
});
}
/**
* Observes value to reset retry attempts counter
* @param value - Value to observe
*/
observe(value) {
this.observedValue !== value && (this.attempts = 0);
this.observedValue = value;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91cGxvYWR4L2xpYi9yZXRyeS1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLFNBS1g7QUFMRCxXQUFZLFNBQVM7SUFDbkIsaURBQVEsQ0FBQTtJQUNSLHlDQUFJLENBQUE7SUFDSixtREFBUyxDQUFBO0lBQ1QsMkNBQUssQ0FBQTtBQUNQLENBQUMsRUFMVyxTQUFTLEtBQVQsU0FBUyxRQUtwQjtBQTRCRCxNQUFNLGtCQUFrQixHQUEwQjtJQUNoRCxXQUFXLEVBQUUsQ0FBQztJQUNkLGtCQUFrQixFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUM5QixjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDckIsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDdEMsV0FBVyxDQUFDLElBQVk7UUFDdEIsT0FBTyxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsUUFBUSxFQUFFLEdBQUc7SUFDYixRQUFRLEVBQUUsS0FBSztJQUNmLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLE9BQU8sRUFBRSxDQUFDO0lBQ1YsV0FBVyxDQUFDLFVBQVU7UUFDcEIsT0FBTyxVQUFVLElBQUksR0FBRyxDQUFDO0lBQzNCLENBQUM7Q0FDRixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNoQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLE1BQU0sQ0FBd0I7SUFDdEIsYUFBYSxDQUFtQjtJQUN4QyxNQUFNLEdBQWUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBRTlCLFlBQVksZ0JBQTZCLEVBQUU7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxDQUFDLElBQVk7UUFDZixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUMsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlDLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDakQsT0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBQzdCLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksQ0FBQyxJQUFhO1FBQ2hCLE1BQU0sRUFBRSxHQUNOLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEYsSUFBSSxFQUFpQyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7Z0JBQ2pCLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDakIsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLENBQUM7WUFDRixFQUFFLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU8sQ0FBQyxLQUF1QjtRQUM3QixJQUFJLENBQUMsYUFBYSxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gRXJyb3JUeXBlIHtcbiAgTm90Rm91bmQsXG4gIEF1dGgsXG4gIFJldHJ5YWJsZSxcbiAgRmF0YWxcbn1cblxuZXhwb3J0IHR5cGUgU2hvdWxkUmV0cnlGdW5jdGlvbiA9IChjb2RlOiBudW1iZXIsIGF0dGVtcHRzOiBudW1iZXIpID0+IGJvb2xlYW47XG5leHBvcnQgdHlwZSBLZWVwUGFydGlhbEZ1bmN0aW9uID0gKGNvZGU6IG51bWJlcikgPT4gYm9vbGVhbjtcblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeUNvbmZpZyB7XG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiByZXRyeSBhdHRlbXB0cyAqL1xuICBtYXhBdHRlbXB0cz86IG51bWJlcjtcbiAgLyoqIFVwbG9hZCBub3QgZXhpc3Qgc3RhdHVzIGNvZGVzICovXG4gIHNob3VsZFJlc3RhcnRDb2Rlcz86IG51bWJlcltdO1xuICAvKiogQmFkIHRva2VuPyBzdGF0dXMgY29kZXMgKi9cbiAgYXV0aEVycm9yQ29kZXM/OiBudW1iZXJbXTtcbiAgLyoqIFJldHJ5YWJsZSA0eHggc3RhdHVzIGNvZGVzICovXG4gIHNob3VsZFJldHJ5Q29kZXM/OiBudW1iZXJbXTtcbiAgLyoqIE92ZXJyaWRlcyB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcmVwZWF0ZWQgKi9cbiAgc2hvdWxkUmV0cnk/OiBTaG91bGRSZXRyeUZ1bmN0aW9uO1xuICAvKiogVGhlIG1pbmltdW0gcmV0cnkgZGVsYXkgKi9cbiAgbWluRGVsYXk/OiBudW1iZXI7XG4gIC8qKiBUaGUgbWF4aW11bSByZXRyeSBkZWxheSAqL1xuICBtYXhEZWxheT86IG51bWJlcjtcbiAgLyoqIERlbGF5IHVzZWQgYmV0d2VlbiByZXRyaWVzIGZvciBub24tZXJyb3IgcmVzcG9uc2VzIHdpdGggbWlzc2luZyByYW5nZS9vZmZzZXQgKi9cbiAgb25CdXN5RGVsYXk/OiBudW1iZXI7XG4gIC8qKiBUaW1lIGludGVydmFsIGFmdGVyIHdoaWNoIGhhbmdlZCByZXF1ZXN0cyBtdXN0IGJlIHJldHJpZWQgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIERldGVybWluZXMgd2hldGhlciBwYXJ0aWFsIGNodW5rcyBzaG91bGQgYmUga2VwdCAqL1xuICBrZWVwUGFydGlhbD86IGJvb2xlYW4gfCBLZWVwUGFydGlhbEZ1bmN0aW9uO1xufVxuXG5jb25zdCBkZWZhdWx0UmV0cnlDb25maWc6IFJlcXVpcmVkPFJldHJ5Q29uZmlnPiA9IHtcbiAgbWF4QXR0ZW1wdHM6IDgsXG4gIHNob3VsZFJlc3RhcnRDb2RlczogWzQwNCwgNDEwXSxcbiAgYXV0aEVycm9yQ29kZXM6IFs0MDFdLFxuICBzaG91bGRSZXRyeUNvZGVzOiBbNDA4LCA0MjMsIDQyOSwgNDYwXSxcbiAgc2hvdWxkUmV0cnkoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvZGUgPCA0MDAgfHwgY29kZSA+PSA1MDAgfHwgdGhpcy5zaG91bGRSZXRyeUNvZGVzLmluY2x1ZGVzKGNvZGUpO1xuICB9LFxuICBtaW5EZWxheTogNTAwLFxuICBtYXhEZWxheTogNTAwMDAsXG4gIG9uQnVzeURlbGF5OiAxMDAwLFxuICB0aW1lb3V0OiAwLFxuICBrZWVwUGFydGlhbChzdGF0dXNDb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN0YXR1c0NvZGUgPj0gNDAwO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJ5YWJsZSBFcnJvckhhbmRsZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFJldHJ5SGFuZGxlciB7XG4gIHB1YmxpYyBhdHRlbXB0cyA9IDA7XG4gIGNvbmZpZzogUmVxdWlyZWQ8UmV0cnlDb25maWc+O1xuICBwcml2YXRlIG9ic2VydmVkVmFsdWU/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGNhbmNlbDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZ09wdGlvbnM6IFJldHJ5Q29uZmlnID0ge30pIHtcbiAgICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSZXRyeUNvbmZpZywgY29uZmlnT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGVycm9yIHR5cGUgYmFzZWQgb24gcmVzcG9uc2UgY29kZVxuICAgKiBAcGFyYW0gY29kZSAtIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVcbiAgICovXG4gIGtpbmQoY29kZTogbnVtYmVyKTogRXJyb3JUeXBlIHtcbiAgICB0aGlzLmF0dGVtcHRzKys7XG4gICAgaWYgKHRoaXMuYXR0ZW1wdHMgPiB0aGlzLmNvbmZpZy5tYXhBdHRlbXB0cykge1xuICAgICAgcmV0dXJuIEVycm9yVHlwZS5GYXRhbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnLmF1dGhFcnJvckNvZGVzLmluY2x1ZGVzKGNvZGUpKSB7XG4gICAgICByZXR1cm4gRXJyb3JUeXBlLkF1dGg7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5zaG91bGRSZXN0YXJ0Q29kZXMuaW5jbHVkZXMoY29kZSkpIHtcbiAgICAgIHJldHVybiBFcnJvclR5cGUuTm90Rm91bmQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5zaG91bGRSZXRyeShjb2RlLCB0aGlzLmF0dGVtcHRzKSkge1xuICAgICAgcmV0dXJuIEVycm9yVHlwZS5SZXRyeWFibGU7XG4gICAgfVxuICAgIHJldHVybiBFcnJvclR5cGUuRmF0YWw7XG4gIH1cblxuICAvKipcbiAgICogV2FpdCBiZWZvcmUgbmV4dCByZXRyeSBhdHRlbXB0XG4gICAqIEBwYXJhbSB0aW1lIC0gRGVsYXkgaW4gbXNcbiAgICovXG4gIHdhaXQodGltZT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1zID1cbiAgICAgIHRpbWUgfHwgTWF0aC5taW4oMiAqKiAodGhpcy5hdHRlbXB0cyAtIDEpICogdGhpcy5jb25maWcubWluRGVsYXksIHRoaXMuY29uZmlnLm1heERlbGF5KTtcbiAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLmNvbmZpZy5taW5EZWxheSAqIHRoaXMuYXR0ZW1wdHMpO1xuICAgIGxldCBpZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5jYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dChpZCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG4gICAgICBpZCA9IHNldFRpbWVvdXQodGhpcy5jYW5jZWwsIG1zICsgaml0dGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlcyB2YWx1ZSB0byByZXNldCByZXRyeSBhdHRlbXB0cyBjb3VudGVyXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIG9ic2VydmVcbiAgICovXG4gIG9ic2VydmUodmFsdWU/OiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVkVmFsdWUgIT09IHZhbHVlICYmICh0aGlzLmF0dGVtcHRzID0gMCk7XG4gICAgdGhpcy5vYnNlcnZlZFZhbHVlID0gdmFsdWU7XG4gIH1cbn1cbiJdfQ==