@azure/msal-browser 3.4.0 → 3.5.1-beta.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 (231) hide show
  1. package/dist/app/IPublicClientApplication.d.ts +51 -51
  2. package/dist/app/IPublicClientApplication.mjs +102 -102
  3. package/dist/app/PublicClientApplication.d.ts +268 -268
  4. package/dist/app/PublicClientApplication.mjs +333 -333
  5. package/dist/app/PublicClientNext.d.ts +273 -273
  6. package/dist/app/PublicClientNext.mjs +351 -351
  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 +44 -44
  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/AsyncMemoryStorage.d.ts +51 -51
  14. package/dist/cache/AsyncMemoryStorage.mjs +132 -132
  15. package/dist/cache/BrowserCacheManager.d.ts +383 -383
  16. package/dist/cache/BrowserCacheManager.d.ts.map +1 -1
  17. package/dist/cache/BrowserCacheManager.mjs +1264 -1264
  18. package/dist/cache/BrowserCacheManager.mjs.map +1 -1
  19. package/dist/cache/BrowserStorage.d.ts +11 -11
  20. package/dist/cache/BrowserStorage.mjs +32 -32
  21. package/dist/cache/CryptoKeyStore.d.ts +18 -18
  22. package/dist/cache/CryptoKeyStore.mjs +40 -40
  23. package/dist/cache/DatabaseStorage.d.ts +56 -56
  24. package/dist/cache/DatabaseStorage.mjs +190 -190
  25. package/dist/cache/IAsyncMemoryStorage.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 +224 -224
  32. package/dist/config/Configuration.d.ts +206 -206
  33. package/dist/config/Configuration.mjs +128 -128
  34. package/dist/controllers/ControllerFactory.d.ts +4 -4
  35. package/dist/controllers/ControllerFactory.mjs +29 -29
  36. package/dist/controllers/IController.d.ts +61 -61
  37. package/dist/controllers/NestedAppAuthController.d.ts +95 -95
  38. package/dist/controllers/NestedAppAuthController.d.ts.map +1 -1
  39. package/dist/controllers/NestedAppAuthController.mjs +335 -333
  40. package/dist/controllers/NestedAppAuthController.mjs.map +1 -1
  41. package/dist/controllers/StandardController.d.ts +407 -407
  42. package/dist/controllers/StandardController.d.ts.map +1 -1
  43. package/dist/controllers/StandardController.mjs +1294 -1291
  44. package/dist/controllers/StandardController.mjs.map +1 -1
  45. package/dist/controllers/UnknownOperatingContextController.d.ts +87 -87
  46. package/dist/controllers/UnknownOperatingContextController.mjs +264 -264
  47. package/dist/crypto/BrowserCrypto.d.ts +44 -44
  48. package/dist/crypto/BrowserCrypto.mjs +93 -93
  49. package/dist/crypto/CryptoOps.d.ts +63 -63
  50. package/dist/crypto/CryptoOps.d.ts.map +1 -1
  51. package/dist/crypto/CryptoOps.mjs +145 -144
  52. package/dist/crypto/CryptoOps.mjs.map +1 -1
  53. package/dist/crypto/PkceGenerator.d.ts +8 -8
  54. package/dist/crypto/PkceGenerator.mjs +54 -54
  55. package/dist/crypto/SignedHttpRequest.d.ts +30 -30
  56. package/dist/crypto/SignedHttpRequest.mjs +39 -39
  57. package/dist/encode/Base64Decode.d.ts +9 -9
  58. package/dist/encode/Base64Decode.mjs +36 -36
  59. package/dist/encode/Base64Encode.d.ts +19 -19
  60. package/dist/encode/Base64Encode.mjs +43 -43
  61. package/dist/error/BrowserAuthError.d.ts +250 -250
  62. package/dist/error/BrowserAuthError.mjs +258 -258
  63. package/dist/error/BrowserAuthErrorCodes.d.ts +45 -45
  64. package/dist/error/BrowserAuthErrorCodes.mjs +49 -49
  65. package/dist/error/BrowserConfigurationAuthError.d.ts +33 -33
  66. package/dist/error/BrowserConfigurationAuthError.mjs +40 -40
  67. package/dist/error/BrowserConfigurationAuthErrorCodes.d.ts +3 -3
  68. package/dist/error/BrowserConfigurationAuthErrorCodes.mjs +7 -7
  69. package/dist/error/NativeAuthError.d.ts +29 -29
  70. package/dist/error/NativeAuthError.mjs +60 -60
  71. package/dist/error/NativeAuthErrorCodes.d.ts +2 -2
  72. package/dist/error/NativeAuthErrorCodes.mjs +6 -6
  73. package/dist/error/NestedAppAuthError.d.ts +14 -14
  74. package/dist/error/NestedAppAuthError.mjs +23 -23
  75. package/dist/event/EventHandler.d.ts +41 -41
  76. package/dist/event/EventHandler.mjs +119 -119
  77. package/dist/event/EventMessage.d.ts +25 -25
  78. package/dist/event/EventMessage.mjs +68 -68
  79. package/dist/event/EventType.d.ts +28 -28
  80. package/dist/event/EventType.mjs +31 -31
  81. package/dist/index.d.ts +39 -39
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.mjs +2 -2
  84. package/dist/interaction_client/BaseInteractionClient.d.ts +54 -55
  85. package/dist/interaction_client/BaseInteractionClient.d.ts.map +1 -1
  86. package/dist/interaction_client/BaseInteractionClient.mjs +152 -153
  87. package/dist/interaction_client/BaseInteractionClient.mjs.map +1 -1
  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 +140 -140
  91. package/dist/interaction_client/NativeInteractionClient.mjs +548 -548
  92. package/dist/interaction_client/PopupClient.d.ts +105 -115
  93. package/dist/interaction_client/PopupClient.d.ts.map +1 -1
  94. package/dist/interaction_client/PopupClient.mjs +435 -505
  95. package/dist/interaction_client/PopupClient.mjs.map +1 -1
  96. package/dist/interaction_client/RedirectClient.d.ts +49 -49
  97. package/dist/interaction_client/RedirectClient.d.ts.map +1 -1
  98. package/dist/interaction_client/RedirectClient.mjs +314 -297
  99. package/dist/interaction_client/RedirectClient.mjs.map +1 -1
  100. package/dist/interaction_client/SilentAuthCodeClient.d.ts +23 -23
  101. package/dist/interaction_client/SilentAuthCodeClient.mjs +57 -57
  102. package/dist/interaction_client/SilentCacheClient.d.ts +24 -24
  103. package/dist/interaction_client/SilentCacheClient.mjs +61 -61
  104. package/dist/interaction_client/SilentIframeClient.d.ts +32 -32
  105. package/dist/interaction_client/SilentIframeClient.d.ts.map +1 -1
  106. package/dist/interaction_client/SilentIframeClient.mjs +99 -108
  107. package/dist/interaction_client/SilentIframeClient.mjs.map +1 -1
  108. package/dist/interaction_client/SilentRefreshClient.d.ts +20 -20
  109. package/dist/interaction_client/SilentRefreshClient.mjs +43 -43
  110. package/dist/interaction_client/StandardInteractionClient.d.ts +54 -59
  111. package/dist/interaction_client/StandardInteractionClient.d.ts.map +1 -1
  112. package/dist/interaction_client/StandardInteractionClient.mjs +222 -244
  113. package/dist/interaction_client/StandardInteractionClient.mjs.map +1 -1
  114. package/dist/interaction_handler/InteractionHandler.d.ts +33 -33
  115. package/dist/interaction_handler/InteractionHandler.d.ts.map +1 -1
  116. package/dist/interaction_handler/InteractionHandler.mjs +94 -98
  117. package/dist/interaction_handler/InteractionHandler.mjs.map +1 -1
  118. package/dist/interaction_handler/RedirectHandler.d.ts +32 -32
  119. package/dist/interaction_handler/RedirectHandler.d.ts.map +1 -1
  120. package/dist/interaction_handler/RedirectHandler.mjs +135 -139
  121. package/dist/interaction_handler/RedirectHandler.mjs.map +1 -1
  122. package/dist/interaction_handler/SilentHandler.d.ts +13 -13
  123. package/dist/interaction_handler/SilentHandler.d.ts.map +1 -1
  124. package/dist/interaction_handler/SilentHandler.mjs +134 -128
  125. package/dist/interaction_handler/SilentHandler.mjs.map +1 -1
  126. package/dist/naa/AccountInfo.d.ts +11 -12
  127. package/dist/naa/AccountInfo.d.ts.map +1 -1
  128. package/dist/naa/AccountRequests.d.ts +9 -9
  129. package/dist/naa/AuthBridge.d.ts +5 -5
  130. package/dist/naa/BridgeCapabilities.d.ts +3 -3
  131. package/dist/naa/BridgeError.d.ts +9 -9
  132. package/dist/naa/BridgeError.d.ts.map +1 -1
  133. package/dist/naa/BridgeError.mjs +7 -7
  134. package/dist/naa/BridgeError.mjs.map +1 -1
  135. package/dist/naa/BridgeProxy.d.ts +72 -71
  136. package/dist/naa/BridgeProxy.d.ts.map +1 -1
  137. package/dist/naa/BridgeProxy.mjs +152 -149
  138. package/dist/naa/BridgeProxy.mjs.map +1 -1
  139. package/dist/naa/BridgeRequest.d.ts +6 -6
  140. package/dist/naa/BridgeRequestEnvelope.d.ts +13 -13
  141. package/dist/naa/BridgeResponseEnvelope.d.ts +10 -10
  142. package/dist/naa/BridgeStatusCode.d.ts +10 -10
  143. package/dist/naa/BridgeStatusCode.mjs +15 -15
  144. package/dist/naa/IBridgeProxy.d.ts +12 -10
  145. package/dist/naa/IBridgeProxy.d.ts.map +1 -1
  146. package/dist/naa/InitializeBridgeResponse.d.ts +6 -6
  147. package/dist/naa/InitializeBridgeResponse.d.ts.map +1 -1
  148. package/dist/naa/TokenRequest.d.ts +19 -21
  149. package/dist/naa/TokenRequest.d.ts.map +1 -1
  150. package/dist/naa/TokenResponse.d.ts +15 -16
  151. package/dist/naa/TokenResponse.d.ts.map +1 -1
  152. package/dist/naa/mapping/NestedAppAuthAdapter.d.ts +23 -25
  153. package/dist/naa/mapping/NestedAppAuthAdapter.d.ts.map +1 -1
  154. package/dist/naa/mapping/NestedAppAuthAdapter.mjs +142 -170
  155. package/dist/naa/mapping/NestedAppAuthAdapter.mjs.map +1 -1
  156. package/dist/navigation/INavigationClient.d.ts +16 -16
  157. package/dist/navigation/NavigationClient.d.ts +22 -22
  158. package/dist/navigation/NavigationClient.mjs +40 -40
  159. package/dist/navigation/NavigationOptions.d.ts +12 -12
  160. package/dist/network/FetchClient.d.ts +26 -26
  161. package/dist/network/FetchClient.mjs +99 -99
  162. package/dist/operatingcontext/BaseOperatingContext.d.ts +40 -40
  163. package/dist/operatingcontext/BaseOperatingContext.mjs +44 -44
  164. package/dist/operatingcontext/StandardOperatingContext.d.ts +25 -25
  165. package/dist/operatingcontext/StandardOperatingContext.mjs +43 -43
  166. package/dist/operatingcontext/TeamsAppOperatingContext.d.ts +32 -32
  167. package/dist/operatingcontext/TeamsAppOperatingContext.d.ts.map +1 -1
  168. package/dist/operatingcontext/TeamsAppOperatingContext.mjs +85 -82
  169. package/dist/operatingcontext/TeamsAppOperatingContext.mjs.map +1 -1
  170. package/dist/operatingcontext/UnknownOperatingContext.d.ts +25 -25
  171. package/dist/operatingcontext/UnknownOperatingContext.mjs +42 -42
  172. package/dist/packageMetadata.d.ts +2 -2
  173. package/dist/packageMetadata.mjs +4 -4
  174. package/dist/request/AuthorizationCodeRequest.d.ts +8 -8
  175. package/dist/request/AuthorizationUrlRequest.d.ts +8 -8
  176. package/dist/request/ClearCacheRequest.d.ts +10 -10
  177. package/dist/request/EndSessionPopupRequest.d.ts +18 -18
  178. package/dist/request/EndSessionRequest.d.ts +15 -15
  179. package/dist/request/PopupRequest.d.ts +34 -34
  180. package/dist/request/PopupWindowAttributes.d.ts +15 -15
  181. package/dist/request/RedirectRequest.d.ts +35 -35
  182. package/dist/request/SilentRequest.d.ts +32 -32
  183. package/dist/request/SsoSilentRequest.d.ts +29 -29
  184. package/dist/response/AuthenticationResult.d.ts +4 -4
  185. package/dist/response/ResponseHandler.d.ts +8 -0
  186. package/dist/response/ResponseHandler.d.ts.map +1 -0
  187. package/dist/response/ResponseHandler.mjs +46 -0
  188. package/dist/response/ResponseHandler.mjs.map +1 -0
  189. package/dist/telemetry/BrowserPerformanceClient.d.ts +36 -36
  190. package/dist/telemetry/BrowserPerformanceClient.mjs +125 -125
  191. package/dist/telemetry/BrowserPerformanceMeasurement.d.ts +21 -21
  192. package/dist/telemetry/BrowserPerformanceMeasurement.mjs +92 -92
  193. package/dist/utils/BrowserConstants.d.ts +176 -176
  194. package/dist/utils/BrowserConstants.mjs +204 -204
  195. package/dist/utils/BrowserProtocolUtils.d.ts +11 -18
  196. package/dist/utils/BrowserProtocolUtils.d.ts.map +1 -1
  197. package/dist/utils/BrowserProtocolUtils.mjs +23 -36
  198. package/dist/utils/BrowserProtocolUtils.mjs.map +1 -1
  199. package/dist/utils/BrowserUtils.d.ts +56 -56
  200. package/dist/utils/BrowserUtils.mjs +125 -125
  201. package/lib/msal-browser.cjs +17926 -18062
  202. package/lib/msal-browser.cjs.map +1 -1
  203. package/lib/msal-browser.js +17926 -18062
  204. package/lib/msal-browser.js.map +1 -1
  205. package/lib/msal-browser.min.js +66 -65
  206. package/package.json +102 -102
  207. package/src/cache/BrowserCacheManager.ts +7 -10
  208. package/src/controllers/NestedAppAuthController.ts +8 -3
  209. package/src/controllers/StandardController.ts +31 -40
  210. package/src/crypto/CryptoOps.ts +5 -3
  211. package/src/index.ts +1 -0
  212. package/src/interaction_client/BaseInteractionClient.ts +1 -2
  213. package/src/interaction_client/PopupClient.ts +34 -137
  214. package/src/interaction_client/RedirectClient.ts +71 -55
  215. package/src/interaction_client/SilentIframeClient.ts +16 -27
  216. package/src/interaction_client/StandardInteractionClient.ts +2 -48
  217. package/src/interaction_handler/InteractionHandler.ts +5 -8
  218. package/src/interaction_handler/RedirectHandler.ts +4 -8
  219. package/src/interaction_handler/SilentHandler.ts +12 -5
  220. package/src/naa/AccountInfo.ts +3 -4
  221. package/src/naa/BridgeError.ts +4 -4
  222. package/src/naa/BridgeProxy.ts +6 -2
  223. package/src/naa/IBridgeProxy.ts +2 -0
  224. package/src/naa/InitializeBridgeResponse.ts +1 -1
  225. package/src/naa/TokenRequest.ts +0 -2
  226. package/src/naa/TokenResponse.ts +1 -2
  227. package/src/naa/mapping/NestedAppAuthAdapter.ts +72 -80
  228. package/src/operatingcontext/TeamsAppOperatingContext.ts +4 -1
  229. package/src/packageMetadata.ts +1 -1
  230. package/src/response/ResponseHandler.ts +73 -0
  231. package/src/utils/BrowserProtocolUtils.ts +17 -36
@@ -1,63 +1,63 @@
1
- import { Logger, AuthenticationScheme, IPerformanceClient } from "@azure/msal-common";
2
- import { NativeExtensionRequestBody } from "./NativeRequest";
3
- import { BrowserConfiguration } from "../../config/Configuration";
4
- export declare class NativeMessageHandler {
5
- private extensionId;
6
- private extensionVersion;
7
- private logger;
8
- private readonly handshakeTimeoutMs;
9
- private timeoutId;
10
- private resolvers;
11
- private handshakeResolvers;
12
- private messageChannel;
13
- private readonly windowListener;
14
- private readonly performanceClient;
15
- private readonly handshakeEvent;
16
- constructor(logger: Logger, handshakeTimeoutMs: number, performanceClient: IPerformanceClient, extensionId?: string);
17
- /**
18
- * Sends a given message to the extension and resolves with the extension response
19
- * @param body
20
- */
21
- sendMessage(body: NativeExtensionRequestBody): Promise<object>;
22
- /**
23
- * Returns an instance of the MessageHandler that has successfully established a connection with an extension
24
- * @param {Logger} logger
25
- * @param {number} handshakeTimeoutMs
26
- * @param {IPerformanceClient} performanceClient
27
- * @param {ICrypto} crypto
28
- */
29
- static createProvider(logger: Logger, handshakeTimeoutMs: number, performanceClient: IPerformanceClient): Promise<NativeMessageHandler>;
30
- /**
31
- * Send handshake request helper.
32
- */
33
- private sendHandshakeRequest;
34
- /**
35
- * Invoked when a message is posted to the window. If a handshake request is received it means the extension is not installed.
36
- * @param event
37
- */
38
- private onWindowMessage;
39
- /**
40
- * Invoked when a message is received from the extension on the MessageChannel port
41
- * @param event
42
- */
43
- private onChannelMessage;
44
- /**
45
- * Returns the Id for the browser extension this handler is communicating with
46
- * @returns
47
- */
48
- getExtensionId(): string | undefined;
49
- /**
50
- * Returns the version for the browser extension this handler is communicating with
51
- * @returns
52
- */
53
- getExtensionVersion(): string | undefined;
54
- /**
55
- * Returns boolean indicating whether or not the request should attempt to use native broker
56
- * @param logger
57
- * @param config
58
- * @param nativeExtensionProvider
59
- * @param authenticationScheme
60
- */
61
- static isNativeAvailable(config: BrowserConfiguration, logger: Logger, nativeExtensionProvider?: NativeMessageHandler, authenticationScheme?: AuthenticationScheme): boolean;
62
- }
1
+ import { Logger, AuthenticationScheme, IPerformanceClient } from "@azure/msal-common";
2
+ import { NativeExtensionRequestBody } from "./NativeRequest";
3
+ import { BrowserConfiguration } from "../../config/Configuration";
4
+ export declare class NativeMessageHandler {
5
+ private extensionId;
6
+ private extensionVersion;
7
+ private logger;
8
+ private readonly handshakeTimeoutMs;
9
+ private timeoutId;
10
+ private resolvers;
11
+ private handshakeResolvers;
12
+ private messageChannel;
13
+ private readonly windowListener;
14
+ private readonly performanceClient;
15
+ private readonly handshakeEvent;
16
+ constructor(logger: Logger, handshakeTimeoutMs: number, performanceClient: IPerformanceClient, extensionId?: string);
17
+ /**
18
+ * Sends a given message to the extension and resolves with the extension response
19
+ * @param body
20
+ */
21
+ sendMessage(body: NativeExtensionRequestBody): Promise<object>;
22
+ /**
23
+ * Returns an instance of the MessageHandler that has successfully established a connection with an extension
24
+ * @param {Logger} logger
25
+ * @param {number} handshakeTimeoutMs
26
+ * @param {IPerformanceClient} performanceClient
27
+ * @param {ICrypto} crypto
28
+ */
29
+ static createProvider(logger: Logger, handshakeTimeoutMs: number, performanceClient: IPerformanceClient): Promise<NativeMessageHandler>;
30
+ /**
31
+ * Send handshake request helper.
32
+ */
33
+ private sendHandshakeRequest;
34
+ /**
35
+ * Invoked when a message is posted to the window. If a handshake request is received it means the extension is not installed.
36
+ * @param event
37
+ */
38
+ private onWindowMessage;
39
+ /**
40
+ * Invoked when a message is received from the extension on the MessageChannel port
41
+ * @param event
42
+ */
43
+ private onChannelMessage;
44
+ /**
45
+ * Returns the Id for the browser extension this handler is communicating with
46
+ * @returns
47
+ */
48
+ getExtensionId(): string | undefined;
49
+ /**
50
+ * Returns the version for the browser extension this handler is communicating with
51
+ * @returns
52
+ */
53
+ getExtensionVersion(): string | undefined;
54
+ /**
55
+ * Returns boolean indicating whether or not the request should attempt to use native broker
56
+ * @param logger
57
+ * @param config
58
+ * @param nativeExtensionProvider
59
+ * @param authenticationScheme
60
+ */
61
+ static isNativeAvailable(config: BrowserConfiguration, logger: Logger, nativeExtensionProvider?: NativeMessageHandler, authenticationScheme?: AuthenticationScheme): boolean;
62
+ }
63
63
  //# sourceMappingURL=NativeMessageHandler.d.ts.map
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-browser v3.4.0 2023-10-30 */
1
+ /*! @azure/msal-browser v3.5.1-beta.0 2023-11-14 */
2
2
  'use strict';
3
3
  import { NativeConstants, NativeExtensionMethod } from '../../utils/BrowserConstants.mjs';
4
4
  import { PerformanceEvents, createAuthError, AuthErrorCodes, AuthenticationScheme } from '@azure/msal-common';
@@ -7,259 +7,259 @@ import { createBrowserAuthError } from '../../error/BrowserAuthError.mjs';
7
7
  import { createNewGuid } from '../../crypto/BrowserCrypto.mjs';
8
8
  import { nativeHandshakeTimeout, nativeExtensionNotInstalled } from '../../error/BrowserAuthErrorCodes.mjs';
9
9
 
10
- /*
11
- * Copyright (c) Microsoft Corporation. All rights reserved.
12
- * Licensed under the MIT License.
13
- */
14
- class NativeMessageHandler {
15
- constructor(logger, handshakeTimeoutMs, performanceClient, extensionId) {
16
- this.logger = logger;
17
- this.handshakeTimeoutMs = handshakeTimeoutMs;
18
- this.extensionId = extensionId;
19
- this.resolvers = new Map(); // Used for non-handshake messages
20
- this.handshakeResolvers = new Map(); // Used for handshake messages
21
- this.messageChannel = new MessageChannel();
22
- this.windowListener = this.onWindowMessage.bind(this); // Window event callback doesn't have access to 'this' unless it's bound
23
- this.performanceClient = performanceClient;
24
- this.handshakeEvent = performanceClient.startMeasurement(PerformanceEvents.NativeMessageHandlerHandshake);
25
- }
26
- /**
27
- * Sends a given message to the extension and resolves with the extension response
28
- * @param body
29
- */
30
- async sendMessage(body) {
31
- this.logger.trace("NativeMessageHandler - sendMessage called.");
32
- const req = {
33
- channel: NativeConstants.CHANNEL_ID,
34
- extensionId: this.extensionId,
35
- responseId: createNewGuid(),
36
- body: body,
37
- };
38
- this.logger.trace("NativeMessageHandler - Sending request to browser extension");
39
- this.logger.tracePii(`NativeMessageHandler - Sending request to browser extension: ${JSON.stringify(req)}`);
40
- this.messageChannel.port1.postMessage(req);
41
- return new Promise((resolve, reject) => {
42
- this.resolvers.set(req.responseId, { resolve, reject });
43
- });
44
- }
45
- /**
46
- * Returns an instance of the MessageHandler that has successfully established a connection with an extension
47
- * @param {Logger} logger
48
- * @param {number} handshakeTimeoutMs
49
- * @param {IPerformanceClient} performanceClient
50
- * @param {ICrypto} crypto
51
- */
52
- static async createProvider(logger, handshakeTimeoutMs, performanceClient) {
53
- logger.trace("NativeMessageHandler - createProvider called.");
54
- try {
55
- const preferredProvider = new NativeMessageHandler(logger, handshakeTimeoutMs, performanceClient, NativeConstants.PREFERRED_EXTENSION_ID);
56
- await preferredProvider.sendHandshakeRequest();
57
- return preferredProvider;
58
- }
59
- catch (e) {
60
- // If preferred extension fails for whatever reason, fallback to using any installed extension
61
- const backupProvider = new NativeMessageHandler(logger, handshakeTimeoutMs, performanceClient);
62
- await backupProvider.sendHandshakeRequest();
63
- return backupProvider;
64
- }
65
- }
66
- /**
67
- * Send handshake request helper.
68
- */
69
- async sendHandshakeRequest() {
70
- this.logger.trace("NativeMessageHandler - sendHandshakeRequest called.");
71
- // Register this event listener before sending handshake
72
- window.addEventListener("message", this.windowListener, false); // false is important, because content script message processing should work first
73
- const req = {
74
- channel: NativeConstants.CHANNEL_ID,
75
- extensionId: this.extensionId,
76
- responseId: createNewGuid(),
77
- body: {
78
- method: NativeExtensionMethod.HandshakeRequest,
79
- },
80
- };
81
- this.handshakeEvent.add({
82
- extensionId: this.extensionId,
83
- extensionHandshakeTimeoutMs: this.handshakeTimeoutMs,
84
- });
85
- this.messageChannel.port1.onmessage = (event) => {
86
- this.onChannelMessage(event);
87
- };
88
- window.postMessage(req, window.origin, [this.messageChannel.port2]);
89
- return new Promise((resolve, reject) => {
90
- this.handshakeResolvers.set(req.responseId, { resolve, reject });
91
- this.timeoutId = window.setTimeout(() => {
92
- /*
93
- * Throw an error if neither HandshakeResponse nor original Handshake request are received in a reasonable timeframe.
94
- * This typically suggests an event handler stopped propagation of the Handshake request but did not respond to it on the MessageChannel port
95
- */
96
- window.removeEventListener("message", this.windowListener, false);
97
- this.messageChannel.port1.close();
98
- this.messageChannel.port2.close();
99
- this.handshakeEvent.end({
100
- extensionHandshakeTimedOut: true,
101
- success: false,
102
- });
103
- reject(createBrowserAuthError(nativeHandshakeTimeout));
104
- this.handshakeResolvers.delete(req.responseId);
105
- }, this.handshakeTimeoutMs); // Use a reasonable timeout in milliseconds here
106
- });
107
- }
108
- /**
109
- * Invoked when a message is posted to the window. If a handshake request is received it means the extension is not installed.
110
- * @param event
111
- */
112
- onWindowMessage(event) {
113
- this.logger.trace("NativeMessageHandler - onWindowMessage called");
114
- // We only accept messages from ourselves
115
- if (event.source !== window) {
116
- return;
117
- }
118
- const request = event.data;
119
- if (!request.channel ||
120
- request.channel !== NativeConstants.CHANNEL_ID) {
121
- return;
122
- }
123
- if (request.extensionId && request.extensionId !== this.extensionId) {
124
- return;
125
- }
126
- if (request.body.method === NativeExtensionMethod.HandshakeRequest) {
127
- const handshakeResolver = this.handshakeResolvers.get(request.responseId);
128
- /*
129
- * Filter out responses with no matched resolvers sooner to keep channel ports open while waiting for
130
- * the proper response.
131
- */
132
- if (!handshakeResolver) {
133
- this.logger.trace(`NativeMessageHandler.onWindowMessage - resolver can't be found for request ${request.responseId}`);
134
- return;
135
- }
136
- // If we receive this message back it means no extension intercepted the request, meaning no extension supporting handshake protocol is installed
137
- this.logger.verbose(request.extensionId
138
- ? `Extension with id: ${request.extensionId} not installed`
139
- : "No extension installed");
140
- clearTimeout(this.timeoutId);
141
- this.messageChannel.port1.close();
142
- this.messageChannel.port2.close();
143
- window.removeEventListener("message", this.windowListener, false);
144
- this.handshakeEvent.end({
145
- success: false,
146
- extensionInstalled: false,
147
- });
148
- handshakeResolver.reject(createBrowserAuthError(nativeExtensionNotInstalled));
149
- }
150
- }
151
- /**
152
- * Invoked when a message is received from the extension on the MessageChannel port
153
- * @param event
154
- */
155
- onChannelMessage(event) {
156
- this.logger.trace("NativeMessageHandler - onChannelMessage called.");
157
- const request = event.data;
158
- const resolver = this.resolvers.get(request.responseId);
159
- const handshakeResolver = this.handshakeResolvers.get(request.responseId);
160
- try {
161
- const method = request.body.method;
162
- if (method === NativeExtensionMethod.Response) {
163
- if (!resolver) {
164
- return;
165
- }
166
- const response = request.body.response;
167
- this.logger.trace("NativeMessageHandler - Received response from browser extension");
168
- this.logger.tracePii(`NativeMessageHandler - Received response from browser extension: ${JSON.stringify(response)}`);
169
- if (response.status !== "Success") {
170
- resolver.reject(createNativeAuthError(response.code, response.description, response.ext));
171
- }
172
- else if (response.result) {
173
- if (response.result["code"] &&
174
- response.result["description"]) {
175
- resolver.reject(createNativeAuthError(response.result["code"], response.result["description"], response.result["ext"]));
176
- }
177
- else {
178
- resolver.resolve(response.result);
179
- }
180
- }
181
- else {
182
- throw createAuthError(AuthErrorCodes.unexpectedError, "Event does not contain result.");
183
- }
184
- this.resolvers.delete(request.responseId);
185
- }
186
- else if (method === NativeExtensionMethod.HandshakeResponse) {
187
- if (!handshakeResolver) {
188
- this.logger.trace(`NativeMessageHandler.onChannelMessage - resolver can't be found for request ${request.responseId}`);
189
- return;
190
- }
191
- clearTimeout(this.timeoutId); // Clear setTimeout
192
- window.removeEventListener("message", this.windowListener, false); // Remove 'No extension' listener
193
- this.extensionId = request.extensionId;
194
- this.extensionVersion = request.body.version;
195
- this.logger.verbose(`NativeMessageHandler - Received HandshakeResponse from extension: ${this.extensionId}`);
196
- this.handshakeEvent.end({
197
- extensionInstalled: true,
198
- success: true,
199
- });
200
- handshakeResolver.resolve();
201
- this.handshakeResolvers.delete(request.responseId);
202
- }
203
- // Do nothing if method is not Response or HandshakeResponse
204
- }
205
- catch (err) {
206
- this.logger.error("Error parsing response from WAM Extension");
207
- this.logger.errorPii(`Error parsing response from WAM Extension: ${err}`);
208
- this.logger.errorPii(`Unable to parse ${event}`);
209
- if (resolver) {
210
- resolver.reject(err);
211
- }
212
- else if (handshakeResolver) {
213
- handshakeResolver.reject(err);
214
- }
215
- }
216
- }
217
- /**
218
- * Returns the Id for the browser extension this handler is communicating with
219
- * @returns
220
- */
221
- getExtensionId() {
222
- return this.extensionId;
223
- }
224
- /**
225
- * Returns the version for the browser extension this handler is communicating with
226
- * @returns
227
- */
228
- getExtensionVersion() {
229
- return this.extensionVersion;
230
- }
231
- /**
232
- * Returns boolean indicating whether or not the request should attempt to use native broker
233
- * @param logger
234
- * @param config
235
- * @param nativeExtensionProvider
236
- * @param authenticationScheme
237
- */
238
- static isNativeAvailable(config, logger, nativeExtensionProvider, authenticationScheme) {
239
- logger.trace("isNativeAvailable called");
240
- if (!config.system.allowNativeBroker) {
241
- logger.trace("isNativeAvailable: allowNativeBroker is not enabled, returning false");
242
- // Developer disabled WAM
243
- return false;
244
- }
245
- if (!nativeExtensionProvider) {
246
- logger.trace("isNativeAvailable: WAM extension provider is not initialized, returning false");
247
- // Extension is not available
248
- return false;
249
- }
250
- if (authenticationScheme) {
251
- switch (authenticationScheme) {
252
- case AuthenticationScheme.BEARER:
253
- case AuthenticationScheme.POP:
254
- logger.trace("isNativeAvailable: authenticationScheme is supported, returning true");
255
- return true;
256
- default:
257
- logger.trace("isNativeAvailable: authenticationScheme is not supported, returning false");
258
- return false;
259
- }
260
- }
261
- return true;
262
- }
10
+ /*
11
+ * Copyright (c) Microsoft Corporation. All rights reserved.
12
+ * Licensed under the MIT License.
13
+ */
14
+ class NativeMessageHandler {
15
+ constructor(logger, handshakeTimeoutMs, performanceClient, extensionId) {
16
+ this.logger = logger;
17
+ this.handshakeTimeoutMs = handshakeTimeoutMs;
18
+ this.extensionId = extensionId;
19
+ this.resolvers = new Map(); // Used for non-handshake messages
20
+ this.handshakeResolvers = new Map(); // Used for handshake messages
21
+ this.messageChannel = new MessageChannel();
22
+ this.windowListener = this.onWindowMessage.bind(this); // Window event callback doesn't have access to 'this' unless it's bound
23
+ this.performanceClient = performanceClient;
24
+ this.handshakeEvent = performanceClient.startMeasurement(PerformanceEvents.NativeMessageHandlerHandshake);
25
+ }
26
+ /**
27
+ * Sends a given message to the extension and resolves with the extension response
28
+ * @param body
29
+ */
30
+ async sendMessage(body) {
31
+ this.logger.trace("NativeMessageHandler - sendMessage called.");
32
+ const req = {
33
+ channel: NativeConstants.CHANNEL_ID,
34
+ extensionId: this.extensionId,
35
+ responseId: createNewGuid(),
36
+ body: body,
37
+ };
38
+ this.logger.trace("NativeMessageHandler - Sending request to browser extension");
39
+ this.logger.tracePii(`NativeMessageHandler - Sending request to browser extension: ${JSON.stringify(req)}`);
40
+ this.messageChannel.port1.postMessage(req);
41
+ return new Promise((resolve, reject) => {
42
+ this.resolvers.set(req.responseId, { resolve, reject });
43
+ });
44
+ }
45
+ /**
46
+ * Returns an instance of the MessageHandler that has successfully established a connection with an extension
47
+ * @param {Logger} logger
48
+ * @param {number} handshakeTimeoutMs
49
+ * @param {IPerformanceClient} performanceClient
50
+ * @param {ICrypto} crypto
51
+ */
52
+ static async createProvider(logger, handshakeTimeoutMs, performanceClient) {
53
+ logger.trace("NativeMessageHandler - createProvider called.");
54
+ try {
55
+ const preferredProvider = new NativeMessageHandler(logger, handshakeTimeoutMs, performanceClient, NativeConstants.PREFERRED_EXTENSION_ID);
56
+ await preferredProvider.sendHandshakeRequest();
57
+ return preferredProvider;
58
+ }
59
+ catch (e) {
60
+ // If preferred extension fails for whatever reason, fallback to using any installed extension
61
+ const backupProvider = new NativeMessageHandler(logger, handshakeTimeoutMs, performanceClient);
62
+ await backupProvider.sendHandshakeRequest();
63
+ return backupProvider;
64
+ }
65
+ }
66
+ /**
67
+ * Send handshake request helper.
68
+ */
69
+ async sendHandshakeRequest() {
70
+ this.logger.trace("NativeMessageHandler - sendHandshakeRequest called.");
71
+ // Register this event listener before sending handshake
72
+ window.addEventListener("message", this.windowListener, false); // false is important, because content script message processing should work first
73
+ const req = {
74
+ channel: NativeConstants.CHANNEL_ID,
75
+ extensionId: this.extensionId,
76
+ responseId: createNewGuid(),
77
+ body: {
78
+ method: NativeExtensionMethod.HandshakeRequest,
79
+ },
80
+ };
81
+ this.handshakeEvent.add({
82
+ extensionId: this.extensionId,
83
+ extensionHandshakeTimeoutMs: this.handshakeTimeoutMs,
84
+ });
85
+ this.messageChannel.port1.onmessage = (event) => {
86
+ this.onChannelMessage(event);
87
+ };
88
+ window.postMessage(req, window.origin, [this.messageChannel.port2]);
89
+ return new Promise((resolve, reject) => {
90
+ this.handshakeResolvers.set(req.responseId, { resolve, reject });
91
+ this.timeoutId = window.setTimeout(() => {
92
+ /*
93
+ * Throw an error if neither HandshakeResponse nor original Handshake request are received in a reasonable timeframe.
94
+ * This typically suggests an event handler stopped propagation of the Handshake request but did not respond to it on the MessageChannel port
95
+ */
96
+ window.removeEventListener("message", this.windowListener, false);
97
+ this.messageChannel.port1.close();
98
+ this.messageChannel.port2.close();
99
+ this.handshakeEvent.end({
100
+ extensionHandshakeTimedOut: true,
101
+ success: false,
102
+ });
103
+ reject(createBrowserAuthError(nativeHandshakeTimeout));
104
+ this.handshakeResolvers.delete(req.responseId);
105
+ }, this.handshakeTimeoutMs); // Use a reasonable timeout in milliseconds here
106
+ });
107
+ }
108
+ /**
109
+ * Invoked when a message is posted to the window. If a handshake request is received it means the extension is not installed.
110
+ * @param event
111
+ */
112
+ onWindowMessage(event) {
113
+ this.logger.trace("NativeMessageHandler - onWindowMessage called");
114
+ // We only accept messages from ourselves
115
+ if (event.source !== window) {
116
+ return;
117
+ }
118
+ const request = event.data;
119
+ if (!request.channel ||
120
+ request.channel !== NativeConstants.CHANNEL_ID) {
121
+ return;
122
+ }
123
+ if (request.extensionId && request.extensionId !== this.extensionId) {
124
+ return;
125
+ }
126
+ if (request.body.method === NativeExtensionMethod.HandshakeRequest) {
127
+ const handshakeResolver = this.handshakeResolvers.get(request.responseId);
128
+ /*
129
+ * Filter out responses with no matched resolvers sooner to keep channel ports open while waiting for
130
+ * the proper response.
131
+ */
132
+ if (!handshakeResolver) {
133
+ this.logger.trace(`NativeMessageHandler.onWindowMessage - resolver can't be found for request ${request.responseId}`);
134
+ return;
135
+ }
136
+ // If we receive this message back it means no extension intercepted the request, meaning no extension supporting handshake protocol is installed
137
+ this.logger.verbose(request.extensionId
138
+ ? `Extension with id: ${request.extensionId} not installed`
139
+ : "No extension installed");
140
+ clearTimeout(this.timeoutId);
141
+ this.messageChannel.port1.close();
142
+ this.messageChannel.port2.close();
143
+ window.removeEventListener("message", this.windowListener, false);
144
+ this.handshakeEvent.end({
145
+ success: false,
146
+ extensionInstalled: false,
147
+ });
148
+ handshakeResolver.reject(createBrowserAuthError(nativeExtensionNotInstalled));
149
+ }
150
+ }
151
+ /**
152
+ * Invoked when a message is received from the extension on the MessageChannel port
153
+ * @param event
154
+ */
155
+ onChannelMessage(event) {
156
+ this.logger.trace("NativeMessageHandler - onChannelMessage called.");
157
+ const request = event.data;
158
+ const resolver = this.resolvers.get(request.responseId);
159
+ const handshakeResolver = this.handshakeResolvers.get(request.responseId);
160
+ try {
161
+ const method = request.body.method;
162
+ if (method === NativeExtensionMethod.Response) {
163
+ if (!resolver) {
164
+ return;
165
+ }
166
+ const response = request.body.response;
167
+ this.logger.trace("NativeMessageHandler - Received response from browser extension");
168
+ this.logger.tracePii(`NativeMessageHandler - Received response from browser extension: ${JSON.stringify(response)}`);
169
+ if (response.status !== "Success") {
170
+ resolver.reject(createNativeAuthError(response.code, response.description, response.ext));
171
+ }
172
+ else if (response.result) {
173
+ if (response.result["code"] &&
174
+ response.result["description"]) {
175
+ resolver.reject(createNativeAuthError(response.result["code"], response.result["description"], response.result["ext"]));
176
+ }
177
+ else {
178
+ resolver.resolve(response.result);
179
+ }
180
+ }
181
+ else {
182
+ throw createAuthError(AuthErrorCodes.unexpectedError, "Event does not contain result.");
183
+ }
184
+ this.resolvers.delete(request.responseId);
185
+ }
186
+ else if (method === NativeExtensionMethod.HandshakeResponse) {
187
+ if (!handshakeResolver) {
188
+ this.logger.trace(`NativeMessageHandler.onChannelMessage - resolver can't be found for request ${request.responseId}`);
189
+ return;
190
+ }
191
+ clearTimeout(this.timeoutId); // Clear setTimeout
192
+ window.removeEventListener("message", this.windowListener, false); // Remove 'No extension' listener
193
+ this.extensionId = request.extensionId;
194
+ this.extensionVersion = request.body.version;
195
+ this.logger.verbose(`NativeMessageHandler - Received HandshakeResponse from extension: ${this.extensionId}`);
196
+ this.handshakeEvent.end({
197
+ extensionInstalled: true,
198
+ success: true,
199
+ });
200
+ handshakeResolver.resolve();
201
+ this.handshakeResolvers.delete(request.responseId);
202
+ }
203
+ // Do nothing if method is not Response or HandshakeResponse
204
+ }
205
+ catch (err) {
206
+ this.logger.error("Error parsing response from WAM Extension");
207
+ this.logger.errorPii(`Error parsing response from WAM Extension: ${err}`);
208
+ this.logger.errorPii(`Unable to parse ${event}`);
209
+ if (resolver) {
210
+ resolver.reject(err);
211
+ }
212
+ else if (handshakeResolver) {
213
+ handshakeResolver.reject(err);
214
+ }
215
+ }
216
+ }
217
+ /**
218
+ * Returns the Id for the browser extension this handler is communicating with
219
+ * @returns
220
+ */
221
+ getExtensionId() {
222
+ return this.extensionId;
223
+ }
224
+ /**
225
+ * Returns the version for the browser extension this handler is communicating with
226
+ * @returns
227
+ */
228
+ getExtensionVersion() {
229
+ return this.extensionVersion;
230
+ }
231
+ /**
232
+ * Returns boolean indicating whether or not the request should attempt to use native broker
233
+ * @param logger
234
+ * @param config
235
+ * @param nativeExtensionProvider
236
+ * @param authenticationScheme
237
+ */
238
+ static isNativeAvailable(config, logger, nativeExtensionProvider, authenticationScheme) {
239
+ logger.trace("isNativeAvailable called");
240
+ if (!config.system.allowNativeBroker) {
241
+ logger.trace("isNativeAvailable: allowNativeBroker is not enabled, returning false");
242
+ // Developer disabled WAM
243
+ return false;
244
+ }
245
+ if (!nativeExtensionProvider) {
246
+ logger.trace("isNativeAvailable: WAM extension provider is not initialized, returning false");
247
+ // Extension is not available
248
+ return false;
249
+ }
250
+ if (authenticationScheme) {
251
+ switch (authenticationScheme) {
252
+ case AuthenticationScheme.BEARER:
253
+ case AuthenticationScheme.POP:
254
+ logger.trace("isNativeAvailable: authenticationScheme is supported, returning true");
255
+ return true;
256
+ default:
257
+ logger.trace("isNativeAvailable: authenticationScheme is not supported, returning false");
258
+ return false;
259
+ }
260
+ }
261
+ return true;
262
+ }
263
263
  }
264
264
 
265
265
  export { NativeMessageHandler };