http-request-manager 15.0.26 → 18.0.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/esm2022/http-request-manager.mjs +5 -0
- package/esm2022/lib/http-request-manager.module.mjs +146 -0
- package/esm2022/lib/http-request-services-demo/database-data-demo/database-data-demo.component.mjs +71 -0
- package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +41 -0
- package/esm2022/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.mjs +173 -0
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.mjs +80 -0
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.mjs +42 -0
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.mjs +88 -0
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.mjs +11 -0
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.mjs +29 -0
- package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.mjs +9 -0
- package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.mjs +12 -0
- package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.mjs +14 -0
- package/esm2022/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.mjs +315 -0
- package/esm2022/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.mjs +270 -0
- package/esm2022/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.mjs +67 -0
- package/esm2022/lib/index.mjs +4 -0
- package/esm2022/lib/interceptors/credentials.interceptor.mjs +14 -0
- package/esm2022/lib/interceptors/index.mjs +5 -0
- package/esm2022/lib/interceptors/models/error-settings.model.mjs +10 -0
- package/esm2022/lib/interceptors/proxy-debugger.interceptor.mjs +47 -0
- package/esm2022/lib/interceptors/request-error.interceptor.mjs +49 -0
- package/esm2022/lib/interceptors/request-header.interceptor.mjs +41 -0
- package/esm2022/lib/models/config-http-options.model.mjs +18 -0
- package/esm2022/lib/models/config-local-storage-options.model.mjs +12 -0
- package/esm2022/lib/models/config-options.model.mjs +12 -0
- package/esm2022/lib/models/config-token.model.mjs +8 -0
- package/esm2022/lib/models/data-type.enum.mjs +7 -0
- package/esm2022/lib/models/database-storage.model.mjs +10 -0
- package/esm2022/lib/models/index.mjs +7 -0
- package/esm2022/lib/models/retry-options.model.mjs +10 -0
- package/esm2022/lib/services/database-manager-services/database.manager.service.mjs +119 -0
- package/esm2022/lib/services/database-manager-services/db.storage.service.mjs +143 -0
- package/esm2022/lib/services/database-manager-services/index.mjs +4 -0
- package/esm2022/lib/services/database-manager-services/models/table-schema.mjs +20 -0
- package/esm2022/lib/services/index.mjs +6 -0
- package/esm2022/lib/services/local-storage-manager-service/index.mjs +3 -0
- package/esm2022/lib/services/local-storage-manager-service/local-storage-manager.service.mjs +302 -0
- package/esm2022/lib/services/local-storage-manager-service/models/global-store-options.model.mjs +13 -0
- package/esm2022/lib/services/local-storage-manager-service/models/index.mjs +6 -0
- package/esm2022/lib/services/local-storage-manager-service/models/setting-options.model.mjs +13 -0
- package/esm2022/lib/services/local-storage-manager-service/models/storage-data.model.mjs +10 -0
- package/esm2022/lib/services/local-storage-manager-service/models/storage-option.model.mjs +12 -0
- package/esm2022/lib/services/local-storage-manager-service/models/storage-type.enum.mjs +7 -0
- package/esm2022/lib/services/request-manager-services/http-manager.service.mjs +207 -0
- package/esm2022/lib/services/request-manager-services/index.mjs +5 -0
- package/esm2022/lib/services/request-manager-services/request.service.mjs +189 -0
- package/esm2022/lib/services/request-manager-services/rxjs-operators/countdown.mjs +9 -0
- package/esm2022/lib/services/request-manager-services/rxjs-operators/delay-retry.mjs +10 -0
- package/esm2022/lib/services/request-manager-services/rxjs-operators/index.mjs +5 -0
- package/esm2022/lib/services/request-manager-services/rxjs-operators/request-polling.mjs +14 -0
- package/esm2022/lib/services/request-manager-services/rxjs-operators/request-streaming.mjs +19 -0
- package/esm2022/lib/services/request-manager-state-service/http-manager-state.store.mjs +267 -0
- package/esm2022/lib/services/request-manager-state-service/index.mjs +3 -0
- package/esm2022/lib/services/request-manager-state-service/models/api-request.model.mjs +20 -0
- package/esm2022/lib/services/request-manager-state-service/models/index.mjs +3 -0
- package/esm2022/lib/services/request-manager-state-service/models/request-options.model.mjs +10 -0
- package/esm2022/lib/services/utils/app.service.mjs +26 -0
- package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +186 -0
- package/esm2022/lib/services/utils/encryption/encryption-test.service.mjs +35 -0
- package/esm2022/lib/services/utils/encryption/index.mjs +4 -0
- package/esm2022/lib/services/utils/encryption/random.mjs +52 -0
- package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +77 -0
- package/esm2022/lib/services/utils/headers.service.mjs +21 -0
- package/esm2022/lib/services/utils/index.mjs +6 -0
- package/esm2022/lib/services/utils/object-merger.service.mjs +50 -0
- package/esm2022/lib/services/utils/path-query.service.mjs +54 -0
- package/esm2022/lib/services/utils/utils.service.mjs +155 -0
- package/esm2022/public-api.mjs +11 -0
- package/fesm2022/http-request-manager.mjs +3444 -0
- package/fesm2022/http-request-manager.mjs.map +1 -0
- package/http-request-manager-18.0.2.tgz +0 -0
- package/index.d.ts +5 -0
- package/lib/http-request-manager.module.d.ts +33 -0
- package/lib/http-request-services-demo/database-data-demo/database-data-demo.component.d.ts +19 -0
- package/lib/http-request-services-demo/http-request-services-demo.component.d.ts +24 -0
- package/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.d.ts +56 -0
- package/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.d.ts +26 -0
- package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.d.ts +13 -0
- package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.d.ts +27 -0
- package/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.d.ts +12 -0
- package/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.d.ts +16 -0
- package/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.d.ts +8 -0
- package/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.d.ts +14 -0
- package/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.d.ts +14 -0
- package/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.d.ts +107 -0
- package/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.d.ts +122 -0
- package/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.d.ts +15 -0
- package/lib/index.d.ts +3 -0
- package/lib/interceptors/credentials.interceptor.d.ts +8 -0
- package/{src/lib/interceptors/index.ts → lib/interceptors/index.d.ts} +0 -2
- package/lib/interceptors/models/error-settings.model.d.ts +10 -0
- package/lib/interceptors/proxy-debugger.interceptor.d.ts +12 -0
- package/lib/interceptors/request-error.interceptor.d.ts +10 -0
- package/lib/interceptors/request-header.interceptor.d.ts +15 -0
- package/lib/models/config-http-options.model.d.ts +21 -0
- package/lib/models/config-local-storage-options.model.d.ts +13 -0
- package/lib/models/config-options.model.d.ts +12 -0
- package/{src/lib/models/config-token.model.ts → lib/models/config-token.model.d.ts} +1 -2
- package/lib/models/data-type.enum.d.ts +5 -0
- package/lib/models/database-storage.model.d.ts +10 -0
- package/lib/models/index.d.ts +6 -0
- package/lib/models/retry-options.model.d.ts +10 -0
- package/lib/services/database-manager-services/database.manager.service.d.ts +31 -0
- package/lib/services/database-manager-services/db.storage.service.d.ts +26 -0
- package/{src/lib/services/database-manager-services/index.ts → lib/services/database-manager-services/index.d.ts} +0 -1
- package/lib/services/database-manager-services/models/table-schema.d.ts +11 -0
- package/{src/lib/services/index.ts → lib/services/index.d.ts} +0 -4
- package/lib/services/local-storage-manager-service/index.d.ts +2 -0
- package/lib/services/local-storage-manager-service/local-storage-manager.service.d.ts +86 -0
- package/lib/services/local-storage-manager-service/models/global-store-options.model.d.ts +15 -0
- package/{src/lib/services/local-storage-manager-service/models/index.ts → lib/services/local-storage-manager-service/models/index.d.ts} +1 -2
- package/lib/services/local-storage-manager-service/models/setting-options.model.d.ts +15 -0
- package/lib/services/local-storage-manager-service/models/storage-data.model.d.ts +10 -0
- package/lib/services/local-storage-manager-service/models/storage-option.model.d.ts +13 -0
- package/lib/services/local-storage-manager-service/models/storage-type.enum.d.ts +5 -0
- package/lib/services/request-manager-services/http-manager.service.d.ts +41 -0
- package/{src/lib/services/request-manager-services/index.ts → lib/services/request-manager-services/index.d.ts} +0 -2
- package/lib/services/request-manager-services/request.service.d.ts +27 -0
- package/lib/services/request-manager-services/rxjs-operators/countdown.d.ts +2 -0
- package/lib/services/request-manager-services/rxjs-operators/delay-retry.d.ts +2 -0
- package/lib/services/request-manager-services/rxjs-operators/request-polling.d.ts +7 -0
- package/lib/services/request-manager-services/rxjs-operators/request-streaming.d.ts +2 -0
- package/lib/services/request-manager-state-service/http-manager-state.store.d.ts +51 -0
- package/{src/lib/services/request-manager-state-service/index.ts → lib/services/request-manager-state-service/index.d.ts} +0 -1
- package/lib/services/request-manager-state-service/models/api-request.model.d.ts +27 -0
- package/{src/lib/services/request-manager-state-service/models/index.ts → lib/services/request-manager-state-service/models/index.d.ts} +0 -1
- package/lib/services/request-manager-state-service/models/request-options.model.d.ts +10 -0
- package/lib/services/utils/app.service.d.ts +8 -0
- package/lib/services/utils/encryption/asymmetrical-encryption.service.d.ts +17 -0
- package/lib/services/utils/encryption/encryption-test.service.d.ts +10 -0
- package/{src/lib/services/utils/encryption/index.ts → lib/services/utils/encryption/index.d.ts} +0 -2
- package/lib/services/utils/encryption/random.d.ts +7 -0
- package/lib/services/utils/encryption/symmetrical-encryption.service.d.ts +14 -0
- package/lib/services/utils/headers.service.d.ts +10 -0
- package/{src/lib/services/utils/index.ts → lib/services/utils/index.d.ts} +0 -2
- package/lib/services/utils/object-merger.service.d.ts +12 -0
- package/lib/services/utils/path-query.service.d.ts +11 -0
- package/lib/services/utils/utils.service.d.ts +24 -0
- package/package.json +14 -1
- package/{src/public-api.ts → public-api.d.ts} +0 -7
- package/ng-package.json +0 -8
- package/src/lib/http-request-manager.module.ts +0 -101
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +0 -3
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +0 -105
- package/src/lib/http-request-services-demo/http-request-services-demo.component.html +0 -64
- package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +0 -6
- package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +0 -34
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +0 -195
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +0 -17
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +0 -205
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +0 -59
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +0 -60
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +0 -71
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +0 -28
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +0 -10
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +0 -29
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +0 -99
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +0 -22
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +0 -8
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +0 -19
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +0 -25
- package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +0 -30
- package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +0 -19
- package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +0 -25
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +0 -19
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +0 -24
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +0 -30
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +0 -49
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +0 -33
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +0 -336
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +0 -24
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +0 -403
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +0 -328
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +0 -24
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +0 -347
- package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +0 -88
- package/src/lib/index.ts +0 -3
- package/src/lib/interceptors/credentials.interceptor.ts +0 -18
- package/src/lib/interceptors/models/error-settings.model.ts +0 -22
- package/src/lib/interceptors/proxy-debugger.interceptor.ts +0 -46
- package/src/lib/interceptors/request-error.interceptor.ts +0 -65
- package/src/lib/interceptors/request-header.interceptor.ts +0 -58
- package/src/lib/models/config-http-options.model.ts +0 -42
- package/src/lib/models/config-local-storage-options.model.ts +0 -27
- package/src/lib/models/config-options.model.ts +0 -27
- package/src/lib/models/data-type.enum.ts +0 -5
- package/src/lib/models/database-storage.model.ts +0 -24
- package/src/lib/models/index.ts +0 -9
- package/src/lib/models/retry-options.model.ts +0 -22
- package/src/lib/services/database-manager-services/database.manager.service.ts +0 -193
- package/src/lib/services/database-manager-services/db.storage.service.ts +0 -191
- package/src/lib/services/database-manager-services/models/table-schema.ts +0 -35
- package/src/lib/services/local-storage-manager-service/index.ts +0 -2
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +0 -71
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +0 -421
- package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +0 -30
- package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +0 -30
- package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +0 -24
- package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +0 -29
- package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +0 -5
- package/src/lib/services/request-manager-services/README.md +0 -268
- package/src/lib/services/request-manager-services/http-manager.service.spec.ts +0 -230
- package/src/lib/services/request-manager-services/http-manager.service.ts +0 -274
- package/src/lib/services/request-manager-services/request.service.ts +0 -261
- package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +0 -17
- package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +0 -16
- package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +0 -21
- package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +0 -32
- package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +0 -402
- package/src/lib/services/request-manager-state-service/models/api-request.model.ts +0 -50
- package/src/lib/services/request-manager-state-service/models/request-options.model.ts +0 -22
- package/src/lib/services/utils/app.service.spec.ts +0 -25
- package/src/lib/services/utils/app.service.ts +0 -21
- package/src/lib/services/utils/encryption/README.md +0 -79
- package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +0 -282
- package/src/lib/services/utils/encryption/encryption-test.service.ts +0 -39
- package/src/lib/services/utils/encryption/random.ts +0 -69
- package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +0 -93
- package/src/lib/services/utils/headers.service.spec.ts +0 -80
- package/src/lib/services/utils/headers.service.ts +0 -18
- package/src/lib/services/utils/object-merger.service.spec.ts +0 -16
- package/src/lib/services/utils/object-merger.service.ts +0 -60
- package/src/lib/services/utils/path-query.service.spec.ts +0 -117
- package/src/lib/services/utils/path-query.service.ts +0 -69
- package/src/lib/services/utils/utils.service.spec.ts +0 -164
- package/src/lib/services/utils/utils.service.ts +0 -192
- package/tsconfig.lib.json +0 -32
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -14
- /package/{src/lib/services/request-manager-services/rxjs-operators/index.ts → lib/services/request-manager-services/rxjs-operators/index.d.ts} +0 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, EMPTY, from } from 'rxjs';
|
|
3
|
+
import { map, catchError } from 'rxjs/operators';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class AsymmetricalEncryptionService {
|
|
6
|
+
constructor() { }
|
|
7
|
+
generateKeyPair(modulusLength = 2048) {
|
|
8
|
+
// modulusLength - 1024, 2048, 4096
|
|
9
|
+
// hash - SHA-256
|
|
10
|
+
return from(crypto.subtle.generateKey({
|
|
11
|
+
name: "RSA-OAEP",
|
|
12
|
+
modulusLength,
|
|
13
|
+
publicExponent: new Uint8Array([1, 0, 1]), // 65537
|
|
14
|
+
hash: { name: "SHA-256" }
|
|
15
|
+
}, true, // Extractable keys
|
|
16
|
+
["encrypt", "decrypt"]));
|
|
17
|
+
}
|
|
18
|
+
encryptData(publicKey, data) {
|
|
19
|
+
const encodedData = new TextEncoder().encode(data);
|
|
20
|
+
return from(crypto.subtle.encrypt({
|
|
21
|
+
name: "RSA-OAEP"
|
|
22
|
+
}, publicKey, encodedData)).pipe(map(enc => this.arrayBufferToBase64(enc)));
|
|
23
|
+
}
|
|
24
|
+
decryptData(privateKey, encryptedData) {
|
|
25
|
+
const encStr = this.base64ToArrayBuffer(encryptedData);
|
|
26
|
+
return from(crypto.subtle.decrypt({
|
|
27
|
+
name: "RSA-OAEP"
|
|
28
|
+
}, privateKey, encStr).then(decryptedData => {
|
|
29
|
+
return new TextDecoder().decode(decryptedData);
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
pemToArrayBuffer(pem) {
|
|
33
|
+
const b64 = pem.replace(/(-----BEGIN (RSA )?(PRIVATE|PUBLIC) KEY-----|-----END (RSA )?(PRIVATE|PUBLIC) KEY-----|\n)/g, '');
|
|
34
|
+
const binaryString = atob(b64);
|
|
35
|
+
const len = binaryString.length;
|
|
36
|
+
const buffer = new ArrayBuffer(len);
|
|
37
|
+
const view = new Uint8Array(buffer);
|
|
38
|
+
for (let i = 0; i < len; i++) {
|
|
39
|
+
view[i] = binaryString.charCodeAt(i);
|
|
40
|
+
}
|
|
41
|
+
return buffer;
|
|
42
|
+
}
|
|
43
|
+
base64ToArrayBuffer(base64) {
|
|
44
|
+
const binaryString = atob(base64);
|
|
45
|
+
const len = binaryString.length;
|
|
46
|
+
const buffer = new ArrayBuffer(len);
|
|
47
|
+
const view = new Uint8Array(buffer);
|
|
48
|
+
for (let i = 0; i < len; i++) {
|
|
49
|
+
view[i] = binaryString.charCodeAt(i);
|
|
50
|
+
}
|
|
51
|
+
return buffer;
|
|
52
|
+
}
|
|
53
|
+
arrayBufferToBase64(buffer) {
|
|
54
|
+
let binary = '';
|
|
55
|
+
const bytes = new Uint8Array(buffer);
|
|
56
|
+
const len = bytes.byteLength;
|
|
57
|
+
for (let i = 0; i < len; i++) {
|
|
58
|
+
binary += String.fromCharCode(bytes[i]);
|
|
59
|
+
}
|
|
60
|
+
return window.btoa(binary);
|
|
61
|
+
}
|
|
62
|
+
base64ToPEM(base64Key, publicKey = true) {
|
|
63
|
+
const keyType = (publicKey) ? 'PUBLIC' : 'PRIVATE';
|
|
64
|
+
const header = `-----BEGIN ${keyType} KEY-----\n`;
|
|
65
|
+
const footer = `\n-----END ${keyType} KEY-----`;
|
|
66
|
+
const keyBody = base64Key.match(/.{1,64}/g)?.join("\n") || "";
|
|
67
|
+
return header + keyBody + footer;
|
|
68
|
+
}
|
|
69
|
+
pemToCryptoKey(pem, algorithm, extractable, keyUsages, format = "pkcs8" //"raw" | "pkcs8" | "spki"
|
|
70
|
+
) {
|
|
71
|
+
const buffer = this.pemToArrayBuffer(pem);
|
|
72
|
+
console.log('buffer found ', buffer);
|
|
73
|
+
return from(crypto.subtle.importKey(format, buffer, algorithm, extractable, keyUsages));
|
|
74
|
+
}
|
|
75
|
+
// TESTING
|
|
76
|
+
testGenerateKeys() {
|
|
77
|
+
const testSequence = new BehaviorSubject("");
|
|
78
|
+
const testSequence$ = testSequence.asObservable();
|
|
79
|
+
testSequence.next("Test Generating Keys");
|
|
80
|
+
// GENERATE KEYS
|
|
81
|
+
this.generateKeyPair().subscribe((data) => {
|
|
82
|
+
console.log("GEN-GENERATED KEYS: ", data);
|
|
83
|
+
crypto.subtle.exportKey('spki', data.publicKey)
|
|
84
|
+
.then(key => {
|
|
85
|
+
const publicKeyBase64 = this.arrayBufferToBase64(key);
|
|
86
|
+
console.log("GEN-EXPORT PUBLIC KEY: ", this.base64ToPEM(publicKeyBase64, true));
|
|
87
|
+
});
|
|
88
|
+
crypto.subtle.exportKey('pkcs8', data.privateKey)
|
|
89
|
+
.then(key => {
|
|
90
|
+
const privateKeyBase64 = this.arrayBufferToBase64(key);
|
|
91
|
+
console.log("GEN-EXPORT PRIVATE KEY: ", this.base64ToPEM(privateKeyBase64, false));
|
|
92
|
+
});
|
|
93
|
+
// TEST WITH GENERATED KEYS
|
|
94
|
+
this.encryptData(data.publicKey, "Sample Data here - Mike Bonifacio")
|
|
95
|
+
.subscribe((enc) => {
|
|
96
|
+
console.log("GEN-ENCRYPT==>: ", enc);
|
|
97
|
+
this.decryptData(data.privateKey, enc).subscribe((dec) => {
|
|
98
|
+
testSequence.next('Test Passed');
|
|
99
|
+
testSequence.complete();
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
return testSequence$;
|
|
104
|
+
}
|
|
105
|
+
testDecryptionWithKeys() {
|
|
106
|
+
const testSequence = new BehaviorSubject("");
|
|
107
|
+
const testSequence$ = testSequence.asObservable();
|
|
108
|
+
testSequence.next("Test Generating Keys");
|
|
109
|
+
const privateKey = `-----BEGIN PRIVATE KEY-----
|
|
110
|
+
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDKVBkCWNb9eHVF
|
|
111
|
+
twAA5mdAyvXFix3WavdrsoYRkvtCl8ogDBQf8f6N0bRkDF1zcVHRrNAEyozXDtuD
|
|
112
|
+
kFgSiivBFREI7fiS3sOvduq6FaGXzX0IY6oaVMu8oOPgDvC0yvoohR+0Qxq2d6lP
|
|
113
|
+
SPyHeKQaxP4KxzCJJzB1XAcbd2eFzUUDv25mNlwdVkmW8FI/sAxnJLgPTW78dzfX
|
|
114
|
+
Ddfk+nxdIqxVKSLATnL0kMN7aGJx24UozioAIpzvvvF5/+7HTd1gi6NeCqrAYr3g
|
|
115
|
+
iP364AE26CFwFvHnafO9uNQhlQ+uiNnOoInXByfFGVP+RidSpfLzaxDjs6RDwpol
|
|
116
|
+
h098btONAgMBAAECggEAAVhHM2OD5IkUtuowwcKNaCTKGmrClRE3gMuzJeBsSJEy
|
|
117
|
+
uAReUFILZylcnhegDytSti2vDA9T7xqtO6CU0p3V8LpU89JMOPRb/deirI4UXSpx
|
|
118
|
+
xbNyjirOO6bnrNlOWfKexdQQsikYPzF2iM1Scpr1u9ZDCHZOl1ZYSrkve5My4coP
|
|
119
|
+
3Gx6tTBqL0jQBfcpf4ES8BH3JSawR/MgqzDS74+bI2VH+kvuPAC1L4fBgaV3VUv0
|
|
120
|
+
nFzim5A3s5VaXPgJbEIghP9BkYGFkeT9ma3nliEZWc96AzsmowFn1ayCvrNVPo9R
|
|
121
|
+
ECD2NnttBiCJZt3H93sR9+OTeA8Bls+aZGlKd5mLAQKBgQDpf8nIYUm/Zmls7/lQ
|
|
122
|
+
QBUSGHEYrbjNsEejQsPgNDtg2EVSxdUkvTn7Wb+HExTk09Z5bNvhaO2532/FH9y8
|
|
123
|
+
ahSXafiMXpfR2olwXdOB9yXXl4F5C0LGnmzGim4OSeWzAX0JCL470KaS0QN3EmoG
|
|
124
|
+
9F0YCfMnZXNTweSSx4xvlO6ggQKBgQDd01uIolm7z1DIWCwNERAXP2GDwcvxyzYK
|
|
125
|
+
YqJfKDeHt2t6yIzZMMotnPDy+OlcdGspIIHkB5a+SZN5Nt7DUKg/MnyOZ3KbVq41
|
|
126
|
+
k7dR4Ka3LRnGkesy7lSr7ef1rfquyR75OXJQcPWvkFcLu0TMiQhvptatZ8VN+F4n
|
|
127
|
+
fDQELRotDQKBgQCgN+AUT7VT0QjcCBnRV/ddUEoiPenFsYSmYMSYzh5ESIHg1wB2
|
|
128
|
+
0iS79Iw4Of6nOTg8X1bM57vfQ5Kk90T2P+/bKYqzfqC8DTErWiYsUpKzyTC9Bt4N
|
|
129
|
+
/Vz0Kr5zrX8ggg/yp/4oevYhXav8AzWfigNq4EDpMnKc8TlPAf+5/L50gQKBgQC2
|
|
130
|
+
mLPhPhr1gUszD3l7bA89w7uGlLFHoQoj9FtKTzWervp3QLzIT+QtNeIVb5XQuDg5
|
|
131
|
+
y3uAdEq+6pvNjMBEMJG+K9Xh9v+dJPYUPjsJ2A4D/MkZ7qWX8B2cxSJK1uLim8W2
|
|
132
|
+
S3ZxBvsGgJ9WldmlMCvUlJZkeWYtr4P5psC+q02/xQKBgQCDII/jcV2+lRM2iNTe
|
|
133
|
+
vBijZSaNMEWOK/Y+/HFK8GYKXnB+xNWhrm8rKgWGzpDJAUPMh9Tt+leW9LKEBuzF
|
|
134
|
+
Y1bGblmGm1zsPWpIx05Fdtv9eOJmFnXbGzIsYyhadZnPcQOWhqxtpVxSuul0Jc7Q
|
|
135
|
+
XNq4qPaPXhbQAshgtyBt75DMkw==
|
|
136
|
+
-----END PRIVATE KEY-----`;
|
|
137
|
+
const pubKey = `-----BEGIN PUBLIC KEY-----
|
|
138
|
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylQZAljW/Xh1RbcAAOZn
|
|
139
|
+
QMr1xYsd1mr3a7KGEZL7QpfKIAwUH/H+jdG0ZAxdc3FR0azQBMqM1w7bg5BYEoor
|
|
140
|
+
wRURCO34kt7Dr3bquhWhl819CGOqGlTLvKDj4A7wtMr6KIUftEMatnepT0j8h3ik
|
|
141
|
+
GsT+CscwiScwdVwHG3dnhc1FA79uZjZcHVZJlvBSP7AMZyS4D01u/Hc31w3X5Pp8
|
|
142
|
+
XSKsVSkiwE5y9JDDe2hicduFKM4qACKc777xef/ux03dYIujXgqqwGK94Ij9+uAB
|
|
143
|
+
NughcBbx52nzvbjUIZUProjZzqCJ1wcnxRlT/kYnUqXy82sQ47OkQ8KaJYdPfG7T
|
|
144
|
+
jQIDAQAB
|
|
145
|
+
-----END PUBLIC KEY-----`;
|
|
146
|
+
const algorithm = {
|
|
147
|
+
name: "RSA-OAEP",
|
|
148
|
+
modulusLength: 2048,
|
|
149
|
+
publicExponent: new Uint8Array([1, 0, 1]),
|
|
150
|
+
hash: "SHA-256"
|
|
151
|
+
};
|
|
152
|
+
// ENCRYPT
|
|
153
|
+
this.pemToCryptoKey(pubKey, algorithm, true, ["encrypt"], "spki").subscribe((keyPublic) => {
|
|
154
|
+
// console.log("PUBLIC KEY: ", keyPublic)
|
|
155
|
+
this.encryptData(keyPublic, "Sample Data here - Mike Bonifacio")
|
|
156
|
+
.subscribe((str) => {
|
|
157
|
+
console.log("ENCRYPTED STRING: ", str);
|
|
158
|
+
testSequence.next('encrypted string success');
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
const enc = "r7UOuEGBZ6jbVTOIBuv9jFOEtRiedmS27hfW40k7XKCTsQ5VhWup0qu2BA2ANZaGKii/uehJ/RSPiyfGbJ6leJrat0mA1hPqH/XodaBzLMDigvdYM1NSXFZMDa40OpLUIXbPlAvybjcGu7Bal+LMA8htHrFu/OmM/fHI66xOzzpuXSYx0OkWjtY81rUQ1FFkvrkx2jGFPZ0p+Nw/v3Q4cJnet6V63vCueFlD749VMcVXo7pvz4AIPpB+IOy3kbxaYTPakLVioJERU6GFMXWkECuRvohhS9CETcORZtRVRkvhcHk3lxgIhfqojUKYgD6K5dDELDPsWIS+iTG1XIQIlg==";
|
|
162
|
+
// DECRYPTION
|
|
163
|
+
this.pemToCryptoKey(privateKey, algorithm, false, ["decrypt"], "pkcs8").subscribe((key) => {
|
|
164
|
+
// console.log("DECRYPT ===", key)
|
|
165
|
+
this.decryptData(key, enc)
|
|
166
|
+
.pipe(catchError(err => {
|
|
167
|
+
console.log("ERROR: ", err);
|
|
168
|
+
return EMPTY;
|
|
169
|
+
})).subscribe((str) => {
|
|
170
|
+
console.log("DECRYPTED STRING: ", str);
|
|
171
|
+
testSequence.next('decrypted string success');
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
return testSequence$;
|
|
175
|
+
}
|
|
176
|
+
;
|
|
177
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AsymmetricalEncryptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
178
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AsymmetricalEncryptionService, providedIn: 'root' }); }
|
|
179
|
+
}
|
|
180
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AsymmetricalEncryptionService, decorators: [{
|
|
181
|
+
type: Injectable,
|
|
182
|
+
args: [{
|
|
183
|
+
providedIn: 'root'
|
|
184
|
+
}]
|
|
185
|
+
}], ctorParameters: () => [] });
|
|
186
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bW1ldHJpY2FsLWVuY3J5cHRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1tYW5hZ2VyL3NyYy9saWIvc2VydmljZXMvdXRpbHMvZW5jcnlwdGlvbi9hc3ltbWV0cmljYWwtZW5jcnlwdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQWMsSUFBSSxFQUFNLE1BQU0sTUFBTSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBS2pELE1BQU0sT0FBTyw2QkFBNkI7SUFFeEMsZ0JBQWUsQ0FBQztJQUVoQixlQUFlLENBQUMsYUFBYSxHQUFHLElBQUk7UUFFbEMsbUNBQW1DO1FBQ25DLGlCQUFpQjtRQUVsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDbEM7WUFDRSxJQUFJLEVBQUUsVUFBVTtZQUNoQixhQUFhO1lBQ2IsY0FBYyxFQUFFLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVE7WUFDbkQsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtTQUMxQixFQUNELElBQUksRUFBRSxtQkFBbUI7UUFDekIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQ3ZCLENBQUMsQ0FBQTtJQUVKLENBQUM7SUFFRCxXQUFXLENBQUMsU0FBb0IsRUFBRSxJQUFZO1FBRTVDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRWxELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxN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QUFDLFNBQVMsQ0FBQyxFQUNYLE9BQU8sQ0FDUixDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBRWxCLGtDQUFrQztZQUVsQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7aUJBQ3pCLElBQUksQ0FDSCxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzVCLE9BQU8sS0FBSyxDQUFBO1lBQ2QsQ0FBQyxDQUFDLENBQ0gsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkMsWUFBWSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFBO1FBRUosQ0FBQyxDQUFDLENBQUE7UUFFRixPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBQUEsQ0FBQzsrR0FoUlMsNkJBQTZCO21IQUE3Qiw2QkFBNkIsY0FGNUIsTUFBTTs7NEZBRVAsNkJBQTZCO2tCQUh6QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBFTVBUWSwgT2JzZXJ2YWJsZSwgZnJvbSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXN5bW1ldHJpY2FsRW5jcnlwdGlvblNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBnZW5lcmF0ZUtleVBhaXIobW9kdWx1c0xlbmd0aCA9IDIwNDgpOiBPYnNlcnZhYmxlPENyeXB0b0tleVBhaXI+IHtcbiAgXG4gICAgLy8gbW9kdWx1c0xlbmd0aCAtIDEwMjQsIDIwNDgsIDQwOTZcbiAgICAvLyBoYXNoIC0gU0hBLTI1NlxuXG4gICByZXR1cm4gZnJvbShjcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIlJTQS1PQUVQXCIsXG4gICAgICAgIG1vZHVsdXNMZW5ndGgsXG4gICAgICAgIHB1YmxpY0V4cG9uZW50OiBuZXcgVWludDhBcnJheShbMSwgMCwgMV0pLCAvLyA2NTUzN1xuICAgICAgICBoYXNoOiB7IG5hbWU6IFwiU0hBLTI1NlwiIH1cbiAgICAgIH0sXG4gICAgICB0cnVlLCAvLyBFeHRyYWN0YWJsZSBrZXlzXG4gICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICkpXG5cbiAgfVxuXG4gIGVuY3J5cHREYXRhKHB1YmxpY0tleTogQ3J5cHRvS2V5LCBkYXRhOiBzdHJpbmcpIHtcblxuICAgIGNvbnN0IGVuY29kZWREYXRhID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGRhdGEpXG5cbiAgICByZXR1cm4gZnJvbShjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiUlNBLU9BRVBcIlxuICAgICAgfSxcbiAgICAgIHB1YmxpY0tleSxcbiAgICAgIGVuY29kZWREYXRhXG4gICAgKSkucGlwZShcbiAgICAgIG1hcChlbmMgPT4gdGhpcy5hcnJheUJ1ZmZlclRvQmFzZTY0KGVuYykpXG4gICAgKVxuXG4gIH1cblxuICBkZWNyeXB0RGF0YShwcml2YXRlS2V5OiBDcnlwdG9LZXksIGVuY3J5cHRlZERhdGE6IHN0cmluZykge1xuXG4gICAgY29uc3QgZW5jU3RyID0gdGhpcy5iYXNlNjRUb0FycmF5QnVmZmVyKGVuY3J5cHRlZERhdGEpXG5cbiAgICByZXR1cm4gZnJvbShjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiUlNBLU9BRVBcIlxuICAgICAgfSxcbiAgICAgIHByaXZhdGVLZXksXG4gICAgICBlbmNTdHJcbiAgICApLnRoZW4oZGVjcnlwdGVkRGF0YSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGRlY3J5cHRlZERhdGEpXG4gICAgfSkpXG5cbiAgfVxuXG4gIHBlbVRvQXJyYXlCdWZmZXIocGVtOiBzdHJpbmcpOiBBcnJheUJ1ZmZlciB7XG5cbiAgICBjb25zdCBiNjQgPSBwZW0ucmVwbGFjZSgvKC0tLS0tQkVHSU4gKFJTQSApPyhQUklWQVRFfFBVQkxJQykgS0VZLS0tLS18LS0tLS1FTkQgKFJTQSApPyhQUklWQVRFfFBVQkxJQykgS0VZLS0tLS18XFxuKS9nLCAnJylcbiAgICBjb25zdCBiaW5hcnlTdHJpbmcgPSBhdG9iKGI2NClcbiAgICBjb25zdCBsZW4gPSBiaW5hcnlTdHJpbmcubGVuZ3RoXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGxlbilcbiAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmlld1tpXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkpXG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZmZlclxuXG4gIH1cblxuICBiYXNlNjRUb0FycmF5QnVmZmVyKGJhc2U2NDogc3RyaW5nKTogQXJyYXlCdWZmZXIge1xuICAgIFxuICAgIGNvbnN0IGJpbmFyeVN0cmluZyA9IGF0b2IoYmFzZTY0KTtcbiAgICBjb25zdCBsZW4gPSBiaW5hcnlTdHJpbmcubGVuZ3RoO1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihsZW4pO1xuICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2aWV3W2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfVxuXG4gIGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZyB7XG5cbiAgICBsZXQgYmluYXJ5ID0gJyc7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIGNvbnN0IGxlbiA9IGJ5dGVzLmJ5dGVMZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdpbmRvdy5idG9hKGJpbmFyeSlcblxuICB9XG5cbiAgYmFzZTY0VG9QRU0oYmFzZTY0S2V5OiBzdHJpbmcsIHB1YmxpY0tleSA9IHRydWUpIHtcblxuICAgIGNvbnN0IGtleVR5cGUgPSAocHVibGljS2V5KSA/ICdQVUJMSUMnIDogJ1BSSVZBVEUnXG5cbiAgICBjb25zdCBoZWFkZXIgPSBgLS0tLS1CRUdJTiAke2tleVR5cGV9IEtFWS0tLS0tXFxuYFxuICAgIGNvbnN0IGZvb3RlciA9IGBcXG4tLS0tLUVORCAke2tleVR5cGV9IEtFWS0tLS0tYFxuXG4gICAgY29uc3Qga2V5Qm9keSA9IGJhc2U2NEtleS5tYXRjaCgvLnsxLDY0fS9nKT8uam9pbihcIlxcblwiKSB8fCBcIlwiXG5cbiAgICByZXR1cm4gaGVhZGVyICsga2V5Qm9keSArIGZvb3RlclxuXG4gIH1cblxuICBwZW1Ub0NyeXB0b0tleShcbiAgICBwZW06IHN0cmluZywgXG4gICAgYWxnb3JpdGhtOiBSc2FIYXNoZWRLZXlHZW5QYXJhbXMsIFxuICAgIGV4dHJhY3RhYmxlOiBib29sZWFuLCBcbiAgICBrZXlVc2FnZXM6IEtleVVzYWdlW10sXG4gICAgZm9ybWF0OiBhbnkgPSBcInBrY3M4XCIgLy9cInJhd1wiIHwgXCJwa2NzOFwiIHwgXCJzcGtpXCJcbiAgICApIHtcbiAgICBcbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLnBlbVRvQXJyYXlCdWZmZXIocGVtKTtcblxuICAgIGNvbnNvbGUubG9nKCdidWZmZXIgZm91bmQgJywgYnVmZmVyKTtcbiAgICBcbiAgICByZXR1cm4gZnJvbShjcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAgIGZvcm1hdCxcbiAgICAgIGJ1ZmZlcixcbiAgICAgIGFsZ29yaXRobSxcbiAgICAgIGV4dHJhY3RhYmxlLFxuICAgICAga2V5VXNhZ2VzXG4gICAgKSlcblxuICB9XG4gIFxuICAvLyBURVNUSU5HXG5cbiAgdGVzdEdlbmVyYXRlS2V5cygpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRlc3RTZXF1ZW5jZTogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oXCJcIik7XG4gICAgY29uc3QgdGVzdFNlcXVlbmNlJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGVzdFNlcXVlbmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRlc3RTZXF1ZW5jZS5uZXh0KFwiVGVzdCBHZW5lcmF0aW5nIEtleXNcIik7XG5cbiAgICAvLyBHRU5FUkFURSBLRVlTXG4gICAgdGhpcy5nZW5lcmF0ZUtleVBhaXIoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcblxuICAgICAgY29uc29sZS5sb2coXCJHRU4tR0VORVJBVEVEIEtFWVM6IFwiLCBkYXRhKVxuXG4gICAgICBjcnlwdG8uc3VidGxlLmV4cG9ydEtleSgnc3BraScsIGRhdGEucHVibGljS2V5KVxuICAgICAgLnRoZW4oa2V5ID0+IHtcbiAgICAgICAgY29uc3QgcHVibGljS2V5QmFzZTY0ID0gdGhpcy5hcnJheUJ1ZmZlclRvQmFzZTY0KGtleSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiR0VOLUVYUE9SVCBQVUJMSUMgS0VZOiBcIiwgdGhpcy5iYXNlNjRUb1BFTShwdWJsaWNLZXlCYXNlNjQsIHRydWUpKTtcbiAgICAgIH0pXG5cbiAgICAgIGNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdwa2NzOCcsIGRhdGEucHJpdmF0ZUtleSlcbiAgICAgIC50aGVuKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IHByaXZhdGVLZXlCYXNlNjQgPSB0aGlzLmFycmF5QnVmZmVyVG9CYXNlNjQoa2V5KTtcbiAgICAgICAgY29uc29sZS5sb2coXCJHRU4tRVhQT1JUIFBSSVZBVEUgS0VZOiBcIiwgdGhpcy5iYXNlNjRUb1BFTShwcml2YXRlS2V5QmFzZTY0LCBmYWxzZSkpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRFU1QgV0lUSCBHRU5FUkFURUQgS0VZU1xuICAgICAgdGhpcy5lbmNyeXB0RGF0YShkYXRhLnB1YmxpY0tleSwgXCJTYW1wbGUgRGF0YSBoZXJlIC0gTWlrZSBCb25pZmFjaW9cIilcbiAgICAgICAgICAuc3Vic2NyaWJlKChlbmMpID0+IHtcblxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJHRU4tRU5DUllQVD09PjogXCIsIGVuYylcblxuICAgICAgICAgICAgdGhpcy5kZWNyeXB0RGF0YShkYXRhLnByaXZhdGVLZXksIGVuYykuc3Vic2NyaWJlKChkZWMpID0+IHtcbiAgICAgICAgICAgICAgdGVzdFNlcXVlbmNlLm5leHQoJ1Rlc3QgUGFzc2VkJyk7XG4gICAgICAgICAgICAgIHRlc3RTZXF1ZW5jZS5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgIH0pXG5cbiAgICB9KVxuICAgIHJldHVybiB0ZXN0U2VxdWVuY2UkO1xuXG4gIH1cblxuICB0ZXN0RGVjcnlwdGlvbldpdGhLZXlzKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3QgdGVzdFNlcXVlbmNlOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihcIlwiKTtcbiAgICBjb25zdCB0ZXN0U2VxdWVuY2UkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0ZXN0U2VxdWVuY2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGVzdFNlcXVlbmNlLm5leHQoXCJUZXN0IEdlbmVyYXRpbmcgS2V5c1wiKTtcblxuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBgLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXG4gICAgTUlJRXZ3SUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NCS2t3Z2dTbEFnRUFBb0lCQVFES1ZCa0NXTmI5ZUhWRlxuICAgIHR3QUE1bWRBeXZYRml4M1dhdmRyc29ZUmt2dENsOG9nREJRZjhmNk4wYlJrREYxemNWSFJyTkFFeW96WER0dURcbiAgICBrRmdTaWl2QkZSRUk3ZmlTM3NPdmR1cTZGYUdYelgwSVk2b2FWTXU4b09QZ0R2QzB5dm9vaFIrMFF4cTJkNmxQXG4gICAgU1B5SGVLUWF4UDRLeHpDSkp6QjFYQWNiZDJlRnpVVUR2MjVtTmx3ZFZrbVc4Rkkvc0F4bkpMZ1BUVzc4ZHpmWFxuICAgIERkZmsrbnhkSXF4VktTTEFUbkwwa01ON2FHSngyNFVvemlvQUlwenZ2dkY1Lys3SFRkMWdpNk5lQ3FyQVlyM2dcbiAgICBpUDM2NEFFMjZDRndGdkhuYWZPOXVOUWhsUSt1aU5uT29JblhCeWZGR1ZQK1JpZFNwZkx6YXhEanM2UkR3cG9sXG4gICAgaDA5OGJ0T05BZ01CQUFFQ2dnRUFBVmhITTJPRDVJa1V0dW93d2NLTmFDVEtHbXJDbFJFM2dNdXpKZUJzU0pFeVxuICAgIHVBUmVVRklMWnlsY25oZWdEeXRTdGkydkRBOVQ3eHF0TzZDVTBwM1Y4THBVODlKTU9QUmIvZGVpckk0VVhTcHhcbiAgICB4Yk55amlyT082Ym5yTmxPV2ZLZXhkUVFzaWtZUHpGMmlNMVNjcHIxdTlaRENIWk9sMVpZU3JrdmU1TXk0Y29QXG4gICAgM0d4NnRUQnFMMGpRQmZjcGY0RVM4QkgzSlNhd1IvTWdxekRTNzQrYkkyVkgra3Z1UEFDMUw0ZkJnYVYzVlV2MFxuICAgIG5GemltNUEzczVWYVhQZ0piRUlnaFA5QmtZR0ZrZVQ5bWEzbmxpRVpXYzk2QXpzbW93Rm4xYXlDdnJOVlBvOVJcbiAgICBFQ0QyTm50dEJpQ0padDNIOTNzUjkrT1RlQThCbHMrYVpHbEtkNW1MQVFLQmdRRHBmOG5JWVVtL1ptbHM3L2xRXG4gICAgUUJVU0dIRVlyYmpOc0VlalFzUGdORHRnMkVWU3hkVWt2VG43V2IrSEV4VGswOVo1Yk52aGFPMjUzMi9GSDl5OFxuICAgIGFoU1hhZmlNWHBmUjJvbHdYZE9COXlYWGw0RjVDMExHbm16R2ltNE9TZVd6QVgwSkNMNDcwS2FTMFFOM0Vtb0dcbiAgICA5RjBZQ2ZNblpYTlR3ZVNTeDR4dmxPNmdnUUtCZ1FEZDAxdUlvbG03ejFESVdDd05FUkFYUDJHRHdjdnh5ellLXG4gICAgWXFKZktEZUh0MnQ2eUl6Wk1Nb3RuUER5K09sY2RHc3BJSUhrQjVhK1NaTjVOdDdEVUtnL01ueU9aM0tiVnE0MVxuICAgIGs3ZFI0S2EzTFJuR2tlc3k3bFNyN2VmMXJmcXV5Ujc1T1hKUWNQV3ZrRmNMdTBUTWlRaHZwdGF0WjhWTitGNG5cbiAgICBmRFFFTFJvdERRS0JnUUNnTitBVVQ3VlQwUWpjQ0JuUlYvZGRVRW9pUGVuRnNZU21ZTVNZemg1RVNJSGcxd0IyXG4gICAgMGlTNzlJdzRPZjZuT1RnOFgxYk01N3ZmUTVLazkwVDJQKy9iS1lxemZxQzhEVEVyV2lZc1VwS3p5VEM5QnQ0TlxuICAgIC9WejBLcjV6clg4Z2dnL3lwLzRvZXZZaFhhdjhBeldmaWdOcTRFRHBNbktjOFRsUEFmKzUvTDUwZ1FLQmdRQzJcbiAgICBtTFBoUGhyMWdVc3pEM2w3YkE4OXc3dUdsTEZIb1FvajlGdEtUeldlcnZwM1FMeklUK1F0TmVJVmI1WFF1RGc1XG4gICAgeTN1QWRFcSs2cHZOak1CRU1KRytLOVhoOXYrZEpQWVVQanNKMkE0RC9Na1o3cVdYOEIyY3hTSksxdUxpbThXMlxuICAgIFMzWnhCdnNHZ0o5V2xkbWxNQ3ZVbEpaa2VXWXRyNFA1cHNDK3EwMi94UUtCZ1FDRElJL2pjVjIrbFJNMmlOVGVcbiAgICB2QmlqWlNhTk1FV09LL1krL0hGSzhHWUtYbkIreE5XaHJtOHJLZ1dHenBESkFVUE1oOVR0K2xlVzlMS0VCdXpGXG4gICAgWTFiR2JsbUdtMXpzUFdwSXgwNUZkdHY5ZU9KbUZuWGJHeklzWXloYWRablBjUU9XaHF4dHBWeFN1dWwwSmM3UVxuICAgIFhOcTRxUGFQWGhiUUFzaGd0eUJ0NzVETWt3PT1cbiAgICAtLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tYFxuICAgIFxuICAgICAgICBjb25zdCBwdWJLZXkgPSBgLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbiAgICBNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXlsUVpBbGpXL1hoMVJiY0FBT1puXG4gICAgUU1yMXhZc2QxbXIzYTdLR0VaTDdRcGZLSUF3VUgvSCtqZEcwWkF4ZGMzRlIwYXpRQk1xTTF3N2JnNUJZRW9vclxuICAgIHdSVVJDTzM0a3Q3RHIzYnF1aFdobDgxOUNHT3FHbFRMdktEajRBN3d0TXI2S0lVZnRFTWF0bmVwVDBqOGgzaWtcbiAgICBHc1QrQ3Njd2lTY3dkVndIRzNkbmhjMUZBNzl1WmpaY0hWWkpsdkJTUDdBTVp5UzREMDF1L0hjMzF3M1g1UHA4XG4gICAgWFNLc1ZTa2l3RTV5OUpERGUyaGljZHVGS000cUFDS2M3Nzd4ZWYvdXgwM2RZSXVqWGdxcXdHSzk0SWo5K3VBQlxuICAgIE51Z2hjQmJ4NTJuenZialVJWlVQcm9qWnpxQ0oxd2NueFJsVC9rWW5VcVh5ODJzUTQ3T2tROEthSllkUGZHN1RcbiAgICBqUUlEQVFBQlxuICAgIC0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLWBcblxuICAgIGNvbnN0IGFsZ29yaXRobTogUnNhSGFzaGVkS2V5R2VuUGFyYW1zID0ge1xuICAgICAgbmFtZTogXCJSU0EtT0FFUFwiLFxuICAgICAgbW9kdWx1c0xlbmd0aDogMjA0OCxcbiAgICAgIHB1YmxpY0V4cG9uZW50OiBuZXcgVWludDhBcnJheShbMSwgMCwgMV0pLFxuICAgICAgaGFzaDogXCJTSEEtMjU2XCJcbiAgICB9O1xuXG4gICAgLy8gRU5DUllQVFxuICAgIHRoaXMucGVtVG9DcnlwdG9LZXkoXG4gICAgICBwdWJLZXksXG4gICAgICBhbGdvcml0aG0sXG4gICAgICB0cnVlLFxuICAgICAgW1wiZW5jcnlwdFwiXSxcbiAgICAgIFwic3BraVwiXG4gICAgKS5zdWJzY3JpYmUoKGtleVB1YmxpYykgPT4ge1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIlBVQkxJQyBLRVk6IFwiLCBrZXlQdWJsaWMpXG5cbiAgICAgIHRoaXMuZW5jcnlwdERhdGEoa2V5UHVibGljLCBcIlNhbXBsZSBEYXRhIGhlcmUgLSBNaWtlIEJvbmlmYWNpb1wiKVxuICAgICAgLnN1YnNjcmliZSgoc3RyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiRU5DUllQVEVEIFNUUklORzogXCIsIHN0cik7XG4gICAgICAgIHRlc3RTZXF1ZW5jZS5uZXh0KCdlbmNyeXB0ZWQgc3RyaW5nIHN1Y2Nlc3MnKTtcbiAgICAgIH0pXG5cbiAgICB9KVxuXG4gICAgY29uc3QgZW5jID0gXCJyN1VPdUVHQlo2amJWVE9JQnV2OWpGT0V0UmllZG1TMjdoZlc0MGs3WEtDVHNRNVZoV3VwMHF1MkJBMkFOWmFHS2lpL3VlaEovUlNQaXlmR2JKNmxlSnJhdDBtQTFoUHFIL1hvZGFCekxNRGlndmRZTTFOU1hGWk1EYTQwT3BMVUlYYlBsQXZ5YmpjR3U3QmFsK0xNQThodEhyRnUvT21NL2ZISTY2eE96enB1WFNZeDBPa1dqdFk4MXJVUTFGRmt2cmt4MmpHRlBaMHArTncvdjNRNGNKbmV0NlY2M3ZDdWVGbEQ3NDlWTWNWWG83cHZ6NEFJUHBCK0lPeTNrYnhhWVRQYWtMVmlvSkVSVTZHRk1YV2tFQ3VSdm9oaFM5Q0VUY09SWnRSVlJrdmhjSGszbHhnSWhmcW9qVUtZZ0Q2SzVkREVMRFBzV0lTK2lURzFYSVFJbGc9PVwiO1xuXG4gICAgLy8gREVDUllQVElPTlxuICAgIHRoaXMucGVtVG9DcnlwdG9LZXkoXG4gICAgICBwcml2YXRlS2V5LFxuICAgICAgYWxnb3JpdGhtLFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJkZWNyeXB0XCJdLFxuICAgICAgXCJwa2NzOFwiXG4gICAgKS5zdWJzY3JpYmUoKGtleSkgPT4ge1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkRFQ1JZUFQgPT09XCIsIGtleSlcblxuICAgICAgdGhpcy5kZWNyeXB0RGF0YShrZXksIGVuYylcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJFUlJPUjogXCIsIGVycik7XG4gICAgICAgICAgcmV0dXJuIEVNUFRZXG4gICAgICAgIH0pXG4gICAgICApLnN1YnNjcmliZSgoc3RyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiREVDUllQVEVEIFNUUklORzogXCIsIHN0cik7XG4gICAgICAgIHRlc3RTZXF1ZW5jZS5uZXh0KCdkZWNyeXB0ZWQgc3RyaW5nIHN1Y2Nlc3MnKTtcbiAgICAgIH0pXG5cbiAgICB9KVxuXG4gICAgcmV0dXJuIHRlc3RTZXF1ZW5jZSQ7XG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class EncryptionTestService {
|
|
4
|
+
constructor() { }
|
|
5
|
+
isBase64(str) {
|
|
6
|
+
const base64Pattern = /^(?:[A-Z0-9+/]{4})*(?:[A-Z0-9+/]{2}==|[A-Z0-9+/]{3}=)?$/i;
|
|
7
|
+
return base64Pattern.test(str);
|
|
8
|
+
}
|
|
9
|
+
isHexadecimal(str) {
|
|
10
|
+
const hexPattern = /^[0-9a-fA-F]+$/;
|
|
11
|
+
return hexPattern.test(str) && (str.length % 2 === 0);
|
|
12
|
+
}
|
|
13
|
+
hasHighEntropy(str) {
|
|
14
|
+
const uniqueChars = new Set(str).size;
|
|
15
|
+
return uniqueChars > str.length * 0.6;
|
|
16
|
+
}
|
|
17
|
+
isEncrypted(str) {
|
|
18
|
+
if (typeof str !== 'string') {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
if (this.isBase64(str) || this.isHexadecimal(str)) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return this.hasHighEntropy(str);
|
|
25
|
+
}
|
|
26
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EncryptionTestService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
27
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EncryptionTestService, providedIn: 'root' }); }
|
|
28
|
+
}
|
|
29
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EncryptionTestService, decorators: [{
|
|
30
|
+
type: Injectable,
|
|
31
|
+
args: [{
|
|
32
|
+
providedIn: 'root'
|
|
33
|
+
}]
|
|
34
|
+
}], ctorParameters: () => [] });
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi10ZXN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL3NlcnZpY2VzL3V0aWxzL2VuY3J5cHRpb24vZW5jcnlwdGlvbi10ZXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLHFCQUFxQjtJQUVoQyxnQkFBZ0IsQ0FBQztJQUVULFFBQVEsQ0FBQyxHQUFXO1FBQzFCLE1BQU0sYUFBYSxHQUFHLDBEQUEwRCxDQUFDO1FBQ2pGLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sYUFBYSxDQUFDLEdBQVc7UUFDL0IsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7UUFDcEMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLGNBQWMsQ0FBQyxHQUFXO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN0QyxPQUFPLFdBQVcsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUN4QyxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVc7UUFFckIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM1QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVsQyxDQUFDOytHQS9CVSxxQkFBcUI7bUhBQXJCLHFCQUFxQixjQUZwQixNQUFNOzs0RkFFUCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBFbmNyeXB0aW9uVGVzdFNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgcHJpdmF0ZSBpc0Jhc2U2NChzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJhc2U2NFBhdHRlcm4gPSAvXig/OltBLVowLTkrL117NH0pKig/OltBLVowLTkrL117Mn09PXxbQS1aMC05Ky9dezN9PSk/JC9pO1xuICAgIHJldHVybiBiYXNlNjRQYXR0ZXJuLnRlc3Qoc3RyKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNIZXhhZGVjaW1hbChzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhleFBhdHRlcm4gPSAvXlswLTlhLWZBLUZdKyQvO1xuICAgIHJldHVybiBoZXhQYXR0ZXJuLnRlc3Qoc3RyKSAmJiAoc3RyLmxlbmd0aCAlIDIgPT09IDApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNIaWdoRW50cm9weShzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVuaXF1ZUNoYXJzID0gbmV3IFNldChzdHIpLnNpemU7XG4gICAgcmV0dXJuIHVuaXF1ZUNoYXJzID4gc3RyLmxlbmd0aCAqIDAuNjtcbiAgfVxuXG4gIGlzRW5jcnlwdGVkKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0Jhc2U2NChzdHIpIHx8IHRoaXMuaXNIZXhhZGVjaW1hbChzdHIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5oYXNIaWdoRW50cm9weShzdHIpO1xuXG4gIH1cblxufVxuIl19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from "./asymmetrical-encryption.service";
|
|
2
|
+
export * from './symmetrical-encryption.service';
|
|
3
|
+
export * from './random';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL3NlcnZpY2VzL3V0aWxzL2VuY3J5cHRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGtDQUFrQyxDQUFDO0FBRWpELGNBQWMsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vYXN5bW1ldHJpY2FsLWVuY3J5cHRpb24uc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSAnLi9zeW1tZXRyaWNhbC1lbmNyeXB0aW9uLnNlcnZpY2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL3JhbmRvbSc7XG5cbiJdfQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export const Random = () => {
|
|
2
|
+
const typedArray = new Uint8Array(1);
|
|
3
|
+
const randomValue = crypto.getRandomValues(typedArray)[0];
|
|
4
|
+
const randomFloat = randomValue / Math.pow(2, 8);
|
|
5
|
+
return randomFloat;
|
|
6
|
+
};
|
|
7
|
+
export const RandomNumber = (min, max) => {
|
|
8
|
+
return Math.floor(Random() * max) + min;
|
|
9
|
+
};
|
|
10
|
+
export const RandomNumbers = (min, max, length) => {
|
|
11
|
+
const numbers = [];
|
|
12
|
+
for (let i = 0; i < length; i++)
|
|
13
|
+
numbers.push(Math.floor(Random() * max) + min);
|
|
14
|
+
return numbers;
|
|
15
|
+
};
|
|
16
|
+
export const RandomNumbersUnique = (min, max, length) => {
|
|
17
|
+
let count = 0;
|
|
18
|
+
// Adjust the length if it exceeds the number of unique numbers possible in the range
|
|
19
|
+
if (length > (max - min + 1)) {
|
|
20
|
+
console.error('error encountered');
|
|
21
|
+
length = max - min + 1;
|
|
22
|
+
}
|
|
23
|
+
console.log('length', length);
|
|
24
|
+
const numbers = [];
|
|
25
|
+
const maxAttempts = length * 100; // Safeguard to prevent infinite loops
|
|
26
|
+
while (numbers.length < length && count < maxAttempts) {
|
|
27
|
+
const num = Math.floor(Random() * max) + min;
|
|
28
|
+
if (!numbers.includes(num)) {
|
|
29
|
+
numbers.push(num);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (count >= maxAttempts) {
|
|
33
|
+
throw new Error('Maximum attempts exceeded while generating unique numbers');
|
|
34
|
+
}
|
|
35
|
+
return numbers;
|
|
36
|
+
};
|
|
37
|
+
export const RandomStr = () => {
|
|
38
|
+
const typedArray = new Uint8Array(8);
|
|
39
|
+
const array = new Uint32Array(1);
|
|
40
|
+
crypto.getRandomValues(array);
|
|
41
|
+
return array[0].toString(36);
|
|
42
|
+
};
|
|
43
|
+
export const RandomSignature = () => {
|
|
44
|
+
const typedArray = new Uint8Array(8);
|
|
45
|
+
const array = new Uint32Array(1);
|
|
46
|
+
crypto.getRandomValues(array);
|
|
47
|
+
return array[0];
|
|
48
|
+
};
|
|
49
|
+
export const UUID = () => {
|
|
50
|
+
return self.crypto.randomUUID();
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9lbmNyeXB0aW9uL3JhbmRvbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxFQUFFO0lBQ3pCLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3BDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDekQsTUFBTSxXQUFXLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ2hELE9BQU8sV0FBVyxDQUFBO0FBQ3BCLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVcsRUFBRSxHQUFXLEVBQUUsRUFBRTtJQUN2RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFBO0FBQ3pDLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQVcsRUFBRSxHQUFXLEVBQUUsTUFBYyxFQUFFLEVBQUU7SUFDeEUsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFBO0lBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFBO0lBQy9FLE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBVyxFQUFFLEdBQVcsRUFBRSxNQUFjLEVBQUUsRUFBRTtJQUM5RSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFZCxxRkFBcUY7SUFDckYsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUIsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzdCLE1BQU0sV0FBVyxHQUFHLE1BQU0sR0FBRyxHQUFHLENBQUUsQ0FBQyxzQ0FBc0M7SUFFekUsT0FBTyxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxLQUFLLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFFdEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFFN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxLQUFLLElBQUksV0FBVyxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFO0lBRTVCLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2hDLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDN0IsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBRTlCLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxHQUFHLEVBQUU7SUFFbEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDaEMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM3QixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUVqQixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtBQUNqQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgUmFuZG9tID0gKCkgPT4ge1xuICBjb25zdCB0eXBlZEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgY29uc3QgcmFuZG9tVmFsdWUgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHR5cGVkQXJyYXkpWzBdXG4gIGNvbnN0IHJhbmRvbUZsb2F0ID0gcmFuZG9tVmFsdWUgLyBNYXRoLnBvdygyLCA4KVxuICByZXR1cm4gcmFuZG9tRmxvYXRcbn1cblxuZXhwb3J0IGNvbnN0IFJhbmRvbU51bWJlciA9IChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpID0+IHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoUmFuZG9tKCkgKiBtYXgpICsgbWluXG59XG5cbmV4cG9ydCBjb25zdCBSYW5kb21OdW1iZXJzID0gKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpID0+IHtcbiAgY29uc3QgbnVtYmVyczogbnVtYmVyW10gPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSBudW1iZXJzLnB1c2goTWF0aC5mbG9vcihSYW5kb20oKSAqIG1heCkgKyBtaW4pXG4gIHJldHVybiBudW1iZXJzXG59XG5cbmV4cG9ydCBjb25zdCBSYW5kb21OdW1iZXJzVW5pcXVlID0gKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpID0+IHtcbiAgbGV0IGNvdW50ID0gMDtcblxuICAvLyBBZGp1c3QgdGhlIGxlbmd0aCBpZiBpdCBleGNlZWRzIHRoZSBudW1iZXIgb2YgdW5pcXVlIG51bWJlcnMgcG9zc2libGUgaW4gdGhlIHJhbmdlXG4gIGlmIChsZW5ndGggPiAobWF4IC0gbWluICsgMSkpIHtcbiAgICBjb25zb2xlLmVycm9yKCdlcnJvciBlbmNvdW50ZXJlZCcpO1xuICAgIGxlbmd0aCA9IG1heCAtIG1pbiArIDE7XG4gIH1cblxuICBjb25zb2xlLmxvZygnbGVuZ3RoJywgbGVuZ3RoKTtcbiAgY29uc3QgbnVtYmVyczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgbWF4QXR0ZW1wdHMgPSBsZW5ndGggKiAxMDAgOyAvLyBTYWZlZ3VhcmQgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wc1xuXG4gIHdoaWxlIChudW1iZXJzLmxlbmd0aCA8IGxlbmd0aCAmJiBjb3VudCA8IG1heEF0dGVtcHRzKSB7XG5cbiAgICBjb25zdCBudW0gPSBNYXRoLmZsb29yKFJhbmRvbSgpICogbWF4KSArIG1pbjtcblxuICAgIGlmICghbnVtYmVycy5pbmNsdWRlcyhudW0pKSB7XG4gICAgICBudW1iZXJzLnB1c2gobnVtKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY291bnQgPj0gbWF4QXR0ZW1wdHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gYXR0ZW1wdHMgZXhjZWVkZWQgd2hpbGUgZ2VuZXJhdGluZyB1bmlxdWUgbnVtYmVycycpO1xuICB9XG5cbiAgcmV0dXJuIG51bWJlcnM7XG59O1xuXG5leHBvcnQgY29uc3QgUmFuZG9tU3RyID0gKCkgPT4ge1xuXG4gIGNvbnN0IHR5cGVkQXJyYXkgPSBuZXcgVWludDhBcnJheSg4KVxuICBjb25zdCBhcnJheSA9IG5ldyBVaW50MzJBcnJheSgxKVxuICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KVxuICByZXR1cm4gYXJyYXlbMF0udG9TdHJpbmcoMzYpXG5cbn1cblxuZXhwb3J0IGNvbnN0IFJhbmRvbVNpZ25hdHVyZSA9ICgpID0+IHtcblxuICBjb25zdCB0eXBlZEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoOClcbiAgY29uc3QgYXJyYXkgPSBuZXcgVWludDMyQXJyYXkoMSlcbiAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSlcbiAgcmV0dXJuIGFycmF5WzBdXG5cbn1cblxuZXhwb3J0IGNvbnN0IFVVSUQgPSAoKSA9PiB7XG4gIHJldHVybiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKClcbn1cblxuXG4iXX0=
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import * as CryptoJS from 'crypto-js';
|
|
3
|
+
import { RandomSignature } from './random';
|
|
4
|
+
import { AppService } from '../app.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class SymmetricalEncryptionService {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.appService = inject(AppService);
|
|
9
|
+
// TODO: The APP ID is not a string, it is a function
|
|
10
|
+
this.appID = (this.appService.appID) ? this.appService.appID : '';
|
|
11
|
+
if (this.appID === '')
|
|
12
|
+
console.warn('No App Key has been define');
|
|
13
|
+
}
|
|
14
|
+
generateCipherKey() {
|
|
15
|
+
return (RandomSignature().toString() + RandomSignature().toString()).substring(0, 8);
|
|
16
|
+
}
|
|
17
|
+
encrypt(str, key = this.appID) {
|
|
18
|
+
if (!str || key === '')
|
|
19
|
+
return '';
|
|
20
|
+
let _key = CryptoJS.enc.Utf8.parse(key);
|
|
21
|
+
let _iv = CryptoJS.enc.Utf8.parse(key);
|
|
22
|
+
try {
|
|
23
|
+
const encrypted = CryptoJS.AES.encrypt(JSON.stringify(str), _key, {
|
|
24
|
+
keySize: 16,
|
|
25
|
+
iv: _iv,
|
|
26
|
+
mode: CryptoJS.mode.ECB,
|
|
27
|
+
padding: CryptoJS.pad.Pkcs7
|
|
28
|
+
});
|
|
29
|
+
return encrypted.toString();
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.log(error);
|
|
33
|
+
}
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
decrypt(str, key = this.appID) {
|
|
37
|
+
if (!str || key === '')
|
|
38
|
+
return;
|
|
39
|
+
let _key = CryptoJS.enc.Utf8.parse(key);
|
|
40
|
+
let _iv = CryptoJS.enc.Utf8.parse(key);
|
|
41
|
+
try {
|
|
42
|
+
return CryptoJS.AES.decrypt(str, _key, {
|
|
43
|
+
keySize: 16,
|
|
44
|
+
iv: _iv,
|
|
45
|
+
mode: CryptoJS.mode.ECB,
|
|
46
|
+
padding: CryptoJS.pad.Pkcs7
|
|
47
|
+
}).toString(CryptoJS.enc.Utf8);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.log(error);
|
|
51
|
+
}
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
createSignature(url, len = 16) {
|
|
55
|
+
const sig = CryptoJS.SHA256(url).toString(CryptoJS.enc.Hex);
|
|
56
|
+
return sig.substring(0, len).toUpperCase();
|
|
57
|
+
}
|
|
58
|
+
normalizeURL(url) {
|
|
59
|
+
const normalizedURL = url.replace(/(https?:\/\/)?(www\.)?/, '').replace(/\/+$/, '');
|
|
60
|
+
return normalizedURL;
|
|
61
|
+
}
|
|
62
|
+
generateSignature(url) {
|
|
63
|
+
const normalizedURL = this.normalizeURL(url);
|
|
64
|
+
const hash = CryptoJS.SHA256(normalizedURL);
|
|
65
|
+
const signature = hash.toString(CryptoJS.enc.Hex);
|
|
66
|
+
return signature;
|
|
67
|
+
}
|
|
68
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SymmetricalEncryptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
69
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SymmetricalEncryptionService, providedIn: 'root' }); }
|
|
70
|
+
}
|
|
71
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SymmetricalEncryptionService, decorators: [{
|
|
72
|
+
type: Injectable,
|
|
73
|
+
args: [{
|
|
74
|
+
providedIn: 'root'
|
|
75
|
+
}]
|
|
76
|
+
}], ctorParameters: () => [] });
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltbWV0cmljYWwtZW5jcnlwdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9lbmNyeXB0aW9uL3N5bW1ldHJpY2FsLWVuY3J5cHRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLNUMsTUFBTSxPQUFPLDRCQUE0QjtJQU12QztRQUZRLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7UUFHckMscURBQXFEO1FBQ3JELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ2pFLElBQUcsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3RGLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBUSxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSztRQUVoQyxJQUFHLENBQUMs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LENBQUE7UUFDakQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQzsrR0FqRlUsNEJBQTRCO21IQUE1Qiw0QkFBNEIsY0FGM0IsTUFBTTs7NEZBRVAsNEJBQTRCO2tCQUh4QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgQ3J5cHRvSlMgZnJvbSAnY3J5cHRvLWpzJztcblxuaW1wb3J0IHsgUmFuZG9tU2lnbmF0dXJlIH0gZnJvbSAnLi9yYW5kb20nO1xuaW1wb3J0IHsgQXBwU2VydmljZSB9IGZyb20gJy4uL2FwcC5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU3ltbWV0cmljYWxFbmNyeXB0aW9uU2VydmljZSB7XG5cbiAgYXBwSUQ6IHN0cmluZzsgLy8gQVBQIFNFUlZJQ0UgVE8gTUFOQUdFUiBFTkNSWVBUSU9OIEtFWVxuXG4gIHByaXZhdGUgYXBwU2VydmljZSA9IGluamVjdChBcHBTZXJ2aWNlKVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFRPRE86IFRoZSBBUFAgSUQgaXMgbm90IGEgc3RyaW5nLCBpdCBpcyBhIGZ1bmN0aW9uXG4gICAgdGhpcy5hcHBJRCA9ICh0aGlzLmFwcFNlcnZpY2UuYXBwSUQpID8gdGhpcy5hcHBTZXJ2aWNlLmFwcElEIDogJydcbiAgICBpZih0aGlzLmFwcElEID09PSAnJykgY29uc29sZS53YXJuKCdObyBBcHAgS2V5IGhhcyBiZWVuIGRlZmluZScpXG4gIH1cblxuICBnZW5lcmF0ZUNpcGhlcktleSgpIHtcbiAgICByZXR1cm4gKFJhbmRvbVNpZ25hdHVyZSgpLnRvU3RyaW5nKCkgKyBSYW5kb21TaWduYXR1cmUoKS50b1N0cmluZygpKS5zdWJzdHJpbmcoMCwgOClcbiAgfVxuXG4gIGVuY3J5cHQoc3RyOiBhbnksIGtleSA9IHRoaXMuYXBwSUQpIHtcblxuICAgIGlmKCFzdHIgfHwga2V5ID09PSAnJykgcmV0dXJuICcnXG5cbiAgICBsZXQgX2tleSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKGtleSlcbiAgICBsZXQgX2l2ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2Uoa2V5KVxuXG4gICAgdHJ5IHtcblxuICAgIGNvbnN0IGVuY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5lbmNyeXB0KFxuICAgICAgSlNPTi5zdHJpbmdpZnkoc3RyKSwgX2tleSwge1xuICAgICAgICBrZXlTaXplOiAxNixcbiAgICAgICAgaXY6IF9pdixcbiAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5FQ0IsXG4gICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzN1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBlbmNyeXB0ZWQudG9TdHJpbmcoKVxuXG4gICAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGRlY3J5cHQoc3RyOiBzdHJpbmcsIGtleSA9IHRoaXMuYXBwSUQpIHtcblxuICAgIGlmKCFzdHIgfHwga2V5ID09PSAnJykgcmV0dXJuXG5cbiAgICBsZXQgX2tleSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKGtleSlcbiAgICBsZXQgX2l2ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2Uoa2V5KVxuXG4gICAgdHJ5IHtcblxuICAgIHJldHVybiBDcnlwdG9KUy5BRVMuZGVjcnlwdChcbiAgICAgIHN0ciwgX2tleSwge1xuICAgICAgICBrZXlTaXplOiAxNixcbiAgICAgICAgaXY6IF9pdixcbiAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5FQ0IsXG4gICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzN1xuICAgICAgfSkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpO1xuXG4gICAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGNyZWF0ZVNpZ25hdHVyZSh1cmw6IHN0cmluZywgbGVuID0gMTYpIHtcbiAgICBjb25zdCBzaWcgPSBDcnlwdG9KUy5TSEEyNTYodXJsKS50b1N0cmluZyhDcnlwdG9KUy5lbmMuSGV4KVxuICAgIHJldHVybiBzaWcuc3Vic3RyaW5nKDAsIGxlbikudG9VcHBlckNhc2UoKVxuICB9XG5cbiAgbm9ybWFsaXplVVJMKHVybDogc3RyaW5nKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFVSTCA9IHVybC5yZXBsYWNlKC8oaHR0cHM/OlxcL1xcLyk/KHd3d1xcLik/LywgJycpLnJlcGxhY2UoL1xcLyskLywgJycpO1xuICAgIHJldHVybiBub3JtYWxpemVkVVJMO1xuICB9XG5cbiAgZ2VuZXJhdGVTaWduYXR1cmUodXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBub3JtYWxpemVkVVJMID0gdGhpcy5ub3JtYWxpemVVUkwodXJsKVxuICAgIGNvbnN0IGhhc2ggPSBDcnlwdG9KUy5TSEEyNTYobm9ybWFsaXplZFVSTClcbiAgICBjb25zdCBzaWduYXR1cmUgPSBoYXNoLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5IZXgpXG4gICAgcmV0dXJuIHNpZ25hdHVyZTtcbiAgfVxuXG59XG4iXX0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class HeadersService {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.headers = {};
|
|
7
|
+
}
|
|
8
|
+
generateHeaders(headers) {
|
|
9
|
+
const allHeaders = headers ? { ...this.headers, ...headers } : {};
|
|
10
|
+
return { headers: new HttpHeaders(allHeaders) };
|
|
11
|
+
}
|
|
12
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeadersService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
13
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeadersService, providedIn: 'root' }); }
|
|
14
|
+
}
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeadersService, decorators: [{
|
|
16
|
+
type: Injectable,
|
|
17
|
+
args: [{
|
|
18
|
+
providedIn: 'root'
|
|
19
|
+
}]
|
|
20
|
+
}] });
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVycy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9oZWFkZXJzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyxjQUFjO0lBSDNCO1FBS0UsWUFBTyxHQUFHLEVBQUUsQ0FBQTtLQVNiO0lBUEMsZUFBZSxDQUFDLE9BQWdDO1FBRTlDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQTtJQUVqRCxDQUFDOytHQVRVLGNBQWM7bUhBQWQsY0FBYyxjQUZiLE1BQU07OzRGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEhlYWRlcnNTZXJ2aWNlIHtcblxuICBoZWFkZXJzID0ge31cblxuICBnZW5lcmF0ZUhlYWRlcnMoaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiB7IGhlYWRlcnM6IEh0dHBIZWFkZXJzIH0ge1xuXG4gICAgY29uc3QgYWxsSGVhZGVycyA9IGhlYWRlcnMgPyB7IC4uLnRoaXMuaGVhZGVycywgLi4uaGVhZGVycyB9IDoge31cbiAgICByZXR1cm4geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoYWxsSGVhZGVycykgfVxuXG4gIH1cblxufVxuIl19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './app.service';
|
|
2
|
+
export * from './headers.service';
|
|
3
|
+
export * from './path-query.service';
|
|
4
|
+
export * from './utils.service';
|
|
5
|
+
export * from './encryption/index';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL3NlcnZpY2VzL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGlCQUFpQixDQUFDO0FBRWhDLGNBQWMsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FwcC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vaGVhZGVycy5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcGF0aC1xdWVyeS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMuc2VydmljZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vZW5jcnlwdGlvbi9pbmRleCc7XG5cbiJdfQ==
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Inject, Injectable, Optional } from '@angular/core';
|
|
2
|
+
import { ApiRequest } from '../request-manager-state-service/models';
|
|
3
|
+
import { SettingOptions } from '../local-storage-manager-service';
|
|
4
|
+
import { CONFIG_SETTINGS_TOKEN } from '../../models/config-token.model';
|
|
5
|
+
import { ConfigHTTPOptions, ConfigOptions, LocalStorageOptions } from '../request-manager-services';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../request-manager-services";
|
|
8
|
+
export class ObjectMergerService {
|
|
9
|
+
constructor(configOptions) {
|
|
10
|
+
this.configOptions = configOptions;
|
|
11
|
+
if (!this.configOptions)
|
|
12
|
+
this.configOptions = ConfigOptions.adapt();
|
|
13
|
+
}
|
|
14
|
+
mergeOptions(options = ApiRequest.adapt()) {
|
|
15
|
+
const configForRoot = (this.configOptions?.httpRequestOptions) ? this.configOptions.httpRequestOptions : ConfigHTTPOptions.adapt();
|
|
16
|
+
const mergedOptions = ApiRequest.adapt(options);
|
|
17
|
+
mergedOptions.server = (options && options.server === '') ? configForRoot?.server || '' : options.server;
|
|
18
|
+
mergedOptions.path = [...options.path || [], ...configForRoot?.path || []];
|
|
19
|
+
mergedOptions.headers = { ...options.headers || {}, ...configForRoot?.headers || {} };
|
|
20
|
+
mergedOptions.retry = (options && (options?.retry?.times !== 0 || options?.retry?.delay !== 3)) ? options.retry : configForRoot?.retry || { times: 0, delay: 3 };
|
|
21
|
+
mergedOptions.polling = (options && options?.polling !== 0) ? options.polling : configForRoot?.polling || 0;
|
|
22
|
+
mergedOptions.displayError = (options && options?.displayError) ? options.displayError : configForRoot?.displayError || false;
|
|
23
|
+
mergedOptions.stream = (options && options?.stream) ? options.stream : configForRoot?.stream || false;
|
|
24
|
+
return mergedOptions;
|
|
25
|
+
}
|
|
26
|
+
mergeStorageOptions(options = SettingOptions.adapt()) {
|
|
27
|
+
const configForRoot = (this.configOptions?.LocalStorageOptions) ? this.configOptions.LocalStorageOptions : LocalStorageOptions.adapt();
|
|
28
|
+
const configForRootOptions = configForRoot.options || LocalStorageOptions.adapt().options;
|
|
29
|
+
const mergedOptions = SettingOptions.adapt(options);
|
|
30
|
+
mergedOptions.storage = (options && options.storage === 0) ? configForRootOptions?.storage || 0 : options.storage;
|
|
31
|
+
mergedOptions.expires = (options && options.expires === 0) ? configForRootOptions?.expires || 0 : options.expires;
|
|
32
|
+
mergedOptions.expiresIn = (options && options.expiresIn === '') ? configForRootOptions?.expiresIn || '' : options.expiresIn;
|
|
33
|
+
mergedOptions.encrypted = (options && !options.encrypted) ? configForRootOptions?.encrypted || false : options.encrypted;
|
|
34
|
+
return mergedOptions;
|
|
35
|
+
}
|
|
36
|
+
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 }); }
|
|
37
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ObjectMergerService, providedIn: 'root' }); }
|
|
38
|
+
}
|
|
39
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ObjectMergerService, decorators: [{
|
|
40
|
+
type: Injectable,
|
|
41
|
+
args: [{
|
|
42
|
+
providedIn: 'root'
|
|
43
|
+
}]
|
|
44
|
+
}], ctorParameters: () => [{ type: i1.ConfigOptions, decorators: [{
|
|
45
|
+
type: Inject,
|
|
46
|
+
args: [CONFIG_SETTINGS_TOKEN]
|
|
47
|
+
}, {
|
|
48
|
+
type: Optional
|
|
49
|
+
}] }] });
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LW1lcmdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9vYmplY3QtbWVyZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7QUFLcEcsTUFBTSxPQUFPLG1CQUFtQjtJQUU5QixZQUErRCxhQUE2QjtRQUE3QixrQkFBYSxHQUFiLGFBQWEsQ0FBZ0I7UUFDeEYsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDdEUsQ0FBQztJQUVGLFlBQVksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRTtRQUV2QyxNQUFNLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDbEksTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUUvQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFBO1FBRXhHLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLEdBQUcsYUFBYSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUUsQ0FBQTtRQUU1RSxhQUFhLENBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxHQUFHLGFBQWEsRUFBRSxPQUFPLElBQUksRUFBRSxFQUFFLENBQUE7UUFFckYsYUFBYSxDQUFDLEtBQUssR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxLQUFLLENBQUMsSUFBSSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFakssYUFBYSxDQUFDLE9BQU8sR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLEVBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQztRQUU1RyxhQUFhLENBQUMsWUFBWSxHQUFHLENBQUMsT0FBTyxJQUFJLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLFlBQVksSUFBSSxLQUFLLENBQUM7UUFFOUgsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDO1FBRXRHLE9BQU8sYUFBYSxDQUFDO0lBRXZCLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRTtRQUVsRCxNQUFNLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDdEksTUFBTSxvQkFBb0IsR0FBRyxhQUFhLENBQUMsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQTtRQUV6RixNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRW5ELGFBQWEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQTtRQUVqSCxhQUFhLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUE7UUFFakgsYUFBYSxDQUFDLFNBQVMsR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFBO1FBRTNILGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLFNBQVMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUE7UUFFeEgsT0FBTyxhQUFhLENBQUM7SUFFdkIsQ0FBQzsrR0E5Q1UsbUJBQW1CLGtCQUVWLHFCQUFxQjttSEFGOUIsbUJBQW1CLGNBRmxCLE1BQU07OzRGQUVQLG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQUdjLE1BQU07MkJBQUMscUJBQXFCOzswQkFBRyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBcGlSZXF1ZXN0IH0gZnJvbSAnLi4vcmVxdWVzdC1tYW5hZ2VyLXN0YXRlLXNlcnZpY2UvbW9kZWxzJztcbmltcG9ydCB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSAnLi4vbG9jYWwtc3RvcmFnZS1tYW5hZ2VyLXNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDT05GSUdfU0VUVElOR1NfVE9LRU4gfSBmcm9tICcuLi8uLi9tb2RlbHMvY29uZmlnLXRva2VuLm1vZGVsJztcbmltcG9ydCB7IENvbmZpZ0hUVFBPcHRpb25zLCBDb25maWdPcHRpb25zLCBMb2NhbFN0b3JhZ2VPcHRpb25zIH0gZnJvbSAnLi4vcmVxdWVzdC1tYW5hZ2VyLXNlcnZpY2VzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgT2JqZWN0TWVyZ2VyU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChDT05GSUdfU0VUVElOR1NfVE9LRU4pIEBPcHRpb25hbCgpIHByaXZhdGUgY29uZmlnT3B0aW9ucz86IENvbmZpZ09wdGlvbnMpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWdPcHRpb25zKSB0aGlzLmNvbmZpZ09wdGlvbnMgPSBDb25maWdPcHRpb25zLmFkYXB0KClcbiAgIH1cblxuICBtZXJnZU9wdGlvbnMob3B0aW9ucyA9IEFwaVJlcXVlc3QuYWRhcHQoKSkge1xuXG4gICAgY29uc3QgY29uZmlnRm9yUm9vdCA9ICh0aGlzLmNvbmZpZ09wdGlvbnM/Lmh0dHBSZXF1ZXN0T3B0aW9ucykgPyB0aGlzLmNvbmZpZ09wdGlvbnMuaHR0cFJlcXVlc3RPcHRpb25zIDogQ29uZmlnSFRUUE9wdGlvbnMuYWRhcHQoKVxuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSBBcGlSZXF1ZXN0LmFkYXB0KG9wdGlvbnMpXG5cbiAgICBtZXJnZWRPcHRpb25zLnNlcnZlciA9IChvcHRpb25zICYmIG9wdGlvbnMuc2VydmVyID09PSAnJykgPyBjb25maWdGb3JSb290Py5zZXJ2ZXIgfHwgJycgOiBvcHRpb25zLnNlcnZlclxuXG4gICAgbWVyZ2VkT3B0aW9ucy5wYXRoID0gWyAuLi5vcHRpb25zLnBhdGggfHwgW10sIC4uLmNvbmZpZ0ZvclJvb3Q/LnBhdGggfHwgW10gXVxuXG4gICAgbWVyZ2VkT3B0aW9ucy5oZWFkZXJzID0geyAuLi5vcHRpb25zLmhlYWRlcnMgfHwge30sIC4uLmNvbmZpZ0ZvclJvb3Q/LmhlYWRlcnMgfHwge30gfVxuXG4gICAgbWVyZ2VkT3B0aW9ucy5yZXRyeSA9IChvcHRpb25zICYmIChvcHRpb25zPy5yZXRyeT8udGltZXMgIT09IDAgfHwgb3B0aW9ucz8ucmV0cnk/LmRlbGF5ICE9PSAzKSkgPyBvcHRpb25zLnJldHJ5IDogY29uZmlnRm9yUm9vdD8ucmV0cnkgfHwgeyB0aW1lczogMCwgZGVsYXk6IDMgfTtcblxuICAgIG1lcmdlZE9wdGlvbnMucG9sbGluZyA9IChvcHRpb25zICYmIG9wdGlvbnM/LnBvbGxpbmcgIT09IDApID8gb3B0aW9ucy5wb2xsaW5nIDogY29uZmlnRm9yUm9vdD8ucG9sbGluZyB8fCAwO1xuXG4gICAgbWVyZ2VkT3B0aW9ucy5kaXNwbGF5RXJyb3IgPSAob3B0aW9ucyAmJiBvcHRpb25zPy5kaXNwbGF5RXJyb3IpID8gb3B0aW9ucy5kaXNwbGF5RXJyb3IgOiBjb25maWdGb3JSb290Py5kaXNwbGF5RXJyb3IgfHwgZmFsc2U7XG5cbiAgICBtZXJnZWRPcHRpb25zLnN0cmVhbSA9IChvcHRpb25zICYmIG9wdGlvbnM/LnN0cmVhbSkgPyBvcHRpb25zLnN0cmVhbSA6IGNvbmZpZ0ZvclJvb3Q/LnN0cmVhbSB8fCBmYWxzZTtcblxuICAgIHJldHVybiBtZXJnZWRPcHRpb25zO1xuXG4gIH1cblxuICBtZXJnZVN0b3JhZ2VPcHRpb25zKG9wdGlvbnMgPSBTZXR0aW5nT3B0aW9ucy5hZGFwdCgpKSB7XG5cbiAgICBjb25zdCBjb25maWdGb3JSb290ID0gKHRoaXMuY29uZmlnT3B0aW9ucz8uTG9jYWxTdG9yYWdlT3B0aW9ucykgPyB0aGlzLmNvbmZpZ09wdGlvbnMuTG9jYWxTdG9yYWdlT3B0aW9ucyA6IExvY2FsU3RvcmFnZU9wdGlvbnMuYWRhcHQoKVxuICAgIGNvbnN0IGNvbmZpZ0ZvclJvb3RPcHRpb25zID0gY29uZmlnRm9yUm9vdC5vcHRpb25zIHx8IExvY2FsU3RvcmFnZU9wdGlvbnMuYWRhcHQoKS5vcHRpb25zXG5cbiAgICBjb25zdCBtZXJnZWRPcHRpb25zID0gU2V0dGluZ09wdGlvbnMuYWRhcHQob3B0aW9ucylcblxuICAgIG1lcmdlZE9wdGlvbnMuc3RvcmFnZSA9IChvcHRpb25zICYmIG9wdGlvbnMuc3RvcmFnZSA9PT0gMCkgPyBjb25maWdGb3JSb290T3B0aW9ucz8uc3RvcmFnZSB8fCAwIDogb3B0aW9ucy5zdG9yYWdlXG5cbiAgICBtZXJnZWRPcHRpb25zLmV4cGlyZXMgPSAob3B0aW9ucyAmJiBvcHRpb25zLmV4cGlyZXMgPT09IDApID8gY29uZmlnRm9yUm9vdE9wdGlvbnM/LmV4cGlyZXMgfHwgMCA6IG9wdGlvbnMuZXhwaXJlc1xuXG4gICAgbWVyZ2VkT3B0aW9ucy5leHBpcmVzSW4gPSAob3B0aW9ucyAmJiBvcHRpb25zLmV4cGlyZXNJbiA9PT0gJycpID8gY29uZmlnRm9yUm9vdE9wdGlvbnM/LmV4cGlyZXNJbiB8fCAnJyA6IG9wdGlvbnMuZXhwaXJlc0luXG5cbiAgICBtZXJnZWRPcHRpb25zLmVuY3J5cHRlZCA9IChvcHRpb25zICYmICFvcHRpb25zLmVuY3J5cHRlZCkgPyBjb25maWdGb3JSb290T3B0aW9ucz8uZW5jcnlwdGVkIHx8IGZhbHNlIDogb3B0aW9ucy5lbmNyeXB0ZWRcblxuICAgIHJldHVybiBtZXJnZWRPcHRpb25zO1xuXG4gIH1cblxufVxuIl19
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class PathQueryService {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.removeEmptyParams = (obj) => Object.fromEntries(Object.entries(obj)
|
|
6
|
+
.map(([key, value]) => [key, value && typeof value === 'object' ? this.removeEmptyParams(value) : value])
|
|
7
|
+
.filter(([_, value]) => value !== undefined && value !== ""));
|
|
8
|
+
}
|
|
9
|
+
buildAPIPath(server, params) {
|
|
10
|
+
server = (Array.isArray(server)) ? server.join('/') : server;
|
|
11
|
+
const pathObjects = (params) ? params.filter((path) => (!this.isObject(path))) : [];
|
|
12
|
+
const queryObjects = (params) ? params.filter((path) => (this.isObject(path))) : [];
|
|
13
|
+
const query = this.removeEmptyParams(queryObjects.reduce((r, c) => {
|
|
14
|
+
Object.entries(c).forEach(([key, value]) => {
|
|
15
|
+
r[key] = Array.isArray(value) ? value.join(',') : value;
|
|
16
|
+
});
|
|
17
|
+
return r;
|
|
18
|
+
}, {}));
|
|
19
|
+
let path = this.buildRestPath(server, pathObjects);
|
|
20
|
+
return (Object.keys(query).length > 0) ? path + '?' + this.buildQueryPath(query) : path;
|
|
21
|
+
}
|
|
22
|
+
buildRestPath(server, params) {
|
|
23
|
+
server = (server) ? server : '';
|
|
24
|
+
server = (server.charAt(0) === '/') ? server.substring(1) : server;
|
|
25
|
+
return this.cleanUrlPath(server + '/' + params.join('/'));
|
|
26
|
+
}
|
|
27
|
+
buildQueryPath(params) {
|
|
28
|
+
const searchParams = new URLSearchParams();
|
|
29
|
+
for (const key in params) {
|
|
30
|
+
if (Array.isArray(params[key])) {
|
|
31
|
+
params[key].forEach((value) => searchParams.append(key, value));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
searchParams.append(key, params[key]);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return searchParams.toString();
|
|
38
|
+
}
|
|
39
|
+
cleanUrlPath(str) {
|
|
40
|
+
return str.replace(/([^:]\/)\/+/g, "$1").replace(/\/$/, '');
|
|
41
|
+
}
|
|
42
|
+
isObject(val) {
|
|
43
|
+
return (val === null) ? false : ((typeof val === 'function') || (typeof val === 'object'));
|
|
44
|
+
}
|
|
45
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PathQueryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
46
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PathQueryService, providedIn: 'root' }); }
|
|
47
|
+
}
|
|
48
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PathQueryService, decorators: [{
|
|
49
|
+
type: Injectable,
|
|
50
|
+
args: [{
|
|
51
|
+
providedIn: 'root'
|
|
52
|
+
}]
|
|
53
|
+
}] });
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC1xdWVyeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9wYXRoLXF1ZXJ5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLGdCQUFnQjtJQUg3QjtRQXlEVSxzQkFBaUIsR0FBRyxDQUFDLEdBQVEsRUFBdUIsRUFBRSxDQUM1RCxNQUFNLENBQUMsV0FBVyxDQUNoQixNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQzthQUNoQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQ3BCLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQ2xGO2FBQ0EsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUMvRCxDQUFBO0tBRUo7SUE3REMsWUFBWSxDQUFDLE1BQXVCLEVBQUUsTUFBa0I7UUFFdEQsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7UUFFNUQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVEsRUFB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QUMsR0FBUTtRQUN2QixPQUFPLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQyxPQUFPLEdBQUcsS0FBSyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFFLENBQUE7SUFDOUYsQ0FBQzsrR0FwRFUsZ0JBQWdCO21IQUFoQixnQkFBZ0IsY0FGZixNQUFNOzs0RkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQYXRoUXVlcnlTZXJ2aWNlIHtcblxuICBidWlsZEFQSVBhdGgoc2VydmVyOiBzdHJpbmd8c3RyaW5nW10sIHBhcmFtcz86IGFueVtdfGFueSkge1xuXG4gICAgc2VydmVyID0gKEFycmF5LmlzQXJyYXkoc2VydmVyKSkgPyBzZXJ2ZXIuam9pbignLycpIDogc2VydmVyXG5cbiAgICBjb25zdCBwYXRoT2JqZWN0cyA9IChwYXJhbXMpID8gcGFyYW1zLmZpbHRlcigocGF0aDphbnkpID0+ICghdGhpcy5pc09iamVjdChwYXRoKSkpIDogW11cbiAgICBjb25zdCBxdWVyeU9iamVjdHMgPSAocGFyYW1zKSA/IHBhcmFtcy5maWx0ZXIoKHBhdGg6YW55KSA9PiAodGhpcy5pc09iamVjdChwYXRoKSkpIDogW11cblxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5yZW1vdmVFbXB0eVBhcmFtcyhxdWVyeU9iamVjdHMucmVkdWNlKChyOiBhbnksIGM6IGFueSkgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoYykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIHJba2V5XSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbignLCcpIDogdmFsdWVcbiAgICAgIH0pXG4gICAgICByZXR1cm4gclxuICAgIH0sIHt9KSlcblxuICAgIGxldCBwYXRoID0gdGhpcy5idWlsZFJlc3RQYXRoKHNlcnZlciwgcGF0aE9iamVjdHMpXG5cbiAgICByZXR1cm4oT2JqZWN0LmtleXMocXVlcnkpLmxlbmd0aCA+IDApID8gcGF0aCArICc/JyArIHRoaXMuYnVpbGRRdWVyeVBhdGgocXVlcnkpIDogcGF0aFxuXG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUmVzdFBhdGgoc2VydmVyOiBzdHJpbmcsIHBhcmFtczogYW55W10pOiBzdHJpbmcge1xuICAgIHNlcnZlciA9IChzZXJ2ZXIpID8gc2VydmVyIDogJydcbiAgICBzZXJ2ZXIgPSAoc2VydmVyLmNoYXJBdCgwKSA9PT0gJy8nKSA/IHNlcnZlci5zdWJzdHJpbmcoMSkgOiBzZXJ2ZXJcbiAgICByZXR1cm4gdGhpcy5jbGVhblVybFBhdGgoc2VydmVyICsnLycrIHBhcmFtcy5qb2luKCcvJykpXG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUXVlcnlQYXRoKHBhcmFtczogYW55KTogc3RyaW5nIHtcblxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gcGFyYW1zKSB7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtc1trZXldKSkge1xuICAgICAgICBwYXJhbXNba2V5XS5mb3JFYWNoKCh2YWx1ZTogYW55KSA9PiBzZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBwYXJhbXNba2V5XSk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gc2VhcmNoUGFyYW1zLnRvU3RyaW5nKClcblxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhblVybFBhdGgoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgXCIkMVwiKS5yZXBsYWNlKC9cXC8kLywnJylcbiAgfVxuXG4gIHByaXZhdGUgaXNPYmplY3QodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHZhbCA9PT0gbnVsbCkgPyBmYWxzZSA6ICggKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHx8ICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JykgKVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVFbXB0eVBhcmFtcyA9IChvYmo6IGFueSk6IFJlY29yZDxzdHJpbmcsIGFueT4gPT5cbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhvYmopXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgICBba2V5LCB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gdGhpcy5yZW1vdmVFbXB0eVBhcmFtcyh2YWx1ZSkgOiB2YWx1ZV1cbiAgICAgICAgKVxuICAgICAgICAuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBcIlwiKVxuICAgIClcblxufVxuIl19
|