@posiwise/common-services 0.1.76 → 0.1.78

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/index.d.ts CHANGED
@@ -7,6 +7,7 @@ export * from './lib/permission.service';
7
7
  export * from './lib/toast.service';
8
8
  export * from './lib/auth.service';
9
9
  export * from './lib/local-storage.service';
10
+ export * from './lib/secure-token-storage.service';
10
11
  export * from './lib/integrations-api-http.service';
11
12
  export * from './lib/link-loader.service';
12
13
  export * from './lib/user.service';
@@ -39,4 +40,3 @@ export * from './lib/logo-caching.service';
39
40
  export * from './lib/hopscotch.service';
40
41
  export * from './lib/brain.service';
41
42
  export * from './lib/brain-api-http.service';
42
- export * from './lib/jquery.service';
@@ -5,11 +5,13 @@ import { SignUpValues } from './common-services.interface';
5
5
  import { IntegrationsApiHttpService } from './integrations-api-http.service';
6
6
  import { LocalStorage } from './local-storage.service';
7
7
  import { MainApiHttpService } from './main-api-http.service';
8
+ import { SecureTokenStorageService } from './secure-token-storage.service';
8
9
  import { CustomToastService } from './toast.service';
9
10
  import { UserService } from './user.service';
10
11
  import * as i0 from "@angular/core";
11
12
  export declare class AuthService {
12
13
  private readonly localStorage;
14
+ private readonly secureTokenStorage;
13
15
  private readonly router;
14
16
  private readonly http;
15
17
  private readonly userService;
@@ -24,7 +26,7 @@ export declare class AuthService {
24
26
  platform: string;
25
27
  platform$: import("rxjs").Observable<string>;
26
28
  isUserPersonated: boolean;
27
- constructor(localStorage: LocalStorage, router: Router, http: MainApiHttpService, userService: UserService, toastr: CustomToastService, appConfigService: AppConfigService, integrationsApi: IntegrationsApiHttpService, document: Document);
29
+ constructor(localStorage: LocalStorage, secureTokenStorage: SecureTokenStorageService, router: Router, http: MainApiHttpService, userService: UserService, toastr: CustomToastService, appConfigService: AppConfigService, integrationsApi: IntegrationsApiHttpService, document: Document);
28
30
  getToken(): string;
29
31
  getImpersonatedToken(): string;
30
32
  setHeaderKey(): void;
@@ -38,9 +40,13 @@ export declare class AuthService {
38
40
  private getPlatform;
39
41
  signInUser(email: string, password: string): import("rxjs").Observable<any>;
40
42
  signInUserWith2Fa(email: string, password: string, google_code: any): import("rxjs").Observable<any>;
41
- storeToken(token: string): import("rxjs").Observable<void>;
43
+ storeToken(token: string): import("rxjs").Observable<boolean>;
42
44
  storePlatform(plat: string): import("rxjs").Observable<void>;
43
45
  logout(): import("rxjs").Observable<any>;
46
+ /**
47
+ * Clear all authentication tokens
48
+ */
49
+ clearTokens(): import("rxjs").Observable<boolean>;
44
50
  getToken$(): import("rxjs").Observable<string>;
45
51
  getNewsletterSubscription(token: string): import("rxjs").Observable<any>;
46
52
  unsubscribeNewsletter(token: string): import("rxjs").Observable<any>;
@@ -1,7 +1,7 @@
1
1
  import { BrainApiHttpService } from './brain-api-http.service';
2
2
  import * as i0 from "@angular/core";
3
3
  export declare class BrainApiService {
4
- private api;
4
+ private readonly api;
5
5
  constructor(api: BrainApiHttpService);
6
6
  invokeModel(payload: {
7
7
  model_name: 'claude' | 'deepseek';
@@ -0,0 +1,94 @@
1
+ import { Observable } from 'rxjs';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Secure Token Storage Service
5
+ *
6
+ * This service provides secure token storage using memory + secure cookies.
7
+ * NO localStorage usage - tokens are stored only in memory and secure cookies.
8
+ *
9
+ * Security Features:
10
+ * - Memory storage (primary) - not persistent across refreshes
11
+ * - Secure cookies (backup) - with SameSite=Strict protection
12
+ * - No localStorage - prevents XSS token theft
13
+ * - Secure flag for HTTPS
14
+ * - CSRF protection via SameSite cookies
15
+ */
16
+ export declare class SecureTokenStorageService {
17
+ private readonly document;
18
+ private readonly TOKEN_COOKIE_NAME;
19
+ private readonly IMPERSONATED_TOKEN_COOKIE_NAME;
20
+ private readonly PHONEGAP_TOKEN_COOKIE_NAME;
21
+ private readonly memoryStorage;
22
+ private readonly tokenSubject;
23
+ private readonly impersonatedTokenSubject;
24
+ private readonly phonegapTokenSubject;
25
+ constructor(document: Document);
26
+ /**
27
+ * Store authentication token securely
28
+ */
29
+ storeToken(token: string): Observable<boolean>;
30
+ /**
31
+ * Store impersonated user token
32
+ */
33
+ storeImpersonatedToken(token: string): Observable<boolean>;
34
+ /**
35
+ * Store phonegap impersonated token
36
+ */
37
+ storePhonegapToken(token: string): Observable<boolean>;
38
+ /**
39
+ * Get authentication token
40
+ */
41
+ getToken(): string | null;
42
+ /**
43
+ * Get impersonated token
44
+ */
45
+ getImpersonatedToken(): string | null;
46
+ /**
47
+ * Get phonegap token
48
+ */
49
+ getPhonegapToken(): string | null;
50
+ /**
51
+ * Get token as Observable
52
+ */
53
+ getToken$(): Observable<string | null>;
54
+ /**
55
+ * Get impersonated token as Observable
56
+ */
57
+ getImpersonatedToken$(): Observable<string | null>;
58
+ /**
59
+ * Get phonegap token as Observable
60
+ */
61
+ getPhonegapToken$(): Observable<string | null>;
62
+ /**
63
+ * Remove all tokens
64
+ */
65
+ clearTokens(): Observable<boolean>;
66
+ /**
67
+ * Remove specific token
68
+ */
69
+ removeToken(): Observable<boolean>;
70
+ /**
71
+ * Remove impersonated tokens
72
+ */
73
+ removeImpersonatedTokens(): Observable<boolean>;
74
+ /**
75
+ * Set secure cookie
76
+ * Note: HttpOnly cannot be set from client-side JavaScript
77
+ * For maximum security, backend should set httpOnly cookies
78
+ */
79
+ private setSecureCookie;
80
+ /**
81
+ * Get cookie value
82
+ */
83
+ private getCookieValue;
84
+ /**
85
+ * Delete cookie
86
+ */
87
+ private deleteCookie;
88
+ /**
89
+ * Initialize tokens from storage on service startup
90
+ */
91
+ private initializeTokens;
92
+ static ɵfac: i0.ɵɵFactoryDeclaration<SecureTokenStorageService, never>;
93
+ static ɵprov: i0.ɵɵInjectableDeclaration<SecureTokenStorageService>;
94
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posiwise/common-services",
3
- "version": "0.1.76",
3
+ "version": "0.1.78",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "17.3.11",
6
6
  "@angular/core": "17.3.11",
@@ -1,35 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class JQueryService {
4
- constructor() {
5
- this.loadPromise = null;
6
- }
7
- ensure() {
8
- if (!this.loadPromise) {
9
- this.loadPromise = import('jquery')
10
- .then((mod) => {
11
- const $ = (mod.default ?? mod);
12
- // Only assign if not already set
13
- if (!window.$) {
14
- window.$ = $;
15
- }
16
- if (!window.jQuery) {
17
- window.jQuery = $;
18
- }
19
- return $;
20
- })
21
- .catch(err => {
22
- console.error('Failed to load jQuery:', err);
23
- throw err;
24
- });
25
- }
26
- return this.loadPromise;
27
- }
28
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: JQueryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
29
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: JQueryService, providedIn: 'root' }); }
30
- }
31
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: JQueryService, decorators: [{
32
- type: Injectable,
33
- args: [{ providedIn: 'root' }]
34
- }] });
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianF1ZXJ5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi1zZXJ2aWNlcy9zcmMvbGliL2pxdWVyeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBVTNDLE1BQU0sT0FBTyxhQUFhO0lBRDFCO1FBRVksZ0JBQVcsR0FBaUMsSUFBSSxDQUFDO0tBeUI1RDtJQXZCRyxNQUFNO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7aUJBQzlCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBZ0IsRUFBRTtnQkFDeEIsTUFBTSxDQUFDLEdBQWlCLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQWlCLENBQUM7Z0JBRTdELGlDQUFpQztnQkFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDWixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakIsQ0FBQztnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNqQixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDdEIsQ0FBQztnQkFFRCxPQUFPLENBQUMsQ0FBQztZQUNiLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDN0MsTUFBTSxHQUFHLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQzsrR0F6QlEsYUFBYTttSEFBYixhQUFhLGNBREEsTUFBTTs7NEZBQ25CLGFBQWE7a0JBRHpCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgICQ7XG4gICAgICAgIGpRdWVyeTogSlF1ZXJ5U3RhdGljO1xuICAgIH1cbn1cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBKUXVlcnlTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGxvYWRQcm9taXNlOiBQcm9taXNlPEpRdWVyeVN0YXRpYz4gfCBudWxsID0gbnVsbDtcblxuICAgIGVuc3VyZSgpOiBQcm9taXNlPEpRdWVyeVN0YXRpYz4ge1xuICAgICAgICBpZiAoIXRoaXMubG9hZFByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFByb21pc2UgPSBpbXBvcnQoJ2pxdWVyeScpXG4gICAgICAgICAgICAgICAgLnRoZW4oKG1vZCk6IEpRdWVyeVN0YXRpYyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0ICQ6IEpRdWVyeVN0YXRpYyA9IChtb2QuZGVmYXVsdCA/PyBtb2QpIGFzIEpRdWVyeVN0YXRpYztcblxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGFzc2lnbiBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuJCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LiQgPSAkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmpRdWVyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmpRdWVyeSA9ICQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBqUXVlcnk6JywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRQcm9taXNlO1xuICAgIH1cbn1cbiJdfQ==
@@ -1,14 +0,0 @@
1
- /// <reference types="jquery" />
2
- import * as i0 from "@angular/core";
3
- declare global {
4
- interface Window {
5
- $: any;
6
- jQuery: JQueryStatic;
7
- }
8
- }
9
- export declare class JQueryService {
10
- private loadPromise;
11
- ensure(): Promise<JQueryStatic>;
12
- static ɵfac: i0.ɵɵFactoryDeclaration<JQueryService, never>;
13
- static ɵprov: i0.ɵɵInjectableDeclaration<JQueryService>;
14
- }