@posiwise/common-services 0.1.88 → 0.1.89

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.
Files changed (50) hide show
  1. package/fesm2022/posiwise-common-services.mjs +146 -182
  2. package/fesm2022/posiwise-common-services.mjs.map +1 -1
  3. package/lib/user.service.d.ts +1 -0
  4. package/package.json +8 -10
  5. package/esm2022/index.mjs +0 -47
  6. package/esm2022/lib/ab-test.service.mjs +0 -55
  7. package/esm2022/lib/ahoy.service.mjs +0 -93
  8. package/esm2022/lib/auth.service.mjs +0 -322
  9. package/esm2022/lib/base-http.service.mjs +0 -98
  10. package/esm2022/lib/brain-api-http.service.mjs +0 -26
  11. package/esm2022/lib/brain.service.mjs +0 -21
  12. package/esm2022/lib/common-services.interface.mjs +0 -2
  13. package/esm2022/lib/common-services.module.mjs +0 -23
  14. package/esm2022/lib/common.service.mjs +0 -134
  15. package/esm2022/lib/custom-preloading.service.mjs +0 -38
  16. package/esm2022/lib/dashboard.service.mjs +0 -21
  17. package/esm2022/lib/data.service.mjs +0 -21
  18. package/esm2022/lib/date-formatter.service.mjs +0 -82
  19. package/esm2022/lib/effects/user.effects.mjs +0 -27
  20. package/esm2022/lib/form-helper.service.mjs +0 -27
  21. package/esm2022/lib/geo.service.mjs +0 -40
  22. package/esm2022/lib/google-analytics.service.mjs +0 -121
  23. package/esm2022/lib/group.service.mjs +0 -122
  24. package/esm2022/lib/hopscotch.service.mjs +0 -48
  25. package/esm2022/lib/integrations-api-http.service.mjs +0 -28
  26. package/esm2022/lib/link-loader.service.mjs +0 -50
  27. package/esm2022/lib/local-storage.service.mjs +0 -32
  28. package/esm2022/lib/logo-caching.service.mjs +0 -65
  29. package/esm2022/lib/mailbox.service.mjs +0 -66
  30. package/esm2022/lib/main-api-http.service.mjs +0 -26
  31. package/esm2022/lib/notification.service.mjs +0 -70
  32. package/esm2022/lib/number-picker.service.mjs +0 -43
  33. package/esm2022/lib/permission.service.mjs +0 -252
  34. package/esm2022/lib/primeNgHelper.mjs +0 -18
  35. package/esm2022/lib/product.service.mjs +0 -78
  36. package/esm2022/lib/profile.service.mjs +0 -64
  37. package/esm2022/lib/qualification.service.mjs +0 -29
  38. package/esm2022/lib/script-loader.service.mjs +0 -79
  39. package/esm2022/lib/secure-token-storage.service.mjs +0 -264
  40. package/esm2022/lib/sentry.service.mjs +0 -384
  41. package/esm2022/lib/seo.service.mjs +0 -43
  42. package/esm2022/lib/socket.service.mjs +0 -29
  43. package/esm2022/lib/subscription.service.mjs +0 -129
  44. package/esm2022/lib/tag.service.mjs +0 -101
  45. package/esm2022/lib/tips.service.mjs +0 -38
  46. package/esm2022/lib/toast.service.mjs +0 -85
  47. package/esm2022/lib/user.service.mjs +0 -202
  48. package/esm2022/lib/validation.service.mjs +0 -36
  49. package/esm2022/lib/window.service.mjs +0 -20
  50. 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=