@azure/msal-browser 3.5.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 (192) 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.mjs +1262 -1262
  17. package/dist/cache/BrowserStorage.d.ts +11 -11
  18. package/dist/cache/BrowserStorage.mjs +32 -32
  19. package/dist/cache/CryptoKeyStore.d.ts +18 -18
  20. package/dist/cache/CryptoKeyStore.mjs +40 -40
  21. package/dist/cache/DatabaseStorage.d.ts +56 -56
  22. package/dist/cache/DatabaseStorage.mjs +190 -190
  23. package/dist/cache/IAsyncMemoryStorage.d.ts +27 -27
  24. package/dist/cache/ITokenCache.d.ts +11 -11
  25. package/dist/cache/IWindowStorage.d.ts +27 -27
  26. package/dist/cache/MemoryStorage.d.ts +11 -11
  27. package/dist/cache/MemoryStorage.mjs +31 -31
  28. package/dist/cache/TokenCache.d.ts +77 -77
  29. package/dist/cache/TokenCache.mjs +224 -224
  30. package/dist/config/Configuration.d.ts +206 -206
  31. package/dist/config/Configuration.mjs +128 -128
  32. package/dist/controllers/ControllerFactory.d.ts +4 -4
  33. package/dist/controllers/ControllerFactory.mjs +29 -29
  34. package/dist/controllers/IController.d.ts +61 -61
  35. package/dist/controllers/NestedAppAuthController.d.ts +95 -95
  36. package/dist/controllers/NestedAppAuthController.d.ts.map +1 -1
  37. package/dist/controllers/NestedAppAuthController.mjs +335 -333
  38. package/dist/controllers/NestedAppAuthController.mjs.map +1 -1
  39. package/dist/controllers/StandardController.d.ts +407 -407
  40. package/dist/controllers/StandardController.d.ts.map +1 -1
  41. package/dist/controllers/StandardController.mjs +1293 -1291
  42. package/dist/controllers/StandardController.mjs.map +1 -1
  43. package/dist/controllers/UnknownOperatingContextController.d.ts +87 -87
  44. package/dist/controllers/UnknownOperatingContextController.mjs +264 -264
  45. package/dist/crypto/BrowserCrypto.d.ts +44 -44
  46. package/dist/crypto/BrowserCrypto.mjs +93 -93
  47. package/dist/crypto/CryptoOps.d.ts +63 -63
  48. package/dist/crypto/CryptoOps.mjs +145 -145
  49. package/dist/crypto/PkceGenerator.d.ts +8 -8
  50. package/dist/crypto/PkceGenerator.mjs +54 -54
  51. package/dist/crypto/SignedHttpRequest.d.ts +30 -30
  52. package/dist/crypto/SignedHttpRequest.mjs +39 -39
  53. package/dist/encode/Base64Decode.d.ts +9 -9
  54. package/dist/encode/Base64Decode.mjs +36 -36
  55. package/dist/encode/Base64Encode.d.ts +19 -19
  56. package/dist/encode/Base64Encode.mjs +43 -43
  57. package/dist/error/BrowserAuthError.d.ts +250 -250
  58. package/dist/error/BrowserAuthError.mjs +258 -258
  59. package/dist/error/BrowserAuthErrorCodes.d.ts +45 -45
  60. package/dist/error/BrowserAuthErrorCodes.mjs +49 -49
  61. package/dist/error/BrowserConfigurationAuthError.d.ts +33 -33
  62. package/dist/error/BrowserConfigurationAuthError.mjs +40 -40
  63. package/dist/error/BrowserConfigurationAuthErrorCodes.d.ts +3 -3
  64. package/dist/error/BrowserConfigurationAuthErrorCodes.mjs +7 -7
  65. package/dist/error/NativeAuthError.d.ts +29 -29
  66. package/dist/error/NativeAuthError.mjs +60 -60
  67. package/dist/error/NativeAuthErrorCodes.d.ts +2 -2
  68. package/dist/error/NativeAuthErrorCodes.mjs +6 -6
  69. package/dist/error/NestedAppAuthError.d.ts +14 -14
  70. package/dist/error/NestedAppAuthError.mjs +23 -23
  71. package/dist/event/EventHandler.d.ts +41 -41
  72. package/dist/event/EventHandler.mjs +119 -119
  73. package/dist/event/EventMessage.d.ts +25 -25
  74. package/dist/event/EventMessage.mjs +68 -68
  75. package/dist/event/EventType.d.ts +28 -28
  76. package/dist/event/EventType.mjs +31 -31
  77. package/dist/index.d.ts +39 -39
  78. package/dist/index.mjs +1 -1
  79. package/dist/interaction_client/BaseInteractionClient.d.ts +54 -54
  80. package/dist/interaction_client/BaseInteractionClient.mjs +152 -152
  81. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.d.ts +4 -4
  82. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.mjs +10 -10
  83. package/dist/interaction_client/NativeInteractionClient.d.ts +140 -140
  84. package/dist/interaction_client/NativeInteractionClient.mjs +548 -548
  85. package/dist/interaction_client/PopupClient.d.ts +105 -105
  86. package/dist/interaction_client/PopupClient.mjs +432 -432
  87. package/dist/interaction_client/RedirectClient.d.ts +49 -49
  88. package/dist/interaction_client/RedirectClient.mjs +311 -311
  89. package/dist/interaction_client/SilentAuthCodeClient.d.ts +23 -23
  90. package/dist/interaction_client/SilentAuthCodeClient.mjs +57 -57
  91. package/dist/interaction_client/SilentCacheClient.d.ts +24 -24
  92. package/dist/interaction_client/SilentCacheClient.mjs +61 -61
  93. package/dist/interaction_client/SilentIframeClient.d.ts +32 -32
  94. package/dist/interaction_client/SilentIframeClient.mjs +96 -96
  95. package/dist/interaction_client/SilentRefreshClient.d.ts +20 -20
  96. package/dist/interaction_client/SilentRefreshClient.mjs +43 -43
  97. package/dist/interaction_client/StandardInteractionClient.d.ts +54 -54
  98. package/dist/interaction_client/StandardInteractionClient.mjs +222 -222
  99. package/dist/interaction_handler/InteractionHandler.d.ts +33 -33
  100. package/dist/interaction_handler/InteractionHandler.mjs +93 -93
  101. package/dist/interaction_handler/RedirectHandler.d.ts +32 -32
  102. package/dist/interaction_handler/RedirectHandler.mjs +134 -134
  103. package/dist/interaction_handler/SilentHandler.d.ts +13 -13
  104. package/dist/interaction_handler/SilentHandler.mjs +133 -133
  105. package/dist/naa/AccountInfo.d.ts +11 -12
  106. package/dist/naa/AccountInfo.d.ts.map +1 -1
  107. package/dist/naa/AccountRequests.d.ts +9 -9
  108. package/dist/naa/AuthBridge.d.ts +5 -5
  109. package/dist/naa/BridgeCapabilities.d.ts +3 -3
  110. package/dist/naa/BridgeError.d.ts +9 -9
  111. package/dist/naa/BridgeError.d.ts.map +1 -1
  112. package/dist/naa/BridgeError.mjs +7 -7
  113. package/dist/naa/BridgeError.mjs.map +1 -1
  114. package/dist/naa/BridgeProxy.d.ts +72 -71
  115. package/dist/naa/BridgeProxy.d.ts.map +1 -1
  116. package/dist/naa/BridgeProxy.mjs +152 -149
  117. package/dist/naa/BridgeProxy.mjs.map +1 -1
  118. package/dist/naa/BridgeRequest.d.ts +6 -6
  119. package/dist/naa/BridgeRequestEnvelope.d.ts +13 -13
  120. package/dist/naa/BridgeResponseEnvelope.d.ts +10 -10
  121. package/dist/naa/BridgeStatusCode.d.ts +10 -10
  122. package/dist/naa/BridgeStatusCode.mjs +15 -15
  123. package/dist/naa/IBridgeProxy.d.ts +12 -10
  124. package/dist/naa/IBridgeProxy.d.ts.map +1 -1
  125. package/dist/naa/InitializeBridgeResponse.d.ts +6 -6
  126. package/dist/naa/InitializeBridgeResponse.d.ts.map +1 -1
  127. package/dist/naa/TokenRequest.d.ts +19 -21
  128. package/dist/naa/TokenRequest.d.ts.map +1 -1
  129. package/dist/naa/TokenResponse.d.ts +15 -16
  130. package/dist/naa/TokenResponse.d.ts.map +1 -1
  131. package/dist/naa/mapping/NestedAppAuthAdapter.d.ts +23 -25
  132. package/dist/naa/mapping/NestedAppAuthAdapter.d.ts.map +1 -1
  133. package/dist/naa/mapping/NestedAppAuthAdapter.mjs +142 -170
  134. package/dist/naa/mapping/NestedAppAuthAdapter.mjs.map +1 -1
  135. package/dist/navigation/INavigationClient.d.ts +16 -16
  136. package/dist/navigation/NavigationClient.d.ts +22 -22
  137. package/dist/navigation/NavigationClient.mjs +40 -40
  138. package/dist/navigation/NavigationOptions.d.ts +12 -12
  139. package/dist/network/FetchClient.d.ts +26 -26
  140. package/dist/network/FetchClient.mjs +99 -99
  141. package/dist/operatingcontext/BaseOperatingContext.d.ts +40 -40
  142. package/dist/operatingcontext/BaseOperatingContext.mjs +44 -44
  143. package/dist/operatingcontext/StandardOperatingContext.d.ts +25 -25
  144. package/dist/operatingcontext/StandardOperatingContext.mjs +43 -43
  145. package/dist/operatingcontext/TeamsAppOperatingContext.d.ts +32 -32
  146. package/dist/operatingcontext/TeamsAppOperatingContext.d.ts.map +1 -1
  147. package/dist/operatingcontext/TeamsAppOperatingContext.mjs +85 -82
  148. package/dist/operatingcontext/TeamsAppOperatingContext.mjs.map +1 -1
  149. package/dist/operatingcontext/UnknownOperatingContext.d.ts +25 -25
  150. package/dist/operatingcontext/UnknownOperatingContext.mjs +42 -42
  151. package/dist/packageMetadata.d.ts +2 -2
  152. package/dist/packageMetadata.mjs +3 -3
  153. package/dist/request/AuthorizationCodeRequest.d.ts +8 -8
  154. package/dist/request/AuthorizationUrlRequest.d.ts +8 -8
  155. package/dist/request/ClearCacheRequest.d.ts +10 -10
  156. package/dist/request/EndSessionPopupRequest.d.ts +18 -18
  157. package/dist/request/EndSessionRequest.d.ts +15 -15
  158. package/dist/request/PopupRequest.d.ts +34 -34
  159. package/dist/request/PopupWindowAttributes.d.ts +15 -15
  160. package/dist/request/RedirectRequest.d.ts +35 -35
  161. package/dist/request/SilentRequest.d.ts +32 -32
  162. package/dist/request/SsoSilentRequest.d.ts +29 -29
  163. package/dist/response/AuthenticationResult.d.ts +4 -4
  164. package/dist/response/ResponseHandler.d.ts +7 -7
  165. package/dist/response/ResponseHandler.mjs +36 -36
  166. package/dist/telemetry/BrowserPerformanceClient.d.ts +36 -36
  167. package/dist/telemetry/BrowserPerformanceClient.mjs +125 -125
  168. package/dist/telemetry/BrowserPerformanceMeasurement.d.ts +21 -21
  169. package/dist/telemetry/BrowserPerformanceMeasurement.mjs +92 -92
  170. package/dist/utils/BrowserConstants.d.ts +176 -176
  171. package/dist/utils/BrowserConstants.mjs +204 -204
  172. package/dist/utils/BrowserProtocolUtils.d.ts +11 -11
  173. package/dist/utils/BrowserProtocolUtils.mjs +21 -21
  174. package/dist/utils/BrowserUtils.d.ts +56 -56
  175. package/dist/utils/BrowserUtils.mjs +125 -125
  176. package/lib/msal-browser.cjs +17920 -17926
  177. package/lib/msal-browser.cjs.map +1 -1
  178. package/lib/msal-browser.js +17920 -17926
  179. package/lib/msal-browser.js.map +1 -1
  180. package/lib/msal-browser.min.js +59 -59
  181. package/package.json +102 -102
  182. package/src/controllers/NestedAppAuthController.ts +8 -3
  183. package/src/controllers/StandardController.ts +3 -1
  184. package/src/naa/AccountInfo.ts +3 -4
  185. package/src/naa/BridgeError.ts +4 -4
  186. package/src/naa/BridgeProxy.ts +6 -2
  187. package/src/naa/IBridgeProxy.ts +2 -0
  188. package/src/naa/InitializeBridgeResponse.ts +1 -1
  189. package/src/naa/TokenRequest.ts +0 -2
  190. package/src/naa/TokenResponse.ts +1 -2
  191. package/src/naa/mapping/NestedAppAuthAdapter.ts +72 -80
  192. package/src/operatingcontext/TeamsAppOperatingContext.ts +4 -1
@@ -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.5.0 2023-11-07 */
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 };