filestack-js
Version:
Official JavaScript library for Filestack
287 lines (285 loc) • 31.4 kB
JavaScript
/*
* 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;
}
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 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 __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, 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 __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, 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;
}(EventEmitter));
export { Upload };
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3VwbG9hZC91cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUloRixPQUFPLEVBQUUsT0FBTyxFQUFhLE1BQU0sY0FBYyxDQUFDO0FBR2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVF4RixJQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQztBQUV2QyxJQUFNLGlCQUFpQixHQUFHLFVBQUMsT0FBTyxFQUFFLElBQUk7SUFDdEMsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25FLE9BQU8sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUV6RSxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNIO0lBQTRCLDBCQUFZO0lBMkN0QyxnQkFBNkIsT0FBMkIsRUFBVSxZQUFxQztRQUExRSx3QkFBQSxFQUFBLFlBQTJCO1FBQVUsNkJBQUEsRUFBQSxpQkFBcUM7UUFBdkcsWUFDRSxpQkFBTyxTQW9FUjtRQXJFNEIsYUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFBVSxrQkFBWSxHQUFaLFlBQVksQ0FBeUI7UUFSL0Ysa0JBQVksR0FBa0I7WUFDcEMsVUFBVSxFQUFFLENBQUM7WUFDYixZQUFZLEVBQUUsQ0FBQztTQUNo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LFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdEY7YUFDRjtTQUNGO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7SUFDL0IsQ0FBQztJQUNILGFBQUM7QUFBRCxDQS9SQSxBQStSQyxDQS9SMkIsWUFBWSxHQStSdkMiLCJmaWxlIjoibGliL2FwaS91cGxvYWQvdXBsb2FkLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOSBieSBGaWxlc3RhY2suXG4gKiBTb21lIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRlbWl0dGVyMyc7XG5pbXBvcnQgeyBTZXNzaW9uLCBTZWN1cml0eSB9IGZyb20gJy4uLy4uL2NsaWVudCc7XG5pbXBvcnQgeyBTM1VwbG9hZGVyIH0gZnJvbSAnLi91cGxvYWRlcnMvczMnO1xuaW1wb3J0IHsgRmlsZXN0YWNrRXJyb3IsIEZpbGVzdGFja0Vycm9yVHlwZSB9IGZyb20gJy4vLi4vLi4vLi4vZmlsZXN0YWNrX2Vycm9yJztcbmltcG9ydCB7IFNhbml0aXplT3B0aW9ucyB9IGZyb20gJy4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgeyBVcGxvYWRPcHRpb25zLCBTdG9yZVVwbG9hZE9wdGlvbnMgfSBmcm9tICcuLi91cGxvYWQvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0RmlsZSwgSW5wdXRGaWxlIH0gZnJvbSAnLi9maWxlX3Rvb2xzJztcbmltcG9ydCB7IEZpbGVTdGF0ZSwgVXBsb2FkVGFncyB9IGZyb20gJy4vZmlsZSc7XG5pbXBvcnQgeyBVcGxvYWRNb2RlIH0gZnJvbSAnLi91cGxvYWRlcnMvYWJzdHJhY3QnO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdG9yLCBVcGxvYWRQYXJhbXNTY2hlbWEsIFN0b3JlUGFyYW1zU2NoZW1hIH0gZnJvbSAnLi8uLi8uLi8uLi9zY2hlbWEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzRXZlbnQge1xuICB0b3RhbFBlcmNlbnQ6IG51bWJlcjtcbiAgdG90YWxCeXRlczogbnVtYmVyO1xuICBmaWxlcz86IHsgKGtleTogc3RyaW5nKTogUHJvZ3Jlc3NFdmVudCB9O1xufVxuXG5jb25zdCBERUZBVUxUX1BST0dSRVNTX0lOVEVSVkFMID0gMTAwMDtcblxuY29uc3Qgbm9ybWFsaXplUHJvZ3Jlc3MgPSAoY3VycmVudCwgbGFzdCkgPT4ge1xuICBjdXJyZW50LnRvdGFsQnl0ZXMgPSBNYXRoLm1heChjdXJyZW50LnRvdGFsQnl0ZXMsIGxhc3QudG90YWxCeXRlcyk7XG4gIGN1cnJlbnQudG90YWxQZXJjZW50ID0gTWF0aC5tYXgoY3VycmVudC50b3RhbFBlcmNlbnQsIGxhc3QudG90YWxQZXJjZW50KTtcblxuICByZXR1cm4gY3VycmVudDtcbn07XG5cbi8qKlxuICogVXBsb2FkZXIgbWFpbiBjbGFzcyBmb3Igbm93IGl0cyBzdXBwb3J0aW5nIG9ubHkgczMgdXBsb2FkIHR5cGVcbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVXBsb2FkXG4gKi9cbmV4cG9ydCBjbGFzcyBVcGxvYWQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuXG4gIC8qKlxuICAgKiBVcGxvYWRlciBpbnN0YW5jZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UzNVcGxvYWRlcn1cbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSB1cGxvYWRlcjogUzNVcGxvYWRlcjtcblxuICAvKipcbiAgICogU2hvdWxkIHdlIG92ZXJ3cml0ZSBmaWxlIG5hbWVcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBvdmVycmlkZUZpbGVOYW1lO1xuXG4gIC8qKlxuICAgKiBNaW1ldHlwZSBvZiB0aGUgZmlsZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBwcml2YXRlIG1pbWV0eXBlO1xuXG4gIC8qKlxuICAgKiBBbHQgVGV4dCBvZiB0aGUgZmlsZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBwcml2YXRlIGFsdFRleHQ7XG5cbiAgcHJpdmF0ZSBsYXN0UHJvZ3Jlc3M6IFByb2dyZXNzRXZlbnQgPSB7XG4gICAgdG90YWxCeXRlczogMCxcbiAgICB0b3RhbFBlcmNlbnQ6IDAsXG4gIH07XG5cbiAgcHJpdmF0ZSBwcm9ncmVzc0ludGVydmFsSGFuZGxlcjtcbiAgcHJpdmF0ZSBzYW5pdGl6ZXJPcHRpb25zOiBTYW5pdGl6ZU9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBVcGxvYWRPcHRpb25zID0ge30sIHByaXZhdGUgc3RvcmVPcHRpb25zOiBTdG9yZVVwbG9hZE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBkbyBub3QgZGVsZXRlIGZpbGVuYW1lIGZyb20gb3JpZ2luYWwgb3B0aW9ucyByZWZlcmVuY2UgLSBjb3B5IGl0IGZpcnN0XG4gICAgdGhpcy5zdG9yZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBzdG9yZU9wdGlvbnMpO1xuXG4gICAgY29uc3QgdmFsaWRhdGVSZXMgPSBnZXRWYWxpZGF0b3IoVXBsb2FkUGFyYW1zU2NoZW1hKShvcHRpb25zKTtcblxuICAgIGlmICh2YWxpZGF0ZVJlcy5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRmlsZXN0YWNrRXJyb3IoYEludmFsaWQgdXBsb2FkIHBhcmFtc2AsIHZhbGlkYXRlUmVzLmVycm9ycywgRmlsZXN0YWNrRXJyb3JUeXBlLlZBTElEQVRJT04pO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlVmFsaWRhdGVSZXMgPSBnZXRWYWxpZGF0b3IoU3RvcmVQYXJhbXNTY2hlbWEpKHN0b3JlT3B0aW9ucyk7XG4gICAgaWYgKHN0b3JlVmFsaWRhdGVSZXMuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEZpbGVzdGFja0Vycm9yKGBJbnZhbGlkIHN0b3JlIHVwbG9hZCBwYXJhbXNgLCBzdG9yZVZhbGlkYXRlUmVzLmVycm9ycywgRmlsZXN0YWNrRXJyb3JUeXBlLlZBTElEQVRJT04pO1xuICAgIH1cblxuICAgIGlmIChzdG9yZU9wdGlvbnMuZmlsZW5hbWUpIHtcbiAgICAgIHRoaXMub3ZlcnJpZGVGaWxlTmFtZSA9IHN0b3JlT3B0aW9ucy5maWxlbmFtZTtcbiAgICAgIGRlbGV0ZSB0aGlzLnN0b3JlT3B0aW9ucy5maWxlbmFtZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdG9yZU9wdGlvbnMuc2FuaXRpemVyKSB7XG4gICAgICB0aGlzLnNhbml0aXplck9wdGlvbnMgPSB0aGlzLnN0b3JlT3B0aW9ucy5zYW5pdGl6ZXI7XG4gICAgICBkZWxldGUgdGhpcy5zdG9yZU9wdGlvbnMuc2FuaXRpemVyO1xuICAgIH1cblxuICAgIGlmIChzdG9yZU9wdGlvbnMuYWx0VGV4dCkge1xuICAgICAgdGhpcy5hbHRUZXh0ID0gc3RvcmVPcHRpb25zLmFsdFRleHQ7XG4gICAgICBkZWxldGUgdGhpcy5zdG9yZU9wdGlvbnMuYWx0VGV4dDtcbiAgICB9XG5cbiAgICBpZiAoc3RvcmVPcHRpb25zLm1pbWV0eXBlKSB7XG4gICAgICB0aGlzLm1pbWV0eXBlID0gc3RvcmVPcHRpb25zLm1pbWV0eXBlO1xuICAgICAgZGVsZXRlIHRoaXMuc3RvcmVPcHRpb25zLm1pbWV0eXBlO1xuICAgIH1cblxuICAgIHRoaXMudXBsb2FkZXIgPSBuZXcgUzNVcGxvYWRlcih0aGlzLnN0b3JlT3B0aW9ucywgb3B0aW9ucy5jb25jdXJyZW5jeSk7XG5cbiAgICB0aGlzLnVwbG9hZGVyLnNldFJldHJ5Q29uZmlnKHtcbiAgICAgIHJldHJ5OiBvcHRpb25zLnJldHJ5IHx8IDEwLFxuICAgICAgb25SZXRyeTogb3B0aW9ucy5vblJldHJ5LCAvLyBAdG9kbyBiaW5kIGZpbGUgdG8gcmV0cnkgaW4gczMgdXBsb2FkZXJcbiAgICAgIHJldHJ5RmFjdG9yOiBvcHRpb25zLnJldHJ5RmFjdG9yIHx8IDIsXG4gICAgICByZXRyeU1heFRpbWU6IG9wdGlvbnMucmV0cnlNYXhUaW1lIHx8IDE1MDAwLFxuICAgIH0pO1xuXG4gICAgdGhpcy51cGxvYWRlci5zZXRUaW1lb3V0KG9wdGlvbnMudGltZW91dCB8fCAxMjAwMDApO1xuXG4gICAgaWYgKG9wdGlvbnMucGFydFNpemUpIHtcbiAgICAgIHRoaXMudXBsb2FkZXIuc2V0UGFydFNpemUob3B0aW9ucy5wYXJ0U2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaW50ZWxsaWdlbnRDaHVua1NpemUpIHtcbiAgICAgIHRoaXMudXBsb2FkZXIuc2V0SW50ZWxsaWdlbnRDaHVua1NpemUob3B0aW9ucy5pbnRlbGxpZ2VudENodW5rU2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZGlzYWJsZUludGVncml0eUNoZWNrKSB7XG4gICAgICB0aGlzLnVwbG9hZGVyLnNldEludGVncml0eUNoZWNrKGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pbnRlbGxpZ2VudCkge1xuICAgICAgdGhpcy51cGxvYWRlci5zZXRVcGxvYWRNb2RlKG9wdGlvbnMuaW50ZWxsaWdlbnQgPT09ICdmYWxsYmFjaycgPyBVcGxvYWRNb2RlLkZBTExCQUNLIDogVXBsb2FkTW9kZS5JTlRFTExJR0VOVCk7XG4gICAgfVxuXG4gICAgdGhpcy51cGxvYWRlci5zZXRVcGxvYWRUYWdzKG9wdGlvbnMudGFncyk7XG5cbiAgICB0aGlzLnVwbG9hZGVyLm9uKCdzdGFydCcsICgpID0+IHRoaXMuZW1pdCgnc3RhcnQnKSk7XG4gICAgdGhpcy51cGxvYWRlci5vbignZXJyb3InLCAoZSkgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGUpKTtcbiAgICB0aGlzLnVwbG9hZGVyLm9uKCdwcm9ncmVzcycsIHRoaXMuaGFuZGxlUHJvZ3Jlc3MuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNlc3Npb24gb2JqZWN0IHRvIHVwbG9hZGVyXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIEBwYXJhbSB7U2Vzc2lvbn0gc2Vzc2lvblxuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBzZXRTZXNzaW9uKHNlc3Npb246IFNlc3Npb24pIHtcbiAgICB0aGlzLnVwbG9hZGVyLnNldEFwaWtleShzZXNzaW9uLmFwaWtleSk7XG5cbiAgICBpZiAoc2Vzc2lvbi5wb2xpY3kgJiYgc2Vzc2lvbi5zaWduYXR1cmUpIHtcbiAgICAgIHRoaXMudXBsb2FkZXIuc2V0U2VjdXJpdHkoe1xuICAgICAgICBwb2xpY3k6IHNlc3Npb24ucG9saWN5LFxuICAgICAgICBzaWduYXR1cmU6IHNlc3Npb24uc2lnbmF0dXJlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy51cGxvYWRlci5zZXRVcmwoc2Vzc2lvbi51cmxzLnVwbG9hZEFwaVVybCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGNhbmNlbCB0b2tlbiB0byBjb250cm9sbCB1cGxvYWQgZmxvd1xuICAgKlxuICAgKiBAcGFyYW0geyp9IHRva2VuXG4gICAqIEByZXR1cm5zXG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIHB1YmxpYyBzZXRUb2tlbih0b2tlbjogYW55KSB7XG4gICAgaWYgKCF0b2tlbiB8fCB0b2tlbiAhPT0gT2JqZWN0KHRva2VuKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgdXBsb2FkIHRva2VuLiBNdXN0IGJlIGluc3RhbmNlIG9mIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHRva2VuLnBhdXNlID0gKCkgPT4gdGhpcy51cGxvYWRlci5wYXVzZSgpO1xuICAgIHRva2VuLnJlc3VtZSA9ICgpID0+IHRoaXMudXBsb2FkZXIucmVzdW1lKCk7XG4gICAgdG9rZW4uY2FuY2VsID0gKCkgPT4gdGhpcy51cGxvYWRlci5hYm9ydCgpO1xuXG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgc2VjdXJpdHkgdG8gdXBsb2FkZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtTZWN1cml0eX0gc2VjdXJpdHlcbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHVibGljIHNldFNlY3VyaXR5KHNlY3VyaXR5OiBTZWN1cml0eSkge1xuICAgIHRoaXMudXBsb2FkZXIuc2V0U2VjdXJpdHkoc2VjdXJpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cGxvYWQgdGFnc1xuICAgKlxuICAgKiBAcGFyYW0ge1RhZ3N9IHRhZ3NcbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgcHVibGljIHNldFVwbG9hZFRhZ3ModGFnczogVXBsb2FkVGFncykge1xuICAgIHRoaXMudXBsb2FkZXIuc2V0VXBsb2FkVGFncyh0YWdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgc2luZ2xlIGZpbGVcbiAgICpcbiAgICogQHBhcmFtIHsoSW5wdXRGaWxlKX0gZmlsZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBhc3luYyB1cGxvYWQoaW5wdXQ6IElucHV0RmlsZSk6IFByb21pc2U8YW55PiB7XG5cbiAgICBjb25zdCBmID0gYXdhaXQgZ2V0RmlsZShpbnB1dCwgdGhpcy5zYW5pdGl6ZXJPcHRpb25zLCB0aGlzLm1pbWV0eXBlKTtcbiAgICBmLmN1c3RvbU5hbWUgPSB0aGlzLm92ZXJyaWRlRmlsZU5hbWU7XG5cbiAgICBpZiAodGhpcy5hbHRUZXh0KSB7XG4gICAgICBmLmFsdCA9IHRoaXMuYWx0VGV4dFxuICAgIH1cblxuICAgIHRoaXMudXBsb2FkZXIuYWRkRmlsZShmKTtcblxuICAgIHRoaXMuc3RhcnRQcm9ncmVzc0ludGVydmFsKCk7XG4gICAgY29uc3QgcmVzID0gKGF3YWl0IHRoaXMudXBsb2FkZXIuZXhlY3V0ZSgpKS5zaGlmdCgpO1xuICAgIHRoaXMuc3RvcFByb2dyZXNzSW50ZXJ2YWwoKTtcblxuICAgIHRoaXMudXBsb2FkZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gRmlsZVN0YXRlLkZBSUxFRCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZCBtdWx0aXBsZSBmaWxlcyBhdCBvbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7KElucHV0RmlsZVtdKX0gaW5wdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICogQG1lbWJlcm9mIFVwbG9hZFxuICAgKi9cbiAgYXN5bmMgbXVsdGl1cGxvYWQoaW5wdXQ6IElucHV0RmlsZVtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICBmb3IgKGxldCBpIGluIGlucHV0KSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKCFpbnB1dC5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZiA9IGF3YWl0IGdldEZpbGUoaW5wdXRbaV0sIHRoaXMuc2FuaXRpemVyT3B0aW9ucywgdGhpcy5taW1ldHlwZSk7XG4gICAgICBmLmN1c3RvbU5hbWUgPSB0aGlzLm92ZXJyaWRlRmlsZU5hbWU7XG5cbiAgICAgIGlmICh0aGlzLmFsdFRleHQpIHtcbiAgICAgICAgZi5hbHQgPSB0aGlzLmFsdFRleHRcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGxvYWRlci5hZGRGaWxlKGYpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRQcm9ncmVzc0ludGVydmFsKCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy51cGxvYWRlci5leGVjdXRlKCk7XG4gICAgdGhpcy5zdG9wUHJvZ3Jlc3NJbnRlcnZhbCgpO1xuXG4gICAgdGhpcy51cGxvYWRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSVW4gcHJvZ3Jlc3Mgd2l0aCB1c2VyZGVmaW5lZCBpbnRlcnZhbFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJuc1xuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBwcml2YXRlIHN0YXJ0UHJvZ3Jlc3NJbnRlcnZhbCgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5vblByb2dyZXNzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcm9ncmVzc0ludGVydmFsSGFuZGxlciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMub3B0aW9ucy5vblByb2dyZXNzKHRoaXMubGFzdFByb2dyZXNzKTtcbiAgICB9LCB0aGlzLm9wdGlvbnMucHJvZ3Jlc3NJbnRlcnZhbCB8fCBERUZBVUxUX1BST0dSRVNTX0lOVEVSVkFMKTtcblxuICAgIHRoaXMub3B0aW9ucy5vblByb2dyZXNzKHRoaXMubGFzdFByb2dyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHByb2dyZXNzIGludGVydmFsIGFmdGVyIHVwbG9hZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgVXBsb2FkXG4gICAqL1xuICBwcml2YXRlIHN0b3BQcm9ncmVzc0ludGVydmFsKCkge1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5wcm9ncmVzc0ludGVydmFsSGFuZGxlcik7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHVwbG9hZCBpbnRlcnZhbCBhbmQgbm9ybWFsaXplIHZhbHVlc1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge1Byb2dyZXNzRXZlbnR9IHByb2dyZXNzXG4gICAqIEBtZW1iZXJvZiBVcGxvYWRcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlUHJvZ3Jlc3MocHJvZ3Jlc3M6IFByb2dyZXNzRXZlbnQpIHtcbiAgICAvLyBnZXQgbWF4IHByb2dyZXNzIGRhdGEgdG8gYXZvaWQgcHJvZ3Jlc3MganVtcHMgb24gYW55IHBhcnQgZXJyb3JcbiAgICBwcm9ncmVzcyA9IG5vcm1hbGl6ZVByb2dyZXNzKHByb2dyZXNzLCB0aGlzLmxhc3RQcm9ncmVzcyk7XG5cbiAgICBpZiAodGhpcy5sYXN0UHJvZ3Jlc3MuZmlsZXMpIHtcbiAgICAgIGZvciAobGV0IGkgaW4gcHJvZ3Jlc3MuZmlsZXMpIHtcbiAgICAgICAgaWYgKHRoaXMubGFzdFByb2dyZXNzLmZpbGVzW2ldKSB7XG4gICAgICAgICAgcHJvZ3Jlc3MuZmlsZXNbaV0gPSBub3JtYWxpemVQcm9ncmVzcyhwcm9ncmVzcy5maWxlc1tpXSwgdGhpcy5sYXN0UHJvZ3Jlc3MuZmlsZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0UHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgfVxufVxuIl19