breeze-client
Version:
Breeze data management for JavaScript clients
139 lines • 21.9 kB
JavaScript
import { HttpHeaders, HttpRequest, HttpResponse } from "@angular/common/http";
import { config, core } from "breeze-client";
import { filter, map } from "rxjs/operators";
import { appendQueryStringParameter, encodeParams } from "./adapter-core";
export class AjaxHttpClientAdapter {
http;
static adapterName = 'httpclient';
name = AjaxHttpClientAdapter.adapterName;
defaultSettings = {};
requestInterceptor;
constructor(http) {
this.http = http;
}
static register(http, breezeConfig) {
breezeConfig = breezeConfig || config;
breezeConfig.registerAdapter("ajax", function () { return new AjaxHttpClientAdapter(http); });
return breezeConfig.initializeAdapterInstance("ajax", AjaxHttpClientAdapter.adapterName, true);
}
initialize() { }
ajax(config) {
if (!this.http) {
throw new Error('Unable to locate angular http module for ajax adapter');
}
// merge default DataSetAdapter Settings with config arg
if (!core.isEmpty(this.defaultSettings)) {
let compositeConfig = core.extend({}, this.defaultSettings);
config = core.extend(compositeConfig, config);
// extend is shallow; extend headers separately
let headers = core.extend({}, this.defaultSettings['headers']); // copy default headers 1st
config['headers'] = core.extend(headers, config.headers);
}
if (config.crossDomain) {
throw new Error(this.name + ' does not support JSONP (crossDomain) requests');
}
// Hack: Not sure how Angular handles writing 'search' parameters to the url.
// so this approach takes over the url param writing completely.
const parameters = core.isEmpty(config.params) ? null : encodeParams(config.params);
const url = appendQueryStringParameter(config.url, parameters);
let headers = new HttpHeaders(config.headers || {});
if (!headers.has('Content-Type')) {
if (config.type !== 'GET' && config.type !== 'DELETE' && !!config.contentType) {
headers = headers.set('Content-Type', config.contentType || 'application/json; charset=utf-8');
}
}
let body = config.data;
let request = new HttpRequest((config.type || 'GET').toUpperCase(), url, body, { headers: headers, responseType: "text" });
let requestInfo = {
adapter: this,
request: request,
dsaConfig: config,
success: successFn,
error: errorFn // adapter's error callback
};
if (core.isFunction(this.requestInterceptor)) {
this.requestInterceptor(requestInfo);
if (this.requestInterceptor['oneTime']) {
this.requestInterceptor = null;
}
}
if (requestInfo.request) { // exists unless requestInterceptor killed it.
const ffilter = filter((response) => response instanceof HttpResponse);
const fmap = map(extractData);
fmap(ffilter(this.http.request(requestInfo.request)))
.forEach(requestInfo.success)
.catch(requestInfo.error);
}
function extractData(event) {
let response = event;
let data;
let dt = requestInfo.dsaConfig.dataType;
// beware:`res.json` and `res.text` will be async some day
if (dt && dt !== 'json') {
data = response.body;
}
else {
data = JSON.parse(response.body);
}
return { data, response };
}
function successFn(arg) {
if (arg.response.status < 200 || arg.response.status >= 300) {
throw { data: arg.data, response: arg.response };
}
let httpResponse = {
config: requestInfo.request,
data: arg.data,
getHeaders: makeGetHeaders(arg.response.headers),
status: arg.response.status
};
httpResponse['ngConfig'] = requestInfo.request;
httpResponse['statusText'] = arg.response.statusText;
httpResponse['response'] = arg.response;
config.success(httpResponse);
}
function errorFn(response) {
if (response instanceof Error) {
throw response; // program error; nothing we can do
}
else {
let data;
if (response.error instanceof HttpResponse) {
data = response.error.body;
}
else if (response.error instanceof Error) {
data = response.error.message;
}
else {
data = response.error;
}
// Timeout appears as an error with status===0 and no data.
if (response.status === 0 && data == null) {
data = 'timeout';
}
let errorMessage = response.status + ": " + response.statusText;
if (data && typeof data === 'object') {
data["message"] = data["message"] || errorMessage; // breeze looks at the message property
}
if (!data) {
data = errorMessage; // Return the error message as data
}
let httpResponse = {
config: requestInfo.request,
data: data,
getHeaders: makeGetHeaders(response.headers),
status: response.status
};
httpResponse['ngConfig'] = requestInfo.request;
httpResponse['statusText'] = response.statusText;
httpResponse['response'] = response;
config.error(httpResponse); // send error to breeze error handler
}
}
}
}
///// Helpers ////
function makeGetHeaders(headers) {
return function getHeaders(headerName) { return headers.getAll(headerName).join('\r\n'); };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci1hamF4LWh0dHBjbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlci1hamF4LWh0dHBjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QyxXQUFXLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hILE9BQU8sRUFBYyxNQUFNLEVBQUUsSUFBSSxFQUF5RixNQUFNLGVBQWUsQ0FBQztBQUNoSixPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRSxNQUFNLE9BQU8scUJBQXFCO0lBTWI7SUFMbkIsTUFBTSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7SUFDbEMsSUFBSSxHQUFHLHFCQUFxQixDQUFDLFdBQVcsQ0FBQztJQUN6QyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLGtCQUFrQixDQUF5QjtJQUUzQyxZQUFtQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO0lBQUksQ0FBQztJQUV4QyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQWdCLEVBQUUsWUFBMkI7UUFDM0QsWUFBWSxHQUFHLFlBQVksSUFBSSxNQUFNLENBQUM7UUFDdEMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQU8sY0FBYyxPQUFPLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRyxPQUFPLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBMEIsQ0FBQztJQUMxSCxDQUFDO0lBRUQsVUFBVSxLQUFLLENBQUM7SUFFaEIsSUFBSSxDQUFDLE1BQWtCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1NBQzFFO1FBRUQsd0RBQXdEO1FBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUN2QyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDNUQsTUFBTSxHQUFlLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzFELCtDQUErQztZQUMvQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQywyQkFBMkI7WUFDM0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMxRDtRQUVELElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0RBQWdELENBQUMsQ0FBQztTQUMvRTtRQUVELDZFQUE2RTtRQUM3RSxnRUFBZ0U7UUFDaEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRixNQUFNLEdBQUcsR0FBRywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRS9ELElBQUksT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDaEMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtnQkFDN0UsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUMxQixNQUFNLENBQUMsV0FBVyxJQUFJLGlDQUFpQyxDQUFDLENBQUM7YUFDcEU7U0FDRjtRQUVELElBQUksSUFBSSxHQUFRLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRTNILElBQUksV0FBVyxHQUFHO1lBQ2hCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLE9BQU87WUFDaEIsU0FBUyxFQUFFLE1BQU07WUFDakIsT0FBTyxFQUFFLFNBQVM7WUFDbEIsS0FBSyxFQUFFLE9BQU8sQ0FBTSwyQkFBMkI7U0FDaEQsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBa0IsQ0FBQyxDQUFDO1lBQzVDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUN0QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO2FBQ2hDO1NBQ0Y7UUFFRCxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSw4Q0FBOEM7WUFDdkUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsUUFBd0IsRUFBRSxFQUFFLENBQUMsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDO1lBQ3ZGLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUU5QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUNsRCxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztpQkFDNUIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM3QjtRQUVELFNBQVMsV0FBVyxDQUFDLEtBQXFCO1lBQ3hDLElBQUksUUFBUSxHQUFHLEtBQTBCLENBQUM7WUFDMUMsSUFBSSxJQUFTLENBQUM7WUFDZCxJQUFJLEVBQUUsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUN4QywwREFBMEQ7WUFDMUQsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLE1BQU0sRUFBRTtnQkFDdkIsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7YUFDdEI7aUJBQU07Z0JBQ0wsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2xDO1lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQsU0FBUyxTQUFTLENBQUMsR0FBK0M7WUFDaEUsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFO2dCQUMzRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNsRDtZQUVELElBQUksWUFBWSxHQUF1QjtnQkFDckMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxPQUFPO2dCQUMzQixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7Z0JBQ2QsVUFBVSxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztnQkFDaEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTTthQUM1QixDQUFDO1lBQ0YsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7WUFDL0MsWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQ3JELFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUVELFNBQVMsT0FBTyxDQUFDLFFBQTJCO1lBQzFDLElBQUksUUFBUSxZQUFZLEtBQUssRUFBRTtnQkFDN0IsTUFBTSxRQUFRLENBQUMsQ0FBQyxtQ0FBbUM7YUFDcEQ7aUJBQU07Z0JBQ0wsSUFBSSxJQUFTLENBQUM7Z0JBQ2QsSUFBSSxRQUFRLENBQUMsS0FBSyxZQUFZLFlBQVksRUFBRTtvQkFDMUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO2lCQUM1QjtxQkFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLFlBQVksS0FBSyxFQUFFO29CQUMxQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7aUJBQy9CO3FCQUFNO29CQUNMLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO2lCQUN2QjtnQkFFRCwyREFBMkQ7Z0JBQzNELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtvQkFDekMsSUFBSSxHQUFHLFNBQVMsQ0FBQztpQkFDbEI7Z0JBRUQsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztnQkFDaEUsSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO29CQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFFLHVDQUF1QztpQkFDNUY7Z0JBQ0QsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDVCxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUcsbUNBQW1DO2lCQUMzRDtnQkFDRCxJQUFJLFlBQVksR0FBdUI7b0JBQ3JDLE1BQU0sRUFBRSxXQUFXLENBQUMsT0FBTztvQkFDM0IsSUFBSSxFQUFFLElBQUk7b0JBQ1YsVUFBVSxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO29CQUM1QyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07aUJBQ3hCLENBQUM7Z0JBQ0YsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7Z0JBQy9DLFlBQVksQ0FBQyxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO2dCQUNqRCxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDO2dCQUVwQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMscUNBQXFDO2FBQ2xFO1FBQ0gsQ0FBQztJQUNILENBQUM7O0FBSUgsa0JBQWtCO0FBRWxCLFNBQVMsY0FBYyxDQUFDLE9BQW9CO0lBQzFDLE9BQU8sU0FBUyxVQUFVLENBQUMsVUFBbUIsSUFBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwSGVhZGVycywgSHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBBamF4Q29uZmlnLCBjb25maWcsIGNvcmUsIEh0dHBSZXNwb25zZSBhcyBCcmVlemVIdHRwUmVzcG9uc2UsIEJyZWV6ZUNvbmZpZywgQWpheFJlcXVlc3RJbnRlcmNlcHRvciwgQWpheEFkYXB0ZXIgfSBmcm9tIFwiYnJlZXplLWNsaWVudFwiO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBhcHBlbmRRdWVyeVN0cmluZ1BhcmFtZXRlciwgZW5jb2RlUGFyYW1zIH0gZnJvbSBcIi4vYWRhcHRlci1jb3JlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWpheEh0dHBDbGllbnRBZGFwdGVyIGltcGxlbWVudHMgQWpheEFkYXB0ZXIge1xyXG4gIHN0YXRpYyBhZGFwdGVyTmFtZSA9ICdodHRwY2xpZW50JztcclxuICBuYW1lID0gQWpheEh0dHBDbGllbnRBZGFwdGVyLmFkYXB0ZXJOYW1lO1xyXG4gIGRlZmF1bHRTZXR0aW5ncyA9IHt9O1xyXG4gIHJlcXVlc3RJbnRlcmNlcHRvcjogQWpheFJlcXVlc3RJbnRlcmNlcHRvcjtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGh0dHA6IEh0dHBDbGllbnQpIHsgfVxyXG5cclxuICBzdGF0aWMgcmVnaXN0ZXIoaHR0cDogSHR0cENsaWVudCwgYnJlZXplQ29uZmlnPzogQnJlZXplQ29uZmlnKSB7XHJcbiAgICBicmVlemVDb25maWcgPSBicmVlemVDb25maWcgfHwgY29uZmlnO1xyXG4gICAgYnJlZXplQ29uZmlnLnJlZ2lzdGVyQWRhcHRlcihcImFqYXhcIiwgPGFueT5mdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgQWpheEh0dHBDbGllbnRBZGFwdGVyKGh0dHApOyB9KTtcclxuICAgIHJldHVybiBicmVlemVDb25maWcuaW5pdGlhbGl6ZUFkYXB0ZXJJbnN0YW5jZShcImFqYXhcIiwgQWpheEh0dHBDbGllbnRBZGFwdGVyLmFkYXB0ZXJOYW1lLCB0cnVlKSBhcyBBamF4SHR0cENsaWVudEFkYXB0ZXI7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplKCkgeyB9XHJcblxyXG4gIGFqYXgoY29uZmlnOiBBamF4Q29uZmlnKSB7XHJcbiAgICBpZiAoIXRoaXMuaHR0cCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBsb2NhdGUgYW5ndWxhciBodHRwIG1vZHVsZSBmb3IgYWpheCBhZGFwdGVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbWVyZ2UgZGVmYXVsdCBEYXRhU2V0QWRhcHRlciBTZXR0aW5ncyB3aXRoIGNvbmZpZyBhcmdcclxuICAgIGlmICghY29yZS5pc0VtcHR5KHRoaXMuZGVmYXVsdFNldHRpbmdzKSkge1xyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZmlnID0gY29yZS5leHRlbmQoe30sIHRoaXMuZGVmYXVsdFNldHRpbmdzKTtcclxuICAgICAgY29uZmlnID0gPEFqYXhDb25maWc+Y29yZS5leHRlbmQoY29tcG9zaXRlQ29uZmlnLCBjb25maWcpO1xyXG4gICAgICAvLyBleHRlbmQgaXMgc2hhbGxvdzsgZXh0ZW5kIGhlYWRlcnMgc2VwYXJhdGVseVxyXG4gICAgICBsZXQgaGVhZGVycyA9IGNvcmUuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRTZXR0aW5nc1snaGVhZGVycyddKTsgLy8gY29weSBkZWZhdWx0IGhlYWRlcnMgMXN0XHJcbiAgICAgIGNvbmZpZ1snaGVhZGVycyddID0gY29yZS5leHRlbmQoaGVhZGVycywgY29uZmlnLmhlYWRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb25maWcuY3Jvc3NEb21haW4pIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMubmFtZSArICcgZG9lcyBub3Qgc3VwcG9ydCBKU09OUCAoY3Jvc3NEb21haW4pIHJlcXVlc3RzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFjazogTm90IHN1cmUgaG93IEFuZ3VsYXIgaGFuZGxlcyB3cml0aW5nICdzZWFyY2gnIHBhcmFtZXRlcnMgdG8gdGhlIHVybC5cclxuICAgIC8vIHNvIHRoaXMgYXBwcm9hY2ggdGFrZXMgb3ZlciB0aGUgdXJsIHBhcmFtIHdyaXRpbmcgY29tcGxldGVseS5cclxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBjb3JlLmlzRW1wdHkoY29uZmlnLnBhcmFtcykgPyBudWxsIDogZW5jb2RlUGFyYW1zKGNvbmZpZy5wYXJhbXMpO1xyXG4gICAgY29uc3QgdXJsID0gYXBwZW5kUXVlcnlTdHJpbmdQYXJhbWV0ZXIoY29uZmlnLnVybCwgcGFyYW1ldGVycyk7XHJcblxyXG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoY29uZmlnLmhlYWRlcnMgfHwge30pO1xyXG4gICAgaWYgKCFoZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHtcclxuICAgICAgaWYgKGNvbmZpZy50eXBlICE9PSAnR0VUJyAmJiBjb25maWcudHlwZSAhPT0gJ0RFTEVURScgJiYgISFjb25maWcuY29udGVudFR5cGUpIHtcclxuICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsXHJcbiAgICAgICAgICA8c3RyaW5nPmNvbmZpZy5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGJvZHk6IGFueSA9IGNvbmZpZy5kYXRhO1xyXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3QoKGNvbmZpZy50eXBlIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpLCB1cmwsIGJvZHksIHsgaGVhZGVyczogaGVhZGVycywgcmVzcG9uc2VUeXBlOiBcInRleHRcIiB9KTtcclxuXHJcbiAgICBsZXQgcmVxdWVzdEluZm8gPSB7XHJcbiAgICAgIGFkYXB0ZXI6IHRoaXMsICAgICAgLy8gdGhpcyBhZGFwdGVyXHJcbiAgICAgIHJlcXVlc3Q6IHJlcXVlc3QsICAgLy8gdGhlIGh0dHAgcmVxdWVzdCBmcm9tIHRoZSByZXF1ZXN0T3B0aW9uc1xyXG4gICAgICBkc2FDb25maWc6IGNvbmZpZywgIC8vIHRoZSBjb25maWcgYXJnIGZyb20gdGhlIGNhbGxpbmcgQnJlZXplIERhdGFTZXJ2aWNlQWRhcHRlclxyXG4gICAgICBzdWNjZXNzOiBzdWNjZXNzRm4sIC8vIGFkYXB0ZXIncyBzdWNjZXNzIGNhbGxiYWNrXHJcbiAgICAgIGVycm9yOiBlcnJvckZuICAgICAgLy8gYWRhcHRlcidzIGVycm9yIGNhbGxiYWNrXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChjb3JlLmlzRnVuY3Rpb24odGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IpKSB7XHJcbiAgICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9yKHJlcXVlc3RJbmZvIGFzIGFueSk7XHJcbiAgICAgIGlmICh0aGlzLnJlcXVlc3RJbnRlcmNlcHRvclsnb25lVGltZSddKSB7XHJcbiAgICAgICAgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcXVlc3RJbmZvLnJlcXVlc3QpIHsgLy8gZXhpc3RzIHVubGVzcyByZXF1ZXN0SW50ZXJjZXB0b3Iga2lsbGVkIGl0LlxyXG4gICAgICBjb25zdCBmZmlsdGVyID0gZmlsdGVyKChyZXNwb25zZTogSHR0cEV2ZW50PGFueT4pID0+IHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKTtcclxuICAgICAgY29uc3QgZm1hcCA9IG1hcChleHRyYWN0RGF0YSk7XHJcblxyXG4gICAgICBmbWFwKGZmaWx0ZXIodGhpcy5odHRwLnJlcXVlc3QocmVxdWVzdEluZm8ucmVxdWVzdCkpKVxyXG4gICAgICAgIC5mb3JFYWNoKHJlcXVlc3RJbmZvLnN1Y2Nlc3MpXHJcbiAgICAgICAgLmNhdGNoKHJlcXVlc3RJbmZvLmVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBleHRyYWN0RGF0YShldmVudDogSHR0cEV2ZW50PGFueT4pIHtcclxuICAgICAgbGV0IHJlc3BvbnNlID0gZXZlbnQgYXMgSHR0cFJlc3BvbnNlPGFueT47XHJcbiAgICAgIGxldCBkYXRhOiBhbnk7XHJcbiAgICAgIGxldCBkdCA9IHJlcXVlc3RJbmZvLmRzYUNvbmZpZy5kYXRhVHlwZTtcclxuICAgICAgLy8gYmV3YXJlOmByZXMuanNvbmAgYW5kIGByZXMudGV4dGAgd2lsbCBiZSBhc3luYyBzb21lIGRheVxyXG4gICAgICBpZiAoZHQgJiYgZHQgIT09ICdqc29uJykge1xyXG4gICAgICAgIGRhdGEgPSByZXNwb25zZS5ib2R5O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7IGRhdGEsIHJlc3BvbnNlIH07XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc3VjY2Vzc0ZuKGFyZzogeyBkYXRhOiBhbnksIHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8YW55PiB9KSB7XHJcbiAgICAgIGlmIChhcmcucmVzcG9uc2Uuc3RhdHVzIDwgMjAwIHx8IGFyZy5yZXNwb25zZS5zdGF0dXMgPj0gMzAwKSB7XHJcbiAgICAgICAgdGhyb3cgeyBkYXRhOiBhcmcuZGF0YSwgcmVzcG9uc2U6IGFyZy5yZXNwb25zZSB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgaHR0cFJlc3BvbnNlOiBCcmVlemVIdHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgY29uZmlnOiByZXF1ZXN0SW5mby5yZXF1ZXN0LFxyXG4gICAgICAgIGRhdGE6IGFyZy5kYXRhLFxyXG4gICAgICAgIGdldEhlYWRlcnM6IG1ha2VHZXRIZWFkZXJzKGFyZy5yZXNwb25zZS5oZWFkZXJzKSxcclxuICAgICAgICBzdGF0dXM6IGFyZy5yZXNwb25zZS5zdGF0dXNcclxuICAgICAgfTtcclxuICAgICAgaHR0cFJlc3BvbnNlWyduZ0NvbmZpZyddID0gcmVxdWVzdEluZm8ucmVxdWVzdDtcclxuICAgICAgaHR0cFJlc3BvbnNlWydzdGF0dXNUZXh0J10gPSBhcmcucmVzcG9uc2Uuc3RhdHVzVGV4dDtcclxuICAgICAgaHR0cFJlc3BvbnNlWydyZXNwb25zZSddID0gYXJnLnJlc3BvbnNlO1xyXG4gICAgICBjb25maWcuc3VjY2VzcyhodHRwUmVzcG9uc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGVycm9yRm4ocmVzcG9uc2U6IEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgcmVzcG9uc2U7IC8vIHByb2dyYW0gZXJyb3I7IG5vdGhpbmcgd2UgY2FuIGRvXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGRhdGE6IGFueTtcclxuICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpIHtcclxuICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5lcnJvci5ib2R5O1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgZGF0YSA9IHJlc3BvbnNlLmVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5lcnJvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFRpbWVvdXQgYXBwZWFycyBhcyBhbiBlcnJvciB3aXRoIHN0YXR1cz09PTAgYW5kIG5vIGRhdGEuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMCAmJiBkYXRhID09IG51bGwpIHtcclxuICAgICAgICAgIGRhdGEgPSAndGltZW91dCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzICsgXCI6IFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dDtcclxuICAgICAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgIGRhdGFbXCJtZXNzYWdlXCJdID0gZGF0YVtcIm1lc3NhZ2VcIl0gfHwgZXJyb3JNZXNzYWdlOyAgLy8gYnJlZXplIGxvb2tzIGF0IHRoZSBtZXNzYWdlIHByb3BlcnR5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgZGF0YSA9IGVycm9yTWVzc2FnZTsgICAvLyBSZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UgYXMgZGF0YVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaHR0cFJlc3BvbnNlOiBCcmVlemVIdHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICBjb25maWc6IHJlcXVlc3RJbmZvLnJlcXVlc3QsXHJcbiAgICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgICAgZ2V0SGVhZGVyczogbWFrZUdldEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1c1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaHR0cFJlc3BvbnNlWyduZ0NvbmZpZyddID0gcmVxdWVzdEluZm8ucmVxdWVzdDtcclxuICAgICAgICBodHRwUmVzcG9uc2VbJ3N0YXR1c1RleHQnXSA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XHJcbiAgICAgICAgaHR0cFJlc3BvbnNlWydyZXNwb25zZSddID0gcmVzcG9uc2U7XHJcblxyXG4gICAgICAgIGNvbmZpZy5lcnJvcihodHRwUmVzcG9uc2UpOyAvLyBzZW5kIGVycm9yIHRvIGJyZWV6ZSBlcnJvciBoYW5kbGVyXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG4vLy8vLyBIZWxwZXJzIC8vLy9cclxuXHJcbmZ1bmN0aW9uIG1ha2VHZXRIZWFkZXJzKGhlYWRlcnM6IEh0dHBIZWFkZXJzKSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldEhlYWRlcnMoaGVhZGVyTmFtZT86IHN0cmluZykgeyByZXR1cm4gaGVhZGVycy5nZXRBbGwoaGVhZGVyTmFtZSkuam9pbignXFxyXFxuJyk7IH07XHJcbn0iXX0=