@azure/msal-browser 3.19.1 → 3.21.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.
Files changed (211) hide show
  1. package/dist/app/IPublicClientApplication.d.ts +53 -53
  2. package/dist/app/IPublicClientApplication.mjs +105 -105
  3. package/dist/app/PublicClientApplication.d.ts +293 -293
  4. package/dist/app/PublicClientApplication.mjs +364 -364
  5. package/dist/app/PublicClientNext.d.ts +276 -276
  6. package/dist/app/PublicClientNext.mjs +354 -354
  7. package/dist/broker/nativeBroker/NativeMessageHandler.d.ts +62 -62
  8. package/dist/broker/nativeBroker/NativeMessageHandler.mjs +254 -254
  9. package/dist/broker/nativeBroker/NativeRequest.d.ts +45 -45
  10. package/dist/broker/nativeBroker/NativeResponse.d.ts +48 -48
  11. package/dist/broker/nativeBroker/NativeStatusCodes.d.ts +7 -7
  12. package/dist/broker/nativeBroker/NativeStatusCodes.mjs +11 -11
  13. package/dist/cache/AccountManager.d.ts +48 -48
  14. package/dist/cache/AccountManager.mjs +126 -126
  15. package/dist/cache/AsyncMemoryStorage.d.ts +50 -50
  16. package/dist/cache/AsyncMemoryStorage.mjs +131 -131
  17. package/dist/cache/BrowserCacheManager.d.ts +410 -385
  18. package/dist/cache/BrowserCacheManager.d.ts.map +1 -1
  19. package/dist/cache/BrowserCacheManager.mjs +1364 -1294
  20. package/dist/cache/BrowserCacheManager.mjs.map +1 -1
  21. package/dist/cache/BrowserStorage.d.ts +11 -11
  22. package/dist/cache/BrowserStorage.mjs +32 -32
  23. package/dist/cache/DatabaseStorage.d.ts +56 -56
  24. package/dist/cache/DatabaseStorage.mjs +200 -200
  25. package/dist/cache/IAsyncStorage.d.ts +27 -27
  26. package/dist/cache/ITokenCache.d.ts +11 -11
  27. package/dist/cache/IWindowStorage.d.ts +27 -27
  28. package/dist/cache/MemoryStorage.d.ts +11 -11
  29. package/dist/cache/MemoryStorage.mjs +31 -31
  30. package/dist/cache/TokenCache.d.ts +77 -77
  31. package/dist/cache/TokenCache.mjs +195 -195
  32. package/dist/config/Configuration.d.ts +213 -208
  33. package/dist/config/Configuration.d.ts.map +1 -1
  34. package/dist/config/Configuration.mjs +128 -128
  35. package/dist/config/Configuration.mjs.map +1 -1
  36. package/dist/controllers/ControllerFactory.d.ts +5 -5
  37. package/dist/controllers/ControllerFactory.mjs +25 -25
  38. package/dist/controllers/IController.d.ts +60 -60
  39. package/dist/controllers/NestedAppAuthController.d.ts +202 -202
  40. package/dist/controllers/NestedAppAuthController.mjs +473 -473
  41. package/dist/controllers/StandardController.d.ts +405 -405
  42. package/dist/controllers/StandardController.d.ts.map +1 -1
  43. package/dist/controllers/StandardController.mjs +1334 -1316
  44. package/dist/controllers/StandardController.mjs.map +1 -1
  45. package/dist/controllers/UnknownOperatingContextController.d.ts +86 -86
  46. package/dist/controllers/UnknownOperatingContextController.mjs +256 -256
  47. package/dist/crypto/BrowserCrypto.d.ts +52 -52
  48. package/dist/crypto/BrowserCrypto.mjs +151 -151
  49. package/dist/crypto/CryptoOps.d.ts +74 -74
  50. package/dist/crypto/CryptoOps.mjs +176 -176
  51. package/dist/crypto/PkceGenerator.d.ts +8 -8
  52. package/dist/crypto/PkceGenerator.mjs +54 -54
  53. package/dist/crypto/SignedHttpRequest.d.ts +30 -30
  54. package/dist/crypto/SignedHttpRequest.mjs +39 -39
  55. package/dist/encode/Base64Decode.d.ts +9 -9
  56. package/dist/encode/Base64Decode.mjs +36 -36
  57. package/dist/encode/Base64Encode.d.ts +19 -19
  58. package/dist/encode/Base64Encode.mjs +43 -43
  59. package/dist/error/BrowserAuthError.d.ts +256 -255
  60. package/dist/error/BrowserAuthError.d.ts.map +1 -1
  61. package/dist/error/BrowserAuthError.mjs +265 -264
  62. package/dist/error/BrowserAuthError.mjs.map +1 -1
  63. package/dist/error/BrowserAuthErrorCodes.d.ts +47 -46
  64. package/dist/error/BrowserAuthErrorCodes.d.ts.map +1 -1
  65. package/dist/error/BrowserAuthErrorCodes.mjs +53 -52
  66. package/dist/error/BrowserAuthErrorCodes.mjs.map +1 -1
  67. package/dist/error/BrowserConfigurationAuthError.d.ts +33 -33
  68. package/dist/error/BrowserConfigurationAuthError.mjs +40 -40
  69. package/dist/error/BrowserConfigurationAuthError.mjs.map +1 -1
  70. package/dist/error/BrowserConfigurationAuthErrorCodes.d.ts +3 -3
  71. package/dist/error/BrowserConfigurationAuthErrorCodes.mjs +7 -7
  72. package/dist/error/NativeAuthError.d.ts +29 -29
  73. package/dist/error/NativeAuthError.mjs +60 -60
  74. package/dist/error/NativeAuthErrorCodes.d.ts +2 -2
  75. package/dist/error/NativeAuthErrorCodes.mjs +6 -6
  76. package/dist/error/NestedAppAuthError.d.ts +14 -14
  77. package/dist/error/NestedAppAuthError.mjs +23 -23
  78. package/dist/event/EventHandler.d.ts +41 -41
  79. package/dist/event/EventHandler.mjs +125 -125
  80. package/dist/event/EventMessage.d.ts +25 -25
  81. package/dist/event/EventMessage.mjs +68 -68
  82. package/dist/event/EventType.d.ts +29 -29
  83. package/dist/event/EventType.mjs +32 -32
  84. package/dist/index.d.ts +40 -40
  85. package/dist/index.mjs +1 -1
  86. package/dist/interaction_client/BaseInteractionClient.d.ts +50 -50
  87. package/dist/interaction_client/BaseInteractionClient.mjs +106 -106
  88. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.d.ts +4 -4
  89. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.mjs +10 -10
  90. package/dist/interaction_client/NativeInteractionClient.d.ts +151 -143
  91. package/dist/interaction_client/NativeInteractionClient.d.ts.map +1 -1
  92. package/dist/interaction_client/NativeInteractionClient.mjs +624 -584
  93. package/dist/interaction_client/NativeInteractionClient.mjs.map +1 -1
  94. package/dist/interaction_client/PopupClient.d.ts +118 -105
  95. package/dist/interaction_client/PopupClient.d.ts.map +1 -1
  96. package/dist/interaction_client/PopupClient.mjs +460 -434
  97. package/dist/interaction_client/PopupClient.mjs.map +1 -1
  98. package/dist/interaction_client/RedirectClient.d.ts +50 -50
  99. package/dist/interaction_client/RedirectClient.d.ts.map +1 -1
  100. package/dist/interaction_client/RedirectClient.mjs +349 -317
  101. package/dist/interaction_client/RedirectClient.mjs.map +1 -1
  102. package/dist/interaction_client/SilentAuthCodeClient.d.ts +23 -23
  103. package/dist/interaction_client/SilentAuthCodeClient.mjs +57 -57
  104. package/dist/interaction_client/SilentCacheClient.d.ts +16 -16
  105. package/dist/interaction_client/SilentCacheClient.mjs +42 -42
  106. package/dist/interaction_client/SilentIframeClient.d.ts +32 -32
  107. package/dist/interaction_client/SilentIframeClient.d.ts.map +1 -1
  108. package/dist/interaction_client/SilentIframeClient.mjs +111 -101
  109. package/dist/interaction_client/SilentIframeClient.mjs.map +1 -1
  110. package/dist/interaction_client/SilentRefreshClient.d.ts +20 -20
  111. package/dist/interaction_client/SilentRefreshClient.mjs +47 -47
  112. package/dist/interaction_client/StandardInteractionClient.d.ts +48 -48
  113. package/dist/interaction_client/StandardInteractionClient.mjs +199 -199
  114. package/dist/interaction_handler/InteractionHandler.d.ts +33 -33
  115. package/dist/interaction_handler/InteractionHandler.mjs +93 -93
  116. package/dist/interaction_handler/RedirectHandler.d.ts +32 -32
  117. package/dist/interaction_handler/RedirectHandler.d.ts.map +1 -1
  118. package/dist/interaction_handler/RedirectHandler.mjs +135 -134
  119. package/dist/interaction_handler/RedirectHandler.mjs.map +1 -1
  120. package/dist/interaction_handler/SilentHandler.d.ts +13 -13
  121. package/dist/interaction_handler/SilentHandler.mjs +134 -134
  122. package/dist/naa/AccountInfo.d.ts +11 -11
  123. package/dist/naa/AuthBridge.d.ts +8 -8
  124. package/dist/naa/AuthResult.d.ts +6 -6
  125. package/dist/naa/BridgeAccountContext.d.ts +12 -12
  126. package/dist/naa/BridgeCapabilities.d.ts +3 -3
  127. package/dist/naa/BridgeError.d.ts +9 -9
  128. package/dist/naa/BridgeError.mjs +7 -7
  129. package/dist/naa/BridgeProxy.d.ts +67 -67
  130. package/dist/naa/BridgeProxy.d.ts.map +1 -1
  131. package/dist/naa/BridgeProxy.mjs +153 -148
  132. package/dist/naa/BridgeProxy.mjs.map +1 -1
  133. package/dist/naa/BridgeRequest.d.ts +7 -7
  134. package/dist/naa/BridgeRequestEnvelope.d.ts +12 -12
  135. package/dist/naa/BridgeResponseEnvelope.d.ts +13 -13
  136. package/dist/naa/BridgeStatusCode.d.ts +11 -11
  137. package/dist/naa/BridgeStatusCode.mjs +14 -14
  138. package/dist/naa/IBridgeProxy.d.ts +10 -10
  139. package/dist/naa/InitContext.d.ts +8 -8
  140. package/dist/naa/TokenRequest.d.ts +18 -18
  141. package/dist/naa/TokenResponse.d.ts +13 -13
  142. package/dist/naa/mapping/NestedAppAuthAdapter.d.ts +35 -35
  143. package/dist/naa/mapping/NestedAppAuthAdapter.mjs +179 -179
  144. package/dist/navigation/INavigationClient.d.ts +16 -16
  145. package/dist/navigation/NavigationClient.d.ts +22 -22
  146. package/dist/navigation/NavigationClient.mjs +40 -40
  147. package/dist/navigation/NavigationOptions.d.ts +12 -12
  148. package/dist/network/FetchClient.d.ts +26 -26
  149. package/dist/network/FetchClient.mjs +99 -99
  150. package/dist/operatingcontext/BaseOperatingContext.d.ts +41 -41
  151. package/dist/operatingcontext/BaseOperatingContext.mjs +94 -94
  152. package/dist/operatingcontext/NestedAppOperatingContext.d.ts +34 -34
  153. package/dist/operatingcontext/NestedAppOperatingContext.mjs +71 -71
  154. package/dist/operatingcontext/StandardOperatingContext.d.ts +25 -25
  155. package/dist/operatingcontext/StandardOperatingContext.mjs +43 -43
  156. package/dist/operatingcontext/UnknownOperatingContext.d.ts +25 -25
  157. package/dist/operatingcontext/UnknownOperatingContext.mjs +42 -42
  158. package/dist/packageMetadata.d.ts +2 -2
  159. package/dist/packageMetadata.mjs +4 -4
  160. package/dist/request/AuthorizationCodeRequest.d.ts +8 -8
  161. package/dist/request/AuthorizationUrlRequest.d.ts +8 -8
  162. package/dist/request/ClearCacheRequest.d.ts +10 -10
  163. package/dist/request/EndSessionPopupRequest.d.ts +18 -18
  164. package/dist/request/EndSessionRequest.d.ts +15 -15
  165. package/dist/request/InitializeApplicationRequest.d.ts +8 -8
  166. package/dist/request/PopupRequest.d.ts +34 -34
  167. package/dist/request/PopupWindowAttributes.d.ts +15 -15
  168. package/dist/request/RedirectRequest.d.ts +40 -35
  169. package/dist/request/RedirectRequest.d.ts.map +1 -1
  170. package/dist/request/RequestHelpers.d.ts +13 -13
  171. package/dist/request/RequestHelpers.mjs +53 -53
  172. package/dist/request/SilentRequest.d.ts +33 -33
  173. package/dist/request/SsoSilentRequest.d.ts +29 -29
  174. package/dist/response/AuthenticationResult.d.ts +4 -4
  175. package/dist/response/ResponseHandler.d.ts +7 -7
  176. package/dist/response/ResponseHandler.mjs +36 -36
  177. package/dist/telemetry/BrowserPerformanceClient.d.ts +38 -34
  178. package/dist/telemetry/BrowserPerformanceClient.d.ts.map +1 -1
  179. package/dist/telemetry/BrowserPerformanceClient.mjs +163 -163
  180. package/dist/telemetry/BrowserPerformanceClient.mjs.map +1 -1
  181. package/dist/telemetry/BrowserPerformanceMeasurement.d.ts +21 -21
  182. package/dist/telemetry/BrowserPerformanceMeasurement.mjs +92 -92
  183. package/dist/utils/BrowserConstants.d.ts +182 -180
  184. package/dist/utils/BrowserConstants.d.ts.map +1 -1
  185. package/dist/utils/BrowserConstants.mjs +214 -212
  186. package/dist/utils/BrowserConstants.mjs.map +1 -1
  187. package/dist/utils/BrowserProtocolUtils.d.ts +11 -11
  188. package/dist/utils/BrowserProtocolUtils.mjs +21 -21
  189. package/dist/utils/BrowserUtils.d.ts +75 -75
  190. package/dist/utils/BrowserUtils.mjs +157 -157
  191. package/lib/msal-browser.cjs +19028 -18759
  192. package/lib/msal-browser.cjs.map +1 -1
  193. package/lib/msal-browser.js +19028 -18759
  194. package/lib/msal-browser.js.map +1 -1
  195. package/lib/msal-browser.min.js +65 -65
  196. package/package.json +2 -2
  197. package/src/cache/BrowserCacheManager.ts +95 -0
  198. package/src/config/Configuration.ts +9 -1
  199. package/src/controllers/StandardController.ts +30 -12
  200. package/src/error/BrowserAuthError.ts +2 -0
  201. package/src/error/BrowserAuthErrorCodes.ts +1 -0
  202. package/src/interaction_client/NativeInteractionClient.ts +105 -54
  203. package/src/interaction_client/PopupClient.ts +202 -117
  204. package/src/interaction_client/RedirectClient.ts +62 -2
  205. package/src/interaction_client/SilentIframeClient.ts +41 -3
  206. package/src/interaction_handler/RedirectHandler.ts +1 -0
  207. package/src/naa/BridgeProxy.ts +7 -2
  208. package/src/packageMetadata.ts +1 -1
  209. package/src/request/RedirectRequest.ts +5 -0
  210. package/src/telemetry/BrowserPerformanceClient.ts +1 -1
  211. package/src/utils/BrowserConstants.ts +2 -0
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "type": "git",
11
11
  "url": "https://github.com/AzureAD/microsoft-authentication-library-for-js.git"
12
12
  },
13
- "version": "3.19.1",
13
+ "version": "3.21.0",
14
14
  "description": "Microsoft Authentication Library for js",
15
15
  "keywords": [
16
16
  "implicit",
@@ -104,6 +104,6 @@
104
104
  "typescript": "^4.9.5"
105
105
  },
106
106
  "dependencies": {
107
- "@azure/msal-common": "14.13.1"
107
+ "@azure/msal-common": "14.14.1"
108
108
  }
109
109
  }
@@ -1552,6 +1552,9 @@ export class BrowserCacheManager extends CacheManager {
1552
1552
  this.removeTemporaryItem(
1553
1553
  this.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST)
1554
1554
  );
1555
+ this.removeTemporaryItem(
1556
+ this.generateCacheKey(TemporaryCacheKeys.REDIRECT_REQUEST)
1557
+ );
1555
1558
  this.setInteractionInProgress(false);
1556
1559
  }
1557
1560
 
@@ -1613,6 +1616,98 @@ export class BrowserCacheManager extends CacheManager {
1613
1616
  this.setInteractionInProgress(false);
1614
1617
  }
1615
1618
 
1619
+ /**
1620
+ * Create request retry key to cache retry status
1621
+ */
1622
+ generateRequestRetriedKey(): string {
1623
+ return `${Constants.CACHE_PREFIX}.${TemporaryCacheKeys.REQUEST_RETRY}.${this.clientId}`;
1624
+ }
1625
+
1626
+ /**
1627
+ * Gets the request retry value from the cache
1628
+ */
1629
+ getRequestRetried(): number | null {
1630
+ const requestRetriedKey = this.generateRequestRetriedKey();
1631
+ const cachedRetryNumber = this.getTemporaryCache(requestRetriedKey);
1632
+ if (!cachedRetryNumber) {
1633
+ return null;
1634
+ }
1635
+ return parseInt(cachedRetryNumber);
1636
+ }
1637
+
1638
+ /**
1639
+ * Sets the request retry value to "retried" in the cache
1640
+ */
1641
+ setRequestRetried(): void {
1642
+ this.logger.trace("BrowserCacheManager.setRequestRetried called");
1643
+ const requestRetriedKey = this.generateRequestRetriedKey();
1644
+ this.setTemporaryCache(requestRetriedKey, "1", false);
1645
+ }
1646
+
1647
+ /**
1648
+ * Removes all request retry values in the cache
1649
+ */
1650
+ removeRequestRetried(): void {
1651
+ const requestRetriedKey = this.generateRequestRetriedKey();
1652
+ this.removeTemporaryItem(requestRetriedKey);
1653
+ }
1654
+
1655
+ /**
1656
+ * Caches the redirectRequest in the cache
1657
+ * @param redirectRequest
1658
+ */
1659
+ cacheRedirectRequest(redirectRequest: RedirectRequest): void {
1660
+ this.logger.trace("BrowserCacheManager.cacheRedirectRequest called");
1661
+ const { ...restParams } = redirectRequest;
1662
+ delete restParams.onRedirectNavigate;
1663
+ const encodedValue = JSON.stringify(restParams);
1664
+
1665
+ this.setTemporaryCache(
1666
+ TemporaryCacheKeys.REDIRECT_REQUEST,
1667
+ encodedValue,
1668
+ true
1669
+ );
1670
+ }
1671
+
1672
+ /**
1673
+ * Gets redirect request from the cache. Logs an error and returns undefined if nothing is found.
1674
+ */
1675
+ getCachedRedirectRequest(): RedirectRequest | undefined {
1676
+ this.logger.trace(
1677
+ "BrowserCacheManager.getCachedRedirectRequest called"
1678
+ );
1679
+ const cachedRedirectRequest = this.getTemporaryCache(
1680
+ TemporaryCacheKeys.REDIRECT_REQUEST,
1681
+ true
1682
+ );
1683
+ if (!cachedRedirectRequest) {
1684
+ this.logger.error(`No cached redirect request found.`);
1685
+ } else {
1686
+ this.removeTemporaryItem(
1687
+ this.generateCacheKey(TemporaryCacheKeys.REDIRECT_REQUEST)
1688
+ );
1689
+ let parsedRequest: RedirectRequest;
1690
+ try {
1691
+ parsedRequest = JSON.parse(
1692
+ cachedRedirectRequest
1693
+ ) as RedirectRequest;
1694
+ } catch (e) {
1695
+ this.logger.errorPii(
1696
+ `Attempted to parse: ${cachedRedirectRequest}`
1697
+ );
1698
+ this.logger.error(
1699
+ `Parsing cached redirect request threw with error: ${e}`
1700
+ );
1701
+ return;
1702
+ }
1703
+
1704
+ if (parsedRequest) {
1705
+ return parsedRequest;
1706
+ }
1707
+ }
1708
+ return;
1709
+ }
1710
+
1616
1711
  cacheCodeRequest(authCodeRequest: CommonAuthorizationCodeRequest): void {
1617
1712
  this.logger.trace("BrowserCacheManager.cacheCodeRequest called");
1618
1713
 
@@ -99,11 +99,19 @@ export type BrowserAuthOptions = {
99
99
  * @deprecated This flag is deprecated and will be removed in the next major version. createNestablePublicClientApplication should be used instead.
100
100
  */
101
101
  supportsNestedAppAuth?: boolean;
102
+ /**
103
+ * Callback that will be passed the url that MSAL will navigate to in redirect flows. Returning false in the callback will stop navigation.
104
+ */
105
+ onRedirectNavigate?: (url: string) => boolean | void;
102
106
  };
103
107
 
104
108
  /** @internal */
105
- export type InternalAuthOptions = Required<BrowserAuthOptions> & {
109
+ export type InternalAuthOptions = Omit<
110
+ Required<BrowserAuthOptions>,
111
+ "onRedirectNavigate"
112
+ > & {
106
113
  OIDCOptions: Required<OIDCOptions>;
114
+ onRedirectNavigate?: (url: string) => boolean | void;
107
115
  };
108
116
 
109
117
  /**
@@ -584,19 +584,37 @@ export class StandardController implements IController {
584
584
  scenarioId: request.scenarioId,
585
585
  });
586
586
 
587
+ // Override on request only if set, as onRedirectNavigate field is deprecated
587
588
  const onRedirectNavigateCb = request.onRedirectNavigate;
588
- request.onRedirectNavigate = (url: string) => {
589
- const navigate =
590
- typeof onRedirectNavigateCb === "function"
591
- ? onRedirectNavigateCb(url)
592
- : undefined;
593
- if (navigate !== false) {
594
- atrMeasurement.end({ success: true });
595
- } else {
596
- atrMeasurement.discard();
597
- }
598
- return navigate;
599
- };
589
+ if (onRedirectNavigateCb) {
590
+ request.onRedirectNavigate = (url: string) => {
591
+ const navigate =
592
+ typeof onRedirectNavigateCb === "function"
593
+ ? onRedirectNavigateCb(url)
594
+ : undefined;
595
+ if (navigate !== false) {
596
+ atrMeasurement.end({ success: true });
597
+ } else {
598
+ atrMeasurement.discard();
599
+ }
600
+ return navigate;
601
+ };
602
+ } else {
603
+ const configOnRedirectNavigateCb =
604
+ this.config.auth.onRedirectNavigate;
605
+ this.config.auth.onRedirectNavigate = (url: string) => {
606
+ const navigate =
607
+ typeof configOnRedirectNavigateCb === "function"
608
+ ? configOnRedirectNavigateCb(url)
609
+ : undefined;
610
+ if (navigate !== false) {
611
+ atrMeasurement.end({ success: true });
612
+ } else {
613
+ atrMeasurement.discard();
614
+ }
615
+ return navigate;
616
+ };
617
+ }
600
618
 
601
619
  // If logged in, emit acquire token events
602
620
  const isLoggedIn = this.getAllAccounts().length > 0;
@@ -92,6 +92,8 @@ export const BrowserAuthErrorMessages = {
92
92
  "Invalid base64 encoded string.",
93
93
  [BrowserAuthErrorCodes.invalidPopTokenRequest]:
94
94
  "Invalid PoP token request. The request should not have both a popKid value and signPopToken set to true.",
95
+ [BrowserAuthErrorCodes.failedToRetry]:
96
+ "Unable to retry failed auth code redemption due to usage of the onRedirectNavigate request parameter. Please set onRedirectNavigate on the PublicClientApplication configuration instead or call loginRedirect again.",
95
97
  };
96
98
 
97
99
  /**
@@ -56,3 +56,4 @@ export const uninitializedPublicClientApplication =
56
56
  export const nativePromptNotSupported = "native_prompt_not_supported";
57
57
  export const invalidBase64String = "invalid_base64_string";
58
58
  export const invalidPopTokenRequest = "invalid_pop_token_request";
59
+ export const failedToRetry = "failed_to_retry";
@@ -36,6 +36,7 @@ import {
36
36
  CacheHelpers,
37
37
  buildAccountToCache,
38
38
  InProgressPerformanceEvent,
39
+ ServerTelemetryManager,
39
40
  } from "@azure/msal-common";
40
41
  import { BaseInteractionClient } from "./BaseInteractionClient";
41
42
  import { BrowserConfiguration } from "../config/Configuration";
@@ -50,6 +51,7 @@ import {
50
51
  ApiId,
51
52
  TemporaryCacheKeys,
52
53
  NativeConstants,
54
+ BrowserConstants,
53
55
  } from "../utils/BrowserConstants";
54
56
  import {
55
57
  NativeExtensionRequestBody,
@@ -72,6 +74,7 @@ import {
72
74
  import { SilentCacheClient } from "./SilentCacheClient";
73
75
  import { AuthenticationResult } from "../response/AuthenticationResult";
74
76
  import { base64Decode } from "../encode/Base64Decode";
77
+ import { version } from "../packageMetadata";
75
78
 
76
79
  const BrokerServerParamKeys = {
77
80
  BROKER_CLIENT_ID: "brk_client_id",
@@ -84,6 +87,8 @@ export class NativeInteractionClient extends BaseInteractionClient {
84
87
  protected nativeMessageHandler: NativeMessageHandler;
85
88
  protected silentCacheClient: SilentCacheClient;
86
89
  protected nativeStorageManager: BrowserCacheManager;
90
+ protected skus: string;
91
+ protected serverTelemetryManager: ServerTelemetryManager;
87
92
 
88
93
  constructor(
89
94
  config: BrowserConfiguration,
@@ -125,6 +130,35 @@ export class NativeInteractionClient extends BaseInteractionClient {
125
130
  provider,
126
131
  correlationId
127
132
  );
133
+ this.serverTelemetryManager = this.initializeServerTelemetryManager(
134
+ this.apiId
135
+ );
136
+
137
+ const extensionName =
138
+ this.nativeMessageHandler.getExtensionId() ===
139
+ NativeConstants.PREFERRED_EXTENSION_ID
140
+ ? "chrome"
141
+ : this.nativeMessageHandler.getExtensionId()?.length
142
+ ? "unknown"
143
+ : undefined;
144
+ this.skus = ServerTelemetryManager.makeExtraSkuString({
145
+ libraryName: BrowserConstants.MSAL_SKU,
146
+ libraryVersion: version,
147
+ extensionName: extensionName,
148
+ extensionVersion: this.nativeMessageHandler.getExtensionVersion(),
149
+ });
150
+ }
151
+
152
+ /**
153
+ * Adds SKUs to request extra query parameters
154
+ * @param request {NativeTokenRequest}
155
+ * @private
156
+ */
157
+ private addRequestSKUs(request: NativeTokenRequest) {
158
+ request.extraParameters = {
159
+ ...request.extraParameters,
160
+ [AADServerParamKeys.X_CLIENT_EXTRA_SKU]: this.skus,
161
+ };
128
162
  }
129
163
 
130
164
  /**
@@ -147,64 +181,73 @@ export class NativeInteractionClient extends BaseInteractionClient {
147
181
  );
148
182
  const reqTimestamp = TimeUtils.nowSeconds();
149
183
 
150
- // initialize native request
151
- const nativeRequest = await this.initializeNativeRequest(request);
152
-
153
- // check if the tokens can be retrieved from internal cache
154
184
  try {
155
- const result = await this.acquireTokensFromCache(
156
- this.accountId,
157
- nativeRequest
158
- );
159
- nativeATMeasurement.end({
160
- success: true,
161
- isNativeBroker: false, // Should be true only when the result is coming directly from the broker
162
- fromCache: true,
163
- });
164
- return result;
165
- } catch (e) {
166
- // continue with a native call for any and all errors
167
- this.logger.info(
168
- "MSAL internal Cache does not contain tokens, proceed to make a native call"
169
- );
170
- }
171
-
172
- const { ...nativeTokenRequest } = nativeRequest;
173
-
174
- // fall back to native calls
175
- const messageBody: NativeExtensionRequestBody = {
176
- method: NativeExtensionMethod.GetToken,
177
- request: nativeTokenRequest,
178
- };
179
-
180
- const response: object = await this.nativeMessageHandler.sendMessage(
181
- messageBody
182
- );
183
- const validatedResponse: NativeResponse =
184
- this.validateNativeResponse(response);
185
+ // initialize native request
186
+ const nativeRequest = await this.initializeNativeRequest(request);
185
187
 
186
- return this.handleNativeResponse(
187
- validatedResponse,
188
- nativeRequest,
189
- reqTimestamp
190
- )
191
- .then((result: AuthenticationResult) => {
188
+ // check if the tokens can be retrieved from internal cache
189
+ try {
190
+ const result = await this.acquireTokensFromCache(
191
+ this.accountId,
192
+ nativeRequest
193
+ );
192
194
  nativeATMeasurement.end({
193
195
  success: true,
194
- isNativeBroker: true,
195
- requestId: result.requestId,
196
+ isNativeBroker: false, // Should be true only when the result is coming directly from the broker
197
+ fromCache: true,
196
198
  });
197
199
  return result;
198
- })
199
- .catch((error: AuthError) => {
200
- nativeATMeasurement.end({
201
- success: false,
202
- errorCode: error.errorCode,
203
- subErrorCode: error.subError,
204
- isNativeBroker: true,
200
+ } catch (e) {
201
+ // continue with a native call for any and all errors
202
+ this.logger.info(
203
+ "MSAL internal Cache does not contain tokens, proceed to make a native call"
204
+ );
205
+ }
206
+
207
+ const { ...nativeTokenRequest } = nativeRequest;
208
+
209
+ // fall back to native calls
210
+ const messageBody: NativeExtensionRequestBody = {
211
+ method: NativeExtensionMethod.GetToken,
212
+ request: nativeTokenRequest,
213
+ };
214
+
215
+ const response: object =
216
+ await this.nativeMessageHandler.sendMessage(messageBody);
217
+ const validatedResponse: NativeResponse =
218
+ this.validateNativeResponse(response);
219
+
220
+ return await this.handleNativeResponse(
221
+ validatedResponse,
222
+ nativeRequest,
223
+ reqTimestamp
224
+ )
225
+ .then((result: AuthenticationResult) => {
226
+ nativeATMeasurement.end({
227
+ success: true,
228
+ isNativeBroker: true,
229
+ requestId: result.requestId,
230
+ });
231
+ this.serverTelemetryManager.clearNativeBrokerErrorCode();
232
+ return result;
233
+ })
234
+ .catch((error: AuthError) => {
235
+ nativeATMeasurement.end({
236
+ success: false,
237
+ errorCode: error.errorCode,
238
+ subErrorCode: error.subError,
239
+ isNativeBroker: true,
240
+ });
241
+ throw error;
205
242
  });
206
- throw error;
207
- });
243
+ } catch (e) {
244
+ if (e instanceof NativeAuthError) {
245
+ this.serverTelemetryManager.setNativeBrokerErrorCode(
246
+ e.errorCode
247
+ );
248
+ }
249
+ throw e;
250
+ }
208
251
  }
209
252
 
210
253
  /**
@@ -307,8 +350,13 @@ export class NativeInteractionClient extends BaseInteractionClient {
307
350
  this.validateNativeResponse(response);
308
351
  } catch (e) {
309
352
  // Only throw fatal errors here to allow application to fallback to regular redirect. Otherwise proceed and the error will be thrown in handleRedirectPromise
310
- if (e instanceof NativeAuthError && isFatalNativeAuthError(e)) {
311
- throw e;
353
+ if (e instanceof NativeAuthError) {
354
+ this.serverTelemetryManager.setNativeBrokerErrorCode(
355
+ e.errorCode
356
+ );
357
+ if (isFatalNativeAuthError(e)) {
358
+ throw e;
359
+ }
312
360
  }
313
361
  }
314
362
  this.browserStorage.setTemporaryCache(
@@ -399,7 +447,9 @@ export class NativeInteractionClient extends BaseInteractionClient {
399
447
  reqTimestamp
400
448
  );
401
449
  this.browserStorage.setInteractionInProgress(false);
402
- return await result;
450
+ const res = await result;
451
+ this.serverTelemetryManager.clearNativeBrokerErrorCode();
452
+ return res;
403
453
  } catch (e) {
404
454
  this.browserStorage.setInteractionInProgress(false);
405
455
  throw e;
@@ -980,6 +1030,7 @@ export class NativeInteractionClient extends BaseInteractionClient {
980
1030
  // SPAs require whole string to be passed to broker
981
1031
  validatedRequest.reqCnf = reqCnfData;
982
1032
  }
1033
+ this.addRequestSKUs(validatedRequest);
983
1034
 
984
1035
  return validatedRequest;
985
1036
  }