@libs-ui/services-http-request 0.2.29 → 0.2.30-6.2
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/api-mockup.d.ts +85 -0
- package/esm2022/api-mockup.mjs +210 -0
- package/esm2022/http-request.service.mjs +28 -16
- package/esm2022/index.mjs +2 -1
- package/esm2022/interfaces/guild-auto-update-arguments-value.interface.mjs +1 -1
- package/fesm2022/libs-ui-services-http-request.mjs +238 -18
- package/fesm2022/libs-ui-services-http-request.mjs.map +1 -1
- package/http-request.service.d.ts +6 -3
- package/index.d.ts +1 -0
- package/interfaces/guild-auto-update-arguments-value.interface.d.ts +4 -0
- package/package.json +6 -3
package/api-mockup.d.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { HttpParams } from '@angular/common/http';
|
|
2
|
+
import { IHttpResponse } from '@libs-ui/interfaces-types';
|
|
3
|
+
import { UtilsHttpParamsRequest } from '@libs-ui/utils';
|
|
4
|
+
import { Observable } from 'rxjs';
|
|
5
|
+
/**
|
|
6
|
+
* Trả về các phương thức để xử lý danh sách dữ liệu mock
|
|
7
|
+
* @param data - Mảng dữ liệu mặc định để mock
|
|
8
|
+
* @param functionGetData - Hàm tùy chọn để lấy dữ liệu động thay vì sử dụng data mặc định
|
|
9
|
+
* @returns Đối tượng chứa các phương thức:
|
|
10
|
+
* - list: Trả về Promise với toàn bộ dữ liệu (có delay 250ms)
|
|
11
|
+
* - listObservable: Trả về Observable với toàn bộ dữ liệu (có delay 250ms)
|
|
12
|
+
* - listPaging: Trả về Promise với dữ liệu đã phân trang dựa trên params (có delay 250ms)
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const mockData = [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }];
|
|
17
|
+
* const listService = returnListObject(mockData);
|
|
18
|
+
*
|
|
19
|
+
* // Lấy toàn bộ dữ liệu
|
|
20
|
+
* const allData = await listService.list();
|
|
21
|
+
*
|
|
22
|
+
* // Lấy dữ liệu phân trang
|
|
23
|
+
* const params = new UtilsHttpParamsRequest();
|
|
24
|
+
* params.set('page', '1');
|
|
25
|
+
* params.set('per_page', '10');
|
|
26
|
+
* const pagedData = await listService.listPaging(params);
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare const returnListObject: (data?: Array<any>, functionGetData?: () => Array<any>) => {
|
|
30
|
+
list: <TypeResponse>() => Promise<IHttpResponse<TypeResponse>>;
|
|
31
|
+
listObservable: <TypeResponse>() => Observable<IHttpResponse<TypeResponse>>;
|
|
32
|
+
listPaging: <TypeResponse>(params: UtilsHttpParamsRequest) => Promise<IHttpResponse<TypeResponse>>;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Tạo một đối tượng mock detail với các phương thức để lấy bản ghi riêng lẻ theo khóa.
|
|
36
|
+
* Hỗ trợ cả mảng dữ liệu tĩnh và các hàm dữ liệu động.
|
|
37
|
+
*
|
|
38
|
+
* @template TypeResponse - Kiểu dữ liệu phản hồi mong đợi
|
|
39
|
+
* @template TypeParams - Kiểu tham số HTTP (mặc định là any)
|
|
40
|
+
*
|
|
41
|
+
* @param httpParams - Tham số HTTP chứa:
|
|
42
|
+
* - keys: Khóa (hoặc các khóa) cần tìm kiếm
|
|
43
|
+
* - fieldKey: Tên trường để so khớp (mặc định là 'id')
|
|
44
|
+
* - dataResponseOject: Cờ boolean để định dạng đối tượng phản hồi
|
|
45
|
+
* @param data - Mảng dữ liệu tĩnh tùy chọn để tìm kiếm
|
|
46
|
+
* @param functionGetData - Hàm tùy chọn trả về dữ liệu (có thể là Promise hoặc Observable)
|
|
47
|
+
* @param ignoreSplit - Nếu true, coi keys như một giá trị đơn thay vì tách chuỗi
|
|
48
|
+
* @param splitOperator - Toán tử tùy chỉnh để tách keys (mặc định là dấu phẩy)
|
|
49
|
+
*
|
|
50
|
+
* @returns Đối tượng với các phương thức:
|
|
51
|
+
* - detailByData: Tìm kiếm thông qua mảng dữ liệu tĩnh được cung cấp
|
|
52
|
+
* - detailByFunction: Gọi functionGetData để lấy dữ liệu mới, sau đó tìm kiếm
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* const params = new UtilsHttpParamsRequest({fromObject:{keys:'1',fieldKey:'id'}});
|
|
57
|
+
* const mockDetail = returnDetailObject<User>(params, userData);
|
|
58
|
+
* const user = await mockDetail.detailByData();
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export declare const returnDetailObject: <TypeResponse, TypeParams = any>(httpParams: UtilsHttpParamsRequest<TypeParams> | HttpParams, data?: Array<any>, functionGetData?: () => Promise<IHttpResponse<TypeResponse>> | Observable<IHttpResponse<TypeResponse>>, ignoreSplit?: boolean, splitOperator?: string) => {
|
|
62
|
+
detailByData: (keys?: any) => Promise<IHttpResponse<TypeResponse>>;
|
|
63
|
+
detailByFunction: (keys?: any) => Promise<IHttpResponse<TypeResponse>>;
|
|
64
|
+
};
|
|
65
|
+
export declare const getConfigListDataDemo: (httpParamsDetail?: UtilsHttpParamsRequest<any>, objectData?: Record<string, string>, functionBuildObject?: (numIncrement: string) => Record<string, string>) => {
|
|
66
|
+
list: <TypeResponse>(params: UtilsHttpParamsRequest) => Promise<IHttpResponse<TypeResponse>>;
|
|
67
|
+
detailByData: (keys?: any) => Promise<IHttpResponse<unknown>>;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Hàm phân trang dữ liệu từ một mảng
|
|
71
|
+
* @param data - Mảng dữ liệu cần phân trang
|
|
72
|
+
* @param page - Số trang hiện tại (bắt đầu từ 1)
|
|
73
|
+
* @param per_page - Số lượng item trên mỗi trang
|
|
74
|
+
* @returns Đối tượng chứa dữ liệu đã phân trang và thông tin phân trang
|
|
75
|
+
*/
|
|
76
|
+
export declare const pagingToList: (data: Array<any>, page: number, per_page: number) => {
|
|
77
|
+
code: number;
|
|
78
|
+
data: any[];
|
|
79
|
+
paging: {
|
|
80
|
+
page: number;
|
|
81
|
+
per_page: number;
|
|
82
|
+
total_items: number;
|
|
83
|
+
total_pages: number;
|
|
84
|
+
};
|
|
85
|
+
};
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { UtilsHttpParamsRequest, get, isNil, set, isEqual } from '@libs-ui/utils';
|
|
2
|
+
import { delay, lastValueFrom, of, timer } from 'rxjs';
|
|
3
|
+
/**
|
|
4
|
+
* Trả về các phương thức để xử lý danh sách dữ liệu mock
|
|
5
|
+
* @param data - Mảng dữ liệu mặc định để mock
|
|
6
|
+
* @param functionGetData - Hàm tùy chọn để lấy dữ liệu động thay vì sử dụng data mặc định
|
|
7
|
+
* @returns Đối tượng chứa các phương thức:
|
|
8
|
+
* - list: Trả về Promise với toàn bộ dữ liệu (có delay 250ms)
|
|
9
|
+
* - listObservable: Trả về Observable với toàn bộ dữ liệu (có delay 250ms)
|
|
10
|
+
* - listPaging: Trả về Promise với dữ liệu đã phân trang dựa trên params (có delay 250ms)
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const mockData = [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }];
|
|
15
|
+
* const listService = returnListObject(mockData);
|
|
16
|
+
*
|
|
17
|
+
* // Lấy toàn bộ dữ liệu
|
|
18
|
+
* const allData = await listService.list();
|
|
19
|
+
*
|
|
20
|
+
* // Lấy dữ liệu phân trang
|
|
21
|
+
* const params = new UtilsHttpParamsRequest();
|
|
22
|
+
* params.set('page', '1');
|
|
23
|
+
* params.set('per_page', '10');
|
|
24
|
+
* const pagedData = await listService.listPaging(params);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export const returnListObject = (data, functionGetData) => {
|
|
28
|
+
return {
|
|
29
|
+
list: async () => {
|
|
30
|
+
if (functionGetData) {
|
|
31
|
+
data = functionGetData();
|
|
32
|
+
}
|
|
33
|
+
await lastValueFrom(timer(250));
|
|
34
|
+
return {
|
|
35
|
+
code: 200,
|
|
36
|
+
data: data || [],
|
|
37
|
+
paging: {},
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
listObservable: () => {
|
|
41
|
+
if (functionGetData) {
|
|
42
|
+
data = functionGetData();
|
|
43
|
+
}
|
|
44
|
+
return of({
|
|
45
|
+
code: 200,
|
|
46
|
+
data: data || [],
|
|
47
|
+
paging: {},
|
|
48
|
+
}).pipe(delay(250));
|
|
49
|
+
},
|
|
50
|
+
listPaging: async (params) => {
|
|
51
|
+
if (functionGetData) {
|
|
52
|
+
data = functionGetData();
|
|
53
|
+
}
|
|
54
|
+
const page = parseInt(params.get('page') || '1');
|
|
55
|
+
const per_page = parseInt(params.get('per_page') || '30');
|
|
56
|
+
const result = pagingToList(data, page, per_page);
|
|
57
|
+
await lastValueFrom(timer(250));
|
|
58
|
+
return result;
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Tạo một đối tượng mock detail với các phương thức để lấy bản ghi riêng lẻ theo khóa.
|
|
64
|
+
* Hỗ trợ cả mảng dữ liệu tĩnh và các hàm dữ liệu động.
|
|
65
|
+
*
|
|
66
|
+
* @template TypeResponse - Kiểu dữ liệu phản hồi mong đợi
|
|
67
|
+
* @template TypeParams - Kiểu tham số HTTP (mặc định là any)
|
|
68
|
+
*
|
|
69
|
+
* @param httpParams - Tham số HTTP chứa:
|
|
70
|
+
* - keys: Khóa (hoặc các khóa) cần tìm kiếm
|
|
71
|
+
* - fieldKey: Tên trường để so khớp (mặc định là 'id')
|
|
72
|
+
* - dataResponseOject: Cờ boolean để định dạng đối tượng phản hồi
|
|
73
|
+
* @param data - Mảng dữ liệu tĩnh tùy chọn để tìm kiếm
|
|
74
|
+
* @param functionGetData - Hàm tùy chọn trả về dữ liệu (có thể là Promise hoặc Observable)
|
|
75
|
+
* @param ignoreSplit - Nếu true, coi keys như một giá trị đơn thay vì tách chuỗi
|
|
76
|
+
* @param splitOperator - Toán tử tùy chỉnh để tách keys (mặc định là dấu phẩy)
|
|
77
|
+
*
|
|
78
|
+
* @returns Đối tượng với các phương thức:
|
|
79
|
+
* - detailByData: Tìm kiếm thông qua mảng dữ liệu tĩnh được cung cấp
|
|
80
|
+
* - detailByFunction: Gọi functionGetData để lấy dữ liệu mới, sau đó tìm kiếm
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* const params = new UtilsHttpParamsRequest({fromObject:{keys:'1',fieldKey:'id'}});
|
|
85
|
+
* const mockDetail = returnDetailObject<User>(params, userData);
|
|
86
|
+
* const user = await mockDetail.detailByData();
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
export const returnDetailObject = (httpParams, data, functionGetData, ignoreSplit, splitOperator) => {
|
|
90
|
+
const keysPrams = httpParams.get('keys');
|
|
91
|
+
const fieldKey = httpParams.get('fieldKey') || 'id';
|
|
92
|
+
const dataResponseOject = httpParams.get('dataResponseOject');
|
|
93
|
+
return {
|
|
94
|
+
detailByData: async (keys) => {
|
|
95
|
+
return filterData(fieldKey, data, keys ?? keysPrams, dataResponseOject, ignoreSplit, splitOperator);
|
|
96
|
+
},
|
|
97
|
+
detailByFunction: async (keys) => {
|
|
98
|
+
if (!functionGetData) {
|
|
99
|
+
return await filterData(fieldKey, undefined, undefined, dataResponseOject, ignoreSplit, splitOperator);
|
|
100
|
+
}
|
|
101
|
+
let dataResult = functionGetData();
|
|
102
|
+
try {
|
|
103
|
+
if (dataResult['subscribe']) {
|
|
104
|
+
dataResult = await lastValueFrom(dataResult);
|
|
105
|
+
}
|
|
106
|
+
if (dataResult['then']) {
|
|
107
|
+
dataResult = await dataResult;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (_) {
|
|
111
|
+
dataResult = { data: [] };
|
|
112
|
+
}
|
|
113
|
+
data = dataResult.data;
|
|
114
|
+
return await filterData(fieldKey, data, keys || keysPrams, dataResponseOject, ignoreSplit, splitOperator);
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
const filterData = (fieldKey, data, keys, dataResponseOject, ignoreSplit, splitOperator) => {
|
|
119
|
+
if (!data || typeof data !== 'object' || isNil(keys) || keys === '') {
|
|
120
|
+
return {
|
|
121
|
+
code: 200,
|
|
122
|
+
data: undefined,
|
|
123
|
+
paging: {},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
data = data || [];
|
|
127
|
+
if (!(data instanceof Array)) {
|
|
128
|
+
data = [data];
|
|
129
|
+
}
|
|
130
|
+
const result = [];
|
|
131
|
+
if (!ignoreSplit && typeof keys === 'string') {
|
|
132
|
+
keys = keys.split(splitOperator || ',');
|
|
133
|
+
}
|
|
134
|
+
if (typeof keys === 'number' || typeof keys === 'boolean' || (typeof keys === 'string' && ignoreSplit)) {
|
|
135
|
+
keys = [keys];
|
|
136
|
+
}
|
|
137
|
+
keys.forEach((key) => {
|
|
138
|
+
const resultFilter = data?.filter((elData) => isEqual(get(elData, fieldKey), key, { ignoreExactlyDataType: true }));
|
|
139
|
+
if (resultFilter && resultFilter.length) {
|
|
140
|
+
result.push(...resultFilter);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
return {
|
|
144
|
+
code: 200,
|
|
145
|
+
data: result.length ? (dataResponseOject ? result[0] : result) : undefined,
|
|
146
|
+
paging: {},
|
|
147
|
+
};
|
|
148
|
+
};
|
|
149
|
+
const per_page = 20;
|
|
150
|
+
const total_items = per_page * 150 + 15;
|
|
151
|
+
export const getConfigListDataDemo = (httpParamsDetail = new UtilsHttpParamsRequest(), objectData, functionBuildObject) => {
|
|
152
|
+
if (!objectData) {
|
|
153
|
+
objectData = {
|
|
154
|
+
id: '',
|
|
155
|
+
name: 'item positon index ',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const data = [...Array(total_items).keys()].map((_, index) => {
|
|
159
|
+
if (functionBuildObject) {
|
|
160
|
+
return functionBuildObject(`${+index + 1}`);
|
|
161
|
+
}
|
|
162
|
+
const obj = {};
|
|
163
|
+
Object.keys(objectData).forEach((key) => {
|
|
164
|
+
set(obj, key, `${objectData[key]}${+index + 1}`);
|
|
165
|
+
});
|
|
166
|
+
return obj;
|
|
167
|
+
});
|
|
168
|
+
const listService = returnListObject(data);
|
|
169
|
+
const detailService = returnDetailObject(httpParamsDetail, data, undefined, false, ';');
|
|
170
|
+
return {
|
|
171
|
+
list: listService.listPaging,
|
|
172
|
+
detailByData: detailService.detailByData,
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* Hàm phân trang dữ liệu từ một mảng
|
|
177
|
+
* @param data - Mảng dữ liệu cần phân trang
|
|
178
|
+
* @param page - Số trang hiện tại (bắt đầu từ 1)
|
|
179
|
+
* @param per_page - Số lượng item trên mỗi trang
|
|
180
|
+
* @returns Đối tượng chứa dữ liệu đã phân trang và thông tin phân trang
|
|
181
|
+
*/
|
|
182
|
+
export const pagingToList = (data, page, per_page) => {
|
|
183
|
+
if (!data || !Array.isArray(data)) {
|
|
184
|
+
return {
|
|
185
|
+
code: 200,
|
|
186
|
+
data: [],
|
|
187
|
+
paging: {
|
|
188
|
+
page: page,
|
|
189
|
+
per_page: per_page,
|
|
190
|
+
total_items: 0,
|
|
191
|
+
total_pages: 0,
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const start = (page - 1) * per_page;
|
|
196
|
+
const end = start + per_page;
|
|
197
|
+
const total_pages = Math.ceil(data.length / per_page);
|
|
198
|
+
const dataByPage = data.slice(start, end);
|
|
199
|
+
return {
|
|
200
|
+
code: 200,
|
|
201
|
+
data: dataByPage,
|
|
202
|
+
paging: {
|
|
203
|
+
page: page > total_pages ? total_pages : page,
|
|
204
|
+
per_page: per_page,
|
|
205
|
+
total_items: data.length,
|
|
206
|
+
total_pages: total_pages,
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLW1vY2t1cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvaHR0cC1yZXF1ZXN0L3NyYy9hcGktbW9ja3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRixPQUFPLEVBQWMsS0FBSyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5FOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUVILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsSUFBaUIsRUFBRSxlQUFrQyxFQUFFLEVBQUU7SUFDeEYsT0FBTztRQUNMLElBQUksRUFBRSxLQUFLLElBQXdELEVBQUU7WUFDbkUsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxHQUFHLGVBQWUsRUFBRSxDQUFDO1lBQzNCLENBQUM7WUFDRCxNQUFNLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoQyxPQUFPO2dCQUNMLElBQUksRUFBRSxHQUFHO2dCQUNULElBQUksRUFBRyxJQUFZLElBQUksRUFBRTtnQkFDekIsTUFBTSxFQUFFLEVBQUU7YUFDWCxDQUFDO1FBQ0osQ0FBQztRQUNELGNBQWMsRUFBRSxHQUEwRCxFQUFFO1lBQzFFLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksR0FBRyxlQUFlLEVBQUUsQ0FBQztZQUMzQixDQUFDO1lBRUQsT0FBTyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsSUFBSSxFQUFHLElBQVksSUFBSSxFQUFFO2dCQUN6QixNQUFNLEVBQUUsRUFBRTthQUNYLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcs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QzFDLE9BQU87UUFDTCxJQUFJLEVBQUUsR0FBRztRQUNULElBQUksRUFBRSxVQUFVO1FBQ2hCLE1BQU0sRUFBRTtZQUNOLElBQUksRUFBRSxJQUFJLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDN0MsUUFBUSxFQUFFLFFBQVE7WUFDbEIsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ3hCLFdBQVcsRUFBRSxXQUFXO1NBQ3pCO0tBQ0YsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IElIdHRwUmVzcG9uc2UgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3QsIGdldCwgaXNOaWwsIHNldCwgaXNFcXVhbCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGRlbGF5LCBsYXN0VmFsdWVGcm9tLCBvZiwgdGltZXIgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBUcuG6oyB24buBIGPDoWMgcGjGsMahbmcgdGjhu6ljIMSR4buDIHjhu60gbMO9IGRhbmggc8OhY2ggZOG7ryBsaeG7h3UgbW9ja1xuICogQHBhcmFtIGRhdGEgLSBN4bqjbmcgZOG7ryBsaeG7h3UgbeG6t2MgxJHhu4tuaCDEkeG7gyBtb2NrXG4gKiBAcGFyYW0gZnVuY3Rpb25HZXREYXRhIC0gSMOgbSB0w7l5IGNo4buNbiDEkeG7gyBs4bqleSBk4buvIGxp4buHdSDEkeG7mW5nIHRoYXkgdsOsIHPhu60gZOG7pW5nIGRhdGEgbeG6t2MgxJHhu4tuaFxuICogQHJldHVybnMgxJDhu5FpIHTGsOG7o25nIGNo4bupYSBjw6FjIHBoxrDGoW5nIHRo4bupYzpcbiAqICAgLSBsaXN0OiBUcuG6oyB24buBIFByb21pc2UgduG7m2kgdG/DoG4gYuG7mSBk4buvIGxp4buHdSAoY8OzIGRlbGF5IDI1MG1zKVxuICogICAtIGxpc3RPYnNlcnZhYmxlOiBUcuG6oyB24buBIE9ic2VydmFibGUgduG7m2kgdG/DoG4gYuG7mSBk4buvIGxp4buHdSAoY8OzIGRlbGF5IDI1MG1zKVxuICogICAtIGxpc3RQYWdpbmc6IFRy4bqjIHbhu4EgUHJvbWlzZSB24bubaSBk4buvIGxp4buHdSDEkcOjIHBow6JuIHRyYW5nIGThu7FhIHRyw6puIHBhcmFtcyAoY8OzIGRlbGF5IDI1MG1zKVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtb2NrRGF0YSA9IFt7IGlkOiAxLCBuYW1lOiAnSXRlbSAxJyB9LCB7IGlkOiAyLCBuYW1lOiAnSXRlbSAyJyB9XTtcbiAqIGNvbnN0IGxpc3RTZXJ2aWNlID0gcmV0dXJuTGlzdE9iamVjdChtb2NrRGF0YSk7XG4gKlxuICogLy8gTOG6pXkgdG/DoG4gYuG7mSBk4buvIGxp4buHdVxuICogY29uc3QgYWxsRGF0YSA9IGF3YWl0IGxpc3RTZXJ2aWNlLmxpc3QoKTtcbiAqXG4gKiAvLyBM4bqleSBk4buvIGxp4buHdSBwaMOibiB0cmFuZ1xuICogY29uc3QgcGFyYW1zID0gbmV3IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3QoKTtcbiAqIHBhcmFtcy5zZXQoJ3BhZ2UnLCAnMScpO1xuICogcGFyYW1zLnNldCgncGVyX3BhZ2UnLCAnMTAnKTtcbiAqIGNvbnN0IHBhZ2VkRGF0YSA9IGF3YWl0IGxpc3RTZXJ2aWNlLmxpc3RQYWdpbmcocGFyYW1zKTtcbiAqIGBgYFxuICovXG5cbmV4cG9ydCBjb25zdCByZXR1cm5MaXN0T2JqZWN0ID0gKGRhdGE/OiBBcnJheTxhbnk+LCBmdW5jdGlvbkdldERhdGE/OiAoKSA9PiBBcnJheTxhbnk+KSA9PiB7XG4gIHJldHVybiB7XG4gICAgbGlzdDogYXN5bmMgPFR5cGVSZXNwb25zZT4oKTogUHJvbWlzZTxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+ID0+IHtcbiAgICAgIGlmIChmdW5jdGlvbkdldERhdGEpIHtcbiAgICAgICAgZGF0YSA9IGZ1bmN0aW9uR2V0RGF0YSgpO1xuICAgICAgfVxuICAgICAgYXdhaXQgbGFzdFZhbHVlRnJvbSh0aW1lcigyNTApKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IDIwMCxcbiAgICAgICAgZGF0YTogKGRhdGEgYXMgYW55KSB8fCBbXSxcbiAgICAgICAgcGFnaW5nOiB7fSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBsaXN0T2JzZXJ2YWJsZTogPFR5cGVSZXNwb25zZT4oKTogT2JzZXJ2YWJsZTxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+ID0+IHtcbiAgICAgIGlmIChmdW5jdGlvbkdldERhdGEpIHtcbiAgICAgICAgZGF0YSA9IGZ1bmN0aW9uR2V0RGF0YSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2Yoe1xuICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgIGRhdGE6IChkYXRhIGFzIGFueSkgfHwgW10sXG4gICAgICAgIHBhZ2luZzoge30sXG4gICAgICB9KS5waXBlKGRlbGF5KDI1MCkpO1xuICAgIH0sXG4gICAgbGlzdFBhZ2luZzogYXN5bmMgPFR5cGVSZXNwb25zZT4ocGFyYW1zOiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0KTogUHJvbWlzZTxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+ID0+IHtcbiAgICAgIGlmIChmdW5jdGlvbkdldERhdGEpIHtcbiAgICAgICAgZGF0YSA9IGZ1bmN0aW9uR2V0RGF0YSgpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFnZSA9IHBhcnNlSW50KHBhcmFtcy5nZXQoJ3BhZ2UnKSB8fCAnMScpO1xuICAgICAgY29uc3QgcGVyX3BhZ2UgPSBwYXJzZUludChwYXJhbXMuZ2V0KCdwZXJfcGFnZScpIHx8ICczMCcpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcGFnaW5nVG9MaXN0KGRhdGEgYXMgQXJyYXk8YW55PiwgcGFnZSwgcGVyX3BhZ2UpO1xuXG4gICAgICBhd2FpdCBsYXN0VmFsdWVGcm9tKHRpbWVyKDI1MCkpO1xuXG4gICAgICByZXR1cm4gcmVzdWx0IGFzIElIdHRwUmVzcG9uc2U8VHlwZVJlc3BvbnNlPjtcbiAgICB9LFxuICB9O1xufTtcblxuLyoqXG4gKiBU4bqhbyBt4buZdCDEkeG7kWkgdMaw4bujbmcgbW9jayBkZXRhaWwgduG7m2kgY8OhYyBwaMawxqFuZyB0aOG7qWMgxJHhu4MgbOG6pXkgYuG6o24gZ2hpIHJpw6puZyBs4bq7IHRoZW8ga2jDs2EuXG4gKiBI4buXIHRy4bujIGPhuqMgbeG6o25nIGThu68gbGnhu4d1IHTEqW5oIHbDoCBjw6FjIGjDoG0gZOG7ryBsaeG7h3UgxJHhu5luZy5cbiAqXG4gKiBAdGVtcGxhdGUgVHlwZVJlc3BvbnNlIC0gS2nhu4N1IGThu68gbGnhu4d1IHBo4bqjbiBo4buTaSBtb25nIMSR4bujaVxuICogQHRlbXBsYXRlIFR5cGVQYXJhbXMgLSBLaeG7g3UgdGhhbSBz4buRIEhUVFAgKG3hurdjIMSR4buLbmggbMOgIGFueSlcbiAqXG4gKiBAcGFyYW0gaHR0cFBhcmFtcyAtIFRoYW0gc+G7kSBIVFRQIGNo4bupYTpcbiAqICAgLSBrZXlzOiBLaMOzYSAoaG/hurdjIGPDoWMga2jDs2EpIGPhuqduIHTDrG0ga2nhur9tXG4gKiAgIC0gZmllbGRLZXk6IFTDqm4gdHLGsOG7nW5nIMSR4buDIHNvIGto4bubcCAobeG6t2MgxJHhu4tuaCBsw6AgJ2lkJylcbiAqICAgLSBkYXRhUmVzcG9uc2VPamVjdDogQ+G7nSBib29sZWFuIMSR4buDIMSR4buLbmggZOG6oW5nIMSR4buRaSB0xrDhu6NuZyBwaOG6o24gaOG7k2lcbiAqIEBwYXJhbSBkYXRhIC0gTeG6o25nIGThu68gbGnhu4d1IHTEqW5oIHTDuXkgY2jhu41uIMSR4buDIHTDrG0ga2nhur9tXG4gKiBAcGFyYW0gZnVuY3Rpb25HZXREYXRhIC0gSMOgbSB0w7l5IGNo4buNbiB0cuG6oyB24buBIGThu68gbGnhu4d1IChjw7MgdGjhu4MgbMOgIFByb21pc2UgaG/hurdjIE9ic2VydmFibGUpXG4gKiBAcGFyYW0gaWdub3JlU3BsaXQgLSBO4bq/dSB0cnVlLCBjb2kga2V5cyBuaMawIG3hu5l0IGdpw6EgdHLhu4sgxJHGoW4gdGhheSB2w6wgdMOhY2ggY2h14buXaVxuICogQHBhcmFtIHNwbGl0T3BlcmF0b3IgLSBUb8OhbiB04butIHTDuXkgY2jhu4luaCDEkeG7gyB0w6FjaCBrZXlzICht4bq3YyDEkeG7i25oIGzDoCBk4bqldSBwaOG6qXkpXG4gKlxuICogQHJldHVybnMgxJDhu5FpIHTGsOG7o25nIHbhu5tpIGPDoWMgcGjGsMahbmcgdGjhu6ljOlxuICogICAtIGRldGFpbEJ5RGF0YTogVMOsbSBraeG6v20gdGjDtG5nIHF1YSBt4bqjbmcgZOG7ryBsaeG7h3UgdMSpbmggxJHGsOG7o2MgY3VuZyBj4bqlcFxuICogICAtIGRldGFpbEJ5RnVuY3Rpb246IEfhu41pIGZ1bmN0aW9uR2V0RGF0YSDEkeG7gyBs4bqleSBk4buvIGxp4buHdSBt4bubaSwgc2F1IMSRw7MgdMOsbSBraeG6v21cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcGFyYW1zID0gbmV3IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3Qoe2Zyb21PYmplY3Q6e2tleXM6JzEnLGZpZWxkS2V5OidpZCd9fSk7XG4gKiBjb25zdCBtb2NrRGV0YWlsID0gcmV0dXJuRGV0YWlsT2JqZWN0PFVzZXI+KHBhcmFtcywgdXNlckRhdGEpO1xuICogY29uc3QgdXNlciA9IGF3YWl0IG1vY2tEZXRhaWwuZGV0YWlsQnlEYXRhKCk7XG4gKiBgYGBcbiAqL1xuXG5leHBvcnQgY29uc3QgcmV0dXJuRGV0YWlsT2JqZWN0ID0gPFR5cGVSZXNwb25zZSwgVHlwZVBhcmFtcyA9IGFueT4oXG4gIGh0dHBQYXJhbXM6IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3Q8VHlwZVBhcmFtcz4gfCBIdHRwUGFyYW1zLFxuICBkYXRhPzogQXJyYXk8YW55PixcbiAgZnVuY3Rpb25HZXREYXRhPzogKCkgPT4gUHJvbWlzZTxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+IHwgT2JzZXJ2YWJsZTxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+LFxuICBpZ25vcmVTcGxpdD86IGJvb2xlYW4sXG4gIHNwbGl0T3BlcmF0b3I/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBrZXlzUHJhbXM6IGFueSA9IGh0dHBQYXJhbXMuZ2V0KCdrZXlzJyk7XG4gIGNvbnN0IGZpZWxkS2V5OiBzdHJpbmcgPSBodHRwUGFyYW1zLmdldCgnZmllbGRLZXknKSB8fCAnaWQnO1xuICBjb25zdCBkYXRhUmVzcG9uc2VPamVjdDogYW55ID0gaHR0cFBhcmFtcy5nZXQoJ2RhdGFSZXNwb25zZU9qZWN0Jyk7XG5cbiAgcmV0dXJuIHtcbiAgICBkZXRhaWxCeURhdGE6IGFzeW5jIChrZXlzPzogYW55KTogUHJvbWlzZTxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+ID0+IHtcbiAgICAgIHJldHVybiBmaWx0ZXJEYXRhPFR5cGVSZXNwb25zZT4oZmllbGRLZXksIGRhdGEsIGtleXMgPz8ga2V5c1ByYW1zLCBkYXRhUmVzcG9uc2VPamVjdCwgaWdub3JlU3BsaXQsIHNwbGl0T3BlcmF0b3IpO1xuICAgIH0sXG5cbiAgICBkZXRhaWxCeUZ1bmN0aW9uOiBhc3luYyAoa2V5cz86IGFueSk6IFByb21pc2U8SUh0dHBSZXNwb25zZTxUeXBlUmVzcG9uc2U+PiA9PiB7XG4gICAgICBpZiAoIWZ1bmN0aW9uR2V0RGF0YSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZmlsdGVyRGF0YTxUeXBlUmVzcG9uc2U+KGZpZWxkS2V5LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZGF0YVJlc3BvbnNlT2plY3QsIGlnbm9yZVNwbGl0LCBzcGxpdE9wZXJhdG9yKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGRhdGFSZXN1bHQ6IGFueSA9IGZ1bmN0aW9uR2V0RGF0YSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZGF0YVJlc3VsdFsnc3Vic2NyaWJlJ10pIHtcbiAgICAgICAgICBkYXRhUmVzdWx0ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShkYXRhUmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YVJlc3VsdFsndGhlbiddKSB7XG4gICAgICAgICAgZGF0YVJlc3VsdCA9IGF3YWl0IGRhdGFSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgZGF0YVJlc3VsdCA9IHsgZGF0YTogW10gfTtcbiAgICAgIH1cblxuICAgICAgZGF0YSA9IGRhdGFSZXN1bHQuZGF0YTtcblxuICAgICAgcmV0dXJuIGF3YWl0IGZpbHRlckRhdGE8VHlwZVJlc3BvbnNlPihmaWVsZEtleSwgZGF0YSwga2V5cyB8fCBrZXlzUHJhbXMsIGRhdGFSZXNwb25zZU9qZWN0LCBpZ25vcmVTcGxpdCwgc3BsaXRPcGVyYXRvcik7XG4gICAgfSxcbiAgfTtcbn07XG5cbmNvbnN0IGZpbHRlckRhdGEgPSA8VHlwZVJlc3BvbnNlPihmaWVsZEtleTogc3RyaW5nLCBkYXRhPzogQXJyYXk8YW55Piwga2V5cz86IGFueSwgZGF0YVJlc3BvbnNlT2plY3Q/OiBib29sZWFuLCBpZ25vcmVTcGxpdD86IGJvb2xlYW4sIHNwbGl0T3BlcmF0b3I/OiBzdHJpbmcpOiBJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4gPT4ge1xuICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnIHx8IGlzTmlsKGtleXMpIHx8IGtleXMgPT09ICcnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IDIwMCxcbiAgICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICAgIHBhZ2luZzoge30sXG4gICAgfTtcbiAgfVxuXG4gIGRhdGEgPSBkYXRhIHx8IFtdO1xuXG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICBkYXRhID0gW2RhdGFdO1xuICB9XG4gIGNvbnN0IHJlc3VsdDogYW55ID0gW107XG5cbiAgaWYgKCFpZ25vcmVTcGxpdCAmJiB0eXBlb2Yga2V5cyA9PT0gJ3N0cmluZycpIHtcbiAgICBrZXlzID0ga2V5cy5zcGxpdChzcGxpdE9wZXJhdG9yIHx8ICcsJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleXMgPT09ICdudW1iZXInIHx8IHR5cGVvZiBrZXlzID09PSAnYm9vbGVhbicgfHwgKHR5cGVvZiBrZXlzID09PSAnc3RyaW5nJyAmJiBpZ25vcmVTcGxpdCkpIHtcbiAgICBrZXlzID0gW2tleXNdO1xuICB9XG5cbiAga2V5cy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdEZpbHRlciA9IGRhdGE/LmZpbHRlcigoZWxEYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PiBpc0VxdWFsKGdldChlbERhdGEsIGZpZWxkS2V5KSwga2V5LCB7IGlnbm9yZUV4YWN0bHlEYXRhVHlwZTogdHJ1ZSB9KSk7XG5cbiAgICBpZiAocmVzdWx0RmlsdGVyICYmIHJlc3VsdEZpbHRlci5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLnJlc3VsdEZpbHRlcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGNvZGU6IDIwMCxcbiAgICBkYXRhOiByZXN1bHQubGVuZ3RoID8gKGRhdGFSZXNwb25zZU9qZWN0ID8gcmVzdWx0WzBdIDogcmVzdWx0KSA6IHVuZGVmaW5lZCxcbiAgICBwYWdpbmc6IHt9LFxuICB9O1xufTtcblxuY29uc3QgcGVyX3BhZ2UgPSAyMDtcbmNvbnN0IHRvdGFsX2l0ZW1zID0gcGVyX3BhZ2UgKiAxNTAgKyAxNTtcblxuZXhwb3J0IGNvbnN0IGdldENvbmZpZ0xpc3REYXRhRGVtbyA9IChodHRwUGFyYW1zRGV0YWlsOiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PGFueT4gPSBuZXcgVXRpbHNIdHRwUGFyYW1zUmVxdWVzdCgpLCBvYmplY3REYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgZnVuY3Rpb25CdWlsZE9iamVjdD86IChudW1JbmNyZW1lbnQ6IHN0cmluZykgPT4gUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4ge1xuICBpZiAoIW9iamVjdERhdGEpIHtcbiAgICBvYmplY3REYXRhID0ge1xuICAgICAgaWQ6ICcnLFxuICAgICAgbmFtZTogJ2l0ZW0gcG9zaXRvbiBpbmRleCAnLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBkYXRhID0gWy4uLkFycmF5KHRvdGFsX2l0ZW1zKS5rZXlzKCldLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICBpZiAoZnVuY3Rpb25CdWlsZE9iamVjdCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uQnVpbGRPYmplY3QoYCR7K2luZGV4ICsgMX1gKTtcbiAgICB9XG4gICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgT2JqZWN0LmtleXMob2JqZWN0RGF0YSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBzZXQob2JqLCBrZXksIGAke29iamVjdERhdGFba2V5XX0keytpbmRleCArIDF9YCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfSk7XG5cbiAgY29uc3QgbGlzdFNlcnZpY2UgPSByZXR1cm5MaXN0T2JqZWN0KGRhdGEpO1xuICBjb25zdCBkZXRhaWxTZXJ2aWNlID0gcmV0dXJuRGV0YWlsT2JqZWN0KGh0dHBQYXJhbXNEZXRhaWwsIGRhdGEsIHVuZGVmaW5lZCwgZmFsc2UsICc7Jyk7XG4gIHJldHVybiB7XG4gICAgbGlzdDogbGlzdFNlcnZpY2UubGlzdFBhZ2luZyxcbiAgICBkZXRhaWxCeURhdGE6IGRldGFpbFNlcnZpY2UuZGV0YWlsQnlEYXRhLFxuICB9O1xufTtcblxuLyoqXG4gKiBIw6BtIHBow6JuIHRyYW5nIGThu68gbGnhu4d1IHThu6sgbeG7mXQgbeG6o25nXG4gKiBAcGFyYW0gZGF0YSAtIE3huqNuZyBk4buvIGxp4buHdSBj4bqnbiBwaMOibiB0cmFuZ1xuICogQHBhcmFtIHBhZ2UgLSBT4buRIHRyYW5nIGhp4buHbiB04bqhaSAoYuG6r3QgxJHhuqd1IHThu6sgMSlcbiAqIEBwYXJhbSBwZXJfcGFnZSAtIFPhu5EgbMaw4bujbmcgaXRlbSB0csOqbiBt4buXaSB0cmFuZ1xuICogQHJldHVybnMgxJDhu5FpIHTGsOG7o25nIGNo4bupYSBk4buvIGxp4buHdSDEkcOjIHBow6JuIHRyYW5nIHbDoCB0aMO0bmcgdGluIHBow6JuIHRyYW5nXG4gKi9cbmV4cG9ydCBjb25zdCBwYWdpbmdUb0xpc3QgPSAoZGF0YTogQXJyYXk8YW55PiwgcGFnZTogbnVtYmVyLCBwZXJfcGFnZTogbnVtYmVyKSA9PiB7XG4gIGlmICghZGF0YSB8fCAhQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiAyMDAsXG4gICAgICBkYXRhOiBbXSxcbiAgICAgIHBhZ2luZzoge1xuICAgICAgICBwYWdlOiBwYWdlLFxuICAgICAgICBwZXJfcGFnZTogcGVyX3BhZ2UsXG4gICAgICAgIHRvdGFsX2l0ZW1zOiAwLFxuICAgICAgICB0b3RhbF9wYWdlczogMCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBjb25zdCBzdGFydCA9IChwYWdlIC0gMSkgKiBwZXJfcGFnZTtcbiAgY29uc3QgZW5kID0gc3RhcnQgKyBwZXJfcGFnZTtcbiAgY29uc3QgdG90YWxfcGFnZXMgPSBNYXRoLmNlaWwoZGF0YS5sZW5ndGggLyBwZXJfcGFnZSk7XG4gIGNvbnN0IGRhdGFCeVBhZ2UgPSBkYXRhLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICByZXR1cm4ge1xuICAgIGNvZGU6IDIwMCxcbiAgICBkYXRhOiBkYXRhQnlQYWdlLFxuICAgIHBhZ2luZzoge1xuICAgICAgcGFnZTogcGFnZSA+IHRvdGFsX3BhZ2VzID8gdG90YWxfcGFnZXMgOiBwYWdlLFxuICAgICAgcGVyX3BhZ2U6IHBlcl9wYWdlLFxuICAgICAgdG90YWxfaXRlbXM6IGRhdGEubGVuZ3RoLFxuICAgICAgdG90YWxfcGFnZXM6IHRvdGFsX3BhZ2VzLFxuICAgIH0sXG4gIH07XG59O1xuIl19
|
|
@@ -5,41 +5,44 @@ import { UtilsCache, get, getKeyCacheByArrayObject, isEmpty, set } from '@libs-u
|
|
|
5
5
|
import { lastValueFrom } from 'rxjs';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
export class LibsUiHttpRequestService {
|
|
8
|
+
/** Chứa dữ liệu cache memory */
|
|
8
9
|
serviceStore;
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
/** Chứa các service common base api */
|
|
11
|
+
servicesCommon = {};
|
|
12
|
+
/** Chứa các service call api đến backend */
|
|
13
|
+
servicesApiModules = {};
|
|
11
14
|
constructor() {
|
|
12
15
|
this.serviceStore = new Map();
|
|
13
16
|
}
|
|
14
17
|
set ServicesCommon(serviceCommon) {
|
|
15
|
-
this.servicesCommon = serviceCommon;
|
|
18
|
+
this.servicesCommon = { ...this.servicesCommon, ...serviceCommon };
|
|
16
19
|
}
|
|
17
|
-
set
|
|
18
|
-
this.
|
|
20
|
+
set ServicesApiModules(servicesApiModules) {
|
|
21
|
+
this.servicesApiModules = { ...this.servicesApiModules, ...servicesApiModules };
|
|
19
22
|
}
|
|
20
23
|
getServiceByName(name) {
|
|
21
24
|
if (!name || !name.trim()) {
|
|
22
25
|
return undefined;
|
|
23
26
|
}
|
|
24
|
-
if (name.startsWith('common
|
|
27
|
+
if (name.startsWith('common')) {
|
|
25
28
|
if (!this.servicesCommon) {
|
|
26
29
|
throw 'service common is Empty, please inject MoLibsCoreUIHttpRequestService and call ServicesCommon update 1';
|
|
27
30
|
}
|
|
28
31
|
return this.servicesCommon[name];
|
|
29
32
|
}
|
|
30
|
-
if (name.startsWith('
|
|
31
|
-
if (!this.
|
|
33
|
+
if (name.startsWith('apiModule')) {
|
|
34
|
+
if (!this.servicesApiModules) {
|
|
32
35
|
throw 'service module is Empty, please inject MoLibsCoreUIHttpRequestService and call servicesModules update 2';
|
|
33
36
|
}
|
|
34
|
-
return this.
|
|
37
|
+
return this.servicesApiModules[name];
|
|
35
38
|
}
|
|
36
39
|
return undefined;
|
|
37
40
|
}
|
|
38
41
|
refreshAllService() {
|
|
39
|
-
if (!this.
|
|
42
|
+
if (!this.servicesApiModules) {
|
|
40
43
|
throw 'service common is Empty, please inject MoLibsCoreUIHttpRequestService and call servicesModules update 3';
|
|
41
44
|
}
|
|
42
|
-
Object.keys(this.
|
|
45
|
+
Object.keys(this.servicesApiModules).forEach((nameService) => this.servicesApiModules[nameService].refreshAPIUrl && this.servicesApiModules[nameService].refreshAPIUrl());
|
|
43
46
|
}
|
|
44
47
|
async callApi(httpRequestConfig) {
|
|
45
48
|
if (!httpRequestConfig || (!httpRequestConfig.serviceName && !httpRequestConfig.serviceOther) || !httpRequestConfig.functionName) {
|
|
@@ -47,15 +50,15 @@ export class LibsUiHttpRequestService {
|
|
|
47
50
|
}
|
|
48
51
|
const { serviceName, serviceOther, keyCache, functionName, argumentsValue } = httpRequestConfig;
|
|
49
52
|
if (!serviceOther && (!serviceName || !serviceName.trim())) {
|
|
50
|
-
throw
|
|
53
|
+
throw `http request config not exactly serviceOther or serviceName`;
|
|
51
54
|
}
|
|
52
55
|
const serviceInstance = this.getServiceByName(serviceName || '') || serviceOther;
|
|
53
56
|
if (!serviceInstance) {
|
|
54
|
-
throw
|
|
57
|
+
throw `http request notfound serviceInstance name: ${serviceName}`;
|
|
55
58
|
}
|
|
56
59
|
const methodInstance = serviceInstance[functionName];
|
|
57
60
|
if (!methodInstance) {
|
|
58
|
-
throw
|
|
61
|
+
throw `http request config notfound methodInstance name: ${functionName}`;
|
|
59
62
|
}
|
|
60
63
|
const keyCacheMD5 = getKeyCacheByArrayObject(keyCache || '', argumentsValue);
|
|
61
64
|
const cacheData = await this.getCacheData(httpRequestConfig, keyCacheMD5);
|
|
@@ -203,18 +206,27 @@ export class LibsUiHttpRequestService {
|
|
|
203
206
|
if (!config || !objectGetDataUpdate) {
|
|
204
207
|
return undefined;
|
|
205
208
|
}
|
|
209
|
+
if (config.log?.logInputs) {
|
|
210
|
+
console.log('config', config);
|
|
211
|
+
console.log('objectGetDataUpdate', objectGetDataUpdate);
|
|
212
|
+
console.log('argumentsValue', argumentsValue);
|
|
213
|
+
console.log('--------------------------------');
|
|
214
|
+
}
|
|
206
215
|
const { fieldUpdate, fieldGetValue, preprocessor } = config;
|
|
207
216
|
if (!fieldUpdate || !fieldGetValue) {
|
|
208
217
|
return undefined;
|
|
209
218
|
}
|
|
210
219
|
let value = get(objectGetDataUpdate, fieldGetValue);
|
|
220
|
+
if (config.log?.logGetValue) {
|
|
221
|
+
console.log(`value of objectGetDataUpdate[${fieldGetValue}]: `, value);
|
|
222
|
+
}
|
|
211
223
|
if (preprocessor) {
|
|
212
224
|
value = preprocessor(value);
|
|
213
225
|
}
|
|
214
226
|
if (fieldUpdate) {
|
|
215
227
|
let resultOfFieldUpdate = get(argumentsValue, fieldUpdate);
|
|
216
228
|
if (resultOfFieldUpdate instanceof HttpParams) {
|
|
217
|
-
resultOfFieldUpdate = resultOfFieldUpdate.set(config.subFieldUpdate || 'search', value);
|
|
229
|
+
resultOfFieldUpdate = resultOfFieldUpdate.set((config.subFieldUpdate || 'search'), value);
|
|
218
230
|
set(argumentsValue, fieldUpdate, resultOfFieldUpdate);
|
|
219
231
|
return value;
|
|
220
232
|
}
|
|
@@ -251,4 +263,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
251
263
|
providedIn: 'root',
|
|
252
264
|
}]
|
|
253
265
|
}], ctorParameters: () => [] });
|
|
254
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZXF1ZXN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2h0dHAtcmVxdWVzdC9zcmMvaHR0cC1yZXF1ZXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLHdCQUF3QixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQU1yQyxNQUFNLE9BQU8sd0JBQXdCO0lBQzNCLFlBQVksQ0FBbUI7SUFDL0IsY0FBYyxDQUFzQjtJQUNwQyxlQUFlLENBQXNCO0lBRTdDO1FBQ0UsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFXLGNBQWMsQ0FBQyxhQUFpQztRQUN6RCxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBVyxjQUFjLENBQUMsZUFBbUM7UUFDM0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7SUFDekMsQ0FBQztJQUVPLGdCQUFnQixDQUFDLElBQVk7UUFDbkMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzFCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUUvQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN6QixNQUFNLHdHQUF3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LENBQUM7Z0JBQ3pDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFaEMsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsSUFBSSxtQkFBbUIsWUFBWSxNQUFNLEVBQUUsQ0FBQztnQkFDMUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxjQUFjLElBQUksUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUVuRSxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxHQUFHLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUV4QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxxQkFBcUI7UUFDMUIsT0FBTztZQUNMLE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsQ0FBQztnQkFDUCxXQUFXLEVBQUUsQ0FBQztnQkFDZCxNQUFNLEVBQUUsRUFBRTtnQkFDVixLQUFLLEVBQUUsRUFBRTtnQkFDVCxJQUFJLEVBQUUsSUFBSTthQUNYO1NBQ0YsQ0FBQztJQUNKLENBQUM7d0dBeFNVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCLGNBRnZCLE1BQU07OzRGQUVQLHdCQUF3QjtrQkFIcEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSVBhZ2luZyB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgVXRpbHNDYWNoZSwgZ2V0LCBnZXRLZXlDYWNoZUJ5QXJyYXlPYmplY3QsIGlzRW1wdHksIHNldCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElHdWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSwgSUd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlQ29uZmlnLCBJSHR0cFJlcXVlc3RDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZXMvaW5kZXgnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpSHR0cFJlcXVlc3RTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzZXJ2aWNlU3RvcmU6IE1hcDxzdHJpbmcsIGFueT47XG4gIHByaXZhdGUgc2VydmljZXNDb21tb24/OiBSZWNvcmQ8c3RyaW5nLGFueT47XG4gIHByaXZhdGUgc2VydmljZXNNb2R1bGVzPzogUmVjb3JkPHN0cmluZyxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc2VydmljZVN0b3JlID0gbmV3IE1hcCgpO1xuICB9XG5cbiAgcHVibGljIHNldCBTZXJ2aWNlc0NvbW1vbihzZXJ2aWNlQ29tbW9uOiBSZWNvcmQ8c3RyaW5nLGFueT4pIHtcbiAgICB0aGlzLnNlcnZpY2VzQ29tbW9uID0gc2VydmljZUNvbW1vbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgU2VydmljZU1vZHVsZXMoc2VydmljZXNNb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLGFueT4pIHtcbiAgICB0aGlzLnNlcnZpY2VzTW9kdWxlcyA9IHNlcnZpY2VzTW9kdWxlcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VydmljZUJ5TmFtZShuYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLGFueT4gfCB1bmRlZmluZWQge1xuICAgIGlmICghbmFtZSB8fCAhbmFtZS50cmltKCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ2NvbW1vbi0nKSkge1xuXG4gICAgICBpZiAoIXRoaXMuc2VydmljZXNDb21tb24pIHtcbiAgICAgICAgdGhyb3cgJ3NlcnZpY2UgY29tbW9uIGlzIEVtcHR5LCBwbGVhc2UgaW5qZWN0IE1vTGlic0NvcmVVSUh0dHBSZXF1ZXN0U2VydmljZSBhbmQgY2FsbCBTZXJ2aWNlc0NvbW1vbiB1cGRhdGUgMSc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VzQ29tbW9uW25hbWVdO1xuICAgIH1cblxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ21vZHVsZS0nKSkge1xuICAgICAgaWYgKCF0aGlzLnNlcnZpY2VzTW9kdWxlcykge1xuICAgICAgICB0aHJvdyAnc2VydmljZSBtb2R1bGUgaXMgRW1wdHksIHBsZWFzZSBpbmplY3QgTW9MaWJzQ29yZVVJSHR0cFJlcXVlc3RTZXJ2aWNlIGFuZCBjYWxsIHNlcnZpY2VzTW9kdWxlcyB1cGRhdGUgMic7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VzTW9kdWxlc1tuYW1lXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBbGxTZXJ2aWNlKCkge1xuICAgIGlmICghdGhpcy5zZXJ2aWNlc01vZHVsZXMpIHtcbiAgICAgIHRocm93ICdzZXJ2aWNlIGNvbW1vbiBpcyBFbXB0eSwgcGxlYXNlIGluamVjdCBNb0xpYnNDb3JlVUlIdHRwUmVxdWVzdFNlcnZpY2UgYW5kIGNhbGwgc2VydmljZXNNb2R1bGVzIHVwZGF0ZSAzJztcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLnNlcnZpY2VzTW9kdWxlcykuZm9yRWFjaCgobmFtZVNlcnZpY2U6IHN0cmluZykgPT4gKHRoaXMuc2VydmljZXNNb2R1bGVzIGFzIGFueSlbbmFtZVNlcnZpY2VdLnJlZnJlc2hBUElVcmwgJiYgKHRoaXMuc2VydmljZXNNb2R1bGVzIGFzIGFueSlbbmFtZVNlcnZpY2VdLnJlZnJlc2hBUElVcmwoKSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2FsbEFwaTxUID0gYW55PihodHRwUmVxdWVzdENvbmZpZzogSUh0dHBSZXF1ZXN0Q29uZmlnKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKCFodHRwUmVxdWVzdENvbmZpZyB8fCAoIWh0dHBSZXF1ZXN0Q29uZmlnLnNlcnZpY2VOYW1lICYmICFodHRwUmVxdWVzdENvbmZpZy5zZXJ2aWNlT3RoZXIpIHx8ICFodHRwUmVxdWVzdENvbmZpZy5mdW5jdGlvbk5hbWUpIHtcbiAgICAgIHRocm93ICdodHRwIHJlcXVlc3QgY29uZmlnIG5vdCBleGFjdGx5IGh0dHBSZXF1ZXN0Q29uZmlnJztcbiAgICB9XG4gICAgY29uc3QgeyBzZXJ2aWNlTmFtZSwgc2VydmljZU90aGVyLCBrZXlDYWNoZSwgZnVuY3Rpb25OYW1lLCBhcmd1bWVudHNWYWx1ZSB9ID0gaHR0cFJlcXVlc3RDb25maWc7XG5cbiAgICBpZiAoIXNlcnZpY2VPdGhlciAmJiAoIXNlcnZpY2VOYW1lIHx8ICFzZXJ2aWNlTmFtZS50cmltKCkpKSB7XG4gICAgICB0aHJvdyAnaHR0cCByZXF1ZXN0IGNvbmZpZyBub3QgZXhhY3RseSBzZXJ2aWNlSW5zdGFuY2UnO1xuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlSW5zdGFuY2U6IGFueSA9IHRoaXMuZ2V0U2VydmljZUJ5TmFtZShzZXJ2aWNlTmFtZSB8fCAnJykgfHwgc2VydmljZU90aGVyO1xuXG4gICAgaWYgKCFzZXJ2aWNlSW5zdGFuY2UpIHtcbiAgICAgIHRocm93ICdodHRwIHJlcXVlc3QgY29uZmlnIG5vdCBleGFjdGx5IHNlcnZpY2VJbnN0YW5jZSc7XG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZEluc3RhbmNlID0gc2VydmljZUluc3RhbmNlW2Z1bmN0aW9uTmFtZV07XG5cbiAgICBpZiAoIW1ldGhvZEluc3RhbmNlKSB7XG4gICAgICB0aHJvdyAnaHR0cCByZXF1ZXN0IGNvbmZpZyBub3QgZXhhY3RseSBtZXRob2RJbnN0YW5jZSc7XG4gICAgfVxuICAgIGNvbnN0IGtleUNhY2hlTUQ1OiBzdHJpbmcgPSBnZXRLZXlDYWNoZUJ5QXJyYXlPYmplY3Qoa2V5Q2FjaGUgfHwgJycsIGFyZ3VtZW50c1ZhbHVlKTtcbiAgICBjb25zdCBjYWNoZURhdGEgPSBhd2FpdCB0aGlzLmdldENhY2hlRGF0YShodHRwUmVxdWVzdENvbmZpZywga2V5Q2FjaGVNRDUpO1xuXG4gICAgaWYgKGNhY2hlRGF0YSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjYWNoZURhdGEpO1xuICAgIH1cblxuICAgIGxldCBjYWxsUmVzcG9uc2UgPSBtZXRob2RJbnN0YW5jZS5hcHBseShzZXJ2aWNlSW5zdGFuY2UsIGFyZ3VtZW50c1ZhbHVlKTtcbiAgICBpZiAoIWNhbGxSZXNwb25zZS50aGVuKSB7XG4gICAgICBjYWxsUmVzcG9uc2UgPSBsYXN0VmFsdWVGcm9tKGNhbGxSZXNwb25zZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgY2FsbFJlc3BvbnNlO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0Q2FjaGVEYXRhKHJlcywgaHR0cFJlcXVlc3RDb25maWcsIGtleUNhY2hlTUQ1KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2FjaGVEYXRhKGh0dHBSZXF1ZXN0Q29uZmlnOiBJSHR0cFJlcXVlc3RDb25maWcsIGtleUNhY2hlOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IGNhY2hlVHlwZSwgY29udmVydFJlc3BvbnNlRGF0YSB9ID0gaHR0cFJlcXVlc3RDb25maWc7XG5cbiAgICBpZiAoIWNhY2hlVHlwZSB8fCAha2V5Q2FjaGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChjYWNoZVR5cGUgPT09ICdzZXJ2aWNlJykge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2VydmljZVN0b3JlLmdldChrZXlDYWNoZSk7XG5cbiAgICAgIHJldHVybiBkYXRhID8gKGNvbnZlcnRSZXNwb25zZURhdGEgPyBjb252ZXJ0UmVzcG9uc2VEYXRhKGRhdGEpIDogZGF0YSkgOiBkYXRhO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgVXRpbHNDYWNoZS5HZXRBc3luYyhrZXlDYWNoZSx1bmRlZmluZWQsdHJ1ZSk7XG5cbiAgICByZXR1cm4gZGF0YSA/IChjb252ZXJ0UmVzcG9uc2VEYXRhID8gY29udmVydFJlc3BvbnNlRGF0YShkYXRhKSA6IGRhdGEpIDogZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0Q2FjaGVEYXRhKGRhdGE6IGFueSwgaHR0cFJlcXVlc3RDb25maWc6IElIdHRwUmVxdWVzdENvbmZpZywga2V5Q2FjaGU6IHN0cmluZyl7XG4gICAgY29uc3QgeyBjYWNoZVR5cGUsIGNsZWFyQ2FjaGUsIGNvbnZlcnRSZXNwb25zZURhdGEgfSA9IGh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgaWYgKCFjYWNoZVR5cGUgfHwgIWtleUNhY2hlKSB7XG4gICAgICByZXR1cm4gY29udmVydFJlc3BvbnNlRGF0YSA/IGNvbnZlcnRSZXNwb25zZURhdGEoZGF0YSkgOiBkYXRhO1xuICAgIH1cbiAgICBpZihjbGVhckNhY2hlID09PSB0cnVlKXtcbiAgICAgIHRoaXMuY2xlYXJDYWNoZShjYWNoZVR5cGUsIGtleUNhY2hlKTtcbiAgICB9XG4gICAgaWYgKGNhY2hlVHlwZSA9PT0gJ3NlcnZpY2UnKSB7XG4gICAgICB0aGlzLnNlcnZpY2VTdG9yZS5zZXQoa2V5Q2FjaGUsIGRhdGEpO1xuXG4gICAgICByZXR1cm4gY29udmVydFJlc3BvbnNlRGF0YSA/IGNvbnZlcnRSZXNwb25zZURhdGEoZGF0YSkgOiBkYXRhO1xuICAgIH1cbiAgICBhd2FpdCBVdGlsc0NhY2hlLlNldEFzeW5jKGtleUNhY2hlLCBkYXRhLCAoaHR0cFJlcXVlc3RDb25maWcudGltZUNhY2hlIHx8IDUpICogNjAsdHJ1ZSk7XG5cbiAgICByZXR1cm4gY29udmVydFJlc3BvbnNlRGF0YSA/IGNvbnZlcnRSZXNwb25zZURhdGEoZGF0YSkgOiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckNhY2hlKGNhY2hlVHlwZTogJ3NlcnZpY2UnIHwgJ2xvY2FsLXN0b3JlJywga2V5Q2FjaGU6IHN0cmluZykge1xuICAgIGlmIChjYWNoZVR5cGUgPT09ICdzZXJ2aWNlJykge1xuICAgICAgdGhpcy5zZXJ2aWNlU3RvcmUuZGVsZXRlKGtleUNhY2hlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBVdGlsc0NhY2hlLkNsZWFyQXN5bmMoa2V5Q2FjaGUsdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgKiBAcmV0dXJuIHRy4bqjIHbhu4EgdHLhuqFuZyB0aMOhaSDEkcOjIGxvYWQgaOG6v3QgaXRlbSBjaMawYSAodsOtIGThu6U6IGThu7FhIHbDoG8gdGhhbSBz4buRIG7DoHkgxJHhu4MgcXV54bq/dCDEkeG7i25oIGPDsyB0aeG6v3AgdOG7pWMgZ+G7jWkgYXBpIGtoaSBzY3JvbGwga28pIC5cbiAgKi9cbiAgcHVibGljICB1cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWU6IEFycmF5PGFueT4sIG9iamVjdEdldERhdGFVcGRhdGU6IFJlY29yZDxzdHJpbmcsYW55PiwgcGFnaW5nU3RvcmU6IElQYWdpbmcsIGtleVNlYXJjaDogc3RyaW5nLCBzZWFyY2hPbmxpbmU6IGJvb2xlYW4sIGxvYWRlZExhc3RJdGVtOiBib29sZWFuLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZT86IElHdWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghYXJndW1lbnRzVmFsdWUgfHwgIShhcmd1bWVudHNWYWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB8fCBsb2FkZWRMYXN0SXRlbSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQXJndW1lbnRzRGVmYXVsdChhcmd1bWVudHNWYWx1ZSwgdHJ1ZSwgcGFnaW5nU3RvcmUsIGtleVNlYXJjaCwgc2VhcmNoT25saW5lKTtcbiAgICB9XG4gICAgY29uc3QgeyBwYWdpbmcsIHNlYXJjaCwgb3RoZXIsIGRldGFpbEJ5SWQsIHNvcnRPcmRlclR5cGUsIHNvcnRPcmRlckJ5IH0gPSBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZTtcblxuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIHNlYXJjaC5maWVsZEdldFZhbHVlID0gJ2tleVNlYXJjaCc7XG4gICAgICB0aGlzLnByb2Nlc3NVcGRhdGVBcmd1bWVudHNWYWxlQ29uZmlnKGFyZ3VtZW50c1ZhbHVlLCB7IGtleVNlYXJjaCB9LCBzZWFyY2gpO1xuICAgIH1cbiAgICBpZiAob2JqZWN0R2V0RGF0YVVwZGF0ZT8uWydzdG9yZVBhcmFtc0NhbGxBcGknXSAmJiB0eXBlb2Ygb2JqZWN0R2V0RGF0YVVwZGF0ZT8uWydzdG9yZVBhcmFtc0NhbGxBcGknXSA9PT0gJ29iamVjdCcgJiYgIShvYmplY3RHZXREYXRhVXBkYXRlPy5bJ3N0b3JlUGFyYW1zQ2FsbEFwaSddIGFzIGFueSkuaW5zdGFuY2VTb3J0KSB7XG4gICAgICBvYmplY3RHZXREYXRhVXBkYXRlWydzdG9yZVBhcmFtc0NhbGxBcGknXSA9IHsgLi4ub2JqZWN0R2V0RGF0YVVwZGF0ZVsnc3RvcmVQYXJhbXNDYWxsQXBpJ10sIGluc3RhbmNlU29ydDoge30gfTtcbiAgICB9XG4gICAgaWYgKHNvcnRPcmRlckJ5KSB7XG4gICAgICB0aGlzLnByb2Nlc3NVcGRhdGVBcmd1bWVudHNWYWxlQ29uZmlnKGFyZ3VtZW50c1ZhbHVlLCBvYmplY3RHZXREYXRhVXBkYXRlLCBzb3J0T3JkZXJCeSk7XG4gICAgfVxuICAgIGlmIChzb3J0T3JkZXJUeXBlKSB7XG4gICAgICB0aGlzLnByb2Nlc3NVcGRhdGVBcmd1bWVudHNWYWxlQ29uZmlnKGFyZ3VtZW50c1ZhbHVlLCBvYmplY3RHZXREYXRhVXBkYXRlLCBzb3J0T3JkZXJUeXBlKTtcbiAgICB9XG4gICAgaWYgKG90aGVyICYmIG90aGVyLmxlbmd0aCkge1xuICAgICAgb3RoZXIuZm9yRWFjaChjb25maWcgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQXJndW1lbnRzVmFsZUNvbmZpZyhhcmd1bWVudHNWYWx1ZSwgb2JqZWN0R2V0RGF0YVVwZGF0ZSwgY29uZmlnKSk7XG4gICAgfVxuICAgIGlmIChkZXRhaWxCeUlkKSB7XG4gICAgICBkZXRhaWxCeUlkLmZpZWxkR2V0VmFsdWUgPSBkZXRhaWxCeUlkLmZpZWxkR2V0VmFsdWUgfHwgZGV0YWlsQnlJZC5maWVsZEdldFZhbHVlLnRyaW0oKSB8fCAna2V5JztcbiAgICAgIHRoaXMucHJvY2Vzc1VwZGF0ZUFyZ3VtZW50c1ZhbGVDb25maWcoYXJndW1lbnRzVmFsdWUsIG9iamVjdEdldERhdGFVcGRhdGUsIGRldGFpbEJ5SWQpO1xuICAgIH1cblxuICAgIGlmIChpc0VtcHR5KHBhZ2luZykpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUFyZ3VtZW50c0RlZmF1bHQoYXJndW1lbnRzVmFsdWUsIGZhbHNlLCBwYWdpbmdTdG9yZSB8fCB0aGlzLmZha2VSZXNwb25zZVBhZ2luZ0FwaSgpWydwYWdpbmcnXSwga2V5U2VhcmNoLCBzZWFyY2hPbmxpbmUpO1xuICAgIH1cbiAgICBjb25zdCB7IHBhZ2UsIGJlZm9yZSwgYWZ0ZXIgfSA9IHBhZ2luZztcblxuICAgIGlmIChwYWdlICYmIG9iamVjdEdldERhdGFVcGRhdGUpIHtcbiAgICAgIHBhZ2UucHJlcHJvY2Vzc29yID0gKHZhbHVlOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuXG4gICAgICAgIHJldHVybiArK3ZhbHVlO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHZhbHVlUGFnZSA9ICt0aGlzLnByb2Nlc3NVcGRhdGVBcmd1bWVudHNWYWxlQ29uZmlnKGFyZ3VtZW50c1ZhbHVlLCBvYmplY3RHZXREYXRhVXBkYXRlLCBwYWdlKTtcbiAgICAgIGNvbnN0IHZhbHVlTGFzdFBhZ2UgPSArZ2V0KG9iamVjdEdldERhdGFVcGRhdGUgYXMgYW55LCAncGFnaW5nLnRvdGFsX3BhZ2VzJyk7XG5cbiAgICAgIGlmICh2YWx1ZVBhZ2UgJiYgTnVtYmVyKHZhbHVlUGFnZSkudmFsdWVPZigpID4gTnVtYmVyKHZhbHVlTGFzdFBhZ2UpLnZhbHVlT2YoKSB8fCB2YWx1ZUxhc3RQYWdlID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmVmb3JlICYmIG9iamVjdEdldERhdGFVcGRhdGUgJiYgIXRoaXMucHJvY2Vzc1VwZGF0ZUFyZ3VtZW50c1ZhbGVDb25maWcoYXJndW1lbnRzVmFsdWUsIG9iamVjdEdldERhdGFVcGRhdGUsIGJlZm9yZSkgJiYgIWdldChvYmplY3RHZXREYXRhVXBkYXRlLCAncGFnaW5nLmZha2UnKSkge1xuICAgICAgc2V0KG9iamVjdEdldERhdGFVcGRhdGUsICdwYWdpbmcuZmFrZScsIGZhbHNlKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChhZnRlciAmJiBvYmplY3RHZXREYXRhVXBkYXRlICYmICF0aGlzLnByb2Nlc3NVcGRhdGVBcmd1bWVudHNWYWxlQ29uZmlnKGFyZ3VtZW50c1ZhbHVlLCBvYmplY3RHZXREYXRhVXBkYXRlLCBhZnRlcikgJiYgIWdldChvYmplY3RHZXREYXRhVXBkYXRlLCAncGFnaW5nLmZha2UnKSkge1xuICAgICAgc2V0KG9iamVjdEdldERhdGFVcGRhdGUsICdwYWdpbmcuZmFrZScsIGZhbHNlKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFhcmd1bWVudHNWYWx1ZSB8fCAhYXJndW1lbnRzVmFsdWUubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUFyZ3VtZW50c0RlZmF1bHQoYXJndW1lbnRzVmFsdWU6IEFycmF5PGFueT4sIHVwZGF0ZVNlYXJjaDogYm9vbGVhbiwgcGFnaW5nU3RvcmU6IElQYWdpbmcsIGtleVNlYXJjaDogc3RyaW5nLCBzZWFyY2hPbmxpbmU6IGJvb2xlYW4pIHtcbiAgICBpZiAoIWFyZ3VtZW50c1ZhbHVlIHx8ICFhcmd1bWVudHNWYWx1ZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaW5kZXggaW4gYXJndW1lbnRzVmFsdWUpIHtcbiAgICAgIGxldCBhcmd1bWVudFZhbHVlID0gYXJndW1lbnRzVmFsdWVbaW5kZXhdO1xuXG4gICAgICBpZiAoIShhcmd1bWVudFZhbHVlIGluc3RhbmNlb2YgSHR0cFBhcmFtcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBwYWdlVmFsdWUgPSBhcmd1bWVudFZhbHVlLmdldCgncGFnZScpO1xuXG4gICAgICBpZiAoc2VhcmNoT25saW5lICYmIHVwZGF0ZVNlYXJjaCkge1xuICAgICAgICBhcmd1bWVudFZhbHVlID0gYXJndW1lbnRWYWx1ZS5zZXQoJ3NlYXJjaCcsIGtleVNlYXJjaCk7XG4gICAgICAgIGFyZ3VtZW50c1ZhbHVlW2luZGV4XSA9IGFyZ3VtZW50VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoYXJndW1lbnRWYWx1ZS5oYXMoJ2JlZm9yZScpKSB7XG4gICAgICAgIGFyZ3VtZW50VmFsdWUgPSBhcmd1bWVudFZhbHVlLnNldCgnYmVmb3JlJywgcGFnaW5nU3RvcmU/LmJlZm9yZSk7XG4gICAgICAgIGFyZ3VtZW50c1ZhbHVlW2luZGV4XSA9IGFyZ3VtZW50VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoYXJndW1lbnRWYWx1ZS5oYXMoJ2FmdGVyJykpIHtcbiAgICAgICAgYXJndW1lbnRWYWx1ZSA9IGFyZ3VtZW50VmFsdWUuc2V0KCdhZnRlcicsIHBhZ2luZ1N0b3JlPy5hZnRlcik7XG4gICAgICAgIGFyZ3VtZW50c1ZhbHVlW2luZGV4XSA9IGFyZ3VtZW50VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoTnVtYmVyKHBhZ2VWYWx1ZSkudmFsdWVPZigpID09PSAtMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICghcGFnaW5nU3RvcmUgfHwgcGFnZVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgcGFnZSwgdG90YWxfcGFnZXMsIH0gPSBwYWdpbmdTdG9yZTtcbiAgICAgIGNvbnN0IG5leHRQYWdlID0gKHBhZ2UgfHwgMCkgKyAxO1xuXG4gICAgICBpZiAobmV4dFBhZ2UgJiYgTnVtYmVyKG5leHRQYWdlKS52YWx1ZU9mKCkgPiBOdW1iZXIodG90YWxfcGFnZXMpLnZhbHVlT2YoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGFyZ3VtZW50c1ZhbHVlW2luZGV4XSA9IGFyZ3VtZW50VmFsdWUuc2V0KCdwYWdlJywgbmV4dFBhZ2UpO1xuICAgICAgYnJlYWs7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NVcGRhdGVBcmd1bWVudHNWYWxlQ29uZmlnKGFyZ3VtZW50c1ZhbHVlOiBBcnJheTxhbnk+LCBvYmplY3RHZXREYXRhVXBkYXRlOiBhbnksIGNvbmZpZzogSUd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlQ29uZmlnKSB7XG4gICAgaWYgKCFjb25maWcgfHwgIW9iamVjdEdldERhdGFVcGRhdGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHsgZmllbGRVcGRhdGUsIGZpZWxkR2V0VmFsdWUsIHByZXByb2Nlc3NvciB9ID0gY29uZmlnO1xuXG4gICAgaWYgKCFmaWVsZFVwZGF0ZSB8fCAhZmllbGRHZXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsZXQgdmFsdWUgPSBnZXQob2JqZWN0R2V0RGF0YVVwZGF0ZSwgZmllbGRHZXRWYWx1ZSk7XG5cbiAgICBpZiAocHJlcHJvY2Vzc29yKSB7XG4gICAgICB2YWx1ZSA9IHByZXByb2Nlc3Nvcih2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChmaWVsZFVwZGF0ZSkge1xuICAgICAgbGV0IHJlc3VsdE9mRmllbGRVcGRhdGUgPSBnZXQoYXJndW1lbnRzVmFsdWUsIGZpZWxkVXBkYXRlKTtcblxuICAgICAgaWYgKHJlc3VsdE9mRmllbGRVcGRhdGUgaW5zdGFuY2VvZiBIdHRwUGFyYW1zKSB7XG4gICAgICAgIHJlc3VsdE9mRmllbGRVcGRhdGUgPSByZXN1bHRPZkZpZWxkVXBkYXRlLnNldChjb25maWcuc3ViRmllbGRVcGRhdGUgfHwgJ3NlYXJjaCcsIHZhbHVlKTtcbiAgICAgICAgc2V0KGFyZ3VtZW50c1ZhbHVlLCBmaWVsZFVwZGF0ZSwgcmVzdWx0T2ZGaWVsZFVwZGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdE9mRmllbGRVcGRhdGUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICByZXN1bHRPZkZpZWxkVXBkYXRlLnB1c2godmFsdWUpO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHRPZkZpZWxkVXBkYXRlIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgIHNldChyZXN1bHRPZkZpZWxkVXBkYXRlLCBjb25maWcuc3ViRmllbGRVcGRhdGUgfHwgJ3NlYXJjaCcsIHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBzZXQoYXJndW1lbnRzVmFsdWUsIGZpZWxkVXBkYXRlLCB2YWx1ZSk7XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZmFrZVJlc3BvbnNlUGFnaW5nQXBpKCk6IHtwYWdpbmc6SVBhZ2luZ30ge1xuICAgIHJldHVybiB7XG4gICAgICBwYWdpbmc6IHtcbiAgICAgICAgcGFnZTogMCxcbiAgICAgICAgdG90YWxfcGFnZXM6IDEsXG4gICAgICAgIGJlZm9yZTogJycsXG4gICAgICAgIGFmdGVyOiAnJyxcbiAgICAgICAgZmFrZTogdHJ1ZVxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZXF1ZXN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2h0dHAtcmVxdWVzdC9zcmMvaHR0cC1yZXF1ZXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLHdCQUF3QixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQU1yQyxNQUFNLE9BQU8sd0JBQXdCO0lBQ25DLGdDQUFnQztJQUN4QixZQUFZLENBQW1CO0lBQ3ZDLHVDQUF1QztJQUMvQixjQUFjLEdBQXdCLEVBQUUsQ0FBQztJQUVqRCw0Q0FBNEM7SUFDcEMsa0JBQWtCLEdBQXdCLEVBQUUsQ0FBQztJQUVyRDtRQUNFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBVyxjQUFjLENBQUMsYUFBa0M7UUFDMUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDO0lBQ3JFLENBQUM7SUFFRCxJQUFXLGtCQUFrQixDQUFDLGtCQUF1QztRQUNuRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLGtCQUFrQixFQUFFLENBQUM7SUFDbEYsQ0FBQztJQUVPLGdCQUFnQixDQUFDLElBQVk7UUFDbkMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUs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LENBQUM7SUFFTSxxQkFBcUI7UUFDMUIsT0FBTztZQUNMLE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsQ0FBQztnQkFDUCxXQUFXLEVBQUUsQ0FBQztnQkFDZCxNQUFNLEVBQUUsRUFBRTtnQkFDVixLQUFLLEVBQUUsRUFBRTtnQkFDVCxJQUFJLEVBQUUsSUFBSTthQUNYO1NBQ0YsQ0FBQztJQUNKLENBQUM7d0dBclRVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCLGNBRnZCLE1BQU07OzRGQUVQLHdCQUF3QjtrQkFIcEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSVBhZ2luZyB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgVXRpbHNDYWNoZSwgZ2V0LCBnZXRLZXlDYWNoZUJ5QXJyYXlPYmplY3QsIGlzRW1wdHksIHNldCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElHdWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSwgSUd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlQ29uZmlnLCBJSHR0cFJlcXVlc3RDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZXMvaW5kZXgnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpSHR0cFJlcXVlc3RTZXJ2aWNlIHtcbiAgLyoqIENo4bupYSBk4buvIGxp4buHdSBjYWNoZSBtZW1vcnkgKi9cbiAgcHJpdmF0ZSBzZXJ2aWNlU3RvcmU6IE1hcDxzdHJpbmcsIGFueT47XG4gIC8qKiBDaOG7qWEgY8OhYyBzZXJ2aWNlIGNvbW1vbiBiYXNlIGFwaSAqL1xuICBwcml2YXRlIHNlcnZpY2VzQ29tbW9uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgLyoqIENo4bupYSBjw6FjIHNlcnZpY2UgY2FsbCBhcGkgxJHhur9uIGJhY2tlbmQgKi9cbiAgcHJpdmF0ZSBzZXJ2aWNlc0FwaU1vZHVsZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnNlcnZpY2VTdG9yZSA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgU2VydmljZXNDb21tb24oc2VydmljZUNvbW1vbjogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRoaXMuc2VydmljZXNDb21tb24gPSB7IC4uLnRoaXMuc2VydmljZXNDb21tb24sIC4uLnNlcnZpY2VDb21tb24gfTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgU2VydmljZXNBcGlNb2R1bGVzKHNlcnZpY2VzQXBpTW9kdWxlczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRoaXMuc2VydmljZXNBcGlNb2R1bGVzID0geyAuLi50aGlzLnNlcnZpY2VzQXBpTW9kdWxlcywgLi4uc2VydmljZXNBcGlNb2R1bGVzIH07XG4gIH1cblxuICBwcml2YXRlIGdldFNlcnZpY2VCeU5hbWUobmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFuYW1lIHx8ICFuYW1lLnRyaW0oKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnY29tbW9uJykpIHtcblxuICAgICAgaWYgKCF0aGlzLnNlcnZpY2VzQ29tbW9uKSB7XG4gICAgICAgIHRocm93ICdzZXJ2aWNlIGNvbW1vbiBpcyBFbXB0eSwgcGxlYXNlIGluamVjdCBNb0xpYnNDb3JlVUlIdHRwUmVxdWVzdFNlcnZpY2UgYW5kIGNhbGwgU2VydmljZXNDb21tb24gdXBkYXRlIDEnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlc0NvbW1vbltuYW1lXTtcbiAgICB9XG5cbiAgICBpZiAobmFtZS5zdGFydHNXaXRoKCdhcGlNb2R1bGUnKSkge1xuICAgICAgaWYgKCF0aGlzLnNlcnZpY2VzQXBpTW9kdWxlcykge1xuICAgICAgICB0aHJvdyAnc2VydmljZSBtb2R1bGUgaXMgRW1wdHksIHBsZWFzZSBpbmplY3QgTW9MaWJzQ29yZVVJSHR0cFJlcXVlc3RTZXJ2aWNlIGFuZCBjYWxsIHNlcnZpY2VzTW9kdWxlcyB1cGRhdGUgMic7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VzQXBpTW9kdWxlc1tuYW1lXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBbGxTZXJ2aWNlKCkge1xuICAgIGlmICghdGhpcy5zZXJ2aWNlc0FwaU1vZHVsZXMpIHtcbiAgICAgIHRocm93ICdzZXJ2aWNlIGNvbW1vbiBpcyBFbXB0eSwgcGxlYXNlIGluamVjdCBNb0xpYnNDb3JlVUlIdHRwUmVxdWVzdFNlcnZpY2UgYW5kIGNhbGwgc2VydmljZXNNb2R1bGVzIHVwZGF0ZSAzJztcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLnNlcnZpY2VzQXBpTW9kdWxlcykuZm9yRWFjaCgobmFtZVNlcnZpY2U6IHN0cmluZykgPT4gKHRoaXMuc2VydmljZXNBcGlNb2R1bGVzIGFzIGFueSlbbmFtZVNlcnZpY2VdLnJlZnJlc2hBUElVcmwgJiYgKHRoaXMuc2VydmljZXNBcGlNb2R1bGVzIGFzIGFueSlbbmFtZVNlcnZpY2VdLnJlZnJlc2hBUElVcmwoKSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2FsbEFwaTxUID0gYW55PihodHRwUmVxdWVzdENvbmZpZzogSUh0dHBSZXF1ZXN0Q29uZmlnKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKCFodHRwUmVxdWVzdENvbmZpZyB8fCAoIWh0dHBSZXF1ZXN0Q29uZmlnLnNlcnZpY2VOYW1lICYmICFodHRwUmVxdWVzdENvbmZpZy5zZXJ2aWNlT3RoZXIpIHx8ICFodHRwUmVxdWVzdENvbmZpZy5mdW5jdGlvbk5hbWUpIHtcbiAgICAgIHRocm93ICdodHRwIHJlcXVlc3QgY29uZmlnIG5vdCBleGFjdGx5IGh0dHBSZXF1ZXN0Q29uZmlnJztcbiAgICB9XG4gICAgY29uc3QgeyBzZXJ2aWNlTmFtZSwgc2VydmljZU90aGVyLCBrZXlDYWNoZSwgZnVuY3Rpb25OYW1lLCBhcmd1bWVudHNWYWx1ZSB9ID0gaHR0cFJlcXVlc3RDb25maWc7XG5cbiAgICBpZiAoIXNlcnZpY2VPdGhlciAmJiAoIXNlcnZpY2VOYW1lIHx8ICFzZXJ2aWNlTmFtZS50cmltKCkpKSB7XG4gICAgICB0aHJvdyBgaHR0cCByZXF1ZXN0IGNvbmZpZyBub3QgZXhhY3RseSBzZXJ2aWNlT3RoZXIgb3Igc2VydmljZU5hbWVgO1xuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlSW5zdGFuY2U6IGFueSA9IHRoaXMuZ2V0U2VydmljZUJ5TmFtZShzZXJ2aWNlTmFtZSB8fCAnJykgfHwgc2VydmljZU90aGVyO1xuXG4gICAgaWYgKCFzZXJ2aWNlSW5zdGFuY2UpIHtcbiAgICAgIHRocm93IGBodHRwIHJlcXVlc3Qgbm90Zm91bmQgc2VydmljZUluc3RhbmNlIG5hbWU6ICR7c2VydmljZU5hbWV9YDtcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kSW5zdGFuY2UgPSBzZXJ2aWNlSW5zdGFuY2VbZnVuY3Rpb25OYW1lXTtcblxuICAgIGlmICghbWV0aG9kSW5zdGFuY2UpIHtcbiAgICAgIHRocm93IGBodHRwIHJlcXVlc3QgY29uZmlnIG5vdGZvdW5kIG1ldGhvZEluc3RhbmNlIG5hbWU6ICR7ZnVuY3Rpb25OYW1lfWA7XG4gICAgfVxuICAgIGNvbnN0IGtleUNhY2hlTUQ1OiBzdHJpbmcgPSBnZXRLZXlDYWNoZUJ5QXJyYXlPYmplY3Qoa2V5Q2FjaGUgfHwgJycsIGFyZ3VtZW50c1ZhbHVlKTtcbiAgICBjb25zdCBjYWNoZURhdGEgPSBhd2FpdCB0aGlzLmdldENhY2hlRGF0YShodHRwUmVxdWVzdENvbmZpZywga2V5Q2FjaGVNRDUpO1xuXG4gICAgaWYgKGNhY2hlRGF0YSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjYWNoZURhdGEpO1xuICAgIH1cblxuICAgIGxldCBjYWxsUmVzcG9uc2UgPSBtZXRob2RJbnN0YW5jZS5hcHBseShzZXJ2aWNlSW5zdGFuY2UsIGFyZ3VtZW50c1ZhbHVlKTtcbiAgICBpZiAoIWNhbGxSZXNwb25zZS50aGVuKSB7XG4gICAgICBjYWxsUmVzcG9uc2UgPSBsYXN0VmFsdWVGcm9tKGNhbGxSZXNwb25zZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgY2FsbFJlc3BvbnNlO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0Q2FjaGVEYXRhKHJlcywgaHR0cFJlcXVlc3RDb25maWcsIGtleUNhY2hlTUQ1KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2FjaGVEYXRhKGh0dHBSZXF1ZXN0Q29uZmlnOiBJSHR0cFJlcXVlc3RDb25maWcsIGtleUNhY2hlOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IGNhY2hlVHlwZSwgY29udmVydFJlc3BvbnNlRGF0YSB9ID0gaHR0cFJlcXVlc3RDb25maWc7XG5cbiAgICBpZiAoIWNhY2hlVHlwZSB8fCAha2V5Q2FjaGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChjYWNoZVR5cGUgPT09ICdzZXJ2aWNlJykge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2VydmljZVN0b3JlLmdldChrZXlDYWNoZSk7XG5cbiAgICAgIHJldHVybiBkYXRhID8gKGNvbnZlcnRSZXNwb25zZURhdGEgPyBjb252ZXJ0UmVzcG9uc2VEYXRhKGRhdGEpIDogZGF0YSkgOiBkYXRhO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgVXRpbHNDYWNoZS5HZXRBc3luYyhrZXlDYWNoZSwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgIHJldHVybiBkYXRhID8gKGNvbnZlcnRSZXNwb25zZURhdGEgPyBjb252ZXJ0UmVzcG9uc2VEYXRhKGRhdGEpIDogZGF0YSkgOiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRDYWNoZURhdGEoZGF0YTogYW55LCBodHRwUmVxdWVzdENvbmZpZzogSUh0dHBSZXF1ZXN0Q29uZmlnLCBrZXlDYWNoZTogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBjYWNoZVR5cGUsIGNsZWFyQ2FjaGUsIGNvbnZlcnRSZXNwb25zZURhdGEgfSA9IGh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgaWYgKCFjYWNoZVR5cGUgfHwgIWtleUNhY2hlKSB7XG4gICAgICByZXR1cm4gY29udmVydFJlc3BvbnNlRGF0YSA/IGNvbnZlcnRSZXNwb25zZURhdGEoZGF0YSkgOiBkYXRhO1xuICAgIH1cbiAgICBpZiAoY2xlYXJDYWNoZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jbGVhckNhY2hlKGNhY2hlVHlwZSwga2V5Q2FjaGUpO1xuICAgIH1cbiAgICBpZiAoY2FjaGVUeXBlID09PSAnc2VydmljZScpIHtcbiAgICAgIHRoaXMuc2VydmljZVN0b3JlLnNldChrZXlDYWNoZSwgZGF0YSk7XG5cbiAgICAgIHJldHVybiBjb252ZXJ0UmVzcG9uc2VEYXRhID8gY29udmVydFJlc3BvbnNlRGF0YShkYXRhKSA6IGRhdGE7XG4gICAgfVxuICAgIGF3YWl0IFV0aWxzQ2FjaGUuU2V0QXN5bmMoa2V5Q2FjaGUsIGRhdGEsIChodHRwUmVxdWVzdENvbmZpZy50aW1lQ2FjaGUgfHwgNSkgKiA2MCwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gY29udmVydFJlc3BvbnNlRGF0YSA/IGNvbnZlcnRSZXNwb25zZURhdGEoZGF0YSkgOiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckNhY2hlKGNhY2hlVHlwZTogJ3NlcnZpY2UnIHwgJ2xvY2FsLXN0b3JlJywga2V5Q2FjaGU6IHN0cmluZykge1xuICAgIGlmIChjYWNoZVR5cGUgPT09ICdzZXJ2aWNlJykge1xuICAgICAgdGhpcy5zZXJ2aWNlU3RvcmUuZGVsZXRlKGtleUNhY2hlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBVdGlsc0NhY2hlLkNsZWFyQXN5bmMoa2V5Q2FjaGUsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICogQHJldHVybiB0cuG6oyB24buBIHRy4bqhbmcgdGjDoWkgxJHDoyBsb2FkIGjhur90IGl0ZW0gY2jGsGEgKHbDrSBk4bulOiBk4buxYSB2w6BvIHRoYW0gc+G7kSBuw6B5IMSR4buDIHF1eeG6v3QgxJHhu4tuaCBjw7MgdGnhur9wIHThu6VjIGfhu41pIGFwaSBraGkgc2Nyb2xsIGtvKSAuXG4gICovXG4gIHB1YmxpYyB1cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWU6IEFycmF5PGFueT4sIG9iamVjdEdldERhdGFVcGRhdGU6IFJlY29yZDxzdHJpbmcsIGFueT4sIHBhZ2luZ1N0b3JlOiBJUGFnaW5nLCBrZXlTZWFyY2g6IHN0cmluZywgc2VhcmNoT25saW5lOiBib29sZWFuLCBsb2FkZWRMYXN0SXRlbTogYm9vbGVhbiwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWU/OiBJR3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAoIWFyZ3VtZW50c1ZhbHVlIHx8ICEoYXJndW1lbnRzVmFsdWUgaW5zdGFuY2VvZiBBcnJheSkgfHwgbG9hZGVkTGFzdEl0ZW0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUFyZ3VtZW50c0RlZmF1bHQoYXJndW1lbnRzVmFsdWUsIHRydWUsIHBhZ2luZ1N0b3JlLCBrZXlTZWFyY2gsIHNlYXJjaE9ubGluZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcGFnaW5nLCBzZWFyY2gsIG90aGVyLCBkZXRhaWxCeUlkLCBzb3J0T3JkZXJUeXBlLCBzb3J0T3JkZXJCeSB9ID0gZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWU7XG5cbiAgICBpZiAoc2VhcmNoKSB7XG4gICAgICBzZWFyY2guZmllbGRHZXRWYWx1ZSA9ICdrZXlTZWFyY2gnO1xuICAgICAgdGhpcy5wcm9jZXNzVXBkYXRlQXJndW1lbnRzVmFsZUNvbmZpZyhhcmd1bWVudHNWYWx1ZSwgeyBrZXlTZWFyY2ggfSwgc2VhcmNoKTtcbiAgICB9XG4gICAgaWYgKG9iamVjdEdldERhdGFVcGRhdGU/Llsnc3RvcmVQYXJhbXNDYWxsQXBpJ10gJiYgdHlwZW9mIG9iamVjdEdldERhdGFVcGRhdGU/Llsnc3RvcmVQYXJhbXNDYWxsQXBpJ10gPT09ICdvYmplY3QnICYmICEob2JqZWN0R2V0RGF0YVVwZGF0ZT8uWydzdG9yZVBhcmFtc0NhbGxBcGknXSBhcyBhbnkpLmluc3RhbmNlU29ydCkge1xuICAgICAgb2JqZWN0R2V0RGF0YVVwZGF0ZVsnc3RvcmVQYXJhbXNDYWxsQXBpJ10gPSB7IC4uLm9iamVjdEdldERhdGFVcGRhdGVbJ3N0b3JlUGFyYW1zQ2FsbEFwaSddLCBpbnN0YW5jZVNvcnQ6IHt9IH07XG4gICAgfVxuICAgIGlmIChzb3J0T3JkZXJCeSkge1xuICAgICAgdGhpcy5wcm9jZXNzVXBkYXRlQXJndW1lbnRzVmFsZUNvbmZpZyhhcmd1bWVudHNWYWx1ZSwgb2JqZWN0R2V0RGF0YVVwZGF0ZSwgc29ydE9yZGVyQnkpO1xuICAgIH1cbiAgICBpZiAoc29ydE9yZGVyVHlwZSkge1xuICAgICAgdGhpcy5wcm9jZXNzVXBkYXRlQXJndW1lbnRzVmFsZUNvbmZpZyhhcmd1bWVudHNWYWx1ZSwgb2JqZWN0R2V0RGF0YVVwZGF0ZSwgc29ydE9yZGVyVHlwZSk7XG4gICAgfVxuICAgIGlmIChvdGhlciAmJiBvdGhlci5sZW5ndGgpIHtcbiAgICAgIG90aGVyLmZvckVhY2goY29uZmlnID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUFyZ3VtZW50c1ZhbGVDb25maWcoYXJndW1lbnRzVmFsdWUsIG9iamVjdEdldERhdGFVcGRhdGUsIGNvbmZpZykpO1xuICAgIH1cbiAgICBpZiAoZGV0YWlsQnlJZCkge1xuICAgICAgZGV0YWlsQnlJZC5maWVsZEdldFZhbHVlID0gZGV0YWlsQnlJZC5maWVsZEdldFZhbHVlIHx8IGRldGFpbEJ5SWQuZmllbGRHZXRWYWx1ZS50cmltKCkgfHwgJ2tleSc7XG4gICAgICB0aGlzLnByb2Nlc3NVcGRhdGVBcmd1bWVudHNWYWxlQ29uZmlnKGFyZ3VtZW50c1ZhbHVlLCBvYmplY3RHZXREYXRhVXBkYXRlLCBkZXRhaWxCeUlkKTtcbiAgICB9XG5cbiAgICBpZiAoaXNFbXB0eShwYWdpbmcpKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVBcmd1bWVudHNEZWZhdWx0KGFyZ3VtZW50c1ZhbHVlLCBmYWxzZSwgcGFnaW5nU3RvcmUgfHwgdGhpcy5mYWtlUmVzcG9uc2VQYWdpbmdBcGkoKVsncGFnaW5nJ10sIGtleVNlYXJjaCwgc2VhcmNoT25saW5lKTtcbiAgICB9XG4gICAgY29uc3QgeyBwYWdlLCBiZWZvcmUsIGFmdGVyIH0gPSBwYWdpbmc7XG5cbiAgICBpZiAocGFnZSAmJiBvYmplY3RHZXREYXRhVXBkYXRlKSB7XG4gICAgICBwYWdlLnByZXByb2Nlc3NvciA9ICh2YWx1ZTogbnVtYmVyKTogbnVtYmVyID0+IHtcblxuICAgICAgICByZXR1cm4gKyt2YWx1ZTtcbiAgICAgIH07XG4gICAgICBjb25zdCB2YWx1ZVBhZ2UgPSArdGhpcy5wcm9jZXNzVXBkYXRlQXJndW1lbnRzVmFsZUNvbmZpZyhhcmd1bWVudHNWYWx1ZSwgb2JqZWN0R2V0RGF0YVVwZGF0ZSwgcGFnZSk7XG4gICAgICBjb25zdCB2YWx1ZUxhc3RQYWdlID0gK2dldChvYmplY3RHZXREYXRhVXBkYXRlIGFzIGFueSwgJ3BhZ2luZy50b3RhbF9wYWdlcycpO1xuXG4gICAgICBpZiAodmFsdWVQYWdlICYmIE51bWJlcih2YWx1ZVBhZ2UpLnZhbHVlT2YoKSA+IE51bWJlcih2YWx1ZUxhc3RQYWdlKS52YWx1ZU9mKCkgfHwgdmFsdWVMYXN0UGFnZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJlZm9yZSAmJiBvYmplY3RHZXREYXRhVXBkYXRlICYmICF0aGlzLnByb2Nlc3NVcGRhdGVBcmd1bWVudHNWYWxlQ29uZmlnKGFyZ3VtZW50c1ZhbHVlLCBvYmplY3RHZXREYXRhVXBkYXRlLCBiZWZvcmUpICYmICFnZXQob2JqZWN0R2V0RGF0YVVwZGF0ZSwgJ3BhZ2luZy5mYWtlJykpIHtcbiAgICAgIHNldChvYmplY3RHZXREYXRhVXBkYXRlLCAncGFnaW5nLmZha2UnLCBmYWxzZSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoYWZ0ZXIgJiYgb2JqZWN0R2V0RGF0YVVwZGF0ZSAmJiAhdGhpcy5wcm9jZXNzVXBkYXRlQXJndW1lbnRzVmFsZUNvbmZpZyhhcmd1bWVudHNWYWx1ZSwgb2JqZWN0R2V0RGF0YVVwZGF0ZSwgYWZ0ZXIpICYmICFnZXQob2JqZWN0R2V0RGF0YVVwZGF0ZSwgJ3BhZ2luZy5mYWtlJykpIHtcbiAgICAgIHNldChvYmplY3RHZXREYXRhVXBkYXRlLCAncGFnaW5nLmZha2UnLCBmYWxzZSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghYXJndW1lbnRzVmFsdWUgfHwgIWFyZ3VtZW50c1ZhbHVlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBcmd1bWVudHNEZWZhdWx0KGFyZ3VtZW50c1ZhbHVlOiBBcnJheTxhbnk+LCB1cGRhdGVTZWFyY2g6IGJvb2xlYW4sIHBhZ2luZ1N0b3JlOiBJUGFnaW5nLCBrZXlTZWFyY2g6IHN0cmluZywgc2VhcmNoT25saW5lOiBib29sZWFuKSB7XG4gICAgaWYgKCFhcmd1bWVudHNWYWx1ZSB8fCAhYXJndW1lbnRzVmFsdWUubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGluZGV4IGluIGFyZ3VtZW50c1ZhbHVlKSB7XG4gICAgICBsZXQgYXJndW1lbnRWYWx1ZSA9IGFyZ3VtZW50c1ZhbHVlW2luZGV4XTtcblxuICAgICAgaWYgKCEoYXJndW1lbnRWYWx1ZSBpbnN0YW5jZW9mIEh0dHBQYXJhbXMpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFnZVZhbHVlID0gYXJndW1lbnRWYWx1ZS5nZXQoJ3BhZ2UnKTtcblxuICAgICAgaWYgKHNlYXJjaE9ubGluZSAmJiB1cGRhdGVTZWFyY2gpIHtcbiAgICAgICAgYXJndW1lbnRWYWx1ZSA9IGFyZ3VtZW50VmFsdWUuc2V0KCdzZWFyY2gnLCBrZXlTZWFyY2gpO1xuICAgICAgICBhcmd1bWVudHNWYWx1ZVtpbmRleF0gPSBhcmd1bWVudFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGFyZ3VtZW50VmFsdWUuaGFzKCdiZWZvcmUnKSkge1xuICAgICAgICBhcmd1bWVudFZhbHVlID0gYXJndW1lbnRWYWx1ZS5zZXQoJ2JlZm9yZScsIHBhZ2luZ1N0b3JlPy5iZWZvcmUpO1xuICAgICAgICBhcmd1bWVudHNWYWx1ZVtpbmRleF0gPSBhcmd1bWVudFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGFyZ3VtZW50VmFsdWUuaGFzKCdhZnRlcicpKSB7XG4gICAgICAgIGFyZ3VtZW50VmFsdWUgPSBhcmd1bWVudFZhbHVlLnNldCgnYWZ0ZXInLCBwYWdpbmdTdG9yZT8uYWZ0ZXIpO1xuICAgICAgICBhcmd1bWVudHNWYWx1ZVtpbmRleF0gPSBhcmd1bWVudFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKE51bWJlcihwYWdlVmFsdWUpLnZhbHVlT2YoKSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoIXBhZ2luZ1N0b3JlIHx8IHBhZ2VWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHBhZ2UsIHRvdGFsX3BhZ2VzLCB9ID0gcGFnaW5nU3RvcmU7XG4gICAgICBjb25zdCBuZXh0UGFnZSA9IChwYWdlIHx8IDApICsgMTtcblxuICAgICAgaWYgKG5leHRQYWdlICYmIE51bWJlcihuZXh0UGFnZSkudmFsdWVPZigpID4gTnVtYmVyKHRvdGFsX3BhZ2VzKS52YWx1ZU9mKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBhcmd1bWVudHNWYWx1ZVtpbmRleF0gPSBhcmd1bWVudFZhbHVlLnNldCgncGFnZScsIG5leHRQYWdlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzVXBkYXRlQXJndW1lbnRzVmFsZUNvbmZpZyhhcmd1bWVudHNWYWx1ZTogQXJyYXk8YW55Piwgb2JqZWN0R2V0RGF0YVVwZGF0ZTogYW55LCBjb25maWc6IElHdWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZUNvbmZpZykge1xuICAgIGlmICghY29uZmlnIHx8ICFvYmplY3RHZXREYXRhVXBkYXRlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmxvZz8ubG9nSW5wdXRzKSB7XG4gICAgICBjb25zb2xlLmxvZygnY29uZmlnJywgY29uZmlnKTtcbiAgICAgIGNvbnNvbGUubG9nKCdvYmplY3RHZXREYXRhVXBkYXRlJywgb2JqZWN0R2V0RGF0YVVwZGF0ZSk7XG4gICAgICBjb25zb2xlLmxvZygnYXJndW1lbnRzVmFsdWUnLCBhcmd1bWVudHNWYWx1ZSk7XG4gICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICB9XG4gICAgY29uc3QgeyBmaWVsZFVwZGF0ZSwgZmllbGRHZXRWYWx1ZSwgcHJlcHJvY2Vzc29yIH0gPSBjb25maWc7XG5cbiAgICBpZiAoIWZpZWxkVXBkYXRlIHx8ICFmaWVsZEdldFZhbHVlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9IGdldChvYmplY3RHZXREYXRhVXBkYXRlLCBmaWVsZEdldFZhbHVlKTtcbiAgICBpZiAoY29uZmlnLmxvZz8ubG9nR2V0VmFsdWUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGB2YWx1ZSBvZiBvYmplY3RHZXREYXRhVXBkYXRlWyR7ZmllbGRHZXRWYWx1ZX1dOiBgLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXByb2Nlc3Nvcikge1xuICAgICAgdmFsdWUgPSBwcmVwcm9jZXNzb3IodmFsdWUpO1xuICAgIH1cbiAgICBpZiAoZmllbGRVcGRhdGUpIHtcbiAgICAgIGxldCByZXN1bHRPZkZpZWxkVXBkYXRlID0gZ2V0KGFyZ3VtZW50c1ZhbHVlLCBmaWVsZFVwZGF0ZSBhcyBhbnkpO1xuXG4gICAgICBpZiAocmVzdWx0T2ZGaWVsZFVwZGF0ZSBpbnN0YW5jZW9mIEh0dHBQYXJhbXMpIHtcbiAgICAgICAgcmVzdWx0T2ZGaWVsZFVwZGF0ZSA9IHJlc3VsdE9mRmllbGRVcGRhdGUuc2V0KChjb25maWcuc3ViRmllbGRVcGRhdGUgfHwgJ3NlYXJjaCcpLCB2YWx1ZSk7XG4gICAgICAgIHNldChhcmd1bWVudHNWYWx1ZSwgZmllbGRVcGRhdGUgYXMgYW55LCByZXN1bHRPZkZpZWxkVXBkYXRlKTtcblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0T2ZGaWVsZFVwZGF0ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIHJlc3VsdE9mRmllbGRVcGRhdGUucHVzaCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdE9mRmllbGRVcGRhdGUgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgc2V0KHJlc3VsdE9mRmllbGRVcGRhdGUsIGNvbmZpZy5zdWJGaWVsZFVwZGF0ZSB8fCAnc2VhcmNoJywgdmFsdWUpO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHNldChhcmd1bWVudHNWYWx1ZSwgZmllbGRVcGRhdGUgYXMgYW55LCB2YWx1ZSk7XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZmFrZVJlc3BvbnNlUGFnaW5nQXBpKCk6IHsgcGFnaW5nOiBJUGFnaW5nIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBwYWdpbmc6IHtcbiAgICAgICAgcGFnZTogMCxcbiAgICAgICAgdG90YWxfcGFnZXM6IDEsXG4gICAgICAgIGJlZm9yZTogJycsXG4gICAgICAgIGFmdGVyOiAnJyxcbiAgICAgICAgZmFrZTogdHJ1ZVxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
package/esm2022/index.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export * from './http-request.service';
|
|
2
|
+
export * from './api-mockup';
|
|
2
3
|
export * from './interfaces';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2h0dHAtcmVxdWVzdC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vaHR0cC1yZXF1ZXN0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9hcGktbW9ja3VwJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcyc7Il19
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpbGQtYXV0by11cGRhdGUtYXJndW1lbnRzLXZhbHVlLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvaHR0cC1yZXF1ZXN0L3NyYy9pbnRlcmZhY2VzL2d1aWxkLWF1dG8tdXBkYXRlLWFyZ3VtZW50cy12YWx1ZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuZXhwb3J0IGludGVyZmFjZSBJR3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUge1xuICBwYWdpbmc6IHtcbiAgICBwYWdlPzogSUd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlQ29uZmlnO1xuICAgIGJlZm9yZT86IElHdWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZUNvbmZpZztcbiAgICBhZnRlcj86IElHdWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZUNvbmZpZztcbiAgfVxuICBzZWFyY2g/OiBJR3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWVDb25maWc7XG4gIHNvcnRPcmRlclR5cGU/OiBJR3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWVDb25maWc7XG4gIHNvcnRPcmRlckJ5PzogSUd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlQ29uZmlnO1xuICBkZXRhaWxCeUlkPzogSUd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlQ29uZmlnO1xuICBvdGhlcj86IEFycmF5PElHdWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZUNvbmZpZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlQ29uZmlnIHtcbiAgZmllbGRVcGRhdGU6IHN0cmluZztcbiAgc3ViRmllbGRVcGRhdGU/OiBzdHJpbmc7IC8vIG7hur91IG91dHB1dCBj4bunYSBmaWVsZFVwZGF0ZSBsw6AgbeG7mXQgxJHhu5FpIHTGsOG7o25nIEh0dHBQYXJhbXMuIHhlbSBkZW1vIGxpc3Qtdmlld1xuICBmaWVsZEdldFZhbHVlOiBzdHJpbmc7IC8vIHbhu5tpIHRyxrDhu51uZyBo4bujcCBj4bunYSBkZXRhbEJ5SWQgdsOgIHNlYXJjaCB0aMOsIMSR4buDIHRyxrDhu51uZyBuw6B5IGdpw6EgdHLhu4sgbMOgLiAnJ1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcmVwcm9jZXNzb3I/
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpbGQtYXV0by11cGRhdGUtYXJndW1lbnRzLXZhbHVlLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvaHR0cC1yZXF1ZXN0L3NyYy9pbnRlcmZhY2VzL2d1aWxkLWF1dG8tdXBkYXRlLWFyZ3VtZW50cy12YWx1ZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuZXhwb3J0IGludGVyZmFjZSBJR3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUge1xuICBwYWdpbmc6IHtcbiAgICBwYWdlPzogSUd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlQ29uZmlnO1xuICAgIGJlZm9yZT86IElHdWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZUNvbmZpZztcbiAgICBhZnRlcj86IElHdWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZUNvbmZpZztcbiAgfVxuICBzZWFyY2g/OiBJR3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWVDb25maWc7XG4gIHNvcnRPcmRlclR5cGU/OiBJR3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWVDb25maWc7XG4gIHNvcnRPcmRlckJ5PzogSUd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlQ29uZmlnO1xuICBkZXRhaWxCeUlkPzogSUd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlQ29uZmlnO1xuICBvdGhlcj86IEFycmF5PElHdWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZUNvbmZpZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlQ29uZmlnIHtcbiAgZmllbGRVcGRhdGU6IHN0cmluZztcbiAgc3ViRmllbGRVcGRhdGU/OiBzdHJpbmc7IC8vIG7hur91IG91dHB1dCBj4bunYSBmaWVsZFVwZGF0ZSBsw6AgbeG7mXQgxJHhu5FpIHTGsOG7o25nIEh0dHBQYXJhbXMuIHhlbSBkZW1vIGxpc3Qtdmlld1xuICBmaWVsZEdldFZhbHVlOiBzdHJpbmc7IC8vIHbhu5tpIHRyxrDhu51uZyBo4bujcCBj4bunYSBkZXRhbEJ5SWQgdsOgIHNlYXJjaCB0aMOsIMSR4buDIHRyxrDhu51uZyBuw6B5IGdpw6EgdHLhu4sgbMOgLiAnJ1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcmVwcm9jZXNzb3I/OiAodmFsdWU6IGFueSkgPT4gYW55O1xuICBsb2c/OiB7XG4gICAgbG9nSW5wdXRzPzogYm9vbGVhbjtcbiAgICBsb2dHZXRWYWx1ZT86IGJvb2xlYW47XG4gIH07XG59Il19
|
|
@@ -1,46 +1,49 @@
|
|
|
1
1
|
import { HttpParams } from '@angular/common/http';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { Injectable } from '@angular/core';
|
|
4
|
-
import { getKeyCacheByArrayObject, UtilsCache, isEmpty, get, set } from '@libs-ui/utils';
|
|
5
|
-
import { lastValueFrom } from 'rxjs';
|
|
4
|
+
import { getKeyCacheByArrayObject, UtilsCache, isEmpty, get, set, isNil, isEqual, UtilsHttpParamsRequest } from '@libs-ui/utils';
|
|
5
|
+
import { lastValueFrom, timer, of, delay } from 'rxjs';
|
|
6
6
|
|
|
7
7
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
8
8
|
class LibsUiHttpRequestService {
|
|
9
|
+
/** Chứa dữ liệu cache memory */
|
|
9
10
|
serviceStore;
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
/** Chứa các service common base api */
|
|
12
|
+
servicesCommon = {};
|
|
13
|
+
/** Chứa các service call api đến backend */
|
|
14
|
+
servicesApiModules = {};
|
|
12
15
|
constructor() {
|
|
13
16
|
this.serviceStore = new Map();
|
|
14
17
|
}
|
|
15
18
|
set ServicesCommon(serviceCommon) {
|
|
16
|
-
this.servicesCommon = serviceCommon;
|
|
19
|
+
this.servicesCommon = { ...this.servicesCommon, ...serviceCommon };
|
|
17
20
|
}
|
|
18
|
-
set
|
|
19
|
-
this.
|
|
21
|
+
set ServicesApiModules(servicesApiModules) {
|
|
22
|
+
this.servicesApiModules = { ...this.servicesApiModules, ...servicesApiModules };
|
|
20
23
|
}
|
|
21
24
|
getServiceByName(name) {
|
|
22
25
|
if (!name || !name.trim()) {
|
|
23
26
|
return undefined;
|
|
24
27
|
}
|
|
25
|
-
if (name.startsWith('common
|
|
28
|
+
if (name.startsWith('common')) {
|
|
26
29
|
if (!this.servicesCommon) {
|
|
27
30
|
throw 'service common is Empty, please inject MoLibsCoreUIHttpRequestService and call ServicesCommon update 1';
|
|
28
31
|
}
|
|
29
32
|
return this.servicesCommon[name];
|
|
30
33
|
}
|
|
31
|
-
if (name.startsWith('
|
|
32
|
-
if (!this.
|
|
34
|
+
if (name.startsWith('apiModule')) {
|
|
35
|
+
if (!this.servicesApiModules) {
|
|
33
36
|
throw 'service module is Empty, please inject MoLibsCoreUIHttpRequestService and call servicesModules update 2';
|
|
34
37
|
}
|
|
35
|
-
return this.
|
|
38
|
+
return this.servicesApiModules[name];
|
|
36
39
|
}
|
|
37
40
|
return undefined;
|
|
38
41
|
}
|
|
39
42
|
refreshAllService() {
|
|
40
|
-
if (!this.
|
|
43
|
+
if (!this.servicesApiModules) {
|
|
41
44
|
throw 'service common is Empty, please inject MoLibsCoreUIHttpRequestService and call servicesModules update 3';
|
|
42
45
|
}
|
|
43
|
-
Object.keys(this.
|
|
46
|
+
Object.keys(this.servicesApiModules).forEach((nameService) => this.servicesApiModules[nameService].refreshAPIUrl && this.servicesApiModules[nameService].refreshAPIUrl());
|
|
44
47
|
}
|
|
45
48
|
async callApi(httpRequestConfig) {
|
|
46
49
|
if (!httpRequestConfig || (!httpRequestConfig.serviceName && !httpRequestConfig.serviceOther) || !httpRequestConfig.functionName) {
|
|
@@ -48,15 +51,15 @@ class LibsUiHttpRequestService {
|
|
|
48
51
|
}
|
|
49
52
|
const { serviceName, serviceOther, keyCache, functionName, argumentsValue } = httpRequestConfig;
|
|
50
53
|
if (!serviceOther && (!serviceName || !serviceName.trim())) {
|
|
51
|
-
throw
|
|
54
|
+
throw `http request config not exactly serviceOther or serviceName`;
|
|
52
55
|
}
|
|
53
56
|
const serviceInstance = this.getServiceByName(serviceName || '') || serviceOther;
|
|
54
57
|
if (!serviceInstance) {
|
|
55
|
-
throw
|
|
58
|
+
throw `http request notfound serviceInstance name: ${serviceName}`;
|
|
56
59
|
}
|
|
57
60
|
const methodInstance = serviceInstance[functionName];
|
|
58
61
|
if (!methodInstance) {
|
|
59
|
-
throw
|
|
62
|
+
throw `http request config notfound methodInstance name: ${functionName}`;
|
|
60
63
|
}
|
|
61
64
|
const keyCacheMD5 = getKeyCacheByArrayObject(keyCache || '', argumentsValue);
|
|
62
65
|
const cacheData = await this.getCacheData(httpRequestConfig, keyCacheMD5);
|
|
@@ -204,18 +207,27 @@ class LibsUiHttpRequestService {
|
|
|
204
207
|
if (!config || !objectGetDataUpdate) {
|
|
205
208
|
return undefined;
|
|
206
209
|
}
|
|
210
|
+
if (config.log?.logInputs) {
|
|
211
|
+
console.log('config', config);
|
|
212
|
+
console.log('objectGetDataUpdate', objectGetDataUpdate);
|
|
213
|
+
console.log('argumentsValue', argumentsValue);
|
|
214
|
+
console.log('--------------------------------');
|
|
215
|
+
}
|
|
207
216
|
const { fieldUpdate, fieldGetValue, preprocessor } = config;
|
|
208
217
|
if (!fieldUpdate || !fieldGetValue) {
|
|
209
218
|
return undefined;
|
|
210
219
|
}
|
|
211
220
|
let value = get(objectGetDataUpdate, fieldGetValue);
|
|
221
|
+
if (config.log?.logGetValue) {
|
|
222
|
+
console.log(`value of objectGetDataUpdate[${fieldGetValue}]: `, value);
|
|
223
|
+
}
|
|
212
224
|
if (preprocessor) {
|
|
213
225
|
value = preprocessor(value);
|
|
214
226
|
}
|
|
215
227
|
if (fieldUpdate) {
|
|
216
228
|
let resultOfFieldUpdate = get(argumentsValue, fieldUpdate);
|
|
217
229
|
if (resultOfFieldUpdate instanceof HttpParams) {
|
|
218
|
-
resultOfFieldUpdate = resultOfFieldUpdate.set(config.subFieldUpdate || 'search', value);
|
|
230
|
+
resultOfFieldUpdate = resultOfFieldUpdate.set((config.subFieldUpdate || 'search'), value);
|
|
219
231
|
set(argumentsValue, fieldUpdate, resultOfFieldUpdate);
|
|
220
232
|
return value;
|
|
221
233
|
}
|
|
@@ -253,11 +265,219 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
253
265
|
}]
|
|
254
266
|
}], ctorParameters: () => [] });
|
|
255
267
|
|
|
268
|
+
/**
|
|
269
|
+
* Trả về các phương thức để xử lý danh sách dữ liệu mock
|
|
270
|
+
* @param data - Mảng dữ liệu mặc định để mock
|
|
271
|
+
* @param functionGetData - Hàm tùy chọn để lấy dữ liệu động thay vì sử dụng data mặc định
|
|
272
|
+
* @returns Đối tượng chứa các phương thức:
|
|
273
|
+
* - list: Trả về Promise với toàn bộ dữ liệu (có delay 250ms)
|
|
274
|
+
* - listObservable: Trả về Observable với toàn bộ dữ liệu (có delay 250ms)
|
|
275
|
+
* - listPaging: Trả về Promise với dữ liệu đã phân trang dựa trên params (có delay 250ms)
|
|
276
|
+
*
|
|
277
|
+
* @example
|
|
278
|
+
* ```typescript
|
|
279
|
+
* const mockData = [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }];
|
|
280
|
+
* const listService = returnListObject(mockData);
|
|
281
|
+
*
|
|
282
|
+
* // Lấy toàn bộ dữ liệu
|
|
283
|
+
* const allData = await listService.list();
|
|
284
|
+
*
|
|
285
|
+
* // Lấy dữ liệu phân trang
|
|
286
|
+
* const params = new UtilsHttpParamsRequest();
|
|
287
|
+
* params.set('page', '1');
|
|
288
|
+
* params.set('per_page', '10');
|
|
289
|
+
* const pagedData = await listService.listPaging(params);
|
|
290
|
+
* ```
|
|
291
|
+
*/
|
|
292
|
+
const returnListObject = (data, functionGetData) => {
|
|
293
|
+
return {
|
|
294
|
+
list: async () => {
|
|
295
|
+
if (functionGetData) {
|
|
296
|
+
data = functionGetData();
|
|
297
|
+
}
|
|
298
|
+
await lastValueFrom(timer(250));
|
|
299
|
+
return {
|
|
300
|
+
code: 200,
|
|
301
|
+
data: data || [],
|
|
302
|
+
paging: {},
|
|
303
|
+
};
|
|
304
|
+
},
|
|
305
|
+
listObservable: () => {
|
|
306
|
+
if (functionGetData) {
|
|
307
|
+
data = functionGetData();
|
|
308
|
+
}
|
|
309
|
+
return of({
|
|
310
|
+
code: 200,
|
|
311
|
+
data: data || [],
|
|
312
|
+
paging: {},
|
|
313
|
+
}).pipe(delay(250));
|
|
314
|
+
},
|
|
315
|
+
listPaging: async (params) => {
|
|
316
|
+
if (functionGetData) {
|
|
317
|
+
data = functionGetData();
|
|
318
|
+
}
|
|
319
|
+
const page = parseInt(params.get('page') || '1');
|
|
320
|
+
const per_page = parseInt(params.get('per_page') || '30');
|
|
321
|
+
const result = pagingToList(data, page, per_page);
|
|
322
|
+
await lastValueFrom(timer(250));
|
|
323
|
+
return result;
|
|
324
|
+
},
|
|
325
|
+
};
|
|
326
|
+
};
|
|
327
|
+
/**
|
|
328
|
+
* Tạo một đối tượng mock detail với các phương thức để lấy bản ghi riêng lẻ theo khóa.
|
|
329
|
+
* Hỗ trợ cả mảng dữ liệu tĩnh và các hàm dữ liệu động.
|
|
330
|
+
*
|
|
331
|
+
* @template TypeResponse - Kiểu dữ liệu phản hồi mong đợi
|
|
332
|
+
* @template TypeParams - Kiểu tham số HTTP (mặc định là any)
|
|
333
|
+
*
|
|
334
|
+
* @param httpParams - Tham số HTTP chứa:
|
|
335
|
+
* - keys: Khóa (hoặc các khóa) cần tìm kiếm
|
|
336
|
+
* - fieldKey: Tên trường để so khớp (mặc định là 'id')
|
|
337
|
+
* - dataResponseOject: Cờ boolean để định dạng đối tượng phản hồi
|
|
338
|
+
* @param data - Mảng dữ liệu tĩnh tùy chọn để tìm kiếm
|
|
339
|
+
* @param functionGetData - Hàm tùy chọn trả về dữ liệu (có thể là Promise hoặc Observable)
|
|
340
|
+
* @param ignoreSplit - Nếu true, coi keys như một giá trị đơn thay vì tách chuỗi
|
|
341
|
+
* @param splitOperator - Toán tử tùy chỉnh để tách keys (mặc định là dấu phẩy)
|
|
342
|
+
*
|
|
343
|
+
* @returns Đối tượng với các phương thức:
|
|
344
|
+
* - detailByData: Tìm kiếm thông qua mảng dữ liệu tĩnh được cung cấp
|
|
345
|
+
* - detailByFunction: Gọi functionGetData để lấy dữ liệu mới, sau đó tìm kiếm
|
|
346
|
+
*
|
|
347
|
+
* @example
|
|
348
|
+
* ```typescript
|
|
349
|
+
* const params = new UtilsHttpParamsRequest({fromObject:{keys:'1',fieldKey:'id'}});
|
|
350
|
+
* const mockDetail = returnDetailObject<User>(params, userData);
|
|
351
|
+
* const user = await mockDetail.detailByData();
|
|
352
|
+
* ```
|
|
353
|
+
*/
|
|
354
|
+
const returnDetailObject = (httpParams, data, functionGetData, ignoreSplit, splitOperator) => {
|
|
355
|
+
const keysPrams = httpParams.get('keys');
|
|
356
|
+
const fieldKey = httpParams.get('fieldKey') || 'id';
|
|
357
|
+
const dataResponseOject = httpParams.get('dataResponseOject');
|
|
358
|
+
return {
|
|
359
|
+
detailByData: async (keys) => {
|
|
360
|
+
return filterData(fieldKey, data, keys ?? keysPrams, dataResponseOject, ignoreSplit, splitOperator);
|
|
361
|
+
},
|
|
362
|
+
detailByFunction: async (keys) => {
|
|
363
|
+
if (!functionGetData) {
|
|
364
|
+
return await filterData(fieldKey, undefined, undefined, dataResponseOject, ignoreSplit, splitOperator);
|
|
365
|
+
}
|
|
366
|
+
let dataResult = functionGetData();
|
|
367
|
+
try {
|
|
368
|
+
if (dataResult['subscribe']) {
|
|
369
|
+
dataResult = await lastValueFrom(dataResult);
|
|
370
|
+
}
|
|
371
|
+
if (dataResult['then']) {
|
|
372
|
+
dataResult = await dataResult;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
catch (_) {
|
|
376
|
+
dataResult = { data: [] };
|
|
377
|
+
}
|
|
378
|
+
data = dataResult.data;
|
|
379
|
+
return await filterData(fieldKey, data, keys || keysPrams, dataResponseOject, ignoreSplit, splitOperator);
|
|
380
|
+
},
|
|
381
|
+
};
|
|
382
|
+
};
|
|
383
|
+
const filterData = (fieldKey, data, keys, dataResponseOject, ignoreSplit, splitOperator) => {
|
|
384
|
+
if (!data || typeof data !== 'object' || isNil(keys) || keys === '') {
|
|
385
|
+
return {
|
|
386
|
+
code: 200,
|
|
387
|
+
data: undefined,
|
|
388
|
+
paging: {},
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
data = data || [];
|
|
392
|
+
if (!(data instanceof Array)) {
|
|
393
|
+
data = [data];
|
|
394
|
+
}
|
|
395
|
+
const result = [];
|
|
396
|
+
if (!ignoreSplit && typeof keys === 'string') {
|
|
397
|
+
keys = keys.split(splitOperator || ',');
|
|
398
|
+
}
|
|
399
|
+
if (typeof keys === 'number' || typeof keys === 'boolean' || (typeof keys === 'string' && ignoreSplit)) {
|
|
400
|
+
keys = [keys];
|
|
401
|
+
}
|
|
402
|
+
keys.forEach((key) => {
|
|
403
|
+
const resultFilter = data?.filter((elData) => isEqual(get(elData, fieldKey), key, { ignoreExactlyDataType: true }));
|
|
404
|
+
if (resultFilter && resultFilter.length) {
|
|
405
|
+
result.push(...resultFilter);
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
return {
|
|
409
|
+
code: 200,
|
|
410
|
+
data: result.length ? (dataResponseOject ? result[0] : result) : undefined,
|
|
411
|
+
paging: {},
|
|
412
|
+
};
|
|
413
|
+
};
|
|
414
|
+
const per_page = 20;
|
|
415
|
+
const total_items = per_page * 150 + 15;
|
|
416
|
+
const getConfigListDataDemo = (httpParamsDetail = new UtilsHttpParamsRequest(), objectData, functionBuildObject) => {
|
|
417
|
+
if (!objectData) {
|
|
418
|
+
objectData = {
|
|
419
|
+
id: '',
|
|
420
|
+
name: 'item positon index ',
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
const data = [...Array(total_items).keys()].map((_, index) => {
|
|
424
|
+
if (functionBuildObject) {
|
|
425
|
+
return functionBuildObject(`${+index + 1}`);
|
|
426
|
+
}
|
|
427
|
+
const obj = {};
|
|
428
|
+
Object.keys(objectData).forEach((key) => {
|
|
429
|
+
set(obj, key, `${objectData[key]}${+index + 1}`);
|
|
430
|
+
});
|
|
431
|
+
return obj;
|
|
432
|
+
});
|
|
433
|
+
const listService = returnListObject(data);
|
|
434
|
+
const detailService = returnDetailObject(httpParamsDetail, data, undefined, false, ';');
|
|
435
|
+
return {
|
|
436
|
+
list: listService.listPaging,
|
|
437
|
+
detailByData: detailService.detailByData,
|
|
438
|
+
};
|
|
439
|
+
};
|
|
440
|
+
/**
|
|
441
|
+
* Hàm phân trang dữ liệu từ một mảng
|
|
442
|
+
* @param data - Mảng dữ liệu cần phân trang
|
|
443
|
+
* @param page - Số trang hiện tại (bắt đầu từ 1)
|
|
444
|
+
* @param per_page - Số lượng item trên mỗi trang
|
|
445
|
+
* @returns Đối tượng chứa dữ liệu đã phân trang và thông tin phân trang
|
|
446
|
+
*/
|
|
447
|
+
const pagingToList = (data, page, per_page) => {
|
|
448
|
+
if (!data || !Array.isArray(data)) {
|
|
449
|
+
return {
|
|
450
|
+
code: 200,
|
|
451
|
+
data: [],
|
|
452
|
+
paging: {
|
|
453
|
+
page: page,
|
|
454
|
+
per_page: per_page,
|
|
455
|
+
total_items: 0,
|
|
456
|
+
total_pages: 0,
|
|
457
|
+
},
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
const start = (page - 1) * per_page;
|
|
461
|
+
const end = start + per_page;
|
|
462
|
+
const total_pages = Math.ceil(data.length / per_page);
|
|
463
|
+
const dataByPage = data.slice(start, end);
|
|
464
|
+
return {
|
|
465
|
+
code: 200,
|
|
466
|
+
data: dataByPage,
|
|
467
|
+
paging: {
|
|
468
|
+
page: page > total_pages ? total_pages : page,
|
|
469
|
+
per_page: per_page,
|
|
470
|
+
total_items: data.length,
|
|
471
|
+
total_pages: total_pages,
|
|
472
|
+
},
|
|
473
|
+
};
|
|
474
|
+
};
|
|
475
|
+
|
|
256
476
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
257
477
|
|
|
258
478
|
/**
|
|
259
479
|
* Generated bundle index. Do not edit.
|
|
260
480
|
*/
|
|
261
481
|
|
|
262
|
-
export { LibsUiHttpRequestService };
|
|
482
|
+
export { LibsUiHttpRequestService, getConfigListDataDemo, pagingToList, returnDetailObject, returnListObject };
|
|
263
483
|
//# sourceMappingURL=libs-ui-services-http-request.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-services-http-request.mjs","sources":["../../../../../libs-ui/services/http-request/src/http-request.service.ts","../../../../../libs-ui/services/http-request/src/interfaces/http-request-config.interface.ts","../../../../../libs-ui/services/http-request/src/libs-ui-services-http-request.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { HttpParams } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { IPaging } from '@libs-ui/interfaces-types';\nimport { UtilsCache, get, getKeyCacheByArrayObject, isEmpty, set } from '@libs-ui/utils';\nimport { lastValueFrom } from 'rxjs';\nimport { IGuideAutoUpdateArgumentsValue, IGuideAutoUpdateArgumentsValueConfig, IHttpRequestConfig } from './interfaces/index';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LibsUiHttpRequestService {\n private serviceStore: Map<string, any>;\n private servicesCommon?: Record<string,any>;\n private servicesModules?: Record<string,any>;\n\n constructor() {\n this.serviceStore = new Map();\n }\n\n public set ServicesCommon(serviceCommon: Record<string,any>) {\n this.servicesCommon = serviceCommon;\n }\n\n public set ServiceModules(servicesModules: Record<string,any>) {\n this.servicesModules = servicesModules;\n }\n\n private getServiceByName(name: string): Record<string,any> | undefined {\n if (!name || !name.trim()) {\n return undefined;\n }\n if (name.startsWith('common-')) {\n\n if (!this.servicesCommon) {\n throw 'service common is Empty, please inject MoLibsCoreUIHttpRequestService and call ServicesCommon update 1';\n }\n\n return this.servicesCommon[name];\n }\n\n if (name.startsWith('module-')) {\n if (!this.servicesModules) {\n throw 'service module is Empty, please inject MoLibsCoreUIHttpRequestService and call servicesModules update 2';\n }\n\n return this.servicesModules[name];\n }\n\n return undefined;\n }\n\n public refreshAllService() {\n if (!this.servicesModules) {\n throw 'service common is Empty, please inject MoLibsCoreUIHttpRequestService and call servicesModules update 3';\n }\n\n Object.keys(this.servicesModules).forEach((nameService: string) => (this.servicesModules as any)[nameService].refreshAPIUrl && (this.servicesModules as any)[nameService].refreshAPIUrl());\n }\n\n public async callApi<T = any>(httpRequestConfig: IHttpRequestConfig): Promise<T> {\n if (!httpRequestConfig || (!httpRequestConfig.serviceName && !httpRequestConfig.serviceOther) || !httpRequestConfig.functionName) {\n throw 'http request config not exactly httpRequestConfig';\n }\n const { serviceName, serviceOther, keyCache, functionName, argumentsValue } = httpRequestConfig;\n\n if (!serviceOther && (!serviceName || !serviceName.trim())) {\n throw 'http request config not exactly serviceInstance';\n }\n const serviceInstance: any = this.getServiceByName(serviceName || '') || serviceOther;\n\n if (!serviceInstance) {\n throw 'http request config not exactly serviceInstance';\n }\n const methodInstance = serviceInstance[functionName];\n\n if (!methodInstance) {\n throw 'http request config not exactly methodInstance';\n }\n const keyCacheMD5: string = getKeyCacheByArrayObject(keyCache || '', argumentsValue);\n const cacheData = await this.getCacheData(httpRequestConfig, keyCacheMD5);\n\n if (cacheData) {\n return Promise.resolve(cacheData);\n }\n\n let callResponse = methodInstance.apply(serviceInstance, argumentsValue);\n if (!callResponse.then) {\n callResponse = lastValueFrom(callResponse);\n }\n\n const res = await callResponse;\n\n return await this.setCacheData(res, httpRequestConfig, keyCacheMD5);\n }\n\n private async getCacheData(httpRequestConfig: IHttpRequestConfig, keyCache: string) {\n const { cacheType, convertResponseData } = httpRequestConfig;\n\n if (!cacheType || !keyCache) {\n return undefined;\n }\n if (cacheType === 'service') {\n const data = this.serviceStore.get(keyCache);\n\n return data ? (convertResponseData ? convertResponseData(data) : data) : data;\n }\n const data = await UtilsCache.GetAsync(keyCache,undefined,true);\n\n return data ? (convertResponseData ? convertResponseData(data) : data) : data;\n }\n\n private async setCacheData(data: any, httpRequestConfig: IHttpRequestConfig, keyCache: string){\n const { cacheType, clearCache, convertResponseData } = httpRequestConfig;\n\n if (!cacheType || !keyCache) {\n return convertResponseData ? convertResponseData(data) : data;\n }\n if(clearCache === true){\n this.clearCache(cacheType, keyCache);\n }\n if (cacheType === 'service') {\n this.serviceStore.set(keyCache, data);\n\n return convertResponseData ? convertResponseData(data) : data;\n }\n await UtilsCache.SetAsync(keyCache, data, (httpRequestConfig.timeCache || 5) * 60,true);\n\n return convertResponseData ? convertResponseData(data) : data;\n }\n\n private clearCache(cacheType: 'service' | 'local-store', keyCache: string) {\n if (cacheType === 'service') {\n this.serviceStore.delete(keyCache);\n\n return;\n }\n UtilsCache.ClearAsync(keyCache,true);\n }\n\n /**\n * @return trả về trạng thái đã load hết item chưa (ví dụ: dựa vào tham số này để quyết định có tiếp tục gọi api khi scroll ko) .\n */\n public updateArguments(argumentsValue: Array<any>, objectGetDataUpdate: Record<string,any>, pagingStore: IPaging, keySearch: string, searchOnline: boolean, loadedLastItem: boolean, guideAutoUpdateArgumentsValue?: IGuideAutoUpdateArgumentsValue): boolean {\n if (!argumentsValue || !(argumentsValue instanceof Array) || loadedLastItem) {\n return true;\n }\n\n if (!guideAutoUpdateArgumentsValue) {\n return this.updateArgumentsDefault(argumentsValue, true, pagingStore, keySearch, searchOnline);\n }\n const { paging, search, other, detailById, sortOrderType, sortOrderBy } = guideAutoUpdateArgumentsValue;\n\n if (search) {\n search.fieldGetValue = 'keySearch';\n this.processUpdateArgumentsValeConfig(argumentsValue, { keySearch }, search);\n }\n if (objectGetDataUpdate?.['storeParamsCallApi'] && typeof objectGetDataUpdate?.['storeParamsCallApi'] === 'object' && !(objectGetDataUpdate?.['storeParamsCallApi'] as any).instanceSort) {\n objectGetDataUpdate['storeParamsCallApi'] = { ...objectGetDataUpdate['storeParamsCallApi'], instanceSort: {} };\n }\n if (sortOrderBy) {\n this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, sortOrderBy);\n }\n if (sortOrderType) {\n this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, sortOrderType);\n }\n if (other && other.length) {\n other.forEach(config => this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, config));\n }\n if (detailById) {\n detailById.fieldGetValue = detailById.fieldGetValue || detailById.fieldGetValue.trim() || 'key';\n this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, detailById);\n }\n\n if (isEmpty(paging)) {\n return this.updateArgumentsDefault(argumentsValue, false, pagingStore || this.fakeResponsePagingApi()['paging'], keySearch, searchOnline);\n }\n const { page, before, after } = paging;\n\n if (page && objectGetDataUpdate) {\n page.preprocessor = (value: number): number => {\n\n return ++value;\n };\n const valuePage = +this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, page);\n const valueLastPage = +get(objectGetDataUpdate as any, 'paging.total_pages');\n\n if (valuePage && Number(valuePage).valueOf() > Number(valueLastPage).valueOf() || valueLastPage === 0) {\n return true;\n }\n }\n if (before && objectGetDataUpdate && !this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, before) && !get(objectGetDataUpdate, 'paging.fake')) {\n set(objectGetDataUpdate, 'paging.fake', false);\n\n return true;\n }\n if (after && objectGetDataUpdate && !this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, after) && !get(objectGetDataUpdate, 'paging.fake')) {\n set(objectGetDataUpdate, 'paging.fake', false);\n\n return true;\n }\n\n if (!argumentsValue || !argumentsValue.length) {\n return true;\n }\n\n return false;\n }\n\n private updateArgumentsDefault(argumentsValue: Array<any>, updateSearch: boolean, pagingStore: IPaging, keySearch: string, searchOnline: boolean) {\n if (!argumentsValue || !argumentsValue.length) {\n return true;\n }\n\n for (const index in argumentsValue) {\n let argumentValue = argumentsValue[index];\n\n if (!(argumentValue instanceof HttpParams)) {\n continue;\n }\n const pageValue = argumentValue.get('page');\n\n if (searchOnline && updateSearch) {\n argumentValue = argumentValue.set('search', keySearch);\n argumentsValue[index] = argumentValue;\n }\n if (argumentValue.has('before')) {\n argumentValue = argumentValue.set('before', pagingStore?.before);\n argumentsValue[index] = argumentValue;\n }\n if (argumentValue.has('after')) {\n argumentValue = argumentValue.set('after', pagingStore?.after);\n argumentsValue[index] = argumentValue;\n }\n if (Number(pageValue).valueOf() === -1) {\n return true;\n }\n if (!pagingStore || pageValue === undefined) {\n break;\n }\n\n const { page, total_pages, } = pagingStore;\n const nextPage = (page || 0) + 1;\n\n if (nextPage && Number(nextPage).valueOf() > Number(total_pages).valueOf()) {\n return true;\n }\n argumentsValue[index] = argumentValue.set('page', nextPage);\n break;\n\n }\n\n return false;\n }\n\n private processUpdateArgumentsValeConfig(argumentsValue: Array<any>, objectGetDataUpdate: any, config: IGuideAutoUpdateArgumentsValueConfig) {\n if (!config || !objectGetDataUpdate) {\n return undefined;\n }\n const { fieldUpdate, fieldGetValue, preprocessor } = config;\n\n if (!fieldUpdate || !fieldGetValue) {\n return undefined;\n }\n\n let value = get(objectGetDataUpdate, fieldGetValue);\n\n if (preprocessor) {\n value = preprocessor(value);\n }\n if (fieldUpdate) {\n let resultOfFieldUpdate = get(argumentsValue, fieldUpdate);\n\n if (resultOfFieldUpdate instanceof HttpParams) {\n resultOfFieldUpdate = resultOfFieldUpdate.set(config.subFieldUpdate || 'search', value);\n set(argumentsValue, fieldUpdate, resultOfFieldUpdate);\n\n return value;\n }\n if (resultOfFieldUpdate instanceof Array) {\n resultOfFieldUpdate.push(value);\n\n return value;\n }\n if (resultOfFieldUpdate instanceof Object) {\n set(resultOfFieldUpdate, config.subFieldUpdate || 'search', value);\n\n return value;\n }\n set(argumentsValue, fieldUpdate, value);\n\n return value;\n }\n\n return value;\n }\n\n public fakeResponsePagingApi(): {paging:IPaging} {\n return {\n paging: {\n page: 0,\n total_pages: 1,\n before: '',\n after: '',\n fake: true\n }\n };\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { IGuideAutoUpdateArgumentsValue } from \"./guild-auto-update-arguments-value.interface\";\n\nexport interface IHttpRequestConfig {\n serviceOther?: any; // là 1 object không được inject trong httpRequest; được sử dụng để lấy data từ 1 đối tượng không phải là service inject\n serviceName?: string; // tên service được inject trong http request service;\n functionName: string; // tên hàm muốn gọi trong service\n argumentsValue: Array<any>;// chứa dữ liệu của params truyền vào, mảng có kểu dữ liệu không cần giống nhau vd: hàm function(search:string,age:number,page:Object)={...} thì serviceSpecificParams = ['param',16,{page:1,page:per_page:25}]\n cacheType?: 'service' | 'local-store';\n keyCache?: string; // sử dụng nếu sử dụng cache. khi tạo bộ config sử dụng đối tượng uuid để lấy một id set vào biến này. và biến này sẽ ko thay đổi trong quá trình sử dụng\n timeCache?: number; // đơn vị phút\n clearCache?: boolean;\n guideAutoUpdateArgumentsValue?: IGuideAutoUpdateArgumentsValue; // khai báo không sử dụng cho HttpRequestService. Dùng cho cá component muốn lấy thông tin update arguments để load more khi scroll bottom. Ví dụ như MoLibShareComponentsListViewTemplatesComponentAbstract\n convertResponseData?: (response: any) => any;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-services-http-request.mjs","sources":["../../../../../libs-ui/services/http-request/src/http-request.service.ts","../../../../../libs-ui/services/http-request/src/api-mockup.ts","../../../../../libs-ui/services/http-request/src/interfaces/http-request-config.interface.ts","../../../../../libs-ui/services/http-request/src/libs-ui-services-http-request.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { HttpParams } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { IPaging } from '@libs-ui/interfaces-types';\nimport { UtilsCache, get, getKeyCacheByArrayObject, isEmpty, set } from '@libs-ui/utils';\nimport { lastValueFrom } from 'rxjs';\nimport { IGuideAutoUpdateArgumentsValue, IGuideAutoUpdateArgumentsValueConfig, IHttpRequestConfig } from './interfaces/index';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LibsUiHttpRequestService {\n /** Chứa dữ liệu cache memory */\n private serviceStore: Map<string, any>;\n /** Chứa các service common base api */\n private servicesCommon: Record<string, any> = {};\n\n /** Chứa các service call api đến backend */\n private servicesApiModules: Record<string, any> = {};\n\n constructor() {\n this.serviceStore = new Map();\n }\n\n public set ServicesCommon(serviceCommon: Record<string, any>) {\n this.servicesCommon = { ...this.servicesCommon, ...serviceCommon };\n }\n\n public set ServicesApiModules(servicesApiModules: Record<string, any>) {\n this.servicesApiModules = { ...this.servicesApiModules, ...servicesApiModules };\n }\n\n private getServiceByName(name: string): Record<string, any> | undefined {\n if (!name || !name.trim()) {\n return undefined;\n }\n if (name.startsWith('common')) {\n\n if (!this.servicesCommon) {\n throw 'service common is Empty, please inject MoLibsCoreUIHttpRequestService and call ServicesCommon update 1';\n }\n\n return this.servicesCommon[name];\n }\n\n if (name.startsWith('apiModule')) {\n if (!this.servicesApiModules) {\n throw 'service module is Empty, please inject MoLibsCoreUIHttpRequestService and call servicesModules update 2';\n }\n\n return this.servicesApiModules[name];\n }\n\n return undefined;\n }\n\n public refreshAllService() {\n if (!this.servicesApiModules) {\n throw 'service common is Empty, please inject MoLibsCoreUIHttpRequestService and call servicesModules update 3';\n }\n\n Object.keys(this.servicesApiModules).forEach((nameService: string) => (this.servicesApiModules as any)[nameService].refreshAPIUrl && (this.servicesApiModules as any)[nameService].refreshAPIUrl());\n }\n\n public async callApi<T = any>(httpRequestConfig: IHttpRequestConfig): Promise<T> {\n if (!httpRequestConfig || (!httpRequestConfig.serviceName && !httpRequestConfig.serviceOther) || !httpRequestConfig.functionName) {\n throw 'http request config not exactly httpRequestConfig';\n }\n const { serviceName, serviceOther, keyCache, functionName, argumentsValue } = httpRequestConfig;\n\n if (!serviceOther && (!serviceName || !serviceName.trim())) {\n throw `http request config not exactly serviceOther or serviceName`;\n }\n const serviceInstance: any = this.getServiceByName(serviceName || '') || serviceOther;\n\n if (!serviceInstance) {\n throw `http request notfound serviceInstance name: ${serviceName}`;\n }\n const methodInstance = serviceInstance[functionName];\n\n if (!methodInstance) {\n throw `http request config notfound methodInstance name: ${functionName}`;\n }\n const keyCacheMD5: string = getKeyCacheByArrayObject(keyCache || '', argumentsValue);\n const cacheData = await this.getCacheData(httpRequestConfig, keyCacheMD5);\n\n if (cacheData) {\n return Promise.resolve(cacheData);\n }\n\n let callResponse = methodInstance.apply(serviceInstance, argumentsValue);\n if (!callResponse.then) {\n callResponse = lastValueFrom(callResponse);\n }\n\n const res = await callResponse;\n\n return await this.setCacheData(res, httpRequestConfig, keyCacheMD5);\n }\n\n private async getCacheData(httpRequestConfig: IHttpRequestConfig, keyCache: string) {\n const { cacheType, convertResponseData } = httpRequestConfig;\n\n if (!cacheType || !keyCache) {\n return undefined;\n }\n if (cacheType === 'service') {\n const data = this.serviceStore.get(keyCache);\n\n return data ? (convertResponseData ? convertResponseData(data) : data) : data;\n }\n const data = await UtilsCache.GetAsync(keyCache, undefined, true);\n\n return data ? (convertResponseData ? convertResponseData(data) : data) : data;\n }\n\n private async setCacheData(data: any, httpRequestConfig: IHttpRequestConfig, keyCache: string) {\n const { cacheType, clearCache, convertResponseData } = httpRequestConfig;\n\n if (!cacheType || !keyCache) {\n return convertResponseData ? convertResponseData(data) : data;\n }\n if (clearCache === true) {\n this.clearCache(cacheType, keyCache);\n }\n if (cacheType === 'service') {\n this.serviceStore.set(keyCache, data);\n\n return convertResponseData ? convertResponseData(data) : data;\n }\n await UtilsCache.SetAsync(keyCache, data, (httpRequestConfig.timeCache || 5) * 60, true);\n\n return convertResponseData ? convertResponseData(data) : data;\n }\n\n private clearCache(cacheType: 'service' | 'local-store', keyCache: string) {\n if (cacheType === 'service') {\n this.serviceStore.delete(keyCache);\n\n return;\n }\n UtilsCache.ClearAsync(keyCache, true);\n }\n\n /**\n * @return trả về trạng thái đã load hết item chưa (ví dụ: dựa vào tham số này để quyết định có tiếp tục gọi api khi scroll ko) .\n */\n public updateArguments(argumentsValue: Array<any>, objectGetDataUpdate: Record<string, any>, pagingStore: IPaging, keySearch: string, searchOnline: boolean, loadedLastItem: boolean, guideAutoUpdateArgumentsValue?: IGuideAutoUpdateArgumentsValue): boolean {\n if (!argumentsValue || !(argumentsValue instanceof Array) || loadedLastItem) {\n return true;\n }\n\n if (!guideAutoUpdateArgumentsValue) {\n return this.updateArgumentsDefault(argumentsValue, true, pagingStore, keySearch, searchOnline);\n }\n const { paging, search, other, detailById, sortOrderType, sortOrderBy } = guideAutoUpdateArgumentsValue;\n\n if (search) {\n search.fieldGetValue = 'keySearch';\n this.processUpdateArgumentsValeConfig(argumentsValue, { keySearch }, search);\n }\n if (objectGetDataUpdate?.['storeParamsCallApi'] && typeof objectGetDataUpdate?.['storeParamsCallApi'] === 'object' && !(objectGetDataUpdate?.['storeParamsCallApi'] as any).instanceSort) {\n objectGetDataUpdate['storeParamsCallApi'] = { ...objectGetDataUpdate['storeParamsCallApi'], instanceSort: {} };\n }\n if (sortOrderBy) {\n this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, sortOrderBy);\n }\n if (sortOrderType) {\n this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, sortOrderType);\n }\n if (other && other.length) {\n other.forEach(config => this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, config));\n }\n if (detailById) {\n detailById.fieldGetValue = detailById.fieldGetValue || detailById.fieldGetValue.trim() || 'key';\n this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, detailById);\n }\n\n if (isEmpty(paging)) {\n return this.updateArgumentsDefault(argumentsValue, false, pagingStore || this.fakeResponsePagingApi()['paging'], keySearch, searchOnline);\n }\n const { page, before, after } = paging;\n\n if (page && objectGetDataUpdate) {\n page.preprocessor = (value: number): number => {\n\n return ++value;\n };\n const valuePage = +this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, page);\n const valueLastPage = +get(objectGetDataUpdate as any, 'paging.total_pages');\n\n if (valuePage && Number(valuePage).valueOf() > Number(valueLastPage).valueOf() || valueLastPage === 0) {\n return true;\n }\n }\n if (before && objectGetDataUpdate && !this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, before) && !get(objectGetDataUpdate, 'paging.fake')) {\n set(objectGetDataUpdate, 'paging.fake', false);\n\n return true;\n }\n if (after && objectGetDataUpdate && !this.processUpdateArgumentsValeConfig(argumentsValue, objectGetDataUpdate, after) && !get(objectGetDataUpdate, 'paging.fake')) {\n set(objectGetDataUpdate, 'paging.fake', false);\n\n return true;\n }\n\n if (!argumentsValue || !argumentsValue.length) {\n return true;\n }\n\n return false;\n }\n\n private updateArgumentsDefault(argumentsValue: Array<any>, updateSearch: boolean, pagingStore: IPaging, keySearch: string, searchOnline: boolean) {\n if (!argumentsValue || !argumentsValue.length) {\n return true;\n }\n\n for (const index in argumentsValue) {\n let argumentValue = argumentsValue[index];\n\n if (!(argumentValue instanceof HttpParams)) {\n continue;\n }\n const pageValue = argumentValue.get('page');\n\n if (searchOnline && updateSearch) {\n argumentValue = argumentValue.set('search', keySearch);\n argumentsValue[index] = argumentValue;\n }\n if (argumentValue.has('before')) {\n argumentValue = argumentValue.set('before', pagingStore?.before);\n argumentsValue[index] = argumentValue;\n }\n if (argumentValue.has('after')) {\n argumentValue = argumentValue.set('after', pagingStore?.after);\n argumentsValue[index] = argumentValue;\n }\n if (Number(pageValue).valueOf() === -1) {\n return true;\n }\n if (!pagingStore || pageValue === undefined) {\n break;\n }\n\n const { page, total_pages, } = pagingStore;\n const nextPage = (page || 0) + 1;\n\n if (nextPage && Number(nextPage).valueOf() > Number(total_pages).valueOf()) {\n return true;\n }\n argumentsValue[index] = argumentValue.set('page', nextPage);\n break;\n\n }\n\n return false;\n }\n\n private processUpdateArgumentsValeConfig(argumentsValue: Array<any>, objectGetDataUpdate: any, config: IGuideAutoUpdateArgumentsValueConfig) {\n if (!config || !objectGetDataUpdate) {\n return undefined;\n }\n if (config.log?.logInputs) {\n console.log('config', config);\n console.log('objectGetDataUpdate', objectGetDataUpdate);\n console.log('argumentsValue', argumentsValue);\n console.log('--------------------------------');\n }\n const { fieldUpdate, fieldGetValue, preprocessor } = config;\n\n if (!fieldUpdate || !fieldGetValue) {\n return undefined;\n }\n\n let value = get(objectGetDataUpdate, fieldGetValue);\n if (config.log?.logGetValue) {\n console.log(`value of objectGetDataUpdate[${fieldGetValue}]: `, value);\n }\n\n if (preprocessor) {\n value = preprocessor(value);\n }\n if (fieldUpdate) {\n let resultOfFieldUpdate = get(argumentsValue, fieldUpdate as any);\n\n if (resultOfFieldUpdate instanceof HttpParams) {\n resultOfFieldUpdate = resultOfFieldUpdate.set((config.subFieldUpdate || 'search'), value);\n set(argumentsValue, fieldUpdate as any, resultOfFieldUpdate);\n\n return value;\n }\n if (resultOfFieldUpdate instanceof Array) {\n resultOfFieldUpdate.push(value);\n\n return value;\n }\n if (resultOfFieldUpdate instanceof Object) {\n set(resultOfFieldUpdate, config.subFieldUpdate || 'search', value);\n\n return value;\n }\n set(argumentsValue, fieldUpdate as any, value);\n\n return value;\n }\n\n return value;\n }\n\n public fakeResponsePagingApi(): { paging: IPaging } {\n return {\n paging: {\n page: 0,\n total_pages: 1,\n before: '',\n after: '',\n fake: true\n }\n };\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { HttpParams } from '@angular/common/http';\nimport { IHttpResponse } from '@libs-ui/interfaces-types';\nimport { UtilsHttpParamsRequest, get, isNil, set, isEqual } from '@libs-ui/utils';\nimport { Observable, delay, lastValueFrom, of, timer } from 'rxjs';\n\n/**\n * Trả về các phương thức để xử lý danh sách dữ liệu mock\n * @param data - Mảng dữ liệu mặc định để mock\n * @param functionGetData - Hàm tùy chọn để lấy dữ liệu động thay vì sử dụng data mặc định\n * @returns Đối tượng chứa các phương thức:\n * - list: Trả về Promise với toàn bộ dữ liệu (có delay 250ms)\n * - listObservable: Trả về Observable với toàn bộ dữ liệu (có delay 250ms)\n * - listPaging: Trả về Promise với dữ liệu đã phân trang dựa trên params (có delay 250ms)\n *\n * @example\n * ```typescript\n * const mockData = [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }];\n * const listService = returnListObject(mockData);\n *\n * // Lấy toàn bộ dữ liệu\n * const allData = await listService.list();\n *\n * // Lấy dữ liệu phân trang\n * const params = new UtilsHttpParamsRequest();\n * params.set('page', '1');\n * params.set('per_page', '10');\n * const pagedData = await listService.listPaging(params);\n * ```\n */\n\nexport const returnListObject = (data?: Array<any>, functionGetData?: () => Array<any>) => {\n return {\n list: async <TypeResponse>(): Promise<IHttpResponse<TypeResponse>> => {\n if (functionGetData) {\n data = functionGetData();\n }\n await lastValueFrom(timer(250));\n return {\n code: 200,\n data: (data as any) || [],\n paging: {},\n };\n },\n listObservable: <TypeResponse>(): Observable<IHttpResponse<TypeResponse>> => {\n if (functionGetData) {\n data = functionGetData();\n }\n\n return of({\n code: 200,\n data: (data as any) || [],\n paging: {},\n }).pipe(delay(250));\n },\n listPaging: async <TypeResponse>(params: UtilsHttpParamsRequest): Promise<IHttpResponse<TypeResponse>> => {\n if (functionGetData) {\n data = functionGetData();\n }\n const page = parseInt(params.get('page') || '1');\n const per_page = parseInt(params.get('per_page') || '30');\n const result = pagingToList(data as Array<any>, page, per_page);\n\n await lastValueFrom(timer(250));\n\n return result as IHttpResponse<TypeResponse>;\n },\n };\n};\n\n/**\n * Tạo một đối tượng mock detail với các phương thức để lấy bản ghi riêng lẻ theo khóa.\n * Hỗ trợ cả mảng dữ liệu tĩnh và các hàm dữ liệu động.\n *\n * @template TypeResponse - Kiểu dữ liệu phản hồi mong đợi\n * @template TypeParams - Kiểu tham số HTTP (mặc định là any)\n *\n * @param httpParams - Tham số HTTP chứa:\n * - keys: Khóa (hoặc các khóa) cần tìm kiếm\n * - fieldKey: Tên trường để so khớp (mặc định là 'id')\n * - dataResponseOject: Cờ boolean để định dạng đối tượng phản hồi\n * @param data - Mảng dữ liệu tĩnh tùy chọn để tìm kiếm\n * @param functionGetData - Hàm tùy chọn trả về dữ liệu (có thể là Promise hoặc Observable)\n * @param ignoreSplit - Nếu true, coi keys như một giá trị đơn thay vì tách chuỗi\n * @param splitOperator - Toán tử tùy chỉnh để tách keys (mặc định là dấu phẩy)\n *\n * @returns Đối tượng với các phương thức:\n * - detailByData: Tìm kiếm thông qua mảng dữ liệu tĩnh được cung cấp\n * - detailByFunction: Gọi functionGetData để lấy dữ liệu mới, sau đó tìm kiếm\n *\n * @example\n * ```typescript\n * const params = new UtilsHttpParamsRequest({fromObject:{keys:'1',fieldKey:'id'}});\n * const mockDetail = returnDetailObject<User>(params, userData);\n * const user = await mockDetail.detailByData();\n * ```\n */\n\nexport const returnDetailObject = <TypeResponse, TypeParams = any>(\n httpParams: UtilsHttpParamsRequest<TypeParams> | HttpParams,\n data?: Array<any>,\n functionGetData?: () => Promise<IHttpResponse<TypeResponse>> | Observable<IHttpResponse<TypeResponse>>,\n ignoreSplit?: boolean,\n splitOperator?: string\n) => {\n const keysPrams: any = httpParams.get('keys');\n const fieldKey: string = httpParams.get('fieldKey') || 'id';\n const dataResponseOject: any = httpParams.get('dataResponseOject');\n\n return {\n detailByData: async (keys?: any): Promise<IHttpResponse<TypeResponse>> => {\n return filterData<TypeResponse>(fieldKey, data, keys ?? keysPrams, dataResponseOject, ignoreSplit, splitOperator);\n },\n\n detailByFunction: async (keys?: any): Promise<IHttpResponse<TypeResponse>> => {\n if (!functionGetData) {\n return await filterData<TypeResponse>(fieldKey, undefined, undefined, dataResponseOject, ignoreSplit, splitOperator);\n }\n\n let dataResult: any = functionGetData();\n\n try {\n if (dataResult['subscribe']) {\n dataResult = await lastValueFrom(dataResult);\n }\n if (dataResult['then']) {\n dataResult = await dataResult;\n }\n } catch (_) {\n dataResult = { data: [] };\n }\n\n data = dataResult.data;\n\n return await filterData<TypeResponse>(fieldKey, data, keys || keysPrams, dataResponseOject, ignoreSplit, splitOperator);\n },\n };\n};\n\nconst filterData = <TypeResponse>(fieldKey: string, data?: Array<any>, keys?: any, dataResponseOject?: boolean, ignoreSplit?: boolean, splitOperator?: string): IHttpResponse<TypeResponse> => {\n if (!data || typeof data !== 'object' || isNil(keys) || keys === '') {\n return {\n code: 200,\n data: undefined,\n paging: {},\n };\n }\n\n data = data || [];\n\n if (!(data instanceof Array)) {\n data = [data];\n }\n const result: any = [];\n\n if (!ignoreSplit && typeof keys === 'string') {\n keys = keys.split(splitOperator || ',');\n }\n\n if (typeof keys === 'number' || typeof keys === 'boolean' || (typeof keys === 'string' && ignoreSplit)) {\n keys = [keys];\n }\n\n keys.forEach((key: string) => {\n const resultFilter = data?.filter((elData: { [key: string]: any }) => isEqual(get(elData, fieldKey), key, { ignoreExactlyDataType: true }));\n\n if (resultFilter && resultFilter.length) {\n result.push(...resultFilter);\n }\n });\n\n return {\n code: 200,\n data: result.length ? (dataResponseOject ? result[0] : result) : undefined,\n paging: {},\n };\n};\n\nconst per_page = 20;\nconst total_items = per_page * 150 + 15;\n\nexport const getConfigListDataDemo = (httpParamsDetail: UtilsHttpParamsRequest<any> = new UtilsHttpParamsRequest(), objectData?: Record<string, string>, functionBuildObject?: (numIncrement: string) => Record<string, string>) => {\n if (!objectData) {\n objectData = {\n id: '',\n name: 'item positon index ',\n };\n }\n\n const data = [...Array(total_items).keys()].map((_, index) => {\n if (functionBuildObject) {\n return functionBuildObject(`${+index + 1}`);\n }\n const obj: Record<string, string> = {};\n Object.keys(objectData).forEach((key) => {\n set(obj, key, `${objectData[key]}${+index + 1}`);\n });\n return obj;\n });\n\n const listService = returnListObject(data);\n const detailService = returnDetailObject(httpParamsDetail, data, undefined, false, ';');\n return {\n list: listService.listPaging,\n detailByData: detailService.detailByData,\n };\n};\n\n/**\n * Hàm phân trang dữ liệu từ một mảng\n * @param data - Mảng dữ liệu cần phân trang\n * @param page - Số trang hiện tại (bắt đầu từ 1)\n * @param per_page - Số lượng item trên mỗi trang\n * @returns Đối tượng chứa dữ liệu đã phân trang và thông tin phân trang\n */\nexport const pagingToList = (data: Array<any>, page: number, per_page: number) => {\n if (!data || !Array.isArray(data)) {\n return {\n code: 200,\n data: [],\n paging: {\n page: page,\n per_page: per_page,\n total_items: 0,\n total_pages: 0,\n },\n };\n }\n const start = (page - 1) * per_page;\n const end = start + per_page;\n const total_pages = Math.ceil(data.length / per_page);\n const dataByPage = data.slice(start, end);\n return {\n code: 200,\n data: dataByPage,\n paging: {\n page: page > total_pages ? total_pages : page,\n per_page: per_page,\n total_items: data.length,\n total_pages: total_pages,\n },\n };\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { IGuideAutoUpdateArgumentsValue } from \"./guild-auto-update-arguments-value.interface\";\n\nexport interface IHttpRequestConfig {\n serviceOther?: any; // là 1 object không được inject trong httpRequest; được sử dụng để lấy data từ 1 đối tượng không phải là service inject\n serviceName?: string; // tên service được inject trong http request service;\n functionName: string; // tên hàm muốn gọi trong service\n argumentsValue: Array<any>;// chứa dữ liệu của params truyền vào, mảng có kểu dữ liệu không cần giống nhau vd: hàm function(search:string,age:number,page:Object)={...} thì serviceSpecificParams = ['param',16,{page:1,page:per_page:25}]\n cacheType?: 'service' | 'local-store';\n keyCache?: string; // sử dụng nếu sử dụng cache. khi tạo bộ config sử dụng đối tượng uuid để lấy một id set vào biến này. và biến này sẽ ko thay đổi trong quá trình sử dụng\n timeCache?: number; // đơn vị phút\n clearCache?: boolean;\n guideAutoUpdateArgumentsValue?: IGuideAutoUpdateArgumentsValue; // khai báo không sử dụng cho HttpRequestService. Dùng cho cá component muốn lấy thông tin update arguments để load more khi scroll bottom. Ví dụ như MoLibShareComponentsListViewTemplatesComponentAbstract\n convertResponseData?: (response: any) => any;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -2,12 +2,15 @@ import { IPaging } from '@libs-ui/interfaces-types';
|
|
|
2
2
|
import { IGuideAutoUpdateArgumentsValue, IHttpRequestConfig } from './interfaces/index';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class LibsUiHttpRequestService {
|
|
5
|
+
/** Chứa dữ liệu cache memory */
|
|
5
6
|
private serviceStore;
|
|
6
|
-
|
|
7
|
-
private
|
|
7
|
+
/** Chứa các service common base api */
|
|
8
|
+
private servicesCommon;
|
|
9
|
+
/** Chứa các service call api đến backend */
|
|
10
|
+
private servicesApiModules;
|
|
8
11
|
constructor();
|
|
9
12
|
set ServicesCommon(serviceCommon: Record<string, any>);
|
|
10
|
-
set
|
|
13
|
+
set ServicesApiModules(servicesApiModules: Record<string, any>);
|
|
11
14
|
private getServiceByName;
|
|
12
15
|
refreshAllService(): void;
|
|
13
16
|
callApi<T = any>(httpRequestConfig: IHttpRequestConfig): Promise<T>;
|
package/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/services-http-request",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.306.2",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@angular/common": "
|
|
6
|
-
"@angular/core": "
|
|
5
|
+
"@angular/common": ">=18.0.0",
|
|
6
|
+
"@angular/core": ">=18.0.0",
|
|
7
|
+
"@libs-ui/interfaces-types": "0.2.306.2",
|
|
8
|
+
"@libs-ui/utils": "0.2.306.2",
|
|
9
|
+
"rxjs": "~7.8.0"
|
|
7
10
|
},
|
|
8
11
|
"sideEffects": false,
|
|
9
12
|
"module": "fesm2022/libs-ui-services-http-request.mjs",
|