UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

290 lines (288 loc) 31.5 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; } if (storeOptions.altText) { _this.altText = storeOptions.altText; delete _this.storeOptions.altText; } if (storeOptions.mimetype) { _this.mimetype = storeOptions.mimetype; delete _this.storeOptions.mimetype; } _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 * @returns {Promise<any>} * @memberof Upload */ Upload.prototype.upload = function (input) { 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, this.mimetype)]; case 1: f = _a.sent(); f.customName = this.overrideFileName; if (this.altText) { f.alt = this.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, this.mimetype)]; case 2: f = _d.sent(); f.customName = this.overrideFileName; if (this.altText) { f.alt = this.altText; } 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3VwbG9hZC91cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7OztBQUVILCtDQUE2QztBQUU3QyxxQ0FBNEM7QUFDNUMsOERBQWdGO0FBSWhGLDJDQUFrRDtBQUdsRCw0Q0FBd0Y7QUFReEYsSUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUM7QUFFdkMsSUFBTSxpQkFBaUIsR0FBRyxVQUFDLE9BQU8sRUFBRSxJQUFJO0lBQ3RDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRSxPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFekUsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSDtJQUE0QixrQ0FBWTtJQTJDdEMsZ0JBQTZCLE9BQTJCLEVBQVUsWUFBcUM7UUFBMUUsd0JBQUEsRUFBQSxZQUEyQjtRQUFVLDZCQUFBLEVBQUEsaUJBQXFDO1FBQXZHLFlBQ0UsaUJBQU8sU0FvRVI7UUFyRTRCLGFBQU8sR0FBUCxPQUFPLENBQW9CO1FBQVUsa0JBQVksR0FBWixZQUFZLENBQXlCO1FBUi9GLGtCQUFZLEdBQWtCO1lBQ3BDLFVBQVUsRUFBRSxDQUFDO1lBQ2IsWUFBWSxFQUFFLENBQUM7U0FDaEIsQ0FBQztRQVFBLHlFQUF5RTtRQUN6RSxLQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXBELElBQU0sV0FBVyxHQUFHLElBQUEscUJBQVksRUFBQywyQkFBa0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlELElBQUksV0FBVyxDQUFD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L1JZLHdCQUFNIiwiZmlsZSI6ImxpYi9hcGkvdXBsb2FkL3VwbG9hZC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgYnkgRmlsZXN0YWNrLlxuICogU29tZSByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuaW1wb3J0IHsgU2Vzc2lvbiwgU2VjdXJpdHkgfSBmcm9tICcuLi8uLi9jbGllbnQnO1xuaW1wb3J0IHsgUzNVcGxvYWRlciB9IGZyb20gJy4vdXBsb2FkZXJzL3MzJztcbmltcG9ydCB7IEZpbGVzdGFja0Vycm9yLCBGaWxlc3RhY2tFcnJvclR5cGUgfSBmcm9tICcuLy4uLy4uLy4uL2ZpbGVzdGFja19lcnJvcic7XG5pbXBvcnQgeyBTYW5pdGl6ZU9wdGlvbnMgfSBmcm9tICcuLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IHsgVXBsb2FkT3B0aW9ucywgU3RvcmVVcGxvYWRPcHRpb25zIH0gZnJvbSAnLi4vdXBsb2FkL3R5cGVzJztcbmltcG9ydCB7IGdldEZpbGUsIElucHV0RmlsZSB9IGZyb20gJy4vZmlsZV90b29scyc7XG5pbXBvcnQgeyBGaWxlU3RhdGUsIFVwbG9hZFRhZ3MgfSBmcm9tICcuL2ZpbGUnO1xuaW1wb3J0IHsgVXBsb2FkTW9kZSB9IGZyb20gJy4vdXBsb2FkZXJzL2Fic3RyYWN0JztcbmltcG9ydCB7IGdldFZhbGlkYXRvciwgVXBsb2FkUGFyYW1zU2NoZW1hLCBTdG9yZVBhcmFtc1NjaGVtYSB9IGZyb20gJy4vLi4vLi4vLi4vc2NoZW1hJztcblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc0V2ZW50IHtcbiAgdG90YWxQZXJjZW50OiBudW1iZXI7XG4gIHRvdGFsQnl0ZXM6IG51bWJlcjtcbiAgZmlsZXM/OiB7IChrZXk6IHN0cmluZyk6IFByb2dyZXNzRXZlbnQgfTtcbn1cblxuY29uc3QgREVGQVVMVF9QUk9HUkVTU19JTlRFUlZBTCA9IDEwMDA7XG5cbmNvbnN0IG5vcm1hbGl6ZVByb2dyZXNzID0gKGN1cnJlbnQsIGxhc3QpID0+IHtcbiAgY3VycmVudC50b3RhbEJ5dGVzID0gTWF0aC5tYXgoY3VycmVudC50b3RhbEJ5dGVzLCBsYXN0LnRvdGFsQnl0ZXMpO1xuICBjdXJyZW50LnRvdGFsUGVyY2VudCA9IE1hdGgubWF4KGN1cnJlbnQudG90YWxQZXJjZW50LCBsYXN0LnRvdGFsUGVyY2VudCk7XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59O1xuXG4vKipcbiAqIFVwbG9hZGVyIG1haW4gY2xhc3MgZm9yIG5vdyBpdHMgc3VwcG9ydGluZyBvbmx5IHMzIHVwbG9hZCB0eXBlXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFVwbG9hZFxuICovXG5leHBvcnQgY2xhc3MgVXBsb2FkIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcblxuICAvKipcbiAgICogVXBsb2FkZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1MzVXBsb2FkZXJ9XG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIHByaXZhdGUgdXBsb2FkZXI6IFMzVXBsb2FkZXI7XG5cbiAgLyoqXG4gICAqIFNob3VsZCB3ZSBvdmVyd3JpdGUgZmlsZSBuYW1lXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIHByaXZhdGUgb3ZlcnJpZGVGaWxlTmFtZTtcblxuICAvKipcbiAgICogTWltZXR5cGUgb2YgdGhlIGZpbGVcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBtaW1ldHlwZTtcblxuICAvKipcbiAgICogQWx0IFRleHQgb2YgdGhlIGZpbGVcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBhbHRUZXh0O1xuXG4gIHByaXZhdGUgbGFzdFByb2dyZXNzOiBQcm9ncmVzc0V2ZW50ID0ge1xuICAgIHRvdGFsQnl0ZXM6IDAsXG4gICAgdG90YWxQZXJjZW50OiAwLFxuICB9O1xuXG4gIHByaXZhdGUgcHJvZ3Jlc3NJbnRlcnZhbEhhbmRsZXI7XG4gIHByaXZhdGUgc2FuaXRpemVyT3B0aW9uczogU2FuaXRpemVPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogVXBsb2FkT3B0aW9ucyA9IHt9LCBwcml2YXRlIHN0b3JlT3B0aW9uczogU3RvcmVVcGxvYWRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gZG8gbm90IGRlbGV0ZSBmaWxlbmFtZSBmcm9tIG9yaWdpbmFsIG9wdGlvbnMgcmVmZXJlbmNlIC0gY29weSBpdCBmaXJzdFxuICAgIHRoaXMuc3RvcmVPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgc3RvcmVPcHRpb25zKTtcblxuICAgIGNvbnN0IHZhbGlkYXRlUmVzID0gZ2V0VmFsaWRhdG9yKFVwbG9hZFBhcmFtc1NjaGVtYSkob3B0aW9ucyk7XG5cbiAgICBpZiAodmFsaWRhdGVSZXMuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEZpbGVzdGFja0Vycm9yKGBJbnZhbGlkIHVwbG9hZCBwYXJhbXNgLCB2YWxpZGF0ZVJlcy5lcnJvcnMsIEZpbGVzdGFja0Vycm9yVHlwZS5WQUxJREFUSU9OKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZVZhbGlkYXRlUmVzID0gZ2V0VmFsaWRhdG9yKFN0b3JlUGFyYW1zU2NoZW1hKShzdG9yZU9wdGlvbnMpO1xuICAgIGlmIChzdG9yZVZhbGlkYXRlUmVzLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlc3RhY2tFcnJvcihgSW52YWxpZCBzdG9yZSB1cGxvYWQgcGFyYW1zYCwgc3RvcmVWYWxpZGF0ZVJlcy5lcnJvcnMsIEZpbGVzdGFja0Vycm9yVHlwZS5WQUxJREFUSU9OKTtcbiAgICB9XG5cbiAgICBpZiAoc3RvcmVPcHRpb25zLmZpbGVuYW1lKSB7XG4gICAgICB0aGlzLm92ZXJyaWRlRmlsZU5hbWUgPSBzdG9yZU9wdGlvbnMuZmlsZW5hbWU7XG4gICAgICBkZWxldGUgdGhpcy5zdG9yZU9wdGlvbnMuZmlsZW5hbWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RvcmVPcHRpb25zLnNhbml0aXplcikge1xuICAgICAgdGhpcy5zYW5pdGl6ZXJPcHRpb25zID0gdGhpcy5zdG9yZU9wdGlvbnMuc2FuaXRpemVyO1xuICAgICAgZGVsZXRlIHRoaXMuc3RvcmVPcHRpb25zLnNhbml0aXplcjtcbiAgICB9XG5cbiAgICBpZiAoc3RvcmVPcHRpb25zLmFsdFRleHQpIHtcbiAgICAgIHRoaXMuYWx0VGV4dCA9IHN0b3JlT3B0aW9ucy5hbHRUZXh0O1xuICAgICAgZGVsZXRlIHRoaXMuc3RvcmVPcHRpb25zLmFsdFRleHQ7XG4gICAgfVxuXG4gICAgaWYgKHN0b3JlT3B0aW9ucy5taW1ldHlwZSkge1xuICAgICAgdGhpcy5taW1ldHlwZSA9IHN0b3JlT3B0aW9ucy5taW1ldHlwZTtcbiAgICAgIGRlbGV0ZSB0aGlzLnN0b3JlT3B0aW9ucy5taW1ldHlwZTtcbiAgICB9XG5cbiAgICB0aGlzLnVwbG9hZGVyID0gbmV3IFMzVXBsb2FkZXIodGhpcy5zdG9yZU9wdGlvbnMsIG9wdGlvbnMuY29uY3VycmVuY3kpO1xuXG4gICAgdGhpcy51cGxvYWRlci5zZXRSZXRyeUNvbmZpZyh7XG4gICAgICByZXRyeTogb3B0aW9ucy5yZXRyeSB8fCAxMCxcbiAgICAgIG9uUmV0cnk6IG9wdGlvbnMub25SZXRyeSwgLy8gQHRvZG8gYmluZCBmaWxlIHRvIHJldHJ5IGluIHMzIHVwbG9hZGVyXG4gICAgICByZXRyeUZhY3Rvcjogb3B0aW9ucy5yZXRyeUZhY3RvciB8fCAyLFxuICAgICAgcmV0cnlNYXhUaW1lOiBvcHRpb25zLnJldHJ5TWF4VGltZSB8fCAxNTAwMCxcbiAgICB9KTtcblxuICAgIHRoaXMudXBsb2FkZXIuc2V0VGltZW91dChvcHRpb25zLnRpbWVvdXQgfHwgMTIwMDAwKTtcblxuICAgIGlmIChvcHRpb25zLnBhcnRTaXplKSB7XG4gICAgICB0aGlzLnVwbG9hZGVyLnNldFBhcnRTaXplKG9wdGlvbnMucGFydFNpemUpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmludGVsbGlnZW50Q2h1bmtTaXplKSB7XG4gICAgICB0aGlzLnVwbG9hZGVyLnNldEludGVsbGlnZW50Q2h1bmtTaXplKG9wdGlvbnMuaW50ZWxsaWdlbnRDaHVua1NpemUpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmRpc2FibGVJbnRlZ3JpdHlDaGVjaykge1xuICAgICAgdGhpcy51cGxvYWRlci5zZXRJbnRlZ3JpdHlDaGVjayhmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaW50ZWxsaWdlbnQpIHtcbiAgICAgIHRoaXMudXBsb2FkZXIuc2V0VXBsb2FkTW9kZShvcHRpb25zLmludGVsbGlnZW50ID09PSAnZmFsbGJhY2snID8gVXBsb2FkTW9kZS5GQUxMQkFDSyA6IFVwbG9hZE1vZGUuSU5URUxMSUdFTlQpO1xuICAgIH1cblxuICAgIHRoaXMudXBsb2FkZXIuc2V0VXBsb2FkVGFncyhvcHRpb25zLnRhZ3MpO1xuXG4gICAgdGhpcy51cGxvYWRlci5vbignc3RhcnQnLCAoKSA9PiB0aGlzLmVtaXQoJ3N0YXJ0JykpO1xuICAgIHRoaXMudXBsb2FkZXIub24oJ2Vycm9yJywgKGUpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlKSk7XG4gICAgdGhpcy51cGxvYWRlci5vbigncHJvZ3Jlc3MnLCB0aGlzLmhhbmRsZVByb2dyZXNzLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzZXNzaW9uIG9iamVjdCB0byB1cGxvYWRlclxuICAgKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKiBAcGFyYW0ge1Nlc3Npb259IHNlc3Npb25cbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgc2V0U2Vzc2lvbihzZXNzaW9uOiBTZXNzaW9uKSB7XG4gICAgdGhpcy51cGxvYWRlci5zZXRBcGlrZXkoc2Vzc2lvbi5hcGlrZXkpO1xuXG4gICAgaWYgKHNlc3Npb24ucG9saWN5ICYmIHNlc3Npb24uc2lnbmF0dXJlKSB7XG4gICAgICB0aGlzLnVwbG9hZGVyLnNldFNlY3VyaXR5KHtcbiAgICAgICAgcG9saWN5OiBzZXNzaW9uLnBvbGljeSxcbiAgICAgICAgc2lnbmF0dXJlOiBzZXNzaW9uLnNpZ25hdHVyZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudXBsb2FkZXIuc2V0VXJsKHNlc3Npb24udXJscy51cGxvYWRBcGlVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjYW5jZWwgdG9rZW4gdG8gY29udHJvbGwgdXBsb2FkIGZsb3dcbiAgICpcbiAgICogQHBhcmFtIHsqfSB0b2tlblxuICAgKiBAcmV0dXJuc1xuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBwdWJsaWMgc2V0VG9rZW4odG9rZW46IGFueSkge1xuICAgIGlmICghdG9rZW4gfHwgdG9rZW4gIT09IE9iamVjdCh0b2tlbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0IHVwbG9hZCB0b2tlbi4gTXVzdCBiZSBpbnN0YW5jZSBvZiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICB0b2tlbi5wYXVzZSA9ICgpID0+IHRoaXMudXBsb2FkZXIucGF1c2UoKTtcbiAgICB0b2tlbi5yZXN1bWUgPSAoKSA9PiB0aGlzLnVwbG9hZGVyLnJlc3VtZSgpO1xuICAgIHRva2VuLmNhbmNlbCA9ICgpID0+IHRoaXMudXBsb2FkZXIuYWJvcnQoKTtcblxuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHNlY3VyaXR5IHRvIHVwbG9hZGVyIGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7U2VjdXJpdHl9IHNlY3VyaXR5XG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIHB1YmxpYyBzZXRTZWN1cml0eShzZWN1cml0eTogU2VjdXJpdHkpIHtcbiAgICB0aGlzLnVwbG9hZGVyLnNldFNlY3VyaXR5KHNlY3VyaXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdXBsb2FkIHRhZ3NcbiAgICpcbiAgICogQHBhcmFtIHtUYWdzfSB0YWdzXG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIHB1YmxpYyBzZXRVcGxvYWRUYWdzKHRhZ3M6IFVwbG9hZFRhZ3MpIHtcbiAgICB0aGlzLnVwbG9hZGVyLnNldFVwbG9hZFRhZ3ModGFncyk7XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkIHNpbmdsZSBmaWxlXG4gICAqXG4gICAqIEBwYXJhbSB7KElucHV0RmlsZSl9IGZpbGVcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgYXN5bmMgdXBsb2FkKGlucHV0OiBJbnB1dEZpbGUpOiBQcm9taXNlPGFueT4ge1xuXG4gICAgY29uc3QgZiA9IGF3YWl0IGdldEZpbGUoaW5wdXQsIHRoaXMuc2FuaXRpemVyT3B0aW9ucywgdGhpcy5taW1ldHlwZSk7XG4gICAgZi5jdXN0b21OYW1lID0gdGhpcy5vdmVycmlkZUZpbGVOYW1lO1xuXG4gICAgaWYgKHRoaXMuYWx0VGV4dCkge1xuICAgICAgZi5hbHQgPSB0aGlzLmFsdFRleHRcbiAgICB9XG5cbiAgICB0aGlzLnVwbG9hZGVyLmFkZEZpbGUoZik7XG5cbiAgICB0aGlzLnN0YXJ0UHJvZ3Jlc3NJbnRlcnZhbCgpO1xuICAgIGNvbnN0IHJlcyA9IChhd2FpdCB0aGlzLnVwbG9hZGVyLmV4ZWN1dGUoKSkuc2hpZnQoKTtcbiAgICB0aGlzLnN0b3BQcm9ncmVzc0ludGVydmFsKCk7XG5cbiAgICB0aGlzLnVwbG9hZGVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuXG4gICAgaWYgKHJlcy5zdGF0dXMgPT09IEZpbGVTdGF0ZS5GQUlMRUQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXMpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgbXVsdGlwbGUgZmlsZXMgYXQgb25jZVxuICAgKlxuICAgKiBAcGFyYW0geyhJbnB1dEZpbGVbXSl9IGlucHV0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIGFzeW5jIG11bHRpdXBsb2FkKGlucHV0OiBJbnB1dEZpbGVbXSk6IFByb21pc2U8YW55PiB7XG4gICAgZm9yIChsZXQgaSBpbiBpbnB1dCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmICghaW5wdXQuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGYgPSBhd2FpdCBnZXRGaWxlKGlucHV0W2ldLCB0aGlzLnNhbml0aXplck9wdGlvbnMsIHRoaXMubWltZXR5cGUpO1xuICAgICAgZi5jdXN0b21OYW1lID0gdGhpcy5vdmVycmlkZUZpbGVOYW1lO1xuXG4gICAgICBpZiAodGhpcy5hbHRUZXh0KSB7XG4gICAgICAgIGYuYWx0ID0gdGhpcy5hbHRUZXh0XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBsb2FkZXIuYWRkRmlsZShmKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXJ0UHJvZ3Jlc3NJbnRlcnZhbCgpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMudXBsb2FkZXIuZXhlY3V0ZSgpO1xuICAgIHRoaXMuc3RvcFByb2dyZXNzSW50ZXJ2YWwoKTtcblxuICAgIHRoaXMudXBsb2FkZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogUlVuIHByb2dyZXNzIHdpdGggdXNlcmRlZmluZWQgaW50ZXJ2YWxcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnNcbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBzdGFydFByb2dyZXNzSW50ZXJ2YWwoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMub25Qcm9ncmVzcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJvZ3Jlc3NJbnRlcnZhbEhhbmRsZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLm9wdGlvbnMub25Qcm9ncmVzcyh0aGlzLmxhc3RQcm9ncmVzcyk7XG4gICAgfSwgdGhpcy5vcHRpb25zLnByb2dyZXNzSW50ZXJ2YWwgfHwgREVGQVVMVF9QUk9HUkVTU19JTlRFUlZBTCk7XG5cbiAgICB0aGlzLm9wdGlvbnMub25Qcm9ncmVzcyh0aGlzLmxhc3RQcm9ncmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBwcm9ncmVzcyBpbnRlcnZhbCBhZnRlciB1cGxvYWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBzdG9wUHJvZ3Jlc3NJbnRlcnZhbCgpIHtcbiAgICBjbGVhckludGVydmFsKHRoaXMucHJvZ3Jlc3NJbnRlcnZhbEhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB1cGxvYWQgaW50ZXJ2YWwgYW5kIG5vcm1hbGl6ZSB2YWx1ZXNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtQcm9ncmVzc0V2ZW50fSBwcm9ncmVzc1xuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVByb2dyZXNzKHByb2dyZXNzOiBQcm9ncmVzc0V2ZW50KSB7XG4gICAgLy8gZ2V0IG1heCBwcm9ncmVzcyBkYXRhIHRvIGF2b2lkIHByb2dyZXNzIGp1bXBzIG9uIGFueSBwYXJ0IGVycm9yXG4gICAgcHJvZ3Jlc3MgPSBub3JtYWxpemVQcm9ncmVzcyhwcm9ncmVzcywgdGhpcy5sYXN0UHJvZ3Jlc3MpO1xuXG4gICAgaWYgKHRoaXMubGFzdFByb2dyZXNzLmZpbGVzKSB7XG4gICAgICBmb3IgKGxldCBpIGluIHByb2dyZXNzLmZpbGVzKSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RQcm9ncmVzcy5maWxlc1tpXSkge1xuICAgICAgICAgIHByb2dyZXNzLmZpbGVzW2ldID0gbm9ybWFsaXplUHJvZ3Jlc3MocHJvZ3Jlc3MuZmlsZXNbaV0sIHRoaXMubGFzdFByb2dyZXNzLmZpbGVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGFzdFByb2dyZXNzID0gcHJvZ3Jlc3M7XG4gIH1cbn1cbiJdfQ==