@stemy/ngx-utils 10.2.44 → 10.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -27
- package/bundles/stemy-ngx-utils.umd.js +5654 -5640
- package/bundles/stemy-ngx-utils.umd.js.map +1 -1
- package/bundles/stemy-ngx-utils.umd.min.js +1 -1
- package/bundles/stemy-ngx-utils.umd.min.js.map +1 -1
- package/esm2015/ngx-utils/common-types.js +111 -111
- package/esm2015/ngx-utils/components/dynamic-table/dynamic-table.component.js +139 -139
- package/esm2015/ngx-utils/components/pagination-menu/pagination-menu.component.js +96 -96
- package/esm2015/ngx-utils/components/unordered-list/unordered-list.component.js +51 -51
- package/esm2015/ngx-utils/directives/async-method.directive.js +58 -58
- package/esm2015/ngx-utils/directives/background.directive.js +51 -51
- package/esm2015/ngx-utils/directives/dynamic-table-template.directive.js +19 -19
- package/esm2015/ngx-utils/directives/global-template.directive.js +27 -27
- package/esm2015/ngx-utils/directives/icon.directive.js +59 -59
- package/esm2015/ngx-utils/directives/ngx-template-outlet.directive.js +88 -88
- package/esm2015/ngx-utils/directives/pagination-item.directive.js +33 -33
- package/esm2015/ngx-utils/directives/pagination.directive.js +76 -71
- package/esm2015/ngx-utils/directives/resource-if.directive.js +51 -51
- package/esm2015/ngx-utils/directives/sticky-class.directive.js +35 -35
- package/esm2015/ngx-utils/directives/sticky.directive.js +48 -48
- package/esm2015/ngx-utils/directives/unordered-list-item.directive.js +70 -70
- package/esm2015/ngx-utils/directives/unordered-list-template.directive.js +26 -26
- package/esm2015/ngx-utils/ngx-utils.module.js +232 -232
- package/esm2015/ngx-utils/pipes/chunk.pipe.js +21 -21
- package/esm2015/ngx-utils/pipes/entries.pipe.js +24 -24
- package/esm2015/ngx-utils/pipes/extra-item-properties.pipe.js +27 -27
- package/esm2015/ngx-utils/pipes/filter.pipe.js +38 -38
- package/esm2015/ngx-utils/pipes/find.pipe.js +25 -25
- package/esm2015/ngx-utils/pipes/format-number.pipe.js +19 -19
- package/esm2015/ngx-utils/pipes/get-offset.pipe.js +13 -13
- package/esm2015/ngx-utils/pipes/get-type.pipe.js +12 -12
- package/esm2015/ngx-utils/pipes/global-template.pipe.js +35 -35
- package/esm2015/ngx-utils/pipes/group-by.pipe.js +23 -23
- package/esm2015/ngx-utils/pipes/is-type.pipe.js +12 -12
- package/esm2015/ngx-utils/pipes/join.pipe.js +15 -15
- package/esm2015/ngx-utils/pipes/keys.pipe.js +18 -18
- package/esm2015/ngx-utils/pipes/map.pipe.js +25 -25
- package/esm2015/ngx-utils/pipes/max.pipe.js +22 -22
- package/esm2015/ngx-utils/pipes/min.pipe.js +22 -22
- package/esm2015/ngx-utils/pipes/reduce.pipe.js +26 -26
- package/esm2015/ngx-utils/pipes/remap.pipe.js +28 -28
- package/esm2015/ngx-utils/pipes/replace.pipe.js +12 -12
- package/esm2015/ngx-utils/pipes/reverse.pipe.js +20 -20
- package/esm2015/ngx-utils/pipes/round.pipe.js +19 -19
- package/esm2015/ngx-utils/pipes/safe-html.pipe.js +32 -32
- package/esm2015/ngx-utils/pipes/translate.pipe.js +81 -81
- package/esm2015/ngx-utils/pipes/values.pipe.js +18 -18
- package/esm2015/ngx-utils/plugins/resize-event.plugin.js +59 -59
- package/esm2015/ngx-utils/plugins/scroll-event.plugin.js +52 -52
- package/esm2015/ngx-utils/services/acl.service.js +78 -78
- package/esm2015/ngx-utils/services/api.service.js +35 -35
- package/esm2015/ngx-utils/services/auth.service.js +14 -14
- package/esm2015/ngx-utils/services/base-http.client.js +46 -46
- package/esm2015/ngx-utils/services/base-http.service.js +274 -274
- package/esm2015/ngx-utils/services/config.service.js +95 -95
- package/esm2015/ngx-utils/services/error-handler.service.js +49 -49
- package/esm2015/ngx-utils/services/events.service.js +24 -24
- package/esm2015/ngx-utils/services/formatter.service.js +44 -44
- package/esm2015/ngx-utils/services/global-template.service.js +35 -35
- package/esm2015/ngx-utils/services/icon.service.js +24 -24
- package/esm2015/ngx-utils/services/language.service.js +117 -117
- package/esm2015/ngx-utils/services/open-api.service.js +41 -41
- package/esm2015/ngx-utils/services/promise.service.js +49 -49
- package/esm2015/ngx-utils/services/state.service.js +143 -143
- package/esm2015/ngx-utils/services/static-language.service.js +144 -144
- package/esm2015/ngx-utils/services/storage.service.js +48 -48
- package/esm2015/ngx-utils/services/toaster.service.js +29 -29
- package/esm2015/ngx-utils/services/translated-url.serializer.js +70 -70
- package/esm2015/ngx-utils/services/universal.service.js +73 -73
- package/esm2015/ngx-utils/utils/ajax-request-handler.js +40 -40
- package/esm2015/ngx-utils/utils/array.utils.js +100 -90
- package/esm2015/ngx-utils/utils/auth.guard.js +153 -153
- package/esm2015/ngx-utils/utils/canvas.utils.js +388 -388
- package/esm2015/ngx-utils/utils/date.utils.js +28 -28
- package/esm2015/ngx-utils/utils/file.utils.js +90 -90
- package/esm2015/ngx-utils/utils/generic-value.js +20 -20
- package/esm2015/ngx-utils/utils/geometry.js +132 -132
- package/esm2015/ngx-utils/utils/initializer.js +17 -17
- package/esm2015/ngx-utils/utils/loader.utils.js +55 -55
- package/esm2015/ngx-utils/utils/math.utils.js +15 -15
- package/esm2015/ngx-utils/utils/object.utils.js +248 -248
- package/esm2015/ngx-utils/utils/observable.utils.js +63 -63
- package/esm2015/ngx-utils/utils/reflect.utils.js +33 -33
- package/esm2015/ngx-utils/utils/set.utils.js +20 -20
- package/esm2015/ngx-utils/utils/string.utils.js +28 -28
- package/esm2015/ngx-utils/utils/timer.utils.js +52 -52
- package/esm2015/ngx-utils/utils/unique.utils.js +24 -24
- package/esm2015/ngx-utils/utils/vector.js +77 -77
- package/esm2015/public_api.js +83 -83
- package/esm2015/stemy-ngx-utils.js +7 -7
- package/fesm2015/stemy-ngx-utils.js +4552 -4537
- package/fesm2015/stemy-ngx-utils.js.map +1 -1
- package/ngx-utils/common-types.d.ts +284 -284
- package/ngx-utils/components/dynamic-table/dynamic-table.component.d.ts +43 -43
- package/ngx-utils/components/pagination-menu/pagination-menu.component.d.ts +28 -28
- package/ngx-utils/components/unordered-list/unordered-list.component.d.ts +22 -22
- package/ngx-utils/directives/async-method.directive.d.ts +16 -16
- package/ngx-utils/directives/background.directive.d.ts +14 -14
- package/ngx-utils/directives/dynamic-table-template.directive.d.ts +8 -8
- package/ngx-utils/directives/global-template.directive.d.ts +10 -10
- package/ngx-utils/directives/icon.directive.d.ts +20 -20
- package/ngx-utils/directives/ngx-template-outlet.directive.d.ts +14 -14
- package/ngx-utils/directives/pagination-item.directive.d.ts +12 -12
- package/ngx-utils/directives/pagination.directive.d.ts +22 -21
- package/ngx-utils/directives/resource-if.directive.d.ts +16 -16
- package/ngx-utils/directives/sticky-class.directive.d.ts +12 -12
- package/ngx-utils/directives/sticky.directive.d.ts +16 -16
- package/ngx-utils/directives/unordered-list-item.directive.d.ts +25 -25
- package/ngx-utils/directives/unordered-list-template.directive.d.ts +10 -10
- package/ngx-utils/ngx-utils.module.d.ts +76 -76
- package/ngx-utils/pipes/chunk.pipe.d.ts +4 -4
- package/ngx-utils/pipes/entries.pipe.d.ts +9 -9
- package/ngx-utils/pipes/extra-item-properties.pipe.d.ts +5 -5
- package/ngx-utils/pipes/filter.pipe.d.ts +5 -5
- package/ngx-utils/pipes/find.pipe.d.ts +5 -5
- package/ngx-utils/pipes/format-number.pipe.d.ts +7 -7
- package/ngx-utils/pipes/get-offset.pipe.d.ts +4 -4
- package/ngx-utils/pipes/get-type.pipe.d.ts +4 -4
- package/ngx-utils/pipes/global-template.pipe.d.ts +13 -13
- package/ngx-utils/pipes/group-by.pipe.d.ts +5 -5
- package/ngx-utils/pipes/is-type.pipe.d.ts +4 -4
- package/ngx-utils/pipes/join.pipe.d.ts +4 -4
- package/ngx-utils/pipes/keys.pipe.d.ts +4 -4
- package/ngx-utils/pipes/map.pipe.d.ts +5 -5
- package/ngx-utils/pipes/max.pipe.d.ts +4 -4
- package/ngx-utils/pipes/min.pipe.d.ts +4 -4
- package/ngx-utils/pipes/reduce.pipe.d.ts +5 -5
- package/ngx-utils/pipes/remap.pipe.d.ts +4 -4
- package/ngx-utils/pipes/replace.pipe.d.ts +4 -4
- package/ngx-utils/pipes/reverse.pipe.d.ts +4 -4
- package/ngx-utils/pipes/round.pipe.d.ts +7 -7
- package/ngx-utils/pipes/safe-html.pipe.d.ts +7 -7
- package/ngx-utils/pipes/translate.pipe.d.ts +15 -15
- package/ngx-utils/pipes/values.pipe.d.ts +4 -4
- package/ngx-utils/plugins/resize-event.plugin.d.ts +10 -10
- package/ngx-utils/plugins/scroll-event.plugin.d.ts +11 -11
- package/ngx-utils/services/acl.service.d.ts +12 -12
- package/ngx-utils/services/api.service.d.ts +14 -14
- package/ngx-utils/services/auth.service.d.ts +8 -8
- package/ngx-utils/services/base-http.client.d.ts +12 -12
- package/ngx-utils/services/base-http.service.d.ts +42 -42
- package/ngx-utils/services/config.service.d.ts +21 -21
- package/ngx-utils/services/error-handler.service.d.ts +10 -10
- package/ngx-utils/services/events.service.d.ts +11 -11
- package/ngx-utils/services/formatter.service.d.ts +12 -12
- package/ngx-utils/services/global-template.service.d.ts +16 -16
- package/ngx-utils/services/icon.service.d.ts +10 -10
- package/ngx-utils/services/language.service.d.ts +18 -18
- package/ngx-utils/services/open-api.service.d.ts +8 -8
- package/ngx-utils/services/promise.service.d.ts +15 -15
- package/ngx-utils/services/state.service.d.ts +41 -41
- package/ngx-utils/services/static-language.service.d.ts +41 -41
- package/ngx-utils/services/storage.service.d.ts +12 -12
- package/ngx-utils/services/toaster.service.d.ts +10 -10
- package/ngx-utils/services/translated-url.serializer.d.ts +16 -16
- package/ngx-utils/services/universal.service.d.ts +24 -24
- package/ngx-utils/utils/ajax-request-handler.d.ts +11 -11
- package/ngx-utils/utils/array.utils.d.ts +10 -9
- package/ngx-utils/utils/auth.guard.d.ts +26 -26
- package/ngx-utils/utils/canvas.utils.d.ts +13 -13
- package/ngx-utils/utils/date.utils.d.ts +8 -8
- package/ngx-utils/utils/file.utils.d.ts +14 -14
- package/ngx-utils/utils/generic-value.d.ts +8 -8
- package/ngx-utils/utils/geometry.d.ts +50 -50
- package/ngx-utils/utils/initializer.d.ts +11 -11
- package/ngx-utils/utils/loader.utils.d.ts +7 -7
- package/ngx-utils/utils/math.utils.d.ts +5 -5
- package/ngx-utils/utils/object.utils.d.ts +31 -31
- package/ngx-utils/utils/observable.utils.d.ts +12 -12
- package/ngx-utils/utils/reflect.utils.d.ts +9 -9
- package/ngx-utils/utils/set.utils.d.ts +4 -4
- package/ngx-utils/utils/string.utils.d.ts +7 -7
- package/ngx-utils/utils/timer.utils.d.ts +6 -6
- package/ngx-utils/utils/unique.utils.d.ts +5 -5
- package/ngx-utils/utils/vector.d.ts +23 -23
- package/package.json +1 -1
- package/public_api.d.ts +82 -82
- package/stemy-ngx-utils.d.ts +6 -6
- package/stemy-ngx-utils.metadata.json +1 -1
- package/tools/circular.js +116 -116
- package/tools/config.js +78 -78
- package/tools/icons.js +13 -13
|
@@ -1,274 +1,274 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Inject, Injectable, Optional } from "@angular/core";
|
|
3
|
-
import { HttpEventType, HttpResponse } from "@angular/common/http";
|
|
4
|
-
import { CONFIG_SERVICE, EXPRESS_REQUEST, HttpPromise, LANGUAGE_SERVICE, TOASTER_SERVICE } from "../common-types";
|
|
5
|
-
import { ObjectUtils } from "../utils/object.utils";
|
|
6
|
-
import { MathUtils } from "../utils/math.utils";
|
|
7
|
-
import { BaseHttpClient } from "./base-http.client";
|
|
8
|
-
import { StorageService } from "./storage.service";
|
|
9
|
-
import { timeout } from "rxjs/operators";
|
|
10
|
-
import { TimeoutError } from "rxjs";
|
|
11
|
-
export class BaseHttpService {
|
|
12
|
-
constructor(client, storage, language, toaster, configs, request = null) {
|
|
13
|
-
this.client = client;
|
|
14
|
-
this.storage = storage;
|
|
15
|
-
this.language = language;
|
|
16
|
-
this.toaster = toaster;
|
|
17
|
-
this.configs = configs;
|
|
18
|
-
this.request = request;
|
|
19
|
-
this.cache = {};
|
|
20
|
-
}
|
|
21
|
-
get name() {
|
|
22
|
-
return "base";
|
|
23
|
-
}
|
|
24
|
-
get withCredentials() {
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
static retryFailedRequests() {
|
|
28
|
-
BaseHttpService.failedRequests.forEach(r => r());
|
|
29
|
-
BaseHttpService.failedRequests = [];
|
|
30
|
-
}
|
|
31
|
-
get universal() {
|
|
32
|
-
return this.storage.universal;
|
|
33
|
-
}
|
|
34
|
-
url(url) {
|
|
35
|
-
return url;
|
|
36
|
-
}
|
|
37
|
-
createUrl(url, params) {
|
|
38
|
-
const httpParams = this.client.makeParams(params);
|
|
39
|
-
const query = httpParams.keys().map(key => {
|
|
40
|
-
return `${key}=${httpParams.get(key)}`;
|
|
41
|
-
}).join("&");
|
|
42
|
-
return `${this.url(url)}?${query}`;
|
|
43
|
-
}
|
|
44
|
-
makeListParams(page, itemsPerPage, orderBy = null, orderDescending = null, filter = null) {
|
|
45
|
-
const params = {
|
|
46
|
-
page: (page - 1),
|
|
47
|
-
limit: itemsPerPage
|
|
48
|
-
};
|
|
49
|
-
if (!ObjectUtils.isNullOrUndefined(orderBy) && !ObjectUtils.isNullOrUndefined(orderDescending)) {
|
|
50
|
-
params.sort = `${orderDescending ? "-" : ""}${orderBy}`;
|
|
51
|
-
}
|
|
52
|
-
if (!ObjectUtils.isNullOrUndefined(filter)) {
|
|
53
|
-
params.filter = filter;
|
|
54
|
-
}
|
|
55
|
-
return params;
|
|
56
|
-
}
|
|
57
|
-
getPromise(url, options) {
|
|
58
|
-
options = this.makeOptions(options, "GET");
|
|
59
|
-
return this.toPromise(url, options);
|
|
60
|
-
}
|
|
61
|
-
deletePromise(url, options) {
|
|
62
|
-
options = this.makeOptions(options, "DELETE");
|
|
63
|
-
return this.toPromise(url, options);
|
|
64
|
-
}
|
|
65
|
-
postPromise(url, body, options) {
|
|
66
|
-
options = this.makeOptions(options, "POST", body);
|
|
67
|
-
return this.toPromise(url, options);
|
|
68
|
-
}
|
|
69
|
-
putPromise(url, body, options) {
|
|
70
|
-
options = this.makeOptions(options, "PUT", body);
|
|
71
|
-
return this.toPromise(url, options);
|
|
72
|
-
}
|
|
73
|
-
patchPromise(url, body, options) {
|
|
74
|
-
options = this.makeOptions(options, "PATCH", body);
|
|
75
|
-
return this.toPromise(url, options);
|
|
76
|
-
}
|
|
77
|
-
uploadPromise(url, body, listener, options) {
|
|
78
|
-
const headers = {};
|
|
79
|
-
if (body instanceof Blob) {
|
|
80
|
-
headers["Content-Type"] = "application/octet-stream";
|
|
81
|
-
}
|
|
82
|
-
options = this.makeOptions(Object.assign({
|
|
83
|
-
headers: headers,
|
|
84
|
-
reportProgress: true
|
|
85
|
-
}, options), "POST", body);
|
|
86
|
-
return this.toPromise(url, options, listener);
|
|
87
|
-
}
|
|
88
|
-
listPromise(url, params) {
|
|
89
|
-
return new Promise(resolve => {
|
|
90
|
-
this.getPromise(url, { params: params }).then(data => {
|
|
91
|
-
var _a, _b;
|
|
92
|
-
if (ObjectUtils.isArray(data)) {
|
|
93
|
-
resolve({
|
|
94
|
-
total: data.length,
|
|
95
|
-
items: data,
|
|
96
|
-
meta: {}
|
|
97
|
-
});
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
resolve({
|
|
101
|
-
total: ((_a = data.meta) === null || _a === void 0 ? void 0 : _a.total) || (data === null || data === void 0 ? void 0 : data.total) || ((_b = data.items) === null || _b === void 0 ? void 0 : _b.length) || 0,
|
|
102
|
-
items: data.items || [],
|
|
103
|
-
meta: data.meta || {}
|
|
104
|
-
});
|
|
105
|
-
}, response => {
|
|
106
|
-
if (response.status == 0 || response.status == 301) {
|
|
107
|
-
resolve({
|
|
108
|
-
total: 1,
|
|
109
|
-
items: [{
|
|
110
|
-
id: null,
|
|
111
|
-
label: "Not implemented."
|
|
112
|
-
}],
|
|
113
|
-
meta: {}
|
|
114
|
-
});
|
|
115
|
-
return true;
|
|
116
|
-
}
|
|
117
|
-
resolve({
|
|
118
|
-
total: 0,
|
|
119
|
-
items: [],
|
|
120
|
-
meta: {}
|
|
121
|
-
});
|
|
122
|
-
return false;
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
handleUnauthorizedError(absoluteUrl, options, reject) {
|
|
127
|
-
reject();
|
|
128
|
-
if (BaseHttpService.failedRequests.length > 1) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
if (this.universal.isServer)
|
|
132
|
-
return;
|
|
133
|
-
console.log("User auth error", absoluteUrl, options);
|
|
134
|
-
}
|
|
135
|
-
toastWarning(message, issueContext, reason, options) {
|
|
136
|
-
this.toaster.warning(message, { issueContext, reason, options });
|
|
137
|
-
}
|
|
138
|
-
toastError(message, issueContext, reason, options) {
|
|
139
|
-
this.toaster.warning(message, { issueContext, reason, options });
|
|
140
|
-
}
|
|
141
|
-
toPromise(url, options, listener) {
|
|
142
|
-
const issueContext = { url: "" };
|
|
143
|
-
return new HttpPromise(response => {
|
|
144
|
-
if (!response) {
|
|
145
|
-
if (this.universal.isServer)
|
|
146
|
-
return;
|
|
147
|
-
console.log("You may not need a reject Handler for this request!", this.name, url, options);
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
const reason = response.error || {};
|
|
151
|
-
if (response.status == 0 || response.status == 301) {
|
|
152
|
-
this.toastWarning(`${url} endpoint is not implemented! Click here, to quickly create an issue.`, issueContext, reason, options);
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
const regex = /((E11000 duplicate key error collection: (.)+\.)|(_1 dup key:(.)+))/g;
|
|
156
|
-
if (reason.message && regex.test(reason.message)) {
|
|
157
|
-
this.toastError("message.duplicate-key.error." + reason.message.replace(regex, "").replace(" index: ", "-"), issueContext, reason, options);
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
this.toastWarning(`${url} endpoint error is not handled properly! Click here, to quickly create an issue.`, issueContext, reason, options);
|
|
161
|
-
}, (resolve, reject) => {
|
|
162
|
-
this.absoluteUrl(url, options).then(absoluteUrl => {
|
|
163
|
-
issueContext.url = absoluteUrl;
|
|
164
|
-
const request = this.client.request(options.method, absoluteUrl, options);
|
|
165
|
-
const finalRequest = ObjectUtils.isNumber(options.timeout) && options.timeout > 0
|
|
166
|
-
? request.pipe(timeout(options.timeout)) : request;
|
|
167
|
-
finalRequest.subscribe((event) => {
|
|
168
|
-
if (options.reportProgress && event.type === HttpEventType.UploadProgress) {
|
|
169
|
-
const progress = {
|
|
170
|
-
percentage: MathUtils.round(event.loaded / event.total, 2, 0.01),
|
|
171
|
-
loaded: event.loaded,
|
|
172
|
-
total: event.total
|
|
173
|
-
};
|
|
174
|
-
if (listener) {
|
|
175
|
-
listener(progress);
|
|
176
|
-
}
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
const response = event instanceof HttpResponse ? event.body : event;
|
|
180
|
-
resolve(this.parseResponse(response, url, options));
|
|
181
|
-
const headers = options.headers;
|
|
182
|
-
const authKey = "Authorization";
|
|
183
|
-
// If we use token auth
|
|
184
|
-
if (this.client.renewTokenFunc && headers.has(authKey)) {
|
|
185
|
-
const currentTime = new Date().getTime();
|
|
186
|
-
const userTokenTime = this.storage.get("userTokenTime") || currentTime;
|
|
187
|
-
// And the last request was a long long time ago
|
|
188
|
-
if (currentTime - 600000 > userTokenTime) {
|
|
189
|
-
this.client.renewTokenFunc();
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}, (response) => {
|
|
193
|
-
if (response instanceof TimeoutError || response.status == 0 || response.status == 301) {
|
|
194
|
-
reject(response);
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
const headers = options.headers;
|
|
198
|
-
const authKey = "Authorization";
|
|
199
|
-
// If an authorization header exists and we still have an Unauthorized response prompt the user to log in again
|
|
200
|
-
if (headers.has(authKey) && response.status == 401) {
|
|
201
|
-
BaseHttpService.failedRequests.push(() => {
|
|
202
|
-
options.headers = this.makeHeaders(options.originalHeaders);
|
|
203
|
-
this.toPromise(url, options, listener).then(resolve, reject);
|
|
204
|
-
});
|
|
205
|
-
this.handleUnauthorizedError(absoluteUrl, options, () => reject(response));
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
reject(response);
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
checkHeaders(headers) {
|
|
214
|
-
if (!headers || !headers.cookie || !headers.referer || !headers.host) {
|
|
215
|
-
return false;
|
|
216
|
-
}
|
|
217
|
-
return headers.referer.indexOf(headers.host) >= 0;
|
|
218
|
-
}
|
|
219
|
-
makeOptions(options, method = "GET", body
|
|
220
|
-
// Set base options
|
|
221
|
-
options = options ? Object.assign({}, options) : {};
|
|
222
|
-
options.params = this.client.makeParams(options.params);
|
|
223
|
-
options.observe = "body";
|
|
224
|
-
options.originalHeaders = options.originalHeaders || options.headers || {};
|
|
225
|
-
options.method = method;
|
|
226
|
-
options.withCredentials = ObjectUtils.isBoolean(options.withCredentials) ? options.withCredentials : this.withCredentials;
|
|
227
|
-
options.body = body || {};
|
|
228
|
-
// Set cookies from server side request
|
|
229
|
-
const headers = !this.request ? null : this.request.headers;
|
|
230
|
-
if (this.checkHeaders(headers)) {
|
|
231
|
-
options.headers["Cookie"] = headers.cookie;
|
|
232
|
-
}
|
|
233
|
-
options.headers = this.makeHeaders(options.originalHeaders, method);
|
|
234
|
-
return options;
|
|
235
|
-
}
|
|
236
|
-
makeHeaders(headers, method = "GET") {
|
|
237
|
-
return this.client.makeHeaders(headers);
|
|
238
|
-
}
|
|
239
|
-
parseResponse(response, url, options) {
|
|
240
|
-
return response;
|
|
241
|
-
}
|
|
242
|
-
parseUrl(url) {
|
|
243
|
-
return this.url(url).replace(/(?:((?!:).\/)\/)/g, "$1");
|
|
244
|
-
}
|
|
245
|
-
absoluteUrl(url, options) {
|
|
246
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
247
|
-
const absoluteUrl = this.parseUrl(url);
|
|
248
|
-
if (url == "api-docs") {
|
|
249
|
-
return absoluteUrl.replace("/api", "");
|
|
250
|
-
}
|
|
251
|
-
return absoluteUrl;
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
expressRequestUrl(url) {
|
|
255
|
-
const req = this.request;
|
|
256
|
-
if (!req || !url || url.startsWith("http") || url.startsWith("//"))
|
|
257
|
-
return url;
|
|
258
|
-
const separator = url.startsWith("/") ? "" : "/";
|
|
259
|
-
return `${req.protocol}://${req.get("host")}${separator}${url}`;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
BaseHttpService.failedRequests = [];
|
|
263
|
-
BaseHttpService.decorators = [
|
|
264
|
-
{ type: Injectable }
|
|
265
|
-
];
|
|
266
|
-
BaseHttpService.ctorParameters = () => [
|
|
267
|
-
{ type: BaseHttpClient, decorators: [{ type: Inject, args: [BaseHttpClient,] }] },
|
|
268
|
-
{ type: StorageService, decorators: [{ type: Inject, args: [StorageService,] }] },
|
|
269
|
-
{ type: undefined, decorators: [{ type: Inject, args: [LANGUAGE_SERVICE,] }] },
|
|
270
|
-
{ type: undefined, decorators: [{ type: Inject, args: [TOASTER_SERVICE,] }] },
|
|
271
|
-
{ type: undefined, decorators: [{ type: Inject, args: [CONFIG_SERVICE,] }] },
|
|
272
|
-
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [EXPRESS_REQUEST,] }] }
|
|
273
|
-
];
|
|
274
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1odHRwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvc3RlbXkvV29yay9uZ3gtdXRpbHMvc3JjLyIsInNvdXJjZXMiOlsibmd4LXV0aWxzL3NlcnZpY2VzL2Jhc2UtaHR0cC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFvQixhQUFhLEVBQWUsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHakcsT0FBTyxFQUNILGNBQWMsRUFDZCxlQUFlLEVBQ2YsV0FBVyxFQVVYLGdCQUFnQixFQUVoQixlQUFlLEVBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUU5QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBR2xDLE1BQU0sT0FBTyxlQUFlO0lBdUJ4QixZQUE2QyxNQUFzQixFQUN0QixPQUF1QixFQUNyQixRQUEwQixFQUMzQixPQUF3QixFQUN6QixPQUF1QixFQUNWLFVBQW1CLElBQUk7UUFMcEMsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDckIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDekIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDVixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUU3RSxJQUFJ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LE9BQU8sR0FBRyxDQUFDO1FBQy9FLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2pELE9BQU8sR0FBRyxHQUFHLENBQUMsUUFBUSxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ3BFLENBQUM7O0FBaFJnQiw4QkFBYyxHQUFzQixFQUFFLENBQUM7O1lBSDNELFVBQVU7OztZQU5ILGNBQWMsdUJBOEJMLE1BQU0sU0FBQyxjQUFjO1lBNUI5QixjQUFjLHVCQTZCTCxNQUFNLFNBQUMsY0FBYzs0Q0FDckIsTUFBTSxTQUFDLGdCQUFnQjs0Q0FDdkIsTUFBTSxTQUFDLGVBQWU7NENBQ3RCLE1BQU0sU0FBQyxjQUFjOzRDQUNyQixRQUFRLFlBQUksTUFBTSxTQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWx9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge0h0dHBFcnJvclJlc3BvbnNlLCBIdHRwRXZlbnRUeXBlLCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7UmVxdWVzdH0gZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHtcbiAgICBDT05GSUdfU0VSVklDRSxcbiAgICBFWFBSRVNTX1JFUVVFU1QsXG4gICAgSHR0cFByb21pc2UsXG4gICAgSUNvbmZpZ1NlcnZpY2UsXG4gICAgSUh0dHBIZWFkZXJzLFxuICAgIElIdHRwUGFyYW1zLFxuICAgIElIdHRwU2VydmljZSxcbiAgICBJSXNzdWVDb250ZXh0LFxuICAgIElMYW5ndWFnZVNlcnZpY2UsXG4gICAgSVBhZ2luYXRpb25EYXRhLFxuICAgIElSZXF1ZXN0T3B0aW9ucyxcbiAgICBJVG9hc3RlclNlcnZpY2UsXG4gICAgTEFOR1VBR0VfU0VSVklDRSxcbiAgICBQcm9ncmVzc0xpc3RlbmVyLFxuICAgIFRPQVNURVJfU0VSVklDRVxufSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XG5cbmltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gXCIuLi91dGlscy9vYmplY3QudXRpbHNcIjtcbmltcG9ydCB7TWF0aFV0aWxzfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC51dGlsc1wiO1xuXG5pbXBvcnQge0Jhc2VIdHRwQ2xpZW50fSBmcm9tIFwiLi9iYXNlLWh0dHAuY2xpZW50XCI7XG5pbXBvcnQge1VuaXZlcnNhbFNlcnZpY2V9IGZyb20gXCIuL3VuaXZlcnNhbC5zZXJ2aWNlXCI7XG5pbXBvcnQge1N0b3JhZ2VTZXJ2aWNlfSBmcm9tIFwiLi9zdG9yYWdlLnNlcnZpY2VcIjtcbmltcG9ydCB7dGltZW91dH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQge1RpbWVvdXRFcnJvcn0gZnJvbSBcInJ4anNcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJhc2VIdHRwU2VydmljZSBpbXBsZW1lbnRzIElIdHRwU2VydmljZSB7XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIGZhaWxlZFJlcXVlc3RzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gICAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiYmFzZVwiO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgd2l0aENyZWRlbnRpYWxzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjYWNoZTogYW55O1xuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZXRyeUZhaWxlZFJlcXVlc3RzKCk6IHZvaWQge1xuICAgICAgICBCYXNlSHR0cFNlcnZpY2UuZmFpbGVkUmVxdWVzdHMuZm9yRWFjaChyID0+IHIoKSk7XG4gICAgICAgIEJhc2VIdHRwU2VydmljZS5mYWlsZWRSZXF1ZXN0cyA9IFtdO1xuICAgIH1cblxuICAgIGdldCB1bml2ZXJzYWwoKTogVW5pdmVyc2FsU2VydmljZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UudW5pdmVyc2FsO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQmFzZUh0dHBDbGllbnQpIHJlYWRvbmx5IGNsaWVudDogQmFzZUh0dHBDbGllbnQsXG4gICAgICAgICAgICAgICAgQEluamVjdChTdG9yYWdlU2VydmljZSkgcmVhZG9ubHkgc3RvcmFnZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQEluamVjdChMQU5HVUFHRV9TRVJWSUNFKSByZWFkb25seSBsYW5ndWFnZTogSUxhbmd1YWdlU2VydmljZSxcbiAgICAgICAgICAgICAgICBASW5qZWN0KFRPQVNURVJfU0VSVklDRSkgcmVhZG9ubHkgdG9hc3RlcjogSVRvYXN0ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIEBJbmplY3QoQ09ORklHX1NFUlZJQ0UpIHJlYWRvbmx5IGNvbmZpZ3M6IElDb25maWdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRVhQUkVTU19SRVFVRVNUKSByZWFkb25seSByZXF1ZXN0OiBSZXF1ZXN0ID0gbnVsbFxuICAgICkge1xuICAgICAgICB0aGlzLmNhY2hlID0ge307XG4gICAgfVxuXG4gICAgdXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICBjcmVhdGVVcmwodXJsOiBzdHJpbmcsIHBhcmFtczogSUh0dHBQYXJhbXMpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBodHRwUGFyYW1zID0gdGhpcy5jbGllbnQubWFrZVBhcmFtcyhwYXJhbXMpO1xuICAgICAgICBjb25zdCBxdWVyeSA9IGh0dHBQYXJhbXMua2V5cygpLm1hcChrZXkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX09JHtodHRwUGFyYW1zLmdldChrZXkpfWA7XG4gICAgICAgIH0pLmpvaW4oXCImXCIpO1xuICAgICAgICByZXR1cm4gYCR7dGhpcy51cmwodXJsKX0/JHtxdWVyeX1gO1xuICAgIH1cblxuICAgIG1ha2VMaXN0UGFyYW1zKHBhZ2U6IG51bWJlciwgaXRlbXNQZXJQYWdlOiBudW1iZXIsIG9yZGVyQnk6IHN0cmluZyA9IG51bGwsIG9yZGVyRGVzY2VuZGluZzogYm9vbGVhbiA9IG51bGwsIGZpbHRlcjogc3RyaW5nID0gbnVsbCk6IElIdHRwUGFyYW1zIHtcbiAgICAgICAgY29uc3QgcGFyYW1zOiBJSHR0cFBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhZ2U6IChwYWdlIC0gMSksXG4gICAgICAgICAgICBsaW1pdDogaXRlbXNQZXJQYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICghT2JqZWN0VXRpbHMuaXNOdWxsT3JVbmRlZmluZWQob3JkZXJCeSkgJiYgIU9iamVjdFV0aWxzLmlzTnVsbE9yVW5kZWZpbmVkKG9yZGVyRGVzY2VuZGluZykpIHtcbiAgICAgICAgICAgIHBhcmFtcy5zb3J0ID0gYCR7b3JkZXJEZXNjZW5kaW5nID8gXCItXCIgOiBcIlwifSR7b3JkZXJCeX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICghT2JqZWN0VXRpbHMuaXNOdWxsT3JVbmRlZmluZWQoZmlsdGVyKSkge1xuICAgICAgICAgICAgcGFyYW1zLmZpbHRlciA9IGZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRQcm9taXNlKHVybDogc3RyaW5nLCBvcHRpb25zPzogSVJlcXVlc3RPcHRpb25zKTogSHR0cFByb21pc2Uge1xuICAgICAgICBvcHRpb25zID0gdGhpcy5tYWtlT3B0aW9ucyhvcHRpb25zLCBcIkdFVFwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9Qcm9taXNlKHVybCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlbGV0ZVByb21pc2UodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm1ha2VPcHRpb25zKG9wdGlvbnMsIFwiREVMRVRFXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy50b1Byb21pc2UodXJsLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcG9zdFByb21pc2UodXJsOiBzdHJpbmcsIGJvZHk/OiBhbnksIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm1ha2VPcHRpb25zKG9wdGlvbnMsIFwiUE9TVFwiLCBib2R5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9Qcm9taXNlKHVybCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHB1dFByb21pc2UodXJsOiBzdHJpbmcsIGJvZHk/OiBhbnksIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm1ha2VPcHRpb25zKG9wdGlvbnMsIFwiUFVUXCIsIGJvZHkpO1xuICAgICAgICByZXR1cm4gdGhpcy50b1Byb21pc2UodXJsLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcGF0Y2hQcm9taXNlKHVybDogc3RyaW5nLCBib2R5PzogYW55LCBvcHRpb25zPzogSVJlcXVlc3RPcHRpb25zKTogSHR0cFByb21pc2Uge1xuICAgICAgICBvcHRpb25zID0gdGhpcy5tYWtlT3B0aW9ucyhvcHRpb25zLCBcIlBBVENIXCIsIGJvZHkpO1xuICAgICAgICByZXR1cm4gdGhpcy50b1Byb21pc2UodXJsLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdXBsb2FkUHJvbWlzZSh1cmw6IHN0cmluZywgYm9keTogYW55LCBsaXN0ZW5lcj86IFByb2dyZXNzTGlzdGVuZXIsIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IGFueSA9IHt9O1xuICAgICAgICBpZiAoYm9keSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm1ha2VPcHRpb25zKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiB0cnVlXG4gICAgICAgIH0sIG9wdGlvbnMpLCBcIlBPU1RcIiwgYm9keSk7XG4gICAgICAgIHJldHVybiB0aGlzLnRvUHJvbWlzZSh1cmwsIG9wdGlvbnMsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbGlzdFByb21pc2UodXJsOiBzdHJpbmcsIHBhcmFtczogSUh0dHBQYXJhbXMpOiBQcm9taXNlPElQYWdpbmF0aW9uRGF0YT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8SVBhZ2luYXRpb25EYXRhPihyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJvbWlzZSh1cmwsIHtwYXJhbXM6IHBhcmFtc30pLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogZGF0YS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGE6IHt9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICB0b3RhbDogZGF0YS5tZXRhPy50b3RhbCB8fCBkYXRhPy50b3RhbCB8fCBkYXRhLml0ZW1zPy5sZW5ndGggfHwgMCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IGRhdGEuaXRlbXMgfHwgW10sXG4gICAgICAgICAgICAgICAgICAgIG1ldGE6IGRhdGEubWV0YSB8fCB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMCB8fCByZXNwb25zZS5zdGF0dXMgPT0gMzAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJOb3QgaW1wbGVtZW50ZWQuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YToge31cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgdG90YWw6IDAsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgbWV0YToge31cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZVVuYXV0aG9yaXplZEVycm9yKGFic29sdXRlVXJsOiBzdHJpbmcsIG9wdGlvbnM6IElSZXF1ZXN0T3B0aW9ucywgcmVqZWN0OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgICBpZiAoQmFzZUh0dHBTZXJ2aWNlLmZhaWxlZFJlcXVlc3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy51bml2ZXJzYWwuaXNTZXJ2ZXIpIHJldHVybjtcbiAgICAgICAgY29uc29sZS5sb2coXCJVc2VyIGF1dGggZXJyb3JcIiwgYWJzb2x1dGVVcmwsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB0b2FzdFdhcm5pbmcobWVzc2FnZTogc3RyaW5nLCBpc3N1ZUNvbnRleHQ6IElJc3N1ZUNvbnRleHQsIHJlYXNvbjogYW55LCBvcHRpb25zOiBJUmVxdWVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b2FzdGVyLndhcm5pbmcobWVzc2FnZSwge2lzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRvYXN0RXJyb3IobWVzc2FnZTogc3RyaW5nLCBpc3N1ZUNvbnRleHQ6IElJc3N1ZUNvbnRleHQsIHJlYXNvbjogYW55LCBvcHRpb25zOiBJUmVxdWVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b2FzdGVyLndhcm5pbmcobWVzc2FnZSwge2lzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRvUHJvbWlzZSh1cmw6IHN0cmluZywgb3B0aW9uczogSVJlcXVlc3RPcHRpb25zLCBsaXN0ZW5lcj86IFByb2dyZXNzTGlzdGVuZXIpOiBIdHRwUHJvbWlzZSB7XG4gICAgICAgIGNvbnN0IGlzc3VlQ29udGV4dDogSUlzc3VlQ29udGV4dCA9IHt1cmw6IFwiXCJ9O1xuXG4gICAgICAgIHJldHVybiBuZXcgSHR0cFByb21pc2UocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVuaXZlcnNhbC5pc1NlcnZlcikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiWW91IG1heSBub3QgbmVlZCBhIHJlamVjdCBIYW5kbGVyIGZvciB0aGlzIHJlcXVlc3QhXCIsIHRoaXMubmFtZSwgdXJsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZWFzb24gPSByZXNwb25zZS5lcnJvciB8fCB7fTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMCB8fCByZXNwb25zZS5zdGF0dXMgPT0gMzAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdFdhcm5pbmcoYCR7dXJsfSBlbmRwb2ludCBpcyBub3QgaW1wbGVtZW50ZWQhIENsaWNrIGhlcmUsIHRvIHF1aWNrbHkgY3JlYXRlIGFuIGlzc3VlLmAsIGlzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZWdleCA9IC8oKEUxMTAwMCBkdXBsaWNhdGUga2V5IGVycm9yIGNvbGxlY3Rpb246ICguKStcXC4pfChfMSBkdXAga2V5OiguKSspKS9nO1xuICAgICAgICAgICAgaWYgKHJlYXNvbi5tZXNzYWdlICYmIHJlZ2V4LnRlc3QocmVhc29uLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdEVycm9yKFwibWVzc2FnZS5kdXBsaWNhdGUta2V5LmVycm9yLlwiICsgcmVhc29uLm1lc3NhZ2UucmVwbGFjZShyZWdleCwgXCJcIikucmVwbGFjZShcIiBpbmRleDogXCIsIFwiLVwiKSwgaXNzdWVDb250ZXh0LCByZWFzb24sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudG9hc3RXYXJuaW5nKGAke3VybH0gZW5kcG9pbnQgZXJyb3IgaXMgbm90IGhhbmRsZWQgcHJvcGVybHkhIENsaWNrIGhlcmUsIHRvIHF1aWNrbHkgY3JlYXRlIGFuIGlzc3VlLmAsIGlzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zKTtcbiAgICAgICAgfSwgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hYnNvbHV0ZVVybCh1cmwsIG9wdGlvbnMpLnRoZW4oYWJzb2x1dGVVcmwgPT4ge1xuICAgICAgICAgICAgICAgIGlzc3VlQ29udGV4dC51cmwgPSBhYnNvbHV0ZVVybDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5jbGllbnQucmVxdWVzdChvcHRpb25zLm1ldGhvZCwgYWJzb2x1dGVVcmwsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsUmVxdWVzdCA9IE9iamVjdFV0aWxzLmlzTnVtYmVyKG9wdGlvbnMudGltZW91dCkgJiYgb3B0aW9ucy50aW1lb3V0ID4gMFxuICAgICAgICAgICAgICAgICAgICA/IHJlcXVlc3QucGlwZSh0aW1lb3V0KG9wdGlvbnMudGltZW91dCkpIDogcmVxdWVzdDtcbiAgICAgICAgICAgICAgICBmaW5hbFJlcXVlc3Quc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJlcG9ydFByb2dyZXNzICYmIGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2U6IE1hdGhVdGlscy5yb3VuZChldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCwgMiwgMC4wMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIocHJvZ3Jlc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyBldmVudC5ib2R5IDogZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXJzZVJlc3BvbnNlKHJlc3BvbnNlLCB1cmwsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyBhcyBIdHRwSGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0aEtleSA9IFwiQXV0aG9yaXphdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSB1c2UgdG9rZW4gYXV0aFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jbGllbnQucmVuZXdUb2tlbkZ1bmMgJiYgaGVhZGVycy5oYXMoYXV0aEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyVG9rZW5UaW1lID0gdGhpcy5zdG9yYWdlLmdldChcInVzZXJUb2tlblRpbWVcIikgfHwgY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmQgdGhlIGxhc3QgcmVxdWVzdCB3YXMgYSBsb25nIGxvbmcgdGltZSBhZ29cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSAtIDYwMDAwMCA+IHVzZXJUb2tlblRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudC5yZW5ld1Rva2VuRnVuYygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSB8IFRpbWVvdXRFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IgfHwgcmVzcG9uc2Uuc3RhdHVzID09IDAgfHwgcmVzcG9uc2Uuc3RhdHVzID09IDMwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIGFzIEh0dHBIZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRoS2V5ID0gXCJBdXRob3JpemF0aW9uXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIGF1dGhvcml6YXRpb24gaGVhZGVyIGV4aXN0cyBhbmQgd2Ugc3RpbGwgaGF2ZSBhbiBVbmF1dGhvcml6ZWQgcmVzcG9uc2UgcHJvbXB0IHRoZSB1c2VyIHRvIGxvZyBpbiBhZ2FpblxuICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVycy5oYXMoYXV0aEtleSkgJiYgcmVzcG9uc2Uuc3RhdHVzID09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUh0dHBTZXJ2aWNlLmZhaWxlZFJlcXVlc3RzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHRoaXMubWFrZUhlYWRlcnMob3B0aW9ucy5vcmlnaW5hbEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9Qcm9taXNlKHVybCwgb3B0aW9ucywgbGlzdGVuZXIpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVVbmF1dGhvcml6ZWRFcnJvcihhYnNvbHV0ZVVybCwgb3B0aW9ucywgKCkgPT4gcmVqZWN0KHJlc3BvbnNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tIZWFkZXJzKGhlYWRlcnM6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWhlYWRlcnMgfHwgIWhlYWRlcnMuY29va2llIHx8ICFoZWFkZXJzLnJlZmVyZXIgfHwgIWhlYWRlcnMuaG9zdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFkZXJzLnJlZmVyZXIuaW5kZXhPZihoZWFkZXJzLmhvc3QpID49IDA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG1ha2VPcHRpb25zKG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMsIG1ldGhvZDogc3RyaW5nID0gXCJHRVRcIiwgYm9keTogYW55ID0ge30pOiBJUmVxdWVzdE9wdGlvbnMge1xuICAgICAgICAvLyBTZXQgYmFzZSBvcHRpb25zXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8gey4uLm9wdGlvbnN9IDoge307XG4gICAgICAgIG9wdGlvbnMucGFyYW1zID0gdGhpcy5jbGllbnQubWFrZVBhcmFtcyhvcHRpb25zLnBhcmFtcyk7XG4gICAgICAgIG9wdGlvbnMub2JzZXJ2ZSA9IFwiYm9keVwiO1xuICAgICAgICBvcHRpb25zLm9yaWdpbmFsSGVhZGVycyA9IG9wdGlvbnMub3JpZ2luYWxIZWFkZXJzIHx8IChvcHRpb25zLmhlYWRlcnMgYXMgSUh0dHBIZWFkZXJzKSB8fCB7fTtcbiAgICAgICAgb3B0aW9ucy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIG9wdGlvbnMud2l0aENyZWRlbnRpYWxzID0gT2JqZWN0VXRpbHMuaXNCb29sZWFuKG9wdGlvbnMud2l0aENyZWRlbnRpYWxzKSA/IG9wdGlvbnMud2l0aENyZWRlbnRpYWxzIDogdGhpcy53aXRoQ3JlZGVudGlhbHM7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IGJvZHkgfHwge307XG4gICAgICAgIC8vIFNldCBjb29raWVzIGZyb20gc2VydmVyIHNpZGUgcmVxdWVzdFxuICAgICAgICBjb25zdCBoZWFkZXJzID0gIXRoaXMucmVxdWVzdCA/IG51bGwgOiB0aGlzLnJlcXVlc3QuaGVhZGVycztcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tIZWFkZXJzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbXCJDb29raWVcIl0gPSBoZWFkZXJzLmNvb2tpZTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSB0aGlzLm1ha2VIZWFkZXJzKG9wdGlvbnMub3JpZ2luYWxIZWFkZXJzLCBtZXRob2QpO1xuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbWFrZUhlYWRlcnMoaGVhZGVyczogSUh0dHBIZWFkZXJzLCBtZXRob2Q6IHN0cmluZyA9IFwiR0VUXCIpOiBIdHRwSGVhZGVycyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5tYWtlSGVhZGVycyhoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcGFyc2VSZXNwb25zZShyZXNwb25zZTogYW55LCB1cmw6IHN0cmluZywgb3B0aW9uczogSVJlcXVlc3RPcHRpb25zKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwYXJzZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnVybCh1cmwpLnJlcGxhY2UoLyg/OigoPyE6KS5cXC8pXFwvKS9nLCBcIiQxXCIpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBhYnNvbHV0ZVVybCh1cmw6IHN0cmluZywgb3B0aW9uczogSVJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSB0aGlzLnBhcnNlVXJsKHVybCk7XG4gICAgICAgIGlmICh1cmwgPT0gXCJhcGktZG9jc1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYWJzb2x1dGVVcmwucmVwbGFjZShcIi9hcGlcIiwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFic29sdXRlVXJsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHByZXNzUmVxdWVzdFVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJlcSA9IHRoaXMucmVxdWVzdDtcbiAgICAgICAgaWYgKCFyZXEgfHwgIXVybCB8fCB1cmwuc3RhcnRzV2l0aChcImh0dHBcIikgfHwgdXJsLnN0YXJ0c1dpdGgoXCIvL1wiKSkgcmV0dXJuIHVybDtcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gdXJsLnN0YXJ0c1dpdGgoXCIvXCIpID8gXCJcIiA6IFwiL1wiO1xuICAgICAgICByZXR1cm4gYCR7cmVxLnByb3RvY29sfTovLyR7cmVxLmdldChcImhvc3RcIil9JHtzZXBhcmF0b3J9JHt1cmx9YDtcbiAgICB9XG59XG4iXX0=
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Inject, Injectable, Optional } from "@angular/core";
|
|
3
|
+
import { HttpEventType, HttpResponse } from "@angular/common/http";
|
|
4
|
+
import { CONFIG_SERVICE, EXPRESS_REQUEST, HttpPromise, LANGUAGE_SERVICE, TOASTER_SERVICE } from "../common-types";
|
|
5
|
+
import { ObjectUtils } from "../utils/object.utils";
|
|
6
|
+
import { MathUtils } from "../utils/math.utils";
|
|
7
|
+
import { BaseHttpClient } from "./base-http.client";
|
|
8
|
+
import { StorageService } from "./storage.service";
|
|
9
|
+
import { timeout } from "rxjs/operators";
|
|
10
|
+
import { TimeoutError } from "rxjs";
|
|
11
|
+
export class BaseHttpService {
|
|
12
|
+
constructor(client, storage, language, toaster, configs, request = null) {
|
|
13
|
+
this.client = client;
|
|
14
|
+
this.storage = storage;
|
|
15
|
+
this.language = language;
|
|
16
|
+
this.toaster = toaster;
|
|
17
|
+
this.configs = configs;
|
|
18
|
+
this.request = request;
|
|
19
|
+
this.cache = {};
|
|
20
|
+
}
|
|
21
|
+
get name() {
|
|
22
|
+
return "base";
|
|
23
|
+
}
|
|
24
|
+
get withCredentials() {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
static retryFailedRequests() {
|
|
28
|
+
BaseHttpService.failedRequests.forEach(r => r());
|
|
29
|
+
BaseHttpService.failedRequests = [];
|
|
30
|
+
}
|
|
31
|
+
get universal() {
|
|
32
|
+
return this.storage.universal;
|
|
33
|
+
}
|
|
34
|
+
url(url) {
|
|
35
|
+
return url;
|
|
36
|
+
}
|
|
37
|
+
createUrl(url, params) {
|
|
38
|
+
const httpParams = this.client.makeParams(params);
|
|
39
|
+
const query = httpParams.keys().map(key => {
|
|
40
|
+
return `${key}=${httpParams.get(key)}`;
|
|
41
|
+
}).join("&");
|
|
42
|
+
return `${this.url(url)}?${query}`;
|
|
43
|
+
}
|
|
44
|
+
makeListParams(page, itemsPerPage, orderBy = null, orderDescending = null, filter = null) {
|
|
45
|
+
const params = {
|
|
46
|
+
page: (page - 1),
|
|
47
|
+
limit: itemsPerPage
|
|
48
|
+
};
|
|
49
|
+
if (!ObjectUtils.isNullOrUndefined(orderBy) && !ObjectUtils.isNullOrUndefined(orderDescending)) {
|
|
50
|
+
params.sort = `${orderDescending ? "-" : ""}${orderBy}`;
|
|
51
|
+
}
|
|
52
|
+
if (!ObjectUtils.isNullOrUndefined(filter)) {
|
|
53
|
+
params.filter = filter;
|
|
54
|
+
}
|
|
55
|
+
return params;
|
|
56
|
+
}
|
|
57
|
+
getPromise(url, options, body) {
|
|
58
|
+
options = this.makeOptions(options, "GET", body);
|
|
59
|
+
return this.toPromise(url, options);
|
|
60
|
+
}
|
|
61
|
+
deletePromise(url, options, body) {
|
|
62
|
+
options = this.makeOptions(options, "DELETE", body);
|
|
63
|
+
return this.toPromise(url, options);
|
|
64
|
+
}
|
|
65
|
+
postPromise(url, body, options) {
|
|
66
|
+
options = this.makeOptions(options, "POST", body);
|
|
67
|
+
return this.toPromise(url, options);
|
|
68
|
+
}
|
|
69
|
+
putPromise(url, body, options) {
|
|
70
|
+
options = this.makeOptions(options, "PUT", body);
|
|
71
|
+
return this.toPromise(url, options);
|
|
72
|
+
}
|
|
73
|
+
patchPromise(url, body, options) {
|
|
74
|
+
options = this.makeOptions(options, "PATCH", body);
|
|
75
|
+
return this.toPromise(url, options);
|
|
76
|
+
}
|
|
77
|
+
uploadPromise(url, body, listener, options) {
|
|
78
|
+
const headers = {};
|
|
79
|
+
if (body instanceof Blob) {
|
|
80
|
+
headers["Content-Type"] = "application/octet-stream";
|
|
81
|
+
}
|
|
82
|
+
options = this.makeOptions(Object.assign({
|
|
83
|
+
headers: headers,
|
|
84
|
+
reportProgress: true
|
|
85
|
+
}, options), "POST", body);
|
|
86
|
+
return this.toPromise(url, options, listener);
|
|
87
|
+
}
|
|
88
|
+
listPromise(url, params) {
|
|
89
|
+
return new Promise(resolve => {
|
|
90
|
+
this.getPromise(url, { params: params }).then(data => {
|
|
91
|
+
var _a, _b;
|
|
92
|
+
if (ObjectUtils.isArray(data)) {
|
|
93
|
+
resolve({
|
|
94
|
+
total: data.length,
|
|
95
|
+
items: data,
|
|
96
|
+
meta: {}
|
|
97
|
+
});
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
resolve({
|
|
101
|
+
total: ((_a = data.meta) === null || _a === void 0 ? void 0 : _a.total) || (data === null || data === void 0 ? void 0 : data.total) || ((_b = data.items) === null || _b === void 0 ? void 0 : _b.length) || 0,
|
|
102
|
+
items: data.items || [],
|
|
103
|
+
meta: data.meta || {}
|
|
104
|
+
});
|
|
105
|
+
}, response => {
|
|
106
|
+
if (response.status == 0 || response.status == 301) {
|
|
107
|
+
resolve({
|
|
108
|
+
total: 1,
|
|
109
|
+
items: [{
|
|
110
|
+
id: null,
|
|
111
|
+
label: "Not implemented."
|
|
112
|
+
}],
|
|
113
|
+
meta: {}
|
|
114
|
+
});
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
resolve({
|
|
118
|
+
total: 0,
|
|
119
|
+
items: [],
|
|
120
|
+
meta: {}
|
|
121
|
+
});
|
|
122
|
+
return false;
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
handleUnauthorizedError(absoluteUrl, options, reject) {
|
|
127
|
+
reject();
|
|
128
|
+
if (BaseHttpService.failedRequests.length > 1) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (this.universal.isServer)
|
|
132
|
+
return;
|
|
133
|
+
console.log("User auth error", absoluteUrl, options);
|
|
134
|
+
}
|
|
135
|
+
toastWarning(message, issueContext, reason, options) {
|
|
136
|
+
this.toaster.warning(message, { issueContext, reason, options });
|
|
137
|
+
}
|
|
138
|
+
toastError(message, issueContext, reason, options) {
|
|
139
|
+
this.toaster.warning(message, { issueContext, reason, options });
|
|
140
|
+
}
|
|
141
|
+
toPromise(url, options, listener) {
|
|
142
|
+
const issueContext = { url: "" };
|
|
143
|
+
return new HttpPromise(response => {
|
|
144
|
+
if (!response) {
|
|
145
|
+
if (this.universal.isServer)
|
|
146
|
+
return;
|
|
147
|
+
console.log("You may not need a reject Handler for this request!", this.name, url, options);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const reason = response.error || {};
|
|
151
|
+
if (response.status == 0 || response.status == 301) {
|
|
152
|
+
this.toastWarning(`${url} endpoint is not implemented! Click here, to quickly create an issue.`, issueContext, reason, options);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const regex = /((E11000 duplicate key error collection: (.)+\.)|(_1 dup key:(.)+))/g;
|
|
156
|
+
if (reason.message && regex.test(reason.message)) {
|
|
157
|
+
this.toastError("message.duplicate-key.error." + reason.message.replace(regex, "").replace(" index: ", "-"), issueContext, reason, options);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
this.toastWarning(`${url} endpoint error is not handled properly! Click here, to quickly create an issue.`, issueContext, reason, options);
|
|
161
|
+
}, (resolve, reject) => {
|
|
162
|
+
this.absoluteUrl(url, options).then(absoluteUrl => {
|
|
163
|
+
issueContext.url = absoluteUrl;
|
|
164
|
+
const request = this.client.request(options.method, absoluteUrl, options);
|
|
165
|
+
const finalRequest = ObjectUtils.isNumber(options.timeout) && options.timeout > 0
|
|
166
|
+
? request.pipe(timeout(options.timeout)) : request;
|
|
167
|
+
finalRequest.subscribe((event) => {
|
|
168
|
+
if (options.reportProgress && event.type === HttpEventType.UploadProgress) {
|
|
169
|
+
const progress = {
|
|
170
|
+
percentage: MathUtils.round(event.loaded / event.total, 2, 0.01),
|
|
171
|
+
loaded: event.loaded,
|
|
172
|
+
total: event.total
|
|
173
|
+
};
|
|
174
|
+
if (listener) {
|
|
175
|
+
listener(progress);
|
|
176
|
+
}
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const response = event instanceof HttpResponse ? event.body : event;
|
|
180
|
+
resolve(this.parseResponse(response, url, options));
|
|
181
|
+
const headers = options.headers;
|
|
182
|
+
const authKey = "Authorization";
|
|
183
|
+
// If we use token auth
|
|
184
|
+
if (this.client.renewTokenFunc && headers.has(authKey)) {
|
|
185
|
+
const currentTime = new Date().getTime();
|
|
186
|
+
const userTokenTime = this.storage.get("userTokenTime") || currentTime;
|
|
187
|
+
// And the last request was a long long time ago
|
|
188
|
+
if (currentTime - 600000 > userTokenTime) {
|
|
189
|
+
this.client.renewTokenFunc();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}, (response) => {
|
|
193
|
+
if (response instanceof TimeoutError || response.status == 0 || response.status == 301) {
|
|
194
|
+
reject(response);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const headers = options.headers;
|
|
198
|
+
const authKey = "Authorization";
|
|
199
|
+
// If an authorization header exists and we still have an Unauthorized response prompt the user to log in again
|
|
200
|
+
if (headers.has(authKey) && response.status == 401) {
|
|
201
|
+
BaseHttpService.failedRequests.push(() => {
|
|
202
|
+
options.headers = this.makeHeaders(options.originalHeaders);
|
|
203
|
+
this.toPromise(url, options, listener).then(resolve, reject);
|
|
204
|
+
});
|
|
205
|
+
this.handleUnauthorizedError(absoluteUrl, options, () => reject(response));
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
reject(response);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
checkHeaders(headers) {
|
|
214
|
+
if (!headers || !headers.cookie || !headers.referer || !headers.host) {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
return headers.referer.indexOf(headers.host) >= 0;
|
|
218
|
+
}
|
|
219
|
+
makeOptions(options, method = "GET", body) {
|
|
220
|
+
// Set base options
|
|
221
|
+
options = options ? Object.assign({}, options) : {};
|
|
222
|
+
options.params = this.client.makeParams(options.params);
|
|
223
|
+
options.observe = "body";
|
|
224
|
+
options.originalHeaders = options.originalHeaders || options.headers || {};
|
|
225
|
+
options.method = method;
|
|
226
|
+
options.withCredentials = ObjectUtils.isBoolean(options.withCredentials) ? options.withCredentials : this.withCredentials;
|
|
227
|
+
options.body = body || {};
|
|
228
|
+
// Set cookies from server side request
|
|
229
|
+
const headers = !this.request ? null : this.request.headers;
|
|
230
|
+
if (this.checkHeaders(headers)) {
|
|
231
|
+
options.headers["Cookie"] = headers.cookie;
|
|
232
|
+
}
|
|
233
|
+
options.headers = this.makeHeaders(options.originalHeaders, method);
|
|
234
|
+
return options;
|
|
235
|
+
}
|
|
236
|
+
makeHeaders(headers, method = "GET") {
|
|
237
|
+
return this.client.makeHeaders(headers);
|
|
238
|
+
}
|
|
239
|
+
parseResponse(response, url, options) {
|
|
240
|
+
return response;
|
|
241
|
+
}
|
|
242
|
+
parseUrl(url) {
|
|
243
|
+
return this.url(url).replace(/(?:((?!:).\/)\/)/g, "$1");
|
|
244
|
+
}
|
|
245
|
+
absoluteUrl(url, options) {
|
|
246
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
247
|
+
const absoluteUrl = this.parseUrl(url);
|
|
248
|
+
if (url == "api-docs") {
|
|
249
|
+
return absoluteUrl.replace("/api", "");
|
|
250
|
+
}
|
|
251
|
+
return absoluteUrl;
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
expressRequestUrl(url) {
|
|
255
|
+
const req = this.request;
|
|
256
|
+
if (!req || !url || url.startsWith("http") || url.startsWith("//"))
|
|
257
|
+
return url;
|
|
258
|
+
const separator = url.startsWith("/") ? "" : "/";
|
|
259
|
+
return `${req.protocol}://${req.get("host")}${separator}${url}`;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
BaseHttpService.failedRequests = [];
|
|
263
|
+
BaseHttpService.decorators = [
|
|
264
|
+
{ type: Injectable }
|
|
265
|
+
];
|
|
266
|
+
BaseHttpService.ctorParameters = () => [
|
|
267
|
+
{ type: BaseHttpClient, decorators: [{ type: Inject, args: [BaseHttpClient,] }] },
|
|
268
|
+
{ type: StorageService, decorators: [{ type: Inject, args: [StorageService,] }] },
|
|
269
|
+
{ type: undefined, decorators: [{ type: Inject, args: [LANGUAGE_SERVICE,] }] },
|
|
270
|
+
{ type: undefined, decorators: [{ type: Inject, args: [TOASTER_SERVICE,] }] },
|
|
271
|
+
{ type: undefined, decorators: [{ type: Inject, args: [CONFIG_SERVICE,] }] },
|
|
272
|
+
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [EXPRESS_REQUEST,] }] }
|
|
273
|
+
];
|
|
274
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1odHRwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiRDovV29yay9uZ3gtdXRpbHMvc3JjLyIsInNvdXJjZXMiOlsibmd4LXV0aWxzL3NlcnZpY2VzL2Jhc2UtaHR0cC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFvQixhQUFhLEVBQWUsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHakcsT0FBTyxFQUNILGNBQWMsRUFDZCxlQUFlLEVBQ2YsV0FBVyxFQVVYLGdCQUFnQixFQUVoQixlQUFlLEVBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUU5QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBR2xDLE1BQU0sT0FBTyxlQUFlO0lBdUJ4QixZQUE2QyxNQUFzQixFQUN0QixPQUF1QixFQUNyQixRQUEwQixFQUMzQixPQUF3QixFQUN6QixPQUF1QixFQUNWLFVBQW1CLElBQUk7UUFMcEMsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDckIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDekIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDVixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUU3RSxJQUFJLENBQUMsS0FB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QyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDL0UsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDakQsT0FBTyxHQUFHLEdBQUcsQ0FBQyxRQUFRLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDcEUsQ0FBQzs7QUFoUmdCLDhCQUFjLEdBQXNCLEVBQUUsQ0FBQzs7WUFIM0QsVUFBVTs7O1lBTkgsY0FBYyx1QkE4QkwsTUFBTSxTQUFDLGNBQWM7WUE1QjlCLGNBQWMsdUJBNkJMLE1BQU0sU0FBQyxjQUFjOzRDQUNyQixNQUFNLFNBQUMsZ0JBQWdCOzRDQUN2QixNQUFNLFNBQUMsZUFBZTs0Q0FDdEIsTUFBTSxTQUFDLGNBQWM7NENBQ3JCLFFBQVEsWUFBSSxNQUFNLFNBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEV2ZW50VHlwZSwgSHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7UmVxdWVzdH0gZnJvbSBcImV4cHJlc3NcIjtcclxuXHJcbmltcG9ydCB7XHJcbiAgICBDT05GSUdfU0VSVklDRSxcclxuICAgIEVYUFJFU1NfUkVRVUVTVCxcclxuICAgIEh0dHBQcm9taXNlLFxyXG4gICAgSUNvbmZpZ1NlcnZpY2UsXHJcbiAgICBJSHR0cEhlYWRlcnMsXHJcbiAgICBJSHR0cFBhcmFtcyxcclxuICAgIElIdHRwU2VydmljZSxcclxuICAgIElJc3N1ZUNvbnRleHQsXHJcbiAgICBJTGFuZ3VhZ2VTZXJ2aWNlLFxyXG4gICAgSVBhZ2luYXRpb25EYXRhLFxyXG4gICAgSVJlcXVlc3RPcHRpb25zLFxyXG4gICAgSVRvYXN0ZXJTZXJ2aWNlLFxyXG4gICAgTEFOR1VBR0VfU0VSVklDRSxcclxuICAgIFByb2dyZXNzTGlzdGVuZXIsXHJcbiAgICBUT0FTVEVSX1NFUlZJQ0VcclxufSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcblxyXG5pbXBvcnQge09iamVjdFV0aWxzfSBmcm9tIFwiLi4vdXRpbHMvb2JqZWN0LnV0aWxzXCI7XHJcbmltcG9ydCB7TWF0aFV0aWxzfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC51dGlsc1wiO1xyXG5cclxuaW1wb3J0IHtCYXNlSHR0cENsaWVudH0gZnJvbSBcIi4vYmFzZS1odHRwLmNsaWVudFwiO1xyXG5pbXBvcnQge1VuaXZlcnNhbFNlcnZpY2V9IGZyb20gXCIuL3VuaXZlcnNhbC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7U3RvcmFnZVNlcnZpY2V9IGZyb20gXCIuL3N0b3JhZ2Uuc2VydmljZVwiO1xyXG5pbXBvcnQge3RpbWVvdXR9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQge1RpbWVvdXRFcnJvcn0gZnJvbSBcInJ4anNcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEJhc2VIdHRwU2VydmljZSBpbXBsZW1lbnRzIElIdHRwU2VydmljZSB7XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBmYWlsZWRSZXF1ZXN0czogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcclxuXHJcbiAgICBnZXQgbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcImJhc2VcIjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IHdpdGhDcmVkZW50aWFscygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjYWNoZTogYW55O1xyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgcmV0cnlGYWlsZWRSZXF1ZXN0cygpOiB2b2lkIHtcclxuICAgICAgICBCYXNlSHR0cFNlcnZpY2UuZmFpbGVkUmVxdWVzdHMuZm9yRWFjaChyID0+IHIoKSk7XHJcbiAgICAgICAgQmFzZUh0dHBTZXJ2aWNlLmZhaWxlZFJlcXVlc3RzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHVuaXZlcnNhbCgpOiBVbml2ZXJzYWxTZXJ2aWNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLnVuaXZlcnNhbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEJhc2VIdHRwQ2xpZW50KSByZWFkb25seSBjbGllbnQ6IEJhc2VIdHRwQ2xpZW50LFxyXG4gICAgICAgICAgICAgICAgQEluamVjdChTdG9yYWdlU2VydmljZSkgcmVhZG9ubHkgc3RvcmFnZTogU3RvcmFnZVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBASW5qZWN0KExBTkdVQUdFX1NFUlZJQ0UpIHJlYWRvbmx5IGxhbmd1YWdlOiBJTGFuZ3VhZ2VTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgQEluamVjdChUT0FTVEVSX1NFUlZJQ0UpIHJlYWRvbmx5IHRvYXN0ZXI6IElUb2FzdGVyU2VydmljZSxcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoQ09ORklHX1NFUlZJQ0UpIHJlYWRvbmx5IGNvbmZpZ3M6IElDb25maWdTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChFWFBSRVNTX1JFUVVFU1QpIHJlYWRvbmx5IHJlcXVlc3Q6IFJlcXVlc3QgPSBudWxsXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLmNhY2hlID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgdXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVVybCh1cmw6IHN0cmluZywgcGFyYW1zOiBJSHR0cFBhcmFtcyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgaHR0cFBhcmFtcyA9IHRoaXMuY2xpZW50Lm1ha2VQYXJhbXMocGFyYW1zKTtcclxuICAgICAgICBjb25zdCBxdWVyeSA9IGh0dHBQYXJhbXMua2V5cygpLm1hcChrZXkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fT0ke2h0dHBQYXJhbXMuZ2V0KGtleSl9YDtcclxuICAgICAgICB9KS5qb2luKFwiJlwiKTtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy51cmwodXJsKX0/JHtxdWVyeX1gO1xyXG4gICAgfVxyXG5cclxuICAgIG1ha2VMaXN0UGFyYW1zKHBhZ2U6IG51bWJlciwgaXRlbXNQZXJQYWdlOiBudW1iZXIsIG9yZGVyQnk6IHN0cmluZyA9IG51bGwsIG9yZGVyRGVzY2VuZGluZzogYm9vbGVhbiA9IG51bGwsIGZpbHRlcjogc3RyaW5nID0gbnVsbCk6IElIdHRwUGFyYW1zIHtcclxuICAgICAgICBjb25zdCBwYXJhbXM6IElIdHRwUGFyYW1zID0ge1xyXG4gICAgICAgICAgICBwYWdlOiAocGFnZSAtIDEpLFxyXG4gICAgICAgICAgICBsaW1pdDogaXRlbXNQZXJQYWdlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmlzTnVsbE9yVW5kZWZpbmVkKG9yZGVyQnkpICYmICFPYmplY3RVdGlscy5pc051bGxPclVuZGVmaW5lZChvcmRlckRlc2NlbmRpbmcpKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcy5zb3J0ID0gYCR7b3JkZXJEZXNjZW5kaW5nID8gXCItXCIgOiBcIlwifSR7b3JkZXJCeX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmlzTnVsbE9yVW5kZWZpbmVkKGZpbHRlcikpIHtcclxuICAgICAgICAgICAgcGFyYW1zLmZpbHRlciA9IGZpbHRlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBhcmFtcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0UHJvbWlzZSh1cmw6IHN0cmluZywgb3B0aW9ucz86IElSZXF1ZXN0T3B0aW9ucywgYm9keT86IGFueSk6IEh0dHBQcm9taXNlIHtcclxuICAgICAgICBvcHRpb25zID0gdGhpcy5tYWtlT3B0aW9ucyhvcHRpb25zLCBcIkdFVFwiLCBib2R5KTtcclxuICAgICAgICByZXR1cm4gdGhpcy50b1Byb21pc2UodXJsLCBvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZGVsZXRlUHJvbWlzZSh1cmw6IHN0cmluZywgb3B0aW9ucz86IElSZXF1ZXN0T3B0aW9ucywgYm9keT86IGFueSk6IEh0dHBQcm9taXNlIHtcclxuICAgICAgICBvcHRpb25zID0gdGhpcy5tYWtlT3B0aW9ucyhvcHRpb25zLCBcIkRFTEVURVwiLCBib2R5KTtcclxuICAgICAgICByZXR1cm4gdGhpcy50b1Byb21pc2UodXJsLCBvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcG9zdFByb21pc2UodXJsOiBzdHJpbmcsIGJvZHk/OiBhbnksIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XHJcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMubWFrZU9wdGlvbnMob3B0aW9ucywgXCJQT1NUXCIsIGJvZHkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvUHJvbWlzZSh1cmwsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwdXRQcm9taXNlKHVybDogc3RyaW5nLCBib2R5PzogYW55LCBvcHRpb25zPzogSVJlcXVlc3RPcHRpb25zKTogSHR0cFByb21pc2Uge1xyXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm1ha2VPcHRpb25zKG9wdGlvbnMsIFwiUFVUXCIsIGJvZHkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvUHJvbWlzZSh1cmwsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwYXRjaFByb21pc2UodXJsOiBzdHJpbmcsIGJvZHk/OiBhbnksIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XHJcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMubWFrZU9wdGlvbnMob3B0aW9ucywgXCJQQVRDSFwiLCBib2R5KTtcclxuICAgICAgICByZXR1cm4gdGhpcy50b1Byb21pc2UodXJsLCBvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdXBsb2FkUHJvbWlzZSh1cmw6IHN0cmluZywgYm9keTogYW55LCBsaXN0ZW5lcj86IFByb2dyZXNzTGlzdGVuZXIsIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyczogYW55ID0ge307XHJcbiAgICAgICAgaWYgKGJvZHkgaW5zdGFuY2VvZiBCbG9iKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvcHRpb25zID0gdGhpcy5tYWtlT3B0aW9ucyhPYmplY3QuYXNzaWduKHtcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHRydWVcclxuICAgICAgICB9LCBvcHRpb25zKSwgXCJQT1NUXCIsIGJvZHkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvUHJvbWlzZSh1cmwsIG9wdGlvbnMsIGxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbGlzdFByb21pc2UodXJsOiBzdHJpbmcsIHBhcmFtczogSUh0dHBQYXJhbXMpOiBQcm9taXNlPElQYWdpbmF0aW9uRGF0YT4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxJUGFnaW5hdGlvbkRhdGE+KHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmdldFByb21pc2UodXJsLCB7cGFyYW1zOiBwYXJhbXN9KS50aGVuKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzQXJyYXkoZGF0YSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IGRhdGEubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YToge31cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbDogZGF0YS5tZXRhPy50b3RhbCB8fCBkYXRhPy50b3RhbCB8fCBkYXRhLml0ZW1zPy5sZW5ndGggfHwgMCxcclxuICAgICAgICAgICAgICAgICAgICBpdGVtczogZGF0YS5pdGVtcyB8fCBbXSxcclxuICAgICAgICAgICAgICAgICAgICBtZXRhOiBkYXRhLm1ldGEgfHwge31cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCByZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDAgfHwgcmVzcG9uc2Uuc3RhdHVzID09IDMwMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBcIk5vdCBpbXBsZW1lbnRlZC5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YToge31cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICBtZXRhOiB7fVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBoYW5kbGVVbmF1dGhvcml6ZWRFcnJvcihhYnNvbHV0ZVVybDogc3RyaW5nLCBvcHRpb25zOiBJUmVxdWVzdE9wdGlvbnMsIHJlamVjdDogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgICAgIHJlamVjdCgpO1xyXG4gICAgICAgIGlmIChCYXNlSHR0cFNlcnZpY2UuZmFpbGVkUmVxdWVzdHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnVuaXZlcnNhbC5pc1NlcnZlcikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiVXNlciBhdXRoIGVycm9yXCIsIGFic29sdXRlVXJsLCBvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdG9hc3RXYXJuaW5nKG1lc3NhZ2U6IHN0cmluZywgaXNzdWVDb250ZXh0OiBJSXNzdWVDb250ZXh0LCByZWFzb246IGFueSwgb3B0aW9uczogSVJlcXVlc3RPcHRpb25zKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50b2FzdGVyLndhcm5pbmcobWVzc2FnZSwge2lzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHRvYXN0RXJyb3IobWVzc2FnZTogc3RyaW5nLCBpc3N1ZUNvbnRleHQ6IElJc3N1ZUNvbnRleHQsIHJlYXNvbjogYW55LCBvcHRpb25zOiBJUmVxdWVzdE9wdGlvbnMpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRvYXN0ZXIud2FybmluZyhtZXNzYWdlLCB7aXNzdWVDb250ZXh0LCByZWFzb24sIG9wdGlvbnN9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdG9Qcm9taXNlKHVybDogc3RyaW5nLCBvcHRpb25zOiBJUmVxdWVzdE9wdGlvbnMsIGxpc3RlbmVyPzogUHJvZ3Jlc3NMaXN0ZW5lcik6IEh0dHBQcm9taXNlIHtcclxuICAgICAgICBjb25zdCBpc3N1ZUNvbnRleHQ6IElJc3N1ZUNvbnRleHQgPSB7dXJsOiBcIlwifTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBIdHRwUHJvbWlzZShyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVuaXZlcnNhbC5pc1NlcnZlcikgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJZb3UgbWF5IG5vdCBuZWVkIGEgcmVqZWN0IEhhbmRsZXIgZm9yIHRoaXMgcmVxdWVzdCFcIiwgdGhpcy5uYW1lLCB1cmwsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IHJlc3BvbnNlLmVycm9yIHx8IHt9O1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDAgfHwgcmVzcG9uc2Uuc3RhdHVzID09IDMwMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdFdhcm5pbmcoYCR7dXJsfSBlbmRwb2ludCBpcyBub3QgaW1wbGVtZW50ZWQhIENsaWNrIGhlcmUsIHRvIHF1aWNrbHkgY3JlYXRlIGFuIGlzc3VlLmAsIGlzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZWdleCA9IC8oKEUxMTAwMCBkdXBsaWNhdGUga2V5IGVycm9yIGNvbGxlY3Rpb246ICguKStcXC4pfChfMSBkdXAga2V5OiguKSspKS9nO1xyXG4gICAgICAgICAgICBpZiAocmVhc29uLm1lc3NhZ2UgJiYgcmVnZXgudGVzdChyZWFzb24ubWVzc2FnZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RFcnJvcihcIm1lc3NhZ2UuZHVwbGljYXRlLWtleS5lcnJvci5cIiArIHJlYXNvbi5tZXNzYWdlLnJlcGxhY2UocmVnZXgsIFwiXCIpLnJlcGxhY2UoXCIgaW5kZXg6IFwiLCBcIi1cIiksIGlzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnRvYXN0V2FybmluZyhgJHt1cmx9IGVuZHBvaW50IGVycm9yIGlzIG5vdCBoYW5kbGVkIHByb3Blcmx5ISBDbGljayBoZXJlLCB0byBxdWlja2x5IGNyZWF0ZSBhbiBpc3N1ZS5gLCBpc3N1ZUNvbnRleHQsIHJlYXNvbiwgb3B0aW9ucyk7XHJcbiAgICAgICAgfSwgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFic29sdXRlVXJsKHVybCwgb3B0aW9ucykudGhlbihhYnNvbHV0ZVVybCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpc3N1ZUNvbnRleHQudXJsID0gYWJzb2x1dGVVcmw7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5jbGllbnQucmVxdWVzdChvcHRpb25zLm1ldGhvZCwgYWJzb2x1dGVVcmwsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmluYWxSZXF1ZXN0ID0gT2JqZWN0VXRpbHMuaXNOdW1iZXIob3B0aW9ucy50aW1lb3V0KSAmJiBvcHRpb25zLnRpbWVvdXQgPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgPyByZXF1ZXN0LnBpcGUodGltZW91dChvcHRpb25zLnRpbWVvdXQpKSA6IHJlcXVlc3Q7XHJcbiAgICAgICAgICAgICAgICBmaW5hbFJlcXVlc3Quc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVwb3J0UHJvZ3Jlc3MgJiYgZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2U6IE1hdGhVdGlscy5yb3VuZChldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCwgMiwgMC4wMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKHByb2dyZXNzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyBldmVudC5ib2R5IDogZXZlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhcnNlUmVzcG9uc2UocmVzcG9uc2UsIHVybCwgb3B0aW9ucykpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgYXMgSHR0cEhlYWRlcnM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0aEtleSA9IFwiQXV0aG9yaXphdGlvblwiO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHVzZSB0b2tlbiBhdXRoXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2xpZW50LnJlbmV3VG9rZW5GdW5jICYmIGhlYWRlcnMuaGFzKGF1dGhLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJUb2tlblRpbWUgPSB0aGlzLnN0b3JhZ2UuZ2V0KFwidXNlclRva2VuVGltZVwiKSB8fCBjdXJyZW50VGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5kIHRoZSBsYXN0IHJlcXVlc3Qgd2FzIGEgbG9uZyBsb25nIHRpbWUgYWdvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSAtIDYwMDAwMCA+IHVzZXJUb2tlblRpbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LnJlbmV3VG9rZW5GdW5jKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCAocmVzcG9uc2U6IEh0dHBFcnJvclJlc3BvbnNlIHwgVGltZW91dEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgVGltZW91dEVycm9yIHx8IHJlc3BvbnNlLnN0YXR1cyA9PSAwIHx8IHJlc3BvbnNlLnN0YXR1cyA9PSAzMDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIGFzIEh0dHBIZWFkZXJzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dGhLZXkgPSBcIkF1dGhvcml6YXRpb25cIjtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBhdXRob3JpemF0aW9uIGhlYWRlciBleGlzdHMgYW5kIHdlIHN0aWxsIGhhdmUgYW4gVW5hdXRob3JpemVkIHJlc3BvbnNlIHByb21wdCB0aGUgdXNlciB0byBsb2cgaW4gYWdhaW5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVycy5oYXMoYXV0aEtleSkgJiYgcmVzcG9uc2Uuc3RhdHVzID09IDQwMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBCYXNlSHR0cFNlcnZpY2UuZmFpbGVkUmVxdWVzdHMucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSB0aGlzLm1ha2VIZWFkZXJzKG9wdGlvbnMub3JpZ2luYWxIZWFkZXJzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9Qcm9taXNlKHVybCwgb3B0aW9ucywgbGlzdGVuZXIpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVW5hdXRob3JpemVkRXJyb3IoYWJzb2x1dGVVcmwsIG9wdGlvbnMsICgpID0+IHJlamVjdChyZXNwb25zZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNoZWNrSGVhZGVycyhoZWFkZXJzOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIWhlYWRlcnMgfHwgIWhlYWRlcnMuY29va2llIHx8ICFoZWFkZXJzLnJlZmVyZXIgfHwgIWhlYWRlcnMuaG9zdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoZWFkZXJzLnJlZmVyZXIuaW5kZXhPZihoZWFkZXJzLmhvc3QpID49IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG1ha2VPcHRpb25zKG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMsIG1ldGhvZDogc3RyaW5nID0gXCJHRVRcIiwgYm9keT86IGFueSk6IElSZXF1ZXN0T3B0aW9ucyB7XHJcbiAgICAgICAgLy8gU2V0IGJhc2Ugb3B0aW9uc1xyXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8gey4uLm9wdGlvbnN9IDoge307XHJcbiAgICAgICAgb3B0aW9ucy5wYXJhbXMgPSB0aGlzLmNsaWVudC5tYWtlUGFyYW1zKG9wdGlvbnMucGFyYW1zKTtcclxuICAgICAgICBvcHRpb25zLm9ic2VydmUgPSBcImJvZHlcIjtcclxuICAgICAgICBvcHRpb25zLm9yaWdpbmFsSGVhZGVycyA9IG9wdGlvbnMub3JpZ2luYWxIZWFkZXJzIHx8IChvcHRpb25zLmhlYWRlcnMgYXMgSUh0dHBIZWFkZXJzKSB8fCB7fTtcclxuICAgICAgICBvcHRpb25zLm1ldGhvZCA9IG1ldGhvZDtcclxuICAgICAgICBvcHRpb25zLndpdGhDcmVkZW50aWFscyA9IE9iamVjdFV0aWxzLmlzQm9vbGVhbihvcHRpb25zLndpdGhDcmVkZW50aWFscykgPyBvcHRpb25zLndpdGhDcmVkZW50aWFscyA6IHRoaXMud2l0aENyZWRlbnRpYWxzO1xyXG4gICAgICAgIG9wdGlvbnMuYm9keSA9IGJvZHkgfHwge307XHJcbiAgICAgICAgLy8gU2V0IGNvb2tpZXMgZnJvbSBzZXJ2ZXIgc2lkZSByZXF1ZXN0XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9ICF0aGlzLnJlcXVlc3QgPyBudWxsIDogdGhpcy5yZXF1ZXN0LmhlYWRlcnM7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tIZWFkZXJzKGhlYWRlcnMpKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1tcIkNvb2tpZVwiXSA9IGhlYWRlcnMuY29va2llO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSB0aGlzLm1ha2VIZWFkZXJzKG9wdGlvbnMub3JpZ2luYWxIZWFkZXJzLCBtZXRob2QpO1xyXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBtYWtlSGVhZGVycyhoZWFkZXJzOiBJSHR0cEhlYWRlcnMsIG1ldGhvZDogc3RyaW5nID0gXCJHRVRcIik6IEh0dHBIZWFkZXJzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQubWFrZUhlYWRlcnMoaGVhZGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHBhcnNlUmVzcG9uc2UocmVzcG9uc2U6IGFueSwgdXJsOiBzdHJpbmcsIG9wdGlvbnM6IElSZXF1ZXN0T3B0aW9ucyk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwYXJzZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXJsKHVybCkucmVwbGFjZSgvKD86KCg/ITopLlxcLylcXC8pL2csIFwiJDFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFzeW5jIGFic29sdXRlVXJsKHVybDogc3RyaW5nLCBvcHRpb25zOiBJUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIGNvbnN0IGFic29sdXRlVXJsID0gdGhpcy5wYXJzZVVybCh1cmwpO1xyXG4gICAgICAgIGlmICh1cmwgPT0gXCJhcGktZG9jc1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhYnNvbHV0ZVVybC5yZXBsYWNlKFwiL2FwaVwiLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFic29sdXRlVXJsO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBleHByZXNzUmVxdWVzdFVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgcmVxID0gdGhpcy5yZXF1ZXN0O1xyXG4gICAgICAgIGlmICghcmVxIHx8ICF1cmwgfHwgdXJsLnN0YXJ0c1dpdGgoXCJodHRwXCIpIHx8IHVybC5zdGFydHNXaXRoKFwiLy9cIikpIHJldHVybiB1cmw7XHJcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gdXJsLnN0YXJ0c1dpdGgoXCIvXCIpID8gXCJcIiA6IFwiL1wiO1xyXG4gICAgICAgIHJldHVybiBgJHtyZXEucHJvdG9jb2x9Oi8vJHtyZXEuZ2V0KFwiaG9zdFwiKX0ke3NlcGFyYXRvcn0ke3VybH1gO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|