UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

173 lines (171 loc) 24.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.XhrAdapter = void 0; var tslib_1 = require("tslib"); /* * Copyright (c) 2018 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. */ var debug_1 = tslib_1.__importDefault(require("debug")); var utils = tslib_1.__importStar(require("../utils")); var types_1 = require("../types"); var error_1 = require("../error"); var helpers_1 = require("./../helpers"); var debug = (0, debug_1.default)('fs:request:xhr'); var CANCEL_CLEAR = "FsCleanMemory"; var XhrAdapter = /** @class */ (function () { function XhrAdapter() { } XhrAdapter.prototype.request = function (config) { var _this = this; // if this option is unspecified set it by default if (typeof config.filestackHeaders === 'undefined') { config.filestackHeaders = true; } config = (0, helpers_1.prepareData)(config); config.headers = config.headers || {}; var data = config.data, headers = config.headers; // if data is type of form let browser to set proper content type if (utils.isFormData(data)) { delete headers['Content-Type']; } var request = new XMLHttpRequest(); if (config.blobResponse) { request.responseType = 'blob'; } // HTTP basic authentication if (config.auth) { if (!config.auth.username || config.auth.username.length === 0 || !config.auth.password || config.auth.password.length === 0) { return Promise.reject(new error_1.FsRequestError("Basic auth: username and password are required ".concat(config.auth), config)); } headers.Authorization = 'Basic ' + btoa(unescape(encodeURIComponent("".concat(config.auth.username, ":").concat(config.auth.password)))); debug('Set request authorization to %s', config.auth.username + config.auth.password); } var url = config.url.trim(); if (!/^http(s)?:\/\//.test(url)) { url = "https://".concat(url); } url = (0, helpers_1.combineURL)(url, config.params); debug('Starting request to %s with options %O', url, config); request.open(config.method.toUpperCase(), url, true); request.timeout = config.timeout; return new Promise(function (resolve, reject) { var cancelListener; if (config.cancelToken) { cancelListener = function (reason) { /* istanbul ignore next: if request is done cancel token should not throw any error */ if (request) { request.abort(); request = null; } debug('Request canceled by user %s, config: %O', reason, config); return reject(new error_1.FsRequestError("Request aborted. Reason: ".concat(reason), config, null, error_1.FsRequestErrorCode.ABORTED)); }; config.cancelToken.once('cancel', cancelListener); } request.onreadystatechange = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var responseHeaders, responseData, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (!request || request.readyState !== 4) { return [2 /*return*/]; } if (request.status === 0 && !request.responseURL) { return [2 /*return*/]; } responseHeaders = (0, helpers_1.parse)(request.getAllResponseHeaders()); responseData = request.response; response = { data: responseData, status: request.status, statusText: request.statusText, headers: responseHeaders, config: config, }; request = null; return [4 /*yield*/, (0, helpers_1.parseResponse)(response)]; case 1: response = _a.sent(); if (500 <= response.status && response.status <= 599) { // server error throw debug('Server error(5xx) - %O', response); return [2 /*return*/, reject(new error_1.FsRequestError("Server error ".concat(url), config, response, error_1.FsRequestErrorCode.SERVER))]; } else if (400 <= response.status && response.status <= 499) { debug('Request error(4xx) - %O', response); return [2 /*return*/, reject(new error_1.FsRequestError("Request error ".concat(url), config, response, error_1.FsRequestErrorCode.REQUEST))]; } // clear cancel token to avoid memory leak if (config.cancelToken) { config.cancelToken.removeListener('cancel', cancelListener); cancelListener = null; } return [2 /*return*/, resolve(response)]; } }); }); }; // Handle browser request cancellation (as opposed to a manual cancellation) request.onabort = function handleAbort() { /* istanbul ignore next: just to be sure that abort was not called twice */ if (!request) { return; } request = null; reject(new error_1.FsRequestError('Request aborted', config, null, error_1.FsRequestErrorCode.ABORTED)); }; // Handle low level network errors request.onerror = function handleError(err) { request = null; debug('Request error! %O', err); reject(new error_1.FsRequestError('Network Error', config, null, error_1.FsRequestErrorCode.NETWORK)); }; // Handle timeout request.ontimeout = function handleTimeout() { request = null; debug('Request timed out. %O', config); reject(new error_1.FsRequestError('Request timeout', config, null, error_1.FsRequestErrorCode.TIMEOUT)); }; // Add headers to the request if ('setRequestHeader' in request && headers && Object.keys(headers).length) { for (var key in headers) { if (headers[key] === undefined) { continue; } debug('Set request header %s to %s', key, headers[key]); request.setRequestHeader(key, headers[key]); } } if (typeof config.onProgress === 'function' && [types_1.FsHttpMethod.POST, types_1.FsHttpMethod.PUT].indexOf(config.method) > -1) { /* istanbul ignore else: else path is just fallback to normal progress event */ if (request.upload) { debug('Bind to upload progress event'); request.upload.addEventListener('progress', config.onProgress); } else { debug('Bind to progress event'); request.addEventListener('progress', config.onProgress); } } if (data === undefined) { data = null; } request.send(data); }); }; return XhrAdapter; }()); exports.XhrAdapter = XhrAdapter; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcmVxdWVzdC9hZGFwdGVycy94aHIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILHdEQUEwQjtBQUMxQixzREFBa0M7QUFFbEMsa0NBQXNFO0FBQ3RFLGtDQUE4RDtBQUM5RCx3Q0FBNkY7QUFFN0YsSUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFLLEVBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN0QyxJQUFNLFlBQVksR0FBRyxlQUFlLENBQUM7QUFFckM7SUFBQTtJQW1LQSxDQUFDO0lBaktDLDRCQUFPLEdBQVAsVUFBUSxNQUF3QjtRQUFoQyxpQkFnS0M7UUEvSkMsa0RBQWtEO1FBQ2xELElBQUksT0FBTyxNQUFNLENBQUMsZ0JBQWdCLEtBQUssV0FBVyxFQUFFO1lBQ2xELE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7U0FDaEM7UUFFRCxNQUFNLEdBQUcsSUFBQSxxQkFBVyxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFFaEMsSUFBQSxJQUFJLEdBQWMsTUFBTSxLQUFwQixFQUFFLE9BQU8sR0FBSyxNQUFNLFFBQVgsQ0FBWTtRQUUvQixpRUFBaUU7UUFDakUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzFCLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxPQUFPLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUVuQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7WUFDdkIsT0FBTyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7U0FDL0I7UUFFRCw0QkFBNEI7UUFDNUIsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLE1B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Q0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzdDO2FBQ0Y7WUFFRCxJQUFJLE9BQU8sTUFBTSxDQUFDLFVBQVUsS0FBSyxVQUFVLElBQUksQ0FBQyxvQkFBWSxDQUFDLElBQUksRUFBRSxvQkFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hILCtFQUErRTtnQkFDL0UsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO29CQUNsQixLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztvQkFDdkMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNoRTtxQkFBTTtvQkFDTCxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztvQkFDaEMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3pEO2FBQ0Y7WUFFRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLElBQUksR0FBRyxJQUFJLENBQUM7YUFDYjtZQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0gsaUJBQUM7QUFBRCxDQW5LQSxBQW1LQyxJQUFBO0FBbktZLGdDQUFVIiwiZmlsZSI6ImxpYi9yZXF1ZXN0L2FkYXB0ZXJzL3hoci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggYnkgRmlsZXN0YWNrXG4gKiBTb21lIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBEZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBBZGFwdGVySW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRnNSZXF1ZXN0T3B0aW9ucywgRnNSZXNwb25zZSwgRnNIdHRwTWV0aG9kIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgRnNSZXF1ZXN0RXJyb3IsIEZzUmVxdWVzdEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9yJztcbmltcG9ydCB7IHByZXBhcmVEYXRhLCBwYXJzZVJlc3BvbnNlLCBwYXJzZSBhcyBwYXJzZUhlYWRlcnMsIGNvbWJpbmVVUkwgfSBmcm9tICcuLy4uL2hlbHBlcnMnO1xuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKCdmczpyZXF1ZXN0OnhocicpO1xuY29uc3QgQ0FOQ0VMX0NMRUFSID0gYEZzQ2xlYW5NZW1vcnlgO1xuXG5leHBvcnQgY2xhc3MgWGhyQWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXJJbnRlcmZhY2Uge1xuXG4gIHJlcXVlc3QoY29uZmlnOiBGc1JlcXVlc3RPcHRpb25zKSB7XG4gICAgLy8gaWYgdGhpcyBvcHRpb24gaXMgdW5zcGVjaWZpZWQgc2V0IGl0IGJ5IGRlZmF1bHRcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5maWxlc3RhY2tIZWFkZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uZmlnLmZpbGVzdGFja0hlYWRlcnMgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbmZpZyA9IHByZXBhcmVEYXRhKGNvbmZpZyk7XG4gICAgY29uZmlnLmhlYWRlcnMgPSBjb25maWcuaGVhZGVycyB8fCB7fTtcblxuICAgIGxldCB7IGRhdGEsIGhlYWRlcnMgfSA9IGNvbmZpZztcblxuICAgIC8vIGlmIGRhdGEgaXMgdHlwZSBvZiBmb3JtIGxldCBicm93c2VyIHRvIHNldCBwcm9wZXIgY29udGVudCB0eXBlXG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkpIHtcbiAgICAgIGRlbGV0ZSBoZWFkZXJzWydDb250ZW50LVR5cGUnXTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgaWYgKGNvbmZpZy5ibG9iUmVzcG9uc2UpIHtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gJ2Jsb2InO1xuICAgIH1cblxuICAgIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cbiAgICBpZiAoY29uZmlnLmF1dGgpIHtcbiAgICAgIGlmICghY29uZmlnLmF1dGgudXNlcm5hbWUgfHwgY29uZmlnLmF1dGgudXNlcm5hbWUubGVuZ3RoID09PSAwIHx8ICFjb25maWcuYXV0aC5wYXNzd29yZCB8fCBjb25maWcuYXV0aC5wYXNzd29yZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBGc1JlcXVlc3RFcnJvcihgQmFzaWMgYXV0aDogdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSByZXF1aXJlZCAke2NvbmZpZy5hdXRofWAsIGNvbmZpZykpO1xuICAgICAgfVxuXG4gICAgICBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSAnQmFzaWMgJyArIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGAke2NvbmZpZy5hdXRoLnVzZXJuYW1lfToke2NvbmZpZy5hdXRoLnBhc3N3b3JkfWApKSk7XG4gICAgICBkZWJ1ZygnU2V0IHJlcXVlc3QgYXV0aG9yaXphdGlvbiB0byAlcycsIGNvbmZpZy5hdXRoLnVzZXJuYW1lICsgY29uZmlnLmF1dGgucGFzc3dvcmQpO1xuICAgIH1cblxuICAgIGxldCB1cmwgPSBjb25maWcudXJsLnRyaW0oKTtcblxuICAgIGlmICghL15odHRwKHMpPzpcXC9cXC8vLnRlc3QodXJsKSkge1xuICAgICAgdXJsID0gYGh0dHBzOi8vJHt1cmx9YDtcbiAgICB9XG5cbiAgICB1cmwgPSBjb21iaW5lVVJMKHVybCwgY29uZmlnLnBhcmFtcyk7XG5cbiAgICBkZWJ1ZygnU3RhcnRpbmcgcmVxdWVzdCB0byAlcyB3aXRoIG9wdGlvbnMgJU8nLCB1cmwsIGNvbmZpZyk7XG5cbiAgICByZXF1ZXN0Lm9wZW4oY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCB1cmwsIHRydWUpO1xuXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQ7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8RnNSZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IGNhbmNlbExpc3RlbmVyO1xuXG4gICAgICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgICAgIGNhbmNlbExpc3RlbmVyID0gKHJlYXNvbikgPT4ge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpZiByZXF1ZXN0IGlzIGRvbmUgY2FuY2VsIHRva2VuIHNob3VsZCBub3QgdGhyb3cgYW55IGVycm9yICovXG4gICAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuYWJvcnQoKTtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRlYnVnKCdSZXF1ZXN0IGNhbmNlbGVkIGJ5IHVzZXIgJXMsIGNvbmZpZzogJU8nLCByZWFzb24sIGNvbmZpZyk7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRnNSZXF1ZXN0RXJyb3IoYFJlcXVlc3QgYWJvcnRlZC4gUmVhc29uOiAke3JlYXNvbn1gLCBjb25maWcsIG51bGwsIEZzUmVxdWVzdEVycm9yQ29kZS5BQk9SVEVEKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uZmlnLmNhbmNlbFRva2VuLm9uY2UoJ2NhbmNlbCcsIGNhbmNlbExpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIXJlcXVlc3QucmVzcG9uc2VVUkwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICAgICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBwYXJzZUhlYWRlcnMocmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlcXVlc3QucmVzcG9uc2U7XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlOiBGc1Jlc3BvbnNlID0ge1xuICAgICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICAgICAgaWYgKDUwMCA8PSByZXNwb25zZS5zdGF0dXMgJiYgcmVzcG9uc2Uuc3RhdHVzIDw9IDU5OSkge1xuICAgICAgICAgIC8vIHNlcnZlciBlcnJvciB0aHJvd1xuICAgICAgICAgIGRlYnVnKCdTZXJ2ZXIgZXJyb3IoNXh4KSAtICVPJywgcmVzcG9uc2UpO1xuICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEZzUmVxdWVzdEVycm9yKGBTZXJ2ZXIgZXJyb3IgJHt1cmx9YCwgY29uZmlnLCByZXNwb25zZSwgRnNSZXF1ZXN0RXJyb3JDb2RlLlNFUlZFUikpO1xuICAgICAgICB9IGVsc2UgaWYgKDQwMCA8PSByZXNwb25zZS5zdGF0dXMgJiYgcmVzcG9uc2Uuc3RhdHVzIDw9IDQ5OSkge1xuICAgICAgICAgIGRlYnVnKCdSZXF1ZXN0IGVycm9yKDR4eCkgLSAlTycsIHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBGc1JlcXVlc3RFcnJvcihgUmVxdWVzdCBlcnJvciAke3VybH1gLCBjb25maWcsIHJlc3BvbnNlLCBGc1JlcXVlc3RFcnJvckNvZGUuUkVRVUVTVCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYXIgY2FuY2VsIHRva2VuIHRvIGF2b2lkIG1lbW9yeSBsZWFrXG4gICAgICAgIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICAgICAgICBjb25maWcuY2FuY2VsVG9rZW4ucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIGNhbmNlbExpc3RlbmVyKTtcbiAgICAgICAgICBjYW5jZWxMaXN0ZW5lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBIYW5kbGUgYnJvd3NlciByZXF1ZXN0IGNhbmNlbGxhdGlvbiAoYXMgb3Bwb3NlZCB0byBhIG1hbnVhbCBjYW5jZWxsYXRpb24pXG4gICAgICByZXF1ZXN0Lm9uYWJvcnQgPSBmdW5jdGlvbiBoYW5kbGVBYm9ydCgpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGp1c3QgdG8gYmUgc3VyZSB0aGF0IGFib3J0IHdhcyBub3QgY2FsbGVkIHR3aWNlICovXG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgICByZWplY3QobmV3IEZzUmVxdWVzdEVycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBjb25maWcsIG51bGwsIEZzUmVxdWVzdEVycm9yQ29kZS5BQk9SVEVEKSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnIpIHtcbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICAgIGRlYnVnKCdSZXF1ZXN0IGVycm9yISAlTycsIGVycik7XG4gICAgICAgIHJlamVjdChuZXcgRnNSZXF1ZXN0RXJyb3IoJ05ldHdvcmsgRXJyb3InLCBjb25maWcsIG51bGwsIEZzUmVxdWVzdEVycm9yQ29kZS5ORVRXT1JLKSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgZGVidWcoJ1JlcXVlc3QgdGltZWQgb3V0LiAlTycsIGNvbmZpZyk7XG4gICAgICAgIHJlamVjdChuZXcgRnNSZXF1ZXN0RXJyb3IoJ1JlcXVlc3QgdGltZW91dCcsIGNvbmZpZywgbnVsbCwgRnNSZXF1ZXN0RXJyb3JDb2RlLlRJTUVPVVQpKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XG4gICAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QgJiYgaGVhZGVycyAmJiBPYmplY3Qua2V5cyhoZWFkZXJzKS5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGhlYWRlcnMpIHtcbiAgICAgICAgICBpZiAoaGVhZGVyc1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRlYnVnKCdTZXQgcmVxdWVzdCBoZWFkZXIgJXMgdG8gJXMnLCBrZXksIGhlYWRlcnNba2V5XSk7XG4gICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5vblByb2dyZXNzID09PSAnZnVuY3Rpb24nICYmIFtGc0h0dHBNZXRob2QuUE9TVCwgRnNIdHRwTWV0aG9kLlBVVF0uaW5kZXhPZihjb25maWcubWV0aG9kKSA+IC0xKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBlbHNlIHBhdGggaXMganVzdCBmYWxsYmFjayB0byBub3JtYWwgcHJvZ3Jlc3MgZXZlbnQgKi9cbiAgICAgICAgaWYgKHJlcXVlc3QudXBsb2FkKSB7XG4gICAgICAgICAgZGVidWcoJ0JpbmQgdG8gdXBsb2FkIHByb2dyZXNzIGV2ZW50Jyk7XG4gICAgICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25Qcm9ncmVzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVidWcoJ0JpbmQgdG8gcHJvZ3Jlc3MgZXZlbnQnKTtcbiAgICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgY29uZmlnLm9uUHJvZ3Jlc3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGF0YSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJlcXVlc3Quc2VuZChkYXRhKTtcbiAgICB9KTtcbiAgfVxufVxuIl19