UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

170 lines (168 loc) 24.5 kB
import { __awaiter, __generator } from "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. */ import Debug from 'debug'; import * as utils from '../utils'; import { FsHttpMethod } from '../types'; import { FsRequestError, FsRequestErrorCode } from '../error'; import { prepareData, parseResponse, parse as parseHeaders, combineURL } from './../helpers'; var debug = Debug('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 = 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 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 = 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 FsRequestError("Request aborted. Reason: ".concat(reason), config, null, FsRequestErrorCode.ABORTED)); }; config.cancelToken.once('cancel', cancelListener); } request.onreadystatechange = function () { return __awaiter(_this, void 0, void 0, function () { var responseHeaders, responseData, response; return __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 = parseHeaders(request.getAllResponseHeaders()); responseData = request.response; response = { data: responseData, status: request.status, statusText: request.statusText, headers: responseHeaders, config: config, }; request = null; return [4 /*yield*/, 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 FsRequestError("Server error ".concat(url), config, response, FsRequestErrorCode.SERVER))]; } else if (400 <= response.status && response.status <= 499) { debug('Request error(4xx) - %O', response); return [2 /*return*/, reject(new FsRequestError("Request error ".concat(url), config, response, 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 FsRequestError('Request aborted', config, null, FsRequestErrorCode.ABORTED)); }; // Handle low level network errors request.onerror = function handleError(err) { request = null; debug('Request error! %O', err); reject(new FsRequestError('Network Error', config, null, FsRequestErrorCode.NETWORK)); }; // Handle timeout request.ontimeout = function handleTimeout() { request = null; debug('Request timed out. %O', config); reject(new FsRequestError('Request timeout', config, null, 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' && [FsHttpMethod.POST, 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; }()); export { XhrAdapter }; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcmVxdWVzdC9hZGFwdGVycy94aHIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEtBQUssS0FBSyxNQUFNLFVBQVUsQ0FBQztBQUVsQyxPQUFPLEVBQWdDLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN0RSxPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLEtBQUssSUFBSSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdGLElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3RDLElBQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQztBQUVyQztJQUFBO0lBbUtBLENBQUM7SUFqS0MsNEJBQU8sR0FBUCxVQUFRLE1BQXdCO1FBQWhDLGlCQWdLQztRQS9KQyxrREFBa0Q7UUFDbEQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxXQUFXLEVBQUU7WUFDbEQsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUNoQztRQUVELE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUVoQyxJQUFBLElBQUksR0FBYyxNQUFNLEtBQXBCLEVBQUUsT0FBTyxHQUFLLE1BQU0sUUFBWCxDQUFZO1FBRS9CLGlFQUFpRTtRQUNqRSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUIsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDaEM7UUFFRCxJQUFJLE9BQU8sR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFD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Q0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7d0JBQzlCLFNBQVM7cUJBQ1Y7b0JBRUQsS0FBSyxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDeEQsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDN0M7YUFDRjtZQUVELElBQUksT0FBTyxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hILCtFQUErRTtnQkFDL0UsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO29CQUNsQixLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztvQkFDdkMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNoRTtxQkFBTTtvQkFDTCxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztvQkFDaEMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3pEO2FBQ0Y7WUFFRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLElBQUksR0FBRyxJQUFJLENBQUM7YUFDYjtZQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0gsaUJBQUM7QUFBRCxDQW5LQSxBQW1LQyxJQUFBIiwiZmlsZSI6ImxpYi9yZXF1ZXN0L2FkYXB0ZXJzL3hoci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggYnkgRmlsZXN0YWNrXG4gKiBTb21lIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBEZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBBZGFwdGVySW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRnNSZXF1ZXN0T3B0aW9ucywgRnNSZXNwb25zZSwgRnNIdHRwTWV0aG9kIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgRnNSZXF1ZXN0RXJyb3IsIEZzUmVxdWVzdEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9yJztcbmltcG9ydCB7IHByZXBhcmVEYXRhLCBwYXJzZVJlc3BvbnNlLCBwYXJzZSBhcyBwYXJzZUhlYWRlcnMsIGNvbWJpbmVVUkwgfSBmcm9tICcuLy4uL2hlbHBlcnMnO1xuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKCdmczpyZXF1ZXN0OnhocicpO1xuY29uc3QgQ0FOQ0VMX0NMRUFSID0gYEZzQ2xlYW5NZW1vcnlgO1xuXG5leHBvcnQgY2xhc3MgWGhyQWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXJJbnRlcmZhY2Uge1xuXG4gIHJlcXVlc3QoY29uZmlnOiBGc1JlcXVlc3RPcHRpb25zKSB7XG4gICAgLy8gaWYgdGhpcyBvcHRpb24gaXMgdW5zcGVjaWZpZWQgc2V0IGl0IGJ5IGRlZmF1bHRcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5maWxlc3RhY2tIZWFkZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uZmlnLmZpbGVzdGFja0hlYWRlcnMgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbmZpZyA9IHByZXBhcmVEYXRhKGNvbmZpZyk7XG4gICAgY29uZmlnLmhlYWRlcnMgPSBjb25maWcuaGVhZGVycyB8fCB7fTtcblxuICAgIGxldCB7IGRhdGEsIGhlYWRlcnMgfSA9IGNvbmZpZztcblxuICAgIC8vIGlmIGRhdGEgaXMgdHlwZSBvZiBmb3JtIGxldCBicm93c2VyIHRvIHNldCBwcm9wZXIgY29udGVudCB0eXBlXG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkpIHtcbiAgICAgIGRlbGV0ZSBoZWFkZXJzWydDb250ZW50LVR5cGUnXTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgaWYgKGNvbmZpZy5ibG9iUmVzcG9uc2UpIHtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gJ2Jsb2InO1xuICAgIH1cblxuICAgIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cbiAgICBpZiAoY29uZmlnLmF1dGgpIHtcbiAgICAgIGlmICghY29uZmlnLmF1dGgudXNlcm5hbWUgfHwgY29uZmlnLmF1dGgudXNlcm5hbWUubGVuZ3RoID09PSAwIHx8ICFjb25maWcuYXV0aC5wYXNzd29yZCB8fCBjb25maWcuYXV0aC5wYXNzd29yZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBGc1JlcXVlc3RFcnJvcihgQmFzaWMgYXV0aDogdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSByZXF1aXJlZCAke2NvbmZpZy5hdXRofWAsIGNvbmZpZykpO1xuICAgICAgfVxuXG4gICAgICBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSAnQmFzaWMgJyArIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGAke2NvbmZpZy5hdXRoLnVzZXJuYW1lfToke2NvbmZpZy5hdXRoLnBhc3N3b3JkfWApKSk7XG4gICAgICBkZWJ1ZygnU2V0IHJlcXVlc3QgYXV0aG9yaXphdGlvbiB0byAlcycsIGNvbmZpZy5hdXRoLnVzZXJuYW1lICsgY29uZmlnLmF1dGgucGFzc3dvcmQpO1xuICAgIH1cblxuICAgIGxldCB1cmwgPSBjb25maWcudXJsLnRyaW0oKTtcblxuICAgIGlmICghL15odHRwKHMpPzpcXC9cXC8vLnRlc3QodXJsKSkge1xuICAgICAgdXJsID0gYGh0dHBzOi8vJHt1cmx9YDtcbiAgICB9XG5cbiAgICB1cmwgPSBjb21iaW5lVVJMKHVybCwgY29uZmlnLnBhcmFtcyk7XG5cbiAgICBkZWJ1ZygnU3RhcnRpbmcgcmVxdWVzdCB0byAlcyB3aXRoIG9wdGlvbnMgJU8nLCB1cmwsIGNvbmZpZyk7XG5cbiAgICByZXF1ZXN0Lm9wZW4oY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCB1cmwsIHRydWUpO1xuXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQ7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8RnNSZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IGNhbmNlbExpc3RlbmVyO1xuXG4gICAgICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgICAgIGNhbmNlbExpc3RlbmVyID0gKHJlYXNvbikgPT4ge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpZiByZXF1ZXN0IGlzIGRvbmUgY2FuY2VsIHRva2VuIHNob3VsZCBub3QgdGhyb3cgYW55IGVycm9yICovXG4gICAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuYWJvcnQoKTtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRlYnVnKCdSZXF1ZXN0IGNhbmNlbGVkIGJ5IHVzZXIgJXMsIGNvbmZpZzogJU8nLCByZWFzb24sIGNvbmZpZyk7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRnNSZXF1ZXN0RXJyb3IoYFJlcXVlc3QgYWJvcnRlZC4gUmVhc29uOiAke3JlYXNvbn1gLCBjb25maWcsIG51bGwsIEZzUmVxdWVzdEVycm9yQ29kZS5BQk9SVEVEKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uZmlnLmNhbmNlbFRva2VuLm9uY2UoJ2NhbmNlbCcsIGNhbmNlbExpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIXJlcXVlc3QucmVzcG9uc2VVUkwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICAgICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBwYXJzZUhlYWRlcnMocmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlcXVlc3QucmVzcG9uc2U7XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlOiBGc1Jlc3BvbnNlID0ge1xuICAgICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICAgICAgaWYgKDUwMCA8PSByZXNwb25zZS5zdGF0dXMgJiYgcmVzcG9uc2Uuc3RhdHVzIDw9IDU5OSkge1xuICAgICAgICAgIC8vIHNlcnZlciBlcnJvciB0aHJvd1xuICAgICAgICAgIGRlYnVnKCdTZXJ2ZXIgZXJyb3IoNXh4KSAtICVPJywgcmVzcG9uc2UpO1xuICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEZzUmVxdWVzdEVycm9yKGBTZXJ2ZXIgZXJyb3IgJHt1cmx9YCwgY29uZmlnLCByZXNwb25zZSwgRnNSZXF1ZXN0RXJyb3JDb2RlLlNFUlZFUikpO1xuICAgICAgICB9IGVsc2UgaWYgKDQwMCA8PSByZXNwb25zZS5zdGF0dXMgJiYgcmVzcG9uc2Uuc3RhdHVzIDw9IDQ5OSkge1xuICAgICAgICAgIGRlYnVnKCdSZXF1ZXN0IGVycm9yKDR4eCkgLSAlTycsIHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBGc1JlcXVlc3RFcnJvcihgUmVxdWVzdCBlcnJvciAke3VybH1gLCBjb25maWcsIHJlc3BvbnNlLCBGc1JlcXVlc3RFcnJvckNvZGUuUkVRVUVTVCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYXIgY2FuY2VsIHRva2VuIHRvIGF2b2lkIG1lbW9yeSBsZWFrXG4gICAgICAgIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICAgICAgICBjb25maWcuY2FuY2VsVG9rZW4ucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIGNhbmNlbExpc3RlbmVyKTtcbiAgICAgICAgICBjYW5jZWxMaXN0ZW5lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBIYW5kbGUgYnJvd3NlciByZXF1ZXN0IGNhbmNlbGxhdGlvbiAoYXMgb3Bwb3NlZCB0byBhIG1hbnVhbCBjYW5jZWxsYXRpb24pXG4gICAgICByZXF1ZXN0Lm9uYWJvcnQgPSBmdW5jdGlvbiBoYW5kbGVBYm9ydCgpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGp1c3QgdG8gYmUgc3VyZSB0aGF0IGFib3J0IHdhcyBub3QgY2FsbGVkIHR3aWNlICovXG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgICByZWplY3QobmV3IEZzUmVxdWVzdEVycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBjb25maWcsIG51bGwsIEZzUmVxdWVzdEVycm9yQ29kZS5BQk9SVEVEKSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnIpIHtcbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICAgIGRlYnVnKCdSZXF1ZXN0IGVycm9yISAlTycsIGVycik7XG4gICAgICAgIHJlamVjdChuZXcgRnNSZXF1ZXN0RXJyb3IoJ05ldHdvcmsgRXJyb3InLCBjb25maWcsIG51bGwsIEZzUmVxdWVzdEVycm9yQ29kZS5ORVRXT1JLKSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgZGVidWcoJ1JlcXVlc3QgdGltZWQgb3V0LiAlTycsIGNvbmZpZyk7XG4gICAgICAgIHJlamVjdChuZXcgRnNSZXF1ZXN0RXJyb3IoJ1JlcXVlc3QgdGltZW91dCcsIGNvbmZpZywgbnVsbCwgRnNSZXF1ZXN0RXJyb3JDb2RlLlRJTUVPVVQpKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XG4gICAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QgJiYgaGVhZGVycyAmJiBPYmplY3Qua2V5cyhoZWFkZXJzKS5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGhlYWRlcnMpIHtcbiAgICAgICAgICBpZiAoaGVhZGVyc1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRlYnVnKCdTZXQgcmVxdWVzdCBoZWFkZXIgJXMgdG8gJXMnLCBrZXksIGhlYWRlcnNba2V5XSk7XG4gICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5vblByb2dyZXNzID09PSAnZnVuY3Rpb24nICYmIFtGc0h0dHBNZXRob2QuUE9TVCwgRnNIdHRwTWV0aG9kLlBVVF0uaW5kZXhPZihjb25maWcubWV0aG9kKSA+IC0xKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBlbHNlIHBhdGggaXMganVzdCBmYWxsYmFjayB0byBub3JtYWwgcHJvZ3Jlc3MgZXZlbnQgKi9cbiAgICAgICAgaWYgKHJlcXVlc3QudXBsb2FkKSB7XG4gICAgICAgICAgZGVidWcoJ0JpbmQgdG8gdXBsb2FkIHByb2dyZXNzIGV2ZW50Jyk7XG4gICAgICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25Qcm9ncmVzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVidWcoJ0JpbmQgdG8gcHJvZ3Jlc3MgZXZlbnQnKTtcbiAgICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgY29uZmlnLm9uUHJvZ3Jlc3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGF0YSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJlcXVlc3Quc2VuZChkYXRhKTtcbiAgICB9KTtcbiAgfVxufVxuIl19