UNPKG

@ngx-resource/handler-cordova-advanced-http

Version:

Resource Handler based on cordova-advanced-http

199 lines 23.8 kB
import { ResourceHandler, ResourceRequestBodyType, ResourceRequestMethod, ResourceResponseBodyType } from '@ngx-resource/core'; export class ResourceHandlerCordovaAdvancedHttp extends ResourceHandler { constructor() { super(); this.http = null; this.methodWithBody = ['post', 'put', 'patch']; this.initDeferResolve = null; this.initDeferPromise = null; this.initDeferPromise = new Promise((resolve) => { this.initDeferResolve = resolve; }); this.initHttp(); } initHttp(http) { if (http) { this.http = http; this.resolveDeferInit(); } else { this.initHttpPlugin(); } } handle(req) { if (this.initDeferPromise) { return { promise: this.initDeferPromise .then(() => this.handle(req)) .then((r) => r.promise || { status: 0 }) }; } if (!this.http) { return this.createErrorResponse('Http is not defined'); } if (req.requestBodyType === void 0) { req.requestBodyType = ResourceRequestBodyType.FORM_DATA; } this.setDataSerializer(req.requestBodyType); const methodName = this.mapMethodName(req.method); if (methodName === null) { return this.createErrorResponse('Request method is not supported'); } let url = req.url || ''; let second = req.body; if (req.query) { this.prepareQuery(req.query); } if (this.methodWithBody.indexOf(methodName) > -1) { if (req.query) { url = this.createUrlWithQuery(url, req.query); } } else { second = req.query; } const promise = new Promise((resolve, reject) => { try { this.http[methodName](url, second, req.headers, resolve, reject); } catch (e) { console.error(`Http plugin call failed with: ${e.message}`, e); reject({ status: -1, headers: [{ error: e.message }] }); } }) .catch((resp) => this.createResponse(resp, req, true)) .then((resp) => this.createResponse(resp, req)); return { promise }; } initHttpPlugin() { if (this.tryToSetPlugin()) { this.resolveDeferInit(); } else { document.addEventListener('deviceready', () => { if (!this.tryToSetPlugin()) { console.warn('Can not set http plugin after device ready'); } this.resolveDeferInit(); }, false); } } tryToSetPlugin() { if (!this.http && cordova && cordova.plugin && cordova.plugin.http) { this.http = cordova.plugin.http; } return !!this.http; } resolveDeferInit() { this.initDeferResolve(); this.initDeferResolve = null; this.initDeferPromise = null; } createResponse(resp, req, isError = false) { return new Promise((resolve, reject) => { const ret = { status: resp.status, body: resp.data || resp.error, headers: resp.headers }; this.prepareResponseBody(ret, req, isError, resolve, reject); if (isError) { reject(ret); } else { resolve(ret); } }); } createErrorResponse(msg) { return { promise: Promise.reject(new Error(msg)) }; } setDataSerializer(requestBodyType) { switch (requestBodyType) { case ResourceRequestBodyType.JSON: this.http.setDataSerializer('json'); break; case ResourceRequestBodyType.FORM_DATA: this.http.setDataSerializer('urlencoded'); break; case ResourceRequestBodyType.TEXT: this.http.setDataSerializer('utf8'); break; default: return this.createErrorResponse('Supported only json, FormData or text types'); } } mapMethodName(method) { switch (method) { case ResourceRequestMethod.Post: return 'post'; case ResourceRequestMethod.Get: return 'get'; case ResourceRequestMethod.Put: return 'put'; case ResourceRequestMethod.Patch: return 'patch'; case ResourceRequestMethod.Delete: return 'delete'; case ResourceRequestMethod.Head: return 'head'; default: return null; } } prepareQuery(query) { for (const key in query) { if (query.hasOwnProperty(key)) { query[key] = query[key].toString(); } } } createUrlWithQuery(url, query) { const params = Object.keys(query) .map((key) => `${key}=${query[key]}`) .join('&'); return url + (url.indexOf('?') === -1 ? '?' : '&') + encodeURI(params); } prepareResponseBody(ret, req, isError = false, resolve, reject) { if (ret.body) { switch (req.responseBodyType) { case ResourceResponseBodyType.Json: try { ret.body = JSON.parse(ret.body); } catch (e) { // noop } break; case ResourceResponseBodyType.Blob: ret.body = new Blob([ret.body], { type: 'text/plain' }); break; case ResourceResponseBodyType.ArrayBuffer: const fileReader = new FileReader(); fileReader.onload = function () { ret.body = this.result; if (isError) { reject(ret); } else { resolve(ret); } }; fileReader.onerror = () => { reject({ status: 0, body: null, headers: {} }); }; fileReader.readAsArrayBuffer(new Blob([ret.body], { type: 'text/plain' })); return; } } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzb3VyY2VIYW5kbGVyQ29yZG92YUFkdmFuY2VkSHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZXNvdXJjZS9oYW5kbGVyLWNvcmRvdmEtYWR2YW5jZWQtaHR0cC9zcmMvbGliL1Jlc291cmNlSGFuZGxlckNvcmRvdmFBZHZhbmNlZEh0dHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlMLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBSzVCLE1BQU0sT0FBTyxrQ0FBbUMsU0FBUSxlQUFlO0lBU3JFO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFSRixTQUFJLEdBQVEsSUFBSSxDQUFDO1FBRWpCLG1CQUFjLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTFDLHFCQUFnQixHQUFRLElBQUksQ0FBQztRQUM3QixxQkFBZ0IsR0FBd0IsSUFBSSxDQUFDO1FBS25ELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sQ0FBTSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ25ELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFVO1FBRWpCLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDakIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDekI7YUFBTTtZQUNMLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2QjtJQUVILENBQUM7SUFFRCxNQUFNLENBQUMsR0FBcUI7UUFFMUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsT0FBTztnQkFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtxQkFDM0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQzVCLElBQUksQ0FBQyxDQUFDLENBQTJCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBQyxNQUFNLEVBQUUsQ0FBQyxFQUFDLENBQUM7YUFDbkUsQ0FBQztTQUNIO1FBR0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQ3hEO1FBRUQsSUFBSSxHQUFHLENBQUMsZUFBZSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLEdBQUcsQ0FBQyxlQUFlLEdBQUcsdUJBQXVCLENBQUMsU0FBUyxDQUFDO1NBQ3pEO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUU1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVsRCxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUNwRTtRQUVELElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFFdEIsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFO1lBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDOUI7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2hELElBQUksR0FBRyxDQUFDLEtBQUssRUFBRTtnQkFDYixHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0M7U0FDRjthQUFNO1lBQ0wsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7U0FDcEI7UUFHRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM5QyxJQUFJO2dCQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQzthQUNsRTtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxDQUFDLEVBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQzthQUNyRDtRQUNILENBQUMsQ0FBQzthQUNDLEtBQUssQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzFELElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV2RCxPQUFPLEVBQUMsT0FBTyxFQUFDLENBQUM7SUFFbkIsQ0FBQztJQUVPLGNBQWM7UUFDcEIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDekI7YUFBTTtZQUNMLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO2dCQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFO29CQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7aUJBQzVEO2dCQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNYO0lBQ0gsQ0FBQztJQUVPLGNBQWM7UUFFcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDbEUsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztTQUNqQztRQUVELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVPLGNBQWMsQ0FBQyxJQUFTLEVBQUUsR0FBcUIsRUFBRSxVQUFtQixLQUFLO1FBRS9FLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFFckMsTUFBTSxHQUFHLEdBQXNCO2dCQUM3QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLO2dCQUM3QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87YUFDdEIsQ0FBQztZQUVGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFN0QsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2I7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2Q7UUFFSCxDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7SUFHTyxtQkFBbUIsQ0FBQyxHQUFXO1FBQ3JDLE9BQU87WUFDTCxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN4QyxDQUFDO0lBQ0osQ0FBQztJQUVPLGlCQUFpQixDQUFDLGVBQXdDO1FBQ2hFLFFBQVEsZUFBZSxFQUFFO1lBQ3ZCLEtBQUssdUJBQXVCLENBQUMsSUFBSTtnQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEMsTUFBTTtZQUVSLEtBQUssdUJBQXVCLENBQUMsU0FBUztnQkFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDMUMsTUFBTTtZQUVSLEtBQUssdUJBQXVCLENBQUMsSUFBSTtnQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEMsTUFBTTtZQUVSO2dCQUNFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLDZDQUE2QyxDQUFDLENBQUM7U0FDbEY7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLE1BQThCO1FBRWxELFFBQVEsTUFBTSxFQUFFO1lBQ2QsS0FBSyxxQkFBcUIsQ0FBQyxJQUFJO2dCQUM3QixPQUFPLE1BQU0sQ0FBQztZQUVoQixLQUFLLHFCQUFxQixDQUFDLEdBQUc7Z0JBQzVCLE9BQU8sS0FBSyxDQUFDO1lBRWYsS0FBSyxxQkFBcUIsQ0FBQyxHQUFHO2dCQUM1QixPQUFPLEtBQUssQ0FBQztZQUVmLEtBQUsscUJBQXFCLENBQUMsS0FBSztnQkFDOUIsT0FBTyxPQUFPLENBQUM7WUFFakIsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNO2dCQUMvQixPQUFPLFFBQVEsQ0FBQztZQUVsQixLQUFLLHFCQUFxQixDQUFDLElBQUk7Z0JBQzdCLE9BQU8sTUFBTSxDQUFDO1lBRWhCO2dCQUNFLE9BQU8sSUFBSSxDQUFDO1NBRWY7SUFDSCxDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQVU7UUFDN0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUU7WUFDdkIsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ3BDO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsR0FBVyxFQUFFLEtBQWdDO1FBQ3RFLE1BQU0sTUFBTSxHQUFXLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ3RDLEdBQUcsQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7YUFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWIsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU8sbUJBQW1CLENBQUMsR0FBc0IsRUFDdEIsR0FBcUIsRUFDckIsVUFBbUIsS0FBSyxFQUN4QixPQUFZLEVBQ1osTUFBVztRQUVyQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUU7WUFFWixRQUFRLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFFNUIsS0FBSyx3QkFBd0IsQ0FBQyxJQUFJO29CQUNoQyxJQUFJO3dCQUNGLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2pDO29CQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUNWLE9BQU87cUJBQ1I7b0JBRUQsTUFBTTtnQkFFUixLQUFLLHdCQUF3QixDQUFDLElBQUk7b0JBQ2hDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQztvQkFFdEQsTUFBTTtnQkFFUixLQUFLLHdCQUF3QixDQUFDLFdBQVc7b0JBQ3ZDLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7b0JBRXBDLFVBQVUsQ0FBQyxNQUFNLEdBQUc7d0JBQ2xCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzt3QkFFdkIsSUFBSSxPQUFPLEVBQUU7NEJBQ1gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3lCQUNiOzZCQUFNOzRCQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQzt5QkFDZDtvQkFDSCxDQUFDLENBQUM7b0JBRUYsVUFBVSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUU7d0JBQ3hCLE1BQU0sQ0FBQzs0QkFDTCxNQUFNLEVBQUUsQ0FBQzs0QkFDVCxJQUFJLEVBQUUsSUFBSTs0QkFDVixPQUFPLEVBQUUsRUFBRTt5QkFDWixDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDO29CQUVGLFVBQVUsQ0FBQyxpQkFBaUIsQ0FDMUIsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ25CLElBQUksRUFBRSxZQUFZO3FCQUNuQixDQUFDLENBQ0gsQ0FBQztvQkFFRixPQUFPO2FBRVY7U0FDRjtJQUNILENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIElSZXNvdXJjZUhhbmRsZXJSZXNwb25zZSxcbiAgSVJlc291cmNlUmVxdWVzdCxcbiAgSVJlc291cmNlUmVzcG9uc2UsXG4gIFJlc291cmNlSGFuZGxlcixcbiAgUmVzb3VyY2VSZXF1ZXN0Qm9keVR5cGUsXG4gIFJlc291cmNlUmVxdWVzdE1ldGhvZCxcbiAgUmVzb3VyY2VSZXNwb25zZUJvZHlUeXBlXG59IGZyb20gJ0BuZ3gtcmVzb3VyY2UvY29yZSc7XG5cblxuZGVjbGFyZSBjb25zdCBjb3Jkb3ZhOiBhbnk7XG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUhhbmRsZXJDb3Jkb3ZhQWR2YW5jZWRIdHRwIGV4dGVuZHMgUmVzb3VyY2VIYW5kbGVyIHtcblxuICBwcml2YXRlIGh0dHA6IGFueSA9IG51bGw7XG5cbiAgcHJpdmF0ZSBtZXRob2RXaXRoQm9keSA9IFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXTtcblxuICBwcml2YXRlIGluaXREZWZlclJlc29sdmU6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgaW5pdERlZmVyUHJvbWlzZTogUHJvbWlzZTxhbnk+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuaW5pdERlZmVyUHJvbWlzZSA9IG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuaW5pdERlZmVyUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSk7XG5cbiAgICB0aGlzLmluaXRIdHRwKCk7XG4gIH1cblxuICBpbml0SHR0cChodHRwPzogYW55KSB7XG5cbiAgICBpZiAoaHR0cCkge1xuICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgIHRoaXMucmVzb2x2ZURlZmVySW5pdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXRIdHRwUGx1Z2luKCk7XG4gICAgfVxuXG4gIH1cblxuICBoYW5kbGUocmVxOiBJUmVzb3VyY2VSZXF1ZXN0KTogSVJlc291cmNlSGFuZGxlclJlc3BvbnNlIHtcblxuICAgIGlmICh0aGlzLmluaXREZWZlclByb21pc2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2U6IHRoaXMuaW5pdERlZmVyUHJvbWlzZVxuICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuaGFuZGxlKHJlcSkpXG4gICAgICAgICAgLnRoZW4oKHI6IElSZXNvdXJjZUhhbmRsZXJSZXNwb25zZSkgPT4gci5wcm9taXNlIHx8IHtzdGF0dXM6IDB9KVxuICAgICAgfTtcbiAgICB9XG5cblxuICAgIGlmICghdGhpcy5odHRwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVFcnJvclJlc3BvbnNlKCdIdHRwIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHJlcS5yZXF1ZXN0Qm9keVR5cGUgPT09IHZvaWQgMCkge1xuICAgICAgcmVxLnJlcXVlc3RCb2R5VHlwZSA9IFJlc291cmNlUmVxdWVzdEJvZHlUeXBlLkZPUk1fREFUQTtcbiAgICB9XG5cbiAgICB0aGlzLnNldERhdGFTZXJpYWxpemVyKHJlcS5yZXF1ZXN0Qm9keVR5cGUpO1xuXG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHRoaXMubWFwTWV0aG9kTmFtZShyZXEubWV0aG9kKTtcblxuICAgIGlmIChtZXRob2ROYW1lID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVFcnJvclJlc3BvbnNlKCdSZXF1ZXN0IG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuXG4gICAgbGV0IHVybCA9IHJlcS51cmwgfHwgJyc7XG4gICAgbGV0IHNlY29uZCA9IHJlcS5ib2R5O1xuXG4gICAgaWYgKHJlcS5xdWVyeSkge1xuICAgICAgdGhpcy5wcmVwYXJlUXVlcnkocmVxLnF1ZXJ5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZXRob2RXaXRoQm9keS5pbmRleE9mKG1ldGhvZE5hbWUpID4gLTEpIHtcbiAgICAgIGlmIChyZXEucXVlcnkpIHtcbiAgICAgICAgdXJsID0gdGhpcy5jcmVhdGVVcmxXaXRoUXVlcnkodXJsLCByZXEucXVlcnkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZWNvbmQgPSByZXEucXVlcnk7XG4gICAgfVxuXG5cbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5odHRwW21ldGhvZE5hbWVdKHVybCwgc2Vjb25kLCByZXEuaGVhZGVycywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgSHR0cCBwbHVnaW4gY2FsbCBmYWlsZWQgd2l0aDogJHtlLm1lc3NhZ2V9YCwgZSk7XG4gICAgICAgIHJlamVjdCh7c3RhdHVzOiAtMSwgaGVhZGVyczogW3tlcnJvcjogZS5tZXNzYWdlfV19KTtcbiAgICAgIH1cbiAgICB9KVxuICAgICAgLmNhdGNoKChyZXNwOiBhbnkpID0+IHRoaXMuY3JlYXRlUmVzcG9uc2UocmVzcCwgcmVxLCB0cnVlKSlcbiAgICAgIC50aGVuKChyZXNwOiBhbnkpID0+IHRoaXMuY3JlYXRlUmVzcG9uc2UocmVzcCwgcmVxKSk7XG5cbiAgICByZXR1cm4ge3Byb21pc2V9O1xuXG4gIH1cblxuICBwcml2YXRlIGluaXRIdHRwUGx1Z2luKCkge1xuICAgIGlmICh0aGlzLnRyeVRvU2V0UGx1Z2luKCkpIHtcbiAgICAgIHRoaXMucmVzb2x2ZURlZmVySW5pdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRyeVRvU2V0UGx1Z2luKCkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0NhbiBub3Qgc2V0IGh0dHAgcGx1Z2luIGFmdGVyIGRldmljZSByZWFkeScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzb2x2ZURlZmVySW5pdCgpO1xuICAgICAgfSwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdHJ5VG9TZXRQbHVnaW4oKTogYm9vbGVhbiB7XG5cbiAgICBpZiAoIXRoaXMuaHR0cCAmJiBjb3Jkb3ZhICYmIGNvcmRvdmEucGx1Z2luICYmIGNvcmRvdmEucGx1Z2luLmh0dHApIHtcbiAgICAgIHRoaXMuaHR0cCA9IGNvcmRvdmEucGx1Z2luLmh0dHA7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhdGhpcy5odHRwO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRGVmZXJJbml0KCkge1xuICAgIHRoaXMuaW5pdERlZmVyUmVzb2x2ZSgpO1xuICAgIHRoaXMuaW5pdERlZmVyUmVzb2x2ZSA9IG51bGw7XG4gICAgdGhpcy5pbml0RGVmZXJQcm9taXNlID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUmVzcG9uc2UocmVzcDogYW55LCByZXE6IElSZXNvdXJjZVJlcXVlc3QsIGlzRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8SVJlc291cmNlUmVzcG9uc2U+IHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIGNvbnN0IHJldDogSVJlc291cmNlUmVzcG9uc2UgPSB7XG4gICAgICAgIHN0YXR1czogcmVzcC5zdGF0dXMsXG4gICAgICAgIGJvZHk6IHJlc3AuZGF0YSB8fCByZXNwLmVycm9yLFxuICAgICAgICBoZWFkZXJzOiByZXNwLmhlYWRlcnNcbiAgICAgIH07XG5cbiAgICAgIHRoaXMucHJlcGFyZVJlc3BvbnNlQm9keShyZXQsIHJlcSwgaXNFcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcblxuICAgICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KHJldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKHJldCk7XG4gICAgICB9XG5cbiAgICB9KTtcblxuICB9XG5cblxuICBwcml2YXRlIGNyZWF0ZUVycm9yUmVzcG9uc2UobXNnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvbWlzZTogUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKG1zZykpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGF0YVNlcmlhbGl6ZXIocmVxdWVzdEJvZHlUeXBlOiBSZXNvdXJjZVJlcXVlc3RCb2R5VHlwZSkge1xuICAgIHN3aXRjaCAocmVxdWVzdEJvZHlUeXBlKSB7XG4gICAgICBjYXNlIFJlc291cmNlUmVxdWVzdEJvZHlUeXBlLkpTT046XG4gICAgICAgIHRoaXMuaHR0cC5zZXREYXRhU2VyaWFsaXplcignanNvbicpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZXNvdXJjZVJlcXVlc3RCb2R5VHlwZS5GT1JNX0RBVEE6XG4gICAgICAgIHRoaXMuaHR0cC5zZXREYXRhU2VyaWFsaXplcigndXJsZW5jb2RlZCcpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZXNvdXJjZVJlcXVlc3RCb2R5VHlwZS5URVhUOlxuICAgICAgICB0aGlzLmh0dHAuc2V0RGF0YVNlcmlhbGl6ZXIoJ3V0ZjgnKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUVycm9yUmVzcG9uc2UoJ1N1cHBvcnRlZCBvbmx5IGpzb24sIEZvcm1EYXRhIG9yIHRleHQgdHlwZXMnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1hcE1ldGhvZE5hbWUobWV0aG9kPzogUmVzb3VyY2VSZXF1ZXN0TWV0aG9kKTogc3RyaW5nIHwgbnVsbCB7XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSBSZXNvdXJjZVJlcXVlc3RNZXRob2QuUG9zdDpcbiAgICAgICAgcmV0dXJuICdwb3N0JztcblxuICAgICAgY2FzZSBSZXNvdXJjZVJlcXVlc3RNZXRob2QuR2V0OlxuICAgICAgICByZXR1cm4gJ2dldCc7XG5cbiAgICAgIGNhc2UgUmVzb3VyY2VSZXF1ZXN0TWV0aG9kLlB1dDpcbiAgICAgICAgcmV0dXJuICdwdXQnO1xuXG4gICAgICBjYXNlIFJlc291cmNlUmVxdWVzdE1ldGhvZC5QYXRjaDpcbiAgICAgICAgcmV0dXJuICdwYXRjaCc7XG5cbiAgICAgIGNhc2UgUmVzb3VyY2VSZXF1ZXN0TWV0aG9kLkRlbGV0ZTpcbiAgICAgICAgcmV0dXJuICdkZWxldGUnO1xuXG4gICAgICBjYXNlIFJlc291cmNlUmVxdWVzdE1ldGhvZC5IZWFkOlxuICAgICAgICByZXR1cm4gJ2hlYWQnO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVF1ZXJ5KHF1ZXJ5OiBhbnkpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBxdWVyeSkge1xuICAgICAgaWYgKHF1ZXJ5Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgcXVlcnlba2V5XSA9IHF1ZXJ5W2tleV0udG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVVybFdpdGhRdWVyeSh1cmw6IHN0cmluZywgcXVlcnk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nID0gT2JqZWN0LmtleXMocXVlcnkpXG4gICAgICAubWFwKChrZXk6IHN0cmluZykgPT4gYCR7a2V5fT0ke3F1ZXJ5W2tleV19YClcbiAgICAgIC5qb2luKCcmJyk7XG5cbiAgICByZXR1cm4gdXJsICsgKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIGVuY29kZVVSSShwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlUmVzcG9uc2VCb2R5KHJldDogSVJlc291cmNlUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXE6IElSZXNvdXJjZVJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Vycm9yOiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3Q6IGFueSkge1xuXG4gICAgaWYgKHJldC5ib2R5KSB7XG5cbiAgICAgIHN3aXRjaCAocmVxLnJlc3BvbnNlQm9keVR5cGUpIHtcblxuICAgICAgICBjYXNlIFJlc291cmNlUmVzcG9uc2VCb2R5VHlwZS5Kc29uOlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXQuYm9keSA9IEpTT04ucGFyc2UocmV0LmJvZHkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIG5vb3BcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFJlc291cmNlUmVzcG9uc2VCb2R5VHlwZS5CbG9iOlxuICAgICAgICAgIHJldC5ib2R5ID0gbmV3IEJsb2IoW3JldC5ib2R5XSwge3R5cGU6ICd0ZXh0L3BsYWluJ30pO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBSZXNvdXJjZVJlc3BvbnNlQm9keVR5cGUuQXJyYXlCdWZmZXI6XG4gICAgICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0LmJvZHkgPSB0aGlzLnJlc3VsdDtcblxuICAgICAgICAgICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KHJldCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHJldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGZpbGVSZWFkZXIub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdCh7XG4gICAgICAgICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgICAgICAgYm9keTogbnVsbCxcbiAgICAgICAgICAgICAgaGVhZGVyczoge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKFxuICAgICAgICAgICAgbmV3IEJsb2IoW3JldC5ib2R5XSwge1xuICAgICAgICAgICAgICB0eXBlOiAndGV4dC9wbGFpbidcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG4iXX0=