@thunderid/browser 1.0.7 → 1.2.0

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.
@@ -40,19 +40,12 @@ const ERROR = "error";
40
40
  const ERROR_DESCRIPTION = "error_description";
41
41
  const CUSTOM_GRANT_CONFIG = "custom_grant_config";
42
42
  const STATE_QUERY = "state";
43
- const OP_IFRAME = "opIFrame";
44
- const RP_IFRAME = "rpIFrame";
45
- const PROMPT_NONE_IFRAME = "promptNoneIFrame";
46
- const STATE = "Y2hlY2tTZXNzaW9u";
47
43
  const SILENT_SIGN_IN_STATE = "sign-in-silently";
48
- const INITIALIZED_SILENT_SIGN_IN = "initialized-silent-sign-in";
49
- const PROMPT_NONE_REQUEST_SENT = "promptNoneRequestSent";
50
44
  const ACCESS_TOKEN_INVALID = "Access token is invalid";
51
45
  const REFRESH_ACCESS_TOKEN_ERR0R = "refresh-access-token-error";
52
46
  const TOKEN_REQUEST_CONFIG_KEY = "token_request_config";
53
- const CHECK_SESSION_SIGNED_IN = "check_session_signed_in";
54
- const CHECK_SESSION_SIGNED_OUT = "check_session_signed_out";
55
- const SET_SESSION_STATE_FROM_IFRAME = "set_session_state_from_iframe";
47
+ const SILENT_SIGN_IN_SIGNED_IN = "silent_sign_in_signed_in";
48
+ const SILENT_SIGN_IN_SIGNED_OUT = "silent_sign_in_signed_out";
56
49
 
57
50
  //#endregion
58
51
  //#region src/FetchHttpClient.ts
@@ -290,13 +283,6 @@ var SPAUtils = class SPAUtils {
290
283
  return false;
291
284
  }
292
285
  /**
293
- * Returns `true` if a silent sign-in was previously initialized in this session.
294
- */
295
- static wasSilentSignInCalled() {
296
- const raw = sessionStorage.getItem(INITIALIZED_SILENT_SIGN_IN);
297
- return Boolean(raw ? JSON.parse(raw) : null);
298
- }
299
- /**
300
286
  * Checks whether the current URL indicates a successful sign-out redirect.
301
287
  * Clears the query string and session data if `true`.
302
288
  *
@@ -359,21 +345,6 @@ var SPAUtils = class SPAUtils {
359
345
  return !!urlObject.searchParams.get(ERROR) && urlObject.searchParams.get(STATE_QUERY) !== __thunderid_javascript.OIDCRequestConstants.Params.SIGN_OUT_SUCCESS;
360
346
  }
361
347
  /**
362
- * Returns `true` if no prompt-none request has been sent yet this session.
363
- */
364
- static canSendPromptNoneRequest() {
365
- const raw = sessionStorage.getItem(PROMPT_NONE_REQUEST_SENT);
366
- return !(raw ? JSON.parse(raw) : null);
367
- }
368
- /**
369
- * Records whether a prompt-none request has been sent.
370
- *
371
- * @param canSend - `true` marks the request as sent.
372
- */
373
- static setPromptNoneRequestSent(canSend) {
374
- sessionStorage.setItem(PROMPT_NONE_REQUEST_SENT, JSON.stringify(canSend));
375
- }
376
- /**
377
348
  * Waits until the browser has redirected (non-blocking delay).
378
349
  *
379
350
  * @param time - Time to wait in seconds (default: 3).
@@ -402,7 +373,7 @@ var SPAUtils_default = SPAUtils;
402
373
  //#region src/utils/AuthenticationHelper.ts
403
374
  /**
404
375
  * Browser-level authentication helper that orchestrates HTTP requests with token attachment,
405
- * automatic token refresh, session management, and the silent sign-in flow.
376
+ * automatic token refresh, and the silent sign-in flow.
406
377
  *
407
378
  * @typeParam T - The browser client config extension type.
408
379
  */
@@ -462,18 +433,6 @@ var AuthenticationHelper = class {
462
433
  httpClient?.disableHandler && httpClient.disableHandler();
463
434
  }
464
435
  /**
465
- * Initializes OIDC Session Management via an RP iframe.
466
- *
467
- * @param config - The current auth config.
468
- * @param oidcEndpoints - Resolved OIDC provider endpoints.
469
- * @param getSessionState - Returns the current session state from storage.
470
- * @param getAuthzURL - Builds an authorization URL with optional params.
471
- * @param sessionManagementHelper - The session management helper instance.
472
- */
473
- initializeSessionManger(config, oidcEndpoints, getSessionState, getAuthzURL, sessionManagementHelper) {
474
- sessionManagementHelper.initialize(config.clientId, oidcEndpoints.checkSessionIframe ?? "", getSessionState, config.checkSessionInterval ?? 3, config.sessionRefreshInterval ?? 300, config.afterSignInUrl, getAuthzURL);
475
- }
476
- /**
477
436
  * Executes a custom token exchange grant, enforcing `allowedExternalUrls` rules when applicable.
478
437
  *
479
438
  * @param config - The token exchange configuration.
@@ -643,76 +602,96 @@ var AuthenticationHelper = class {
643
602
  });
644
603
  }
645
604
  /**
646
- * Executes the silent sign-in flow using a prompt-none request via an iFrame.
605
+ * Executes the silent sign-in flow by loading a `prompt=none` authorize request in a hidden iframe.
647
606
  *
648
607
  * @param constructSilentSignInUrl - Builds the prompt-none authorize URL.
649
608
  * @param requestAccessToken - Exchanges the returned code for tokens.
650
- * @param sessionManagementHelper - Handles the iFrame prompt-none response.
651
609
  * @param additionalParams - Extra authorize request params.
652
610
  * @param tokenRequestConfig - Additional params for the token request.
653
611
  * @returns The user session, or `false` if the user is not signed in.
654
612
  */
655
- async signInSilently(constructSilentSignInUrl, requestAccessToken, sessionManagementHelper, additionalParams, tokenRequestConfig) {
613
+ async signInSilently(constructSilentSignInUrl, requestAccessToken, additionalParams, tokenRequestConfig) {
656
614
  if (SPAUtils_default.isInitializedSilentSignIn()) {
657
- await sessionManagementHelper.receivePromptNoneResponse();
615
+ await this.handleSilentSignInResponse();
658
616
  return Promise.resolve({
659
617
  allowedScopes: "",
660
618
  displayName: "",
661
619
  email: "",
662
- sessionState: "",
663
620
  sub: "",
664
621
  tenantDomain: "",
665
622
  username: ""
666
623
  });
667
624
  }
668
- const promptNoneIFrame = document.getElementById(RP_IFRAME)?.contentDocument?.getElementById(PROMPT_NONE_IFRAME);
625
+ let url;
669
626
  try {
670
- promptNoneIFrame.src = await constructSilentSignInUrl(additionalParams);
627
+ url = await constructSilentSignInUrl(additionalParams);
671
628
  } catch (error) {
672
629
  return Promise.reject(error);
673
630
  }
631
+ const silentSignInIFrame = document.createElement("iframe");
632
+ silentSignInIFrame.style.display = "none";
674
633
  return new Promise((resolve, reject) => {
634
+ const cleanUp = () => {
635
+ window.removeEventListener("message", listenToSilentSignInIFrame);
636
+ clearTimeout(timer);
637
+ silentSignInIFrame.remove();
638
+ };
675
639
  const timer = setTimeout(() => {
640
+ cleanUp();
676
641
  resolve(false);
677
642
  }, 1e4);
678
- const listenToPromptNoneIFrame = async (e) => {
643
+ const listenToSilentSignInIFrame = async (e) => {
644
+ if (e.origin !== window.location.origin || e.source !== silentSignInIFrame.contentWindow) return;
679
645
  const data = e.data;
680
- if (data?.type == CHECK_SESSION_SIGNED_OUT) {
681
- window.removeEventListener("message", listenToPromptNoneIFrame);
682
- clearTimeout(timer);
646
+ if (data?.type === SILENT_SIGN_IN_SIGNED_OUT) {
647
+ cleanUp();
683
648
  resolve(false);
684
649
  }
685
- if (data?.type == CHECK_SESSION_SIGNED_IN && data?.data?.code) {
650
+ if (data?.type === SILENT_SIGN_IN_SIGNED_IN && data?.data?.code) {
686
651
  const authInfo = data.data;
687
- requestAccessToken(authInfo.code, authInfo.sessionState, authInfo.state, tokenRequestConfig).then((response) => {
688
- window.removeEventListener("message", listenToPromptNoneIFrame);
689
- resolve(response);
690
- }).catch((error) => {
691
- window.removeEventListener("message", listenToPromptNoneIFrame);
692
- reject(error);
693
- }).finally(() => {
694
- clearTimeout(timer);
695
- });
652
+ cleanUp();
653
+ requestAccessToken(authInfo.code, authInfo.state, tokenRequestConfig).then(resolve).catch(reject);
696
654
  }
697
655
  };
698
- window.addEventListener("message", listenToPromptNoneIFrame);
656
+ window.addEventListener("message", listenToSilentSignInIFrame);
657
+ silentSignInIFrame.src = url;
658
+ document.body.appendChild(silentSignInIFrame);
699
659
  });
700
660
  }
701
661
  /**
662
+ * Handles the page load inside the silent sign-in iframe: relays the authorization response to the
663
+ * parent window and blanks the iframe.
664
+ *
665
+ * @returns `true` if the current page load was a silent sign-in response.
666
+ */
667
+ async handleSilentSignInResponse() {
668
+ const url = new URL(window.location.href);
669
+ const state = url.searchParams.get(STATE_QUERY);
670
+ if (state === null || !state.includes(SILENT_SIGN_IN_STATE)) return false;
671
+ const code$1 = url.searchParams.get("code");
672
+ const message = code$1 !== null && code$1.length !== 0 ? {
673
+ data: {
674
+ code: code$1,
675
+ state
676
+ },
677
+ type: SILENT_SIGN_IN_SIGNED_IN
678
+ } : { type: SILENT_SIGN_IN_SIGNED_OUT };
679
+ window.parent.postMessage(message, window.location.origin);
680
+ window.location.href = "about:blank";
681
+ await SPAUtils_default.waitTillPageRedirect();
682
+ return true;
683
+ }
684
+ /**
702
685
  * Handles the early-return path of `signIn()` when a session already exists
703
- * or the page is handling a prompt-none response.
686
+ * or the page is handling a silent sign-in response.
704
687
  *
705
- * @param shouldStopAuthn - Returns `true` if we should short-circuit and return early.
706
- * @param checkSession - Callback to initialize OIDC session management.
707
688
  * @returns The current user if already signed in, or `undefined` to continue normal sign-in.
708
689
  */
709
- async handleSignIn(shouldStopAuthn, checkSession) {
710
- const configAny = await this._storageManager.getConfigData();
711
- if (await shouldStopAuthn()) return Promise.resolve({
690
+ async handleSignIn() {
691
+ if (await this.handleSilentSignInResponse()) return Promise.resolve({
712
692
  allowedScopes: "",
713
693
  displayName: "",
714
694
  email: "",
715
- sessionState: "",
716
695
  sub: "",
717
696
  tenantDomain: "",
718
697
  username: ""
@@ -720,7 +699,6 @@ var AuthenticationHelper = class {
720
699
  if (await this._isSignedIn()) {
721
700
  await this._spaHelper.clearRefreshTokenTimeout();
722
701
  await this._spaHelper.refreshAccessTokenAutomatically(() => this.refreshAccessToken());
723
- if (configAny.syncSession) checkSession();
724
702
  return Promise.resolve(await this._getUser());
725
703
  }
726
704
  const error = new URL(window.location.href).searchParams.get(ERROR);
@@ -838,164 +816,6 @@ const navigate = (url) => {
838
816
  };
839
817
  var navigate_default = navigate;
840
818
 
841
- //#endregion
842
- //#region src/utils/SessionManagementHelper.ts
843
- /**
844
- * Factory that creates an OIDC Session Management helper using an RP iframe and polling.
845
- * Appends a hidden RP iframe to the document and returns the helper interface.
846
- *
847
- * @param signOut - Returns the sign-out URL for the current session.
848
- * @param setSessionState - Stores a new session state from a prompt-none response.
849
- * @returns A `SessionManagementHelperInterface` instance.
850
- */
851
- const createSessionManagementHelper = async (signOut, setSessionState) => {
852
- let _clientID;
853
- let _checkSessionEndpoint;
854
- let _sessionState;
855
- let _interval;
856
- let _redirectURL;
857
- let _sessionRefreshInterval;
858
- let _sessionRefreshIntervalTimeout;
859
- let _checkSessionIntervalTimeout;
860
- let _getSignInUrl;
861
- const initialize = (clientId, checkSessionEndpoint, getSessionState, interval, sessionRefreshInterval, redirectURL, getSignInUrl) => {
862
- _clientID = clientId;
863
- _checkSessionEndpoint = checkSessionEndpoint;
864
- _sessionState = getSessionState;
865
- _interval = interval;
866
- _redirectURL = redirectURL;
867
- _sessionRefreshInterval = sessionRefreshInterval;
868
- _getSignInUrl = getSignInUrl;
869
- if (_interval > -1) initiateCheckSession();
870
- if (_sessionRefreshInterval > -1) _sessionRefreshIntervalTimeout = setInterval(() => {
871
- sendPromptNoneRequest();
872
- }, _sessionRefreshInterval * 1e3);
873
- };
874
- const initiateCheckSession = async () => {
875
- if (!_checkSessionEndpoint || !_clientID || !_redirectURL) return;
876
- async function checkSession() {
877
- const sessionState = await _sessionState();
878
- if (Boolean(_clientID) && Boolean(sessionState)) {
879
- const message = `${_clientID} ${sessionState}`;
880
- (document.getElementById(RP_IFRAME)?.contentDocument?.getElementById(OP_IFRAME)).contentWindow?.postMessage(message, _checkSessionEndpoint);
881
- }
882
- }
883
- const opIframe = document.getElementById(RP_IFRAME)?.contentDocument?.getElementById(OP_IFRAME);
884
- opIframe.src = _checkSessionEndpoint + "?client_id=" + _clientID + "&redirect_uri=" + _redirectURL;
885
- _checkSessionIntervalTimeout = setInterval(checkSession, _interval * 1e3);
886
- listenToResponseFromOPIFrame();
887
- };
888
- const reset = () => {
889
- clearInterval(_checkSessionIntervalTimeout);
890
- clearInterval(_sessionRefreshIntervalTimeout);
891
- };
892
- const listenToResponseFromOPIFrame = () => {
893
- async function receiveMessage(e) {
894
- const targetOrigin = _checkSessionEndpoint;
895
- if (!targetOrigin || targetOrigin?.indexOf(e.origin) < 0 || e?.data?.type === SET_SESSION_STATE_FROM_IFRAME) return;
896
- if (e.data === "unchanged") {} else if (e.data === "error") window.location.href = await signOut();
897
- else if (e.data === "changed") sendPromptNoneRequest();
898
- }
899
- window?.addEventListener("message", receiveMessage, false);
900
- };
901
- const sendPromptNoneRequest = async () => {
902
- const promptNoneIFrame = document.getElementById(RP_IFRAME)?.contentDocument?.getElementById(PROMPT_NONE_IFRAME);
903
- if (SPAUtils_default.canSendPromptNoneRequest()) {
904
- SPAUtils_default.setPromptNoneRequestSent(true);
905
- const receiveMessageListener = (e) => {
906
- if (e?.data?.type === SET_SESSION_STATE_FROM_IFRAME) {
907
- setSessionState(e?.data?.data ?? "");
908
- window?.removeEventListener("message", receiveMessageListener);
909
- }
910
- };
911
- window?.addEventListener("message", receiveMessageListener);
912
- promptNoneIFrame.src = await _getSignInUrl({
913
- prompt: "none",
914
- response_mode: "query",
915
- state: STATE
916
- });
917
- }
918
- };
919
- const receivePromptNoneResponse = async (setSessionStateFn) => {
920
- const state = new URL(window.location.href).searchParams.get(STATE_QUERY);
921
- const sessionState = new URL(window.location.href).searchParams.get(__thunderid_javascript.OIDCRequestConstants.Params.SESSION_STATE);
922
- const parent = window.parent.parent;
923
- if (state !== null && (state.includes(STATE) || state.includes(SILENT_SIGN_IN_STATE))) {
924
- const code$1 = new URL(window.location.href).searchParams.get("code");
925
- if (code$1 !== null && code$1.length !== 0) {
926
- if (state.includes(SILENT_SIGN_IN_STATE)) {
927
- const message = {
928
- data: {
929
- code: code$1,
930
- sessionState: sessionState ?? "",
931
- state
932
- },
933
- type: CHECK_SESSION_SIGNED_IN
934
- };
935
- sessionStorage.setItem(INITIALIZED_SILENT_SIGN_IN, "false");
936
- parent.postMessage(message, parent.origin);
937
- SPAUtils_default.setPromptNoneRequestSent(false);
938
- window.location.href = "about:blank";
939
- await SPAUtils_default.waitTillPageRedirect();
940
- return true;
941
- }
942
- const newSessionState = new URL(window.location.href).searchParams.get("session_state");
943
- setSessionStateFn && await setSessionStateFn(newSessionState);
944
- SPAUtils_default.setPromptNoneRequestSent(false);
945
- window.location.href = "about:blank";
946
- await SPAUtils_default.waitTillPageRedirect();
947
- return true;
948
- } else {
949
- if (state.includes(SILENT_SIGN_IN_STATE)) {
950
- const message = { type: CHECK_SESSION_SIGNED_OUT };
951
- window.parent.parent.postMessage(message, parent.origin);
952
- SPAUtils_default.setPromptNoneRequestSent(false);
953
- window.location.href = "about:blank";
954
- await SPAUtils_default.waitTillPageRedirect();
955
- return true;
956
- }
957
- SPAUtils_default.setPromptNoneRequestSent(false);
958
- const signOutURL = await signOut();
959
- parent.location.href = signOutURL;
960
- window.location.href = "about:blank";
961
- await SPAUtils_default.waitTillPageRedirect();
962
- return true;
963
- }
964
- }
965
- return false;
966
- };
967
- let rpIFrame = document.createElement("iframe");
968
- rpIFrame.setAttribute("id", RP_IFRAME);
969
- rpIFrame.style.display = "none";
970
- let rpIframeLoaded = false;
971
- rpIFrame.onload = () => {
972
- rpIFrame = document.getElementById(RP_IFRAME);
973
- const rpDoc = rpIFrame?.contentDocument;
974
- const opIFrame = rpDoc?.createElement("iframe");
975
- if (opIFrame) {
976
- opIFrame.setAttribute("id", OP_IFRAME);
977
- opIFrame.style.display = "none";
978
- }
979
- const promptNoneIFrame = rpDoc?.createElement("iframe");
980
- if (promptNoneIFrame) {
981
- promptNoneIFrame.setAttribute("id", PROMPT_NONE_IFRAME);
982
- promptNoneIFrame.style.display = "none";
983
- }
984
- opIFrame && rpIFrame?.contentDocument?.body?.appendChild(opIFrame);
985
- promptNoneIFrame && rpIFrame?.contentDocument?.body?.appendChild(promptNoneIFrame);
986
- rpIframeLoaded = true;
987
- };
988
- document?.body?.appendChild(rpIFrame);
989
- const sleep = () => new Promise((resolve) => setTimeout(resolve, 1));
990
- while (!rpIframeLoaded) await sleep();
991
- return {
992
- initialize,
993
- receivePromptNoneResponse,
994
- reset
995
- };
996
- };
997
- var SessionManagementHelper_default = createSessionManagementHelper;
998
-
999
819
  //#endregion
1000
820
  //#region ../../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1001
821
  var require_base64_js = /* @__PURE__ */ __commonJS({ "../../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js": ((exports) => {
@@ -2598,10 +2418,7 @@ var SPAHelper_default = SPAHelper;
2598
2418
  const logger$2 = (0, __thunderid_javascript.createPackageComponentLogger)("@thunderid/browser", "ThunderIDBrowserClient");
2599
2419
  const BROWSER_DEFAULT_CONFIG = {
2600
2420
  autoLogoutOnTokenRefreshError: false,
2601
- checkSessionInterval: 3,
2602
- periodicTokenRefresh: false,
2603
- sessionRefreshInterval: 300,
2604
- syncSession: false
2421
+ periodicTokenRefresh: false
2605
2422
  };
2606
2423
  const initiateStore = (storage) => {
2607
2424
  switch (storage) {
@@ -2616,7 +2433,6 @@ var ThunderIDBrowserClient = class ThunderIDBrowserClient extends __thunderid_ja
2616
2433
  _browserInstanceId = 0;
2617
2434
  _httpClient;
2618
2435
  _spaHelper;
2619
- _sessionManagementHelper;
2620
2436
  _authHelper;
2621
2437
  _storage = BrowserStorage_default.SessionStorage;
2622
2438
  _getSignOutURLFromSessionStorage = false;
@@ -2655,7 +2471,6 @@ var ThunderIDBrowserClient = class ThunderIDBrowserClient extends __thunderid_ja
2655
2471
  await this._authHelper?.attachTokenToRequestConfig(request);
2656
2472
  };
2657
2473
  this._httpClient = FetchHttpClient_default.getInstance(this._browserInstanceId, true, attachToken);
2658
- this._sessionManagementHelper = await SessionManagementHelper_default(async () => this.getSignOutUrl(), (sessionState) => sm.setSessionDataParameter(__thunderid_javascript.OIDCRequestConstants.Params.SESSION_STATE, sessionState));
2659
2474
  this._authHelper = new AuthenticationHelper_default(sm, this._spaHelper, this._browserInstanceId, {
2660
2475
  exchangeToken: (cfg) => super.exchangeToken(cfg),
2661
2476
  getAccessToken: (sessionId) => this.getAccessToken(sessionId),
@@ -2696,30 +2511,27 @@ var ThunderIDBrowserClient = class ThunderIDBrowserClient extends __thunderid_ja
2696
2511
  isLoading() {
2697
2512
  return false;
2698
2513
  }
2699
- async signIn(config, authorizationCode, sessionState, state, tokenRequestConfig) {
2514
+ async signIn(config, authorizationCode, state, tokenRequestConfig) {
2700
2515
  await this.isInitialized();
2701
2516
  if (!SPAUtils_default.canContinueSignIn(Boolean(config?.callOnlyOnRedirect), authorizationCode)) return;
2702
2517
  delete config?.callOnlyOnRedirect;
2703
- const user = await this._signInInternal(config, authorizationCode, sessionState, state, tokenRequestConfig);
2518
+ const user = await this._signInInternal(config, authorizationCode, state, tokenRequestConfig);
2704
2519
  if (user && this._onSignInCallback) this._onSignInCallback(user);
2705
2520
  return user;
2706
2521
  }
2707
- async _signInInternal(signInConfig, authorizationCode, sessionState, state, tokenRequestConfig) {
2522
+ async _signInInternal(signInConfig, authorizationCode, state, tokenRequestConfig) {
2708
2523
  const sm = this.getStorageManager();
2709
2524
  const config = await sm.getConfigData();
2710
- const basicUserInfo = await this._authHelper.handleSignIn(() => this._shouldStopAuthn(), () => this._checkSession());
2525
+ const basicUserInfo = await this._authHelper.handleSignIn();
2711
2526
  if (basicUserInfo) return basicUserInfo;
2712
2527
  let resolvedAuthorizationCode;
2713
- let resolvedSessionState;
2714
2528
  let resolvedState;
2715
2529
  let resolvedTokenRequestConfig = { params: {} };
2716
2530
  if (config?.responseMode === "form_post" && authorizationCode) {
2717
2531
  resolvedAuthorizationCode = authorizationCode;
2718
- resolvedSessionState = sessionState ?? "";
2719
2532
  resolvedState = state ?? "";
2720
2533
  } else {
2721
2534
  resolvedAuthorizationCode = new URL(window.location.href).searchParams.get(__thunderid_javascript.OIDCRequestConstants.Params.AUTHORIZATION_CODE) ?? "";
2722
- resolvedSessionState = new URL(window.location.href).searchParams.get(__thunderid_javascript.OIDCRequestConstants.Params.SESSION_STATE) ?? "";
2723
2535
  resolvedState = new URL(window.location.href).searchParams.get(__thunderid_javascript.OIDCRequestConstants.Params.STATE) ?? "";
2724
2536
  SPAUtils_default.removeAuthorizationCode();
2725
2537
  }
@@ -2727,7 +2539,7 @@ var ThunderIDBrowserClient = class ThunderIDBrowserClient extends __thunderid_ja
2727
2539
  sm.setSessionStatus("true");
2728
2540
  const storedTokenRequestConfig = await sm.getTemporaryDataParameter(TOKEN_REQUEST_CONFIG_KEY);
2729
2541
  if (storedTokenRequestConfig && typeof storedTokenRequestConfig === "string") resolvedTokenRequestConfig = JSON.parse(storedTokenRequestConfig);
2730
- return this._exchangeCodeForTokens(resolvedAuthorizationCode, resolvedSessionState, resolvedState, resolvedTokenRequestConfig);
2542
+ return this._exchangeCodeForTokens(resolvedAuthorizationCode, resolvedState, resolvedTokenRequestConfig);
2731
2543
  }
2732
2544
  return this.getSignInUrl(signInConfig).then(async (url) => {
2733
2545
  if (this._storage === BrowserStorage_default.BrowserMemory && config.enablePKCE) {
@@ -2741,34 +2553,32 @@ var ThunderIDBrowserClient = class ThunderIDBrowserClient extends __thunderid_ja
2741
2553
  allowedScopes: "",
2742
2554
  displayName: "",
2743
2555
  email: "",
2744
- sessionState: "",
2745
2556
  sub: "",
2746
2557
  tenantDomain: "",
2747
2558
  username: ""
2748
2559
  };
2749
2560
  });
2750
2561
  }
2751
- async _exchangeCodeForTokens(authorizationCode, sessionState, state, tokenRequestConfig) {
2562
+ async _exchangeCodeForTokens(authorizationCode, state, tokenRequestConfig) {
2752
2563
  const config = await this.getStorageManager().getConfigData();
2753
- if (this._storage === BrowserStorage_default.BrowserMemory && config.enablePKCE && sessionState) {
2754
- const pkceKey = (0, __thunderid_javascript.extractPkceStorageKeyFromState)(sessionState);
2564
+ if (this._storage === BrowserStorage_default.BrowserMemory && config.enablePKCE && state) {
2565
+ const pkceKey = (0, __thunderid_javascript.extractPkceStorageKeyFromState)(state);
2755
2566
  const pkce = SPAUtils_default.getPKCE(pkceKey);
2756
2567
  await this.setPKCECode(pkce, pkceKey);
2757
2568
  }
2758
- await this.requestAccessToken(authorizationCode, sessionState ?? "", state ?? "", void 0, tokenRequestConfig);
2569
+ await this.requestAccessToken(authorizationCode, state ?? "", void 0, tokenRequestConfig);
2759
2570
  try {
2760
2571
  const signOutUrl = await this.getSignOutUrl();
2761
2572
  SPAUtils_default.setSignOutURL(signOutUrl, config.clientId, this._browserInstanceId);
2762
2573
  } catch {}
2763
2574
  await this._spaHelper.clearRefreshTokenTimeout();
2764
2575
  await this._spaHelper.refreshAccessTokenAutomatically(() => this.refreshAccessToken());
2765
- if (config.syncSession) this._checkSession();
2766
2576
  return this.getUser();
2767
2577
  }
2768
2578
  async signInSilently(additionalParams, tokenRequestConfig) {
2769
2579
  await this.isInitialized();
2770
2580
  if (SPAUtils_default.wasSignInCalled()) return;
2771
- const response = await this._authHelper.signInSilently((params) => this._constructSilentSignInUrl(params), (code$1, ss, s, trc) => this._exchangeCodeForTokens(code$1, ss, s, trc), this._sessionManagementHelper, additionalParams, tokenRequestConfig);
2581
+ const response = await this._authHelper.signInSilently((params) => this._constructSilentSignInUrl(params), (code$1, s, trc) => this._exchangeCodeForTokens(code$1, s, trc), additionalParams, tokenRequestConfig);
2772
2582
  if (this._onSignInCallback && response) this._onSignInCallback(response);
2773
2583
  return response;
2774
2584
  }
@@ -2867,7 +2677,6 @@ var ThunderIDBrowserClient = class ThunderIDBrowserClient extends __thunderid_ja
2867
2677
  await this._validateMethod();
2868
2678
  const timer = await this._spaHelper.getRefreshTimeoutTimer();
2869
2679
  await super.revokeAccessToken(userId);
2870
- this._sessionManagementHelper?.reset();
2871
2680
  await this._spaHelper.clearRefreshTokenTimeout(timer);
2872
2681
  this._onEndUserSession && await this._onEndUserSession(true);
2873
2682
  return true;
@@ -2881,17 +2690,7 @@ var ThunderIDBrowserClient = class ThunderIDBrowserClient extends __thunderid_ja
2881
2690
  }
2882
2691
  async reInitialize(config) {
2883
2692
  await this.isInitialized();
2884
- const existingConfig = await this.getStorageManager().getConfigData();
2885
- const isCheckSessionIframeDifferent = !(existingConfig?.endpoints?.checkSessionIframe && config?.endpoints?.checkSessionIframe && existingConfig.endpoints.checkSessionIframe === config.endpoints.checkSessionIframe);
2886
- const result = await super.reInitialize(config);
2887
- if ({
2888
- ...existingConfig,
2889
- ...config
2890
- }.syncSession && isCheckSessionIframeDifferent) {
2891
- this._sessionManagementHelper?.reset();
2892
- this._checkSession();
2893
- }
2894
- return result;
2693
+ return super.reInitialize(config);
2895
2694
  }
2896
2695
  async startAutoRefreshToken() {
2897
2696
  await this.isInitialized();
@@ -2954,18 +2753,6 @@ var ThunderIDBrowserClient = class ThunderIDBrowserClient extends __thunderid_ja
2954
2753
  default: throw new __thunderid_javascript.ThunderIDAuthException("SPA-AUTH_CLIENT-ON-IV01", "Invalid hook.", `Unknown hook: "${hook}"`);
2955
2754
  }
2956
2755
  }
2957
- async _checkSession() {
2958
- const oidcEndpoints = await this.getOpenIDProviderEndpoints();
2959
- const sm = this.getStorageManager();
2960
- const config = await sm.getConfigData();
2961
- this._authHelper.initializeSessionManger(config, oidcEndpoints, async () => (await sm.getSessionData())?.session_state ?? "", async (params) => this.getSignInUrl(params), this._sessionManagementHelper);
2962
- }
2963
- async _shouldStopAuthn() {
2964
- const sm = this.getStorageManager();
2965
- return this._sessionManagementHelper.receivePromptNoneResponse(async (sessionState) => {
2966
- await sm.setSessionDataParameter(__thunderid_javascript.OIDCRequestConstants.Params.SESSION_STATE, sessionState ?? "");
2967
- });
2968
- }
2969
2756
  _enableRetrievingSignOutURLFromSession(config) {
2970
2757
  if (config.preventSignOutURLUpdate) this._getSignOutURLFromSessionStorage = true;
2971
2758
  }
@@ -3014,10 +2801,10 @@ var Hooks_default = Hooks;
3014
2801
  //#endregion
3015
2802
  //#region src/utils/hasAuthParamsInUrl.ts
3016
2803
  /**
3017
- * Utility to check if `code` and `session_state` are available in the URL as search params.
2804
+ * Utility to check if `code` is available in the URL as a search param.
3018
2805
  *
3019
2806
  * @param params - The URL search params to check. Defaults to `window.location.search`.
3020
- * @return `true` if the URL contains `code` and `session_state` search params, otherwise `false`.
2807
+ * @return `true` if the URL contains a `code` search param, otherwise `false`.
3021
2808
  */
3022
2809
  const hasAuthParamsInUrl = (params = window.location.search) => {
3023
2810
  return /[?&]code=[^&]+/.test(params);
@@ -3062,6 +2849,56 @@ const http = (client) => {
3062
2849
  };
3063
2850
  var http_default = http;
3064
2851
 
2852
+ //#endregion
2853
+ //#region src/utils/createHttpClientFetcher.ts
2854
+ /**
2855
+ * Builds a `fetch`-shaped function backed by the shared `FetchHttpClient` singleton, for
2856
+ * framework wrappers (`@thunderid/react`, `@thunderid/vue`) that need to hand a core
2857
+ * `@thunderid/javascript` API function a `fetcher` carrying the access token automatically.
2858
+ *
2859
+ * Unlike a plain `fetch` call, `FetchHttpClient.request` throws on a non-2xx response instead
2860
+ * of resolving it. This adapter catches that and reconstructs a `Response`-shaped object from
2861
+ * the thrown error's `response`, so the core API function sees the real status and body instead
2862
+ * of treating every non-2xx result as a network failure. A genuine network error (no response
2863
+ * attached) still propagates.
2864
+ *
2865
+ * @param instanceId - Which `FetchHttpClient` instance to use, for multi-instance apps. Defaults to `0`.
2866
+ * @returns A function matching the `(url, config) => Promise<Response>` shape core API functions expect.
2867
+ * @example
2868
+ * ```typescript
2869
+ * await updateMeCredentials({
2870
+ * ...config,
2871
+ * fetcher: fetcher ?? createHttpClientFetcher(instanceId),
2872
+ * });
2873
+ * ```
2874
+ */
2875
+ const createHttpClientFetcher = (instanceId = 0) => {
2876
+ return async (url, config) => {
2877
+ const httpClient = FetchHttpClient_default.getInstance(instanceId);
2878
+ const toResponse = (data, status, statusText) => ({
2879
+ json: () => Promise.resolve(data),
2880
+ ok: status >= 200 && status < 300,
2881
+ status,
2882
+ statusText,
2883
+ text: () => Promise.resolve(typeof data === "string" ? data : JSON.stringify(data))
2884
+ });
2885
+ try {
2886
+ const response = await httpClient.request({
2887
+ data: config.body ? JSON.parse(config.body) : void 0,
2888
+ headers: config.headers,
2889
+ method: config.method || "POST",
2890
+ url
2891
+ });
2892
+ return toResponse(response.data, response.status, response.statusText || "");
2893
+ } catch (error) {
2894
+ const httpError = error;
2895
+ if (httpError?.response) return toResponse(httpError.response.data, httpError.response.status, httpError.response.statusText ?? "");
2896
+ throw error;
2897
+ }
2898
+ };
2899
+ };
2900
+ var createHttpClientFetcher_default = createHttpClientFetcher;
2901
+
3065
2902
  //#endregion
3066
2903
  //#region src/utils/handleWebAuthnAuthentication.ts
3067
2904
  const logger$1 = (0, __thunderid_javascript.createPackageComponentLogger)("@thunderid/browser", "WebAuthn");
@@ -3903,35 +3740,28 @@ exports.AVATAR_URI_SCHEME = AVATAR_URI_SCHEME;
3903
3740
  exports.AuthenticationHelper = AuthenticationHelper_default;
3904
3741
  exports.BrowserHooks = Hooks;
3905
3742
  exports.BrowserStorage = BrowserStorage_default;
3906
- exports.CHECK_SESSION_SIGNED_IN = CHECK_SESSION_SIGNED_IN;
3907
- exports.CHECK_SESSION_SIGNED_OUT = CHECK_SESSION_SIGNED_OUT;
3908
3743
  exports.CUSTOM_GRANT_CONFIG = CUSTOM_GRANT_CONFIG;
3909
3744
  exports.ERROR = ERROR;
3910
3745
  exports.ERROR_DESCRIPTION = ERROR_DESCRIPTION;
3911
3746
  exports.FetchHttpClient = FetchHttpClient_default;
3912
3747
  exports.Hooks = Hooks_default;
3913
- exports.INITIALIZED_SILENT_SIGN_IN = INITIALIZED_SILENT_SIGN_IN;
3914
3748
  exports.LocalStore = LocalStore_default;
3915
3749
  exports.MemoryStore = MemoryStore_default;
3916
- exports.OP_IFRAME = OP_IFRAME;
3917
- exports.PROMPT_NONE_IFRAME = PROMPT_NONE_IFRAME;
3918
- exports.PROMPT_NONE_REQUEST_SENT = PROMPT_NONE_REQUEST_SENT;
3919
3750
  exports.REFRESH_ACCESS_TOKEN_ERR0R = REFRESH_ACCESS_TOKEN_ERR0R;
3920
- exports.RP_IFRAME = RP_IFRAME;
3921
- exports.SET_SESSION_STATE_FROM_IFRAME = SET_SESSION_STATE_FROM_IFRAME;
3751
+ exports.SILENT_SIGN_IN_SIGNED_IN = SILENT_SIGN_IN_SIGNED_IN;
3752
+ exports.SILENT_SIGN_IN_SIGNED_OUT = SILENT_SIGN_IN_SIGNED_OUT;
3922
3753
  exports.SILENT_SIGN_IN_STATE = SILENT_SIGN_IN_STATE;
3923
3754
  exports.SPACryptoUtils = SPACryptoUtils_default;
3924
3755
  exports.SPAHelper = SPAHelper_default;
3925
3756
  exports.SPAUtils = SPAUtils_default;
3926
- exports.STATE = STATE;
3927
3757
  exports.STATE_QUERY = STATE_QUERY;
3928
3758
  exports.SessionStore = SessionStore_default;
3929
3759
  exports.TOKEN_REQUEST_CONFIG_KEY = TOKEN_REQUEST_CONFIG_KEY;
3930
3760
  exports.ThunderIDBrowserClient = ThunderIDBrowserClient_default;
3931
3761
  exports.buildAvatarSpec = buildAvatarSpec_default;
3932
3762
  exports.createClassObserver = createClassObserver;
3763
+ exports.createHttpClientFetcher = createHttpClientFetcher_default;
3933
3764
  exports.createMediaQueryListener = createMediaQueryListener;
3934
- exports.createSessionManagementHelper = SessionManagementHelper_default;
3935
3765
  exports.deriveAvatarContent = deriveAvatarContent;
3936
3766
  exports.detectThemeMode = detectThemeMode;
3937
3767
  exports.extractAvatarParamsFromUri = extractAvatarParamsFromUri_default;