@sambath999/localize-token 19.1.6 → 19.1.7

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.
@@ -633,94 +633,128 @@ class InvalidResponseBodyError extends Error {
633
633
  this.name = 'InvalidResponseBodyError';
634
634
  }
635
635
  }
636
+ class TruncatedResponseError extends Error {
637
+ raw;
638
+ expectedLength;
639
+ actualLength;
640
+ constructor(raw, expectedLength, actualLength) {
641
+ super('Truncated HTTP JSON response');
642
+ this.raw = raw;
643
+ this.expectedLength = expectedLength;
644
+ this.actualLength = actualLength;
645
+ this.name = 'TruncatedResponseError';
646
+ }
647
+ }
636
648
  function extractJsonFromResponse(body, onError) {
637
- // Already parsed
638
649
  if (typeof body === 'object' && body !== null)
639
650
  return body;
640
651
  if (typeof body === 'string') {
641
- // Strip BOM
642
652
  let s = body.replace(/^\uFEFF/, '');
643
- // Strip raw HTTP headers if present
644
- if (s.startsWith('HTTP/')) {
645
- const crlfSplit = s.indexOf('\r\n\r\n');
646
- const lfSplit = s.indexOf('\n\n');
647
- if (crlfSplit >= 0)
648
- s = s.slice(crlfSplit + 4);
649
- else if (lfSplit >= 0)
650
- s = s.slice(lfSplit + 2);
653
+ // Detect header block (handles normal CRLF + flattened single-line cases)
654
+ let headerBlock = '';
655
+ let jsonStartIdx = s.indexOf('{');
656
+ if (jsonStartIdx > 0) {
657
+ const headerCandidate = s.slice(0, jsonStartIdx);
658
+ if (/HTTP\/\d\.\d\s+\d{3}/i.test(headerCandidate) && /content-type:/i.test(headerCandidate)) {
659
+ headerBlock = headerCandidate;
660
+ s = s.slice(jsonStartIdx);
661
+ }
662
+ }
663
+ // Standard CRLF header removal if still present
664
+ if (/^HTTP\/\d\.\d \d{3}/.test(s)) {
665
+ const split = s.indexOf('\r\n\r\n');
666
+ const split2 = s.indexOf('\n\n');
667
+ const cut = split >= 0 ? split + 4 : (split2 >= 0 ? split2 + 2 : -1);
668
+ if (cut > 0) {
669
+ headerBlock = s.slice(0, cut);
670
+ s = s.slice(cut);
671
+ }
672
+ }
673
+ // Extract Content-Length from headerBlock (optional)
674
+ let expectedLength;
675
+ if (headerBlock) {
676
+ const m = headerBlock.match(/content-length:\s*(\d+)/i);
677
+ if (m)
678
+ expectedLength = parseInt(m[1], 10);
651
679
  }
652
- // Remove common XSSI guards
653
680
  s = s.replace(/^\)\]\}',?\s*/, '');
654
- // Try parsing the whole remainder
681
+ // Quick completeness checks before parse
682
+ const endsMidString = /"[^"]*$/.test(s); // naive: unmatched quote at end
683
+ const endsWithTokenLike = /"message":"[A-Za-z0-9\-_\.]*$/.test(s); // ended mid token string
684
+ const hasOpeningBrace = s.trimStart().startsWith('{');
655
685
  try {
656
- return JSON.parse(s);
686
+ const parsed = JSON.parse(s);
687
+ // If Content-Length existed and JSON length < expected, still truncated
688
+ if (expectedLength && s.length < expectedLength) {
689
+ throw new TruncatedResponseError(s, expectedLength, s.length);
690
+ }
691
+ return parsed;
657
692
  }
658
693
  catch {
659
- // Fallback: extract the first balanced JSON object/array
660
- const firstObj = s.indexOf('{');
661
- const firstArr = s.indexOf('[');
662
- const start = firstObj === -1 ? firstArr : (firstArr === -1 ? firstObj : Math.min(firstObj, firstArr));
663
- if (start !== -1) {
664
- const jsonSlice = extractBalancedJsonSegment(s, start);
665
- if (jsonSlice) {
694
+ // Try balanced segment
695
+ if (hasOpeningBrace) {
696
+ const balanced = extractBalancedJsonSegment(s, s.indexOf('{'));
697
+ if (balanced) {
666
698
  try {
667
- return JSON.parse(jsonSlice);
668
- }
669
- catch {
670
- // fallthrough to auto-fix below
699
+ const parsed = JSON.parse(balanced);
700
+ if (expectedLength && balanced.length < expectedLength) {
701
+ throw new TruncatedResponseError(s, expectedLength, balanced.length);
702
+ }
703
+ return parsed;
671
704
  }
705
+ catch { /* continue */ }
672
706
  }
673
707
  }
674
- // Auto-fix: append missing closing tokens if the payload ended early
675
- const repaired = tryAutoFixJson(s);
676
- if (repaired) {
677
- try {
678
- return JSON.parse(repaired);
679
- }
680
- catch {
681
- // ignore; will error below
708
+ // Auto-fix missing trailing braces only (not mid-string)
709
+ if (!endsMidString) {
710
+ const repaired = tryAutoFixJson(s);
711
+ if (repaired) {
712
+ try {
713
+ const parsed = JSON.parse(repaired);
714
+ if (expectedLength && repaired.length < expectedLength) {
715
+ throw new TruncatedResponseError(s, expectedLength, repaired.length);
716
+ }
717
+ return parsed;
718
+ }
719
+ catch { /* continue */ }
682
720
  }
683
721
  }
722
+ onError?.(body);
723
+ // Decide error type
724
+ if (expectedLength && s.length < expectedLength) {
725
+ throw new TruncatedResponseError(s, expectedLength, s.length);
726
+ }
727
+ if (endsMidString || endsWithTokenLike) {
728
+ throw new TruncatedResponseError(s, expectedLength, s.length);
729
+ }
730
+ throw new InvalidResponseBodyError(s);
684
731
  }
685
- onError?.(body);
686
- // Treat as retriable bad payload (e.g., truncated response)
687
- throw new InvalidResponseBodyError(s);
688
732
  }
689
733
  return body;
690
734
  }
691
- /**
692
- * Extract a balanced JSON object or array starting at `start`.
693
- * Handles nesting and string literals with escapes.
694
- */
695
735
  function extractBalancedJsonSegment(s, start) {
696
736
  const open = s[start];
697
737
  const close = open === '{' ? '}' : (open === '[' ? ']' : null);
698
738
  if (!close)
699
739
  return null;
700
- let depth = 0;
701
- let inString = false;
702
- let escaped = false;
740
+ let depth = 0, inString = false, escaped = false;
703
741
  for (let i = start; i < s.length; i++) {
704
742
  const ch = s[i];
705
743
  if (inString) {
706
- if (escaped) {
744
+ if (escaped)
707
745
  escaped = false;
708
- }
709
- else if (ch === '\\') {
746
+ else if (ch === '\\')
710
747
  escaped = true;
711
- }
712
- else if (ch === '"') {
748
+ else if (ch === '"')
713
749
  inString = false;
714
- }
715
750
  continue;
716
751
  }
717
752
  if (ch === '"') {
718
753
  inString = true;
719
754
  continue;
720
755
  }
721
- if (ch === open) {
756
+ if (ch === open)
722
757
  depth++;
723
- }
724
758
  else if (ch === close) {
725
759
  depth--;
726
760
  if (depth === 0)
@@ -729,67 +763,43 @@ function extractBalancedJsonSegment(s, start) {
729
763
  }
730
764
  return null;
731
765
  }
732
- /**
733
- * If the JSON ends early (e.g., missing the final '}'), append the exact
734
- * missing closing tokens using a nesting stack. Only applies when we're not
735
- * inside a string at EOF.
736
- */
737
766
  function tryAutoFixJson(s) {
738
- let inString = false;
739
- let escaped = false;
740
- const stack = []; // stack of expected closers in order
767
+ let inString = false, escaped = false;
768
+ const stack = [];
741
769
  for (let i = 0; i < s.length; i++) {
742
770
  const ch = s[i];
743
771
  if (inString) {
744
- if (escaped) {
772
+ if (escaped)
745
773
  escaped = false;
746
- }
747
- else if (ch === '\\') {
774
+ else if (ch === '\\')
748
775
  escaped = true;
749
- }
750
- else if (ch === '"') {
776
+ else if (ch === '"')
751
777
  inString = false;
752
- }
753
778
  continue;
754
779
  }
755
780
  if (ch === '"') {
756
781
  inString = true;
757
782
  continue;
758
783
  }
759
- if (ch === '{') {
784
+ if (ch === '{')
760
785
  stack.push('}');
761
- }
762
- else if (ch === '[') {
786
+ else if (ch === '[')
763
787
  stack.push(']');
764
- }
765
788
  else if ((ch === '}' || ch === ']') && stack.length) {
766
789
  const expected = stack[stack.length - 1];
767
- if (ch === expected) {
790
+ if (ch === expected)
768
791
  stack.pop();
769
- }
770
- else {
771
- // Structure mismatch; don't try to fix
792
+ else
772
793
  return null;
773
- }
774
794
  }
775
795
  }
776
- if (inString) {
777
- // Ends inside a string; don't attempt to fix
778
- return null;
779
- }
780
- if (!stack.length) {
781
- // Balanced already; nothing to fix
796
+ if (inString || !stack.length)
782
797
  return null;
783
- }
784
- // Ensure there is no non-whitespace trailing content (e.g., partial token)
785
- // If last non-ws is a comma or colon, adding closers will still be invalid; abort.
786
798
  const trimmed = s.trimEnd();
787
799
  const last = trimmed[trimmed.length - 1];
788
800
  if (last === ',' || last === ':')
789
801
  return null;
790
- // Append the needed closers in reverse order (stack top is last expected closer)
791
- const fix = stack.reverse().join('');
792
- return s + fix;
802
+ return s + stack.reverse().join('');
793
803
  }
794
804
 
795
805
  class LocalizeApiHelper {
@@ -862,16 +872,18 @@ class LocalizeApiHelper {
862
872
  }
863
873
  }
864
874
  createRequest(instance, method, url, body, options, onInvalidResponseBody) {
865
- // Force responseType 'text' so we always manually parse (even if server sends JSON)
866
- // Use observe:'body' implicitly (default) to avoid HttpEvent stream typing issues.
867
875
  const httpOptions = {
868
876
  ...options,
869
877
  body,
870
- responseType: 'text'
878
+ // Remove force text for diagnostics
879
+ // responseType: 'text' as const
871
880
  };
872
- // Explicit cast to Observable<string> ensures map sees string not HttpEvent
873
881
  const raw$ = instance.client.request(method, url, httpOptions);
874
- return raw$.pipe(takeUntil(instance.destroy$()), map((raw) => extractJsonFromResponse(raw, onInvalidResponseBody)), catchError((error) => throwError(() => error)));
882
+ return raw$.pipe(takeUntil(instance.destroy$()), map((raw) => {
883
+ if (typeof raw === 'string' && /^HTTP\/\d\.\d/.test(raw))
884
+ console.warn('[ApiHelper] Raw header block detected');
885
+ return extractJsonFromResponse(raw, onInvalidResponseBody);
886
+ }), catchError((error) => throwError(() => error)));
875
887
  }
876
888
  defaultRetryFunction(error) {
877
889
  // Don't retry for other errors (like 400, 401, 403, etc.)
@@ -885,10 +897,11 @@ class LocalizeApiHelper {
885
897
  }
886
898
  // Retriable: network errors, transient 5xx, or invalid/incomplete JSON payloads
887
899
  isRetriableError(error) {
888
- const isNetworkError = error?.status === 0;
889
- const isServerError = typeof error?.status === 'number' && error.status >= 500 && error.status < 600;
890
- const isBadPayload = error?.name === 'InvalidResponseBodyError';
891
- return isNetworkError || isServerError || isBadPayload;
900
+ const status = error?.status;
901
+ return status === 0
902
+ || (typeof status === 'number' && status >= 500 && status < 600)
903
+ || error?.name === 'InvalidResponseBodyError'
904
+ || error?.name === 'TruncatedResponseError';
892
905
  }
893
906
  async onConnectionError(options, error) {
894
907
  if (!options.connectionError)
@@ -1 +1 @@
1
- {"version":3,"file":"sambath999-localize-token.mjs","sources":["../../src/localize-token/localize.token.storage.ts","../../src/localize-token/localize.token.ts","../../src/localize-token/localize.token.service.ts","../../src/localize-logindlg/localize-logindlg.component.ts","../../src/localize-logindlg/localize-logindlg.service.ts","../../src/localize-logindlg/localize-logindlg.module.ts","../../src/localize-token/helpers/localize.api.assets.ts","../../src/localize-token/helpers/interfaces.ts","../../src/localize-token/helpers/json-extractor.ts","../../src/localize-token/helpers/loccalize.api.helper.ts","../../src/localize-token/localize.api.service.ts","../../src/localize-token/localize.token.module.ts","../../src/localize-api-token/localize-api-token.service.ts","../../src/localize-api-token/localize-api-token.module.ts","../../src/public-api.ts","../../src/sambath999-localize-token.ts"],"sourcesContent":["import { extractMainDomain } from \"./localize.token\";\r\n\r\nexport interface ICookieOptions {\r\n /**\r\n * Cookie expiration date in days from now. If not provided the cookie is a session cookie\r\n */\r\n expires?: number | Date;\r\n path?: string;\r\n domain?: string;\r\n secure?: boolean;\r\n samesite?: \"strict\" | \"lax\" | \"none\";\r\n}\r\n\r\n/**\r\n* Assembly of @package ng2-cookies @see https://www.npmjs.com/package/ng2-cookies\r\n*\r\n* Reassembled by\r\n* @author sambath999\r\n* @date_29_09_2021\r\n* Updated from raw parameters to\r\n* @param {ICookieOptions} options and added another newer cookie flag\r\n* @param {string} samesite\r\n* @param {constant} SameSiteTypes, @param {string} strict \"strict\", @param {string} lax \"lax\", @param {string} none \"none\"\r\n*\r\n* @enum\r\n*/\r\nexport class LocalizeTokenStorage {\r\n\r\n private get getDefaultOptions(): ICookieOptions {\r\n const mainDomain = extractMainDomain(window.location.hostname);\r\n return {\r\n path: '/',\r\n domain: mainDomain,\r\n secure: true,\r\n // samesite: SameSiteType.strict,\r\n expires: 1\r\n }\r\n }\r\n\r\n private readonly defaultOptions: ICookieOptions;\r\n constructor(_defaultOptions?: ICookieOptions) {\r\n this.defaultOptions = _defaultOptions ?? this.getDefaultOptions;\r\n }\r\n\r\n /**\r\n * Checks the existence of a single cookie by it's name\r\n *\r\n * @param {string} name Identification of the cookie\r\n * @returns existence of the cookie\r\n */\r\n check(name: string): boolean {\r\n if (typeof document === \"undefined\") return false;\r\n name = encodeURIComponent(name);\r\n const regexp = new RegExp('(?:^' + name + '|;\\\\s*' + name + ')=(.*?)(?:;|$)', 'g');\r\n return regexp.test(document.cookie);\r\n }\r\n\r\n /**\r\n * Retrieves a single cookie by it's name\r\n *\r\n * @param {string} name Identification of the Cookie\r\n * @returns The Cookie's value\r\n */\r\n get(name: string): string | undefined {\r\n if (!this.check(name)) return undefined;\r\n\r\n name = encodeURIComponent(name);\r\n const regexp = new RegExp('(?:^' + name + '|;\\\\s*' + name + ')=(.*?)(?:;|$)', 'g');\r\n const result = regexp.exec(document.cookie);\r\n return result ? decodeURIComponent(result[1]) : undefined;\r\n }\r\n\r\n /**\r\n * Retrieves a a list of all cookie avaiable\r\n *\r\n * @returns Object with all Cookies\r\n */\r\n getAll(): any {\r\n const cookies: any = {};\r\n if (document.cookie) {\r\n const split = document.cookie.split(';');\r\n for (const s of split) {\r\n const currCookie = s.split('=');\r\n currCookie[0] = currCookie[0].trim();\r\n cookies[decodeURIComponent(currCookie[0])] = decodeURIComponent(currCookie[1]);\r\n }\r\n }\r\n\r\n return cookies;\r\n }\r\n\r\n set(name: string, value: string, options?: ICookieOptions) {\r\n options ??= this.defaultOptions;\r\n const { expires, path, domain, secure, samesite } = { ...this.defaultOptions, ...options };\r\n let cookieStr = `${encodeURIComponent(name)}=${encodeURIComponent(value)};`;\r\n\r\n if (expires) {\r\n const dtExpires = typeof expires === 'number' ? new Date(Date.now() + expires * 864e5) : expires;\r\n cookieStr += `expires=${dtExpires.toUTCString()};`;\r\n }\r\n\r\n cookieStr += path ? `path=${path};` : '';\r\n cookieStr += domain ? `domain=${domain};` : '';\r\n cookieStr += secure ? 'secure;' : '';\r\n cookieStr += samesite ? `samesite=${samesite};` : '';\r\n\r\n document.cookie = cookieStr;\r\n }\r\n\r\n /**\r\n * Removes specified Cookie\r\n *\r\n * @param {string} name Cookie's identification\r\n * @param {string} path Path relative to the domain where the cookie should be avaiable. Default /\r\n * @param {string} domain Domain where the cookie should be avaiable. Default current domain\r\n */\r\n delete(name: string, path: string = '/', domain: string = window.location.hostname): void {\r\n this.set(name, '', { path, domain, expires: -1 });\r\n }\r\n\r\n /**\r\n * Delete all cookie avaiable\r\n */\r\n deleteAll(path?: string, domain?: string): void {\r\n const cookies = this.getAll();\r\n\r\n for (const cookieName of Object.keys(cookies)) {\r\n this.delete(cookieName, path, domain);\r\n }\r\n }\r\n\r\n}\r\n","import { LocalizeTokenStorage } from \"./localize.token.storage\";\r\n\r\ninterface ILocalizeTokenTokens {\r\n name: string;\r\n requestUrl?: string;\r\n}\r\n\r\nexport interface ILocalizeTokenConfig {\r\n /**\r\n * The main domain of the application to set the cookies to be available for cross application with subdomains.\r\n * \r\n * Default is location.hostname (current domain) and automatically set extracted main domain if it is subdomain.\r\n */\r\n mainDomain?: string;\r\n\r\n isProduction: boolean;\r\n authToken?: ILocalizeTokenTokens;\r\n refreshToken?: ILocalizeTokenTokens;\r\n tenantToken?: ILocalizeTokenTokens;\r\n requiredTenant?: boolean;\r\n}\r\n\r\nexport class LocalizeToken {\r\n\r\n static readonly storage = new LocalizeTokenStorage();\r\n\r\n static readonly httpHeaders = {\r\n AUTHORIZATION: 'Authorization',\r\n X_TENANT: 'X-Tenant',\r\n X_REFRESH_TOKEN: 'X-RefreshToken',\r\n CONTENT_TYPE: 'Content-Type',\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Waits for a specified amount of time.\r\n * @param milliseconds - The milliseconds to wait.\r\n * @param when - The condition to wait for. Default is true.\r\n * @returns - Promise<void>\r\n */\r\nexport async function waitFor(milliseconds: number, when: boolean = true) {\r\n if (!when) return;\r\n await new Promise(resolve => setTimeout(resolve, milliseconds));\r\n}\r\n\r\n/**\r\n * Waits until the condition is met.\r\n * @param when - The condition to wait for.\r\n * @param intervalNumber - The interval number in milliseconds to check the condition. Default is 50.\r\n */\r\nexport async function waitUntil(when: () => any, intervalNumber: number = 50) {\r\n\r\n async function isConditionMet() {\r\n const cond = when();\r\n const result = cond instanceof Promise\r\n ? await cond\r\n : cond;\r\n return result;\r\n }\r\n\r\n if (await isConditionMet()) return;\r\n\r\n await new Promise(resolve => {\r\n const interval = setInterval(async () => {\r\n if (await isConditionMet()) {\r\n clearInterval(interval);\r\n resolve(true);\r\n }\r\n }, intervalNumber);\r\n });\r\n}\r\n\r\nexport function extractMainDomain(subdomain?: string): string {\r\n subdomain ??= window.location.hostname;\r\n const parts = subdomain.split('.');\r\n return parts.length > 2 ? parts.slice(-2).join('.') : subdomain;\r\n}","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { extractMainDomain, ILocalizeTokenConfig, LocalizeToken } from './localize.token';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport * as jwt_decode from 'jwt-decode';\r\nexport interface JwtPayload extends jwt_decode.JwtPayload {\r\n // Define the structure of your JWT payload here\r\n email: string;\r\n sub: string;\r\n name: string;\r\n iat: number;\r\n exp: number;\r\n // Add other fields as needed\r\n}\r\n\r\ninterface IAuthToken {\r\n token: string;\r\n revoke: boolean;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class LocalizeTokenService implements OnDestroy {\r\n private readonly configSubject = new BehaviorSubject<Partial<ILocalizeTokenConfig>>({});\r\n readonly isRevokingTokenSubject = new BehaviorSubject<boolean>(false);\r\n private readonly defaultConfig: Partial<ILocalizeTokenConfig> = {\r\n mainDomain: extractMainDomain(),\r\n authToken: {\r\n name: 'auth-token',\r\n },\r\n refreshToken: {\r\n name: 'refresh-token',\r\n requestUrl: '/api/token/revoke'\r\n },\r\n }\r\n\r\n get config(): ILocalizeTokenConfig {\r\n this.throwIfNotInitialized();\r\n return this.configSubject.value as ILocalizeTokenConfig;\r\n }\r\n\r\n private isInitialized = false;\r\n\r\n init(config: ILocalizeTokenConfig) {\r\n console.log('LocalizeTokenService is initialized.');\r\n this.configSubject.next({ ...this.defaultConfig, ...config });\r\n this.isInitialized = true;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // this.configSubject.complete();\r\n // this.isRevokingTokenSubject.complete();\r\n }\r\n\r\n private get authToken() { return this.storageGet() }\r\n private set authToken(value: IAuthToken | undefined) {\r\n value\r\n ? this.storageSet(value)\r\n : LocalizeToken.storage.delete(this.config.authToken?.name!);\r\n }\r\n\r\n get tenantToken() { return LocalizeToken.storage.get(this.config.tenantToken?.name || '') }\r\n\r\n get refreshToken() { return LocalizeToken.storage.get(this.config.refreshToken?.name || '') }\r\n get accessToken() { return this.authToken?.token }\r\n\r\n set accessToken(value: string | undefined) {\r\n value && (this.authToken = { token: value, revoke: false })\r\n }\r\n\r\n get isRevokingToken() { return this.isRevokingTokenSubject.value /* this.authToken?.revoke ?? false */ }\r\n\r\n set isRevokingToken(value: boolean) {\r\n this.isRevokingTokenSubject.next(value);\r\n this.authToken && (this.authToken = { ...this.authToken, revoke: value })\r\n }\r\n\r\n private storageGet() {\r\n try {\r\n const encoded = LocalizeToken.storage.get(this.config.authToken?.name || '');\r\n const decoded = atob(encoded || '');\r\n return JSON.parse(decoded) as IAuthToken;\r\n } catch {\r\n return undefined\r\n }\r\n }\r\n\r\n private storageSet(value: IAuthToken) {\r\n const base64 = btoa(JSON.stringify(value));\r\n LocalizeToken.storage.set(this.config.authToken?.name || '', base64);\r\n }\r\n\r\n tokensValid(): boolean | undefined {\r\n if (!this.refreshToken?.length) return false;\r\n if (this.config.requiredTenant && !this.tenantToken?.length) return false;\r\n return true;\r\n }\r\n\r\n decodeToken = (token: string) => jwt_decode.jwtDecode<JwtPayload>(token);\r\n get decodeRefreshToken() {\r\n const token = this.refreshToken;\r\n return !token ? null : this.decodeToken(token);\r\n }\r\n\r\n private throwIfNotInitialized() {\r\n if (!this.isInitialized) {\r\n throw new Error('LocalizeTokenService is not initialized. Call init() method before using it.');\r\n }\r\n }\r\n\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport {\r\n ChangeDetectorRef,\r\n Component,\r\n OnInit,\r\n ViewEncapsulation,\r\n} from \"@angular/core\";\r\nimport { MessageService } from \"primeng/api\";\r\nimport { DynamicDialogConfig, DynamicDialogRef } from \"primeng/dynamicdialog\";\r\nimport { JwtPayload, LocalizeTokenService } from \"../localize-token/localize.token.service\";\r\nimport { LocalizeToken } from \"../localize-token/localize.token\";\r\nimport { ILoginDialogConfig, ILoginDialogProperties } from \"./localize-logindlg.service\";\r\nimport { DomSanitizer } from \"@angular/platform-browser\";\r\n\r\n@Component({\r\n standalone: false,\r\n styles: [`\r\n #login-dlg-wrap {\r\n width: 100%;\r\n max-width: 400px;\r\n margin: 0 auto;\r\n padding: 30px;\r\n height: 100%;\r\n }\r\n \r\n .login-dlg-elm {\r\n margin-top: 1rem;\r\n }\r\n\r\n .login-dlg-elm.login-dlg-suggest {\r\n display: flex ;\r\n align-items: center;\r\n user-select: none;\r\n border-bottom: solid 1px #ddd;\r\n border-radius: 5px;\r\n padding: 5px 10px;\r\n background: #f9f9f9;\r\n box-shadow: 1px 5px 10px -12px #000;\r\n }\r\n \r\n #login-dlg-header {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n \r\n #login-dlg-header h3 {\r\n font-weight: bold;\r\n font-size: 0.9rem;\r\n color: orange;\r\n text-align: center;\r\n }\r\n \r\n #login-logo {\r\n height: 55px;\r\n width: 55px;\r\n /* background: url(\"/assets/images/logo-300px.png\") no-repeat; */\r\n background-size: contain !important;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup {\r\n height: 45px;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup .p-inputgroup-addon {\r\n height: 45px;\r\n border-radius: 15px 0 0 15px;\r\n width: 50px;\r\n }\r\n #login-dlg-content *{\r\n font-size: .9rem;\r\n /* font-family: 'Lexend', 'Roboto', sans-serif, 'material-icons-round'; */\r\n }\r\n \r\n #login-dlg-content .p-inputgroup .p-inputgroup-addon * {\r\n font-size: 1rem;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup input {\r\n height: 45px;\r\n border-radius: 0 15px 15px 0;\r\n }\r\n \r\n #login-dlg-content button {\r\n height: 45px;\r\n border-radius: 15px;\r\n }\r\n \r\n /*check animation block*/\r\n \r\n .check-animation-wrap {\r\n top: 0;\r\n left: 0;\r\n position: absolute;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: calc(100% - 200px);\r\n min-height: 400px;\r\n }\r\n \r\n .check-main-container {\r\n width: 100%;\r\n height: 100vh;\r\n display: flex;\r\n flex-flow: column;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n \r\n .check-container {\r\n width: 6.25rem;\r\n height: 7.5rem;\r\n display: flex;\r\n flex-flow: column;\r\n align-items: center;\r\n justify-content: space-between;\r\n }\r\n \r\n .check-container .check-background {\r\n width: 100%;\r\n height: calc(100% - 1.25rem);\r\n background: linear-gradient(to bottom right, #5de593, #41d67c);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n transform: scale(0.84);\r\n border-radius: 50%;\r\n animation: animateContainer 0.75s ease-out forwards 0.75s;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n opacity: 0;\r\n }\r\n \r\n .check-container .check-background svg {\r\n width: 65%;\r\n transform: translateY(0.25rem);\r\n stroke-dasharray: 80;\r\n stroke-dashoffset: 80;\r\n animation: animateCheck 0.35s forwards 1.25s ease-out;\r\n min-width: auto !important;\r\n }\r\n \r\n .check-container .check-shadow {\r\n bottom: calc(-15% - 5px);\r\n left: 0;\r\n border-radius: 50%;\r\n background: radial-gradient(closest-side, rgba(73, 218, 131, 1), transparent);\r\n animation: animateShadow 0.75s ease-out forwards 0.75s;\r\n }\r\n \r\n @keyframes animateContainer {\r\n 0% {\r\n opacity: 0;\r\n transform: scale(0);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 25% {\r\n opacity: 1;\r\n transform: scale(0.9);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 43.75% {\r\n transform: scale(1.15);\r\n box-shadow: 0px 0px 0px 43.334px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 62.5% {\r\n transform: scale(1);\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 21.667px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 81.25% {\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 100% {\r\n opacity: 1;\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n }\r\n \r\n @keyframes animateCheck {\r\n from {\r\n stroke-dashoffset: 80;\r\n }\r\n \r\n to {\r\n stroke-dashoffset: 0;\r\n }\r\n }\r\n \r\n @keyframes animateShadow {\r\n 0% {\r\n opacity: 0;\r\n width: 100%;\r\n height: 15%;\r\n }\r\n \r\n 25% {\r\n opacity: 0.25;\r\n }\r\n \r\n 43.75% {\r\n width: 40%;\r\n height: 7%;\r\n opacity: 0.35;\r\n }\r\n \r\n 100% {\r\n width: 85%;\r\n height: 15%;\r\n opacity: 0.25;\r\n }\r\n }\r\n #login-dlg-wrap .loader-wrap {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n height:100%;\r\n width:100%;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n z-index: 100;\r\n background: #ffffff42;\r\n backdrop-filter: blur(1px);\r\n }\r\n\r\n #login-dlg-wrap .login-dlg-loader {\r\n border: 15px solid #e7e7e7;\r\n border-top: 15px solid #52dba1;\r\n border-radius: 50%;\r\n width: 100px;\r\n height: 100px;\r\n animation: spinloader 2s linear infinite;\r\n }\r\n\r\n #login-dlg-wrap .loader-wrap::before {\r\n content: \"\";\r\n position: absolute;\r\n width: 70px;\r\n height: 70px;\r\n transform: translate(-50%, -50%);\r\n z-index: 1;\r\n border: 15px solid #e7e7e700;\r\n border-top: 15px solid #52dba1c9;\r\n border-radius: 50%;\r\n animation: spinloader .75s linear infinite;\r\n }\r\n\r\n @keyframes spinloader {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n template: `<p-toast key=\"$login-dlg\" position=\"top-center\"></p-toast>\r\n <div id=\"login-dlg-wrap\">\r\n <div id=\"login-dlg-header\">\r\n <div id=\"login-logo\" class=\"p-mb-2\" style=\"background: url('{{properties.logoImage}}') no-repeat\"></div>\r\n <h3 *ngIf=\"!success\" [innerHTML]=\"sanitizedTitle\"></h3>\r\n <h3 *ngIf=\"success\" style=\"color:green !important;\">{{properties.loginSuccessMessage}}</h3>\r\n </div>\r\n <div id=\"login-dlg-content\">\r\n <ng-container *ngIf=\"!success\">\r\n <div *ngIf=\"loading\" class=\"loader-wrap\">\r\n <div class=\"login-dlg-loader\"></div>\r\n </div>\r\n <div class=\"login-dlg-elm\">\r\n <p-inputgroup>\r\n <p-inputgroup-addon>\r\n <i class=\"material-icons-round\">person</i>\r\n </p-inputgroup-addon>\r\n <input disabled pInputText type=\"text\" placeholder=\"{{properties.username?.placeHolder}}\" [value]=\"decodeToken?.email\" />\r\n </p-inputgroup>\r\n </div>\r\n \r\n <div class=\"login-dlg-elm\">\r\n <p-inputgroup>\r\n <p-inputgroup-addon>\r\n <i class=\"material-icons-round\">lock</i>\r\n </p-inputgroup-addon>\r\n <input [disabled]=\"loading\" (keydown.enter)=\"clickLogin()\" pInputText type=\"password\" \r\n placeholder=\"{{properties.password?.placeHolder}}\" [(ngModel)]=\"password\"\r\n autofocus />\r\n </p-inputgroup>\r\n </div>\r\n <div class=\"login-dlg-elm\">\r\n <button style=\"width: 100%;\" pButton type=\"button\" label=\"{{properties.loginButton?.placeHolder}}\" (click)=\"clickLogin()\"\r\n [disabled]=\"!password || loading\"></button>\r\n </div>\r\n \r\n <div class=\"login-dlg-elm login-dlg-suggest\" style=\"display:flex;align-items: center;user-select: none;\">\r\n <span>{{properties.logoutButton?.message}}</span>\r\n <button class=\"p-button-text\" pButton type=\"button\" label=\"{{properties.logoutButton?.placeHolder}}\" \r\n (click)=\"clickLogout()\"></button>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"success\">\r\n <div style=\"margin-top:35px;\"></div>\r\n <div class=\"check-animation-wrap\">\r\n <div class=\"check-main-container\">\r\n <div class=\"check-container\">\r\n <div class=\"check-background\">\r\n <svg viewBox=\"0 0 65 51\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M7 25L27.3077 44L58.5 7\" stroke=\"white\" stroke-width=\"13\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>`,\r\n selector: \"app-localize-logindlg\",\r\n providers: [MessageService],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class LocalizeLogindlgComponent implements OnInit {\r\n readonly messageKey = \"$login-dlg\";\r\n password: any;\r\n readonly decodeToken: JwtPayload | null;\r\n loading = false;\r\n success = false;\r\n private get config() { return this.tokenService.config; }\r\n private readonly loginConfig: ILoginDialogConfig\r\n\r\n private logout?: () => any\r\n private loginUrl?: string;\r\n readonly properties: ILoginDialogProperties;\r\n\r\n\r\n constructor(\r\n private readonly messageService: MessageService,\r\n private readonly cdt: ChangeDetectorRef,\r\n private readonly dlgRef: DynamicDialogRef,\r\n private readonly dlgConfig: DynamicDialogConfig,\r\n private readonly tokenService: LocalizeTokenService,\r\n private readonly httpClient: HttpClient,\r\n private readonly sanitizer: DomSanitizer\r\n ) {\r\n this.decodeToken = this.tokenService.decodeRefreshToken;\r\n this.loginConfig = this.dlgConfig.data.loginConfig;\r\n this.properties = this.loginConfig.properties!;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.dlgConfig.closable = false;\r\n this.logout = this.loginConfig.logoutFunc;\r\n this.loginUrl = this.loginConfig.loginUrl\r\n\r\n if (!this.decodeToken) {\r\n this.showMessage(\"error\", \"Token is invalid\");\r\n setTimeout(() => this.logout?.(), 2000);\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.cdt.detectChanges();\r\n }\r\n\r\n async clickLogin() {\r\n if (!this.isValidPassword) {\r\n return this.showMessage(\"error\", \"Password is required and must be at least 6 characters\");\r\n }\r\n\r\n this.loading = true;\r\n const loginRes = await this.login();\r\n if (!loginRes?.status) {\r\n return this.showMessage(\"error\", loginRes.message ?? \"An error occurred\");\r\n }\r\n\r\n this.tokenService.accessToken = loginRes.tokens.accessToken;\r\n const cookieOptions = { expires: this.loginConfig.expire ?? 365 }\r\n LocalizeToken.storage.set(this.config.refreshToken?.name || '', loginRes.tokens.refreshToken, cookieOptions);\r\n this.success = true;\r\n setTimeout(() => {\r\n this.dlgConfig.dismissableMask = true;\r\n this.dlgConfig.modal = false;\r\n this.dlgRef.close(true);\r\n }, 2000);\r\n }\r\n\r\n private async login() {\r\n if (!this.loginUrl?.trim().length) {\r\n this.showMessage(\"error\", \"Login url is required\");\r\n throw new Error(\"Login url is required\");\r\n }\r\n\r\n try {\r\n\r\n if (this.loginConfig.loginFunction) {\r\n console.log(\"Using custom login function\");\r\n return await this.loginConfig.loginFunction(this.decodeToken?.email ?? '', this.password.trim(), this.getHeaders());\r\n }\r\n\r\n return await new Promise<any>((resolve, reject) =>\r\n this.httpClient.post(this.loginUrl!,\r\n { password: this.password.trim() },\r\n { headers: this.getHeaders() }).subscribe({ next: resolve, error: reject }));\r\n\r\n } catch (e: any) {\r\n this.showMessage(\"error\", e.message);\r\n return null;\r\n }\r\n }\r\n\r\n private getHeaders() {\r\n return {\r\n [LocalizeToken.httpHeaders.X_REFRESH_TOKEN]: this.tokenService.refreshToken ?? \"\",\r\n [LocalizeToken.httpHeaders.X_TENANT]: this.tokenService.tenantToken ?? \"\",\r\n };\r\n }\r\n\r\n get isValidPassword(): boolean {\r\n this.loading = false;\r\n return this.properties.passwordValidator\r\n ? this.properties.passwordValidator(this.password)\r\n : this.password && this.password.trim().length >= 6 && this.password.trim().length <= 50;\r\n }\r\n\r\n clickLogout = () => this.logout?.();\r\n\r\n private showMessage(severity: string, summary: string) {\r\n this.messageService.add({ key: this.messageKey, severity, summary });\r\n this.loading = false;\r\n }\r\n\r\n get sanitizedTitle() {\r\n return this.sanitizer.bypassSecurityTrustHtml(this.properties.title ?? '');\r\n }\r\n}\r\n","import { Injectable, Injector } from '@angular/core';\nimport { DialogService, DynamicDialogConfig } from 'primeng/dynamicdialog';\nimport { LocalizeLogindlgComponent } from './localize-logindlg.component';\nexport interface ILoginDialogPlaceHolder {\n /**\n * Message to display in the input field, typically used for error messages or hints.\n * This is optional and can be used to provide additional context or instructions to the user.\n */\n message?: string;\n /**\n * Placeholder or label text for the input field\n */\n placeHolder?: string;\n}\n\nexport interface ILoginDialogProperties {\n /**\n * Title of the login dialog\n */\n title?: string;\n loginSuccessMessage?: string;\n /**\n * Logog image path or URL to display in the login dialog\n * If not provided, the \"/assets/images/logo-300px.png\" image will be used.\n */\n logoImage?: string;\n username?: ILoginDialogPlaceHolder;\n password?: ILoginDialogPlaceHolder;\n loginButton?: ILoginDialogPlaceHolder;\n logoutButton?: ILoginDialogPlaceHolder;\n /**\n * Function to validate the password.\n * If not provided, the default validation checks if the password is between 6 and 50 characters long.\n * @param password\n * @returns\n */\n passwordValidator?: (password: string) => boolean;\n}\n\nexport interface ILoginDialogConfig {\n loginUrl?: string;\n logoutUrl?: string;\n loginFunction?: (username: string, password: string, headers?: { [key: string]: string }) => Promise<any>;\n logoutFunc?: () => void;\n /**\n * Cookie expiration date in days from now. If not provided the cookie is a session cookie\n */\n expire?: number;\n /**\n * Configuration for the login dialog.\n * This interface defines the properties that can be used to customize the login dialog's behavior and appearance\n */\n properties?: ILoginDialogProperties;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocalizeLogindlgService {\n\n constructor(private readonly injector: Injector) { }\n\n async openLoginDialog(loginConfig: ILoginDialogConfig, config?: DynamicDialogConfig) {\n\n config = this.intercepDialogConfig(config);\n this.initConfig(loginConfig);\n\n config.data = { ...(config.data || {}), ...{ loginConfig } };\n\n const dialogService = this.injector.get(DialogService);\n const dialog = dialogService.open(LocalizeLogindlgComponent, config);\n\n await new Promise<void>((resolve) =>\n dialog.onClose.subscribe(res => {\n if (res) {\n resolve();\n }\n }));\n }\n\n private intercepDialogConfig(config?: DynamicDialogConfig) {\n config ??= {\n header: 'Login',\n style: { 'max-width': '400px', width: '100%', 'height': '650px' },\n modal: true,\n closable: false,\n showHeader: false,\n }\n\n config = {\n ...config, ...{\n contentStyle: { 'height': '100%', 'border-radius': '20px' }\n }\n }\n config.style = { ...config.style, ...{ 'border-radius': '20px' } };\n return config;\n }\n\n\n private initConfig(loginConfig: ILoginDialogConfig) {\n loginConfig ??= {}\n loginConfig.properties ??= {\n title: 'Your session is expired!<br/> Please login again to continue.',\n loginSuccessMessage: 'You have successfully logged in.',\n logoImage: '/assets/images/logo-300px.png',\n username: { placeHolder: 'Username' },\n password: { placeHolder: 'Password' },\n loginButton: { placeHolder: 'Login' },\n logoutButton: {\n message: 'No, I want to login with another user.',\n placeHolder: 'Logout'\n }\n }\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { LocalizeLogindlgComponent } from \"./localize-logindlg.component\";\nimport { InputTextModule } from \"primeng/inputtext\";\nimport { ButtonModule } from \"primeng/button\";\nimport { ToastModule } from 'primeng/toast';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { FormsModule } from '@angular/forms';\nimport { LocalizeLogindlgService } from \"./localize-logindlg.service\";\nimport { InputGroupModule } from 'primeng/inputgroup';\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\n\n@NgModule({\n declarations: [LocalizeLogindlgComponent],\n exports: [LocalizeLogindlgComponent],\n imports: [\n CommonModule,\n ToastModule,\n InputTextModule,\n BrowserModule,\n FormsModule,\n ButtonModule,\n InputGroupModule,\n InputGroupAddonModule\n ],\n providers: [LocalizeLogindlgService],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class LocalizeLogindlgModule { }\n","export const LOCALIZE_API_ASSETS = {\r\n network: {\r\n noConnection: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <svg id=\"lze-no-connection\" data-name=\"Layer 2\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 77.29 70.98\">\r\n <defs>\r\n <style> .cls-1 { fill: #fff; } .cls-2, .cls-3 { fill: #e30613; } .cls-3 { stroke: #e30613; stroke-miterlimit: 10; stroke-width: .25px; } </style>\r\n </defs>\r\n <g id=\"Layer_3\" data-name=\"Layer 3\">\r\n <g>\r\n <path class=\"cls-1\" d=\"m73.29,35c-1.2,0-2.33-.53-3.09-1.46-.48-.57-11.23-13.2-31.55-13.2s-31.11,12.66-31.56,13.2c-1.4,1.71-3.92,1.95-5.63.55-1.71-1.4-1.95-3.92-.55-5.63.54-.66,13.47-16.12,37.74-16.12s37.2,15.46,37.74,16.12c1.4,1.71,1.15,4.23-.56,5.62-.71.58-1.61.9-2.53.9Z\"/>\r\n <path class=\"cls-1\" d=\"m63.96,45.66c-1.19,0-2.32-.53-3.08-1.44-5.79-6.05-13.86-9.39-22.24-9.21-8.38-.18-16.45,3.16-22.24,9.22-1.46,1.65-3.99,1.81-5.64.35-1.57-1.39-1.8-3.77-.52-5.43,7.32-7.89,17.64-12.29,28.4-12.12,10.76-.17,21.08,4.24,28.4,12.12,1.4,1.71,1.15,4.23-.56,5.62-.71.58-1.6.9-2.53.9Z\"/>\r\n <path class=\"cls-1\" d=\"m53.3,56.32c-1.24,0-2.41-.57-3.16-1.55-5.73-6.35-15.52-6.85-21.87-1.13-.4.36-.77.73-1.13,1.13-1.36,1.73-3.88,2.03-5.61.67-1.71-1.34-2.03-3.8-.73-5.54,8.39-9.85,23.18-11.04,33.03-2.65.95.81,1.84,1.69,2.65,2.65,1.34,1.75,1,4.26-.75,5.6-.7.53-1.55.82-2.43.82Z\"/>\r\n </g>\r\n <path class=\"cls-2\" d=\"m47.21,9.45l-4.06,41.36c-.64,5.42-8.39,5.39-9.01,0,0,0-4.06-41.36-4.06-41.36-.46-4.73,2.99-8.94,7.72-9.4,5.33-.58,9.97,4.09,9.4,9.4h0Z\"/>\r\n <circle class=\"cls-3\" cx=\"38.64\" cy=\"64.79\" r=\"6.07\"/>\r\n </g>\r\n </svg>`\r\n }\r\n}","import { HttpErrorResponse } from \"@angular/common/http\";\r\n\r\n/**\r\n * Http method options\r\n */\r\nexport enum EMethod {\r\n POST = 'post',\r\n GET = 'get',\r\n PUT = 'put',\r\n DELETE = 'delete',\r\n PATCH = 'patch',\r\n}\r\n\r\nexport interface IOnConnectionError {\r\n /**\r\n * Callback function to execute when a connection error occurs.\r\n * This function should return a Promise or any value.\r\n */\r\n callback?: (error: HttpErrorResponse) => Promise<void> | any;\r\n /**\r\n * If true, the request will block the screen with overlay on connection errors.\r\n * Default is false.\r\n */\r\n blockScreen?: boolean;\r\n\r\n /** Optional z-index for the block screen overlay.\r\n * Default is 10000.\r\n */\r\n blockScreenZIndex?: number;\r\n\r\n /**\r\n * Optional message to display when a connection error occurs.\r\n */\r\n message?: string;\r\n suggestionMessage?: string;\r\n}\r\n\r\ninterface IRetryOptions {\r\n\r\n /**\r\n * Maximum number of retries for a failed request.\r\n * Default is 100.\r\n */\r\n maxRetries?: number;\r\n\r\n /**\r\n * Delay in milliseconds before retrying a failed request.\r\n * Default is 500ms.\r\n */\r\n delay?: number;\r\n\r\n /**\r\n * Function to determine if a request should be retried based on the error.\r\n * If not provided, the default function will retry for network errors and server errors (status 500-599).\r\n * @param error - The error object from the failed request.\r\n * @returns true if the request should be retried, false otherwise.\r\n */\r\n retryFunction?: (error: HttpErrorResponse) => Promise<boolean> | any;\r\n\r\n /**\r\n * Function to execute when a connection error occurs.\r\n * This function should return a Promise or any value.\r\n */\r\n onConnectionError?: IOnConnectionError;\r\n\r\n}\r\n\r\nexport interface ILocalizeApiConfigs {\r\n onPrepareRequest?: () => Promise<void> | any;\r\n onAutoLogout?: () => Promise<void> | any;\r\n onRevokeUnauthorized?: () => Promise<void> | any;\r\n onResponseBodyInvalid?: (body: any) => void;\r\n waitEachRequest?: {\r\n milliseconds: number;\r\n };\r\n enableRequestCancellation?: boolean;\r\n\r\n /**\r\n * Config for retrying failed requests.\r\n * If not provided, the default retry options will be used.\r\n */\r\n retryOptions?: IRetryOptions;\r\n}\r\n\r\nexport interface IApiOptions {\r\n headers?: { [key: string]: string };\r\n method: EMethod;\r\n requestUrl: string;\r\n requestBody?: any;\r\n isFormData?: boolean;\r\n /**\r\n * If true, the request will use the refresh token for authorization.\r\n */\r\n refreshToken?: boolean;\r\n}\r\n\r\nexport interface IHeader {\r\n [key: string]: string;\r\n}\r\n\r\n// export interface INormalizedError {\r\n// error: any;\r\n// code: string;\r\n// message: string;\r\n// details?: any;\r\n// status: number;\r\n// }\r\n","export class InvalidResponseBodyError extends Error {\r\n constructor(public raw: string) {\r\n super('Invalid or incomplete JSON response');\r\n this.name = 'InvalidResponseBodyError';\r\n }\r\n}\r\n\r\nexport function extractJsonFromResponse(body: any, onError?: (body: any) => void): any {\r\n // Already parsed\r\n if (typeof body === 'object' && body !== null) return body;\r\n\r\n if (typeof body === 'string') {\r\n // Strip BOM\r\n let s = body.replace(/^\\uFEFF/, '');\r\n\r\n // Strip raw HTTP headers if present\r\n if (s.startsWith('HTTP/')) {\r\n const crlfSplit = s.indexOf('\\r\\n\\r\\n');\r\n const lfSplit = s.indexOf('\\n\\n');\r\n if (crlfSplit >= 0) s = s.slice(crlfSplit + 4);\r\n else if (lfSplit >= 0) s = s.slice(lfSplit + 2);\r\n }\r\n\r\n // Remove common XSSI guards\r\n s = s.replace(/^\\)\\]\\}',?\\s*/, '');\r\n\r\n // Try parsing the whole remainder\r\n try {\r\n return JSON.parse(s);\r\n } catch {\r\n // Fallback: extract the first balanced JSON object/array\r\n const firstObj = s.indexOf('{');\r\n const firstArr = s.indexOf('[');\r\n const start = firstObj === -1 ? firstArr : (firstArr === -1 ? firstObj : Math.min(firstObj, firstArr));\r\n\r\n if (start !== -1) {\r\n const jsonSlice = extractBalancedJsonSegment(s, start);\r\n if (jsonSlice) {\r\n try {\r\n return JSON.parse(jsonSlice);\r\n } catch {\r\n // fallthrough to auto-fix below\r\n }\r\n }\r\n }\r\n\r\n // Auto-fix: append missing closing tokens if the payload ended early\r\n const repaired = tryAutoFixJson(s);\r\n if (repaired) {\r\n try {\r\n return JSON.parse(repaired);\r\n } catch {\r\n // ignore; will error below\r\n }\r\n }\r\n }\r\n\r\n onError?.(body);\r\n // Treat as retriable bad payload (e.g., truncated response)\r\n throw new InvalidResponseBodyError(s);\r\n }\r\n\r\n return body;\r\n}\r\n\r\n/**\r\n * Extract a balanced JSON object or array starting at `start`.\r\n * Handles nesting and string literals with escapes.\r\n */\r\nfunction extractBalancedJsonSegment(s: string, start: number): string | null {\r\n const open = s[start];\r\n const close = open === '{' ? '}' : (open === '[' ? ']' : null);\r\n if (!close) return null;\r\n\r\n let depth = 0;\r\n let inString = false;\r\n let escaped = false;\r\n\r\n for (let i = start; i < s.length; i++) {\r\n const ch = s[i];\r\n\r\n if (inString) {\r\n if (escaped) {\r\n escaped = false;\r\n } else if (ch === '\\\\') {\r\n escaped = true;\r\n } else if (ch === '\"') {\r\n inString = false;\r\n }\r\n continue;\r\n }\r\n\r\n if (ch === '\"') {\r\n inString = true;\r\n continue;\r\n }\r\n\r\n if (ch === open) {\r\n depth++;\r\n } else if (ch === close) {\r\n depth--;\r\n if (depth === 0) return s.slice(start, i + 1);\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * If the JSON ends early (e.g., missing the final '}'), append the exact\r\n * missing closing tokens using a nesting stack. Only applies when we're not\r\n * inside a string at EOF.\r\n */\r\nfunction tryAutoFixJson(s: string): string | null {\r\n let inString = false;\r\n let escaped = false;\r\n const stack: string[] = []; // stack of expected closers in order\r\n for (let i = 0; i < s.length; i++) {\r\n const ch = s[i];\r\n\r\n if (inString) {\r\n if (escaped) {\r\n escaped = false;\r\n } else if (ch === '\\\\') {\r\n escaped = true;\r\n } else if (ch === '\"') {\r\n inString = false;\r\n }\r\n continue;\r\n }\r\n\r\n if (ch === '\"') {\r\n inString = true;\r\n continue;\r\n }\r\n\r\n if (ch === '{') {\r\n stack.push('}');\r\n } else if (ch === '[') {\r\n stack.push(']');\r\n } else if ((ch === '}' || ch === ']') && stack.length) {\r\n const expected = stack[stack.length - 1];\r\n if (ch === expected) {\r\n stack.pop();\r\n } else {\r\n // Structure mismatch; don't try to fix\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n if (inString) {\r\n // Ends inside a string; don't attempt to fix\r\n return null;\r\n }\r\n\r\n if (!stack.length) {\r\n // Balanced already; nothing to fix\r\n return null;\r\n }\r\n\r\n // Ensure there is no non-whitespace trailing content (e.g., partial token)\r\n // If last non-ws is a comma or colon, adding closers will still be invalid; abort.\r\n const trimmed = s.trimEnd();\r\n const last = trimmed[trimmed.length - 1];\r\n if (last === ',' || last === ':') return null;\r\n\r\n // Append the needed closers in reverse order (stack top is last expected closer)\r\n const fix = stack.reverse().join('');\r\n return s + fix;\r\n}\r\n","import { HttpClient, HttpErrorResponse, HttpHeaders } from \"@angular/common/http\";\r\nimport { IApiOptions, ILocalizeApiConfigs, IOnConnectionError } from \"./interfaces\";\r\nimport { takeUntil, catchError, throwError, Subject, map } from \"rxjs\";\r\nimport { waitFor } from \"../localize.token\";\r\nimport { LOCALIZE_API_ASSETS } from \"./localize.api.assets\";\r\nimport { extractJsonFromResponse } from \"./json-extractor\";\r\n\r\ninterface IRequestInstance {\r\n client: HttpClient;\r\n destroy$: () => Subject<void>;\r\n}\r\n\r\ninterface IRetryOptions {\r\n maxRetries: () => number;\r\n delay: number;\r\n callback: () => Promise<any> | any;\r\n retryUnless?: (error: any) => boolean;\r\n onError?: (error: any) => Promise<void> | any;\r\n connectionError?: IOnConnectionError\r\n}\r\n\r\nclass LocalizeApiHelper {\r\n\r\n readonly defaultRetryOptions: Partial<IRetryOptions> = {\r\n connectionError: {\r\n message: 'Connection error occurred. Please wait',\r\n blockScreen: true,\r\n blockScreenZIndex: 10000\r\n }\r\n };\r\n\r\n async performRetry<T = any>(options: IRetryOptions): Promise<T> {\r\n let attempts = 0;\r\n let lastError: any;\r\n let consoleCount = 0;\r\n\r\n // Merge default retry options with provided options\r\n options = { ...this.defaultRetryOptions, ...options }\r\n\r\n let styleElement: HTMLStyleElement | undefined;\r\n\r\n while (attempts < options.maxRetries()) {\r\n try {\r\n const result = await options.callback();\r\n this.removeBlocker(styleElement);\r\n return result;\r\n\r\n } catch (error: any) {\r\n lastError = error;\r\n\r\n if (consoleCount >= 7) {\r\n console.clear();\r\n consoleCount = 0;\r\n }\r\n\r\n if (options.retryUnless && !options.retryUnless(error))\r\n throw error; // If the error should not be retried, rethrow it\r\n\r\n // Handle connection error (only blocks UI for true connection issues)\r\n styleElement = await this.onConnectionError(options, error);\r\n\r\n if (options.onError)\r\n await this.invokeHook(options.onError.bind(this, error));\r\n\r\n if (attempts >= options.maxRetries() - 1)\r\n throw error;\r\n\r\n attempts++;\r\n consoleCount++;\r\n console.warn(`Attempt ${attempts} failed. Retrying...`, error);\r\n await waitFor(options.delay);\r\n }\r\n }\r\n console.warn(`Failed after ${options.maxRetries()} attempts`);\r\n throw lastError;\r\n }\r\n\r\n async performRequestWithRetry<T = any>(\r\n options: IApiOptions,\r\n config: ILocalizeApiConfigs,\r\n performRequest: <T = any>(options: IApiOptions) => Promise<T>\r\n ): Promise<T> {\r\n\r\n const retryUnless = config.retryOptions?.retryFunction\r\n || this.isRetriableError.bind(this);\r\n\r\n return await this.performRetry({\r\n connectionError: config.retryOptions?.onConnectionError,\r\n maxRetries: () => config.retryOptions?.maxRetries ?? 1000,\r\n delay: config.retryOptions?.delay ?? 500,\r\n callback: () => performRequest<T>(options),\r\n retryUnless: retryUnless,\r\n })\r\n }\r\n\r\n buildUrl(baseUrl: string, path: string): string {\r\n const normalizedUrl = `${baseUrl.trim().replace(/\\/?$/, '/')}${path.trim().replace(/^\\//, '')}`;\r\n return normalizedUrl.endsWith('/')\r\n ? normalizedUrl.slice(0, -1)\r\n : normalizedUrl;\r\n }\r\n\r\n async invokeHook(callback?: () => Promise<any> | any): Promise<any> {\r\n if (!callback) return;\r\n\r\n const result = callback();\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n }\r\n\r\n createRequest<T = any>(\r\n instance: Required<IRequestInstance>,\r\n method: string,\r\n url: string,\r\n body: any,\r\n options: { headers: HttpHeaders },\r\n onInvalidResponseBody?: (body: any) => void\r\n ) {\r\n // Force responseType 'text' so we always manually parse (even if server sends JSON)\r\n // Use observe:'body' implicitly (default) to avoid HttpEvent stream typing issues.\r\n const httpOptions = {\r\n ...options,\r\n body,\r\n responseType: 'text' as 'text'\r\n };\r\n\r\n // Explicit cast to Observable<string> ensures map sees string not HttpEvent\r\n const raw$ = instance.client.request(method, url, httpOptions) as unknown as import('rxjs').Observable<string>;\r\n\r\n return raw$.pipe(\r\n takeUntil(instance.destroy$()),\r\n map((raw) => extractJsonFromResponse(raw, onInvalidResponseBody) as T),\r\n catchError((error: HttpErrorResponse) => throwError(() => error))\r\n );\r\n }\r\n\r\n defaultRetryFunction(error: HttpErrorResponse): boolean {\r\n\r\n // Don't retry for other errors (like 400, 401, 403, etc.)\r\n if (!this.isRetriableError(error))\r\n throw error;\r\n\r\n return true;\r\n }\r\n\r\n // Only true connection problems should block the UI\r\n isConnectionError(error: any): boolean {\r\n return error?.status === 0;\r\n }\r\n\r\n // Retriable: network errors, transient 5xx, or invalid/incomplete JSON payloads\r\n isRetriableError(error: any): boolean {\r\n const isNetworkError = error?.status === 0;\r\n const isServerError = typeof error?.status === 'number' && error.status >= 500 && error.status < 600;\r\n const isBadPayload = error?.name === 'InvalidResponseBodyError';\r\n return isNetworkError || isServerError || isBadPayload;\r\n }\r\n\r\n async onConnectionError(\r\n options: IRetryOptions,\r\n error: any\r\n ): Promise<Promise<void> | any> {\r\n\r\n if (!options.connectionError)\r\n return;\r\n\r\n let styleElement: HTMLStyleElement | undefined;\r\n if (this.isConnectionError(error)) {\r\n\r\n styleElement = this.screenBlocker(options, error, true);\r\n\r\n await this.invokeHook(options.connectionError.callback?.bind(this, error));\r\n return styleElement;\r\n } else {\r\n this.screenBlocker(options, error, false);\r\n styleElement?.remove();\r\n }\r\n }\r\n\r\n screenBlocker(optons: IRetryOptions,\r\n error?: HttpErrorResponse,\r\n add: boolean = true): HTMLStyleElement | undefined {\r\n\r\n if (!optons.connectionError?.blockScreen)\r\n return;\r\n\r\n const message = optons.connectionError?.message\r\n || 'Connection error occurred. Please wait';\r\n const errorMessage = error?.error?.message || 'An error occurred';\r\n const suggestinMessage = optons.connectionError?.suggestionMessage\r\n || 'Please check your internet connection or the server status.';\r\n\r\n const zIndex = optons.connectionError?.blockScreenZIndex || 10000;\r\n\r\n const body = document.body;\r\n const blcokerHtml = `\r\n <div class=\"lze-blocker\">\r\n ${LOCALIZE_API_ASSETS.network.noConnection}\r\n <div class=\"lze-blocker__message\">\r\n ${message}\r\n <span class=\"lze-blocker__dotting\">\r\n <span class=\"lze-blocker__dot\"></span>\r\n <span class=\"lze-blocker__dot\"></span>\r\n <span class=\"lze-blocker__dot\"></span>\r\n </span>\r\n </div>\r\n <div class=\"lze-blocker__error\">${errorMessage}</div>\r\n <div class=\"lze-blocker__error_suggestion\">${suggestinMessage}</div>\r\n </div>\r\n `;\r\n const style = `\r\n div.lze-blocker {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.85) !important;\r\n z-index: ${zIndex};\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n color: #fff !important;\r\n font-family: Arial, sans-serif;\r\n text-align: center;\r\n padding: 20px;\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n user-select: none;\r\n }\r\n\r\n svg#lze-no-connection {\r\n width: 75px;\r\n height: 75px;\r\n margin-bottom: 20px;\r\n }\r\n \r\n div.lze-blocker__message {\r\n color: #fff !important;\r\n font-size: 18px !important;\r\n margin-bottom: 10px;\r\n }\r\n \r\n .lze-blocker__dotting {\r\n display: inline-block;\r\n vertical-align: middle;\r\n }\r\n span.lze-blocker__dot {\r\n display: inline-block;\r\n width: 7px;\r\n height: 7px;\r\n background-color: #ffffff !important;\r\n border-radius: 50%;\r\n margin-left: 3px;\r\n opacity: 0.3;\r\n animation: dotting 1s infinite;\r\n }\r\n .lze-blocker__dot:nth-child(1) {\r\n animation-delay: 0s;\r\n opacity: 1;\r\n }\r\n .lze-blocker__dot:nth-child(2) {\r\n animation-delay: 0.2s;\r\n }\r\n .lze-blocker__dot:nth-child(3) {\r\n animation-delay: 0.4s;\r\n }\r\n\r\n @keyframes dotting {\r\n 0%, 80%, 100% { opacity: 0.3; }\r\n 40% { opacity: 1; }\r\n }\r\n\r\n div.lze-blocker__error {\r\n color: #f00;\r\n font-size: 14px !important;\r\n margin-bottom: 10px;\r\n text-shadow: 0 0 1px #ff5f5f !important;\r\n }\r\n\r\n div.lze-blocker__error_suggestion {\r\n color: #ccc !important;\r\n font-size: 14px !important;\r\n margin-top: 10px;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `;\r\n\r\n const styleElement = document.createElement('style');\r\n\r\n if (add) {\r\n if (!document.querySelector('.lze-blocker')) {\r\n styleElement.innerHTML = style;\r\n document.head.appendChild(styleElement);\r\n body.insertAdjacentHTML('beforeend', blcokerHtml);\r\n }\r\n } else {\r\n this.removeBlocker(styleElement);\r\n }\r\n\r\n return styleElement;\r\n }\r\n\r\n private removeBlocker(styleElement: HTMLStyleElement | undefined): void {\r\n const blocker = document.querySelector('.lze-blocker');\r\n blocker?.remove();\r\n styleElement?.remove();\r\n }\r\n}\r\n\r\nexport const ApiHelper = new LocalizeApiHelper();","import { Injectable, OnDestroy } from \"@angular/core\";\r\nimport { LocalizeTokenService } from \"./localize.token.service\";\r\nimport { HttpClient, HttpErrorResponse, HttpHeaders } from \"@angular/common/http\";\r\nimport { LocalizeToken, waitFor, waitUntil } from \"./localize.token\";\r\nimport { BehaviorSubject, Subject } from \"rxjs\";\r\nimport { ILocalizeApiConfigs, IApiOptions, EMethod, IHeader } from \"./helpers/interfaces\";\r\nimport { ApiHelper } from \"./helpers/loccalize.api.helper\";\r\n\r\nconst SCHEMES = LocalizeToken.httpHeaders;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalizeApiService implements OnDestroy {\r\n private readonly destroy$ = new Subject<void>();\r\n private readonly configSubject = new BehaviorSubject<Partial<ILocalizeApiConfigs>>({});\r\n readonly isRequestingSubject = new BehaviorSubject<boolean>(false);\r\n readonly isResolvingStartupSubject = new BehaviorSubject<boolean>(false);\r\n get isResolvingStartup() { return this.isResolvingStartupSubject.value; }\r\n\r\n get needTenant(): boolean { return this.localizeTokenService.config.tenantToken !== undefined; }\r\n\r\n get isRequesting() { return this.isRequestingSubject.value; }\r\n get isRevokingToken() { return this.localizeTokenService.isRevokingToken; }\r\n set isRevokingToken(value: boolean) { this.localizeTokenService.isRevokingToken = value; }\r\n\r\n get accessToken(): string | undefined { return this.localizeTokenService.accessToken; }\r\n set accessToken(value: string | undefined) { this.localizeTokenService.accessToken = value; }\r\n\r\n get refreshToken(): string | undefined { return this.localizeTokenService.refreshToken; }\r\n get tenantToken(): string | undefined { return this.localizeTokenService.tenantToken; }\r\n\r\n private defaultConfig: Partial<ILocalizeApiConfigs> = {\r\n waitEachRequest: { milliseconds: 0 },\r\n enableRequestCancellation: true,\r\n\r\n retryOptions: {\r\n maxRetries: 1000,\r\n delay: 1000,\r\n retryFunction: ApiHelper.defaultRetryFunction.bind(this),\r\n },\r\n\r\n };\r\n\r\n private get config(): Partial<ILocalizeApiConfigs> {\r\n this.validateConfig();\r\n return this.configSubject.value;\r\n }\r\n\r\n private apiOptions: Partial<IApiOptions> = {\r\n method: EMethod.GET,\r\n requestBody: null,\r\n };\r\n\r\n constructor(readonly httpClient: HttpClient,\r\n private readonly localizeTokenService: LocalizeTokenService\r\n ) { }\r\n\r\n /**\r\n * Initialize the API service.\r\n * @param apiConfigs - The API configurations.\r\n */\r\n init(apiConfigs: ILocalizeApiConfigs) {\r\n console.log('LocalizeApiService is initialized.');\r\n this.configSubject.next({ ...this.defaultConfig, ...apiConfigs });\r\n }\r\n\r\n cancelPendingRequests(): void {\r\n this.config.enableRequestCancellation\r\n && this.destroy$.next();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * A higher-order function that returns a curried function for making API requests.\r\n *\r\n * @param baseUrl - The base URL of the API.\r\n * @returns A curried function that can be used to make API requests.\r\n */\r\n func = (baseUrl: string) =>\r\n <T = any>(path: string, method: EMethod = EMethod.GET, reqBody: any = null, reqHeaders?: IHeader) =>\r\n this.request<T>(baseUrl, path, method, reqBody, reqHeaders)\r\n\r\n public async request<T = any>(baseUrl: string,\r\n path: string,\r\n method: EMethod = EMethod.GET,\r\n reqBody: any = null,\r\n reqHeaders?: IHeader): Promise<T> {\r\n\r\n await waitUntil(() => !this.isResolvingStartup, 500);\r\n\r\n await ApiHelper.invokeHook(this.config.onPrepareRequest);\r\n\r\n const apiOptions = this.buildApiOptions(baseUrl, path, method, reqBody, reqHeaders);\r\n\r\n try {\r\n await this.toWaitForPreviousRequest();\r\n\r\n return await ApiHelper.performRequestWithRetry<T>(\r\n apiOptions,\r\n this.config,\r\n this.performRequest.bind(this)\r\n );\r\n\r\n }\r\n catch (error: any) {\r\n return await this.handleOnRequestError(error, apiOptions);\r\n }\r\n }\r\n\r\n private async handleOnRequestError(error: HttpErrorResponse, options: IApiOptions): Promise<any> {\r\n if (error.status !== 401)\r\n throw error;\r\n\r\n await waitUntil(() => !this.isResolvingStartup, 50);\r\n\r\n return await ApiHelper.performRetry({\r\n maxRetries: () => 1000,\r\n delay: 10,\r\n retryUnless: (error) => error.status === 401 || ApiHelper.isConnectionError(error),\r\n callback: async () => {\r\n // Only handle 401 Unauthorized errors\r\n await this.revokeToken();\r\n\r\n // Retry the request with the new access token\r\n return await this.performRequest(options);\r\n }\r\n })\r\n\r\n }\r\n\r\n private async performRequest<T = any>(options: IApiOptions): Promise<T> {\r\n\r\n // Build the request options\r\n const buildOptions = { headers: this.buildHeaderOptions(options) };\r\n\r\n // Create the request observable\r\n const request$ = ApiHelper.createRequest<T>({\r\n client: this.httpClient,\r\n destroy$: () => this.destroy$\r\n }, options.method, options.requestUrl, options.requestBody, buildOptions,\r\n this.config.onResponseBodyInvalid?.bind(this));\r\n\r\n // Set the isRequesting state to true before making the request\r\n this.isRequestingSubject.next(true);\r\n\r\n const response = await new Promise<any>((resolve, reject) =>\r\n request$.subscribe({ next: resolve, error: reject }));\r\n\r\n // Reset the isRequesting state after the request completes\r\n this.isRequestingSubject.next(false);\r\n\r\n return response;\r\n }\r\n\r\n private async revokeToken(): Promise<void> {\r\n\r\n try {\r\n if (await this.interceptRevokeToken())\r\n return;\r\n\r\n this.isRevokingToken = true;\r\n\r\n const apiOptions: IApiOptions = {\r\n ...this.buildApiOptions(this.localizeTokenService.config.refreshToken?.requestUrl || ''),\r\n refreshToken: true,\r\n }\r\n\r\n // const revokeToken = await this.performRequest(apiOptions);\r\n const revokeToken = await ApiHelper.performRequestWithRetry(\r\n apiOptions,\r\n this.config,\r\n this.performRequest.bind(this)\r\n );\r\n\r\n await this.handleOnTokenRevoked(revokeToken);\r\n\r\n } catch (error: any) {\r\n // Handle the error, log it\r\n await ApiHelper.invokeHook(this.config.onAutoLogout);\r\n throw error;\r\n\r\n } finally {\r\n // Reset the revoking token state\r\n this.isRevokingToken = false;\r\n }\r\n }\r\n\r\n /** default http request options */\r\n private buildHeaderOptions(options: IApiOptions): HttpHeaders {\r\n\r\n const headers: { [key: string]: string } = {\r\n ...(options.refreshToken && { [SCHEMES.X_REFRESH_TOKEN]: `${this.refreshToken}` }),\r\n ...(!options.isFormData && { [SCHEMES.CONTENT_TYPE]: 'application/json' }),\r\n [SCHEMES.AUTHORIZATION]: `Bearer ${this.accessToken}`,\r\n ...(this.needTenant && { [SCHEMES.X_TENANT]: `${this.tenantToken}` })\r\n };\r\n\r\n return new HttpHeaders({ ...headers, ...options.headers });\r\n }\r\n\r\n private buildApiOptions(\r\n baseUrl: string,\r\n path: string = '',\r\n method: EMethod = EMethod.GET,\r\n requestBody: any = null,\r\n headers?: { [key: string]: string }\r\n ): IApiOptions {\r\n\r\n const requestUrl = ApiHelper.buildUrl(baseUrl, path);\r\n const isFormData = requestBody && requestBody instanceof FormData;\r\n return {\r\n ...this.apiOptions,\r\n ...{ headers, method, requestUrl, requestBody, isFormData }\r\n };\r\n }\r\n\r\n\r\n private async toWaitForPreviousRequest() {\r\n if (this.isRevokingToken) {\r\n await waitUntil(() => !this.isRevokingToken);\r\n }\r\n\r\n // to wait for each request in 50ms, even if the request is not completed\r\n const waitMilliseconds = this.config.waitEachRequest?.milliseconds;\r\n if (waitMilliseconds && this.isRequesting) {\r\n // console.warn(`Request throttling: Another request is in progress. Waiting for ${waitMilliseconds}ms.`);\r\n await waitFor(waitMilliseconds, this.isRequesting);\r\n }\r\n }\r\n\r\n\r\n private async handleOnTokenRevoked(response: any): Promise<void> {\r\n\r\n if (response?.status) {\r\n // If the response is successful, update the access token\r\n this.accessToken = response.message;\r\n\r\n } else {\r\n // If the response indicates an error, invoke the onRevokeUnauthorized hook\r\n console.warn('Token revocation failed, refresh token is expired.', response.message);\r\n await ApiHelper.invokeHook(this.config.onRevokeUnauthorized);\r\n }\r\n\r\n }\r\n\r\n private async interceptRevokeToken() {\r\n\r\n if (this.isRevokingToken) {\r\n console.warn('Token is already being revoked. Waiting for the current operation to complete...');\r\n await waitUntil(() => !this.isRevokingToken);\r\n return true;\r\n }\r\n\r\n if (!this.refreshToken) {\r\n // await ApiHelper.invokeHook(this.apiConfigs.onAutoLogout);\r\n throw new Error('Refresh token is missing. Please login again.');\r\n }\r\n return false;\r\n }\r\n\r\n validateConfig(): void {\r\n if (this.localizeTokenService.config.requiredTenant\r\n && !this.localizeTokenService.config.tenantToken?.name?.trim().length) {\r\n throw Error('Tenant token is required but tenantTokenName is not configured');\r\n }\r\n\r\n if (!this.localizeTokenService.config.refreshToken?.requestUrl?.trim().length) {\r\n throw Error('Revoke token URL is not configured - token refresh will not work');\r\n }\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { LocalizeTokenService } from './localize.token.service';\r\nimport { LocalizeApiService } from './localize.api.service';\r\n\r\n@NgModule({\r\n providers: [\r\n LocalizeTokenService,\r\n LocalizeApiService\r\n ]\r\n})\r\nexport class LocalizeTokenModule { }","import { Injectable } from '@angular/core';\r\nimport { LocalizeLogindlgService } from '../localize-logindlg/localize-logindlg.service';\r\nimport { ILocalizeApiConfigs } from '../localize-token/helpers/interfaces';\r\nimport { LocalizeApiService } from '../localize-token/localize.api.service';\r\nimport { ILocalizeTokenConfig } from '../localize-token/localize.token';\r\nimport { LocalizeTokenService } from '../localize-token/localize.token.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalizeApiTokenService {\r\n readonly api: LocalizeApiService;\r\n readonly token: LocalizeTokenService;\r\n readonly loginDialog: LocalizeLogindlgService;\r\n\r\n constructor(tokenService: LocalizeTokenService,\r\n apiService: LocalizeApiService,\r\n loginDialogService: LocalizeLogindlgService) {\r\n this.api = apiService;\r\n this.token = tokenService;\r\n this.loginDialog = loginDialogService;\r\n }\r\n\r\n initialize(tokenConfig: ILocalizeTokenConfig, apiConfig: ILocalizeApiConfigs) {\r\n // Initialize the LocalizeTokenService with the provided token configuration\r\n this.token.init(tokenConfig);\r\n\r\n // Initialize the LocalizeApiService with the provided API configuration\r\n this.api.init(apiConfig);\r\n\r\n console.log('LocalizeApiTokenService initialized with token and API configurations.');\r\n\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LocalizeLogindlgModule } from '../localize-logindlg/localize-logindlg.module';\r\nimport { LocalizeTokenModule } from '../localize-token/localize.token.module';\r\nimport { LocalizeApiTokenService } from './localize-api-token.service';\r\n\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n LocalizeTokenModule,\r\n LocalizeLogindlgModule\r\n ],\r\n providers: [\r\n LocalizeApiTokenService\r\n ]\r\n})\r\nexport class LocalizeApiTokenModule { }\r\n","//#region login dialog\r\nexport * from './localize-logindlg/localize-logindlg.component'\r\nexport * from './localize-logindlg/localize-logindlg.module'\r\nexport * from './localize-logindlg/localize-logindlg.service'\r\n\r\n//#region localize token\r\nexport * from './localize-token/helpers/localize.api.assets';\r\nexport * from './localize-token/helpers/interfaces';\r\nexport * from './localize-token/helpers/loccalize.api.helper';\r\nexport * from './localize-token/localize.token.service';\r\nexport * from './localize-token/localize.token';\r\nexport * from './localize-token/localize.token.storage';\r\nexport * from './localize-token/localize.token.module';\r\nexport * from './localize-token/localize.api.service';\r\n\r\n//#region localize api token\r\nexport * from './localize-api-token/localize-api-token.service';\r\nexport * from './localize-api-token/localize-api-token.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.LocalizeTokenService","i1","i2.LocalizeTokenService","i1.LocalizeTokenService","i2.LocalizeApiService","i3.LocalizeLogindlgService"],"mappings":"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"}
1
+ {"version":3,"file":"sambath999-localize-token.mjs","sources":["../../src/localize-token/localize.token.storage.ts","../../src/localize-token/localize.token.ts","../../src/localize-token/localize.token.service.ts","../../src/localize-logindlg/localize-logindlg.component.ts","../../src/localize-logindlg/localize-logindlg.service.ts","../../src/localize-logindlg/localize-logindlg.module.ts","../../src/localize-token/helpers/localize.api.assets.ts","../../src/localize-token/helpers/interfaces.ts","../../src/localize-token/helpers/json-extractor.ts","../../src/localize-token/helpers/loccalize.api.helper.ts","../../src/localize-token/localize.api.service.ts","../../src/localize-token/localize.token.module.ts","../../src/localize-api-token/localize-api-token.service.ts","../../src/localize-api-token/localize-api-token.module.ts","../../src/public-api.ts","../../src/sambath999-localize-token.ts"],"sourcesContent":["import { extractMainDomain } from \"./localize.token\";\r\n\r\nexport interface ICookieOptions {\r\n /**\r\n * Cookie expiration date in days from now. If not provided the cookie is a session cookie\r\n */\r\n expires?: number | Date;\r\n path?: string;\r\n domain?: string;\r\n secure?: boolean;\r\n samesite?: \"strict\" | \"lax\" | \"none\";\r\n}\r\n\r\n/**\r\n* Assembly of @package ng2-cookies @see https://www.npmjs.com/package/ng2-cookies\r\n*\r\n* Reassembled by\r\n* @author sambath999\r\n* @date_29_09_2021\r\n* Updated from raw parameters to\r\n* @param {ICookieOptions} options and added another newer cookie flag\r\n* @param {string} samesite\r\n* @param {constant} SameSiteTypes, @param {string} strict \"strict\", @param {string} lax \"lax\", @param {string} none \"none\"\r\n*\r\n* @enum\r\n*/\r\nexport class LocalizeTokenStorage {\r\n\r\n private get getDefaultOptions(): ICookieOptions {\r\n const mainDomain = extractMainDomain(window.location.hostname);\r\n return {\r\n path: '/',\r\n domain: mainDomain,\r\n secure: true,\r\n // samesite: SameSiteType.strict,\r\n expires: 1\r\n }\r\n }\r\n\r\n private readonly defaultOptions: ICookieOptions;\r\n constructor(_defaultOptions?: ICookieOptions) {\r\n this.defaultOptions = _defaultOptions ?? this.getDefaultOptions;\r\n }\r\n\r\n /**\r\n * Checks the existence of a single cookie by it's name\r\n *\r\n * @param {string} name Identification of the cookie\r\n * @returns existence of the cookie\r\n */\r\n check(name: string): boolean {\r\n if (typeof document === \"undefined\") return false;\r\n name = encodeURIComponent(name);\r\n const regexp = new RegExp('(?:^' + name + '|;\\\\s*' + name + ')=(.*?)(?:;|$)', 'g');\r\n return regexp.test(document.cookie);\r\n }\r\n\r\n /**\r\n * Retrieves a single cookie by it's name\r\n *\r\n * @param {string} name Identification of the Cookie\r\n * @returns The Cookie's value\r\n */\r\n get(name: string): string | undefined {\r\n if (!this.check(name)) return undefined;\r\n\r\n name = encodeURIComponent(name);\r\n const regexp = new RegExp('(?:^' + name + '|;\\\\s*' + name + ')=(.*?)(?:;|$)', 'g');\r\n const result = regexp.exec(document.cookie);\r\n return result ? decodeURIComponent(result[1]) : undefined;\r\n }\r\n\r\n /**\r\n * Retrieves a a list of all cookie avaiable\r\n *\r\n * @returns Object with all Cookies\r\n */\r\n getAll(): any {\r\n const cookies: any = {};\r\n if (document.cookie) {\r\n const split = document.cookie.split(';');\r\n for (const s of split) {\r\n const currCookie = s.split('=');\r\n currCookie[0] = currCookie[0].trim();\r\n cookies[decodeURIComponent(currCookie[0])] = decodeURIComponent(currCookie[1]);\r\n }\r\n }\r\n\r\n return cookies;\r\n }\r\n\r\n set(name: string, value: string, options?: ICookieOptions) {\r\n options ??= this.defaultOptions;\r\n const { expires, path, domain, secure, samesite } = { ...this.defaultOptions, ...options };\r\n let cookieStr = `${encodeURIComponent(name)}=${encodeURIComponent(value)};`;\r\n\r\n if (expires) {\r\n const dtExpires = typeof expires === 'number' ? new Date(Date.now() + expires * 864e5) : expires;\r\n cookieStr += `expires=${dtExpires.toUTCString()};`;\r\n }\r\n\r\n cookieStr += path ? `path=${path};` : '';\r\n cookieStr += domain ? `domain=${domain};` : '';\r\n cookieStr += secure ? 'secure;' : '';\r\n cookieStr += samesite ? `samesite=${samesite};` : '';\r\n\r\n document.cookie = cookieStr;\r\n }\r\n\r\n /**\r\n * Removes specified Cookie\r\n *\r\n * @param {string} name Cookie's identification\r\n * @param {string} path Path relative to the domain where the cookie should be avaiable. Default /\r\n * @param {string} domain Domain where the cookie should be avaiable. Default current domain\r\n */\r\n delete(name: string, path: string = '/', domain: string = window.location.hostname): void {\r\n this.set(name, '', { path, domain, expires: -1 });\r\n }\r\n\r\n /**\r\n * Delete all cookie avaiable\r\n */\r\n deleteAll(path?: string, domain?: string): void {\r\n const cookies = this.getAll();\r\n\r\n for (const cookieName of Object.keys(cookies)) {\r\n this.delete(cookieName, path, domain);\r\n }\r\n }\r\n\r\n}\r\n","import { LocalizeTokenStorage } from \"./localize.token.storage\";\r\n\r\ninterface ILocalizeTokenTokens {\r\n name: string;\r\n requestUrl?: string;\r\n}\r\n\r\nexport interface ILocalizeTokenConfig {\r\n /**\r\n * The main domain of the application to set the cookies to be available for cross application with subdomains.\r\n * \r\n * Default is location.hostname (current domain) and automatically set extracted main domain if it is subdomain.\r\n */\r\n mainDomain?: string;\r\n\r\n isProduction: boolean;\r\n authToken?: ILocalizeTokenTokens;\r\n refreshToken?: ILocalizeTokenTokens;\r\n tenantToken?: ILocalizeTokenTokens;\r\n requiredTenant?: boolean;\r\n}\r\n\r\nexport class LocalizeToken {\r\n\r\n static readonly storage = new LocalizeTokenStorage();\r\n\r\n static readonly httpHeaders = {\r\n AUTHORIZATION: 'Authorization',\r\n X_TENANT: 'X-Tenant',\r\n X_REFRESH_TOKEN: 'X-RefreshToken',\r\n CONTENT_TYPE: 'Content-Type',\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Waits for a specified amount of time.\r\n * @param milliseconds - The milliseconds to wait.\r\n * @param when - The condition to wait for. Default is true.\r\n * @returns - Promise<void>\r\n */\r\nexport async function waitFor(milliseconds: number, when: boolean = true) {\r\n if (!when) return;\r\n await new Promise(resolve => setTimeout(resolve, milliseconds));\r\n}\r\n\r\n/**\r\n * Waits until the condition is met.\r\n * @param when - The condition to wait for.\r\n * @param intervalNumber - The interval number in milliseconds to check the condition. Default is 50.\r\n */\r\nexport async function waitUntil(when: () => any, intervalNumber: number = 50) {\r\n\r\n async function isConditionMet() {\r\n const cond = when();\r\n const result = cond instanceof Promise\r\n ? await cond\r\n : cond;\r\n return result;\r\n }\r\n\r\n if (await isConditionMet()) return;\r\n\r\n await new Promise(resolve => {\r\n const interval = setInterval(async () => {\r\n if (await isConditionMet()) {\r\n clearInterval(interval);\r\n resolve(true);\r\n }\r\n }, intervalNumber);\r\n });\r\n}\r\n\r\nexport function extractMainDomain(subdomain?: string): string {\r\n subdomain ??= window.location.hostname;\r\n const parts = subdomain.split('.');\r\n return parts.length > 2 ? parts.slice(-2).join('.') : subdomain;\r\n}","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { extractMainDomain, ILocalizeTokenConfig, LocalizeToken } from './localize.token';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport * as jwt_decode from 'jwt-decode';\r\nexport interface JwtPayload extends jwt_decode.JwtPayload {\r\n // Define the structure of your JWT payload here\r\n email: string;\r\n sub: string;\r\n name: string;\r\n iat: number;\r\n exp: number;\r\n // Add other fields as needed\r\n}\r\n\r\ninterface IAuthToken {\r\n token: string;\r\n revoke: boolean;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class LocalizeTokenService implements OnDestroy {\r\n private readonly configSubject = new BehaviorSubject<Partial<ILocalizeTokenConfig>>({});\r\n readonly isRevokingTokenSubject = new BehaviorSubject<boolean>(false);\r\n private readonly defaultConfig: Partial<ILocalizeTokenConfig> = {\r\n mainDomain: extractMainDomain(),\r\n authToken: {\r\n name: 'auth-token',\r\n },\r\n refreshToken: {\r\n name: 'refresh-token',\r\n requestUrl: '/api/token/revoke'\r\n },\r\n }\r\n\r\n get config(): ILocalizeTokenConfig {\r\n this.throwIfNotInitialized();\r\n return this.configSubject.value as ILocalizeTokenConfig;\r\n }\r\n\r\n private isInitialized = false;\r\n\r\n init(config: ILocalizeTokenConfig) {\r\n console.log('LocalizeTokenService is initialized.');\r\n this.configSubject.next({ ...this.defaultConfig, ...config });\r\n this.isInitialized = true;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // this.configSubject.complete();\r\n // this.isRevokingTokenSubject.complete();\r\n }\r\n\r\n private get authToken() { return this.storageGet() }\r\n private set authToken(value: IAuthToken | undefined) {\r\n value\r\n ? this.storageSet(value)\r\n : LocalizeToken.storage.delete(this.config.authToken?.name!);\r\n }\r\n\r\n get tenantToken() { return LocalizeToken.storage.get(this.config.tenantToken?.name || '') }\r\n\r\n get refreshToken() { return LocalizeToken.storage.get(this.config.refreshToken?.name || '') }\r\n get accessToken() { return this.authToken?.token }\r\n\r\n set accessToken(value: string | undefined) {\r\n value && (this.authToken = { token: value, revoke: false })\r\n }\r\n\r\n get isRevokingToken() { return this.isRevokingTokenSubject.value /* this.authToken?.revoke ?? false */ }\r\n\r\n set isRevokingToken(value: boolean) {\r\n this.isRevokingTokenSubject.next(value);\r\n this.authToken && (this.authToken = { ...this.authToken, revoke: value })\r\n }\r\n\r\n private storageGet() {\r\n try {\r\n const encoded = LocalizeToken.storage.get(this.config.authToken?.name || '');\r\n const decoded = atob(encoded || '');\r\n return JSON.parse(decoded) as IAuthToken;\r\n } catch {\r\n return undefined\r\n }\r\n }\r\n\r\n private storageSet(value: IAuthToken) {\r\n const base64 = btoa(JSON.stringify(value));\r\n LocalizeToken.storage.set(this.config.authToken?.name || '', base64);\r\n }\r\n\r\n tokensValid(): boolean | undefined {\r\n if (!this.refreshToken?.length) return false;\r\n if (this.config.requiredTenant && !this.tenantToken?.length) return false;\r\n return true;\r\n }\r\n\r\n decodeToken = (token: string) => jwt_decode.jwtDecode<JwtPayload>(token);\r\n get decodeRefreshToken() {\r\n const token = this.refreshToken;\r\n return !token ? null : this.decodeToken(token);\r\n }\r\n\r\n private throwIfNotInitialized() {\r\n if (!this.isInitialized) {\r\n throw new Error('LocalizeTokenService is not initialized. Call init() method before using it.');\r\n }\r\n }\r\n\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport {\r\n ChangeDetectorRef,\r\n Component,\r\n OnInit,\r\n ViewEncapsulation,\r\n} from \"@angular/core\";\r\nimport { MessageService } from \"primeng/api\";\r\nimport { DynamicDialogConfig, DynamicDialogRef } from \"primeng/dynamicdialog\";\r\nimport { JwtPayload, LocalizeTokenService } from \"../localize-token/localize.token.service\";\r\nimport { LocalizeToken } from \"../localize-token/localize.token\";\r\nimport { ILoginDialogConfig, ILoginDialogProperties } from \"./localize-logindlg.service\";\r\nimport { DomSanitizer } from \"@angular/platform-browser\";\r\n\r\n@Component({\r\n standalone: false,\r\n styles: [`\r\n #login-dlg-wrap {\r\n width: 100%;\r\n max-width: 400px;\r\n margin: 0 auto;\r\n padding: 30px;\r\n height: 100%;\r\n }\r\n \r\n .login-dlg-elm {\r\n margin-top: 1rem;\r\n }\r\n\r\n .login-dlg-elm.login-dlg-suggest {\r\n display: flex ;\r\n align-items: center;\r\n user-select: none;\r\n border-bottom: solid 1px #ddd;\r\n border-radius: 5px;\r\n padding: 5px 10px;\r\n background: #f9f9f9;\r\n box-shadow: 1px 5px 10px -12px #000;\r\n }\r\n \r\n #login-dlg-header {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n \r\n #login-dlg-header h3 {\r\n font-weight: bold;\r\n font-size: 0.9rem;\r\n color: orange;\r\n text-align: center;\r\n }\r\n \r\n #login-logo {\r\n height: 55px;\r\n width: 55px;\r\n /* background: url(\"/assets/images/logo-300px.png\") no-repeat; */\r\n background-size: contain !important;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup {\r\n height: 45px;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup .p-inputgroup-addon {\r\n height: 45px;\r\n border-radius: 15px 0 0 15px;\r\n width: 50px;\r\n }\r\n #login-dlg-content *{\r\n font-size: .9rem;\r\n /* font-family: 'Lexend', 'Roboto', sans-serif, 'material-icons-round'; */\r\n }\r\n \r\n #login-dlg-content .p-inputgroup .p-inputgroup-addon * {\r\n font-size: 1rem;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup input {\r\n height: 45px;\r\n border-radius: 0 15px 15px 0;\r\n }\r\n \r\n #login-dlg-content button {\r\n height: 45px;\r\n border-radius: 15px;\r\n }\r\n \r\n /*check animation block*/\r\n \r\n .check-animation-wrap {\r\n top: 0;\r\n left: 0;\r\n position: absolute;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: calc(100% - 200px);\r\n min-height: 400px;\r\n }\r\n \r\n .check-main-container {\r\n width: 100%;\r\n height: 100vh;\r\n display: flex;\r\n flex-flow: column;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n \r\n .check-container {\r\n width: 6.25rem;\r\n height: 7.5rem;\r\n display: flex;\r\n flex-flow: column;\r\n align-items: center;\r\n justify-content: space-between;\r\n }\r\n \r\n .check-container .check-background {\r\n width: 100%;\r\n height: calc(100% - 1.25rem);\r\n background: linear-gradient(to bottom right, #5de593, #41d67c);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n transform: scale(0.84);\r\n border-radius: 50%;\r\n animation: animateContainer 0.75s ease-out forwards 0.75s;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n opacity: 0;\r\n }\r\n \r\n .check-container .check-background svg {\r\n width: 65%;\r\n transform: translateY(0.25rem);\r\n stroke-dasharray: 80;\r\n stroke-dashoffset: 80;\r\n animation: animateCheck 0.35s forwards 1.25s ease-out;\r\n min-width: auto !important;\r\n }\r\n \r\n .check-container .check-shadow {\r\n bottom: calc(-15% - 5px);\r\n left: 0;\r\n border-radius: 50%;\r\n background: radial-gradient(closest-side, rgba(73, 218, 131, 1), transparent);\r\n animation: animateShadow 0.75s ease-out forwards 0.75s;\r\n }\r\n \r\n @keyframes animateContainer {\r\n 0% {\r\n opacity: 0;\r\n transform: scale(0);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 25% {\r\n opacity: 1;\r\n transform: scale(0.9);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 43.75% {\r\n transform: scale(1.15);\r\n box-shadow: 0px 0px 0px 43.334px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 62.5% {\r\n transform: scale(1);\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 21.667px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 81.25% {\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 100% {\r\n opacity: 1;\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n }\r\n \r\n @keyframes animateCheck {\r\n from {\r\n stroke-dashoffset: 80;\r\n }\r\n \r\n to {\r\n stroke-dashoffset: 0;\r\n }\r\n }\r\n \r\n @keyframes animateShadow {\r\n 0% {\r\n opacity: 0;\r\n width: 100%;\r\n height: 15%;\r\n }\r\n \r\n 25% {\r\n opacity: 0.25;\r\n }\r\n \r\n 43.75% {\r\n width: 40%;\r\n height: 7%;\r\n opacity: 0.35;\r\n }\r\n \r\n 100% {\r\n width: 85%;\r\n height: 15%;\r\n opacity: 0.25;\r\n }\r\n }\r\n #login-dlg-wrap .loader-wrap {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n height:100%;\r\n width:100%;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n z-index: 100;\r\n background: #ffffff42;\r\n backdrop-filter: blur(1px);\r\n }\r\n\r\n #login-dlg-wrap .login-dlg-loader {\r\n border: 15px solid #e7e7e7;\r\n border-top: 15px solid #52dba1;\r\n border-radius: 50%;\r\n width: 100px;\r\n height: 100px;\r\n animation: spinloader 2s linear infinite;\r\n }\r\n\r\n #login-dlg-wrap .loader-wrap::before {\r\n content: \"\";\r\n position: absolute;\r\n width: 70px;\r\n height: 70px;\r\n transform: translate(-50%, -50%);\r\n z-index: 1;\r\n border: 15px solid #e7e7e700;\r\n border-top: 15px solid #52dba1c9;\r\n border-radius: 50%;\r\n animation: spinloader .75s linear infinite;\r\n }\r\n\r\n @keyframes spinloader {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n template: `<p-toast key=\"$login-dlg\" position=\"top-center\"></p-toast>\r\n <div id=\"login-dlg-wrap\">\r\n <div id=\"login-dlg-header\">\r\n <div id=\"login-logo\" class=\"p-mb-2\" style=\"background: url('{{properties.logoImage}}') no-repeat\"></div>\r\n <h3 *ngIf=\"!success\" [innerHTML]=\"sanitizedTitle\"></h3>\r\n <h3 *ngIf=\"success\" style=\"color:green !important;\">{{properties.loginSuccessMessage}}</h3>\r\n </div>\r\n <div id=\"login-dlg-content\">\r\n <ng-container *ngIf=\"!success\">\r\n <div *ngIf=\"loading\" class=\"loader-wrap\">\r\n <div class=\"login-dlg-loader\"></div>\r\n </div>\r\n <div class=\"login-dlg-elm\">\r\n <p-inputgroup>\r\n <p-inputgroup-addon>\r\n <i class=\"material-icons-round\">person</i>\r\n </p-inputgroup-addon>\r\n <input disabled pInputText type=\"text\" placeholder=\"{{properties.username?.placeHolder}}\" [value]=\"decodeToken?.email\" />\r\n </p-inputgroup>\r\n </div>\r\n \r\n <div class=\"login-dlg-elm\">\r\n <p-inputgroup>\r\n <p-inputgroup-addon>\r\n <i class=\"material-icons-round\">lock</i>\r\n </p-inputgroup-addon>\r\n <input [disabled]=\"loading\" (keydown.enter)=\"clickLogin()\" pInputText type=\"password\" \r\n placeholder=\"{{properties.password?.placeHolder}}\" [(ngModel)]=\"password\"\r\n autofocus />\r\n </p-inputgroup>\r\n </div>\r\n <div class=\"login-dlg-elm\">\r\n <button style=\"width: 100%;\" pButton type=\"button\" label=\"{{properties.loginButton?.placeHolder}}\" (click)=\"clickLogin()\"\r\n [disabled]=\"!password || loading\"></button>\r\n </div>\r\n \r\n <div class=\"login-dlg-elm login-dlg-suggest\" style=\"display:flex;align-items: center;user-select: none;\">\r\n <span>{{properties.logoutButton?.message}}</span>\r\n <button class=\"p-button-text\" pButton type=\"button\" label=\"{{properties.logoutButton?.placeHolder}}\" \r\n (click)=\"clickLogout()\"></button>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"success\">\r\n <div style=\"margin-top:35px;\"></div>\r\n <div class=\"check-animation-wrap\">\r\n <div class=\"check-main-container\">\r\n <div class=\"check-container\">\r\n <div class=\"check-background\">\r\n <svg viewBox=\"0 0 65 51\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M7 25L27.3077 44L58.5 7\" stroke=\"white\" stroke-width=\"13\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>`,\r\n selector: \"app-localize-logindlg\",\r\n providers: [MessageService],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class LocalizeLogindlgComponent implements OnInit {\r\n readonly messageKey = \"$login-dlg\";\r\n password: any;\r\n readonly decodeToken: JwtPayload | null;\r\n loading = false;\r\n success = false;\r\n private get config() { return this.tokenService.config; }\r\n private readonly loginConfig: ILoginDialogConfig\r\n\r\n private logout?: () => any\r\n private loginUrl?: string;\r\n readonly properties: ILoginDialogProperties;\r\n\r\n\r\n constructor(\r\n private readonly messageService: MessageService,\r\n private readonly cdt: ChangeDetectorRef,\r\n private readonly dlgRef: DynamicDialogRef,\r\n private readonly dlgConfig: DynamicDialogConfig,\r\n private readonly tokenService: LocalizeTokenService,\r\n private readonly httpClient: HttpClient,\r\n private readonly sanitizer: DomSanitizer\r\n ) {\r\n this.decodeToken = this.tokenService.decodeRefreshToken;\r\n this.loginConfig = this.dlgConfig.data.loginConfig;\r\n this.properties = this.loginConfig.properties!;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.dlgConfig.closable = false;\r\n this.logout = this.loginConfig.logoutFunc;\r\n this.loginUrl = this.loginConfig.loginUrl\r\n\r\n if (!this.decodeToken) {\r\n this.showMessage(\"error\", \"Token is invalid\");\r\n setTimeout(() => this.logout?.(), 2000);\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.cdt.detectChanges();\r\n }\r\n\r\n async clickLogin() {\r\n if (!this.isValidPassword) {\r\n return this.showMessage(\"error\", \"Password is required and must be at least 6 characters\");\r\n }\r\n\r\n this.loading = true;\r\n const loginRes = await this.login();\r\n if (!loginRes?.status) {\r\n return this.showMessage(\"error\", loginRes.message ?? \"An error occurred\");\r\n }\r\n\r\n this.tokenService.accessToken = loginRes.tokens.accessToken;\r\n const cookieOptions = { expires: this.loginConfig.expire ?? 365 }\r\n LocalizeToken.storage.set(this.config.refreshToken?.name || '', loginRes.tokens.refreshToken, cookieOptions);\r\n this.success = true;\r\n setTimeout(() => {\r\n this.dlgConfig.dismissableMask = true;\r\n this.dlgConfig.modal = false;\r\n this.dlgRef.close(true);\r\n }, 2000);\r\n }\r\n\r\n private async login() {\r\n if (!this.loginUrl?.trim().length) {\r\n this.showMessage(\"error\", \"Login url is required\");\r\n throw new Error(\"Login url is required\");\r\n }\r\n\r\n try {\r\n\r\n if (this.loginConfig.loginFunction) {\r\n console.log(\"Using custom login function\");\r\n return await this.loginConfig.loginFunction(this.decodeToken?.email ?? '', this.password.trim(), this.getHeaders());\r\n }\r\n\r\n return await new Promise<any>((resolve, reject) =>\r\n this.httpClient.post(this.loginUrl!,\r\n { password: this.password.trim() },\r\n { headers: this.getHeaders() }).subscribe({ next: resolve, error: reject }));\r\n\r\n } catch (e: any) {\r\n this.showMessage(\"error\", e.message);\r\n return null;\r\n }\r\n }\r\n\r\n private getHeaders() {\r\n return {\r\n [LocalizeToken.httpHeaders.X_REFRESH_TOKEN]: this.tokenService.refreshToken ?? \"\",\r\n [LocalizeToken.httpHeaders.X_TENANT]: this.tokenService.tenantToken ?? \"\",\r\n };\r\n }\r\n\r\n get isValidPassword(): boolean {\r\n this.loading = false;\r\n return this.properties.passwordValidator\r\n ? this.properties.passwordValidator(this.password)\r\n : this.password && this.password.trim().length >= 6 && this.password.trim().length <= 50;\r\n }\r\n\r\n clickLogout = () => this.logout?.();\r\n\r\n private showMessage(severity: string, summary: string) {\r\n this.messageService.add({ key: this.messageKey, severity, summary });\r\n this.loading = false;\r\n }\r\n\r\n get sanitizedTitle() {\r\n return this.sanitizer.bypassSecurityTrustHtml(this.properties.title ?? '');\r\n }\r\n}\r\n","import { Injectable, Injector } from '@angular/core';\nimport { DialogService, DynamicDialogConfig } from 'primeng/dynamicdialog';\nimport { LocalizeLogindlgComponent } from './localize-logindlg.component';\nexport interface ILoginDialogPlaceHolder {\n /**\n * Message to display in the input field, typically used for error messages or hints.\n * This is optional and can be used to provide additional context or instructions to the user.\n */\n message?: string;\n /**\n * Placeholder or label text for the input field\n */\n placeHolder?: string;\n}\n\nexport interface ILoginDialogProperties {\n /**\n * Title of the login dialog\n */\n title?: string;\n loginSuccessMessage?: string;\n /**\n * Logog image path or URL to display in the login dialog\n * If not provided, the \"/assets/images/logo-300px.png\" image will be used.\n */\n logoImage?: string;\n username?: ILoginDialogPlaceHolder;\n password?: ILoginDialogPlaceHolder;\n loginButton?: ILoginDialogPlaceHolder;\n logoutButton?: ILoginDialogPlaceHolder;\n /**\n * Function to validate the password.\n * If not provided, the default validation checks if the password is between 6 and 50 characters long.\n * @param password\n * @returns\n */\n passwordValidator?: (password: string) => boolean;\n}\n\nexport interface ILoginDialogConfig {\n loginUrl?: string;\n logoutUrl?: string;\n loginFunction?: (username: string, password: string, headers?: { [key: string]: string }) => Promise<any>;\n logoutFunc?: () => void;\n /**\n * Cookie expiration date in days from now. If not provided the cookie is a session cookie\n */\n expire?: number;\n /**\n * Configuration for the login dialog.\n * This interface defines the properties that can be used to customize the login dialog's behavior and appearance\n */\n properties?: ILoginDialogProperties;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocalizeLogindlgService {\n\n constructor(private readonly injector: Injector) { }\n\n async openLoginDialog(loginConfig: ILoginDialogConfig, config?: DynamicDialogConfig) {\n\n config = this.intercepDialogConfig(config);\n this.initConfig(loginConfig);\n\n config.data = { ...(config.data || {}), ...{ loginConfig } };\n\n const dialogService = this.injector.get(DialogService);\n const dialog = dialogService.open(LocalizeLogindlgComponent, config);\n\n await new Promise<void>((resolve) =>\n dialog.onClose.subscribe(res => {\n if (res) {\n resolve();\n }\n }));\n }\n\n private intercepDialogConfig(config?: DynamicDialogConfig) {\n config ??= {\n header: 'Login',\n style: { 'max-width': '400px', width: '100%', 'height': '650px' },\n modal: true,\n closable: false,\n showHeader: false,\n }\n\n config = {\n ...config, ...{\n contentStyle: { 'height': '100%', 'border-radius': '20px' }\n }\n }\n config.style = { ...config.style, ...{ 'border-radius': '20px' } };\n return config;\n }\n\n\n private initConfig(loginConfig: ILoginDialogConfig) {\n loginConfig ??= {}\n loginConfig.properties ??= {\n title: 'Your session is expired!<br/> Please login again to continue.',\n loginSuccessMessage: 'You have successfully logged in.',\n logoImage: '/assets/images/logo-300px.png',\n username: { placeHolder: 'Username' },\n password: { placeHolder: 'Password' },\n loginButton: { placeHolder: 'Login' },\n logoutButton: {\n message: 'No, I want to login with another user.',\n placeHolder: 'Logout'\n }\n }\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { LocalizeLogindlgComponent } from \"./localize-logindlg.component\";\nimport { InputTextModule } from \"primeng/inputtext\";\nimport { ButtonModule } from \"primeng/button\";\nimport { ToastModule } from 'primeng/toast';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { FormsModule } from '@angular/forms';\nimport { LocalizeLogindlgService } from \"./localize-logindlg.service\";\nimport { InputGroupModule } from 'primeng/inputgroup';\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\n\n@NgModule({\n declarations: [LocalizeLogindlgComponent],\n exports: [LocalizeLogindlgComponent],\n imports: [\n CommonModule,\n ToastModule,\n InputTextModule,\n BrowserModule,\n FormsModule,\n ButtonModule,\n InputGroupModule,\n InputGroupAddonModule\n ],\n providers: [LocalizeLogindlgService],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class LocalizeLogindlgModule { }\n","export const LOCALIZE_API_ASSETS = {\r\n network: {\r\n noConnection: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <svg id=\"lze-no-connection\" data-name=\"Layer 2\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 77.29 70.98\">\r\n <defs>\r\n <style> .cls-1 { fill: #fff; } .cls-2, .cls-3 { fill: #e30613; } .cls-3 { stroke: #e30613; stroke-miterlimit: 10; stroke-width: .25px; } </style>\r\n </defs>\r\n <g id=\"Layer_3\" data-name=\"Layer 3\">\r\n <g>\r\n <path class=\"cls-1\" d=\"m73.29,35c-1.2,0-2.33-.53-3.09-1.46-.48-.57-11.23-13.2-31.55-13.2s-31.11,12.66-31.56,13.2c-1.4,1.71-3.92,1.95-5.63.55-1.71-1.4-1.95-3.92-.55-5.63.54-.66,13.47-16.12,37.74-16.12s37.2,15.46,37.74,16.12c1.4,1.71,1.15,4.23-.56,5.62-.71.58-1.61.9-2.53.9Z\"/>\r\n <path class=\"cls-1\" d=\"m63.96,45.66c-1.19,0-2.32-.53-3.08-1.44-5.79-6.05-13.86-9.39-22.24-9.21-8.38-.18-16.45,3.16-22.24,9.22-1.46,1.65-3.99,1.81-5.64.35-1.57-1.39-1.8-3.77-.52-5.43,7.32-7.89,17.64-12.29,28.4-12.12,10.76-.17,21.08,4.24,28.4,12.12,1.4,1.71,1.15,4.23-.56,5.62-.71.58-1.6.9-2.53.9Z\"/>\r\n <path class=\"cls-1\" d=\"m53.3,56.32c-1.24,0-2.41-.57-3.16-1.55-5.73-6.35-15.52-6.85-21.87-1.13-.4.36-.77.73-1.13,1.13-1.36,1.73-3.88,2.03-5.61.67-1.71-1.34-2.03-3.8-.73-5.54,8.39-9.85,23.18-11.04,33.03-2.65.95.81,1.84,1.69,2.65,2.65,1.34,1.75,1,4.26-.75,5.6-.7.53-1.55.82-2.43.82Z\"/>\r\n </g>\r\n <path class=\"cls-2\" d=\"m47.21,9.45l-4.06,41.36c-.64,5.42-8.39,5.39-9.01,0,0,0-4.06-41.36-4.06-41.36-.46-4.73,2.99-8.94,7.72-9.4,5.33-.58,9.97,4.09,9.4,9.4h0Z\"/>\r\n <circle class=\"cls-3\" cx=\"38.64\" cy=\"64.79\" r=\"6.07\"/>\r\n </g>\r\n </svg>`\r\n }\r\n}","import { HttpErrorResponse } from \"@angular/common/http\";\r\n\r\n/**\r\n * Http method options\r\n */\r\nexport enum EMethod {\r\n POST = 'post',\r\n GET = 'get',\r\n PUT = 'put',\r\n DELETE = 'delete',\r\n PATCH = 'patch',\r\n}\r\n\r\nexport interface IOnConnectionError {\r\n /**\r\n * Callback function to execute when a connection error occurs.\r\n * This function should return a Promise or any value.\r\n */\r\n callback?: (error: HttpErrorResponse) => Promise<void> | any;\r\n /**\r\n * If true, the request will block the screen with overlay on connection errors.\r\n * Default is false.\r\n */\r\n blockScreen?: boolean;\r\n\r\n /** Optional z-index for the block screen overlay.\r\n * Default is 10000.\r\n */\r\n blockScreenZIndex?: number;\r\n\r\n /**\r\n * Optional message to display when a connection error occurs.\r\n */\r\n message?: string;\r\n suggestionMessage?: string;\r\n}\r\n\r\ninterface IRetryOptions {\r\n\r\n /**\r\n * Maximum number of retries for a failed request.\r\n * Default is 100.\r\n */\r\n maxRetries?: number;\r\n\r\n /**\r\n * Delay in milliseconds before retrying a failed request.\r\n * Default is 500ms.\r\n */\r\n delay?: number;\r\n\r\n /**\r\n * Function to determine if a request should be retried based on the error.\r\n * If not provided, the default function will retry for network errors and server errors (status 500-599).\r\n * @param error - The error object from the failed request.\r\n * @returns true if the request should be retried, false otherwise.\r\n */\r\n retryFunction?: (error: HttpErrorResponse) => Promise<boolean> | any;\r\n\r\n /**\r\n * Function to execute when a connection error occurs.\r\n * This function should return a Promise or any value.\r\n */\r\n onConnectionError?: IOnConnectionError;\r\n\r\n}\r\n\r\nexport interface ILocalizeApiConfigs {\r\n onPrepareRequest?: () => Promise<void> | any;\r\n onAutoLogout?: () => Promise<void> | any;\r\n onRevokeUnauthorized?: () => Promise<void> | any;\r\n onResponseBodyInvalid?: (body: any) => void;\r\n waitEachRequest?: {\r\n milliseconds: number;\r\n };\r\n enableRequestCancellation?: boolean;\r\n\r\n /**\r\n * Config for retrying failed requests.\r\n * If not provided, the default retry options will be used.\r\n */\r\n retryOptions?: IRetryOptions;\r\n}\r\n\r\nexport interface IApiOptions {\r\n headers?: { [key: string]: string };\r\n method: EMethod;\r\n requestUrl: string;\r\n requestBody?: any;\r\n isFormData?: boolean;\r\n /**\r\n * If true, the request will use the refresh token for authorization.\r\n */\r\n refreshToken?: boolean;\r\n}\r\n\r\nexport interface IHeader {\r\n [key: string]: string;\r\n}\r\n\r\n// export interface INormalizedError {\r\n// error: any;\r\n// code: string;\r\n// message: string;\r\n// details?: any;\r\n// status: number;\r\n// }\r\n","export class InvalidResponseBodyError extends Error {\r\n constructor(public raw: string) {\r\n super('Invalid or incomplete JSON response');\r\n this.name = 'InvalidResponseBodyError';\r\n }\r\n}\r\n\r\nexport class TruncatedResponseError extends Error {\r\n constructor(public raw: string, public expectedLength?: number, public actualLength?: number) {\r\n super('Truncated HTTP JSON response');\r\n this.name = 'TruncatedResponseError';\r\n }\r\n}\r\n\r\nexport function extractJsonFromResponse(body: any, onError?: (body: any) => void): any {\r\n if (typeof body === 'object' && body !== null) return body;\r\n\r\n if (typeof body === 'string') {\r\n let s = body.replace(/^\\uFEFF/, '');\r\n\r\n // Detect header block (handles normal CRLF + flattened single-line cases)\r\n let headerBlock = '';\r\n let jsonStartIdx = s.indexOf('{');\r\n if (jsonStartIdx > 0) {\r\n const headerCandidate = s.slice(0, jsonStartIdx);\r\n if (/HTTP\\/\\d\\.\\d\\s+\\d{3}/i.test(headerCandidate) && /content-type:/i.test(headerCandidate)) {\r\n headerBlock = headerCandidate;\r\n s = s.slice(jsonStartIdx);\r\n }\r\n }\r\n // Standard CRLF header removal if still present\r\n if (/^HTTP\\/\\d\\.\\d \\d{3}/.test(s)) {\r\n const split = s.indexOf('\\r\\n\\r\\n');\r\n const split2 = s.indexOf('\\n\\n');\r\n const cut = split >= 0 ? split + 4 : (split2 >= 0 ? split2 + 2 : -1);\r\n if (cut > 0) {\r\n headerBlock = s.slice(0, cut);\r\n s = s.slice(cut);\r\n }\r\n }\r\n\r\n // Extract Content-Length from headerBlock (optional)\r\n let expectedLength: number | undefined;\r\n if (headerBlock) {\r\n const m = headerBlock.match(/content-length:\\s*(\\d+)/i);\r\n if (m) expectedLength = parseInt(m[1], 10);\r\n }\r\n\r\n s = s.replace(/^\\)\\]\\}',?\\s*/, '');\r\n\r\n // Quick completeness checks before parse\r\n const endsMidString = /\"[^\"]*$/.test(s); // naive: unmatched quote at end\r\n const endsWithTokenLike = /\"message\":\"[A-Za-z0-9\\-_\\.]*$/.test(s); // ended mid token string\r\n const hasOpeningBrace = s.trimStart().startsWith('{');\r\n\r\n try {\r\n const parsed = JSON.parse(s);\r\n // If Content-Length existed and JSON length < expected, still truncated\r\n if (expectedLength && s.length < expectedLength) {\r\n throw new TruncatedResponseError(s, expectedLength, s.length);\r\n }\r\n return parsed;\r\n } catch {\r\n // Try balanced segment\r\n if (hasOpeningBrace) {\r\n const balanced = extractBalancedJsonSegment(s, s.indexOf('{'));\r\n if (balanced) {\r\n try {\r\n const parsed = JSON.parse(balanced);\r\n if (expectedLength && balanced.length < expectedLength) {\r\n throw new TruncatedResponseError(s, expectedLength, balanced.length);\r\n }\r\n return parsed;\r\n } catch { /* continue */ }\r\n }\r\n }\r\n // Auto-fix missing trailing braces only (not mid-string)\r\n if (!endsMidString) {\r\n const repaired = tryAutoFixJson(s);\r\n if (repaired) {\r\n try {\r\n const parsed = JSON.parse(repaired);\r\n if (expectedLength && repaired.length < expectedLength) {\r\n throw new TruncatedResponseError(s, expectedLength, repaired.length);\r\n }\r\n return parsed;\r\n } catch { /* continue */ }\r\n }\r\n }\r\n\r\n onError?.(body);\r\n\r\n // Decide error type\r\n if (expectedLength && s.length < expectedLength) {\r\n throw new TruncatedResponseError(s, expectedLength, s.length);\r\n }\r\n if (endsMidString || endsWithTokenLike) {\r\n throw new TruncatedResponseError(s, expectedLength, s.length);\r\n }\r\n throw new InvalidResponseBodyError(s);\r\n }\r\n }\r\n\r\n return body;\r\n}\r\n\r\nfunction extractBalancedJsonSegment(s: string, start: number): string | null {\r\n const open = s[start];\r\n const close = open === '{' ? '}' : (open === '[' ? ']' : null);\r\n if (!close) return null;\r\n\r\n let depth = 0, inString = false, escaped = false;\r\n for (let i = start; i < s.length; i++) {\r\n const ch = s[i];\r\n if (inString) {\r\n if (escaped) escaped = false;\r\n else if (ch === '\\\\') escaped = true;\r\n else if (ch === '\"') inString = false;\r\n continue;\r\n }\r\n if (ch === '\"') { inString = true; continue; }\r\n if (ch === open) depth++;\r\n else if (ch === close) {\r\n depth--;\r\n if (depth === 0) return s.slice(start, i + 1);\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction tryAutoFixJson(s: string): string | null {\r\n let inString = false, escaped = false;\r\n const stack: string[] = [];\r\n for (let i = 0; i < s.length; i++) {\r\n const ch = s[i];\r\n if (inString) {\r\n if (escaped) escaped = false;\r\n else if (ch === '\\\\') escaped = true;\r\n else if (ch === '\"') inString = false;\r\n continue;\r\n }\r\n if (ch === '\"') { inString = true; continue; }\r\n if (ch === '{') stack.push('}');\r\n else if (ch === '[') stack.push(']');\r\n else if ((ch === '}' || ch === ']') && stack.length) {\r\n const expected = stack[stack.length - 1];\r\n if (ch === expected) stack.pop();\r\n else return null;\r\n }\r\n }\r\n if (inString || !stack.length) return null;\r\n const trimmed = s.trimEnd();\r\n const last = trimmed[trimmed.length - 1];\r\n if (last === ',' || last === ':') return null;\r\n return s + stack.reverse().join('');\r\n}\r\n","import { HttpClient, HttpErrorResponse, HttpHeaders } from \"@angular/common/http\";\r\nimport { IApiOptions, ILocalizeApiConfigs, IOnConnectionError } from \"./interfaces\";\r\nimport { takeUntil, catchError, throwError, Subject, map } from \"rxjs\";\r\nimport { waitFor } from \"../localize.token\";\r\nimport { LOCALIZE_API_ASSETS } from \"./localize.api.assets\";\r\nimport { extractJsonFromResponse } from \"./json-extractor\";\r\n\r\ninterface IRequestInstance {\r\n client: HttpClient;\r\n destroy$: () => Subject<void>;\r\n}\r\n\r\ninterface IRetryOptions {\r\n maxRetries: () => number;\r\n delay: number;\r\n callback: () => Promise<any> | any;\r\n retryUnless?: (error: any) => boolean;\r\n onError?: (error: any) => Promise<void> | any;\r\n connectionError?: IOnConnectionError\r\n}\r\n\r\nclass LocalizeApiHelper {\r\n\r\n readonly defaultRetryOptions: Partial<IRetryOptions> = {\r\n connectionError: {\r\n message: 'Connection error occurred. Please wait',\r\n blockScreen: true,\r\n blockScreenZIndex: 10000\r\n }\r\n };\r\n\r\n async performRetry<T = any>(options: IRetryOptions): Promise<T> {\r\n let attempts = 0;\r\n let lastError: any;\r\n let consoleCount = 0;\r\n\r\n // Merge default retry options with provided options\r\n options = { ...this.defaultRetryOptions, ...options }\r\n\r\n let styleElement: HTMLStyleElement | undefined;\r\n\r\n while (attempts < options.maxRetries()) {\r\n try {\r\n const result = await options.callback();\r\n this.removeBlocker(styleElement);\r\n return result;\r\n\r\n } catch (error: any) {\r\n lastError = error;\r\n\r\n if (consoleCount >= 7) {\r\n console.clear();\r\n consoleCount = 0;\r\n }\r\n\r\n if (options.retryUnless && !options.retryUnless(error))\r\n throw error; // If the error should not be retried, rethrow it\r\n\r\n // Handle connection error (only blocks UI for true connection issues)\r\n styleElement = await this.onConnectionError(options, error);\r\n\r\n if (options.onError)\r\n await this.invokeHook(options.onError.bind(this, error));\r\n\r\n if (attempts >= options.maxRetries() - 1)\r\n throw error;\r\n\r\n attempts++;\r\n consoleCount++;\r\n console.warn(`Attempt ${attempts} failed. Retrying...`, error);\r\n await waitFor(options.delay);\r\n }\r\n }\r\n console.warn(`Failed after ${options.maxRetries()} attempts`);\r\n throw lastError;\r\n }\r\n\r\n async performRequestWithRetry<T = any>(\r\n options: IApiOptions,\r\n config: ILocalizeApiConfigs,\r\n performRequest: <T = any>(options: IApiOptions) => Promise<T>\r\n ): Promise<T> {\r\n\r\n const retryUnless = config.retryOptions?.retryFunction\r\n || this.isRetriableError.bind(this);\r\n\r\n return await this.performRetry({\r\n connectionError: config.retryOptions?.onConnectionError,\r\n maxRetries: () => config.retryOptions?.maxRetries ?? 1000,\r\n delay: config.retryOptions?.delay ?? 500,\r\n callback: () => performRequest<T>(options),\r\n retryUnless: retryUnless,\r\n })\r\n }\r\n\r\n buildUrl(baseUrl: string, path: string): string {\r\n const normalizedUrl = `${baseUrl.trim().replace(/\\/?$/, '/')}${path.trim().replace(/^\\//, '')}`;\r\n return normalizedUrl.endsWith('/')\r\n ? normalizedUrl.slice(0, -1)\r\n : normalizedUrl;\r\n }\r\n\r\n async invokeHook(callback?: () => Promise<any> | any): Promise<any> {\r\n if (!callback) return;\r\n\r\n const result = callback();\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n }\r\n\r\n createRequest<T = any>(instance: Required<IRequestInstance>, method: string, url: string, body: any, options: { headers: HttpHeaders }, onInvalidResponseBody?: (body: any) => void) {\r\n const httpOptions: any = {\r\n ...options,\r\n body,\r\n // Remove force text for diagnostics\r\n // responseType: 'text' as const\r\n };\r\n\r\n const raw$ = instance.client.request(method, url, httpOptions) as import('rxjs').Observable<any>;\r\n\r\n return raw$.pipe(\r\n takeUntil(instance.destroy$()),\r\n map((raw: string) => {\r\n if (typeof raw === 'string' && /^HTTP\\/\\d\\.\\d/.test(raw))\r\n console.warn('[ApiHelper] Raw header block detected');\r\n return extractJsonFromResponse(raw, onInvalidResponseBody) as T;\r\n }),\r\n catchError((error: HttpErrorResponse) => throwError(() => error))\r\n );\r\n }\r\n\r\n defaultRetryFunction(error: HttpErrorResponse): boolean {\r\n\r\n // Don't retry for other errors (like 400, 401, 403, etc.)\r\n if (!this.isRetriableError(error))\r\n throw error;\r\n\r\n return true;\r\n }\r\n\r\n // Only true connection problems should block the UI\r\n isConnectionError(error: any): boolean {\r\n return error?.status === 0;\r\n }\r\n\r\n // Retriable: network errors, transient 5xx, or invalid/incomplete JSON payloads\r\n isRetriableError(error: any): boolean {\r\n const status = error?.status;\r\n return status === 0\r\n || (typeof status === 'number' && status >= 500 && status < 600)\r\n || error?.name === 'InvalidResponseBodyError'\r\n || error?.name === 'TruncatedResponseError';\r\n }\r\n\r\n async onConnectionError(\r\n options: IRetryOptions,\r\n error: any\r\n ): Promise<Promise<void> | any> {\r\n\r\n if (!options.connectionError)\r\n return;\r\n\r\n let styleElement: HTMLStyleElement | undefined;\r\n if (this.isConnectionError(error)) {\r\n\r\n styleElement = this.screenBlocker(options, error, true);\r\n\r\n await this.invokeHook(options.connectionError.callback?.bind(this, error));\r\n return styleElement;\r\n } else {\r\n this.screenBlocker(options, error, false);\r\n styleElement?.remove();\r\n }\r\n }\r\n\r\n screenBlocker(optons: IRetryOptions,\r\n error?: HttpErrorResponse,\r\n add: boolean = true): HTMLStyleElement | undefined {\r\n\r\n if (!optons.connectionError?.blockScreen)\r\n return;\r\n\r\n const message = optons.connectionError?.message\r\n || 'Connection error occurred. Please wait';\r\n const errorMessage = error?.error?.message || 'An error occurred';\r\n const suggestinMessage = optons.connectionError?.suggestionMessage\r\n || 'Please check your internet connection or the server status.';\r\n\r\n const zIndex = optons.connectionError?.blockScreenZIndex || 10000;\r\n\r\n const body = document.body;\r\n const blcokerHtml = `\r\n <div class=\"lze-blocker\">\r\n ${LOCALIZE_API_ASSETS.network.noConnection}\r\n <div class=\"lze-blocker__message\">\r\n ${message}\r\n <span class=\"lze-blocker__dotting\">\r\n <span class=\"lze-blocker__dot\"></span>\r\n <span class=\"lze-blocker__dot\"></span>\r\n <span class=\"lze-blocker__dot\"></span>\r\n </span>\r\n </div>\r\n <div class=\"lze-blocker__error\">${errorMessage}</div>\r\n <div class=\"lze-blocker__error_suggestion\">${suggestinMessage}</div>\r\n </div>\r\n `;\r\n const style = `\r\n div.lze-blocker {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.85) !important;\r\n z-index: ${zIndex};\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n color: #fff !important;\r\n font-family: Arial, sans-serif;\r\n text-align: center;\r\n padding: 20px;\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n user-select: none;\r\n }\r\n\r\n svg#lze-no-connection {\r\n width: 75px;\r\n height: 75px;\r\n margin-bottom: 20px;\r\n }\r\n \r\n div.lze-blocker__message {\r\n color: #fff !important;\r\n font-size: 18px !important;\r\n margin-bottom: 10px;\r\n }\r\n \r\n .lze-blocker__dotting {\r\n display: inline-block;\r\n vertical-align: middle;\r\n }\r\n span.lze-blocker__dot {\r\n display: inline-block;\r\n width: 7px;\r\n height: 7px;\r\n background-color: #ffffff !important;\r\n border-radius: 50%;\r\n margin-left: 3px;\r\n opacity: 0.3;\r\n animation: dotting 1s infinite;\r\n }\r\n .lze-blocker__dot:nth-child(1) {\r\n animation-delay: 0s;\r\n opacity: 1;\r\n }\r\n .lze-blocker__dot:nth-child(2) {\r\n animation-delay: 0.2s;\r\n }\r\n .lze-blocker__dot:nth-child(3) {\r\n animation-delay: 0.4s;\r\n }\r\n\r\n @keyframes dotting {\r\n 0%, 80%, 100% { opacity: 0.3; }\r\n 40% { opacity: 1; }\r\n }\r\n\r\n div.lze-blocker__error {\r\n color: #f00;\r\n font-size: 14px !important;\r\n margin-bottom: 10px;\r\n text-shadow: 0 0 1px #ff5f5f !important;\r\n }\r\n\r\n div.lze-blocker__error_suggestion {\r\n color: #ccc !important;\r\n font-size: 14px !important;\r\n margin-top: 10px;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `;\r\n\r\n const styleElement = document.createElement('style');\r\n\r\n if (add) {\r\n if (!document.querySelector('.lze-blocker')) {\r\n styleElement.innerHTML = style;\r\n document.head.appendChild(styleElement);\r\n body.insertAdjacentHTML('beforeend', blcokerHtml);\r\n }\r\n } else {\r\n this.removeBlocker(styleElement);\r\n }\r\n\r\n return styleElement;\r\n }\r\n\r\n private removeBlocker(styleElement: HTMLStyleElement | undefined): void {\r\n const blocker = document.querySelector('.lze-blocker');\r\n blocker?.remove();\r\n styleElement?.remove();\r\n }\r\n}\r\n\r\nexport const ApiHelper = new LocalizeApiHelper();","import { Injectable, OnDestroy } from \"@angular/core\";\r\nimport { LocalizeTokenService } from \"./localize.token.service\";\r\nimport { HttpClient, HttpErrorResponse, HttpHeaders } from \"@angular/common/http\";\r\nimport { LocalizeToken, waitFor, waitUntil } from \"./localize.token\";\r\nimport { BehaviorSubject, Subject } from \"rxjs\";\r\nimport { ILocalizeApiConfigs, IApiOptions, EMethod, IHeader } from \"./helpers/interfaces\";\r\nimport { ApiHelper } from \"./helpers/loccalize.api.helper\";\r\n\r\nconst SCHEMES = LocalizeToken.httpHeaders;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalizeApiService implements OnDestroy {\r\n private readonly destroy$ = new Subject<void>();\r\n private readonly configSubject = new BehaviorSubject<Partial<ILocalizeApiConfigs>>({});\r\n readonly isRequestingSubject = new BehaviorSubject<boolean>(false);\r\n readonly isResolvingStartupSubject = new BehaviorSubject<boolean>(false);\r\n get isResolvingStartup() { return this.isResolvingStartupSubject.value; }\r\n\r\n get needTenant(): boolean { return this.localizeTokenService.config.tenantToken !== undefined; }\r\n\r\n get isRequesting() { return this.isRequestingSubject.value; }\r\n get isRevokingToken() { return this.localizeTokenService.isRevokingToken; }\r\n set isRevokingToken(value: boolean) { this.localizeTokenService.isRevokingToken = value; }\r\n\r\n get accessToken(): string | undefined { return this.localizeTokenService.accessToken; }\r\n set accessToken(value: string | undefined) { this.localizeTokenService.accessToken = value; }\r\n\r\n get refreshToken(): string | undefined { return this.localizeTokenService.refreshToken; }\r\n get tenantToken(): string | undefined { return this.localizeTokenService.tenantToken; }\r\n\r\n private defaultConfig: Partial<ILocalizeApiConfigs> = {\r\n waitEachRequest: { milliseconds: 0 },\r\n enableRequestCancellation: true,\r\n\r\n retryOptions: {\r\n maxRetries: 1000,\r\n delay: 1000,\r\n retryFunction: ApiHelper.defaultRetryFunction.bind(this),\r\n },\r\n\r\n };\r\n\r\n private get config(): Partial<ILocalizeApiConfigs> {\r\n this.validateConfig();\r\n return this.configSubject.value;\r\n }\r\n\r\n private apiOptions: Partial<IApiOptions> = {\r\n method: EMethod.GET,\r\n requestBody: null,\r\n };\r\n\r\n constructor(readonly httpClient: HttpClient,\r\n private readonly localizeTokenService: LocalizeTokenService\r\n ) { }\r\n\r\n /**\r\n * Initialize the API service.\r\n * @param apiConfigs - The API configurations.\r\n */\r\n init(apiConfigs: ILocalizeApiConfigs) {\r\n console.log('LocalizeApiService is initialized.');\r\n this.configSubject.next({ ...this.defaultConfig, ...apiConfigs });\r\n }\r\n\r\n cancelPendingRequests(): void {\r\n this.config.enableRequestCancellation\r\n && this.destroy$.next();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * A higher-order function that returns a curried function for making API requests.\r\n *\r\n * @param baseUrl - The base URL of the API.\r\n * @returns A curried function that can be used to make API requests.\r\n */\r\n func = (baseUrl: string) =>\r\n <T = any>(path: string, method: EMethod = EMethod.GET, reqBody: any = null, reqHeaders?: IHeader) =>\r\n this.request<T>(baseUrl, path, method, reqBody, reqHeaders)\r\n\r\n public async request<T = any>(baseUrl: string,\r\n path: string,\r\n method: EMethod = EMethod.GET,\r\n reqBody: any = null,\r\n reqHeaders?: IHeader): Promise<T> {\r\n\r\n await waitUntil(() => !this.isResolvingStartup, 500);\r\n\r\n await ApiHelper.invokeHook(this.config.onPrepareRequest);\r\n\r\n const apiOptions = this.buildApiOptions(baseUrl, path, method, reqBody, reqHeaders);\r\n\r\n try {\r\n await this.toWaitForPreviousRequest();\r\n\r\n return await ApiHelper.performRequestWithRetry<T>(\r\n apiOptions,\r\n this.config,\r\n this.performRequest.bind(this)\r\n );\r\n\r\n }\r\n catch (error: any) {\r\n return await this.handleOnRequestError(error, apiOptions);\r\n }\r\n }\r\n\r\n private async handleOnRequestError(error: HttpErrorResponse, options: IApiOptions): Promise<any> {\r\n if (error.status !== 401)\r\n throw error;\r\n\r\n await waitUntil(() => !this.isResolvingStartup, 50);\r\n\r\n return await ApiHelper.performRetry({\r\n maxRetries: () => 1000,\r\n delay: 10,\r\n retryUnless: (error) => error.status === 401 || ApiHelper.isConnectionError(error),\r\n callback: async () => {\r\n // Only handle 401 Unauthorized errors\r\n await this.revokeToken();\r\n\r\n // Retry the request with the new access token\r\n return await this.performRequest(options);\r\n }\r\n })\r\n\r\n }\r\n\r\n private async performRequest<T = any>(options: IApiOptions): Promise<T> {\r\n\r\n // Build the request options\r\n const buildOptions = { headers: this.buildHeaderOptions(options) };\r\n\r\n // Create the request observable\r\n const request$ = ApiHelper.createRequest<T>({\r\n client: this.httpClient,\r\n destroy$: () => this.destroy$\r\n }, options.method, options.requestUrl, options.requestBody, buildOptions,\r\n this.config.onResponseBodyInvalid?.bind(this));\r\n\r\n // Set the isRequesting state to true before making the request\r\n this.isRequestingSubject.next(true);\r\n\r\n const response = await new Promise<any>((resolve, reject) =>\r\n request$.subscribe({ next: resolve, error: reject }));\r\n\r\n // Reset the isRequesting state after the request completes\r\n this.isRequestingSubject.next(false);\r\n\r\n return response;\r\n }\r\n\r\n private async revokeToken(): Promise<void> {\r\n\r\n try {\r\n if (await this.interceptRevokeToken())\r\n return;\r\n\r\n this.isRevokingToken = true;\r\n\r\n const apiOptions: IApiOptions = {\r\n ...this.buildApiOptions(this.localizeTokenService.config.refreshToken?.requestUrl || ''),\r\n refreshToken: true,\r\n }\r\n\r\n // const revokeToken = await this.performRequest(apiOptions);\r\n const revokeToken = await ApiHelper.performRequestWithRetry(\r\n apiOptions,\r\n this.config,\r\n this.performRequest.bind(this)\r\n );\r\n\r\n await this.handleOnTokenRevoked(revokeToken);\r\n\r\n } catch (error: any) {\r\n // Handle the error, log it\r\n await ApiHelper.invokeHook(this.config.onAutoLogout);\r\n throw error;\r\n\r\n } finally {\r\n // Reset the revoking token state\r\n this.isRevokingToken = false;\r\n }\r\n }\r\n\r\n /** default http request options */\r\n private buildHeaderOptions(options: IApiOptions): HttpHeaders {\r\n\r\n const headers: { [key: string]: string } = {\r\n ...(options.refreshToken && { [SCHEMES.X_REFRESH_TOKEN]: `${this.refreshToken}` }),\r\n ...(!options.isFormData && { [SCHEMES.CONTENT_TYPE]: 'application/json' }),\r\n [SCHEMES.AUTHORIZATION]: `Bearer ${this.accessToken}`,\r\n ...(this.needTenant && { [SCHEMES.X_TENANT]: `${this.tenantToken}` })\r\n };\r\n\r\n return new HttpHeaders({ ...headers, ...options.headers });\r\n }\r\n\r\n private buildApiOptions(\r\n baseUrl: string,\r\n path: string = '',\r\n method: EMethod = EMethod.GET,\r\n requestBody: any = null,\r\n headers?: { [key: string]: string }\r\n ): IApiOptions {\r\n\r\n const requestUrl = ApiHelper.buildUrl(baseUrl, path);\r\n const isFormData = requestBody && requestBody instanceof FormData;\r\n return {\r\n ...this.apiOptions,\r\n ...{ headers, method, requestUrl, requestBody, isFormData }\r\n };\r\n }\r\n\r\n\r\n private async toWaitForPreviousRequest() {\r\n if (this.isRevokingToken) {\r\n await waitUntil(() => !this.isRevokingToken);\r\n }\r\n\r\n // to wait for each request in 50ms, even if the request is not completed\r\n const waitMilliseconds = this.config.waitEachRequest?.milliseconds;\r\n if (waitMilliseconds && this.isRequesting) {\r\n // console.warn(`Request throttling: Another request is in progress. Waiting for ${waitMilliseconds}ms.`);\r\n await waitFor(waitMilliseconds, this.isRequesting);\r\n }\r\n }\r\n\r\n\r\n private async handleOnTokenRevoked(response: any): Promise<void> {\r\n\r\n if (response?.status) {\r\n // If the response is successful, update the access token\r\n this.accessToken = response.message;\r\n\r\n } else {\r\n // If the response indicates an error, invoke the onRevokeUnauthorized hook\r\n console.warn('Token revocation failed, refresh token is expired.', response.message);\r\n await ApiHelper.invokeHook(this.config.onRevokeUnauthorized);\r\n }\r\n\r\n }\r\n\r\n private async interceptRevokeToken() {\r\n\r\n if (this.isRevokingToken) {\r\n console.warn('Token is already being revoked. Waiting for the current operation to complete...');\r\n await waitUntil(() => !this.isRevokingToken);\r\n return true;\r\n }\r\n\r\n if (!this.refreshToken) {\r\n // await ApiHelper.invokeHook(this.apiConfigs.onAutoLogout);\r\n throw new Error('Refresh token is missing. Please login again.');\r\n }\r\n return false;\r\n }\r\n\r\n validateConfig(): void {\r\n if (this.localizeTokenService.config.requiredTenant\r\n && !this.localizeTokenService.config.tenantToken?.name?.trim().length) {\r\n throw Error('Tenant token is required but tenantTokenName is not configured');\r\n }\r\n\r\n if (!this.localizeTokenService.config.refreshToken?.requestUrl?.trim().length) {\r\n throw Error('Revoke token URL is not configured - token refresh will not work');\r\n }\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { LocalizeTokenService } from './localize.token.service';\r\nimport { LocalizeApiService } from './localize.api.service';\r\n\r\n@NgModule({\r\n providers: [\r\n LocalizeTokenService,\r\n LocalizeApiService\r\n ]\r\n})\r\nexport class LocalizeTokenModule { }","import { Injectable } from '@angular/core';\r\nimport { LocalizeLogindlgService } from '../localize-logindlg/localize-logindlg.service';\r\nimport { ILocalizeApiConfigs } from '../localize-token/helpers/interfaces';\r\nimport { LocalizeApiService } from '../localize-token/localize.api.service';\r\nimport { ILocalizeTokenConfig } from '../localize-token/localize.token';\r\nimport { LocalizeTokenService } from '../localize-token/localize.token.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalizeApiTokenService {\r\n readonly api: LocalizeApiService;\r\n readonly token: LocalizeTokenService;\r\n readonly loginDialog: LocalizeLogindlgService;\r\n\r\n constructor(tokenService: LocalizeTokenService,\r\n apiService: LocalizeApiService,\r\n loginDialogService: LocalizeLogindlgService) {\r\n this.api = apiService;\r\n this.token = tokenService;\r\n this.loginDialog = loginDialogService;\r\n }\r\n\r\n initialize(tokenConfig: ILocalizeTokenConfig, apiConfig: ILocalizeApiConfigs) {\r\n // Initialize the LocalizeTokenService with the provided token configuration\r\n this.token.init(tokenConfig);\r\n\r\n // Initialize the LocalizeApiService with the provided API configuration\r\n this.api.init(apiConfig);\r\n\r\n console.log('LocalizeApiTokenService initialized with token and API configurations.');\r\n\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LocalizeLogindlgModule } from '../localize-logindlg/localize-logindlg.module';\r\nimport { LocalizeTokenModule } from '../localize-token/localize.token.module';\r\nimport { LocalizeApiTokenService } from './localize-api-token.service';\r\n\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n LocalizeTokenModule,\r\n LocalizeLogindlgModule\r\n ],\r\n providers: [\r\n LocalizeApiTokenService\r\n ]\r\n})\r\nexport class LocalizeApiTokenModule { }\r\n","//#region login dialog\r\nexport * from './localize-logindlg/localize-logindlg.component'\r\nexport * from './localize-logindlg/localize-logindlg.module'\r\nexport * from './localize-logindlg/localize-logindlg.service'\r\n\r\n//#region localize token\r\nexport * from './localize-token/helpers/localize.api.assets';\r\nexport * from './localize-token/helpers/interfaces';\r\nexport * from './localize-token/helpers/loccalize.api.helper';\r\nexport * from './localize-token/localize.token.service';\r\nexport * from './localize-token/localize.token';\r\nexport * from './localize-token/localize.token.storage';\r\nexport * from './localize-token/localize.token.module';\r\nexport * from './localize-token/localize.api.service';\r\n\r\n//#region localize api token\r\nexport * from './localize-api-token/localize-api-token.service';\r\nexport * from './localize-api-token/localize-api-token.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.LocalizeTokenService","i1","i2.LocalizeTokenService","i1.LocalizeTokenService","i2.LocalizeApiService","i3.LocalizeLogindlgService"],"mappings":"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"}
@@ -2,4 +2,10 @@ export declare class InvalidResponseBodyError extends Error {
2
2
  raw: string;
3
3
  constructor(raw: string);
4
4
  }
5
+ export declare class TruncatedResponseError extends Error {
6
+ raw: string;
7
+ expectedLength?: number;
8
+ actualLength?: number;
9
+ constructor(raw: string, expectedLength?: number, actualLength?: number);
10
+ }
5
11
  export declare function extractJsonFromResponse(body: any, onError?: (body: any) => void): any;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sambath999/localize-token",
3
- "version": "19.1.6",
3
+ "version": "19.1.7",
4
4
  "description": "localize token client app",
5
5
  "type": "module",
6
6
  "repository": {