ng2-rest 13.0.30 → 13.0.33
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/app.d.ts +1 -0
- package/app.js +6 -165
- package/app.js.map +1 -1
- package/index.js +1 -1
- package/lib/content-type.js +1 -1
- package/lib/cookie.js +1 -1
- package/lib/helpers.js +1 -1
- package/lib/index.js +1 -1
- package/lib/mapping.js +1 -1
- package/lib/models.js +1 -1
- package/lib/other/simple-resource.js +1 -1
- package/lib/params.js +1 -1
- package/lib/request-cache.js +1 -1
- package/lib/resource.service.js +1 -1
- package/lib/rest-headers.js +1 -1
- package/lib/rest-request.js +1 -1
- package/lib/rest.class.js +1 -1
- package/package.json +4 -4
- package/tmp-environment.json +30 -31
- package/websql/README.md +24 -0
- package/websql/esm2020/lib/content-type.mjs +12 -0
- package/websql/esm2020/lib/cookie.mjs +27 -0
- package/websql/esm2020/lib/helpers.mjs +22 -0
- package/websql/esm2020/lib/index.mjs +11 -0
- package/websql/esm2020/lib/mapping.mjs +271 -0
- package/websql/esm2020/lib/models.mjs +142 -0
- package/websql/esm2020/lib/other/simple-resource.mjs +117 -0
- package/websql/esm2020/lib/params.mjs +305 -0
- package/websql/esm2020/lib/request-cache.mjs +95 -0
- package/websql/esm2020/lib/resource.service.mjs +255 -0
- package/websql/esm2020/lib/rest-headers.mjs +129 -0
- package/websql/esm2020/lib/rest-request.mjs +354 -0
- package/websql/esm2020/lib/rest.class.mjs +125 -0
- package/websql/esm2020/ng2-rest.mjs +5 -0
- package/websql/esm2020/public-api.mjs +2 -0
- package/websql/fesm2015/ng2-rest.mjs +1826 -0
- package/websql/fesm2015/ng2-rest.mjs.map +1 -0
- package/websql/fesm2020/ng2-rest.mjs +1823 -0
- package/websql/fesm2020/ng2-rest.mjs.map +1 -0
- package/websql/lib/content-type.d.ts +5 -0
- package/websql/lib/cookie.d.ts +8 -0
- package/websql/lib/helpers.d.ts +11 -0
- package/websql/lib/index.d.ts +10 -0
- package/websql/lib/mapping.d.ts +13 -0
- package/websql/lib/models.d.ts +156 -0
- package/websql/lib/other/simple-resource.d.ts +30 -0
- package/websql/lib/params.d.ts +24 -0
- package/websql/lib/request-cache.d.ts +14 -0
- package/websql/lib/resource.service.d.ts +44 -0
- package/websql/lib/rest-headers.d.ts +58 -0
- package/websql/lib/rest-request.d.ts +22 -0
- package/websql/lib/rest.class.d.ts +37 -0
- package/websql/ng2-rest.d.ts +5 -0
- package/websql/package.json +31 -0
- package/websql/public-api.d.ts +1 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { Subject } from 'rxjs';
|
|
2
|
+
import { Log, Level } from 'ng2-logger/websql';
|
|
3
|
+
const log = Log.create('resouce-service', Level.__NOTHING);
|
|
4
|
+
import { Rest } from './rest.class';
|
|
5
|
+
import { RestRequest } from './rest-request';
|
|
6
|
+
import { Cookie } from './cookie';
|
|
7
|
+
import { interpolateParamsToUrl, isValid, containsModels, getModels } from './params';
|
|
8
|
+
import { Helpers } from 'tnp-core/websql';
|
|
9
|
+
export class Resource {
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region constructor
|
|
12
|
+
constructor() {
|
|
13
|
+
setTimeout(() => {
|
|
14
|
+
const zone = this.getZone();
|
|
15
|
+
if (!RestRequest.zone) {
|
|
16
|
+
RestRequest.zone = zone;
|
|
17
|
+
}
|
|
18
|
+
;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
static get listenErrors() {
|
|
22
|
+
return this._listenErrors.asObservable();
|
|
23
|
+
}
|
|
24
|
+
static get listenSuccessOperations() {
|
|
25
|
+
return this._listenSuccess.asObservable();
|
|
26
|
+
}
|
|
27
|
+
//#region private mthods and fields
|
|
28
|
+
getZone() {
|
|
29
|
+
const isNode = (typeof window === 'undefined');
|
|
30
|
+
if (isNode) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
;
|
|
34
|
+
const ng = window['ng'];
|
|
35
|
+
const getAllAngularRootElements = window['getAllAngularRootElements'];
|
|
36
|
+
if (!ng || !getAllAngularRootElements) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const probe = ng.probe;
|
|
40
|
+
const coreTokens = ng.coreTokens;
|
|
41
|
+
if (!coreTokens || !coreTokens.NgZone) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const zoneClass = coreTokens.NgZone;
|
|
45
|
+
if (!probe || typeof probe !== 'function' || !getAllAngularRootElements) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const angularElements = getAllAngularRootElements();
|
|
49
|
+
if (!Array.isArray(angularElements) || angularElements.length === 0) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const rootElement = ng.probe(angularElements[0]);
|
|
53
|
+
if (!rootElement) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const injector = rootElement.injector;
|
|
57
|
+
if (!injector || !injector.get || typeof injector.get !== 'function') {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const zone = injector.get(zoneClass);
|
|
61
|
+
return zone;
|
|
62
|
+
}
|
|
63
|
+
static initAngularNgZone(zone) {
|
|
64
|
+
RestRequest.zone = zone;
|
|
65
|
+
}
|
|
66
|
+
checkNestedModels(model, allModels) {
|
|
67
|
+
// if (model.indexOf('/') !== -1) { //TODO make this better, becouse now I unecesary checking shit
|
|
68
|
+
for (let p in allModels) {
|
|
69
|
+
if (allModels.hasOwnProperty(p)) {
|
|
70
|
+
let m = allModels[p];
|
|
71
|
+
if (isValid(p)) {
|
|
72
|
+
let urlModels = getModels(p);
|
|
73
|
+
if (containsModels(model, urlModels)) {
|
|
74
|
+
model = p;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// }
|
|
81
|
+
return model;
|
|
82
|
+
}
|
|
83
|
+
static getModel(endpoint, model) {
|
|
84
|
+
model = Resource.prepareModel(model);
|
|
85
|
+
const e = Resource.endpoints[endpoint];
|
|
86
|
+
if (!e) {
|
|
87
|
+
return void 0;
|
|
88
|
+
}
|
|
89
|
+
const r = Resource.endpoints[endpoint].models[model];
|
|
90
|
+
return Resource.endpoints[endpoint].models[model];
|
|
91
|
+
}
|
|
92
|
+
//#endregion
|
|
93
|
+
//#region create
|
|
94
|
+
static create(e, model, entityMapping, circular, customContentType) {
|
|
95
|
+
const badRestRegEX = new RegExp('((\/:)[a-z]+)+', 'g');
|
|
96
|
+
const matchArr = model.match(badRestRegEX) || [];
|
|
97
|
+
const badModelsNextToEachOther = matchArr.join();
|
|
98
|
+
const atleas2DoubleDots = ((badModelsNextToEachOther.match(new RegExp(':', 'g')) || []).length >= 2);
|
|
99
|
+
if (atleas2DoubleDots && model.search(badModelsNextToEachOther) !== -1) {
|
|
100
|
+
throw new Error(`
|
|
101
|
+
|
|
102
|
+
Bad rest model: ${model}
|
|
103
|
+
|
|
104
|
+
Do not create rest models like this: /book/author/:bookid/:authorid
|
|
105
|
+
Instead use nested approach: /book/:bookid/author/:authorid
|
|
106
|
+
`);
|
|
107
|
+
}
|
|
108
|
+
;
|
|
109
|
+
Resource.map(e, e);
|
|
110
|
+
Resource.instance.add(e, model ? model : '', entityMapping, circular, customContentType);
|
|
111
|
+
// if (model.charAt(model.length - 1) !== '/') model = `${model}/`;
|
|
112
|
+
return {
|
|
113
|
+
model: (params) => Resource.instance.api(e, interpolateParamsToUrl(params, model)),
|
|
114
|
+
replay: (method) => {
|
|
115
|
+
Resource.getModel(e, model).replay(method);
|
|
116
|
+
},
|
|
117
|
+
get headers() {
|
|
118
|
+
return Resource.getModel(e, model).headers;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//#endregion
|
|
123
|
+
//#region reset
|
|
124
|
+
static reset() {
|
|
125
|
+
Resource.endpoints = {};
|
|
126
|
+
}
|
|
127
|
+
//#region map
|
|
128
|
+
static map(endpoint, url) {
|
|
129
|
+
log.i('url', url);
|
|
130
|
+
let regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/;
|
|
131
|
+
let e = endpoint;
|
|
132
|
+
if (!regex.test(url)) {
|
|
133
|
+
throw `Url address is not correct: ${url}`;
|
|
134
|
+
}
|
|
135
|
+
if (url.charAt(url.length - 1) === '/')
|
|
136
|
+
url = url.slice(0, url.length - 1);
|
|
137
|
+
log.i('url after', url);
|
|
138
|
+
if (Resource.endpoints[e] !== void 0) {
|
|
139
|
+
Helpers.log('Cannot use map function at the same API endpoint again ('
|
|
140
|
+
+ Resource.endpoints[e].url + ')');
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
Resource.endpoints[e] = {
|
|
144
|
+
url: url,
|
|
145
|
+
models: {},
|
|
146
|
+
entity: null
|
|
147
|
+
};
|
|
148
|
+
log.i('enpoints', Resource.endpoints);
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
//#endregion
|
|
152
|
+
static prepareModel(model) {
|
|
153
|
+
if (model.charAt(model.length - 1) === '/')
|
|
154
|
+
model = model.slice(0, model.length - 1);
|
|
155
|
+
if (model.charAt(0) === '/')
|
|
156
|
+
model = model.slice(1, model.length);
|
|
157
|
+
return model;
|
|
158
|
+
}
|
|
159
|
+
//#region add
|
|
160
|
+
/**
|
|
161
|
+
* And enipoint to application
|
|
162
|
+
*
|
|
163
|
+
* @param {E} endpoint
|
|
164
|
+
* @param {string} model
|
|
165
|
+
* @returns {boolean}
|
|
166
|
+
*/
|
|
167
|
+
add(endpoint, model, entity, circular, customContentType) {
|
|
168
|
+
log.i(`I am maping ${model} on ${endpoint}`);
|
|
169
|
+
model = Resource.prepareModel(model);
|
|
170
|
+
let e;
|
|
171
|
+
e = (endpoint).toString();
|
|
172
|
+
if (Resource.endpoints[e] === void 0) {
|
|
173
|
+
console.error('Endpoint is not mapped ! Cannot add model ' + model);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (Resource.endpoints[e].models[model] !== void 0) {
|
|
177
|
+
if (Resource.enableWarnings)
|
|
178
|
+
console.warn(`Model '${model}' is already defined in endpoint: `
|
|
179
|
+
+ Resource.endpoints[e].url);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
Resource.endpoints[e].models[model] =
|
|
183
|
+
new Rest(Resource.endpoints[e].url
|
|
184
|
+
+ '/' + model, Resource.request, {
|
|
185
|
+
endpoint: e,
|
|
186
|
+
path: model,
|
|
187
|
+
entity,
|
|
188
|
+
circular,
|
|
189
|
+
}, customContentType); // TODO put custom content type in meta ?
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
//#endregion
|
|
193
|
+
//#region api
|
|
194
|
+
/**
|
|
195
|
+
* Access api throught endpoint
|
|
196
|
+
*
|
|
197
|
+
* @param {E} endpoint
|
|
198
|
+
* @param {string} model
|
|
199
|
+
* @returns {Rest<T, TA>}
|
|
200
|
+
*/
|
|
201
|
+
api(endpoint, model) {
|
|
202
|
+
// log.i(`[api]
|
|
203
|
+
// creating for endpoint: "${endpoint}"
|
|
204
|
+
// model: "${model}"
|
|
205
|
+
// `)
|
|
206
|
+
if (model.charAt(0) === '/')
|
|
207
|
+
model = model.slice(1, model.length);
|
|
208
|
+
let e = (endpoint).toString();
|
|
209
|
+
if (Resource.endpoints[e] === void 0) {
|
|
210
|
+
throw `Endpoint: ${endpoint} is not mapped ! Cannot add model: ${model}`;
|
|
211
|
+
}
|
|
212
|
+
let allModels = Resource.endpoints[e].models;
|
|
213
|
+
let orgModel = model;
|
|
214
|
+
model = this.checkNestedModels(model, allModels);
|
|
215
|
+
if (Resource.endpoints[e].models[model] === void 0) {
|
|
216
|
+
// log.d('Resource.endpoints', Resource.endpoints);
|
|
217
|
+
throw `Model '${model}' is undefined in endpoint: ${Resource.endpoints[e].url} `;
|
|
218
|
+
}
|
|
219
|
+
let res = Resource.endpoints[(endpoint).toString()].models[model];
|
|
220
|
+
// log.d(`
|
|
221
|
+
// orgModel: ${orgModel}
|
|
222
|
+
// model: ${model}
|
|
223
|
+
// `)
|
|
224
|
+
if (orgModel !== model) {
|
|
225
|
+
let baseUrl = Resource.endpoints[(endpoint).toString()].url;
|
|
226
|
+
// log.d('base', Resource.endpoints[<string>(endpoint).toString()])
|
|
227
|
+
// log.d('baseUrl', baseUrl)
|
|
228
|
+
// log.d('orgModel', orgModel)
|
|
229
|
+
res.__rest_endpoint = `${baseUrl}/${orgModel}`;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
res.__rest_endpoint = void 0;
|
|
233
|
+
}
|
|
234
|
+
;
|
|
235
|
+
// log.i(`Resource.endpoints`, Resource.endpoints)
|
|
236
|
+
return res;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
Resource._listenErrors = new Subject();
|
|
240
|
+
Resource._listenSuccess = new Subject();
|
|
241
|
+
Resource.enableWarnings = true;
|
|
242
|
+
Resource.instance = new Resource();
|
|
243
|
+
Resource.endpoints = {};
|
|
244
|
+
Resource.request = new RestRequest();
|
|
245
|
+
//#endregion
|
|
246
|
+
Resource.Cookies = Cookie.Instance;
|
|
247
|
+
// const res = Resource.create('')
|
|
248
|
+
// res.model()
|
|
249
|
+
// .mock({
|
|
250
|
+
// code: 500,
|
|
251
|
+
// data: {},
|
|
252
|
+
// isArray: true
|
|
253
|
+
// })
|
|
254
|
+
// .array.
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RtcC1saWJzLWZvci1idW5kbGUtd2Vic3FsL25nMi1yZXN0L3Byb2plY3RzL25nMi1yZXN0L3NyYy9saWIvcmVzb3VyY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFDdEMsS0FBSyxDQUFDLFNBQVMsQ0FDaEIsQ0FBQTtBQUVELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHbEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXRGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQU96QyxNQUFNLE9BQU8sUUFBUTtJQWlIbkIsWUFBWTtJQUVaLHFCQUFxQjtJQUNyQjtRQUNFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUU7Z0JBQUUsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7YUFBRTtZQUFBLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBdEhNLE1BQU0sS0FBSyxZQUFZO1FBQzVCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVB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LEdBQUcsQ0FBQztZQUNwRSxtRUFBbUU7WUFDbkUsNEJBQTRCO1lBQzVCLDhCQUE4QjtZQUM5QixHQUFHLENBQUMsZUFBZSxHQUFHLEdBQUcsT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1NBQ2hEO2FBQU07WUFDTCxHQUFHLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxDQUFDO1NBQzlCO1FBQUEsQ0FBQztRQUVGLGtEQUFrRDtRQUNsRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7O0FBbFBnQixzQkFBYSxHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0FBQ25ELHVCQUFjLEdBQUcsSUFBSSxPQUFPLEVBQTRCLENBQUM7QUFRNUQsdUJBQWMsR0FBWSxJQUFJLENBQUM7QUErQzlCLGlCQUFRLEdBQUcsSUFBSSxRQUFRLEVBQW9CLENBQUM7QUFDNUMsa0JBQVMsR0FBRyxFQUFFLENBQUM7QUFRZixnQkFBTyxHQUFnQixJQUFJLFdBQVcsRUFBRSxDQUFDO0FBd0R4RCxZQUFZO0FBRUUsZ0JBQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBOEgxQyxrQ0FBa0M7QUFDbEMsY0FBYztBQUNkLFlBQVk7QUFDWixpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCLG9CQUFvQjtBQUNwQixPQUFPO0FBQ1AsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbIi8vI3JlZ2lvbiBpbXBvcnRzXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMb2csIExldmVsIH0gZnJvbSAnbmcyLWxvZ2dlci93ZWJzcWwnO1xuY29uc3QgbG9nID0gTG9nLmNyZWF0ZSgncmVzb3VjZS1zZXJ2aWNlJyxcbiAgTGV2ZWwuX19OT1RISU5HXG4pXG5cbmltcG9ydCB7IFJlc3QgfSBmcm9tICcuL3Jlc3QuY2xhc3MnO1xuaW1wb3J0IHsgUmVzdFJlcXVlc3QgfSBmcm9tICcuL3Jlc3QtcmVxdWVzdCc7XG5pbXBvcnQgeyBSZXN0SGVhZGVycyB9IGZyb20gJy4vcmVzdC1oZWFkZXJzJztcbmltcG9ydCB7IENvb2tpZSB9IGZyb20gJy4vY29va2llJztcbmltcG9ydCB7IE1hcHBpbmcgfSBmcm9tICcuL21hcHBpbmcnO1xuaW1wb3J0IHsgTW9kZWxzIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgaW50ZXJwb2xhdGVQYXJhbXNUb1VybCwgaXNWYWxpZCwgY29udGFpbnNNb2RlbHMsIGdldE1vZGVscyB9IGZyb20gJy4vcGFyYW1zJztcbmltcG9ydCB7IENpcmMgfSBmcm9tICdqc29uMTAvd2Vic3FsJztcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tICd0bnAtY29yZS93ZWJzcWwnXG5pbXBvcnQgeyBDT05URU5UX1RZUEUgfSBmcm9tICcuL2NvbnRlbnQtdHlwZSc7XG4vLyNlbmRyZWdpb25cblxuZGVjbGFyZSBjb25zdCBnbG9iYWw6IGFueTtcblxuXG5leHBvcnQgY2xhc3MgUmVzb3VyY2U8RSwgVCwgVEE+IHtcbiAgcHJvdGVjdGVkIHN0YXRpYyBfbGlzdGVuRXJyb3JzID0gbmV3IFN1YmplY3Q8TW9kZWxzLkJhY2tlbmRFcnJvcj4oKTtcbiAgcHJvdGVjdGVkIHN0YXRpYyBfbGlzdGVuU3VjY2VzcyA9IG5ldyBTdWJqZWN0PE1vZGVscy5IdHRwUmVzcG9uc2U8YW55Pj4oKTtcbiAgcHVibGljIHN0YXRpYyBnZXQgbGlzdGVuRXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9saXN0ZW5FcnJvcnMuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldCBsaXN0ZW5TdWNjZXNzT3BlcmF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdGVuU3VjY2Vzcy5hc09ic2VydmFibGUoKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGVuYWJsZVdhcm5pbmdzOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyNyZWdpb24gcHJpdmF0ZSBtdGhvZHMgYW5kIGZpZWxkc1xuICBwcml2YXRlIGdldFpvbmUoKSB7XG4gICAgY29uc3QgaXNOb2RlID0gKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKVxuICAgIGlmIChpc05vZGUpIHsgcmV0dXJuIH07XG4gICAgY29uc3QgbmcgPSB3aW5kb3dbJ25nJ107XG4gICAgY29uc3QgZ2V0QWxsQW5ndWxhclJvb3RFbGVtZW50cyA9IHdpbmRvd1snZ2V0QWxsQW5ndWxhclJvb3RFbGVtZW50cyddO1xuICAgIGlmICghbmcgfHwgIWdldEFsbEFuZ3VsYXJSb290RWxlbWVudHMpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgcHJvYmUgPSBuZy5wcm9iZTtcbiAgICBjb25zdCBjb3JlVG9rZW5zID0gbmcuY29yZVRva2VucztcbiAgICBpZiAoIWNvcmVUb2tlbnMgfHwgIWNvcmVUb2tlbnMuTmdab25lKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IHpvbmVDbGFzcyA9IGNvcmVUb2tlbnMuTmdab25lO1xuICAgIGlmICghcHJvYmUgfHwgdHlwZW9mIHByb2JlICE9PSAnZnVuY3Rpb24nIHx8ICFnZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IGFuZ3VsYXJFbGVtZW50czogYW55W10gPSBnZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzKCk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFuZ3VsYXJFbGVtZW50cykgfHwgYW5ndWxhckVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cbiAgICBjb25zdCByb290RWxlbWVudCA9IG5nLnByb2JlKGFuZ3VsYXJFbGVtZW50c1swXSk7XG4gICAgaWYgKCFyb290RWxlbWVudCkgeyByZXR1cm47IH1cbiAgICBjb25zdCBpbmplY3RvciA9IHJvb3RFbGVtZW50LmluamVjdG9yO1xuICAgIGlmICghaW5qZWN0b3IgfHwgIWluamVjdG9yLmdldCB8fCB0eXBlb2YgaW5qZWN0b3IuZ2V0ICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IHpvbmUgPSBpbmplY3Rvci5nZXQoem9uZUNsYXNzKVxuICAgIHJldHVybiB6b25lO1xuICB9XG5cblxuICBwdWJsaWMgc3RhdGljIGluaXRBbmd1bGFyTmdab25lKHpvbmUpIHtcbiAgICBSZXN0UmVxdWVzdC56b25lID0gem9uZTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tOZXN0ZWRNb2RlbHMobW9kZWw6IHN0cmluZywgYWxsTW9kZWxzOiBPYmplY3QpIHtcbiAgICAvLyBpZiAobW9kZWwuaW5kZXhPZignLycpICE9PSAtMSkgeyAvL1RPRE8gbWFrZSB0aGlzIGJldHRlciwgYmVjb3VzZSBub3cgSSB1bmVjZXNhcnkgY2hlY2tpbmcgc2hpdFxuICAgIGZvciAobGV0IHAgaW4gYWxsTW9kZWxzKSB7XG4gICAgICBpZiAoYWxsTW9kZWxzLmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICAgIGxldCBtID0gYWxsTW9kZWxzW3BdO1xuICAgICAgICBpZiAoaXNWYWxpZChwKSkge1xuICAgICAgICAgIGxldCB1cmxNb2RlbHMgPSBnZXRNb2RlbHMocCk7XG4gICAgICAgICAgaWYgKGNvbnRhaW5zTW9kZWxzKG1vZGVsLCB1cmxNb2RlbHMpKSB7XG4gICAgICAgICAgICBtb2RlbCA9IHA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlID0gbmV3IFJlc291cmNlPHN0cmluZywgYW55LCBhbnk+KCk7XG4gIHByaXZhdGUgc3RhdGljIGVuZHBvaW50cyA9IHt9O1xuICBwdWJsaWMgc3RhdGljIGdldE1vZGVsKGVuZHBvaW50OiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcpOiBSZXN0PGFueT4ge1xuICAgIG1vZGVsID0gUmVzb3VyY2UucHJlcGFyZU1vZGVsKG1vZGVsKTtcbiAgICBjb25zdCBlID0gUmVzb3VyY2UuZW5kcG9pbnRzW2VuZHBvaW50XTtcbiAgICBpZiAoIWUpIHsgcmV0dXJuIHZvaWQgMDsgfVxuICAgIGNvbnN0IHIgPSBSZXNvdXJjZS5lbmRwb2ludHNbZW5kcG9pbnRdLm1vZGVsc1ttb2RlbF07XG4gICAgcmV0dXJuIFJlc291cmNlLmVuZHBvaW50c1tlbmRwb2ludF0ubW9kZWxzW21vZGVsXTtcbiAgfVxuICBwcml2YXRlIHN0YXRpYyByZXF1ZXN0OiBSZXN0UmVxdWVzdCA9IG5ldyBSZXN0UmVxdWVzdCgpO1xuICAvLyNlbmRyZWdpb25cblxuXG4gIC8vI3JlZ2lvbiBjcmVhdGVcbiAgcHVibGljIHN0YXRpYyBjcmVhdGU8QSwgVEEgPSBBW10+KFxuICAgIGU6IHN0cmluZyxcbiAgICBtb2RlbD86IHN0cmluZyxcbiAgICBlbnRpdHlNYXBwaW5nPzogTWFwcGluZy5NYXBwaW5nLFxuICAgIGNpcmN1bGFyPzogQ2lyY1tdLFxuICAgIGN1c3RvbUNvbnRlbnRUeXBlPzogUmVzdEhlYWRlcnMsXG4gICk6IE1vZGVscy5SZXNvdXJjZU1vZGVsPEEsIFRBPiB7XG4gICAgY29uc3QgYmFkUmVzdFJlZ0VYID0gbmV3IFJlZ0V4cCgnKChcXC86KVthLXpdKykrJywgJ2cnKTtcbiAgICBjb25zdCBtYXRjaEFyciA9IG1vZGVsLm1hdGNoKGJhZFJlc3RSZWdFWCkgfHwgW107XG4gICAgY29uc3QgYmFkTW9kZWxzTmV4dFRvRWFjaE90aGVyID0gbWF0Y2hBcnIuam9pbigpO1xuICAgIGNvbnN0IGF0bGVhczJEb3VibGVEb3RzID0gKChiYWRNb2RlbHNOZXh0VG9FYWNoT3RoZXIubWF0Y2gobmV3IFJlZ0V4cCgnOicsICdnJykpIHx8IFtdKS5sZW5ndGggPj0gMik7XG4gICAgaWYgKGF0bGVhczJEb3VibGVEb3RzICYmIG1vZGVsLnNlYXJjaChiYWRNb2RlbHNOZXh0VG9FYWNoT3RoZXIpICE9PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcblxuQmFkIHJlc3QgbW9kZWw6ICR7bW9kZWx9XG5cbkRvIG5vdCBjcmVhdGUgcmVzdCBtb2RlbHMgbGlrZSB0aGlzOiAgICAvYm9vay9hdXRob3IvOmJvb2tpZC86YXV0aG9yaWRcbkluc3RlYWQgdXNlIG5lc3RlZCBhcHByb2FjaDogICAgICAgICAgICAvYm9vay86Ym9va2lkL2F1dGhvci86YXV0aG9yaWRcbiAgICAgICAgICAgIGApXG4gICAgfTtcbiAgICBSZXNvdXJjZS5tYXAoZSwgZSk7XG4gICAgUmVzb3VyY2UuaW5zdGFuY2UuYWRkKGUsIG1vZGVsID8gbW9kZWwgOiAnJywgZW50aXR5TWFwcGluZywgY2lyY3VsYXIsIGN1c3RvbUNvbnRlbnRUeXBlKTtcbiAgICAvLyBpZiAobW9kZWwuY2hhckF0KG1vZGVsLmxlbmd0aCAtIDEpICE9PSAnLycpIG1vZGVsID0gYCR7bW9kZWx9L2A7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsOiAocGFyYW1zPzogT2JqZWN0KSA9PiBSZXNvdXJjZS5pbnN0YW5jZS5hcGkoXG4gICAgICAgIGUsXG4gICAgICAgIGludGVycG9sYXRlUGFyYW1zVG9VcmwocGFyYW1zLCBtb2RlbClcbiAgICAgICksXG4gICAgICByZXBsYXk6IChtZXRob2Q6IE1vZGVscy5IdHRwTWV0aG9kKSA9PiB7XG4gICAgICAgIFJlc291cmNlLmdldE1vZGVsKGUsIG1vZGVsKS5yZXBsYXkobWV0aG9kKTtcbiAgICAgIH0sXG4gICAgICBnZXQgaGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIFJlc291cmNlLmdldE1vZGVsKGUsIG1vZGVsKS5oZWFkZXJzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gcmVzZXRcbiAgcHVibGljIHN0YXRpYyByZXNldCgpIHtcbiAgICBSZXNvdXJjZS5lbmRwb2ludHMgPSB7fTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gY29uc3RydWN0b3JcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHpvbmUgPSB0aGlzLmdldFpvbmUoKTtcbiAgICAgIGlmICghUmVzdFJlcXVlc3Quem9uZSkgeyBSZXN0UmVxdWVzdC56b25lID0gem9uZSB9O1xuICAgIH0pXG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgcHVibGljIHN0YXRpYyBDb29raWVzID0gQ29va2llLkluc3RhbmNlO1xuXG4gIC8vI3JlZ2lvbiBtYXBcbiAgcHJpdmF0ZSBzdGF0aWMgbWFwKGVuZHBvaW50OiBzdHJpbmcsIHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICBsb2cuaSgndXJsJywgdXJsKVxuICAgIGxldCByZWdleCA9IC8oaHR0cHxodHRwcyk6XFwvXFwvKFxcdys6ezAsMX1cXHcqKT8oXFxTKykoOlswLTldKyk/KFxcL3xcXC8oW1xcdyMhOi4/Kz0mJSFcXC1cXC9dKSk/LztcbiAgICBsZXQgZSA9IGVuZHBvaW50O1xuICAgIGlmICghcmVnZXgudGVzdCh1cmwpKSB7XG4gICAgICB0aHJvdyBgVXJsIGFkZHJlc3MgaXMgbm90IGNvcnJlY3Q6ICR7dXJsfWA7XG4gICAgfVxuICAgIGlmICh1cmwuY2hhckF0KHVybC5sZW5ndGggLSAxKSA9PT0gJy8nKSB1cmwgPSB1cmwuc2xpY2UoMCwgdXJsLmxlbmd0aCAtIDEpO1xuICAgIGxvZy5pKCd1cmwgYWZ0ZXInLCB1cmwpXG4gICAgaWYgKFJlc291cmNlLmVuZHBvaW50c1tlXSAhPT0gdm9pZCAwKSB7XG4gICAgICBIZWxwZXJzLmxvZygnQ2Fubm90IHVzZSBtYXAgZnVuY3Rpb24gYXQgdGhlIHNhbWUgQVBJIGVuZHBvaW50IGFnYWluICgnXG4gICAgICAgICsgUmVzb3VyY2UuZW5kcG9pbnRzW2VdLnVybCArICcpJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFJlc291cmNlLmVuZHBvaW50c1tlXSA9IHtcbiAgICAgIHVybDogdXJsLFxuICAgICAgbW9kZWxzOiB7fSxcbiAgICAgIGVudGl0eTogbnVsbFxuICAgIH07XG4gICAgbG9nLmkoJ2VucG9pbnRzJywgUmVzb3VyY2UuZW5kcG9pbnRzKVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIHByaXZhdGUgc3RhdGljIHByZXBhcmVNb2RlbChtb2RlbCkge1xuICAgIGlmIChtb2RlbC5jaGFyQXQobW9kZWwubGVuZ3RoIC0gMSkgPT09ICcvJykgbW9kZWwgPSBtb2RlbC5zbGljZSgwLCBtb2RlbC5sZW5ndGggLSAxKTtcbiAgICBpZiAobW9kZWwuY2hhckF0KDApID09PSAnLycpIG1vZGVsID0gbW9kZWwuc2xpY2UoMSwgbW9kZWwubGVuZ3RoKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuXG4gIC8vI3JlZ2lvbiBhZGRcbiAgLyoqXG4gICAqIEFuZCBlbmlwb2ludCB0byBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0V9IGVuZHBvaW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHByaXZhdGUgYWRkKGVuZHBvaW50OiBFLCBtb2RlbDogc3RyaW5nLCBlbnRpdHk6IE1hcHBpbmcuTWFwcGluZywgY2lyY3VsYXI/OiBDaXJjW10sIGN1c3RvbUNvbnRlbnRUeXBlPzogUmVzdEhlYWRlcnMpIHtcbiAgICBsb2cuaShgSSBhbSBtYXBpbmcgJHttb2RlbH0gb24gJHs8YW55PmVuZHBvaW50fWApO1xuICAgIG1vZGVsID0gUmVzb3VyY2UucHJlcGFyZU1vZGVsKG1vZGVsKTtcblxuICAgIGxldCBlOiBzdHJpbmc7XG4gICAgZSA9IDxzdHJpbmc+KGVuZHBvaW50KS50b1N0cmluZygpO1xuXG4gICAgaWYgKFJlc291cmNlLmVuZHBvaW50c1tlXSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFbmRwb2ludCBpcyBub3QgbWFwcGVkICEgQ2Fubm90IGFkZCBtb2RlbCAnICsgbW9kZWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoUmVzb3VyY2UuZW5kcG9pbnRzW2VdLm1vZGVsc1ttb2RlbF0gIT09IHZvaWQgMCkge1xuICAgICAgaWYgKFJlc291cmNlLmVuYWJsZVdhcm5pbmdzKSBjb25zb2xlLndhcm4oYE1vZGVsICcke21vZGVsfScgaXMgYWxyZWFkeSBkZWZpbmVkIGluIGVuZHBvaW50OiBgXG4gICAgICAgICsgUmVzb3VyY2UuZW5kcG9pbnRzW2VdLnVybCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFJlc291cmNlLmVuZHBvaW50c1tlXS5tb2RlbHNbbW9kZWxdID1cbiAgICAgIG5ldyBSZXN0PFQsIFRBPihSZXNvdXJjZS5lbmRwb2ludHNbZV0udXJsXG4gICAgICAgICsgJy8nICsgbW9kZWwsIFJlc291cmNlLnJlcXVlc3QsIHtcbiAgICAgICAgZW5kcG9pbnQ6IGUsXG4gICAgICAgIHBhdGg6IG1vZGVsLFxuICAgICAgICBlbnRpdHksXG4gICAgICAgIGNpcmN1bGFyLFxuICAgICAgfSwgY3VzdG9tQ29udGVudFR5cGUpOyAvLyBUT0RPIHB1dCBjdXN0b20gY29udGVudCB0eXBlIGluIG1ldGEgP1xuICAgIHJldHVybjtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gYXBpXG4gIC8qKlxuICAgKiBBY2Nlc3MgYXBpIHRocm91Z2h0IGVuZHBvaW50XG4gICAqXG4gICAqIEBwYXJhbSB7RX0gZW5kcG9pbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsXG4gICAqIEByZXR1cm5zIHtSZXN0PFQsIFRBPn1cbiAgICovXG4gIHByaXZhdGUgYXBpKGVuZHBvaW50OiBFLCBtb2RlbDogc3RyaW5nKTogUmVzdDxULCBUQT4ge1xuICAgIC8vIGxvZy5pKGBbYXBpXVxuXG4gICAgLy8gY3JlYXRpbmcgZm9yIGVuZHBvaW50OiBcIiR7ZW5kcG9pbnR9XCJcbiAgICAvLyBtb2RlbDogXCIke21vZGVsfVwiXG5cbiAgICAvLyBgKVxuICAgIGlmIChtb2RlbC5jaGFyQXQoMCkgPT09ICcvJykgbW9kZWwgPSBtb2RlbC5zbGljZSgxLCBtb2RlbC5sZW5ndGgpO1xuICAgIGxldCBlID0gPHN0cmluZz4oZW5kcG9pbnQpLnRvU3RyaW5nKCk7XG4gICAgaWYgKFJlc291cmNlLmVuZHBvaW50c1tlXSA9PT0gdm9pZCAwKSB7XG4gICAgICB0aHJvdyBgRW5kcG9pbnQ6ICR7PGFueT5lbmRwb2ludH0gaXMgbm90IG1hcHBlZCAhIENhbm5vdCBhZGQgbW9kZWw6ICR7bW9kZWx9YDtcbiAgICB9XG4gICAgbGV0IGFsbE1vZGVsczogT2JqZWN0ID0gUmVzb3VyY2UuZW5kcG9pbnRzW2VdLm1vZGVscztcbiAgICBsZXQgb3JnTW9kZWwgPSBtb2RlbDtcbiAgICBtb2RlbCA9IHRoaXMuY2hlY2tOZXN0ZWRNb2RlbHMobW9kZWwsIGFsbE1vZGVscyk7XG5cbiAgICBpZiAoUmVzb3VyY2UuZW5kcG9pbnRzW2VdLm1vZGVsc1ttb2RlbF0gPT09IHZvaWQgMCkge1xuICAgICAgLy8gbG9nLmQoJ1Jlc291cmNlLmVuZHBvaW50cycsIFJlc291cmNlLmVuZHBvaW50cyk7XG4gICAgICB0aHJvdyBgTW9kZWwgJyR7bW9kZWx9JyBpcyB1bmRlZmluZWQgaW4gZW5kcG9pbnQ6ICR7UmVzb3VyY2UuZW5kcG9pbnRzW2VdLnVybH0gYDtcbiAgICB9XG5cbiAgICBsZXQgcmVzOiBSZXN0PFQsIFRBPiA9IFJlc291cmNlLmVuZHBvaW50c1s8c3RyaW5nPihlbmRwb2ludCkudG9TdHJpbmcoKV0ubW9kZWxzW21vZGVsXTtcblxuICAgIC8vIGxvZy5kKGBcbiAgICAvLyBvcmdNb2RlbDogJHtvcmdNb2RlbH1cbiAgICAvLyBtb2RlbDogJHttb2RlbH1cblxuICAgIC8vIGApXG4gICAgaWYgKG9yZ01vZGVsICE9PSBtb2RlbCkge1xuICAgICAgbGV0IGJhc2VVcmwgPSBSZXNvdXJjZS5lbmRwb2ludHNbPHN0cmluZz4oZW5kcG9pbnQpLnRvU3RyaW5nKCldLnVybDtcbiAgICAgIC8vIGxvZy5kKCdiYXNlJywgUmVzb3VyY2UuZW5kcG9pbnRzWzxzdHJpbmc+KGVuZHBvaW50KS50b1N0cmluZygpXSlcbiAgICAgIC8vIGxvZy5kKCdiYXNlVXJsJywgYmFzZVVybClcbiAgICAgIC8vIGxvZy5kKCdvcmdNb2RlbCcsIG9yZ01vZGVsKVxuICAgICAgcmVzLl9fcmVzdF9lbmRwb2ludCA9IGAke2Jhc2VVcmx9LyR7b3JnTW9kZWx9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLl9fcmVzdF9lbmRwb2ludCA9IHZvaWQgMDtcbiAgICB9O1xuXG4gICAgLy8gbG9nLmkoYFJlc291cmNlLmVuZHBvaW50c2AsIFJlc291cmNlLmVuZHBvaW50cylcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG59XG5cblxuXG4vLyBjb25zdCByZXMgPSBSZXNvdXJjZS5jcmVhdGUoJycpXG4vLyByZXMubW9kZWwoKVxuLy8gICAubW9jayh7XG4vLyAgICAgY29kZTogNTAwLFxuLy8gICAgIGRhdGE6IHt9LFxuLy8gICAgIGlzQXJyYXk6IHRydWVcbi8vICAgfSlcbi8vICAgLmFycmF5LlxuIl19
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
export class RestHeaders {
|
|
2
|
+
constructor(headers) {
|
|
3
|
+
/** @internal header names are lower case */
|
|
4
|
+
this._headers = new Map();
|
|
5
|
+
/** @internal map lower case names to actual names */
|
|
6
|
+
this._normalizedNames = new Map();
|
|
7
|
+
if (headers instanceof RestHeaders) {
|
|
8
|
+
headers.forEach((values, name) => {
|
|
9
|
+
values.forEach(value => this.set(name, value));
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
Object.keys(headers).forEach((name) => {
|
|
14
|
+
const values = (Array.isArray(headers[name]) ? headers[name] : [headers[name]]);
|
|
15
|
+
this.delete(name);
|
|
16
|
+
values.forEach(value => this.set(name, value));
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
static from(headers) {
|
|
21
|
+
if (!headers) {
|
|
22
|
+
return void 0;
|
|
23
|
+
}
|
|
24
|
+
return new RestHeaders(headers);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns a new RestHeaders instance from the given DOMString of Response RestHeaders
|
|
28
|
+
*/
|
|
29
|
+
static fromResponseHeaderString(headersString) {
|
|
30
|
+
const headers = new RestHeaders();
|
|
31
|
+
headersString.split('\n').forEach(line => {
|
|
32
|
+
const index = line.indexOf(':');
|
|
33
|
+
if (index > 0) {
|
|
34
|
+
const name = line.slice(0, index);
|
|
35
|
+
const value = line.slice(index + 1).trim();
|
|
36
|
+
headers.set(name, value);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
return headers;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Appends a header to existing list of header values for a given header name.
|
|
43
|
+
*/
|
|
44
|
+
append(name, value) {
|
|
45
|
+
const values = this.getAll(name);
|
|
46
|
+
if (values === null) {
|
|
47
|
+
this.set(name, value);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
values.push(value);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Deletes all header values for the given name.
|
|
55
|
+
*/
|
|
56
|
+
delete(name) {
|
|
57
|
+
const lcName = name.toLowerCase();
|
|
58
|
+
this._normalizedNames.delete(lcName);
|
|
59
|
+
this._headers.delete(lcName);
|
|
60
|
+
}
|
|
61
|
+
forEach(fn) {
|
|
62
|
+
this._headers.forEach((values, lcName) => fn(values, this._normalizedNames.get(lcName), this._headers));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Returns first header that matches given name.
|
|
66
|
+
*/
|
|
67
|
+
get(name) {
|
|
68
|
+
const values = this.getAll(name);
|
|
69
|
+
if (values === null) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
return values.length > 0 ? values[0] : null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Checks for existence of header by given name.
|
|
76
|
+
*/
|
|
77
|
+
has(name) { return this._headers.has(name.toLowerCase()); }
|
|
78
|
+
/**
|
|
79
|
+
* Returns the names of the headers
|
|
80
|
+
*/
|
|
81
|
+
keys() { return Array.from(this._normalizedNames.values()); }
|
|
82
|
+
/**
|
|
83
|
+
* Sets or overrides header value for given name.
|
|
84
|
+
*/
|
|
85
|
+
set(name, value) {
|
|
86
|
+
if (Array.isArray(value)) {
|
|
87
|
+
if (value.length) {
|
|
88
|
+
this._headers.set(name.toLowerCase(), [value.join(',')]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this._headers.set(name.toLowerCase(), [value]);
|
|
93
|
+
}
|
|
94
|
+
this.mayBeSetNormalizedName(name);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Returns values of all headers.
|
|
98
|
+
*/
|
|
99
|
+
values() { return Array.from(this._headers.values()); }
|
|
100
|
+
/**
|
|
101
|
+
* Returns string of all headers.
|
|
102
|
+
*/
|
|
103
|
+
// TODO(vicb): returns {[name: string]: string[]}
|
|
104
|
+
toJSON() {
|
|
105
|
+
const serialized = {};
|
|
106
|
+
if (!this._headers) {
|
|
107
|
+
debugger;
|
|
108
|
+
}
|
|
109
|
+
this._headers.forEach((values, name) => {
|
|
110
|
+
const split = [];
|
|
111
|
+
values.forEach(v => split.push(...v.split(',')));
|
|
112
|
+
serialized[this._normalizedNames.get(name)] = split;
|
|
113
|
+
});
|
|
114
|
+
return serialized;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Returns list of header values for a given name.
|
|
118
|
+
*/
|
|
119
|
+
getAll(name) {
|
|
120
|
+
return this.has(name) ? this._headers.get(name.toLowerCase()) : null;
|
|
121
|
+
}
|
|
122
|
+
mayBeSetNormalizedName(name) {
|
|
123
|
+
const lcName = name.toLowerCase();
|
|
124
|
+
if (!this._normalizedNames.has(lcName)) {
|
|
125
|
+
this._normalizedNames.set(lcName, name);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1oZWFkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWJ1bmRsZS13ZWJzcWwvbmcyLXJlc3QvcHJvamVjdHMvbmcyLXJlc3Qvc3JjL2xpYi9yZXN0LWhlYWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxPQUFPLFdBQVc7SUFjdEIsWUFBb0IsT0FBK0Q7UUFibkYsNENBQTRDO1FBQzVDLGFBQVEsR0FBMEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM1QyxxREFBcUQ7UUFDckQscUJBQWdCLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFXaEQsSUFBSSxPQUFPLFlBQVksV0FBVyxFQUFFO1lBQ2xDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFnQixFQUFFLElBQVksRUFBRSxFQUFFO2dCQUNqRCxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFO2dCQUM1QyxNQUFNLE1BQU0sR0FBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUSxDQUFDO2dCQUNqRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQixNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENB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LENBQUMsQ0FBQztRQUVILE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxJQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN2RSxDQUFDO0lBRU8sc0JBQXNCLENBQUMsSUFBWTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDekM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJhc2VkIG9uIEhlYWRlcnMgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL2h0dHAvc3JjL2hlYWRlcnMudHNcbiAqL1xuZXhwb3J0IHR5cGUgUmVzdEhlYWRlcnNPcHRpb25zID0gUmVzdEhlYWRlcnMgfCB7IFtuYW1lOiBzdHJpbmddOiAoc3RyaW5nIHwgc3RyaW5nW10pIH1cblxuZXhwb3J0IGNsYXNzIFJlc3RIZWFkZXJzIHtcbiAgLyoqIEBpbnRlcm5hbCBoZWFkZXIgbmFtZXMgYXJlIGxvd2VyIGNhc2UgKi9cbiAgX2hlYWRlcnM6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPiA9IG5ldyBNYXAoKTtcbiAgLyoqIEBpbnRlcm5hbCBtYXAgbG93ZXIgY2FzZSBuYW1lcyB0byBhY3R1YWwgbmFtZXMgKi9cbiAgX25vcm1hbGl6ZWROYW1lczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcblxuXG4gIHB1YmxpYyBzdGF0aWMgZnJvbShoZWFkZXJzPzogUmVzdEhlYWRlcnNPcHRpb25zKSB7XG4gICAgaWYgKCFoZWFkZXJzKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFJlc3RIZWFkZXJzKGhlYWRlcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihoZWFkZXJzPzogUmVzdEhlYWRlcnMgfCB7IFtuYW1lOiBzdHJpbmddOiAoc3RyaW5nIHwgc3RyaW5nW10pIH0pIHtcbiAgICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIFJlc3RIZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzLmZvckVhY2goKHZhbHVlczogc3RyaW5nW10sIG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB0aGlzLnNldChuYW1lLCB2YWx1ZSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5rZXlzKGhlYWRlcnMpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gKEFycmF5LmlzQXJyYXkoaGVhZGVyc1tuYW1lXSkgPyBoZWFkZXJzW25hbWVdIDogW2hlYWRlcnNbbmFtZV1dKSBhcyBhbnk7XG4gICAgICAgIHRoaXMuZGVsZXRlKG5hbWUpO1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB0aGlzLnNldChuYW1lLCB2YWx1ZSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgUmVzdEhlYWRlcnMgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gRE9NU3RyaW5nIG9mIFJlc3BvbnNlIFJlc3RIZWFkZXJzXG4gICAqL1xuICBzdGF0aWMgZnJvbVJlc3BvbnNlSGVhZGVyU3RyaW5nKGhlYWRlcnNTdHJpbmc6IHN0cmluZyk6IFJlc3RIZWFkZXJzIHtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IFJlc3RIZWFkZXJzKCk7XG5cbiAgICBoZWFkZXJzU3RyaW5nLnNwbGl0KCdcXG4nKS5mb3JFYWNoKGxpbmUgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGxpbmUuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGxpbmUuc2xpY2UoaW5kZXggKyAxKS50cmltKCk7XG4gICAgICAgIGhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBoZWFkZXIgdG8gZXhpc3RpbmcgbGlzdCBvZiBoZWFkZXIgdmFsdWVzIGZvciBhIGdpdmVuIGhlYWRlciBuYW1lLlxuICAgKi9cbiAgYXBwZW5kKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0QWxsKG5hbWUpO1xuXG4gICAgaWYgKHZhbHVlcyA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zZXQobmFtZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYWxsIGhlYWRlciB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBuYW1lLlxuICAgKi9cbiAgZGVsZXRlKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGxjTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLl9ub3JtYWxpemVkTmFtZXMuZGVsZXRlKGxjTmFtZSk7XG4gICAgdGhpcy5faGVhZGVycy5kZWxldGUobGNOYW1lKTtcbiAgfVxuXG4gIGZvckVhY2goZm46ICh2YWx1ZXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGhlYWRlcnM6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX2hlYWRlcnMuZm9yRWFjaChcbiAgICAgICh2YWx1ZXMsIGxjTmFtZSkgPT4gZm4odmFsdWVzLCB0aGlzLl9ub3JtYWxpemVkTmFtZXMuZ2V0KGxjTmFtZSksIHRoaXMuX2hlYWRlcnMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGZpcnN0IGhlYWRlciB0aGF0IG1hdGNoZXMgZ2l2ZW4gbmFtZS5cbiAgICovXG4gIGdldChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0QWxsKG5hbWUpO1xuXG4gICAgaWYgKHZhbHVlcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgZm9yIGV4aXN0ZW5jZSBvZiBoZWFkZXIgYnkgZ2l2ZW4gbmFtZS5cbiAgICovXG4gIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2hlYWRlcnMuaGFzKG5hbWUudG9Mb3dlckNhc2UoKSk7IH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGhlYWRlcnNcbiAgICovXG4gIGtleXMoKTogc3RyaW5nW10geyByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9ub3JtYWxpemVkTmFtZXMudmFsdWVzKCkpOyB9XG5cbiAgLyoqXG4gICAqIFNldHMgb3Igb3ZlcnJpZGVzIGhlYWRlciB2YWx1ZSBmb3IgZ2l2ZW4gbmFtZS5cbiAgICovXG4gIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9oZWFkZXJzLnNldChuYW1lLnRvTG93ZXJDYXNlKCksIFt2YWx1ZS5qb2luKCcsJyldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faGVhZGVycy5zZXQobmFtZS50b0xvd2VyQ2FzZSgpLCBbdmFsdWVdKTtcbiAgICB9XG4gICAgdGhpcy5tYXlCZVNldE5vcm1hbGl6ZWROYW1lKG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdmFsdWVzIG9mIGFsbCBoZWFkZXJzLlxuICAgKi9cbiAgdmFsdWVzKCk6IHN0cmluZ1tdW10geyByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9oZWFkZXJzLnZhbHVlcygpKTsgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHN0cmluZyBvZiBhbGwgaGVhZGVycy5cbiAgICovXG4gIC8vIFRPRE8odmljYik6IHJldHVybnMge1tuYW1lOiBzdHJpbmddOiBzdHJpbmdbXX1cbiAgdG9KU09OKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBzZXJpYWxpemVkOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgaWYgKCF0aGlzLl9oZWFkZXJzKSB7XG4gICAgICBkZWJ1Z2dlclxuICAgIH1cbiAgICB0aGlzLl9oZWFkZXJzLmZvckVhY2goKHZhbHVlczogc3RyaW5nW10sIG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3Qgc3BsaXQ6IHN0cmluZ1tdID0gW107XG4gICAgICB2YWx1ZXMuZm9yRWFjaCh2ID0+IHNwbGl0LnB1c2goLi4udi5zcGxpdCgnLCcpKSk7XG4gICAgICBzZXJpYWxpemVkW3RoaXMuX25vcm1hbGl6ZWROYW1lcy5nZXQobmFtZSldID0gc3BsaXQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGxpc3Qgb2YgaGVhZGVyIHZhbHVlcyBmb3IgYSBnaXZlbiBuYW1lLlxuICAgKi9cbiAgZ2V0QWxsKG5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5oYXMobmFtZSkgPyB0aGlzLl9oZWFkZXJzLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgbWF5QmVTZXROb3JtYWxpemVkTmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBsY05hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoIXRoaXMuX25vcm1hbGl6ZWROYW1lcy5oYXMobGNOYW1lKSkge1xuICAgICAgdGhpcy5fbm9ybWFsaXplZE5hbWVzLnNldChsY05hbWUsIG5hbWUpO1xuICAgIH1cbiAgfVxufVxuXG4iXX0=
|