UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

277 lines (275 loc) 29.8 kB
/* * 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. */ import { __awaiter, __extends, __generator } from "tslib"; import { EventEmitter } from 'eventemitter3'; import { S3Uploader } from './uploaders/s3'; import { FilestackError, FilestackErrorType } from './../../../filestack_error'; import { getFile } from './file_tools'; import { getValidator, UploadParamsSchema, StoreParamsSchema } from './../../../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) { __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 = getValidator(UploadParamsSchema)(options); if (validateRes.errors.length) { throw new FilestackError("Invalid upload params", validateRes.errors, FilestackErrorType.VALIDATION); } var storeValidateRes = getValidator(StoreParamsSchema)(storeOptions); if (storeValidateRes.errors.length) { throw new FilestackError("Invalid store upload params", storeValidateRes.errors, 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 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 __awaiter(this, void 0, void 0, function () { var f, res; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, 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 __awaiter(this, void 0, void 0, function () { var _a, _b, _c, _i, i, f, res; return __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*/, 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; }(EventEmitter)); export { Upload }; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3VwbG9hZC91cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUloRixPQUFPLEVBQUUsT0FBTyxFQUFhLE1BQU0sY0FBYyxDQUFDO0FBR2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVF4RixJQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQztBQUV2QyxJQUFNLGlCQUFpQixHQUFHLFVBQUMsT0FBTyxFQUFFLElBQUk7SUFDdEMsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25FLE9BQU8sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUV6RSxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNIO0lBQTRCLDBCQUFZO0lBMkJ0QyxnQkFBNkIsT0FBMkIsRUFBVSxZQUFxQztRQUExRSx3QkFBQSxFQUFBLFlBQTJCO1FBQVUsNkJBQUEsRUFBQSxpQkFBcUM7UUFBdkcsWUFDRSxpQkFBTyxTQTBEUjtRQTNENEIsYUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFBVSxrQkFBWSxHQUFaLFlBQVksQ0FBeUI7UUFSL0Ysa0JBQVksR0FBa0I7WUFDcEMsVUFBVSxFQUFFLENBQUM7WUFDYixZQUFZLEVBQUUsQ0FBQztTQUNo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O1FBRS9ELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxxQ0FBb0IsR0FBNUI7UUFDRSxhQUFhLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLCtCQUFjLEdBQXRCLFVBQXVCLFFBQXVCO1FBQzVDLGtFQUFrRTtRQUNsRSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUxRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQzNCLEtBQUssSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtnQkFDNUIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDOUIsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3RGO2FBQ0Y7U0FDRjtRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO0lBQy9CLENBQUM7SUFDSCxhQUFDO0FBQUQsQ0FoUUEsQUFnUUMsQ0FoUTJCLFlBQVksR0FnUXZDIiwiZmlsZSI6ImxpYi9hcGkvdXBsb2FkL3VwbG9hZC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgYnkgRmlsZXN0YWNrLlxuICogU29tZSByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuaW1wb3J0IHsgU2Vzc2lvbiwgU2VjdXJpdHkgfSBmcm9tICcuLi8uLi9jbGllbnQnO1xuaW1wb3J0IHsgUzNVcGxvYWRlciB9IGZyb20gJy4vdXBsb2FkZXJzL3MzJztcbmltcG9ydCB7IEZpbGVzdGFja0Vycm9yLCBGaWxlc3RhY2tFcnJvclR5cGUgfSBmcm9tICcuLy4uLy4uLy4uL2ZpbGVzdGFja19lcnJvcic7XG5pbXBvcnQgeyBTYW5pdGl6ZU9wdGlvbnMgfSBmcm9tICcuLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IHsgVXBsb2FkT3B0aW9ucywgU3RvcmVVcGxvYWRPcHRpb25zIH0gZnJvbSAnLi4vdXBsb2FkL3R5cGVzJztcbmltcG9ydCB7IGdldEZpbGUsIElucHV0RmlsZSB9IGZyb20gJy4vZmlsZV90b29scyc7XG5pbXBvcnQgeyBGaWxlU3RhdGUsIFVwbG9hZFRhZ3MgfSBmcm9tICcuL2ZpbGUnO1xuaW1wb3J0IHsgVXBsb2FkTW9kZSB9IGZyb20gJy4vdXBsb2FkZXJzL2Fic3RyYWN0JztcbmltcG9ydCB7IGdldFZhbGlkYXRvciwgVXBsb2FkUGFyYW1zU2NoZW1hLCBTdG9yZVBhcmFtc1NjaGVtYSB9IGZyb20gJy4vLi4vLi4vLi4vc2NoZW1hJztcblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc0V2ZW50IHtcbiAgdG90YWxQZXJjZW50OiBudW1iZXI7XG4gIHRvdGFsQnl0ZXM6IG51bWJlcjtcbiAgZmlsZXM/OiB7IChrZXk6IHN0cmluZyk6IFByb2dyZXNzRXZlbnQgfTtcbn1cblxuY29uc3QgREVGQVVMVF9QUk9HUkVTU19JTlRFUlZBTCA9IDEwMDA7XG5cbmNvbnN0IG5vcm1hbGl6ZVByb2dyZXNzID0gKGN1cnJlbnQsIGxhc3QpID0+IHtcbiAgY3VycmVudC50b3RhbEJ5dGVzID0gTWF0aC5tYXgoY3VycmVudC50b3RhbEJ5dGVzLCBsYXN0LnRvdGFsQnl0ZXMpO1xuICBjdXJyZW50LnRvdGFsUGVyY2VudCA9IE1hdGgubWF4KGN1cnJlbnQudG90YWxQZXJjZW50LCBsYXN0LnRvdGFsUGVyY2VudCk7XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59O1xuXG4vKipcbiAqIFVwbG9hZGVyIG1haW4gY2xhc3MgZm9yIG5vdyBpdHMgc3VwcG9ydGluZyBvbmx5IHMzIHVwbG9hZCB0eXBlXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFVwbG9hZFxuICovXG5leHBvcnQgY2xhc3MgVXBsb2FkIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcblxuICAvKipcbiAgICogVXBsb2FkZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1MzVXBsb2FkZXJ9XG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIHByaXZhdGUgdXBsb2FkZXI6IFMzVXBsb2FkZXI7XG5cbiAgLyoqXG4gICAqIFNob3VsZCB3ZSBvdmVyd3JpdGUgZmlsZSBuYW1lXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIHByaXZhdGUgb3ZlcnJpZGVGaWxlTmFtZTtcblxuICBwcml2YXRlIGxhc3RQcm9ncmVzczogUHJvZ3Jlc3NFdmVudCA9IHtcbiAgICB0b3RhbEJ5dGVzOiAwLFxuICAgIHRvdGFsUGVyY2VudDogMCxcbiAgfTtcblxuICBwcml2YXRlIHByb2dyZXNzSW50ZXJ2YWxIYW5kbGVyO1xuICBwcml2YXRlIHNhbml0aXplck9wdGlvbnM6IFNhbml0aXplT3B0aW9ucztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFVwbG9hZE9wdGlvbnMgPSB7fSwgcHJpdmF0ZSBzdG9yZU9wdGlvbnM6IFN0b3JlVXBsb2FkT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIGRvIG5vdCBkZWxldGUgZmlsZW5hbWUgZnJvbSBvcmlnaW5hbCBvcHRpb25zIHJlZmVyZW5jZSAtIGNvcHkgaXQgZmlyc3RcbiAgICB0aGlzLnN0b3JlT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHN0b3JlT3B0aW9ucyk7XG5cbiAgICBjb25zdCB2YWxpZGF0ZVJlcyA9IGdldFZhbGlkYXRvcihVcGxvYWRQYXJhbXNTY2hlbWEpKG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbGlkYXRlUmVzLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlc3RhY2tFcnJvcihgSW52YWxpZCB1cGxvYWQgcGFyYW1zYCwgdmFsaWRhdGVSZXMuZXJyb3JzLCBGaWxlc3RhY2tFcnJvclR5cGUuVkFMSURBVElPTik7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmVWYWxpZGF0ZVJlcyA9IGdldFZhbGlkYXRvcihTdG9yZVBhcmFtc1NjaGVtYSkoc3RvcmVPcHRpb25zKTtcbiAgICBpZiAoc3RvcmVWYWxpZGF0ZVJlcy5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRmlsZXN0YWNrRXJyb3IoYEludmFsaWQgc3RvcmUgdXBsb2FkIHBhcmFtc2AsIHN0b3JlVmFsaWRhdGVSZXMuZXJyb3JzLCBGaWxlc3RhY2tFcnJvclR5cGUuVkFMSURBVElPTik7XG4gICAgfVxuXG4gICAgaWYgKHN0b3JlT3B0aW9ucy5maWxlbmFtZSkge1xuICAgICAgdGhpcy5vdmVycmlkZUZpbGVOYW1lID0gc3RvcmVPcHRpb25zLmZpbGVuYW1lO1xuICAgICAgZGVsZXRlIHRoaXMuc3RvcmVPcHRpb25zLmZpbGVuYW1lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0b3JlT3B0aW9ucy5zYW5pdGl6ZXIpIHtcbiAgICAgIHRoaXMuc2FuaXRpemVyT3B0aW9ucyA9IHRoaXMuc3RvcmVPcHRpb25zLnNhbml0aXplcjtcbiAgICAgIGRlbGV0ZSB0aGlzLnN0b3JlT3B0aW9ucy5zYW5pdGl6ZXI7XG4gICAgfVxuXG4gICAgdGhpcy51cGxvYWRlciA9IG5ldyBTM1VwbG9hZGVyKHRoaXMuc3RvcmVPcHRpb25zLCBvcHRpb25zLmNvbmN1cnJlbmN5KTtcblxuICAgIHRoaXMudXBsb2FkZXIuc2V0UmV0cnlDb25maWcoe1xuICAgICAgcmV0cnk6IG9wdGlvbnMucmV0cnkgfHwgMTAsXG4gICAgICBvblJldHJ5OiBvcHRpb25zLm9uUmV0cnksIC8vIEB0b2RvIGJpbmQgZmlsZSB0byByZXRyeSBpbiBzMyB1cGxvYWRlclxuICAgICAgcmV0cnlGYWN0b3I6IG9wdGlvbnMucmV0cnlGYWN0b3IgfHwgMixcbiAgICAgIHJldHJ5TWF4VGltZTogb3B0aW9ucy5yZXRyeU1heFRpbWUgfHwgMTUwMDAsXG4gICAgfSk7XG5cbiAgICB0aGlzLnVwbG9hZGVyLnNldFRpbWVvdXQob3B0aW9ucy50aW1lb3V0IHx8IDEyMDAwMCk7XG5cbiAgICBpZiAob3B0aW9ucy5wYXJ0U2l6ZSkge1xuICAgICAgdGhpcy51cGxvYWRlci5zZXRQYXJ0U2l6ZShvcHRpb25zLnBhcnRTaXplKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pbnRlbGxpZ2VudENodW5rU2l6ZSkge1xuICAgICAgdGhpcy51cGxvYWRlci5zZXRJbnRlbGxpZ2VudENodW5rU2l6ZShvcHRpb25zLmludGVsbGlnZW50Q2h1bmtTaXplKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5kaXNhYmxlSW50ZWdyaXR5Q2hlY2spIHtcbiAgICAgIHRoaXMudXBsb2FkZXIuc2V0SW50ZWdyaXR5Q2hlY2soZmFsc2UpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmludGVsbGlnZW50KSB7XG4gICAgICB0aGlzLnVwbG9hZGVyLnNldFVwbG9hZE1vZGUob3B0aW9ucy5pbnRlbGxpZ2VudCA9PT0gJ2ZhbGxiYWNrJyA/IFVwbG9hZE1vZGUuRkFMTEJBQ0sgOiBVcGxvYWRNb2RlLklOVEVMTElHRU5UKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwbG9hZGVyLnNldFVwbG9hZFRhZ3Mob3B0aW9ucy50YWdzKTtcblxuICAgIHRoaXMudXBsb2FkZXIub24oJ3N0YXJ0JywgKCkgPT4gdGhpcy5lbWl0KCdzdGFydCcpKTtcbiAgICB0aGlzLnVwbG9hZGVyLm9uKCdlcnJvcicsIChlKSA9PiB0aGlzLmVtaXQoJ2Vycm9yJywgZSkpO1xuICAgIHRoaXMudXBsb2FkZXIub24oJ3Byb2dyZXNzJywgdGhpcy5oYW5kbGVQcm9ncmVzcy5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc2Vzc2lvbiBvYmplY3QgdG8gdXBsb2FkZXJcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQHBhcmFtIHtTZXNzaW9ufSBzZXNzaW9uXG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIHNldFNlc3Npb24oc2Vzc2lvbjogU2Vzc2lvbikge1xuICAgIHRoaXMudXBsb2FkZXIuc2V0QXBpa2V5KHNlc3Npb24uYXBpa2V5KTtcblxuICAgIGlmIChzZXNzaW9uLnBvbGljeSAmJiBzZXNzaW9uLnNpZ25hdHVyZSkge1xuICAgICAgdGhpcy51cGxvYWRlci5zZXRTZWN1cml0eSh7XG4gICAgICAgIHBvbGljeTogc2Vzc2lvbi5wb2xpY3ksXG4gICAgICAgIHNpZ25hdHVyZTogc2Vzc2lvbi5zaWduYXR1cmUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnVwbG9hZGVyLnNldFVybChzZXNzaW9uLnVybHMudXBsb2FkQXBpVXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY2FuY2VsIHRva2VuIHRvIGNvbnRyb2xsIHVwbG9hZCBmbG93XG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdG9rZW5cbiAgICogQHJldHVybnNcbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHVibGljIHNldFRva2VuKHRva2VuOiBhbnkpIHtcbiAgICBpZiAoIXRva2VuIHx8IHRva2VuICE9PSBPYmplY3QodG9rZW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCB1cGxvYWQgdG9rZW4uIE11c3QgYmUgaW5zdGFuY2Ugb2Ygb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgdG9rZW4ucGF1c2UgPSAoKSA9PiB0aGlzLnVwbG9hZGVyLnBhdXNlKCk7XG4gICAgdG9rZW4ucmVzdW1lID0gKCkgPT4gdGhpcy51cGxvYWRlci5yZXN1bWUoKTtcbiAgICB0b2tlbi5jYW5jZWwgPSAoKSA9PiB0aGlzLnVwbG9hZGVyLmFib3J0KCk7XG5cbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBzZWN1cml0eSB0byB1cGxvYWRlciBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1NlY3VyaXR5fSBzZWN1cml0eVxuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBwdWJsaWMgc2V0U2VjdXJpdHkoc2VjdXJpdHk6IFNlY3VyaXR5KSB7XG4gICAgdGhpcy51cGxvYWRlci5zZXRTZWN1cml0eShzZWN1cml0eSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwbG9hZCB0YWdzXG4gICAqXG4gICAqIEBwYXJhbSB7VGFnc30gdGFnc1xuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBwdWJsaWMgc2V0VXBsb2FkVGFncyh0YWdzOiBVcGxvYWRUYWdzKSB7XG4gICAgdGhpcy51cGxvYWRlci5zZXRVcGxvYWRUYWdzKHRhZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZCBzaW5nbGUgZmlsZVxuICAgKlxuICAgKiBAcGFyYW0geyhJbnB1dEZpbGUpfSBmaWxlXG4gICAqIEBwYXJhbSB7KHN0cmluZyl9IGFsdFRleHRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgYXN5bmMgdXBsb2FkKGlucHV0OiBJbnB1dEZpbGUsIGFsdFRleHQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuXG4gICAgY29uc3QgZiA9IGF3YWl0IGdldEZpbGUoaW5wdXQsIHRoaXMuc2FuaXRpemVyT3B0aW9ucyk7XG4gICAgZi5jdXN0b21OYW1lID0gdGhpcy5vdmVycmlkZUZpbGVOYW1lO1xuICAgIGlmIChhbHRUZXh0KSB7XG4gICAgICBmLmFsdCA9IGFsdFRleHQ7XG4gICAgfVxuXG4gICAgdGhpcy51cGxvYWRlci5hZGRGaWxlKGYpO1xuXG4gICAgdGhpcy5zdGFydFByb2dyZXNzSW50ZXJ2YWwoKTtcbiAgICBjb25zdCByZXMgPSAoYXdhaXQgdGhpcy51cGxvYWRlci5leGVjdXRlKCkpLnNoaWZ0KCk7XG4gICAgdGhpcy5zdG9wUHJvZ3Jlc3NJbnRlcnZhbCgpO1xuXG4gICAgdGhpcy51cGxvYWRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcblxuICAgIGlmIChyZXMuc3RhdHVzID09PSBGaWxlU3RhdGUuRkFJTEVEKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkIG11bHRpcGxlIGZpbGVzIGF0IG9uY2VcbiAgICpcbiAgICogQHBhcmFtIHsoSW5wdXRGaWxlW10pfSBpbnB1dFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBhc3luYyBtdWx0aXVwbG9hZChpbnB1dDogSW5wdXRGaWxlW10pOiBQcm9taXNlPGFueT4ge1xuICAgIGZvciAobGV0IGkgaW4gaW5wdXQpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAoIWlucHV0Lmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmID0gYXdhaXQgZ2V0RmlsZShpbnB1dFtpXSwgdGhpcy5zYW5pdGl6ZXJPcHRpb25zKTtcbiAgICAgIGYuY3VzdG9tTmFtZSA9IHRoaXMub3ZlcnJpZGVGaWxlTmFtZTtcbiAgICAgIHRoaXMudXBsb2FkZXIuYWRkRmlsZShmKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXJ0UHJvZ3Jlc3NJbnRlcnZhbCgpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMudXBsb2FkZXIuZXhlY3V0ZSgpO1xuICAgIHRoaXMuc3RvcFByb2dyZXNzSW50ZXJ2YWwoKTtcblxuICAgIHRoaXMudXBsb2FkZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogUlVuIHByb2dyZXNzIHdpdGggdXNlcmRlZmluZWQgaW50ZXJ2YWxcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnNcbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBzdGFydFByb2dyZXNzSW50ZXJ2YWwoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMub25Qcm9ncmVzcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJvZ3Jlc3NJbnRlcnZhbEhhbmRsZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLm9wdGlvbnMub25Qcm9ncmVzcyh0aGlzLmxhc3RQcm9ncmVzcyk7XG4gICAgfSwgdGhpcy5vcHRpb25zLnByb2dyZXNzSW50ZXJ2YWwgfHwgREVGQVVMVF9QUk9HUkVTU19JTlRFUlZBTCk7XG5cbiAgICB0aGlzLm9wdGlvbnMub25Qcm9ncmVzcyh0aGlzLmxhc3RQcm9ncmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBwcm9ncmVzcyBpbnRlcnZhbCBhZnRlciB1cGxvYWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBzdG9wUHJvZ3Jlc3NJbnRlcnZhbCgpIHtcbiAgICBjbGVhckludGVydmFsKHRoaXMucHJvZ3Jlc3NJbnRlcnZhbEhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB1cGxvYWQgaW50ZXJ2YWwgYW5kIG5vcm1hbGl6ZSB2YWx1ZXNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtQcm9ncmVzc0V2ZW50fSBwcm9ncmVzc1xuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVByb2dyZXNzKHByb2dyZXNzOiBQcm9ncmVzc0V2ZW50KSB7XG4gICAgLy8gZ2V0IG1heCBwcm9ncmVzcyBkYXRhIHRvIGF2b2lkIHByb2dyZXNzIGp1bXBzIG9uIGFueSBwYXJ0IGVycm9yXG4gICAgcHJvZ3Jlc3MgPSBub3JtYWxpemVQcm9ncmVzcyhwcm9ncmVzcywgdGhpcy5sYXN0UHJvZ3Jlc3MpO1xuXG4gICAgaWYgKHRoaXMubGFzdFByb2dyZXNzLmZpbGVzKSB7XG4gICAgICBmb3IgKGxldCBpIGluIHByb2dyZXNzLmZpbGVzKSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RQcm9ncmVzcy5maWxlc1tpXSkge1xuICAgICAgICAgIHByb2dyZXNzLmZpbGVzW2ldID0gbm9ybWFsaXplUHJvZ3Jlc3MocHJvZ3Jlc3MuZmlsZXNbaV0sIHRoaXMubGFzdFByb2dyZXNzLmZpbGVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGFzdFByb2dyZXNzID0gcHJvZ3Jlc3M7XG4gIH1cbn1cbiJdfQ==