http-request-manager 18.0.13 → 18.2.0
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/esm2022/lib/http-request-manager.module.mjs +47 -7
- package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +10 -6
- package/esm2022/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.mjs +184 -0
- package/esm2022/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.mjs +9 -0
- package/esm2022/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.mjs +12 -0
- package/esm2022/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.mjs +14 -0
- package/esm2022/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.mjs +336 -0
- package/esm2022/lib/services/local-storage-manager-service/index.mjs +3 -2
- package/esm2022/lib/services/local-storage-manager-service/local-storage-signals-manager.service.mjs +277 -0
- package/esm2022/lib/services/local-storage-manager-service/models/setting-options.model.mjs +6 -2
- package/esm2022/lib/services/request-manager-services/http-manager-signals.service.mjs +199 -0
- package/esm2022/lib/services/request-manager-services/index.mjs +2 -1
- package/esm2022/lib/services/request-manager-services/request-signals.service.mjs +170 -0
- package/esm2022/lib/services/request-manager-services/rxjs-operators/request-polling.mjs +26 -7
- package/esm2022/lib/services/utils/object-merger.service.mjs +26 -6
- package/fesm2022/http-request-manager.mjs +2053 -842
- package/fesm2022/http-request-manager.mjs.map +1 -1
- package/http-request-manager-18.2.0.tgz +0 -0
- package/lib/http-request-manager.module.d.ts +24 -22
- package/lib/http-request-services-demo/http-request-services-demo.component.d.ts +8 -0
- package/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.d.ts +55 -0
- package/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.d.ts +8 -0
- package/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.d.ts +14 -0
- package/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.d.ts +14 -0
- package/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.d.ts +106 -0
- package/lib/services/local-storage-manager-service/index.d.ts +2 -1
- package/lib/services/local-storage-manager-service/local-storage-signals-manager.service.d.ts +64 -0
- package/lib/services/request-manager-services/http-manager-signals.service.d.ts +38 -0
- package/lib/services/request-manager-services/index.d.ts +1 -0
- package/lib/services/request-manager-services/request-signals.service.d.ts +26 -0
- package/lib/services/request-manager-services/rxjs-operators/request-polling.d.ts +2 -7
- package/lib/services/utils/object-merger.service.d.ts +2 -0
- package/package.json +1 -1
- package/http-request-manager-18.0.13.tgz +0 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { HttpClient, HttpEventType, HttpHeaderResponse } from '@angular/common/http';
|
|
2
|
+
import { Injectable, inject, signal, computed } from '@angular/core';
|
|
3
|
+
import { throwError } from 'rxjs';
|
|
4
|
+
import { catchError, finalize, map } from 'rxjs/operators';
|
|
5
|
+
import { PathQueryService, HeadersService } from '../utils';
|
|
6
|
+
import { requestStreaming } from './rxjs-operators/request-streaming';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class RequestSignalsService {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.http = inject(HttpClient);
|
|
11
|
+
this.pathQueryService = inject(PathQueryService);
|
|
12
|
+
this.headersService = inject(HeadersService);
|
|
13
|
+
this.isPending = signal(false);
|
|
14
|
+
this.progress = signal(0);
|
|
15
|
+
this.isIdle = computed(() => !this.isPending());
|
|
16
|
+
}
|
|
17
|
+
getRecordRequest(options) {
|
|
18
|
+
const urlPath = this.buildUrlPath(options);
|
|
19
|
+
const headers = this.buildCombinedHeaders(options);
|
|
20
|
+
this.isPending.set(true);
|
|
21
|
+
return (options.stream)
|
|
22
|
+
? this.http.get(urlPath, headers).pipe(requestStreaming(), this.handleFinalize())
|
|
23
|
+
: this.http.get(urlPath, headers).pipe(this.request(options), this.handleFinalize());
|
|
24
|
+
}
|
|
25
|
+
createRecordRequest(options, data) {
|
|
26
|
+
const urlPath = this.buildUrlPath(options);
|
|
27
|
+
const headers = this.buildCombinedHeaders(options);
|
|
28
|
+
this.isPending.set(true);
|
|
29
|
+
return (options.stream)
|
|
30
|
+
? this.http.post(urlPath, data, headers).pipe(requestStreaming(), this.handleFinalize())
|
|
31
|
+
: this.http.post(urlPath, data, headers).pipe(this.request(options), this.handleFinalize());
|
|
32
|
+
}
|
|
33
|
+
updateRecordRequest(options, data) {
|
|
34
|
+
const urlPath = this.buildUrlPath(options);
|
|
35
|
+
const headers = this.buildHeaders(options);
|
|
36
|
+
this.isPending.set(true);
|
|
37
|
+
return this.http.put(urlPath, data, headers).pipe(this.request(options), this.handleFinalize());
|
|
38
|
+
}
|
|
39
|
+
deleteRecordRequest(options) {
|
|
40
|
+
const urlPath = this.buildUrlPath(options);
|
|
41
|
+
const headers = this.buildHeaders(options);
|
|
42
|
+
this.isPending.set(true);
|
|
43
|
+
return this.http.delete(urlPath, headers).pipe(this.request(options), this.handleFinalize());
|
|
44
|
+
}
|
|
45
|
+
buildUrlPath(options) {
|
|
46
|
+
return this.pathQueryService.buildAPIPath(options.server, options.path);
|
|
47
|
+
}
|
|
48
|
+
buildHeaders(options) {
|
|
49
|
+
return this.headersService.generateHeaders(options.headers);
|
|
50
|
+
}
|
|
51
|
+
buildCombinedHeaders(options) {
|
|
52
|
+
const headers = this.headersService.generateHeaders(options.headers);
|
|
53
|
+
return this.combineHeaders(headers, options.stream || false);
|
|
54
|
+
}
|
|
55
|
+
request(options) {
|
|
56
|
+
return (source$) => {
|
|
57
|
+
return source$.pipe(map(data => {
|
|
58
|
+
if (options?.adapter) {
|
|
59
|
+
return Array.isArray(data)
|
|
60
|
+
? data.map((item) => options.adapter(item))
|
|
61
|
+
: options.adapter(data);
|
|
62
|
+
}
|
|
63
|
+
return data;
|
|
64
|
+
}));
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
downloadFileRequest(options) {
|
|
68
|
+
this.isPending.set(true);
|
|
69
|
+
const urlPath = this.buildUrlPath(options);
|
|
70
|
+
return this.http.get(urlPath, { responseType: 'blob', observe: 'events', reportProgress: true })
|
|
71
|
+
.pipe(map((event) => {
|
|
72
|
+
this.isPending.set(true);
|
|
73
|
+
if (event instanceof HttpHeaderResponse) {
|
|
74
|
+
if (event.status !== 200) {
|
|
75
|
+
this.isPending.set(false);
|
|
76
|
+
throw new Error('Download failed');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
switch (event.type) {
|
|
80
|
+
case HttpEventType.DownloadProgress:
|
|
81
|
+
const status = (event.total) ? Math.round(event.loaded / (event.total || 1) * 100) : 100;
|
|
82
|
+
this.progress.set(status);
|
|
83
|
+
return status;
|
|
84
|
+
case HttpEventType.Response:
|
|
85
|
+
try {
|
|
86
|
+
const fileNamePath = (options?.saveAs) ? options.saveAs : (options.path) ? options.path[options.path.length - 1] : [];
|
|
87
|
+
const header_content = event.headers.get('Content-Disposition') || '';
|
|
88
|
+
const file = (header_content) ? header_content.split('=')[1].substring(0, header_content.split('=')[1].length) : '';
|
|
89
|
+
const fileName = (fileNamePath !== '') ? fileNamePath : file;
|
|
90
|
+
if (fileName === '') {
|
|
91
|
+
this.isPending.set(false);
|
|
92
|
+
throw new Error('Save File: (file name and extension) not found in Headers or Path');
|
|
93
|
+
}
|
|
94
|
+
this.downloadFile(fileName, event.body);
|
|
95
|
+
this.isPending.set(false);
|
|
96
|
+
return 100;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
throw new Error('Download failed');
|
|
100
|
+
}
|
|
101
|
+
default:
|
|
102
|
+
this.isPending.set(false);
|
|
103
|
+
return 0;
|
|
104
|
+
}
|
|
105
|
+
}), catchError(err => {
|
|
106
|
+
return throwError(() => err);
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
handleFinalize() {
|
|
110
|
+
return finalize(() => this.isPending.set(false));
|
|
111
|
+
}
|
|
112
|
+
downloadFile(file, fileData) {
|
|
113
|
+
const navigatorAny = window.navigator;
|
|
114
|
+
const extension = file.split('.')[1]?.toLowerCase();
|
|
115
|
+
const newBlob = new Blob([fileData], { type: this.createFileType(extension) });
|
|
116
|
+
if (navigatorAny.msSaveOrOpenBlob) {
|
|
117
|
+
navigatorAny.msSaveOrOpenBlob(newBlob, file);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
const link = document.createElement('a');
|
|
121
|
+
const url = window.URL.createObjectURL(newBlob);
|
|
122
|
+
link.href = url;
|
|
123
|
+
link.download = file;
|
|
124
|
+
link.click();
|
|
125
|
+
window.URL.revokeObjectURL(url);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
createFileType(ext) {
|
|
129
|
+
let fileType = "";
|
|
130
|
+
if (ext === 'pdf' || ext === 'csv')
|
|
131
|
+
fileType = `application/${ext}`;
|
|
132
|
+
else if (ext === 'jpeg' || ext === 'jpg' || ext === 'png')
|
|
133
|
+
fileType = `image/${ext}`;
|
|
134
|
+
else if (ext === 'txt')
|
|
135
|
+
fileType = 'text/plain';
|
|
136
|
+
else if (ext === 'ppt' || ext === 'pot' || ext === 'pps' || ext === 'ppa')
|
|
137
|
+
fileType = 'application/vnd.ms-powerpoint';
|
|
138
|
+
else if (ext === 'pptx')
|
|
139
|
+
fileType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
|
|
140
|
+
else if (ext === 'doc' || ext === 'dot')
|
|
141
|
+
fileType = 'application/msword';
|
|
142
|
+
else if (ext === 'docx')
|
|
143
|
+
fileType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
|
|
144
|
+
else if (ext === 'xls' || ext === 'xlt' || ext === 'xla')
|
|
145
|
+
fileType = 'application/vnd.ms-excel';
|
|
146
|
+
else if (ext === 'xlsx')
|
|
147
|
+
fileType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
|
|
148
|
+
return fileType;
|
|
149
|
+
}
|
|
150
|
+
combineHeaders(headers, isStreaming) {
|
|
151
|
+
return (isStreaming)
|
|
152
|
+
? {
|
|
153
|
+
...headers,
|
|
154
|
+
observe: 'events',
|
|
155
|
+
responseType: 'text',
|
|
156
|
+
reportProgress: true,
|
|
157
|
+
Accept: 'text/event-stream'
|
|
158
|
+
}
|
|
159
|
+
: headers;
|
|
160
|
+
}
|
|
161
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RequestSignalsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
162
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RequestSignalsService, providedIn: 'root' }); }
|
|
163
|
+
}
|
|
164
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RequestSignalsService, decorators: [{
|
|
165
|
+
type: Injectable,
|
|
166
|
+
args: [{
|
|
167
|
+
providedIn: 'root'
|
|
168
|
+
}]
|
|
169
|
+
}] });
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1zaWduYWxzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL3NlcnZpY2VzL3JlcXVlc3QtbWFuYWdlci1zZXJ2aWNlcy9yZXF1ZXN0LXNpZ25hbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDOztBQUt0RSxNQUFNLE9BQU8scUJBQXFCO0lBSGxDO1FBS1UsU0FBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQixxQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1QyxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVoRCxjQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLGFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckIsV0FBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0tBZ001QztJQTlMQyxnQkFBZ0IsQ0FBSSxPQUFt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QkFDakIsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLGNBQWMsRUFBRSxJQUFJO2dCQUNwQixNQUFNLEVBQUUsbUJBQW1CO2FBQzVCO1lBQ0gsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUNkLENBQUM7K0dBeE1VLHFCQUFxQjttSEFBckIscUJBQXFCLGNBRnBCLE1BQU07OzRGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXZlbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBIZWFkZXJSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCwgc2lnbmFsLCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmluYWxpemUsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQXBpUmVxdWVzdCB9IGZyb20gJy4uL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1zZXJ2aWNlL21vZGVscy9hcGktcmVxdWVzdC5tb2RlbCc7XG5pbXBvcnQgeyBQYXRoUXVlcnlTZXJ2aWNlLCBIZWFkZXJzU2VydmljZSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IHJlcXVlc3RTdHJlYW1pbmcgfSBmcm9tICcuL3J4anMtb3BlcmF0b3JzL3JlcXVlc3Qtc3RyZWFtaW5nJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUmVxdWVzdFNpZ25hbHNTZXJ2aWNlIHtcblxuICBwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG4gIHByaXZhdGUgcGF0aFF1ZXJ5U2VydmljZSA9IGluamVjdChQYXRoUXVlcnlTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBoZWFkZXJzU2VydmljZSA9IGluamVjdChIZWFkZXJzU2VydmljZSk7XG5cbiAgaXNQZW5kaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJvZ3Jlc3MgPSBzaWduYWwoMCk7XG5cbiAgaXNJZGxlID0gY29tcHV0ZWQoKCkgPT4gIXRoaXMuaXNQZW5kaW5nKCkpO1xuXG4gIGdldFJlY29yZFJlcXVlc3Q8VD4ob3B0aW9uczogQXBpUmVxdWVzdCk6IE9ic2VydmFibGU8VD4ge1xuICAgIGNvbnN0IHVybFBhdGggPSB0aGlzLmJ1aWxkVXJsUGF0aChvcHRpb25zKTtcbiAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5idWlsZENvbWJpbmVkSGVhZGVycyhvcHRpb25zKTtcblxuICAgIHRoaXMuaXNQZW5kaW5nLnNldCh0cnVlKTtcblxuICAgIHJldHVybiAob3B0aW9ucy5zdHJlYW0pXG4gICAgICA/IHRoaXMuaHR0cC5nZXQ8YW55Pih1cmxQYXRoLCBoZWFkZXJzKS5waXBlKFxuICAgICAgICAgIHJlcXVlc3RTdHJlYW1pbmcoKSxcbiAgICAgICAgICB0aGlzLmhhbmRsZUZpbmFsaXplKClcbiAgICAgICAgKVxuICAgICAgOiB0aGlzLmh0dHAuZ2V0PFQ+KHVybFBhdGgsIGhlYWRlcnMpLnBpcGUoXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0KG9wdGlvbnMpLFxuICAgICAgICAgIHRoaXMuaGFuZGxlRmluYWxpemUoKVxuICAgICAgICApO1xuICB9XG5cbiAgY3JlYXRlUmVjb3JkUmVxdWVzdDxUPihvcHRpb25zOiBBcGlSZXF1ZXN0LCBkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBjb25zdCB1cmxQYXRoID0gdGhpcy5idWlsZFVybFBhdGgob3B0aW9ucyk7XG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVpbGRDb21iaW5lZEhlYWRlcnMob3B0aW9ucyk7XG5cbiAgICB0aGlzLmlzUGVuZGluZy5zZXQodHJ1ZSk7XG5cbiAgICByZXR1cm4gKG9wdGlvbnMuc3RyZWFtKVxuICAgICAgPyB0aGlzLmh0dHAucG9zdDxhbnk+KHVybFBhdGgsIGRhdGEsIGhlYWRlcnMpLnBpcGUoXG4gICAgICAgICAgcmVxdWVzdFN0cmVhbWluZygpLFxuICAgICAgICAgIHRoaXMuaGFuZGxlRmluYWxpemUoKVxuICAgICAgICApXG4gICAgICA6IHRoaXMuaHR0cC5wb3N0PFQ+KHVybFBhdGgsIGRhdGEsIGhlYWRlcnMpLnBpcGUoXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0KG9wdGlvbnMpLFxuICAgICAgICAgIHRoaXMuaGFuZGxlRmluYWxpemUoKVxuICAgICAgICApO1xuICB9XG5cbiAgdXBkYXRlUmVjb3JkUmVxdWVzdDxUPihvcHRpb25zOiBBcGlSZXF1ZXN0LCBkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBjb25zdCB1cmxQYXRoID0gdGhpcy5idWlsZFVybFBhdGgob3B0aW9ucyk7XG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVpbGRIZWFkZXJzKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5pc1BlbmRpbmcuc2V0KHRydWUpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8YW55Pih1cmxQYXRoLCBkYXRhLCBoZWFkZXJzKS5waXBlKFxuICAgICAgdGhpcy5yZXF1ZXN0KG9wdGlvbnMpLFxuICAgICAgdGhpcy5oYW5kbGVGaW5hbGl6ZSgpXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZVJlY29yZFJlcXVlc3Q8VD4ob3B0aW9uczogQXBpUmVxdWVzdCk6IE9ic2VydmFibGU8VD4ge1xuICAgIGNvbnN0IHVybFBhdGggPSB0aGlzLmJ1aWxkVXJsUGF0aChvcHRpb25zKTtcbiAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5idWlsZEhlYWRlcnMob3B0aW9ucyk7XG5cbiAgICB0aGlzLmlzUGVuZGluZy5zZXQodHJ1ZSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxhbnk+KHVybFBhdGgsIGhlYWRlcnMpLnBpcGUoXG4gICAgICB0aGlzLnJlcXVlc3Qob3B0aW9ucyksXG4gICAgICB0aGlzLmhhbmRsZUZpbmFsaXplKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFVybFBhdGgob3B0aW9uczogQXBpUmVxdWVzdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGF0aFF1ZXJ5U2VydmljZS5idWlsZEFQSVBhdGgob3B0aW9ucy5zZXJ2ZXIsIG9wdGlvbnMucGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSGVhZGVycyhvcHRpb25zOiBBcGlSZXF1ZXN0KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5oZWFkZXJzU2VydmljZS5nZW5lcmF0ZUhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDb21iaW5lZEhlYWRlcnMob3B0aW9uczogQXBpUmVxdWVzdCk6IGFueSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMuaGVhZGVyc1NlcnZpY2UuZ2VuZXJhdGVIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG4gICAgcmV0dXJuIHRoaXMuY29tYmluZUhlYWRlcnMoaGVhZGVycywgb3B0aW9ucy5zdHJlYW0gfHwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1ZXN0PFQ+KG9wdGlvbnM6IEFwaVJlcXVlc3QpOiAoc291cmNlOiBPYnNlcnZhYmxlPGFueT4pID0+IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiAoc291cmNlJDogT2JzZXJ2YWJsZTxhbnk+KTogT2JzZXJ2YWJsZTxUPiA9PiB7XG4gICAgICByZXR1cm4gc291cmNlJC5waXBlKFxuICAgICAgICBtYXAoZGF0YSA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LmFkYXB0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRhdGEpXG4gICAgICAgICAgICAgID8gZGF0YS5tYXAoKGl0ZW06IGFueSkgPT4gb3B0aW9ucy5hZGFwdGVyKGl0ZW0pKVxuICAgICAgICAgICAgICA6IG9wdGlvbnMuYWRhcHRlcihkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICBkb3dubG9hZEZpbGVSZXF1ZXN0KG9wdGlvbnM6IEFwaVJlcXVlc3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHRoaXMuaXNQZW5kaW5nLnNldCh0cnVlKTtcblxuICAgIGNvbnN0IHVybFBhdGggPSB0aGlzLmJ1aWxkVXJsUGF0aChvcHRpb25zKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybFBhdGgsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicsIG9ic2VydmU6ICdldmVudHMnLCByZXBvcnRQcm9ncmVzczogdHJ1ZSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoZXZlbnQ6IEh0dHBFdmVudDxhbnk+KSA9PiB7XG4gICAgICAgICAgdGhpcy5pc1BlbmRpbmcuc2V0KHRydWUpO1xuXG4gICAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgSHR0cEhlYWRlclJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICAgICAgdGhpcy5pc1BlbmRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEb3dubG9hZCBmYWlsZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgSHR0cEV2ZW50VHlwZS5Eb3dubG9hZFByb2dyZXNzOlxuICAgICAgICAgICAgICBjb25zdCBzdGF0dXMgPSAoZXZlbnQudG90YWwpID8gTWF0aC5yb3VuZChldmVudC5sb2FkZWQgLyAoZXZlbnQudG90YWwgfHwgMSkgKiAxMDApIDogMTAwO1xuICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzLnNldChzdGF0dXMpO1xuICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzO1xuXG4gICAgICAgICAgICBjYXNlIEh0dHBFdmVudFR5cGUuUmVzcG9uc2U6XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVQYXRoID0gKG9wdGlvbnM/LnNhdmVBcykgPyBvcHRpb25zLnNhdmVBcyA6IChvcHRpb25zLnBhdGgpID8gb3B0aW9ucy5wYXRoW29wdGlvbnMucGF0aC5sZW5ndGggLSAxXSA6IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcl9jb250ZW50ID0gZXZlbnQuaGVhZGVycy5nZXQoJ0NvbnRlbnQtRGlzcG9zaXRpb24nKSB8fCAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gKGhlYWRlcl9jb250ZW50KSA/IGhlYWRlcl9jb250ZW50LnNwbGl0KCc9JylbMV0uc3Vic3RyaW5nKDAsIGhlYWRlcl9jb250ZW50LnNwbGl0KCc9JylbMV0ubGVuZ3RoKSA6ICcnO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSAoZmlsZU5hbWVQYXRoICE9PSAnJykgPyBmaWxlTmFtZVBhdGggOiBmaWxlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgdGhpcy5pc1BlbmRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2F2ZSBGaWxlOiAoZmlsZSBuYW1lIGFuZCBleHRlbnNpb24pIG5vdCBmb3VuZCBpbiBIZWFkZXJzIG9yIFBhdGgnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRvd25sb2FkRmlsZShmaWxlTmFtZSwgZXZlbnQuYm9keSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1BlbmRpbmcuc2V0KGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiAxMDA7XG5cbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Rvd25sb2FkIGZhaWxlZCcpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRoaXMuaXNQZW5kaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRmluYWxpemUoKTogKHNvdXJjZTogT2JzZXJ2YWJsZTxhbnk+KSA9PiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiBmaW5hbGl6ZSgoKSA9PiB0aGlzLmlzUGVuZGluZy5zZXQoZmFsc2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgZG93bmxvYWRGaWxlKGZpbGU6IHN0cmluZywgZmlsZURhdGE6IGFueSkge1xuICAgIGNvbnN0IG5hdmlnYXRvckFueSA9IHdpbmRvdy5uYXZpZ2F0b3IgYXMgYW55O1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGZpbGUuc3BsaXQoJy4nKVsxXT8udG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBuZXdCbG9iID0gbmV3IEJsb2IoW2ZpbGVEYXRhXSwgeyB0eXBlOiB0aGlzLmNyZWF0ZUZpbGVUeXBlKGV4dGVuc2lvbikgfSk7XG5cbiAgICBpZiAobmF2aWdhdG9yQW55Lm1zU2F2ZU9yT3BlbkJsb2IpIHtcbiAgICAgIG5hdmlnYXRvckFueS5tc1NhdmVPck9wZW5CbG9iKG5ld0Jsb2IsIGZpbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobmV3QmxvYik7XG4gICAgICBsaW5rLmhyZWYgPSB1cmw7XG4gICAgICBsaW5rLmRvd25sb2FkID0gZmlsZTtcbiAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGaWxlVHlwZShleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVUeXBlID0gXCJcIjtcblxuICAgIGlmIChleHQgPT09ICdwZGYnIHx8IGV4dCA9PT0gJ2NzdicpIGZpbGVUeXBlID0gYGFwcGxpY2F0aW9uLyR7ZXh0fWA7XG4gICAgZWxzZSBpZiAoZXh0ID09PSAnanBlZycgfHwgZXh0ID09PSAnanBnJyB8fCBleHQgPT09ICdwbmcnKSBmaWxlVHlwZSA9IGBpbWFnZS8ke2V4dH1gO1xuICAgIGVsc2UgaWYgKGV4dCA9PT0gJ3R4dCcpIGZpbGVUeXBlID0gJ3RleHQvcGxhaW4nO1xuICAgIGVsc2UgaWYgKGV4dCA9PT0gJ3BwdCcgfHwgZXh0ID09PSAncG90JyB8fCBleHQgPT09ICdwcHMnIHx8IGV4dCA9PT0gJ3BwYScpIGZpbGVUeXBlID0gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JztcbiAgICBlbHNlIGlmIChleHQgPT09ICdwcHR4JykgZmlsZVR5cGUgPSAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbic7XG4gICAgZWxzZSBpZiAoZXh0ID09PSAnZG9jJyB8fCBleHQgPT09ICdkb3QnKSBmaWxlVHlwZSA9ICdhcHBsaWNhdGlvbi9tc3dvcmQnO1xuICAgIGVsc2UgaWYgKGV4dCA9PT0gJ2RvY3gnKSBmaWxlVHlwZSA9ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCc7XG4gICAgZWxzZSBpZiAoZXh0ID09PSAneGxzJyB8fCBleHQgPT09ICd4bHQnIHx8IGV4dCA9PT0gJ3hsYScpIGZpbGVUeXBlID0gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCc7XG4gICAgZWxzZSBpZiAoZXh0ID09PSAneGxzeCcpIGZpbGVUeXBlID0gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0JztcblxuICAgIHJldHVybiBmaWxlVHlwZTtcbiAgfVxuXG4gIHByaXZhdGUgY29tYmluZUhlYWRlcnMoaGVhZGVyczogYW55LCBpc1N0cmVhbWluZzogYm9vbGVhbikge1xuICAgIHJldHVybiAoaXNTdHJlYW1pbmcpXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICAgIG9ic2VydmU6ICdldmVudHMnLFxuICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiB0cnVlLFxuICAgICAgICAgIEFjY2VwdDogJ3RleHQvZXZlbnQtc3RyZWFtJ1xuICAgICAgICB9XG4gICAgICA6IGhlYWRlcnM7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,14 +1,33 @@
|
|
|
1
1
|
import { interval } from 'rxjs';
|
|
2
2
|
import { mergeMap, startWith, takeUntil, tap } from 'rxjs/operators';
|
|
3
|
-
/**
|
|
4
|
-
* @param pollInterval
|
|
5
|
-
* @param stopCondition$
|
|
6
|
-
* @param isPending$
|
|
7
|
-
*/
|
|
8
3
|
export function requestPolling(pollInterval, stopCondition$, isPending$) {
|
|
9
4
|
return (source) => {
|
|
10
5
|
return interval(pollInterval * 1000)
|
|
11
|
-
.pipe(startWith(0), tap(() =>
|
|
6
|
+
.pipe(startWith(0), tap(() => {
|
|
7
|
+
try {
|
|
8
|
+
if (isPending$ && typeof isPending$.next === 'function') {
|
|
9
|
+
isPending$.next(true);
|
|
10
|
+
}
|
|
11
|
+
else if (isPending$ && typeof isPending$.set === 'function') {
|
|
12
|
+
isPending$.set(true);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
// no-op if setting fails
|
|
17
|
+
}
|
|
18
|
+
}), mergeMap(() => source), tap(() => {
|
|
19
|
+
try {
|
|
20
|
+
if (isPending$ && typeof isPending$.next === 'function') {
|
|
21
|
+
isPending$.next(false);
|
|
22
|
+
}
|
|
23
|
+
else if (isPending$ && typeof isPending$.set === 'function') {
|
|
24
|
+
isPending$.set(false);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
// no-op if setting fails
|
|
29
|
+
}
|
|
30
|
+
}), takeUntil(stopCondition$));
|
|
12
31
|
};
|
|
13
32
|
}
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1wb2xsaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy9yZXF1ZXN0LW1hbmFnZXItc2VydmljZXMvcnhqcy1vcGVyYXRvcnMvcmVxdWVzdC1wb2xsaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJFLE1BQU0sVUFBVSxjQUFjLENBQUksWUFBb0IsRUFBRSxjQUErQixFQUFFLFVBQWU7SUFDdEcsT0FBTyxDQUFDLE1BQXFCLEVBQWlCLEVBQUU7UUFDOUMsT0FBTyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQzthQUNuQyxJQUFJLENBQ0gsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUNaLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxVQUFVLElBQUksT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUN4RCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN4QixDQUFDO3FCQUFNLElBQUksVUFBVSxJQUFJLE9BQU8sVUFBVSxDQUFDLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDOUQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkIsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLHlCQUF5QjtZQUMzQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUN0QixHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsSUFBSSxDQUFDO2dCQUNILElBQUksVUFBVSxJQUFJLE9BQU8sVUFBVSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDeEQsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDekIsQ0FBQztxQkFBTSxJQUFJLFVBQVUsSUFBSSxPQUFPLFVBQVUsQ0FBQyxHQUFHLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQzlELFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hCLENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCx5QkFBeUI7WUFDM0IsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FDMUIsQ0FBQztJQUNKLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBpbnRlcnZhbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWVyZ2VNYXAsIHN0YXJ0V2l0aCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0UG9sbGluZzxUPihwb2xsSW50ZXJ2YWw6IG51bWJlciwgc3RvcENvbmRpdGlvbiQ6IE9ic2VydmFibGU8YW55PiwgaXNQZW5kaW5nJDogYW55KSB7XG4gIHJldHVybiAoc291cmNlOiBPYnNlcnZhYmxlPFQ+KTogT2JzZXJ2YWJsZTxUPiA9PiB7XG4gICAgcmV0dXJuIGludGVydmFsKHBvbGxJbnRlcnZhbCAqIDEwMDApXG4gICAgLnBpcGUoXG4gICAgICBzdGFydFdpdGgoMCksXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChpc1BlbmRpbmckICYmIHR5cGVvZiBpc1BlbmRpbmckLm5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlzUGVuZGluZyQubmV4dCh0cnVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUGVuZGluZyQgJiYgdHlwZW9mIGlzUGVuZGluZyQuc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpc1BlbmRpbmckLnNldCh0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBuby1vcCBpZiBzZXR0aW5nIGZhaWxzXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgbWVyZ2VNYXAoKCkgPT4gc291cmNlKSxcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKGlzUGVuZGluZyQgJiYgdHlwZW9mIGlzUGVuZGluZyQubmV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaXNQZW5kaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUGVuZGluZyQgJiYgdHlwZW9mIGlzUGVuZGluZyQuc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpc1BlbmRpbmckLnNldChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gbm8tb3AgaWYgc2V0dGluZyBmYWlsc1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRha2VVbnRpbChzdG9wQ29uZGl0aW9uJCksXG4gICAgKTtcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { Inject, Injectable, Optional } from '@angular/core';
|
|
1
|
+
import { Inject, Injectable, Optional, inject } from '@angular/core';
|
|
2
2
|
import { ApiRequest } from '../request-manager-state-service/models';
|
|
3
3
|
import { SettingOptions } from '../local-storage-manager-service';
|
|
4
|
+
import { UtilsService } from '../utils/utils.service';
|
|
4
5
|
import { CONFIG_SETTINGS_TOKEN } from '../../models/config-token.model';
|
|
5
6
|
import { ConfigHTTPOptions, ConfigOptions, LocalStorageOptions } from '../request-manager-services';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
@@ -8,6 +9,7 @@ import * as i1 from "../request-manager-services";
|
|
|
8
9
|
export class ObjectMergerService {
|
|
9
10
|
constructor(configOptions) {
|
|
10
11
|
this.configOptions = configOptions;
|
|
12
|
+
this.utils = inject(UtilsService);
|
|
11
13
|
if (!this.configOptions)
|
|
12
14
|
this.configOptions = ConfigOptions.adapt();
|
|
13
15
|
}
|
|
@@ -27,10 +29,28 @@ export class ObjectMergerService {
|
|
|
27
29
|
const configForRoot = (this.configOptions?.LocalStorageOptions) ? this.configOptions.LocalStorageOptions : LocalStorageOptions.adapt();
|
|
28
30
|
const configForRootOptions = configForRoot.options || LocalStorageOptions.adapt().options;
|
|
29
31
|
const mergedOptions = SettingOptions.adapt(options);
|
|
30
|
-
|
|
31
|
-
mergedOptions.
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
// storage type
|
|
33
|
+
mergedOptions.storage = (options && (typeof options.storage !== 'undefined')) ? options.storage : (configForRootOptions?.storage ?? 0);
|
|
34
|
+
// expires: prefer explicit numeric expires; if not provided, compute from expiresIn string; otherwise use config default
|
|
35
|
+
// if an explicit, non-zero numeric expires is provided, use it
|
|
36
|
+
if (options && (typeof options.expires !== 'undefined') && options.expires !== null && Number(options.expires) > 0) {
|
|
37
|
+
mergedOptions.expires = Number(options.expires);
|
|
38
|
+
}
|
|
39
|
+
else if (options && options.expiresIn) {
|
|
40
|
+
// compute numeric epoch from expiresIn string using UtilsService if available
|
|
41
|
+
try {
|
|
42
|
+
mergedOptions.expires = this.utils ? this.utils.expires(options.expiresIn) : 0;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
mergedOptions.expires = 0;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
mergedOptions.expires = configForRootOptions?.expires ?? 0;
|
|
50
|
+
}
|
|
51
|
+
// keep expiresIn string if explicitly provided, otherwise use config default
|
|
52
|
+
mergedOptions.expiresIn = (options && (typeof options.expiresIn !== 'undefined')) ? options.expiresIn : (configForRootOptions?.expiresIn || '');
|
|
53
|
+
mergedOptions.encrypted = (options && (typeof options.encrypted !== 'undefined')) ? options.encrypted : (configForRootOptions?.encrypted || false);
|
|
34
54
|
return mergedOptions;
|
|
35
55
|
}
|
|
36
56
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ObjectMergerService, deps: [{ token: CONFIG_SETTINGS_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
@@ -47,4 +67,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
47
67
|
}, {
|
|
48
68
|
type: Optional
|
|
49
69
|
}] }] });
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LW1lcmdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9vYmplY3QtbWVyZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7OztBQUtwRyxNQUFNLE9BQU8sbUJBQW1CO0lBSTlCLFlBQStELGFBQTZCO1FBQTdCLGtCQUFhLEdBQWIsYUFBYSxDQUFnQjtRQUY1RixVQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBR3pCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtZQUFFLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ3RFLENBQUM7SUFFRixZQUFZLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUU7UUFFdkMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ2xJLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFL0MsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQTtRQUV4RyxhQUFhLENBQUMsSUFBSSxHQUFHLENBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxHQUFHLGFBQWEsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFFLENBQUE7UUFFNUUsYUFBYSxDQUFDLE9BQU8sR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsR0FBRyxhQUFhLEVBQUUsT0FBTyxJQUFJLEVBQUUsRUFBRSxDQUFBO1FBRXJGLGFBQWEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssS0FBSyxDQUFDLElBQUksT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLEtBQUssSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBRWpLLGFBQWEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxFQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUM7UUFFNUcsYUFBYSxDQUFDLFlBQVksR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMs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b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFLYyxNQUFNOzJCQUFDLHFCQUFxQjs7MEJBQUcsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBcGlSZXF1ZXN0IH0gZnJvbSAnLi4vcmVxdWVzdC1tYW5hZ2VyLXN0YXRlLXNlcnZpY2UvbW9kZWxzJztcbmltcG9ydCB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSAnLi4vbG9jYWwtc3RvcmFnZS1tYW5hZ2VyLXNlcnZpY2UnO1xuaW1wb3J0IHsgVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMuc2VydmljZSc7XG5cbmltcG9ydCB7IENPTkZJR19TRVRUSU5HU19UT0tFTiB9IGZyb20gJy4uLy4uL21vZGVscy9jb25maWctdG9rZW4ubW9kZWwnO1xuaW1wb3J0IHsgQ29uZmlnSFRUUE9wdGlvbnMsIENvbmZpZ09wdGlvbnMsIExvY2FsU3RvcmFnZU9wdGlvbnMgfSBmcm9tICcuLi9yZXF1ZXN0LW1hbmFnZXItc2VydmljZXMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBPYmplY3RNZXJnZXJTZXJ2aWNlIHtcblxuICB1dGlscyA9IGluamVjdChVdGlsc1NlcnZpY2UpO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoQ09ORklHX1NFVFRJTkdTX1RPS0VOKSBAT3B0aW9uYWwoKSBwcml2YXRlIGNvbmZpZ09wdGlvbnM/OiBDb25maWdPcHRpb25zKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlnT3B0aW9ucykgdGhpcy5jb25maWdPcHRpb25zID0gQ29uZmlnT3B0aW9ucy5hZGFwdCgpXG4gICB9XG5cbiAgbWVyZ2VPcHRpb25zKG9wdGlvbnMgPSBBcGlSZXF1ZXN0LmFkYXB0KCkpIHtcblxuICAgIGNvbnN0IGNvbmZpZ0ZvclJvb3QgPSAodGhpcy5jb25maWdPcHRpb25zPy5odHRwUmVxdWVzdE9wdGlvbnMpID8gdGhpcy5jb25maWdPcHRpb25zLmh0dHBSZXF1ZXN0T3B0aW9ucyA6IENvbmZpZ0hUVFBPcHRpb25zLmFkYXB0KClcbiAgICBjb25zdCBtZXJnZWRPcHRpb25zID0gQXBpUmVxdWVzdC5hZGFwdChvcHRpb25zKVxuXG4gICAgbWVyZ2VkT3B0aW9ucy5zZXJ2ZXIgPSAob3B0aW9ucyAmJiBvcHRpb25zLnNlcnZlciA9PT0gJycpID8gY29uZmlnRm9yUm9vdD8uc2VydmVyIHx8ICcnIDogb3B0aW9ucy5zZXJ2ZXJcblxuICAgIG1lcmdlZE9wdGlvbnMucGF0aCA9IFsgLi4ub3B0aW9ucy5wYXRoIHx8IFtdLCAuLi5jb25maWdGb3JSb290Py5wYXRoIHx8IFtdIF1cblxuICAgIG1lcmdlZE9wdGlvbnMuaGVhZGVycyA9IHsgLi4ub3B0aW9ucy5oZWFkZXJzIHx8IHt9LCAuLi5jb25maWdGb3JSb290Py5oZWFkZXJzIHx8IHt9IH1cblxuICAgIG1lcmdlZE9wdGlvbnMucmV0cnkgPSAob3B0aW9ucyAmJiAob3B0aW9ucz8ucmV0cnk/LnRpbWVzICE9PSAwIHx8IG9wdGlvbnM/LnJldHJ5Py5kZWxheSAhPT0gMykpID8gb3B0aW9ucy5yZXRyeSA6IGNvbmZpZ0ZvclJvb3Q/LnJldHJ5IHx8IHsgdGltZXM6IDAsIGRlbGF5OiAzIH07XG5cbiAgICBtZXJnZWRPcHRpb25zLnBvbGxpbmcgPSAob3B0aW9ucyAmJiBvcHRpb25zPy5wb2xsaW5nICE9PSAwKSA/IG9wdGlvbnMucG9sbGluZyA6IGNvbmZpZ0ZvclJvb3Q/LnBvbGxpbmcgfHwgMDtcblxuICAgIG1lcmdlZE9wdGlvbnMuZGlzcGxheUVycm9yID0gKG9wdGlvbnMgJiYgb3B0aW9ucz8uZGlzcGxheUVycm9yKSA/IG9wdGlvbnMuZGlzcGxheUVycm9yIDogY29uZmlnRm9yUm9vdD8uZGlzcGxheUVycm9yIHx8IGZhbHNlO1xuXG4gICAgbWVyZ2VkT3B0aW9ucy5zdHJlYW0gPSAob3B0aW9ucyAmJiBvcHRpb25zPy5zdHJlYW0pID8gb3B0aW9ucy5zdHJlYW0gOiBjb25maWdGb3JSb290Py5zdHJlYW0gfHwgZmFsc2U7XG5cbiAgICByZXR1cm4gbWVyZ2VkT3B0aW9ucztcblxuICB9XG5cbiAgbWVyZ2VTdG9yYWdlT3B0aW9ucyhvcHRpb25zID0gU2V0dGluZ09wdGlvbnMuYWRhcHQoKSkge1xuXG4gICAgY29uc3QgY29uZmlnRm9yUm9vdCA9ICh0aGlzLmNvbmZpZ09wdGlvbnM/LkxvY2FsU3RvcmFnZU9wdGlvbnMpID8gdGhpcy5jb25maWdPcHRpb25zLkxvY2FsU3RvcmFnZU9wdGlvbnMgOiBMb2NhbFN0b3JhZ2VPcHRpb25zLmFkYXB0KClcbiAgICBjb25zdCBjb25maWdGb3JSb290T3B0aW9ucyA9IGNvbmZpZ0ZvclJvb3Qub3B0aW9ucyB8fCBMb2NhbFN0b3JhZ2VPcHRpb25zLmFkYXB0KCkub3B0aW9uc1xuXG4gICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IFNldHRpbmdPcHRpb25zLmFkYXB0KG9wdGlvbnMpXG5cbiAgICAvLyBzdG9yYWdlIHR5cGVcbiAgICBtZXJnZWRPcHRpb25zLnN0b3JhZ2UgPSAob3B0aW9ucyAmJiAodHlwZW9mIG9wdGlvbnMuc3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcpKSA/IG9wdGlvbnMuc3RvcmFnZSA6IChjb25maWdGb3JSb290T3B0aW9ucz8uc3RvcmFnZSA/PyAwKVxuXG4gICAgLy8gZXhwaXJlczogcHJlZmVyIGV4cGxpY2l0IG51bWVyaWMgZXhwaXJlczsgaWYgbm90IHByb3ZpZGVkLCBjb21wdXRlIGZyb20gZXhwaXJlc0luIHN0cmluZzsgb3RoZXJ3aXNlIHVzZSBjb25maWcgZGVmYXVsdFxuICAgIC8vIGlmIGFuIGV4cGxpY2l0LCBub24temVybyBudW1lcmljIGV4cGlyZXMgaXMgcHJvdmlkZWQsIHVzZSBpdFxuICAgIGlmIChvcHRpb25zICYmICh0eXBlb2Ygb3B0aW9ucy5leHBpcmVzICE9PSAndW5kZWZpbmVkJykgJiYgb3B0aW9ucy5leHBpcmVzICE9PSBudWxsICYmIE51bWJlcihvcHRpb25zLmV4cGlyZXMpID4gMCkge1xuICAgICAgbWVyZ2VkT3B0aW9ucy5leHBpcmVzID0gTnVtYmVyKG9wdGlvbnMuZXhwaXJlcyk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZXhwaXJlc0luKSB7XG4gICAgICAvLyBjb21wdXRlIG51bWVyaWMgZXBvY2ggZnJvbSBleHBpcmVzSW4gc3RyaW5nIHVzaW5nIFV0aWxzU2VydmljZSBpZiBhdmFpbGFibGVcbiAgICAgIHRyeSB7XG4gICAgICAgIG1lcmdlZE9wdGlvbnMuZXhwaXJlcyA9IHRoaXMudXRpbHMgPyB0aGlzLnV0aWxzLmV4cGlyZXMob3B0aW9ucy5leHBpcmVzSW4pIDogMDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBtZXJnZWRPcHRpb25zLmV4cGlyZXMgPSAwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZWRPcHRpb25zLmV4cGlyZXMgPSBjb25maWdGb3JSb290T3B0aW9ucz8uZXhwaXJlcyA/PyAwO1xuICAgIH1cblxuICAgIC8vIGtlZXAgZXhwaXJlc0luIHN0cmluZyBpZiBleHBsaWNpdGx5IHByb3ZpZGVkLCBvdGhlcndpc2UgdXNlIGNvbmZpZyBkZWZhdWx0XG4gICAgbWVyZ2VkT3B0aW9ucy5leHBpcmVzSW4gPSAob3B0aW9ucyAmJiAodHlwZW9mIG9wdGlvbnMuZXhwaXJlc0luICE9PSAndW5kZWZpbmVkJykpID8gb3B0aW9ucy5leHBpcmVzSW4gOiAoY29uZmlnRm9yUm9vdE9wdGlvbnM/LmV4cGlyZXNJbiB8fCAnJylcblxuICAgIG1lcmdlZE9wdGlvbnMuZW5jcnlwdGVkID0gKG9wdGlvbnMgJiYgKHR5cGVvZiBvcHRpb25zLmVuY3J5cHRlZCAhPT0gJ3VuZGVmaW5lZCcpKSA/IG9wdGlvbnMuZW5jcnlwdGVkIDogKGNvbmZpZ0ZvclJvb3RPcHRpb25zPy5lbmNyeXB0ZWQgfHwgZmFsc2UpXG5cbiAgICByZXR1cm4gbWVyZ2VkT3B0aW9ucztcblxuICB9XG5cbn1cbiJdfQ==
|