filestack-js
Version:
Official JavaScript library for Filestack
187 lines (185 loc) • 20.5 kB
JavaScript
/*
* 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 { __awaiter, __generator } from "tslib";
import { storeURL } from './store';
import { FilestackError } from './../../filestack_error';
import { config } from './../../config';
import { FsRequest } from './../request';
import { Filelink } from './../filelink';
jest.mock('./../filelink');
jest.mock('./../request');
var mockedSession = {
apikey: 'fakeApikey',
urls: config.urls,
};
var workflowIds = ['123', '321'];
var storeTaskDef = [{ name: 'store', params: {} }];
var storeTaskDefWithWorkflows = [{ name: 'store', params: {} }];
var sourceToStore = 'urlToStore';
describe('StoreURL', function () {
beforeEach(function () {
// @ts-ignore
FsRequest.post.mockImplementation(function (_, options) {
var toReturn = {
data: {
handle: 'test',
},
};
if (options && options.upload_tags) {
// @ts-ignore
toReturn.data.upload_tags = options.upload_tags;
}
return Promise.resolve(toReturn);
});
// @ts-ignore
Filelink.prototype.getTasks.mockImplementation(function () { return storeTaskDef; });
});
it('should call correct store method', function () { return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, storeURL({ session: mockedSession, url: sourceToStore })];
case 1:
_a.sent();
expect(FsRequest.post).toHaveBeenCalledWith("".concat(mockedSession.urls.processUrl, "/process"), {
apikey: mockedSession.apikey,
sources: [sourceToStore],
tasks: storeTaskDef,
upload_tags: undefined,
}, {});
return [2 /*return*/];
}
});
}); });
it('should respect passed security and policy', function () { return __awaiter(void 0, void 0, void 0, function () {
var fakeSecurity;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
fakeSecurity = {
signature: 'fakeS',
policy: 'fakeP',
};
return [4 /*yield*/, storeURL({ session: mockedSession, url: sourceToStore, security: fakeSecurity })];
case 1:
_a.sent();
expect(Filelink.prototype.security).toHaveBeenCalledWith(fakeSecurity);
expect(FsRequest.post).toHaveBeenCalledWith("".concat(mockedSession.urls.processUrl, "/process"), {
apikey: mockedSession.apikey,
sources: [sourceToStore],
tasks: storeTaskDef,
upload_tags: undefined,
}, {});
return [2 /*return*/];
}
});
}); });
it('should throw error on wrong store params', function () {
return expect(storeURL({
session: mockedSession,
url: sourceToStore,
storeParams: {
// @ts-ignore
test: 123,
},
})).rejects.toEqual(expect.any(FilestackError));
});
it('should respect token cancel', function () { return __awaiter(void 0, void 0, void 0, function () {
var token;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
token = {
cancel: function () {
console.log('cancel method');
},
};
return [4 /*yield*/, storeURL({
session: mockedSession,
url: sourceToStore,
token: token,
})];
case 1:
_a.sent();
expect(FsRequest.post).toHaveBeenCalledWith("".concat(mockedSession.urls.processUrl, "/process"), {
apikey: mockedSession.apikey,
sources: [sourceToStore],
tasks: storeTaskDef,
upload_tags: undefined,
// expect.any(FsCancelToken) is not working correctly with mocked functions
}, { cancelToken: expect.any(Object) });
return [2 /*return*/];
}
});
}); });
it('should pass upload tags to request', function () { return __awaiter(void 0, void 0, void 0, function () {
var uploadTags, res;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
uploadTags = { test: '123' };
return [4 /*yield*/, storeURL({
session: mockedSession,
url: sourceToStore,
uploadTags: uploadTags,
})];
case 1:
res = _a.sent();
expect(FsRequest.post).toHaveBeenCalledWith("".concat(mockedSession.urls.processUrl, "/process"), {
apikey: mockedSession.apikey,
sources: [sourceToStore],
tasks: storeTaskDef,
upload_tags: uploadTags,
}, {});
expect(res.uploadTags).toEqual(uploadTags);
return [2 /*return*/];
}
});
}); });
it('should throw an error when missing url', function () {
return expect(storeURL({ session: mockedSession })).rejects.toEqual(expect.any(FilestackError));
});
it('should throw on missing handle in response', function () {
// @ts-ignore
FsRequest.post.mockImplementation(function () { return Promise.resolve({
data: {},
}); });
return expect(storeURL({
session: mockedSession,
url: sourceToStore,
})).rejects.toEqual(expect.any(FilestackError));
});
it('should be able to run storeUrl with workflows', function () { return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, storeURL({
session: mockedSession,
url: sourceToStore,
workflowIds: workflowIds,
})];
case 1:
_a.sent();
expect(FsRequest.post).toHaveBeenCalledWith("".concat(mockedSession.urls.processUrl, "/process"), {
apikey: mockedSession.apikey,
sources: [sourceToStore],
tasks: storeTaskDefWithWorkflows,
}, {});
return [2 /*return*/];
}
});
}); });
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3N0b3JlLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFbkMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXpELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTFCLElBQU0sYUFBYSxHQUFZO0lBQzdCLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtDQUNsQixDQUFDO0FBRUYsSUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkMsSUFBTSxZQUFZLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDckQsSUFBTSx5QkFBeUIsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsRSxJQUFNLGFBQWEsR0FBRyxZQUFZLENBQUM7QUFFbkMsUUFBUSxDQUFDLFVBQVUsRUFBRTtJQUVuQixVQUFVLENBQUM7UUFDVCxhQUFhO1FBQ2IsU0FBUyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFDLENBQUMsRUFBRSxPQUFPO1lBQzNDLElBQUksUUFBUSxHQUFHO2dCQUNiLElBQUksRUFBRTtvQkFDSixNQUFNLEVBQUUsTUFBTTtpQkFDZjth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LENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFO1FBRS9DLGFBQWE7UUFDYixTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQU0sT0FBQSxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3RELElBQUksRUFBRSxFQUFFO1NBQ1QsQ0FBQyxFQUZzQyxDQUV0QyxDQUFDLENBQUM7UUFFSixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDckIsT0FBTyxFQUFFLGFBQWE7WUFDdEIsR0FBRyxFQUFFLGFBQWE7U0FDbkIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUU7Ozt3QkFDbEQscUJBQU0sUUFBUSxDQUFDO3dCQUNiLE9BQU8sRUFBRSxhQUFhO3dCQUN0QixHQUFHLEVBQUUsYUFBYTt3QkFDbEIsV0FBVyxhQUFBO3FCQUNaLENBQUMsRUFBQTs7b0JBSkYsU0FJRSxDQUFDO29CQUVILE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsb0JBQW9CLENBQUMsVUFBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsYUFBVSxFQUFFO3dCQUN0RixNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU07d0JBQzVCLE9BQU8sRUFBRSxDQUFFLGFBQWEsQ0FBRTt3QkFDMUIsS0FBSyxFQUFFLHlCQUF5QjtxQkFDakMsRUFBRSxFQUFFLENBQUMsQ0FBQzs7OztTQUNSLENBQUMsQ0FBQztBQUVMLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6ImxpYi9hcGkvc3RvcmUuc3BlYy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggYnkgRmlsZXN0YWNrLlxuICogU29tZSByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IHN0b3JlVVJMIH0gZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgeyBTZXNzaW9uIH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB7IEZpbGVzdGFja0Vycm9yIH0gZnJvbSAnLi8uLi8uLi9maWxlc3RhY2tfZXJyb3InO1xuXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBGc1JlcXVlc3QgfSBmcm9tICcuLy4uL3JlcXVlc3QnO1xuaW1wb3J0IHsgRmlsZWxpbmsgfSBmcm9tICcuLy4uL2ZpbGVsaW5rJztcblxuamVzdC5tb2NrKCcuLy4uL2ZpbGVsaW5rJyk7XG5qZXN0Lm1vY2soJy4vLi4vcmVxdWVzdCcpO1xuXG5jb25zdCBtb2NrZWRTZXNzaW9uOiBTZXNzaW9uID0ge1xuICBhcGlrZXk6ICdmYWtlQXBpa2V5JyxcbiAgdXJsczogY29uZmlnLnVybHMsXG59O1xuXG5jb25zdCB3b3JrZmxvd0lkcyA9IFsnMTIzJywgJzMyMSddO1xuXG5jb25zdCBzdG9yZVRhc2tEZWYgPSBbeyBuYW1lOiAnc3RvcmUnLCBwYXJhbXM6IHt9IH1dO1xuY29uc3Qgc3RvcmVUYXNrRGVmV2l0aFdvcmtmbG93cyA9IFt7IG5hbWU6ICdzdG9yZScsIHBhcmFtczoge30gfV07XG5jb25zdCBzb3VyY2VUb1N0b3JlID0gJ3VybFRvU3RvcmUnO1xuXG5kZXNjcmliZSgnU3RvcmVVUkwnLCAoKSA9PiB7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIEZzUmVxdWVzdC5wb3N0Lm1vY2tJbXBsZW1lbnRhdGlvbigoXywgb3B0aW9ucykgPT4ge1xuICAgICAgbGV0IHRvUmV0dXJuID0ge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgaGFuZGxlOiAndGVzdCcsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnVwbG9hZF90YWdzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdG9SZXR1cm4uZGF0YS51cGxvYWRfdGFncyA9IG9wdGlvbnMudXBsb2FkX3RhZ3M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodG9SZXR1cm4pO1xuICAgIH0pO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIEZpbGVsaW5rLnByb3RvdHlwZS5nZXRUYXNrcy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gc3RvcmVUYXNrRGVmKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjYWxsIGNvcnJlY3Qgc3RvcmUgbWV0aG9kJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHN0b3JlVVJMKHsgc2Vzc2lvbjogbW9ja2VkU2Vzc2lvbiwgdXJsOiBzb3VyY2VUb1N0b3JlIH0pO1xuXG4gICAgZXhwZWN0KEZzUmVxdWVzdC5wb3N0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChgJHttb2NrZWRTZXNzaW9uLnVybHMucHJvY2Vzc1VybH0vcHJvY2Vzc2AsIHtcbiAgICAgIGFwaWtleTogbW9ja2VkU2Vzc2lvbi5hcGlrZXksXG4gICAgICBzb3VyY2VzOiBbIHNvdXJjZVRvU3RvcmUgXSxcbiAgICAgIHRhc2tzOiBzdG9yZVRhc2tEZWYsXG4gICAgICB1cGxvYWRfdGFnczogdW5kZWZpbmVkLFxuICAgIH0sIHt9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXNwZWN0IHBhc3NlZCBzZWN1cml0eSBhbmQgcG9saWN5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZha2VTZWN1cml0eSA9IHtcbiAgICAgIHNpZ25hdHVyZTogJ2Zha2VTJyxcbiAgICAgIHBvbGljeTogJ2Zha2VQJyxcbiAgICB9O1xuXG4gICAgYXdhaXQgc3RvcmVVUkwoeyBzZXNzaW9uOiBtb2NrZWRTZXNzaW9uLCB1cmw6IHNvdXJjZVRvU3RvcmUsIHNlY3VyaXR5OiBmYWtlU2VjdXJpdHkgfSk7XG5cbiAgICBleHBlY3QoRmlsZWxpbmsucHJvdG90eXBlLnNlY3VyaXR5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChmYWtlU2VjdXJpdHkpO1xuXG4gICAgZXhwZWN0KEZzUmVxdWVzdC5wb3N0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChgJHttb2NrZWRTZXNzaW9uLnVybHMucHJvY2Vzc1VybH0vcHJvY2Vzc2AsIHtcbiAgICAgIGFwaWtleTogbW9ja2VkU2Vzc2lvbi5hcGlrZXksXG4gICAgICBzb3VyY2VzOiBbIHNvdXJjZVRvU3RvcmUgXSxcbiAgICAgIHRhc2tzOiBzdG9yZVRhc2tEZWYsXG4gICAgICB1cGxvYWRfdGFnczogdW5kZWZpbmVkLFxuICAgIH0sIHt9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBvbiB3cm9uZyBzdG9yZSBwYXJhbXMnLCAoKSA9PiB7XG4gICAgcmV0dXJuIGV4cGVjdChzdG9yZVVSTCh7XG4gICAgICBzZXNzaW9uOiBtb2NrZWRTZXNzaW9uLFxuICAgICAgdXJsOiBzb3VyY2VUb1N0b3JlLFxuICAgICAgc3RvcmVQYXJhbXM6IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0ZXN0OiAxMjMsXG4gICAgICB9LFxuICAgIH0pKS5yZWplY3RzLnRvRXF1YWwoZXhwZWN0LmFueShGaWxlc3RhY2tFcnJvcikpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlc3BlY3QgdG9rZW4gY2FuY2VsJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHNpbXVsYXRlIG9sZCB0b2tlblxuICAgIGNvbnN0IHRva2VuID0ge1xuICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdjYW5jZWwgbWV0aG9kJyk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBhd2FpdCBzdG9yZVVSTCh7XG4gICAgICBzZXNzaW9uOiBtb2NrZWRTZXNzaW9uLFxuICAgICAgdXJsOiBzb3VyY2VUb1N0b3JlLFxuICAgICAgdG9rZW4sXG4gICAgfSk7XG5cbiAgICBleHBlY3QoRnNSZXF1ZXN0LnBvc3QpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGAke21vY2tlZFNlc3Npb24udXJscy5wcm9jZXNzVXJsfS9wcm9jZXNzYCwge1xuICAgICAgYXBpa2V5OiBtb2NrZWRTZXNzaW9uLmFwaWtleSxcbiAgICAgIHNvdXJjZXM6IFsgc291cmNlVG9TdG9yZSBdLFxuICAgICAgdGFza3M6IHN0b3JlVGFza0RlZixcbiAgICAgIHVwbG9hZF90YWdzOiB1bmRlZmluZWQsXG5cbiAgICAgIC8vIGV4cGVjdC5hbnkoRnNDYW5jZWxUb2tlbikgaXMgbm90IHdvcmtpbmcgY29ycmVjdGx5IHdpdGggbW9ja2VkIGZ1bmN0aW9uc1xuICAgIH0sIHsgY2FuY2VsVG9rZW46IGV4cGVjdC5hbnkoT2JqZWN0KSB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwYXNzIHVwbG9hZCB0YWdzIHRvIHJlcXVlc3QnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdXBsb2FkVGFncyA9IHsgdGVzdDogJzEyMycgfTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHN0b3JlVVJMKHtcbiAgICAgIHNlc3Npb246IG1vY2tlZFNlc3Npb24sXG4gICAgICB1cmw6IHNvdXJjZVRvU3RvcmUsXG4gICAgICB1cGxvYWRUYWdzLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KEZzUmVxdWVzdC5wb3N0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChgJHttb2NrZWRTZXNzaW9uLnVybHMucHJvY2Vzc1VybH0vcHJvY2Vzc2AsIHtcbiAgICAgIGFwaWtleTogbW9ja2VkU2Vzc2lvbi5hcGlrZXksXG4gICAgICBzb3VyY2VzOiBbIHNvdXJjZVRvU3RvcmUgXSxcbiAgICAgIHRhc2tzOiBzdG9yZVRhc2tEZWYsXG4gICAgICB1cGxvYWRfdGFnczogdXBsb2FkVGFncyxcbiAgICB9LCB7fSk7XG5cbiAgICBleHBlY3QocmVzLnVwbG9hZFRhZ3MpLnRvRXF1YWwodXBsb2FkVGFncyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3Igd2hlbiBtaXNzaW5nIHVybCcsICgpID0+IHtcbiAgICByZXR1cm4gZXhwZWN0KHN0b3JlVVJMKHsgc2Vzc2lvbjogbW9ja2VkU2Vzc2lvbiB9KSkucmVqZWN0cy50b0VxdWFsKGV4cGVjdC5hbnkoRmlsZXN0YWNrRXJyb3IpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBtaXNzaW5nIGhhbmRsZSBpbiByZXNwb25zZScsICgpID0+IHtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBGc1JlcXVlc3QucG9zdC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgIGRhdGE6IHt9LFxuICAgIH0pKTtcblxuICAgIHJldHVybiBleHBlY3Qoc3RvcmVVUkwoe1xuICAgICAgc2Vzc2lvbjogbW9ja2VkU2Vzc2lvbixcbiAgICAgIHVybDogc291cmNlVG9TdG9yZSxcbiAgICB9KSkucmVqZWN0cy50b0VxdWFsKGV4cGVjdC5hbnkoRmlsZXN0YWNrRXJyb3IpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIHJ1biBzdG9yZVVybCB3aXRoIHdvcmtmbG93cycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBzdG9yZVVSTCh7XG4gICAgICBzZXNzaW9uOiBtb2NrZWRTZXNzaW9uLFxuICAgICAgdXJsOiBzb3VyY2VUb1N0b3JlLFxuICAgICAgd29ya2Zsb3dJZHMsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoRnNSZXF1ZXN0LnBvc3QpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGAke21vY2tlZFNlc3Npb24udXJscy5wcm9jZXNzVXJsfS9wcm9jZXNzYCwge1xuICAgICAgYXBpa2V5OiBtb2NrZWRTZXNzaW9uLmFwaWtleSxcbiAgICAgIHNvdXJjZXM6IFsgc291cmNlVG9TdG9yZSBdLFxuICAgICAgdGFza3M6IHN0b3JlVGFza0RlZldpdGhXb3JrZmxvd3MsXG4gICAgfSwge30pO1xuICB9KTtcblxufSk7XG4iXX0=