@posiwise/common-services 0.1.88 → 0.1.90
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/fesm2022/posiwise-common-services.mjs +164 -191
- package/fesm2022/posiwise-common-services.mjs.map +1 -1
- package/lib/user.service.d.ts +1 -0
- package/package.json +11 -10
- package/esm2022/index.mjs +0 -47
- package/esm2022/lib/ab-test.service.mjs +0 -55
- package/esm2022/lib/ahoy.service.mjs +0 -93
- package/esm2022/lib/auth.service.mjs +0 -322
- package/esm2022/lib/base-http.service.mjs +0 -98
- package/esm2022/lib/brain-api-http.service.mjs +0 -26
- package/esm2022/lib/brain.service.mjs +0 -21
- package/esm2022/lib/common-services.interface.mjs +0 -2
- package/esm2022/lib/common-services.module.mjs +0 -23
- package/esm2022/lib/common.service.mjs +0 -134
- package/esm2022/lib/custom-preloading.service.mjs +0 -38
- package/esm2022/lib/dashboard.service.mjs +0 -21
- package/esm2022/lib/data.service.mjs +0 -21
- package/esm2022/lib/date-formatter.service.mjs +0 -82
- package/esm2022/lib/effects/user.effects.mjs +0 -27
- package/esm2022/lib/form-helper.service.mjs +0 -27
- package/esm2022/lib/geo.service.mjs +0 -40
- package/esm2022/lib/google-analytics.service.mjs +0 -121
- package/esm2022/lib/group.service.mjs +0 -122
- package/esm2022/lib/hopscotch.service.mjs +0 -48
- package/esm2022/lib/integrations-api-http.service.mjs +0 -28
- package/esm2022/lib/link-loader.service.mjs +0 -50
- package/esm2022/lib/local-storage.service.mjs +0 -32
- package/esm2022/lib/logo-caching.service.mjs +0 -65
- package/esm2022/lib/mailbox.service.mjs +0 -66
- package/esm2022/lib/main-api-http.service.mjs +0 -26
- package/esm2022/lib/notification.service.mjs +0 -70
- package/esm2022/lib/number-picker.service.mjs +0 -43
- package/esm2022/lib/permission.service.mjs +0 -252
- package/esm2022/lib/primeNgHelper.mjs +0 -18
- package/esm2022/lib/product.service.mjs +0 -78
- package/esm2022/lib/profile.service.mjs +0 -64
- package/esm2022/lib/qualification.service.mjs +0 -29
- package/esm2022/lib/script-loader.service.mjs +0 -79
- package/esm2022/lib/secure-token-storage.service.mjs +0 -264
- package/esm2022/lib/sentry.service.mjs +0 -384
- package/esm2022/lib/seo.service.mjs +0 -43
- package/esm2022/lib/socket.service.mjs +0 -29
- package/esm2022/lib/subscription.service.mjs +0 -129
- package/esm2022/lib/tag.service.mjs +0 -101
- package/esm2022/lib/tips.service.mjs +0 -38
- package/esm2022/lib/toast.service.mjs +0 -85
- package/esm2022/lib/user.service.mjs +0 -202
- package/esm2022/lib/validation.service.mjs +0 -36
- package/esm2022/lib/window.service.mjs +0 -20
- package/esm2022/posiwise-common-services.mjs +0 -5
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import { Inject, Injectable } from '@angular/core';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export class ScriptLoaderService {
|
|
5
|
-
constructor(document) {
|
|
6
|
-
this.document = document;
|
|
7
|
-
this._scripts = {};
|
|
8
|
-
}
|
|
9
|
-
load(tag, ...scripts) {
|
|
10
|
-
scripts.forEach((src) => {
|
|
11
|
-
if (!this._scripts[src]) {
|
|
12
|
-
this._scripts[src] = { src, loaded: false };
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
const promises = [];
|
|
16
|
-
scripts.forEach(src => promises.push(this.loadScript(tag, src)));
|
|
17
|
-
return Promise.all(promises);
|
|
18
|
-
}
|
|
19
|
-
loadScripts(tag, scripts, loadOnce) {
|
|
20
|
-
loadOnce = loadOnce || false;
|
|
21
|
-
scripts.forEach((script) => {
|
|
22
|
-
if (!this._scripts[script]) {
|
|
23
|
-
this._scripts[script] = { src: script, loaded: false };
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
const promises = [];
|
|
27
|
-
scripts.forEach(script => promises.push(this.loadScript(tag, script, loadOnce)));
|
|
28
|
-
return Promise.all(promises);
|
|
29
|
-
}
|
|
30
|
-
loadScript(tag, src, loadOnce) {
|
|
31
|
-
const isLoad = loadOnce || false;
|
|
32
|
-
if (!this._scripts[src]) {
|
|
33
|
-
this._scripts[src] = { src, loaded: false };
|
|
34
|
-
}
|
|
35
|
-
return new Promise((resolve, _reject) => {
|
|
36
|
-
// resolve if already loaded
|
|
37
|
-
if (this._scripts[src].loaded && isLoad) {
|
|
38
|
-
// NOSONAR
|
|
39
|
-
resolve({ src, loaded: true });
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
// load script tag
|
|
43
|
-
const scriptTag = document.createElement('script');
|
|
44
|
-
scriptTag.type = 'text/javascript';
|
|
45
|
-
scriptTag.src = this._scripts[src].src;
|
|
46
|
-
scriptTag.onload = () => {
|
|
47
|
-
this._scripts[src].loaded = true;
|
|
48
|
-
resolve({ src, loaded: true });
|
|
49
|
-
};
|
|
50
|
-
scriptTag.onerror = () => {
|
|
51
|
-
// Handle script loading error (if needed)
|
|
52
|
-
console.error(`Failed to load script: ${src}`);
|
|
53
|
-
resolve({ src, loaded: false });
|
|
54
|
-
};
|
|
55
|
-
document.getElementsByTagName(tag)[0].appendChild(scriptTag);
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
loadStyle(styleUrl) {
|
|
60
|
-
const head = this.document.getElementsByTagName('head')[0];
|
|
61
|
-
const style = this.document.createElement('link');
|
|
62
|
-
style.id = 'client-theme';
|
|
63
|
-
style.rel = 'stylesheet';
|
|
64
|
-
style.href = styleUrl;
|
|
65
|
-
head.appendChild(style);
|
|
66
|
-
}
|
|
67
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ScriptLoaderService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
68
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ScriptLoaderService, providedIn: 'root' }); }
|
|
69
|
-
}
|
|
70
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ScriptLoaderService, decorators: [{
|
|
71
|
-
type: Injectable,
|
|
72
|
-
args: [{
|
|
73
|
-
providedIn: 'root'
|
|
74
|
-
}]
|
|
75
|
-
}], ctorParameters: () => [{ type: Document, decorators: [{
|
|
76
|
-
type: Inject,
|
|
77
|
-
args: [DOCUMENT]
|
|
78
|
-
}] }] });
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0LWxvYWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24tc2VydmljZXMvc3JjL2xpYi9zY3JpcHQtbG9hZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVVuRCxNQUFNLE9BQU8sbUJBQW1CO0lBRzVCLFlBQStDLFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFGekQsYUFBUSxHQUE4QixFQUFFLENBQUM7SUFFbUIsQ0FBQztJQUVyRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBaUI7UUFDMUIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2hELENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM5QixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxRQUFrQjtRQUN4QyxRQUFRLEdBQUcsUUFBUSxJQUFJLEtBQUss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R0FBRyxHQUFHLFlBQVksQ0FBQztRQUN6QixLQUFLLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztRQUV0QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7K0dBNUVRLG1CQUFtQixrQkFHUixRQUFRO21IQUhuQixtQkFBbUIsY0FGaEIsTUFBTTs7NEZBRVQsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7MEJBSWdCLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbnRlcmZhY2UgU2NyaXB0IHtcbiAgICBzcmM6IHN0cmluZztcbiAgICBsb2FkZWQ6IGJvb2xlYW47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU2NyaXB0TG9hZGVyU2VydmljZSB7XG4gICAgcHJpdmF0ZSBfc2NyaXB0czogeyBba2V5OiBzdHJpbmddOiBTY3JpcHQgfSA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudDogRG9jdW1lbnQpIHt9XG5cbiAgICBsb2FkKHRhZywgLi4uc2NyaXB0czogc3RyaW5nW10pIHtcbiAgICAgICAgc2NyaXB0cy5mb3JFYWNoKChzcmM6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9zY3JpcHRzW3NyY10pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zY3JpcHRzW3NyY10gPSB7IHNyYywgbG9hZGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwcm9taXNlczogb2JqZWN0W10gPSBbXTtcbiAgICAgICAgc2NyaXB0cy5mb3JFYWNoKHNyYyA9PiBwcm9taXNlcy5wdXNoKHRoaXMubG9hZFNjcmlwdCh0YWcsIHNyYykpKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH1cblxuICAgIGxvYWRTY3JpcHRzKHRhZywgc2NyaXB0cywgbG9hZE9uY2U/OiBib29sZWFuKSB7XG4gICAgICAgIGxvYWRPbmNlID0gbG9hZE9uY2UgfHwgZmFsc2U7XG5cbiAgICAgICAgc2NyaXB0cy5mb3JFYWNoKChzY3JpcHQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9zY3JpcHRzW3NjcmlwdF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zY3JpcHRzW3NjcmlwdF0gPSB7IHNyYzogc2NyaXB0LCBsb2FkZWQ6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHByb21pc2VzOiBvYmplY3RbXSA9IFtdO1xuICAgICAgICBzY3JpcHRzLmZvckVhY2goc2NyaXB0ID0+IHByb21pc2VzLnB1c2godGhpcy5sb2FkU2NyaXB0KHRhZywgc2NyaXB0LCBsb2FkT25jZSkpKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH1cblxuICAgIGxvYWRTY3JpcHQodGFnLCBzcmM6IHN0cmluZywgbG9hZE9uY2U/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGlzTG9hZCA9IGxvYWRPbmNlIHx8IGZhbHNlO1xuXG4gICAgICAgIGlmICghdGhpcy5fc2NyaXB0c1tzcmNdKSB7XG4gICAgICAgICAgICB0aGlzLl9zY3JpcHRzW3NyY10gPSB7IHNyYywgbG9hZGVkOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyByZXNvbHZlIGlmIGFscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICBpZiAodGhpcy5fc2NyaXB0c1tzcmNdLmxvYWRlZCAmJiBpc0xvYWQpIHtcbiAgICAgICAgICAgICAgICAvLyBOT1NPTkFSXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHNyYywgbG9hZGVkOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBsb2FkIHNjcmlwdCB0YWdcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHRUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICBzY3JpcHRUYWcudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICAgICAgICAgICAgICAgIHNjcmlwdFRhZy5zcmMgPSB0aGlzLl9zY3JpcHRzW3NyY10uc3JjO1xuXG4gICAgICAgICAgICAgICAgc2NyaXB0VGFnLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NyaXB0c1tzcmNdLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBzcmMsIGxvYWRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgc2NyaXB0VGFnLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBzY3JpcHQgbG9hZGluZyBlcnJvciAoaWYgbmVlZGVkKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBzY3JpcHQ6ICR7c3JjfWApO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgc3JjLCBsb2FkZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWcpWzBdLmFwcGVuZENoaWxkKHNjcmlwdFRhZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvYWRTdHlsZShzdHlsZVVybDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGhlYWQgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgc3R5bGUuaWQgPSAnY2xpZW50LXRoZW1lJztcbiAgICAgICAgc3R5bGUucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICBzdHlsZS5ocmVmID0gc3R5bGVVcmw7XG5cbiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgfVxufVxuIl19
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import { Inject, Injectable } from '@angular/core';
|
|
3
|
-
import { BehaviorSubject, of } from 'rxjs';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
/**
|
|
6
|
-
* Secure Token Storage Service
|
|
7
|
-
*
|
|
8
|
-
* This service provides secure token storage using memory + secure cookies.
|
|
9
|
-
* NO localStorage usage - tokens are stored only in memory and secure cookies.
|
|
10
|
-
*
|
|
11
|
-
* Security Features:
|
|
12
|
-
* - Memory storage (primary) - not persistent across refreshes
|
|
13
|
-
* - Secure cookies (backup) - with SameSite=Strict protection
|
|
14
|
-
* - No localStorage - prevents XSS token theft
|
|
15
|
-
* - Secure flag for HTTPS
|
|
16
|
-
* - CSRF protection via SameSite cookies
|
|
17
|
-
*/
|
|
18
|
-
export class SecureTokenStorageService {
|
|
19
|
-
constructor(document) {
|
|
20
|
-
this.document = document;
|
|
21
|
-
this.TOKEN_COOKIE_NAME = 'auth_token';
|
|
22
|
-
this.IMPERSONATED_TOKEN_COOKIE_NAME = 'user_impersonated_token';
|
|
23
|
-
this.PHONEGAP_TOKEN_COOKIE_NAME = 'user_impersonated_phonegap_token';
|
|
24
|
-
// In-memory fallback for development or when cookies are not available
|
|
25
|
-
this.memoryStorage = new Map();
|
|
26
|
-
this.tokenSubject = new BehaviorSubject(null);
|
|
27
|
-
this.impersonatedTokenSubject = new BehaviorSubject(null);
|
|
28
|
-
this.phonegapTokenSubject = new BehaviorSubject(null);
|
|
29
|
-
this.initializeTokens();
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Store authentication token securely
|
|
33
|
-
*/
|
|
34
|
-
storeToken(token) {
|
|
35
|
-
try {
|
|
36
|
-
// Store ONLY in memory and secure cookie - NO localStorage
|
|
37
|
-
this.memoryStorage.set(this.TOKEN_COOKIE_NAME, token);
|
|
38
|
-
this.setSecureCookie(this.TOKEN_COOKIE_NAME, token);
|
|
39
|
-
this.tokenSubject.next(token);
|
|
40
|
-
return of(true);
|
|
41
|
-
}
|
|
42
|
-
catch (error) {
|
|
43
|
-
console.warn('Failed to store token, using memory fallback:', error);
|
|
44
|
-
this.memoryStorage.set(this.TOKEN_COOKIE_NAME, token);
|
|
45
|
-
this.tokenSubject.next(token);
|
|
46
|
-
return of(true);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Store impersonated user token
|
|
51
|
-
*/
|
|
52
|
-
storeImpersonatedToken(token) {
|
|
53
|
-
try {
|
|
54
|
-
// Store ONLY in memory and secure cookie - NO localStorage
|
|
55
|
-
this.memoryStorage.set(this.IMPERSONATED_TOKEN_COOKIE_NAME, token);
|
|
56
|
-
this.setSecureCookie(this.IMPERSONATED_TOKEN_COOKIE_NAME, token);
|
|
57
|
-
this.impersonatedTokenSubject.next(token);
|
|
58
|
-
return of(true);
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
61
|
-
console.warn('Failed to store impersonated token, using memory fallback:', error);
|
|
62
|
-
this.memoryStorage.set(this.IMPERSONATED_TOKEN_COOKIE_NAME, token);
|
|
63
|
-
this.impersonatedTokenSubject.next(token);
|
|
64
|
-
return of(true);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Store phonegap impersonated token
|
|
69
|
-
*/
|
|
70
|
-
storePhonegapToken(token) {
|
|
71
|
-
try {
|
|
72
|
-
// Store ONLY in memory and secure cookie - NO localStorage
|
|
73
|
-
this.memoryStorage.set(this.PHONEGAP_TOKEN_COOKIE_NAME, token);
|
|
74
|
-
this.setSecureCookie(this.PHONEGAP_TOKEN_COOKIE_NAME, token);
|
|
75
|
-
this.phonegapTokenSubject.next(token);
|
|
76
|
-
return of(true);
|
|
77
|
-
}
|
|
78
|
-
catch (error) {
|
|
79
|
-
console.warn('Failed to store phonegap token, using memory fallback:', error);
|
|
80
|
-
this.memoryStorage.set(this.PHONEGAP_TOKEN_COOKIE_NAME, token);
|
|
81
|
-
this.phonegapTokenSubject.next(token);
|
|
82
|
-
return of(true);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Get authentication token
|
|
87
|
-
*/
|
|
88
|
-
getToken() {
|
|
89
|
-
// Try memory storage first (primary storage)
|
|
90
|
-
const memoryToken = this.memoryStorage.get(this.TOKEN_COOKIE_NAME);
|
|
91
|
-
if (memoryToken) {
|
|
92
|
-
return memoryToken;
|
|
93
|
-
}
|
|
94
|
-
// Try cookie as backup
|
|
95
|
-
const cookieToken = this.getCookieValue(this.TOKEN_COOKIE_NAME);
|
|
96
|
-
if (cookieToken) {
|
|
97
|
-
// Restore to memory storage
|
|
98
|
-
this.memoryStorage.set(this.TOKEN_COOKIE_NAME, cookieToken);
|
|
99
|
-
return cookieToken;
|
|
100
|
-
}
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Get impersonated token
|
|
105
|
-
*/
|
|
106
|
-
getImpersonatedToken() {
|
|
107
|
-
const memoryToken = this.memoryStorage.get(this.IMPERSONATED_TOKEN_COOKIE_NAME);
|
|
108
|
-
if (memoryToken) {
|
|
109
|
-
return memoryToken;
|
|
110
|
-
}
|
|
111
|
-
const cookieToken = this.getCookieValue(this.IMPERSONATED_TOKEN_COOKIE_NAME);
|
|
112
|
-
if (cookieToken) {
|
|
113
|
-
this.memoryStorage.set(this.IMPERSONATED_TOKEN_COOKIE_NAME, cookieToken);
|
|
114
|
-
return cookieToken;
|
|
115
|
-
}
|
|
116
|
-
return null;
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Get phonegap token
|
|
120
|
-
*/
|
|
121
|
-
getPhonegapToken() {
|
|
122
|
-
const memoryToken = this.memoryStorage.get(this.PHONEGAP_TOKEN_COOKIE_NAME);
|
|
123
|
-
if (memoryToken) {
|
|
124
|
-
return memoryToken;
|
|
125
|
-
}
|
|
126
|
-
const cookieToken = this.getCookieValue(this.PHONEGAP_TOKEN_COOKIE_NAME);
|
|
127
|
-
if (cookieToken) {
|
|
128
|
-
this.memoryStorage.set(this.PHONEGAP_TOKEN_COOKIE_NAME, cookieToken);
|
|
129
|
-
return cookieToken;
|
|
130
|
-
}
|
|
131
|
-
return null;
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Get token as Observable
|
|
135
|
-
*/
|
|
136
|
-
getToken$() {
|
|
137
|
-
return this.tokenSubject.asObservable();
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Get impersonated token as Observable
|
|
141
|
-
*/
|
|
142
|
-
getImpersonatedToken$() {
|
|
143
|
-
return this.impersonatedTokenSubject.asObservable();
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Get phonegap token as Observable
|
|
147
|
-
*/
|
|
148
|
-
getPhonegapToken$() {
|
|
149
|
-
return this.phonegapTokenSubject.asObservable();
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Remove all tokens
|
|
153
|
-
*/
|
|
154
|
-
clearTokens() {
|
|
155
|
-
try {
|
|
156
|
-
// Clear cookies
|
|
157
|
-
this.deleteCookie(this.TOKEN_COOKIE_NAME);
|
|
158
|
-
this.deleteCookie(this.IMPERSONATED_TOKEN_COOKIE_NAME);
|
|
159
|
-
this.deleteCookie(this.PHONEGAP_TOKEN_COOKIE_NAME);
|
|
160
|
-
}
|
|
161
|
-
catch (error) {
|
|
162
|
-
console.warn('Failed to clear cookies:', error);
|
|
163
|
-
}
|
|
164
|
-
// Clear memory storage
|
|
165
|
-
this.memoryStorage.delete(this.TOKEN_COOKIE_NAME);
|
|
166
|
-
this.memoryStorage.delete(this.IMPERSONATED_TOKEN_COOKIE_NAME);
|
|
167
|
-
this.memoryStorage.delete(this.PHONEGAP_TOKEN_COOKIE_NAME);
|
|
168
|
-
// Update subjects
|
|
169
|
-
this.tokenSubject.next(null);
|
|
170
|
-
this.impersonatedTokenSubject.next(null);
|
|
171
|
-
this.phonegapTokenSubject.next(null);
|
|
172
|
-
return of(true);
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Remove specific token
|
|
176
|
-
*/
|
|
177
|
-
removeToken() {
|
|
178
|
-
try {
|
|
179
|
-
this.deleteCookie(this.TOKEN_COOKIE_NAME);
|
|
180
|
-
}
|
|
181
|
-
catch (error) {
|
|
182
|
-
console.warn('Failed to remove token:', error);
|
|
183
|
-
}
|
|
184
|
-
this.memoryStorage.delete(this.TOKEN_COOKIE_NAME);
|
|
185
|
-
this.tokenSubject.next(null);
|
|
186
|
-
return of(true);
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Remove impersonated tokens
|
|
190
|
-
*/
|
|
191
|
-
removeImpersonatedTokens() {
|
|
192
|
-
try {
|
|
193
|
-
this.deleteCookie(this.IMPERSONATED_TOKEN_COOKIE_NAME);
|
|
194
|
-
this.deleteCookie(this.PHONEGAP_TOKEN_COOKIE_NAME);
|
|
195
|
-
}
|
|
196
|
-
catch (error) {
|
|
197
|
-
console.warn('Failed to remove impersonated tokens:', error);
|
|
198
|
-
}
|
|
199
|
-
this.memoryStorage.delete(this.IMPERSONATED_TOKEN_COOKIE_NAME);
|
|
200
|
-
this.memoryStorage.delete(this.PHONEGAP_TOKEN_COOKIE_NAME);
|
|
201
|
-
this.impersonatedTokenSubject.next(null);
|
|
202
|
-
this.phonegapTokenSubject.next(null);
|
|
203
|
-
return of(true);
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Set secure cookie
|
|
207
|
-
* Note: HttpOnly cannot be set from client-side JavaScript
|
|
208
|
-
* For maximum security, backend should set httpOnly cookies
|
|
209
|
-
*/
|
|
210
|
-
setSecureCookie(name, value) {
|
|
211
|
-
const isSecure = this.document.location.protocol === 'https:';
|
|
212
|
-
// Set cookie with maximum security possible from client-side
|
|
213
|
-
const cookieString = `${name}=${value}; Path=/; ${isSecure ? 'Secure; ' : ''}SameSite=Strict; Max-Age=86400`;
|
|
214
|
-
this.document.cookie = cookieString;
|
|
215
|
-
// Log warning about security limitations
|
|
216
|
-
console.warn('⚠️ SECURITY WARNING: Cookie is not httpOnly. For maximum security, backend should set httpOnly cookies.');
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Get cookie value
|
|
220
|
-
*/
|
|
221
|
-
getCookieValue(name) {
|
|
222
|
-
const value = `; ${this.document.cookie}`;
|
|
223
|
-
const parts = value.split(`; ${name}=`);
|
|
224
|
-
if (parts.length === 2) {
|
|
225
|
-
return parts.pop()?.split(';').shift() || null;
|
|
226
|
-
}
|
|
227
|
-
return null;
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Delete cookie
|
|
231
|
-
*/
|
|
232
|
-
deleteCookie(name) {
|
|
233
|
-
this.document.cookie = `${name}=; Path=/; expires=Thu, 01 Jan 1970 00:00:01 GMT;`;
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Initialize tokens from storage on service startup
|
|
237
|
-
*/
|
|
238
|
-
initializeTokens() {
|
|
239
|
-
const token = this.getToken();
|
|
240
|
-
const impersonatedToken = this.getImpersonatedToken();
|
|
241
|
-
const phonegapToken = this.getPhonegapToken();
|
|
242
|
-
if (token) {
|
|
243
|
-
this.tokenSubject.next(token);
|
|
244
|
-
}
|
|
245
|
-
if (impersonatedToken) {
|
|
246
|
-
this.impersonatedTokenSubject.next(impersonatedToken);
|
|
247
|
-
}
|
|
248
|
-
if (phonegapToken) {
|
|
249
|
-
this.phonegapTokenSubject.next(phonegapToken);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SecureTokenStorageService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
253
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SecureTokenStorageService, providedIn: 'root' }); }
|
|
254
|
-
}
|
|
255
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SecureTokenStorageService, decorators: [{
|
|
256
|
-
type: Injectable,
|
|
257
|
-
args: [{
|
|
258
|
-
providedIn: 'root'
|
|
259
|
-
}]
|
|
260
|
-
}], ctorParameters: () => [{ type: Document, decorators: [{
|
|
261
|
-
type: Inject,
|
|
262
|
-
args: [DOCUMENT]
|
|
263
|
-
}] }] });
|
|
264
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlLXRva2VuLXN0b3JhZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uLXNlcnZpY2VzL3NyYy9saWIvc2VjdXJlLXRva2VuLXN0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBRXZEOzs7Ozs7Ozs7Ozs7R0FZRztBQUlILE1BQU0sT0FBTyx5QkFBeUI7SUFXbEMsWUFBK0MsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQVZoRCxzQkFBaUIsR0FBRyxZQUFZLENBQUM7UUFDakMsbUNBQThCLEdBQUcseUJBQXlCLENBQUM7UUFDM0QsK0JBQTBCLEdBQUcsa0NBQWtDLENBQUM7UUFFakYsdUVBQXVFO1FBQ3RELGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDMUMsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFDeEQsNkJBQXdCLEdBQUcsSUFBSSxlQUFlLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ3BFLHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUFnQixJQUFJLENBQUMsQ0FBQztRQUc3RSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsS0FBYTtRQUNwQixJQUFJLENBQUM7WUFDRCwyREFBMkQ7WUFDM0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxlQUFlLENB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RyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUN0RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUU5QyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0wsQ0FBQzsrR0FyUVEseUJBQXlCLGtCQVdkLFFBQVE7bUhBWG5CLHlCQUF5QixjQUZ0QixNQUFNOzs0RkFFVCx5QkFBeUI7a0JBSHJDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFZZ0IsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBTZWN1cmUgVG9rZW4gU3RvcmFnZSBTZXJ2aWNlXG4gKlxuICogVGhpcyBzZXJ2aWNlIHByb3ZpZGVzIHNlY3VyZSB0b2tlbiBzdG9yYWdlIHVzaW5nIG1lbW9yeSArIHNlY3VyZSBjb29raWVzLlxuICogTk8gbG9jYWxTdG9yYWdlIHVzYWdlIC0gdG9rZW5zIGFyZSBzdG9yZWQgb25seSBpbiBtZW1vcnkgYW5kIHNlY3VyZSBjb29raWVzLlxuICpcbiAqIFNlY3VyaXR5IEZlYXR1cmVzOlxuICogLSBNZW1vcnkgc3RvcmFnZSAocHJpbWFyeSkgLSBub3QgcGVyc2lzdGVudCBhY3Jvc3MgcmVmcmVzaGVzXG4gKiAtIFNlY3VyZSBjb29raWVzIChiYWNrdXApIC0gd2l0aCBTYW1lU2l0ZT1TdHJpY3QgcHJvdGVjdGlvblxuICogLSBObyBsb2NhbFN0b3JhZ2UgLSBwcmV2ZW50cyBYU1MgdG9rZW4gdGhlZnRcbiAqIC0gU2VjdXJlIGZsYWcgZm9yIEhUVFBTXG4gKiAtIENTUkYgcHJvdGVjdGlvbiB2aWEgU2FtZVNpdGUgY29va2llc1xuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNlY3VyZVRva2VuU3RvcmFnZVNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVE9LRU5fQ09PS0lFX05BTUUgPSAnYXV0aF90b2tlbic7XG4gICAgcHJpdmF0ZSByZWFkb25seSBJTVBFUlNPTkFURURfVE9LRU5fQ09PS0lFX05BTUUgPSAndXNlcl9pbXBlcnNvbmF0ZWRfdG9rZW4nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgUEhPTkVHQVBfVE9LRU5fQ09PS0lFX05BTUUgPSAndXNlcl9pbXBlcnNvbmF0ZWRfcGhvbmVnYXBfdG9rZW4nO1xuXG4gICAgLy8gSW4tbWVtb3J5IGZhbGxiYWNrIGZvciBkZXZlbG9wbWVudCBvciB3aGVuIGNvb2tpZXMgYXJlIG5vdCBhdmFpbGFibGVcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yeVN0b3JhZ2UgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9rZW5TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGltcGVyc29uYXRlZFRva2VuU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwaG9uZWdhcFRva2VuU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBEb2N1bWVudCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVUb2tlbnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSBhdXRoZW50aWNhdGlvbiB0b2tlbiBzZWN1cmVseVxuICAgICAqL1xuICAgIHN0b3JlVG9rZW4odG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gU3RvcmUgT05MWSBpbiBtZW1vcnkgYW5kIHNlY3VyZSBjb29raWUgLSBOTyBsb2NhbFN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMubWVtb3J5U3RvcmFnZS5zZXQodGhpcy5UT0tFTl9DT09LSUVfTkFNRSwgdG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWN1cmVDb29raWUodGhpcy5UT0tFTl9DT09LSUVfTkFNRSwgdG9rZW4pO1xuXG4gICAgICAgICAgICB0aGlzLnRva2VuU3ViamVjdC5uZXh0KHRva2VuKTtcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHN0b3JlIHRva2VuLCB1c2luZyBtZW1vcnkgZmFsbGJhY2s6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLnNldCh0aGlzLlRPS0VOX0NPT0tJRV9OQU1FLCB0b2tlbik7XG4gICAgICAgICAgICB0aGlzLnRva2VuU3ViamVjdC5uZXh0KHRva2VuKTtcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3JlIGltcGVyc29uYXRlZCB1c2VyIHRva2VuXG4gICAgICovXG4gICAgc3RvcmVJbXBlcnNvbmF0ZWRUb2tlbih0b2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBTdG9yZSBPTkxZIGluIG1lbW9yeSBhbmQgc2VjdXJlIGNvb2tpZSAtIE5PIGxvY2FsU3RvcmFnZVxuICAgICAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLnNldCh0aGlzLklNUEVSU09OQVRFRF9UT0tFTl9DT09LSUVfTkFNRSwgdG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWN1cmVDb29raWUodGhpcy5JTVBFUlNPTkFURURfVE9LRU5fQ09PS0lFX05BTUUsIHRva2VuKTtcbiAgICAgICAgICAgIHRoaXMuaW1wZXJzb25hdGVkVG9rZW5TdWJqZWN0Lm5leHQodG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc3RvcmUgaW1wZXJzb25hdGVkIHRva2VuLCB1c2luZyBtZW1vcnkgZmFsbGJhY2s6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLnNldCh0aGlzLklNUEVSU09OQVRFRF9UT0tFTl9DT09LSUVfTkFNRSwgdG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5pbXBlcnNvbmF0ZWRUb2tlblN1YmplY3QubmV4dCh0b2tlbik7XG4gICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSBwaG9uZWdhcCBpbXBlcnNvbmF0ZWQgdG9rZW5cbiAgICAgKi9cbiAgICBzdG9yZVBob25lZ2FwVG9rZW4odG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gU3RvcmUgT05MWSBpbiBtZW1vcnkgYW5kIHNlY3VyZSBjb29raWUgLSBOTyBsb2NhbFN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMubWVtb3J5U3RvcmFnZS5zZXQodGhpcy5QSE9ORUdBUF9UT0tFTl9DT09LSUVfTkFNRSwgdG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWN1cmVDb29raWUodGhpcy5QSE9ORUdBUF9UT0tFTl9DT09LSUVfTkFNRSwgdG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5waG9uZWdhcFRva2VuU3ViamVjdC5uZXh0KHRva2VuKTtcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHN0b3JlIHBob25lZ2FwIHRva2VuLCB1c2luZyBtZW1vcnkgZmFsbGJhY2s6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLnNldCh0aGlzLlBIT05FR0FQX1RPS0VOX0NPT0tJRV9OQU1FLCB0b2tlbik7XG4gICAgICAgICAgICB0aGlzLnBob25lZ2FwVG9rZW5TdWJqZWN0Lm5leHQodG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGF1dGhlbnRpY2F0aW9uIHRva2VuXG4gICAgICovXG4gICAgZ2V0VG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIC8vIFRyeSBtZW1vcnkgc3RvcmFnZSBmaXJzdCAocHJpbWFyeSBzdG9yYWdlKVxuICAgICAgICBjb25zdCBtZW1vcnlUb2tlbiA9IHRoaXMubWVtb3J5U3RvcmFnZS5nZXQodGhpcy5UT0tFTl9DT09LSUVfTkFNRSk7XG4gICAgICAgIGlmIChtZW1vcnlUb2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIG1lbW9yeVRva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IGNvb2tpZSBhcyBiYWNrdXBcbiAgICAgICAgY29uc3QgY29va2llVG9rZW4gPSB0aGlzLmdldENvb2tpZVZhbHVlKHRoaXMuVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICBpZiAoY29va2llVG9rZW4pIHtcbiAgICAgICAgICAgIC8vIFJlc3RvcmUgdG8gbWVtb3J5IHN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMubWVtb3J5U3RvcmFnZS5zZXQodGhpcy5UT0tFTl9DT09LSUVfTkFNRSwgY29va2llVG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuIGNvb2tpZVRva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGltcGVyc29uYXRlZCB0b2tlblxuICAgICAqL1xuICAgIGdldEltcGVyc29uYXRlZFRva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBtZW1vcnlUb2tlbiA9IHRoaXMubWVtb3J5U3RvcmFnZS5nZXQodGhpcy5JTVBFUlNPTkFURURfVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICBpZiAobWVtb3J5VG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBtZW1vcnlUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvb2tpZVRva2VuID0gdGhpcy5nZXRDb29raWVWYWx1ZSh0aGlzLklNUEVSU09OQVRFRF9UT0tFTl9DT09LSUVfTkFNRSk7XG4gICAgICAgIGlmIChjb29raWVUb2tlbikge1xuICAgICAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLnNldCh0aGlzLklNUEVSU09OQVRFRF9UT0tFTl9DT09LSUVfTkFNRSwgY29va2llVG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuIGNvb2tpZVRva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHBob25lZ2FwIHRva2VuXG4gICAgICovXG4gICAgZ2V0UGhvbmVnYXBUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgbWVtb3J5VG9rZW4gPSB0aGlzLm1lbW9yeVN0b3JhZ2UuZ2V0KHRoaXMuUEhPTkVHQVBfVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICBpZiAobWVtb3J5VG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBtZW1vcnlUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvb2tpZVRva2VuID0gdGhpcy5nZXRDb29raWVWYWx1ZSh0aGlzLlBIT05FR0FQX1RPS0VOX0NPT0tJRV9OQU1FKTtcbiAgICAgICAgaWYgKGNvb2tpZVRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLm1lbW9yeVN0b3JhZ2Uuc2V0KHRoaXMuUEhPTkVHQVBfVE9LRU5fQ09PS0lFX05BTUUsIGNvb2tpZVRva2VuKTtcbiAgICAgICAgICAgIHJldHVybiBjb29raWVUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0b2tlbiBhcyBPYnNlcnZhYmxlXG4gICAgICovXG4gICAgZ2V0VG9rZW4kKCk6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGltcGVyc29uYXRlZCB0b2tlbiBhcyBPYnNlcnZhYmxlXG4gICAgICovXG4gICAgZ2V0SW1wZXJzb25hdGVkVG9rZW4kKCk6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbXBlcnNvbmF0ZWRUb2tlblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHBob25lZ2FwIHRva2VuIGFzIE9ic2VydmFibGVcbiAgICAgKi9cbiAgICBnZXRQaG9uZWdhcFRva2VuJCgpOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGhvbmVnYXBUb2tlblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCB0b2tlbnNcbiAgICAgKi9cbiAgICBjbGVhclRva2VucygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIENsZWFyIGNvb2tpZXNcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlQ29va2llKHRoaXMuVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDb29raWUodGhpcy5JTVBFUlNPTkFURURfVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDb29raWUodGhpcy5QSE9ORUdBUF9UT0tFTl9DT09LSUVfTkFNRSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBjbGVhciBjb29raWVzOicsIGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIG1lbW9yeSBzdG9yYWdlXG4gICAgICAgIHRoaXMubWVtb3J5U3RvcmFnZS5kZWxldGUodGhpcy5UT0tFTl9DT09LSUVfTkFNRSk7XG4gICAgICAgIHRoaXMubWVtb3J5U3RvcmFnZS5kZWxldGUodGhpcy5JTVBFUlNPTkFURURfVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICB0aGlzLm1lbW9yeVN0b3JhZ2UuZGVsZXRlKHRoaXMuUEhPTkVHQVBfVE9LRU5fQ09PS0lFX05BTUUpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzdWJqZWN0c1xuICAgICAgICB0aGlzLnRva2VuU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLmltcGVyc29uYXRlZFRva2VuU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLnBob25lZ2FwVG9rZW5TdWJqZWN0Lm5leHQobnVsbCk7XG5cbiAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBzcGVjaWZpYyB0b2tlblxuICAgICAqL1xuICAgIHJlbW92ZVRva2VuKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDb29raWUodGhpcy5UT0tFTl9DT09LSUVfTkFNRSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZW1vdmUgdG9rZW46JywgZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLmRlbGV0ZSh0aGlzLlRPS0VOX0NPT0tJRV9OQU1FKTtcbiAgICAgICAgdGhpcy50b2tlblN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBpbXBlcnNvbmF0ZWQgdG9rZW5zXG4gICAgICovXG4gICAgcmVtb3ZlSW1wZXJzb25hdGVkVG9rZW5zKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDb29raWUodGhpcy5JTVBFUlNPTkFURURfVE9LRU5fQ09PS0lFX05BTUUpO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDb29raWUodGhpcy5QSE9ORUdBUF9UT0tFTl9DT09LSUVfTkFNRSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZW1vdmUgaW1wZXJzb25hdGVkIHRva2VuczonLCBlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1lbW9yeVN0b3JhZ2UuZGVsZXRlKHRoaXMuSU1QRVJTT05BVEVEX1RPS0VOX0NPT0tJRV9OQU1FKTtcbiAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlLmRlbGV0ZSh0aGlzLlBIT05FR0FQX1RPS0VOX0NPT0tJRV9OQU1FKTtcbiAgICAgICAgdGhpcy5pbXBlcnNvbmF0ZWRUb2tlblN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5waG9uZWdhcFRva2VuU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHNlY3VyZSBjb29raWVcbiAgICAgKiBOb3RlOiBIdHRwT25seSBjYW5ub3QgYmUgc2V0IGZyb20gY2xpZW50LXNpZGUgSmF2YVNjcmlwdFxuICAgICAqIEZvciBtYXhpbXVtIHNlY3VyaXR5LCBiYWNrZW5kIHNob3VsZCBzZXQgaHR0cE9ubHkgY29va2llc1xuICAgICAqL1xuICAgIHByaXZhdGUgc2V0U2VjdXJlQ29va2llKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBpc1NlY3VyZSA9IHRoaXMuZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonO1xuXG4gICAgICAgIC8vIFNldCBjb29raWUgd2l0aCBtYXhpbXVtIHNlY3VyaXR5IHBvc3NpYmxlIGZyb20gY2xpZW50LXNpZGVcbiAgICAgICAgY29uc3QgY29va2llU3RyaW5nID0gYCR7bmFtZX09JHt2YWx1ZX07IFBhdGg9LzsgJHtpc1NlY3VyZSA/ICdTZWN1cmU7ICcgOiAnJ31TYW1lU2l0ZT1TdHJpY3Q7IE1heC1BZ2U9ODY0MDBgO1xuICAgICAgICB0aGlzLmRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZVN0cmluZztcblxuICAgICAgICAvLyBMb2cgd2FybmluZyBhYm91dCBzZWN1cml0eSBsaW1pdGF0aW9uc1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAn4pqg77iPIFNFQ1VSSVRZIFdBUk5JTkc6IENvb2tpZSBpcyBub3QgaHR0cE9ubHkuIEZvciBtYXhpbXVtIHNlY3VyaXR5LCBiYWNrZW5kIHNob3VsZCBzZXQgaHR0cE9ubHkgY29va2llcy4nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNvb2tpZSB2YWx1ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Q29va2llVmFsdWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYDsgJHt0aGlzLmRvY3VtZW50LmNvb2tpZX1gO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KGA7ICR7bmFtZX09YCk7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0cy5wb3AoKT8uc3BsaXQoJzsnKS5zaGlmdCgpIHx8IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGNvb2tpZVxuICAgICAqL1xuICAgIHByaXZhdGUgZGVsZXRlQ29va2llKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PTsgUGF0aD0vOyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDEgR01UO2A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0b2tlbnMgZnJvbSBzdG9yYWdlIG9uIHNlcnZpY2Ugc3RhcnR1cFxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVRva2VucygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgIGNvbnN0IGltcGVyc29uYXRlZFRva2VuID0gdGhpcy5nZXRJbXBlcnNvbmF0ZWRUb2tlbigpO1xuICAgICAgICBjb25zdCBwaG9uZWdhcFRva2VuID0gdGhpcy5nZXRQaG9uZWdhcFRva2VuKCk7XG5cbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLnRva2VuU3ViamVjdC5uZXh0KHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW1wZXJzb25hdGVkVG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuaW1wZXJzb25hdGVkVG9rZW5TdWJqZWN0Lm5leHQoaW1wZXJzb25hdGVkVG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwaG9uZWdhcFRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLnBob25lZ2FwVG9rZW5TdWJqZWN0Lm5leHQocGhvbmVnYXBUb2tlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|