UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

280 lines (278 loc) 29.9 kB
"use strict"; /* * Copyright (c) 2019 by Filestack. * Some rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.Upload = void 0; var tslib_1 = require("tslib"); var eventemitter3_1 = require("eventemitter3"); var s3_1 = require("./uploaders/s3"); var filestack_error_1 = require("./../../../filestack_error"); var file_tools_1 = require("./file_tools"); var schema_1 = require("./../../../schema"); var DEFAULT_PROGRESS_INTERVAL = 1000; var normalizeProgress = function (current, last) { current.totalBytes = Math.max(current.totalBytes, last.totalBytes); current.totalPercent = Math.max(current.totalPercent, last.totalPercent); return current; }; /** * Uploader main class for now its supporting only s3 upload type * * @export * @class Upload */ var Upload = /** @class */ (function (_super) { tslib_1.__extends(Upload, _super); function Upload(options, storeOptions) { if (options === void 0) { options = {}; } if (storeOptions === void 0) { storeOptions = {}; } var _this = _super.call(this) || this; _this.options = options; _this.storeOptions = storeOptions; _this.lastProgress = { totalBytes: 0, totalPercent: 0, }; // do not delete filename from original options reference - copy it first _this.storeOptions = Object.assign({}, storeOptions); var validateRes = (0, schema_1.getValidator)(schema_1.UploadParamsSchema)(options); if (validateRes.errors.length) { throw new filestack_error_1.FilestackError("Invalid upload params", validateRes.errors, filestack_error_1.FilestackErrorType.VALIDATION); } var storeValidateRes = (0, schema_1.getValidator)(schema_1.StoreParamsSchema)(storeOptions); if (storeValidateRes.errors.length) { throw new filestack_error_1.FilestackError("Invalid store upload params", storeValidateRes.errors, filestack_error_1.FilestackErrorType.VALIDATION); } if (storeOptions.filename) { _this.overrideFileName = storeOptions.filename; delete _this.storeOptions.filename; } if (_this.storeOptions.sanitizer) { _this.sanitizerOptions = _this.storeOptions.sanitizer; delete _this.storeOptions.sanitizer; } _this.uploader = new s3_1.S3Uploader(_this.storeOptions, options.concurrency); _this.uploader.setRetryConfig({ retry: options.retry || 10, onRetry: options.onRetry, retryFactor: options.retryFactor || 2, retryMaxTime: options.retryMaxTime || 15000, }); _this.uploader.setTimeout(options.timeout || 120000); if (options.partSize) { _this.uploader.setPartSize(options.partSize); } if (options.intelligentChunkSize) { _this.uploader.setIntelligentChunkSize(options.intelligentChunkSize); } if (options.disableIntegrityCheck) { _this.uploader.setIntegrityCheck(false); } if (options.intelligent) { _this.uploader.setUploadMode(options.intelligent === 'fallback' ? "fallback" /* UploadMode.FALLBACK */ : "intelligent" /* UploadMode.INTELLIGENT */); } _this.uploader.setUploadTags(options.tags); _this.uploader.on('start', function () { return _this.emit('start'); }); _this.uploader.on('error', function (e) { return _this.emit('error', e); }); _this.uploader.on('progress', _this.handleProgress.bind(_this)); return _this; } /** * Set session object to uploader * * @deprecated * @param {Session} session * @memberof Upload */ Upload.prototype.setSession = function (session) { this.uploader.setApikey(session.apikey); if (session.policy && session.signature) { this.uploader.setSecurity({ policy: session.policy, signature: session.signature, }); } this.uploader.setUrl(session.urls.uploadApiUrl); }; /** * Set cancel token to controll upload flow * * @param {*} token * @returns * @memberof Upload */ Upload.prototype.setToken = function (token) { var _this = this; if (!token || token !== Object(token)) { throw new Error('Incorrect upload token. Must be instance of object'); } token.pause = function () { return _this.uploader.pause(); }; token.resume = function () { return _this.uploader.resume(); }; token.cancel = function () { return _this.uploader.abort(); }; return token; }; /** * Sets security to uploader instance * * @param {Security} security * @memberof Upload */ Upload.prototype.setSecurity = function (security) { this.uploader.setSecurity(security); }; /** * Set upload tags * * @param {Tags} tags * @memberof Upload */ Upload.prototype.setUploadTags = function (tags) { this.uploader.setUploadTags(tags); }; /** * Upload single file * * @param {(InputFile)} file * @param {(string)} altText * @returns {Promise<any>} * @memberof Upload */ Upload.prototype.upload = function (input, altText) { return tslib_1.__awaiter(this, void 0, void 0, function () { var f, res; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, file_tools_1.getFile)(input, this.sanitizerOptions)]; case 1: f = _a.sent(); f.customName = this.overrideFileName; if (altText) { f.alt = altText; } this.uploader.addFile(f); this.startProgressInterval(); return [4 /*yield*/, this.uploader.execute()]; case 2: res = (_a.sent()).shift(); this.stopProgressInterval(); this.uploader.removeAllListeners(); if (res.status === "Failed" /* FileState.FAILED */) { return [2 /*return*/, Promise.reject(res)]; } return [2 /*return*/, Promise.resolve(res)]; } }); }); }; /** * Upload multiple files at once * * @param {(InputFile[])} input * @returns {Promise<any>} * @memberof Upload */ Upload.prototype.multiupload = function (input) { return tslib_1.__awaiter(this, void 0, void 0, function () { var _a, _b, _c, _i, i, f, res; return tslib_1.__generator(this, function (_d) { switch (_d.label) { case 0: _a = input; _b = []; for (_c in _a) _b.push(_c); _i = 0; _d.label = 1; case 1: if (!(_i < _b.length)) return [3 /*break*/, 4]; _c = _b[_i]; if (!(_c in _a)) return [3 /*break*/, 3]; i = _c; /* istanbul ignore next */ if (!input.hasOwnProperty(i)) { return [3 /*break*/, 3]; } return [4 /*yield*/, (0, file_tools_1.getFile)(input[i], this.sanitizerOptions)]; case 2: f = _d.sent(); f.customName = this.overrideFileName; this.uploader.addFile(f); _d.label = 3; case 3: _i++; return [3 /*break*/, 1]; case 4: this.startProgressInterval(); return [4 /*yield*/, this.uploader.execute()]; case 5: res = _d.sent(); this.stopProgressInterval(); this.uploader.removeAllListeners(); return [2 /*return*/, Promise.resolve(res)]; } }); }); }; /** * RUn progress with userdefined interval * * @private * @returns * @memberof Upload */ Upload.prototype.startProgressInterval = function () { var _this = this; if (typeof this.options.onProgress !== 'function') { return; } this.progressIntervalHandler = setInterval(function () { _this.options.onProgress(_this.lastProgress); }, this.options.progressInterval || DEFAULT_PROGRESS_INTERVAL); this.options.onProgress(this.lastProgress); }; /** * Stop progress interval after upload * * @private * @memberof Upload */ Upload.prototype.stopProgressInterval = function () { clearInterval(this.progressIntervalHandler); }; /** * Handle upload interval and normalize values * * @private * @param {ProgressEvent} progress * @memberof Upload */ Upload.prototype.handleProgress = function (progress) { // get max progress data to avoid progress jumps on any part error progress = normalizeProgress(progress, this.lastProgress); if (this.lastProgress.files) { for (var i in progress.files) { if (this.lastProgress.files[i]) { progress.files[i] = normalizeProgress(progress.files[i], this.lastProgress.files[i]); } } } this.lastProgress = progress; }; return Upload; }(eventemitter3_1.EventEmitter)); exports.Upload = Upload; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3VwbG9hZC91cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7OztBQUVILCtDQUE2QztBQUU3QyxxQ0FBNEM7QUFDNUMsOERBQWdGO0FBSWhGLDJDQUFrRDtBQUdsRCw0Q0FBd0Y7QUFReEYsSUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUM7QUFFdkMsSUFBTSxpQkFBaUIsR0FBRyxVQUFDLE9BQU8sRUFBRSxJQUFJO0lBQ3RDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRSxPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFekUsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSDtJQUE0QixrQ0FBWTtJQTJCdEMsZ0JBQTZCLE9BQTJCLEVBQVUsWUFBcUM7UUFBMUUsd0JBQUEsRUFBQSxZQUEyQjtRQUFVLDZCQUFBLEVBQUEsaUJBQXFDO1FBQXZHLFlBQ0UsaUJBQU8sU0EwRFI7UUEzRDRCLGFBQU8sR0FBUCxPQUFPLENBQW9CO1FBQVUsa0JBQVksR0FBWixZQUFZLENBQXlCO1FBUi9GLGtCQUFZLEdBQWtCO1lBQ3BDLFVBQVUsRUFBRSxDQUFDO1lBQ2IsWUFBWSxFQUFFLENBQUM7U0FDaEIsQ0FBQztRQVFBLHlFQUF5RTtRQUN6RSxLQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXBELElBQU0sV0FBVyxHQUFHLElBQUEscUJBQVksRUFBQywyQkFBa0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlELElBQUksV0FBVyxDQUFD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Q0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLCtCQUFjLEdBQXRCLFVBQXVCLFFBQXVCO1FBQzVDLGtFQUFrRTtRQUNsRSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUxRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQzNCLEtBQUssSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtnQkFDNUIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDOUIsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3RGO2FBQ0Y7U0FDRjtRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO0lBQy9CLENBQUM7SUFDSCxhQUFDO0FBQUQsQ0FoUUEsQUFnUUMsQ0FoUTJCLDRCQUFZLEdBZ1F2QztBQWhRWSx3QkFBTSIsImZpbGUiOiJsaWIvYXBpL3VwbG9hZC91cGxvYWQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IGJ5IEZpbGVzdGFjay5cbiAqIFNvbWUgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudGVtaXR0ZXIzJztcbmltcG9ydCB7IFNlc3Npb24sIFNlY3VyaXR5IH0gZnJvbSAnLi4vLi4vY2xpZW50JztcbmltcG9ydCB7IFMzVXBsb2FkZXIgfSBmcm9tICcuL3VwbG9hZGVycy9zMyc7XG5pbXBvcnQgeyBGaWxlc3RhY2tFcnJvciwgRmlsZXN0YWNrRXJyb3JUeXBlIH0gZnJvbSAnLi8uLi8uLi8uLi9maWxlc3RhY2tfZXJyb3InO1xuaW1wb3J0IHsgU2FuaXRpemVPcHRpb25zIH0gZnJvbSAnLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCB7IFVwbG9hZE9wdGlvbnMsIFN0b3JlVXBsb2FkT3B0aW9ucyB9IGZyb20gJy4uL3VwbG9hZC90eXBlcyc7XG5pbXBvcnQgeyBnZXRGaWxlLCBJbnB1dEZpbGUgfSBmcm9tICcuL2ZpbGVfdG9vbHMnO1xuaW1wb3J0IHsgRmlsZVN0YXRlLCBVcGxvYWRUYWdzIH0gZnJvbSAnLi9maWxlJztcbmltcG9ydCB7IFVwbG9hZE1vZGUgfSBmcm9tICcuL3VwbG9hZGVycy9hYnN0cmFjdCc7XG5pbXBvcnQgeyBnZXRWYWxpZGF0b3IsIFVwbG9hZFBhcmFtc1NjaGVtYSwgU3RvcmVQYXJhbXNTY2hlbWEgfSBmcm9tICcuLy4uLy4uLy4uL3NjaGVtYSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3Jlc3NFdmVudCB7XG4gIHRvdGFsUGVyY2VudDogbnVtYmVyO1xuICB0b3RhbEJ5dGVzOiBudW1iZXI7XG4gIGZpbGVzPzogeyAoa2V5OiBzdHJpbmcpOiBQcm9ncmVzc0V2ZW50IH07XG59XG5cbmNvbnN0IERFRkFVTFRfUFJPR1JFU1NfSU5URVJWQUwgPSAxMDAwO1xuXG5jb25zdCBub3JtYWxpemVQcm9ncmVzcyA9IChjdXJyZW50LCBsYXN0KSA9PiB7XG4gIGN1cnJlbnQudG90YWxCeXRlcyA9IE1hdGgubWF4KGN1cnJlbnQudG90YWxCeXRlcywgbGFzdC50b3RhbEJ5dGVzKTtcbiAgY3VycmVudC50b3RhbFBlcmNlbnQgPSBNYXRoLm1heChjdXJyZW50LnRvdGFsUGVyY2VudCwgbGFzdC50b3RhbFBlcmNlbnQpO1xuXG4gIHJldHVybiBjdXJyZW50O1xufTtcblxuLyoqXG4gKiBVcGxvYWRlciBtYWluIGNsYXNzIGZvciBub3cgaXRzIHN1cHBvcnRpbmcgb25seSBzMyB1cGxvYWQgdHlwZVxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBVcGxvYWRcbiAqL1xuZXhwb3J0IGNsYXNzIFVwbG9hZCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG5cbiAgLyoqXG4gICAqIFVwbG9hZGVyIGluc3RhbmNlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtTM1VwbG9hZGVyfVxuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBwcml2YXRlIHVwbG9hZGVyOiBTM1VwbG9hZGVyO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgd2Ugb3ZlcndyaXRlIGZpbGUgbmFtZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBwcml2YXRlIG92ZXJyaWRlRmlsZU5hbWU7XG5cbiAgcHJpdmF0ZSBsYXN0UHJvZ3Jlc3M6IFByb2dyZXNzRXZlbnQgPSB7XG4gICAgdG90YWxCeXRlczogMCxcbiAgICB0b3RhbFBlcmNlbnQ6IDAsXG4gIH07XG5cbiAgcHJpdmF0ZSBwcm9ncmVzc0ludGVydmFsSGFuZGxlcjtcbiAgcHJpdmF0ZSBzYW5pdGl6ZXJPcHRpb25zOiBTYW5pdGl6ZU9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBVcGxvYWRPcHRpb25zID0ge30sIHByaXZhdGUgc3RvcmVPcHRpb25zOiBTdG9yZVVwbG9hZE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBkbyBub3QgZGVsZXRlIGZpbGVuYW1lIGZyb20gb3JpZ2luYWwgb3B0aW9ucyByZWZlcmVuY2UgLSBjb3B5IGl0IGZpcnN0XG4gICAgdGhpcy5zdG9yZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBzdG9yZU9wdGlvbnMpO1xuXG4gICAgY29uc3QgdmFsaWRhdGVSZXMgPSBnZXRWYWxpZGF0b3IoVXBsb2FkUGFyYW1zU2NoZW1hKShvcHRpb25zKTtcblxuICAgIGlmICh2YWxpZGF0ZVJlcy5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRmlsZXN0YWNrRXJyb3IoYEludmFsaWQgdXBsb2FkIHBhcmFtc2AsIHZhbGlkYXRlUmVzLmVycm9ycywgRmlsZXN0YWNrRXJyb3JUeXBlLlZBTElEQVRJT04pO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlVmFsaWRhdGVSZXMgPSBnZXRWYWxpZGF0b3IoU3RvcmVQYXJhbXNTY2hlbWEpKHN0b3JlT3B0aW9ucyk7XG4gICAgaWYgKHN0b3JlVmFsaWRhdGVSZXMuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEZpbGVzdGFja0Vycm9yKGBJbnZhbGlkIHN0b3JlIHVwbG9hZCBwYXJhbXNgLCBzdG9yZVZhbGlkYXRlUmVzLmVycm9ycywgRmlsZXN0YWNrRXJyb3JUeXBlLlZBTElEQVRJT04pO1xuICAgIH1cblxuICAgIGlmIChzdG9yZU9wdGlvbnMuZmlsZW5hbWUpIHtcbiAgICAgIHRoaXMub3ZlcnJpZGVGaWxlTmFtZSA9IHN0b3JlT3B0aW9ucy5maWxlbmFtZTtcbiAgICAgIGRlbGV0ZSB0aGlzLnN0b3JlT3B0aW9ucy5maWxlbmFtZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdG9yZU9wdGlvbnMuc2FuaXRpemVyKSB7XG4gICAgICB0aGlzLnNhbml0aXplck9wdGlvbnMgPSB0aGlzLnN0b3JlT3B0aW9ucy5zYW5pdGl6ZXI7XG4gICAgICBkZWxldGUgdGhpcy5zdG9yZU9wdGlvbnMuc2FuaXRpemVyO1xuICAgIH1cblxuICAgIHRoaXMudXBsb2FkZXIgPSBuZXcgUzNVcGxvYWRlcih0aGlzLnN0b3JlT3B0aW9ucywgb3B0aW9ucy5jb25jdXJyZW5jeSk7XG5cbiAgICB0aGlzLnVwbG9hZGVyLnNldFJldHJ5Q29uZmlnKHtcbiAgICAgIHJldHJ5OiBvcHRpb25zLnJldHJ5IHx8IDEwLFxuICAgICAgb25SZXRyeTogb3B0aW9ucy5vblJldHJ5LCAvLyBAdG9kbyBiaW5kIGZpbGUgdG8gcmV0cnkgaW4gczMgdXBsb2FkZXJcbiAgICAgIHJldHJ5RmFjdG9yOiBvcHRpb25zLnJldHJ5RmFjdG9yIHx8IDIsXG4gICAgICByZXRyeU1heFRpbWU6IG9wdGlvbnMucmV0cnlNYXhUaW1lIHx8IDE1MDAwLFxuICAgIH0pO1xuXG4gICAgdGhpcy51cGxvYWRlci5zZXRUaW1lb3V0KG9wdGlvbnMudGltZW91dCB8fCAxMjAwMDApO1xuXG4gICAgaWYgKG9wdGlvbnMucGFydFNpemUpIHtcbiAgICAgIHRoaXMudXBsb2FkZXIuc2V0UGFydFNpemUob3B0aW9ucy5wYXJ0U2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaW50ZWxsaWdlbnRDaHVua1NpemUpIHtcbiAgICAgIHRoaXMudXBsb2FkZXIuc2V0SW50ZWxsaWdlbnRDaHVua1NpemUob3B0aW9ucy5pbnRlbGxpZ2VudENodW5rU2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZGlzYWJsZUludGVncml0eUNoZWNrKSB7XG4gICAgICB0aGlzLnVwbG9hZGVyLnNldEludGVncml0eUNoZWNrKGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pbnRlbGxpZ2VudCkge1xuICAgICAgdGhpcy51cGxvYWRlci5zZXRVcGxvYWRNb2RlKG9wdGlvbnMuaW50ZWxsaWdlbnQgPT09ICdmYWxsYmFjaycgPyBVcGxvYWRNb2RlLkZBTExCQUNLIDogVXBsb2FkTW9kZS5JTlRFTExJR0VOVCk7XG4gICAgfVxuXG4gICAgdGhpcy51cGxvYWRlci5zZXRVcGxvYWRUYWdzKG9wdGlvbnMudGFncyk7XG5cbiAgICB0aGlzLnVwbG9hZGVyLm9uKCdzdGFydCcsICgpID0+IHRoaXMuZW1pdCgnc3RhcnQnKSk7XG4gICAgdGhpcy51cGxvYWRlci5vbignZXJyb3InLCAoZSkgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGUpKTtcbiAgICB0aGlzLnVwbG9hZGVyLm9uKCdwcm9ncmVzcycsIHRoaXMuaGFuZGxlUHJvZ3Jlc3MuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNlc3Npb24gb2JqZWN0IHRvIHVwbG9hZGVyXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIEBwYXJhbSB7U2Vzc2lvbn0gc2Vzc2lvblxuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBzZXRTZXNzaW9uKHNlc3Npb246IFNlc3Npb24pIHtcbiAgICB0aGlzLnVwbG9hZGVyLnNldEFwaWtleShzZXNzaW9uLmFwaWtleSk7XG5cbiAgICBpZiAoc2Vzc2lvbi5wb2xpY3kgJiYgc2Vzc2lvbi5zaWduYXR1cmUpIHtcbiAgICAgIHRoaXMudXBsb2FkZXIuc2V0U2VjdXJpdHkoe1xuICAgICAgICBwb2xpY3k6IHNlc3Npb24ucG9saWN5LFxuICAgICAgICBzaWduYXR1cmU6IHNlc3Npb24uc2lnbmF0dXJlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy51cGxvYWRlci5zZXRVcmwoc2Vzc2lvbi51cmxzLnVwbG9hZEFwaVVybCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGNhbmNlbCB0b2tlbiB0byBjb250cm9sbCB1cGxvYWQgZmxvd1xuICAgKlxuICAgKiBAcGFyYW0geyp9IHRva2VuXG4gICAqIEByZXR1cm5zXG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIHB1YmxpYyBzZXRUb2tlbih0b2tlbjogYW55KSB7XG4gICAgaWYgKCF0b2tlbiB8fCB0b2tlbiAhPT0gT2JqZWN0KHRva2VuKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgdXBsb2FkIHRva2VuLiBNdXN0IGJlIGluc3RhbmNlIG9mIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHRva2VuLnBhdXNlID0gKCkgPT4gdGhpcy51cGxvYWRlci5wYXVzZSgpO1xuICAgIHRva2VuLnJlc3VtZSA9ICgpID0+IHRoaXMudXBsb2FkZXIucmVzdW1lKCk7XG4gICAgdG9rZW4uY2FuY2VsID0gKCkgPT4gdGhpcy51cGxvYWRlci5hYm9ydCgpO1xuXG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgc2VjdXJpdHkgdG8gdXBsb2FkZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtTZWN1cml0eX0gc2VjdXJpdHlcbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHVibGljIHNldFNlY3VyaXR5KHNlY3VyaXR5OiBTZWN1cml0eSkge1xuICAgIHRoaXMudXBsb2FkZXIuc2V0U2VjdXJpdHkoc2VjdXJpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cGxvYWQgdGFnc1xuICAgKlxuICAgKiBAcGFyYW0ge1RhZ3N9IHRhZ3NcbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHVibGljIHNldFVwbG9hZFRhZ3ModGFnczogVXBsb2FkVGFncykge1xuICAgIHRoaXMudXBsb2FkZXIuc2V0VXBsb2FkVGFncyh0YWdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgc2luZ2xlIGZpbGVcbiAgICpcbiAgICogQHBhcmFtIHsoSW5wdXRGaWxlKX0gZmlsZVxuICAgKiBAcGFyYW0geyhzdHJpbmcpfSBhbHRUZXh0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIGFzeW5jIHVwbG9hZChpbnB1dDogSW5wdXRGaWxlLCBhbHRUZXh0Pzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcblxuICAgIGNvbnN0IGYgPSBhd2FpdCBnZXRGaWxlKGlucHV0LCB0aGlzLnNhbml0aXplck9wdGlvbnMpO1xuICAgIGYuY3VzdG9tTmFtZSA9IHRoaXMub3ZlcnJpZGVGaWxlTmFtZTtcbiAgICBpZiAoYWx0VGV4dCkge1xuICAgICAgZi5hbHQgPSBhbHRUZXh0O1xuICAgIH1cblxuICAgIHRoaXMudXBsb2FkZXIuYWRkRmlsZShmKTtcblxuICAgIHRoaXMuc3RhcnRQcm9ncmVzc0ludGVydmFsKCk7XG4gICAgY29uc3QgcmVzID0gKGF3YWl0IHRoaXMudXBsb2FkZXIuZXhlY3V0ZSgpKS5zaGlmdCgpO1xuICAgIHRoaXMuc3RvcFByb2dyZXNzSW50ZXJ2YWwoKTtcblxuICAgIHRoaXMudXBsb2FkZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gRmlsZVN0YXRlLkZBSUxFRCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZCBtdWx0aXBsZSBmaWxlcyBhdCBvbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7KElucHV0RmlsZVtdKX0gaW5wdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgYXN5bmMgbXVsdGl1cGxvYWQoaW5wdXQ6IElucHV0RmlsZVtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICBmb3IgKGxldCBpIGluIGlucHV0KSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKCFpbnB1dC5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZiA9IGF3YWl0IGdldEZpbGUoaW5wdXRbaV0sIHRoaXMuc2FuaXRpemVyT3B0aW9ucyk7XG4gICAgICBmLmN1c3RvbU5hbWUgPSB0aGlzLm92ZXJyaWRlRmlsZU5hbWU7XG4gICAgICB0aGlzLnVwbG9hZGVyLmFkZEZpbGUoZik7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydFByb2dyZXNzSW50ZXJ2YWwoKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnVwbG9hZGVyLmV4ZWN1dGUoKTtcbiAgICB0aGlzLnN0b3BQcm9ncmVzc0ludGVydmFsKCk7XG5cbiAgICB0aGlzLnVwbG9hZGVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJVbiBwcm9ncmVzcyB3aXRoIHVzZXJkZWZpbmVkIGludGVydmFsXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEByZXR1cm5zXG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIHByaXZhdGUgc3RhcnRQcm9ncmVzc0ludGVydmFsKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLm9uUHJvZ3Jlc3MgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByb2dyZXNzSW50ZXJ2YWxIYW5kbGVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5vcHRpb25zLm9uUHJvZ3Jlc3ModGhpcy5sYXN0UHJvZ3Jlc3MpO1xuICAgIH0sIHRoaXMub3B0aW9ucy5wcm9ncmVzc0ludGVydmFsIHx8IERFRkFVTFRfUFJPR1JFU1NfSU5URVJWQUwpO1xuXG4gICAgdGhpcy5vcHRpb25zLm9uUHJvZ3Jlc3ModGhpcy5sYXN0UHJvZ3Jlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgcHJvZ3Jlc3MgaW50ZXJ2YWwgYWZ0ZXIgdXBsb2FkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIHByaXZhdGUgc3RvcFByb2dyZXNzSW50ZXJ2YWwoKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLnByb2dyZXNzSW50ZXJ2YWxIYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdXBsb2FkIGludGVydmFsIGFuZCBub3JtYWxpemUgdmFsdWVzXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7UHJvZ3Jlc3NFdmVudH0gcHJvZ3Jlc3NcbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVQcm9ncmVzcyhwcm9ncmVzczogUHJvZ3Jlc3NFdmVudCkge1xuICAgIC8vIGdldCBtYXggcHJvZ3Jlc3MgZGF0YSB0byBhdm9pZCBwcm9ncmVzcyBqdW1wcyBvbiBhbnkgcGFydCBlcnJvclxuICAgIHByb2dyZXNzID0gbm9ybWFsaXplUHJvZ3Jlc3MocHJvZ3Jlc3MsIHRoaXMubGFzdFByb2dyZXNzKTtcblxuICAgIGlmICh0aGlzLmxhc3RQcm9ncmVzcy5maWxlcykge1xuICAgICAgZm9yIChsZXQgaSBpbiBwcm9ncmVzcy5maWxlcykge1xuICAgICAgICBpZiAodGhpcy5sYXN0UHJvZ3Jlc3MuZmlsZXNbaV0pIHtcbiAgICAgICAgICBwcm9ncmVzcy5maWxlc1tpXSA9IG5vcm1hbGl6ZVByb2dyZXNzKHByb2dyZXNzLmZpbGVzW2ldLCB0aGlzLmxhc3RQcm9ncmVzcy5maWxlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxhc3RQcm9ncmVzcyA9IHByb2dyZXNzO1xuICB9XG59XG4iXX0=