@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
@@ -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.19.1 2024-07-16 */
1
+ /*! @azure/msal-browser v3.21.0 2024-08-13 */
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 };