@microsoft/windows-admin-center-sdk 6.0.0 → 6.1.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 (176) hide show
  1. package/3rdPartyDisclosure.html +10 -13
  2. package/README.md +110 -33
  3. package/angular/fesm2022/msft-sme-angular.mjs +1235 -1213
  4. package/angular/fesm2022/msft-sme-angular.mjs.map +1 -1
  5. package/angular/index.d.ts +29 -14
  6. package/angular/package.json +1 -1
  7. package/core/azure/azure-manager.d.ts +15 -3
  8. package/core/azure/azure-manager.d.ts.map +1 -1
  9. package/core/azure/azure-manager.js +29 -10
  10. package/core/azure/azure-manager.js.map +1 -1
  11. package/core/azure/models/aadAppConfig-data.d.ts +16 -0
  12. package/core/azure/models/aadAppConfig-data.d.ts.map +1 -1
  13. package/core/azure/models/aadAppConfig-data.js.map +1 -1
  14. package/core/base/environment.d.ts +1 -1
  15. package/core/base/environment.d.ts.map +1 -1
  16. package/core/base/environment.js.map +1 -1
  17. package/core/base/utilities.d.ts +10 -2
  18. package/core/base/utilities.d.ts.map +1 -1
  19. package/core/base/utilities.js +45 -25
  20. package/core/base/utilities.js.map +1 -1
  21. package/core/data/gateway-connection.d.ts.map +1 -1
  22. package/core/data/gateway-connection.js +1 -0
  23. package/core/data/gateway-connection.js.map +1 -1
  24. package/core/diagnostics/sme-web-telemetry.d.ts +17 -1
  25. package/core/diagnostics/sme-web-telemetry.d.ts.map +1 -1
  26. package/core/diagnostics/sme-web-telemetry.js +16 -0
  27. package/core/diagnostics/sme-web-telemetry.js.map +1 -1
  28. package/core/enterprise/enterprise-models.d.ts +10 -4
  29. package/core/enterprise/enterprise-models.d.ts.map +1 -1
  30. package/core/enterprise/enterprise-models.js +9 -4
  31. package/core/enterprise/enterprise-models.js.map +1 -1
  32. package/core/index.d.ts +5 -3
  33. package/core/index.d.ts.map +1 -1
  34. package/core/index.js +2 -1
  35. package/core/index.js.map +1 -1
  36. package/core/manifest/environment-modules.d.ts +2 -2
  37. package/core/manifest/environment-modules.d.ts.map +1 -1
  38. package/core/manifest/environment-modules.js.map +1 -1
  39. package/core/manifest/gateway-url-validator.d.ts +17 -0
  40. package/core/manifest/gateway-url-validator.d.ts.map +1 -0
  41. package/core/manifest/gateway-url-validator.js +56 -0
  42. package/core/manifest/gateway-url-validator.js.map +1 -0
  43. package/core/manifest/manifest-loader.d.ts +47 -11
  44. package/core/manifest/manifest-loader.d.ts.map +1 -1
  45. package/core/manifest/manifest-loader.js +141 -72
  46. package/core/manifest/manifest-loader.js.map +1 -1
  47. package/core/manifest/module-schema.json +1 -1
  48. package/core/performance/performance-tracker.d.ts +2 -0
  49. package/core/performance/performance-tracker.d.ts.map +1 -1
  50. package/core/performance/performance-tracker.js +18 -0
  51. package/core/performance/performance-tracker.js.map +1 -1
  52. package/core/rpc/azure/rpc-azure-model.d.ts +19 -1
  53. package/core/rpc/azure/rpc-azure-model.d.ts.map +1 -1
  54. package/core/rpc/azure/rpc-azure-model.js.map +1 -1
  55. package/core/rpc/forward/rpc-forward-auto-client.d.ts +5 -0
  56. package/core/rpc/forward/rpc-forward-auto-client.d.ts.map +1 -1
  57. package/core/rpc/forward/rpc-forward-auto-client.js +13 -0
  58. package/core/rpc/forward/rpc-forward-auto-client.js.map +1 -1
  59. package/core/rpc/resource-data-changed/rpc-resource-data-changed-client.d.ts +16 -0
  60. package/core/rpc/resource-data-changed/rpc-resource-data-changed-client.d.ts.map +1 -0
  61. package/core/rpc/resource-data-changed/rpc-resource-data-changed-client.js +18 -0
  62. package/core/rpc/resource-data-changed/rpc-resource-data-changed-client.js.map +1 -0
  63. package/core/rpc/resource-data-changed/rpc-resource-data-changed-handler.d.ts +8 -0
  64. package/core/rpc/resource-data-changed/rpc-resource-data-changed-handler.d.ts.map +1 -0
  65. package/core/rpc/resource-data-changed/rpc-resource-data-changed-handler.js +2 -0
  66. package/core/rpc/resource-data-changed/rpc-resource-data-changed-handler.js.map +1 -0
  67. package/core/rpc/resource-data-changed/rpc-resource-data-changed-model.d.ts +18 -0
  68. package/core/rpc/resource-data-changed/rpc-resource-data-changed-model.d.ts.map +1 -0
  69. package/core/rpc/resource-data-changed/rpc-resource-data-changed-model.js +8 -0
  70. package/core/rpc/resource-data-changed/rpc-resource-data-changed-model.js.map +1 -0
  71. package/core/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.d.ts +27 -0
  72. package/core/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.d.ts.map +1 -0
  73. package/core/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.js +23 -0
  74. package/core/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.js.map +1 -0
  75. package/core/rpc/rpc-forwarder.d.ts +16 -2
  76. package/core/rpc/rpc-forwarder.d.ts.map +1 -1
  77. package/core/rpc/rpc-forwarder.js +50 -6
  78. package/core/rpc/rpc-forwarder.js.map +1 -1
  79. package/core/security/authorization-manager.d.ts +126 -4
  80. package/core/security/authorization-manager.d.ts.map +1 -1
  81. package/core/security/authorization-manager.js +381 -49
  82. package/core/security/authorization-manager.js.map +1 -1
  83. package/core/security/connection-manager.d.ts +2 -1
  84. package/core/security/connection-manager.d.ts.map +1 -1
  85. package/core/security/connection-manager.js +10 -6
  86. package/core/security/connection-manager.js.map +1 -1
  87. package/core/security/tool-condition-validator.d.ts +8 -3
  88. package/core/security/tool-condition-validator.d.ts.map +1 -1
  89. package/core/security/tool-condition-validator.js +43 -28
  90. package/core/security/tool-condition-validator.js.map +1 -1
  91. package/core/version.js +1 -1
  92. package/core/version.js.map +1 -1
  93. package/core/virtualization/virtualization-client.d.ts +47 -78
  94. package/core/virtualization/virtualization-client.d.ts.map +1 -1
  95. package/core/virtualization/virtualization-client.js +57 -77
  96. package/core/virtualization/virtualization-client.js.map +1 -1
  97. package/core/virtualization/virtualization-models.d.ts +9 -8
  98. package/core/virtualization/virtualization-models.d.ts.map +1 -1
  99. package/core/virtualization/virtualization-models.js +7 -5
  100. package/core/virtualization/virtualization-models.js.map +1 -1
  101. package/core/virtualization/virtualization-unavailable-error.d.ts +1 -1
  102. package/core/virtualization/virtualization-unavailable-error.js +1 -1
  103. package/core/virtualization/virtualization-unavailable-error.js.map +1 -1
  104. package/package.json +12 -17
  105. package/{react-sdk-core → react}/hooks/useAppContextInit.d.ts +2 -0
  106. package/react/hooks/useAppContextInit.d.ts.map +1 -0
  107. package/{react-sdk-core → react}/hooks/useAppContextInit.js +18 -2
  108. package/{react-sdk-core → react}/index.js +1 -1
  109. package/react/services/BaseNavigationService.d.ts.map +1 -0
  110. package/{react-sdk-core → react}/services/BaseNavigationService.js +4 -0
  111. package/{react-sdk-core → react}/version.d.ts.map +1 -1
  112. package/react/version.js +3 -0
  113. package/{react-sdk-core → react}/vite/smeCoreStringsPlugin.d.ts +1 -1
  114. package/{react-sdk-core → react}/vite/smeCoreStringsPlugin.js +1 -1
  115. package/{react-sdk-core → react}/vite/smeManifestResourcesPlugin.d.ts +1 -1
  116. package/{react-sdk-core → react}/vite/smeManifestResourcesPlugin.js +1 -1
  117. package/{react-sdk-core → react}/vite/smePowerShellPlugin.d.ts +1 -1
  118. package/{react-sdk-core → react}/vite/smePowerShellPlugin.js +1 -1
  119. package/styles/css/main-v2.css +1 -1
  120. package/styles/package.json +1 -1
  121. package/wac-cli/dist/angular20/configs/ci-build-yml-config.js +3 -2
  122. package/wac-cli/dist/angular20/configs/ci-build-yml-config.js.map +1 -1
  123. package/wac-cli/dist/angular20/upgrader/nvmrc-engines-upgrader.js +2 -2
  124. package/wac-cli/dist/create-react/main.js +3 -2
  125. package/wac-cli/dist/create-react/main.js.map +1 -1
  126. package/wac-cli/module-template/build/pipelines/ci-build.yml +2 -2
  127. package/wac-cli/module-template/build/pipelines/pull-request.yml +2 -2
  128. package/wac-cli/templates/internal/main.ts +2 -2
  129. package/wac-cli/templates/internal/package.json +26 -14
  130. package/wac-cli/templates/react-template/package.json +3 -2
  131. package/wac-cli/templates/react-template/src/App.tsx +1 -1
  132. package/wac-cli/templates/react-template/src/hooks/useServicesData.ts +1 -1
  133. package/wac-cli/templates/react-template/vite.config.ts +1 -1
  134. package/wac-cli/templates/wac-template/angular.json +8 -13
  135. package/wac-cli/templates/wac-template/package.json +26 -14
  136. package/wac-cli/templates/wac-template/src/main.ts +2 -2
  137. package/react-sdk-core/hooks/useAppContextInit.d.ts.map +0 -1
  138. package/react-sdk-core/services/BaseNavigationService.d.ts.map +0 -1
  139. package/react-sdk-core/version.js +0 -3
  140. /package/{react-sdk-core → react}/components/SplashScreen.d.ts +0 -0
  141. /package/{react-sdk-core → react}/components/SplashScreen.d.ts.map +0 -0
  142. /package/{react-sdk-core → react}/components/SplashScreen.js +0 -0
  143. /package/{react-sdk-core → react}/context/AppContextProvider.d.ts +0 -0
  144. /package/{react-sdk-core → react}/context/AppContextProvider.d.ts.map +0 -0
  145. /package/{react-sdk-core → react}/context/AppContextProvider.js +0 -0
  146. /package/{react-sdk-core → react}/hooks/useAppContext.d.ts +0 -0
  147. /package/{react-sdk-core → react}/hooks/useAppContext.d.ts.map +0 -0
  148. /package/{react-sdk-core → react}/hooks/useAppContext.js +0 -0
  149. /package/{react-sdk-core → react}/hooks/useSkeletonStyles.d.ts +0 -0
  150. /package/{react-sdk-core → react}/hooks/useSkeletonStyles.d.ts.map +0 -0
  151. /package/{react-sdk-core → react}/hooks/useSkeletonStyles.js +0 -0
  152. /package/{react-sdk-core → react}/hooks/useWacTheme.d.ts +0 -0
  153. /package/{react-sdk-core → react}/hooks/useWacTheme.d.ts.map +0 -0
  154. /package/{react-sdk-core → react}/hooks/useWacTheme.js +0 -0
  155. /package/{react-sdk-core → react}/index.d.ts +0 -0
  156. /package/{react-sdk-core → react}/index.d.ts.map +0 -0
  157. /package/{react-sdk-core → react}/services/AppContextService.d.ts +0 -0
  158. /package/{react-sdk-core → react}/services/AppContextService.d.ts.map +0 -0
  159. /package/{react-sdk-core → react}/services/AppContextService.js +0 -0
  160. /package/{react-sdk-core → react}/services/BaseNavigationService.d.ts +0 -0
  161. /package/{react-sdk-core → react}/services/NavigationService.d.ts +0 -0
  162. /package/{react-sdk-core → react}/services/NavigationService.d.ts.map +0 -0
  163. /package/{react-sdk-core → react}/services/NavigationService.js +0 -0
  164. /package/{react-sdk-core → react}/services/Polyfills.d.ts +0 -0
  165. /package/{react-sdk-core → react}/services/Polyfills.d.ts.map +0 -0
  166. /package/{react-sdk-core → react}/services/Polyfills.js +0 -0
  167. /package/{react-sdk-core → react}/version.d.ts +0 -0
  168. /package/{react-sdk-core → react}/vite/index.d.ts +0 -0
  169. /package/{react-sdk-core → react}/vite/index.d.ts.map +0 -0
  170. /package/{react-sdk-core → react}/vite/index.js +0 -0
  171. /package/{react-sdk-core → react}/vite/log.d.ts +0 -0
  172. /package/{react-sdk-core → react}/vite/log.d.ts.map +0 -0
  173. /package/{react-sdk-core → react}/vite/log.js +0 -0
  174. /package/{react-sdk-core → react}/vite/smeCoreStringsPlugin.d.ts.map +0 -0
  175. /package/{react-sdk-core → react}/vite/smeManifestResourcesPlugin.d.ts.map +0 -0
  176. /package/{react-sdk-core → react}/vite/smePowerShellPlugin.d.ts.map +0 -0
@@ -4,13 +4,17 @@
4
4
  */
5
5
  export declare class ManifestLoader {
6
6
  private static readonly logSourceName;
7
- private static gatewayUrl;
8
7
  private static manifestFile;
8
+ /**
9
+ * Maximum number of times the manifest fetch is retried after a transient failure.
10
+ */
11
+ private static readonly maxManifestRetries;
12
+ /**
13
+ * Base delay (ms) for the exponential backoff between manifest fetch retries.
14
+ */
15
+ private static readonly manifestRetryBaseDelayMs;
9
16
  private static deferred;
10
17
  private static internalLoaded;
11
- private static tryGetHostName;
12
- private static isLocalhostHostName;
13
- private static checkIfValidLocalHost;
14
18
  /**
15
19
  * Manifest loading promise.
16
20
  */
@@ -27,6 +31,45 @@ export declare class ManifestLoader {
27
31
  * @return Promise<any> the promise object.
28
32
  */
29
33
  private static load;
34
+ /**
35
+ * Determines whether a manifest fetch error is transient and therefore worth retrying.
36
+ * The manifest request can be aborted client-side before it reaches the network (surfacing as
37
+ * `net::ERR_CONNECTION_ABORTED` with `status: 0`, e.g. a transient connection reset while the
38
+ * iframe execution context survives) or fail with a transient gateway/relay error (>= 500).
39
+ * Those are retried. Deterministic failures — auth/RBAC/invalid requests (4xx), or non-HTTP
40
+ * errors such as a JSON parse failure on a 200 response (no `extended.status`) — are not
41
+ * retried and are propagated immediately so real failures surface without added delay.
42
+ *
43
+ * @param error the error thrown by the manifest fetch.
44
+ * @returns true if the error is transient and the fetch should be retried.
45
+ */
46
+ private static isTransientManifestError;
47
+ /**
48
+ * rxjs operator that retries the manifest fetch on transient failures using capped exponential backoff.
49
+ * Non-transient errors are re-thrown immediately so the splash screen surfaces real failures without delay.
50
+ *
51
+ * @param manifestUrl the manifest URL being fetched (for diagnostics only).
52
+ * @returns an operator that transparently retries the source on transient failures.
53
+ */
54
+ private static retryTransientManifest;
55
+ /**
56
+ * Emits a single terminal diagnostic once the manifest fetch retries are exhausted, capturing the
57
+ * last HTTP status, the redacted URL (query string / fragment stripped) and the total attempt count.
58
+ *
59
+ * @param manifestUrl the manifest URL that failed to load.
60
+ * @param error the terminal (transient) error that exhausted the retries.
61
+ * @param totalAttempts the total number of fetch attempts made, including the initial request.
62
+ */
63
+ private static logManifestFetchExhausted;
64
+ /**
65
+ * Redacts a URL for diagnostics by keeping only the origin and path, dropping any query string or
66
+ * fragment that may carry tokens or other secrets. Falls back to stripping everything after the
67
+ * first `?` / `#` for relative URLs that cannot be parsed as absolute.
68
+ *
69
+ * @param specifiedUrl the URL to redact.
70
+ * @returns the redacted URL safe for logging.
71
+ */
72
+ private static redactUrl;
30
73
  /**
31
74
  * Merges the GatewayUrl manifest with the passed in shell manifest
32
75
  * Merges modules only at this time with a preference for modules included in the shell
@@ -42,12 +85,5 @@ export declare class ManifestLoader {
42
85
  * Update the environment by the manifest.
43
86
  */
44
87
  private static update;
45
- /**
46
- * WAC in Portal URLs take the form <abc.def.location.waconazure.com:1234> or <abc.def.location.arc.waconazure.com:1234>, validate URL if WAC is hosted in portal.
47
- * Returns false unless WAC is currently hosted in the portal and the gateway URL is a valid in-portal host.
48
- * @param gatewayUrlParam the gatewayUrl parameter from the URL
49
- * @returns true only if WAC is currently hosted in the portal and the gateway URL is a valid in-portal host, false otherwise
50
- */
51
- private static checkIfValidInPortal;
52
88
  }
53
89
  //# sourceMappingURL=manifest-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest-loader.d.ts","sourceRoot":"","sources":["../../src/manifest/manifest-loader.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAoB;IACzD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAgB;IACzC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAmB;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwB;IAC/C,OAAO,CAAC,MAAM,CAAC,cAAc,CAAkD;IAE/E,OAAO,CAAC,MAAM,CAAC,cAAc;IAc7B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAKlC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IASpC;;OAEG;IACH,IAAW,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjC;IAED;;OAEG;WACW,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC3C;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,IAAI;IAwGnB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IA+CnC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAiCrC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,MAAM;IAuBrB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;CActC"}
1
+ {"version":3,"file":"manifest-loader.d.ts","sourceRoot":"","sources":["../../src/manifest/manifest-loader.ts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAoB;IACzD,OAAO,CAAC,MAAM,CAAC,YAAY,CAAmB;IAE9C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAK;IAE/C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAO;IAEvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwB;IAC/C,OAAO,CAAC,MAAM,CAAC,cAAc,CAAkD;IAE/E;;OAEG;IACH,IAAW,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjC;IAED;;OAEG;WACW,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC3C;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,IAAI;IA+GnB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAQvC;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAqCrC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAYxC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IASxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IA+CnC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAiCrC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,MAAM;CAsBxB"}
@@ -1,44 +1,29 @@
1
- import { forkJoin, of } from 'rxjs';
2
- import { catchError, map, mergeMap } from 'rxjs/operators';
1
+ import { defer, forkJoin, of, throwError, timer } from 'rxjs';
2
+ import { catchError, map, mergeMap, retry } from 'rxjs/operators';
3
3
  import { ErrorExtended } from '../data/error-extended';
4
4
  import { NativeQ } from '../data/native-q';
5
5
  import { LogLevel } from '../diagnostics/log-level';
6
6
  import { Logging } from '../diagnostics/logging';
7
7
  import { HostCoreManager, HostCoreTokenMode } from '../host/host-core-manager';
8
8
  import { EnvironmentModule } from './environment-modules';
9
+ import { GatewayUrlValidationError, isPortalGatewayUrl, validateGatewayUrlParameter } from './gateway-url-validator';
9
10
  /**
10
11
  * The Manifest service class.
11
12
  * (Localized string cannot be used in this class due to initialization phase when the strings are not ready yet.)
12
13
  */
13
14
  export class ManifestLoader {
14
15
  static logSourceName = 'ManifestLoader';
15
- static gatewayUrl = 'gatewayUrl';
16
16
  static manifestFile = 'manifest.json';
17
+ /**
18
+ * Maximum number of times the manifest fetch is retried after a transient failure.
19
+ */
20
+ static maxManifestRetries = 3;
21
+ /**
22
+ * Base delay (ms) for the exponential backoff between manifest fetch retries.
23
+ */
24
+ static manifestRetryBaseDelayMs = 500;
17
25
  static deferred = NativeQ.defer();
18
26
  static internalLoaded = ManifestLoader.deferred.promise;
19
- static tryGetHostName(specifiedUrl) {
20
- try {
21
- const url = new URL(specifiedUrl);
22
- if (url.protocol !== 'http:' && url.protocol !== 'https:') {
23
- return null;
24
- }
25
- return url.hostname || null;
26
- }
27
- catch {
28
- return null;
29
- }
30
- }
31
- static isLocalhostHostName(hostName) {
32
- const lowerHost = hostName.toLowerCase();
33
- return lowerHost === 'localhost' || lowerHost === '127.0.0.1' || lowerHost === '::1';
34
- }
35
- static checkIfValidLocalHost(gatewayUrlParam) {
36
- const host = ManifestLoader.tryGetHostName(gatewayUrlParam);
37
- if (!host) {
38
- return false;
39
- }
40
- return ManifestLoader.isLocalhostHostName(host);
41
- }
42
27
  /**
43
28
  * Manifest loading promise.
44
29
  */
@@ -90,26 +75,33 @@ export class ManifestLoader {
90
75
  ManifestLoader.update(manifest, null);
91
76
  return ManifestLoader.internalLoaded;
92
77
  }
93
- const gatewayUrlParam = MsftSme.getLocationSearchParameter(ManifestLoader.gatewayUrl);
78
+ const isProduction = MsftSme.self().Init.isProduction !== false;
79
+ const productionWithoutSideloading = isProduction && Object.keys(MsftSme.sideLoad()).length === 0;
80
+ const gatewayUrlValidation = validateGatewayUrlParameter({
81
+ enforceTrustedHosts: isProduction,
82
+ isHostedInPortal: EnvironmentModule.isHostedInPortal
83
+ });
84
+ const gatewayUrlParam = gatewayUrlValidation.value ? { value: gatewayUrlValidation.value } : null;
94
85
  let manifestUrl = ManifestLoader.manifestFile;
95
- if (gatewayUrlParam && MsftSme.self().Init.isProduction && Object.keys(MsftSme.sideLoad()).length === 0) {
96
- const validPortalUrl = ManifestLoader.checkIfValidInPortal(gatewayUrlParam.value);
97
- const validLocalHostUrl = ManifestLoader.checkIfValidLocalHost(gatewayUrlParam.value);
98
- if (validPortalUrl) {
99
- // use the gateway endpoint for manifest source.
100
- manifestUrl = `${gatewayUrlParam.value}/${ManifestLoader.manifestFile}`;
101
- }
102
- if (!validPortalUrl && !validLocalHostUrl) {
103
- const errorExtended = new ErrorExtended(`The gatewayUrl parameter includes an unrecognized or invalid host. Invalid gateway URL ${gatewayUrlParam.value}.`);
104
- errorExtended.extendedSource = ErrorExtended.sources.getNoCache;
105
- errorExtended.extended = { status: 400, url: gatewayUrlParam.value };
106
- ManifestLoader.deferred.reject(errorExtended);
107
- return ManifestLoader.internalLoaded;
108
- }
86
+ if (gatewayUrlValidation.error) {
87
+ const message = gatewayUrlValidation.error === GatewayUrlValidationError.Duplicate
88
+ ? 'The gatewayUrl parameter must not be specified more than once.'
89
+ : 'The gatewayUrl parameter includes an unrecognized or invalid host.';
90
+ const errorExtended = new ErrorExtended(message);
91
+ errorExtended.extendedSource = ErrorExtended.sources.getNoCache;
92
+ errorExtended.extended = { status: 400 };
93
+ ManifestLoader.deferred.reject(errorExtended);
94
+ return ManifestLoader.internalLoaded;
95
+ }
96
+ if (gatewayUrlParam && productionWithoutSideloading && EnvironmentModule.isHostedInPortal && isPortalGatewayUrl(gatewayUrlParam.value)) {
97
+ // use the gateway endpoint for manifest source.
98
+ manifestUrl = `${gatewayUrlParam.value}/${ManifestLoader.manifestFile}`;
109
99
  }
110
- hostCoreManager
111
- .httpGet(manifestUrl)
112
- .pipe(mergeMap(result => ManifestLoader.mergeGatewayManifest(hostCoreManager, result.response)), mergeMap(shellManifest => {
100
+ // Rebuild the request per (re)subscription via `defer` so a retry re-evaluates HostCoreManager's
101
+ // cached-token guard (returning the already-acquired AAD token) instead of re-running the parent
102
+ // token handshake, which could otherwise time out and turn a retryable abort into a hard 403.
103
+ defer(() => hostCoreManager.httpGet(manifestUrl))
104
+ .pipe(ManifestLoader.retryTransientManifest(manifestUrl), mergeMap(result => ManifestLoader.mergeGatewayManifest(hostCoreManager, result.response)), mergeMap(shellManifest => {
113
105
  const response = shellManifest;
114
106
  if (response.modules) {
115
107
  return ManifestLoader.fetchSideloadManifests(hostCoreManager).pipe(map(sideLoads => {
@@ -171,23 +163,118 @@ export class ManifestLoader {
171
163
  });
172
164
  return ManifestLoader.internalLoaded;
173
165
  }
166
+ /**
167
+ * Determines whether a manifest fetch error is transient and therefore worth retrying.
168
+ * The manifest request can be aborted client-side before it reaches the network (surfacing as
169
+ * `net::ERR_CONNECTION_ABORTED` with `status: 0`, e.g. a transient connection reset while the
170
+ * iframe execution context survives) or fail with a transient gateway/relay error (>= 500).
171
+ * Those are retried. Deterministic failures — auth/RBAC/invalid requests (4xx), or non-HTTP
172
+ * errors such as a JSON parse failure on a 200 response (no `extended.status`) — are not
173
+ * retried and are propagated immediately so real failures surface without added delay.
174
+ *
175
+ * @param error the error thrown by the manifest fetch.
176
+ * @returns true if the error is transient and the fetch should be retried.
177
+ */
178
+ static isTransientManifestError(error) {
179
+ const status = error?.extended?.status;
180
+ // status 0 => request aborted/blocked before it hit the network (transient connection reset/drop).
181
+ // >= 500 => transient server/relay failure.
182
+ return status === 0 || status >= 500;
183
+ }
184
+ /**
185
+ * rxjs operator that retries the manifest fetch on transient failures using capped exponential backoff.
186
+ * Non-transient errors are re-thrown immediately so the splash screen surfaces real failures without delay.
187
+ *
188
+ * @param manifestUrl the manifest URL being fetched (for diagnostics only).
189
+ * @returns an operator that transparently retries the source on transient failures.
190
+ */
191
+ static retryTransientManifest(manifestUrl) {
192
+ return (source) => {
193
+ // Total fetch attempts made so far, starting at 1 for the initial (pre-retry) request.
194
+ let totalAttempts = 1;
195
+ return source.pipe(retry({
196
+ count: ManifestLoader.maxManifestRetries,
197
+ delay: (error, retryCount) => {
198
+ if (!ManifestLoader.isTransientManifestError(error)) {
199
+ return throwError(() => error);
200
+ }
201
+ // Scheduling retry #retryCount means we're about to make attempt (retryCount + 1).
202
+ totalAttempts = retryCount + 1;
203
+ const backoffMs = ManifestLoader.manifestRetryBaseDelayMs * Math.pow(2, retryCount - 1);
204
+ Logging.log({
205
+ source: ManifestLoader.logSourceName,
206
+ level: LogLevel.Warning,
207
+ consoleGroupHeader: `Retrying manifest load (attempt ${retryCount} of ${ManifestLoader.maxManifestRetries}).`,
208
+ message: `Transient failure loading "${manifestUrl}"; retrying in ${backoffMs} ms.`
209
+ });
210
+ return timer(backoffMs);
211
+ }
212
+ }), catchError((error) => {
213
+ // Only a transient error reaching this point means every retry was exhausted; a
214
+ // non-transient error is re-thrown by `delay` before any retry, so it must not be
215
+ // reported as exhaustion. Emit one final summary with status, redacted URL and count.
216
+ if (ManifestLoader.isTransientManifestError(error)) {
217
+ ManifestLoader.logManifestFetchExhausted(manifestUrl, error, totalAttempts);
218
+ }
219
+ return throwError(() => error);
220
+ }));
221
+ };
222
+ }
223
+ /**
224
+ * Emits a single terminal diagnostic once the manifest fetch retries are exhausted, capturing the
225
+ * last HTTP status, the redacted URL (query string / fragment stripped) and the total attempt count.
226
+ *
227
+ * @param manifestUrl the manifest URL that failed to load.
228
+ * @param error the terminal (transient) error that exhausted the retries.
229
+ * @param totalAttempts the total number of fetch attempts made, including the initial request.
230
+ */
231
+ static logManifestFetchExhausted(manifestUrl, error, totalAttempts) {
232
+ const status = error?.extended?.status;
233
+ const statusText = status === undefined ? 'unknown' : `${status}`;
234
+ const redactedUrl = ManifestLoader.redactUrl(manifestUrl);
235
+ Logging.log({
236
+ source: ManifestLoader.logSourceName,
237
+ level: LogLevel.Error,
238
+ consoleGroupHeader: `Manifest load failed after ${totalAttempts} attempts (status ${statusText}).`,
239
+ message: `Giving up loading manifest "${redactedUrl}" after ${totalAttempts} attempts; last status ${statusText}.`
240
+ });
241
+ }
242
+ /**
243
+ * Redacts a URL for diagnostics by keeping only the origin and path, dropping any query string or
244
+ * fragment that may carry tokens or other secrets. Falls back to stripping everything after the
245
+ * first `?` / `#` for relative URLs that cannot be parsed as absolute.
246
+ *
247
+ * @param specifiedUrl the URL to redact.
248
+ * @returns the redacted URL safe for logging.
249
+ */
250
+ static redactUrl(specifiedUrl) {
251
+ try {
252
+ const url = new URL(specifiedUrl);
253
+ return `${url.origin}${url.pathname}`;
254
+ }
255
+ catch {
256
+ return specifiedUrl.split(/[?#]/)[0];
257
+ }
258
+ }
174
259
  /**
175
260
  * Merges the GatewayUrl manifest with the passed in shell manifest
176
261
  * Merges modules only at this time with a preference for modules included in the shell
177
262
  */
178
263
  static mergeGatewayManifest(hostCoreManager, shellManifest) {
264
+ const isProduction = MsftSme.self().Init.isProduction !== false;
179
265
  // it's production mode and no side-loading omits calling manifest.json again.
180
- if (MsftSme.self().Init.isProduction && Object.keys(MsftSme.sideLoad()).length === 0) {
266
+ if (isProduction && Object.keys(MsftSme.sideLoad()).length === 0) {
181
267
  return of(shellManifest);
182
268
  }
183
- const gatewayUrlParam = MsftSme.getLocationSearchParameter(ManifestLoader.gatewayUrl);
184
- // Production code should accept limited sideloading cases: only recognized in-portal or localhost gateways.
185
- const isValidSideloadUrl = !!gatewayUrlParam &&
186
- (!MsftSme.self().Init.isProduction || ManifestLoader.checkIfValidInPortal(gatewayUrlParam.value) || ManifestLoader.checkIfValidLocalHost(gatewayUrlParam.value));
187
- if (!isValidSideloadUrl) {
269
+ const gatewayUrlValidation = validateGatewayUrlParameter({
270
+ enforceTrustedHosts: isProduction,
271
+ isHostedInPortal: EnvironmentModule.isHostedInPortal
272
+ });
273
+ const validatedGatewayUrl = gatewayUrlValidation.value;
274
+ if (!validatedGatewayUrl || gatewayUrlValidation.error) {
188
275
  return of(shellManifest);
189
276
  }
190
- return hostCoreManager.getNoCache(`${gatewayUrlParam.value}/${ManifestLoader.manifestFile}`, false, 'json').pipe(map(result => {
277
+ return hostCoreManager.getNoCache(`${validatedGatewayUrl}/${ManifestLoader.manifestFile}`, false, 'json').pipe(map(result => {
191
278
  const gatewayManifest = result.response;
192
279
  if (Array.isArray(gatewayManifest.modules)) {
193
280
  if (!Array.isArray(shellManifest.modules)) {
@@ -195,7 +282,7 @@ export class ManifestLoader {
195
282
  }
196
283
  else {
197
284
  gatewayManifest.modules.forEach(mod => {
198
- mod.origin = gatewayUrlParam.value;
285
+ mod.origin = validatedGatewayUrl;
199
286
  const foundIndex = shellManifest.modules.findIndex(item => item.name === mod.name);
200
287
  if (foundIndex === -1) {
201
288
  shellManifest.modules.push(mod);
@@ -209,8 +296,8 @@ export class ManifestLoader {
209
296
  Logging.log({
210
297
  source: ManifestLoader.logSourceName,
211
298
  level: LogLevel.Warning,
212
- consoleGroupHeader: `Unable to load gateway manifest: "${gatewayUrlParam.value}".`,
213
- message: `Cannot load ${gatewayUrlParam.value}. Please make sure that a manifest.json is available at this location.`
299
+ consoleGroupHeader: `Unable to load gateway manifest: "${validatedGatewayUrl}".`,
300
+ message: `Cannot load ${validatedGatewayUrl}. Please make sure that a manifest.json is available at this location.`
214
301
  });
215
302
  return of(shellManifest);
216
303
  }));
@@ -270,23 +357,5 @@ export class ManifestLoader {
270
357
  throw new Error(message);
271
358
  }
272
359
  }
273
- /**
274
- * WAC in Portal URLs take the form <abc.def.location.waconazure.com:1234> or <abc.def.location.arc.waconazure.com:1234>, validate URL if WAC is hosted in portal.
275
- * Returns false unless WAC is currently hosted in the portal and the gateway URL is a valid in-portal host.
276
- * @param gatewayUrlParam the gatewayUrl parameter from the URL
277
- * @returns true only if WAC is currently hosted in the portal and the gateway URL is a valid in-portal host, false otherwise
278
- */
279
- static checkIfValidInPortal(gatewayUrlParam) {
280
- if (!EnvironmentModule.isHostedInPortal) {
281
- return false;
282
- }
283
- const hostName = ManifestLoader.tryGetHostName(gatewayUrlParam);
284
- if (!hostName) {
285
- return false;
286
- }
287
- // Expect host names of the form <abc.def.location.waconazure.com> or <abc.def.location.arc.waconazure.com>
288
- // Only validate the suffix strictly; allow flexibility in the leading names.
289
- return hostName.toLocaleLowerCase().endsWith('.arc.waconazure.com') || hostName.toLocaleLowerCase().endsWith('.waconazure.com');
290
- }
291
360
  }
292
361
  //# sourceMappingURL=manifest-loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest-loader.js","sourceRoot":"","sources":["../../src/manifest/manifest-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import { forkJoin, Observable, of } from 'rxjs';\r\nimport { catchError, map, mergeMap } from 'rxjs/operators';\r\nimport { ErrorExtended } from '../data/error-extended';\r\nimport { NativeQ } from '../data/native-q';\r\nimport { LogLevel } from '../diagnostics/log-level';\r\nimport { LogRecord } from '../diagnostics/log-record';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { HostCoreManager, HostCoreTokenMode } from '../host/host-core-manager';\r\nimport { SignedHttpRequestToken } from '../security/sign-on-manager';\r\nimport { EnvironmentModule } from './environment-modules';\r\n\r\n/**\r\n * The Manifest service class.\r\n * (Localized string cannot be used in this class due to initialization phase when the strings are not ready yet.)\r\n */\r\nexport class ManifestLoader {\r\n private static readonly logSourceName = 'ManifestLoader';\r\n private static gatewayUrl = 'gatewayUrl';\r\n private static manifestFile = 'manifest.json';\r\n private static deferred = NativeQ.defer<any>();\r\n private static internalLoaded: Promise<void> = ManifestLoader.deferred.promise;\r\n\r\n private static tryGetHostName(specifiedUrl: string): string | null {\r\n try {\r\n const url = new URL(specifiedUrl);\r\n\r\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\r\n return null;\r\n }\r\n\r\n return url.hostname || null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private static isLocalhostHostName(hostName: string): boolean {\r\n const lowerHost = hostName.toLowerCase();\r\n return lowerHost === 'localhost' || lowerHost === '127.0.0.1' || lowerHost === '::1';\r\n }\r\n\r\n private static checkIfValidLocalHost(gatewayUrlParam: string): boolean {\r\n const host = ManifestLoader.tryGetHostName(gatewayUrlParam);\r\n if (!host) {\r\n return false;\r\n }\r\n\r\n return ManifestLoader.isLocalhostHostName(host);\r\n }\r\n\r\n /**\r\n * Manifest loading promise.\r\n */\r\n public get loaded(): Promise<void> {\r\n return ManifestLoader.internalLoaded;\r\n }\r\n\r\n /**\r\n * Load the manifest.\r\n */\r\n public static loadManifest(): Promise<void> {\r\n const self = MsftSme.self();\r\n const mode: MsftSme.EnvironmentMode = self.Init ? self.Init.mode : MsftSme.EnvironmentMode.NotUse;\r\n const hostCoreManager = new HostCoreManager();\r\n switch (mode) {\r\n case MsftSme.EnvironmentMode.NotUse:\r\n // Turn OFF iframe feature.\r\n ManifestLoader.deferred.reject('no iFrame');\r\n break;\r\n case MsftSme.EnvironmentMode.LoadEmbedded:\r\n // JSON file posting by module iframe.\r\n const manifest: any = {\r\n name: self.Init.moduleName,\r\n version: self.Init.moduleVersion,\r\n signature: EnvironmentModule.defaultSignature,\r\n shell: {\r\n name: EnvironmentModule.nameOfShell,\r\n origin: self.Init.shellOrigin\r\n }\r\n };\r\n\r\n // Turn ON module self-loading.\r\n ManifestLoader.load(hostCoreManager, manifest);\r\n break;\r\n case MsftSme.EnvironmentMode.Load:\r\n // Turn ON iframe feature by Shell and Module.\r\n ManifestLoader.load(hostCoreManager);\r\n break;\r\n }\r\n\r\n return ManifestLoader.internalLoaded;\r\n }\r\n\r\n /**\r\n * Load the manifest into the MsftSme.Environment.\r\n *\r\n * @param hostCoreManager the hostCoreManager object to load the manifest.\r\n * @param manifest the self loading manifest.\r\n * @return Promise<any> the promise object.\r\n */\r\n private static load(hostCoreManager: HostCoreManager, manifest?: any): Promise<any> {\r\n if (manifest) {\r\n ManifestLoader.update(manifest, null);\r\n return ManifestLoader.internalLoaded;\r\n }\r\n\r\n const gatewayUrlParam = MsftSme.getLocationSearchParameter(ManifestLoader.gatewayUrl);\r\n\r\n let manifestUrl = ManifestLoader.manifestFile;\r\n if (gatewayUrlParam && MsftSme.self().Init.isProduction && Object.keys(MsftSme.sideLoad()).length === 0) {\r\n const validPortalUrl = ManifestLoader.checkIfValidInPortal(gatewayUrlParam.value);\r\n const validLocalHostUrl = ManifestLoader.checkIfValidLocalHost(gatewayUrlParam.value);\r\n if (validPortalUrl) {\r\n // use the gateway endpoint for manifest source.\r\n manifestUrl = `${gatewayUrlParam.value}/${ManifestLoader.manifestFile}`;\r\n }\r\n\r\n if (!validPortalUrl && !validLocalHostUrl) {\r\n const errorExtended = new ErrorExtended<{ status: number; url: string }>(\r\n `The gatewayUrl parameter includes an unrecognized or invalid host. Invalid gateway URL ${gatewayUrlParam.value}.`\r\n );\r\n errorExtended.extendedSource = ErrorExtended.sources.getNoCache;\r\n errorExtended.extended = { status: 400, url: gatewayUrlParam.value };\r\n ManifestLoader.deferred.reject(errorExtended);\r\n return ManifestLoader.internalLoaded;\r\n }\r\n }\r\n\r\n hostCoreManager\r\n .httpGet(manifestUrl)\r\n .pipe(\r\n mergeMap(result => ManifestLoader.mergeGatewayManifest(hostCoreManager, result.response)),\r\n mergeMap(shellManifest => {\r\n const response = shellManifest;\r\n if (response.modules) {\r\n return ManifestLoader.fetchSideloadManifests(hostCoreManager).pipe(\r\n map(sideLoads => {\r\n const sideloadShellOrigins: string[] = [];\r\n\r\n sideLoads = sideLoads.filter(s => {\r\n if (MsftSme.isNullOrUndefined(s)) {\r\n return false;\r\n }\r\n\r\n const isShell = s.name === EnvironmentModule.nameOfShell;\r\n if (isShell) {\r\n sideloadShellOrigins.push(s.origin);\r\n }\r\n return !isShell;\r\n });\r\n\r\n if (sideloadShellOrigins.length > 0) {\r\n Logging.log(<LogRecord>{\r\n source: ManifestLoader.logSourceName,\r\n level: LogLevel.Warning,\r\n consoleGroupHeader: `Unable to sideload: \"${sideloadShellOrigins}\".`,\r\n message: `Cannot sideload ${EnvironmentModule.nameOfShell} from ${sideloadShellOrigins}.\r\n Did you mean to run ${EnvironmentModule.nameOfShell} locally?`\r\n });\r\n }\r\n return { manifest: response, sideLoads: sideLoads };\r\n })\r\n );\r\n }\r\n\r\n return of({ manifest: response, sideLoads: [] });\r\n })\r\n )\r\n .subscribe({\r\n next: result => {\r\n const manifestResult = <MsftSme.MsftSmeEnvironment>result.manifest;\r\n const modules = manifestResult.modules;\r\n const selfInit = MsftSme.self().Init;\r\n selfInit.shellVersion = manifestResult.version;\r\n selfInit.gatewayApiVersion = manifestResult.gatewayApiVersion;\r\n selfInit.gatewayPlatform = manifestResult.gatewayPlatform;\r\n result.sideLoads.forEach(sideLoad => {\r\n if (sideLoad) {\r\n sideLoad.isSideLoaded = true;\r\n const foundIndex = modules.findIndex(item => item.name === sideLoad.name);\r\n if (foundIndex >= 0) {\r\n modules.splice(foundIndex, 1, sideLoad);\r\n } else {\r\n modules.push(sideLoad);\r\n }\r\n }\r\n });\r\n\r\n ManifestLoader.update(result.manifest, hostCoreManager.token);\r\n },\r\n error: error => {\r\n // communicate main.ts for error message.\r\n const extendedError = <ErrorExtended<any>>error;\r\n if (hostCoreManager.tokenMode === HostCoreTokenMode.Aad) {\r\n extendedError.extendedSource = ErrorExtended.sources.aadSso;\r\n }\r\n\r\n ManifestLoader.deferred.reject(error);\r\n }\r\n });\r\n\r\n return ManifestLoader.internalLoaded;\r\n }\r\n\r\n /**\r\n * Merges the GatewayUrl manifest with the passed in shell manifest\r\n * Merges modules only at this time with a preference for modules included in the shell\r\n */\r\n private static mergeGatewayManifest(hostCoreManager: HostCoreManager, shellManifest: any): Observable<any> {\r\n // it's production mode and no side-loading omits calling manifest.json again.\r\n if (MsftSme.self().Init.isProduction && Object.keys(MsftSme.sideLoad()).length === 0) {\r\n return of(shellManifest);\r\n }\r\n\r\n const gatewayUrlParam = MsftSme.getLocationSearchParameter(ManifestLoader.gatewayUrl);\r\n\r\n // Production code should accept limited sideloading cases: only recognized in-portal or localhost gateways.\r\n const isValidSideloadUrl =\r\n !!gatewayUrlParam &&\r\n (!MsftSme.self().Init.isProduction || ManifestLoader.checkIfValidInPortal(gatewayUrlParam.value) || ManifestLoader.checkIfValidLocalHost(gatewayUrlParam.value));\r\n if (!isValidSideloadUrl) {\r\n return of(shellManifest);\r\n }\r\n\r\n return hostCoreManager.getNoCache(`${gatewayUrlParam.value}/${ManifestLoader.manifestFile}`, false, 'json').pipe(\r\n map(result => {\r\n const gatewayManifest = result.response;\r\n if (Array.isArray(gatewayManifest.modules)) {\r\n if (!Array.isArray(shellManifest.modules)) {\r\n shellManifest.modules = gatewayManifest.modules;\r\n } else {\r\n gatewayManifest.modules.forEach(mod => {\r\n mod.origin = gatewayUrlParam.value;\r\n const foundIndex = shellManifest.modules.findIndex(item => item.name === mod.name);\r\n if (foundIndex === -1) {\r\n shellManifest.modules.push(mod);\r\n }\r\n });\r\n }\r\n }\r\n return shellManifest;\r\n }),\r\n catchError(() => {\r\n // no localization\r\n Logging.log(<LogRecord>{\r\n source: ManifestLoader.logSourceName,\r\n level: LogLevel.Warning,\r\n consoleGroupHeader: `Unable to load gateway manifest: \"${gatewayUrlParam.value}\".`,\r\n message: `Cannot load ${gatewayUrlParam.value}. Please make sure that a manifest.json is available at this location.`\r\n });\r\n return of(shellManifest);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * retrieves all of the side loaded manifests.\r\n *\r\n * @return Observable<any[]> the manifests.\r\n */\r\n private static fetchSideloadManifests(hostCoreManager: HostCoreManager): Observable<any[]> {\r\n const sideLoadList = MsftSme.sideLoad();\r\n if (Object.keys(sideLoadList).length === 0) {\r\n return of([]);\r\n }\r\n\r\n const sideLoadManifestAwaiters: Observable<any>[] = [];\r\n MsftSme.forEachKey<MsftSme.SideLoad>(sideLoadList, (key, sideLoad) => {\r\n sideLoadManifestAwaiters.push(\r\n // don't send credentials when debugging a side-loading module.\r\n hostCoreManager.getNoCache(`${sideLoad.origin}/${ManifestLoader.manifestFile}`, false, 'json', false).pipe(\r\n map(result => {\r\n const manifest = result.response;\r\n manifest.origin = sideLoad.origin;\r\n return manifest;\r\n }),\r\n catchError(() => {\r\n // no localization\r\n Logging.log(<LogRecord>{\r\n source: ManifestLoader.logSourceName,\r\n level: LogLevel.Warning,\r\n consoleGroupHeader: `Unable to sideload: \"${sideLoad.origin}\".`,\r\n message: `Cannot sideload ${sideLoad.origin}. Please make sure that an extension is running at this origin.`\r\n });\r\n return of(null);\r\n })\r\n )\r\n );\r\n });\r\n\r\n return forkJoin(sideLoadManifestAwaiters);\r\n }\r\n\r\n /**\r\n * Update the environment by the manifest.\r\n */\r\n private static update(manifest: any, token: SignedHttpRequestToken): void {\r\n try {\r\n const self = MsftSme.self();\r\n if (token) {\r\n // store the last token if exists.\r\n if (!manifest.configuration) {\r\n manifest.configuration = {};\r\n }\r\n\r\n // passed the signOn objec to GatewayConnection object to configure into the SignOnManager.\r\n manifest.configuration.signOn = { signedHttpRequestToken: token };\r\n }\r\n\r\n self.Environment = EnvironmentModule.createEnvironment(manifest, self.Resources.localeId);\r\n ManifestLoader.deferred.resolve();\r\n } catch (e) {\r\n // no localization\r\n const message = 'Unable to load the manifest: {0}'.format(e);\r\n ManifestLoader.deferred.reject(message);\r\n throw new Error(message);\r\n }\r\n }\r\n\r\n /**\r\n * WAC in Portal URLs take the form <abc.def.location.waconazure.com:1234> or <abc.def.location.arc.waconazure.com:1234>, validate URL if WAC is hosted in portal.\r\n * Returns false unless WAC is currently hosted in the portal and the gateway URL is a valid in-portal host.\r\n * @param gatewayUrlParam the gatewayUrl parameter from the URL\r\n * @returns true only if WAC is currently hosted in the portal and the gateway URL is a valid in-portal host, false otherwise\r\n */\r\n private static checkIfValidInPortal(gatewayUrlParam: string): boolean {\r\n if (!EnvironmentModule.isHostedInPortal) {\r\n return false;\r\n }\r\n\r\n const hostName = ManifestLoader.tryGetHostName(gatewayUrlParam);\r\n if (!hostName) {\r\n return false;\r\n }\r\n\r\n // Expect host names of the form <abc.def.location.waconazure.com> or <abc.def.location.arc.waconazure.com>\r\n // Only validate the suffix strictly; allow flexibility in the leading names.\r\n return hostName.toLocaleLowerCase().endsWith('.arc.waconazure.com') || hostName.toLocaleLowerCase().endsWith('.waconazure.com');\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"manifest-loader.js","sourceRoot":"","sources":["../../src/manifest/manifest-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import { defer, forkJoin, MonoTypeOperatorFunction, Observable, of, throwError, timer } from 'rxjs';\r\nimport { catchError, map, mergeMap, retry } from 'rxjs/operators';\r\nimport { ErrorExtended } from '../data/error-extended';\r\nimport { NativeQ } from '../data/native-q';\r\nimport { LogLevel } from '../diagnostics/log-level';\r\nimport { LogRecord } from '../diagnostics/log-record';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { HostCoreManager, HostCoreTokenMode } from '../host/host-core-manager';\r\nimport { SignedHttpRequestToken } from '../security/sign-on-manager';\r\nimport { EnvironmentModule } from './environment-modules';\r\nimport { GatewayUrlValidationError, isPortalGatewayUrl, validateGatewayUrlParameter } from './gateway-url-validator';\r\n\r\n/**\r\n * The Manifest service class.\r\n * (Localized string cannot be used in this class due to initialization phase when the strings are not ready yet.)\r\n */\r\nexport class ManifestLoader {\r\n private static readonly logSourceName = 'ManifestLoader';\r\n private static manifestFile = 'manifest.json';\r\n\r\n /**\r\n * Maximum number of times the manifest fetch is retried after a transient failure.\r\n */\r\n private static readonly maxManifestRetries = 3;\r\n\r\n /**\r\n * Base delay (ms) for the exponential backoff between manifest fetch retries.\r\n */\r\n private static readonly manifestRetryBaseDelayMs = 500;\r\n\r\n private static deferred = NativeQ.defer<any>();\r\n private static internalLoaded: Promise<void> = ManifestLoader.deferred.promise;\r\n\r\n /**\r\n * Manifest loading promise.\r\n */\r\n public get loaded(): Promise<void> {\r\n return ManifestLoader.internalLoaded;\r\n }\r\n\r\n /**\r\n * Load the manifest.\r\n */\r\n public static loadManifest(): Promise<void> {\r\n const self = MsftSme.self();\r\n const mode: MsftSme.EnvironmentMode = self.Init ? self.Init.mode : MsftSme.EnvironmentMode.NotUse;\r\n const hostCoreManager = new HostCoreManager();\r\n switch (mode) {\r\n case MsftSme.EnvironmentMode.NotUse:\r\n // Turn OFF iframe feature.\r\n ManifestLoader.deferred.reject('no iFrame');\r\n break;\r\n case MsftSme.EnvironmentMode.LoadEmbedded:\r\n // JSON file posting by module iframe.\r\n const manifest: any = {\r\n name: self.Init.moduleName,\r\n version: self.Init.moduleVersion,\r\n signature: EnvironmentModule.defaultSignature,\r\n shell: {\r\n name: EnvironmentModule.nameOfShell,\r\n origin: self.Init.shellOrigin\r\n }\r\n };\r\n\r\n // Turn ON module self-loading.\r\n ManifestLoader.load(hostCoreManager, manifest);\r\n break;\r\n case MsftSme.EnvironmentMode.Load:\r\n // Turn ON iframe feature by Shell and Module.\r\n ManifestLoader.load(hostCoreManager);\r\n break;\r\n }\r\n\r\n return ManifestLoader.internalLoaded;\r\n }\r\n\r\n /**\r\n * Load the manifest into the MsftSme.Environment.\r\n *\r\n * @param hostCoreManager the hostCoreManager object to load the manifest.\r\n * @param manifest the self loading manifest.\r\n * @return Promise<any> the promise object.\r\n */\r\n private static load(hostCoreManager: HostCoreManager, manifest?: any): Promise<any> {\r\n if (manifest) {\r\n ManifestLoader.update(manifest, null);\r\n return ManifestLoader.internalLoaded;\r\n }\r\n\r\n const isProduction = MsftSme.self().Init.isProduction !== false;\r\n const productionWithoutSideloading = isProduction && Object.keys(MsftSme.sideLoad()).length === 0;\r\n const gatewayUrlValidation = validateGatewayUrlParameter({\r\n enforceTrustedHosts: isProduction,\r\n isHostedInPortal: EnvironmentModule.isHostedInPortal\r\n });\r\n const gatewayUrlParam = gatewayUrlValidation.value ? { value: gatewayUrlValidation.value } : null;\r\n\r\n let manifestUrl = ManifestLoader.manifestFile;\r\n if (gatewayUrlValidation.error) {\r\n const message =\r\n gatewayUrlValidation.error === GatewayUrlValidationError.Duplicate\r\n ? 'The gatewayUrl parameter must not be specified more than once.'\r\n : 'The gatewayUrl parameter includes an unrecognized or invalid host.';\r\n const errorExtended = new ErrorExtended<{ status: number }>(message);\r\n errorExtended.extendedSource = ErrorExtended.sources.getNoCache;\r\n errorExtended.extended = { status: 400 };\r\n ManifestLoader.deferred.reject(errorExtended);\r\n return ManifestLoader.internalLoaded;\r\n }\r\n\r\n if (gatewayUrlParam && productionWithoutSideloading && EnvironmentModule.isHostedInPortal && isPortalGatewayUrl(gatewayUrlParam.value)) {\r\n // use the gateway endpoint for manifest source.\r\n manifestUrl = `${gatewayUrlParam.value}/${ManifestLoader.manifestFile}`;\r\n }\r\n\r\n // Rebuild the request per (re)subscription via `defer` so a retry re-evaluates HostCoreManager's\r\n // cached-token guard (returning the already-acquired AAD token) instead of re-running the parent\r\n // token handshake, which could otherwise time out and turn a retryable abort into a hard 403.\r\n defer(() => hostCoreManager.httpGet(manifestUrl))\r\n .pipe(\r\n ManifestLoader.retryTransientManifest(manifestUrl),\r\n mergeMap(result => ManifestLoader.mergeGatewayManifest(hostCoreManager, result.response)),\r\n mergeMap(shellManifest => {\r\n const response = shellManifest;\r\n if (response.modules) {\r\n return ManifestLoader.fetchSideloadManifests(hostCoreManager).pipe(\r\n map(sideLoads => {\r\n const sideloadShellOrigins: string[] = [];\r\n\r\n sideLoads = sideLoads.filter(s => {\r\n if (MsftSme.isNullOrUndefined(s)) {\r\n return false;\r\n }\r\n\r\n const isShell = s.name === EnvironmentModule.nameOfShell;\r\n if (isShell) {\r\n sideloadShellOrigins.push(s.origin);\r\n }\r\n return !isShell;\r\n });\r\n\r\n if (sideloadShellOrigins.length > 0) {\r\n Logging.log(<LogRecord>{\r\n source: ManifestLoader.logSourceName,\r\n level: LogLevel.Warning,\r\n consoleGroupHeader: `Unable to sideload: \"${sideloadShellOrigins}\".`,\r\n message: `Cannot sideload ${EnvironmentModule.nameOfShell} from ${sideloadShellOrigins}.\r\n Did you mean to run ${EnvironmentModule.nameOfShell} locally?`\r\n });\r\n }\r\n return { manifest: response, sideLoads: sideLoads };\r\n })\r\n );\r\n }\r\n\r\n return of({ manifest: response, sideLoads: [] });\r\n })\r\n )\r\n .subscribe({\r\n next: result => {\r\n const manifestResult = <MsftSme.MsftSmeEnvironment>result.manifest;\r\n const modules = manifestResult.modules;\r\n const selfInit = MsftSme.self().Init;\r\n selfInit.shellVersion = manifestResult.version;\r\n selfInit.gatewayApiVersion = manifestResult.gatewayApiVersion;\r\n selfInit.gatewayPlatform = manifestResult.gatewayPlatform;\r\n result.sideLoads.forEach(sideLoad => {\r\n if (sideLoad) {\r\n sideLoad.isSideLoaded = true;\r\n const foundIndex = modules.findIndex(item => item.name === sideLoad.name);\r\n if (foundIndex >= 0) {\r\n modules.splice(foundIndex, 1, sideLoad);\r\n } else {\r\n modules.push(sideLoad);\r\n }\r\n }\r\n });\r\n\r\n ManifestLoader.update(result.manifest, hostCoreManager.token);\r\n },\r\n error: error => {\r\n // communicate main.ts for error message.\r\n const extendedError = <ErrorExtended<any>>error;\r\n if (hostCoreManager.tokenMode === HostCoreTokenMode.Aad) {\r\n extendedError.extendedSource = ErrorExtended.sources.aadSso;\r\n }\r\n\r\n ManifestLoader.deferred.reject(error);\r\n }\r\n });\r\n\r\n return ManifestLoader.internalLoaded;\r\n }\r\n\r\n /**\r\n * Determines whether a manifest fetch error is transient and therefore worth retrying.\r\n * The manifest request can be aborted client-side before it reaches the network (surfacing as\r\n * `net::ERR_CONNECTION_ABORTED` with `status: 0`, e.g. a transient connection reset while the\r\n * iframe execution context survives) or fail with a transient gateway/relay error (>= 500).\r\n * Those are retried. Deterministic failures — auth/RBAC/invalid requests (4xx), or non-HTTP\r\n * errors such as a JSON parse failure on a 200 response (no `extended.status`) — are not\r\n * retried and are propagated immediately so real failures surface without added delay.\r\n *\r\n * @param error the error thrown by the manifest fetch.\r\n * @returns true if the error is transient and the fetch should be retried.\r\n */\r\n private static isTransientManifestError(error: unknown): boolean {\r\n const status = (error as ErrorExtended<{ status: number }>)?.extended?.status;\r\n\r\n // status 0 => request aborted/blocked before it hit the network (transient connection reset/drop).\r\n // >= 500 => transient server/relay failure.\r\n return status === 0 || status >= 500;\r\n }\r\n\r\n /**\r\n * rxjs operator that retries the manifest fetch on transient failures using capped exponential backoff.\r\n * Non-transient errors are re-thrown immediately so the splash screen surfaces real failures without delay.\r\n *\r\n * @param manifestUrl the manifest URL being fetched (for diagnostics only).\r\n * @returns an operator that transparently retries the source on transient failures.\r\n */\r\n private static retryTransientManifest<T>(manifestUrl: string): MonoTypeOperatorFunction<T> {\r\n return (source: Observable<T>) => {\r\n // Total fetch attempts made so far, starting at 1 for the initial (pre-retry) request.\r\n let totalAttempts = 1;\r\n return source.pipe(\r\n retry<T>({\r\n count: ManifestLoader.maxManifestRetries,\r\n delay: (error, retryCount) => {\r\n if (!ManifestLoader.isTransientManifestError(error)) {\r\n return throwError(() => error);\r\n }\r\n\r\n // Scheduling retry #retryCount means we're about to make attempt (retryCount + 1).\r\n totalAttempts = retryCount + 1;\r\n const backoffMs = ManifestLoader.manifestRetryBaseDelayMs * Math.pow(2, retryCount - 1);\r\n Logging.log(<LogRecord>{\r\n source: ManifestLoader.logSourceName,\r\n level: LogLevel.Warning,\r\n consoleGroupHeader: `Retrying manifest load (attempt ${retryCount} of ${ManifestLoader.maxManifestRetries}).`,\r\n message: `Transient failure loading \"${manifestUrl}\"; retrying in ${backoffMs} ms.`\r\n });\r\n return timer(backoffMs);\r\n }\r\n }),\r\n catchError((error: unknown) => {\r\n // Only a transient error reaching this point means every retry was exhausted; a\r\n // non-transient error is re-thrown by `delay` before any retry, so it must not be\r\n // reported as exhaustion. Emit one final summary with status, redacted URL and count.\r\n if (ManifestLoader.isTransientManifestError(error)) {\r\n ManifestLoader.logManifestFetchExhausted(manifestUrl, error, totalAttempts);\r\n }\r\n return throwError(() => error);\r\n })\r\n );\r\n };\r\n }\r\n\r\n /**\r\n * Emits a single terminal diagnostic once the manifest fetch retries are exhausted, capturing the\r\n * last HTTP status, the redacted URL (query string / fragment stripped) and the total attempt count.\r\n *\r\n * @param manifestUrl the manifest URL that failed to load.\r\n * @param error the terminal (transient) error that exhausted the retries.\r\n * @param totalAttempts the total number of fetch attempts made, including the initial request.\r\n */\r\n private static logManifestFetchExhausted(manifestUrl: string, error: unknown, totalAttempts: number): void {\r\n const status = (error as ErrorExtended<{ status: number }>)?.extended?.status;\r\n const statusText = status === undefined ? 'unknown' : `${status}`;\r\n const redactedUrl = ManifestLoader.redactUrl(manifestUrl);\r\n Logging.log(<LogRecord>{\r\n source: ManifestLoader.logSourceName,\r\n level: LogLevel.Error,\r\n consoleGroupHeader: `Manifest load failed after ${totalAttempts} attempts (status ${statusText}).`,\r\n message: `Giving up loading manifest \"${redactedUrl}\" after ${totalAttempts} attempts; last status ${statusText}.`\r\n });\r\n }\r\n\r\n /**\r\n * Redacts a URL for diagnostics by keeping only the origin and path, dropping any query string or\r\n * fragment that may carry tokens or other secrets. Falls back to stripping everything after the\r\n * first `?` / `#` for relative URLs that cannot be parsed as absolute.\r\n *\r\n * @param specifiedUrl the URL to redact.\r\n * @returns the redacted URL safe for logging.\r\n */\r\n private static redactUrl(specifiedUrl: string): string {\r\n try {\r\n const url = new URL(specifiedUrl);\r\n return `${url.origin}${url.pathname}`;\r\n } catch {\r\n return specifiedUrl.split(/[?#]/)[0];\r\n }\r\n }\r\n\r\n /**\r\n * Merges the GatewayUrl manifest with the passed in shell manifest\r\n * Merges modules only at this time with a preference for modules included in the shell\r\n */\r\n private static mergeGatewayManifest(hostCoreManager: HostCoreManager, shellManifest: any): Observable<any> {\r\n const isProduction = MsftSme.self().Init.isProduction !== false;\r\n // it's production mode and no side-loading omits calling manifest.json again.\r\n if (isProduction && Object.keys(MsftSme.sideLoad()).length === 0) {\r\n return of(shellManifest);\r\n }\r\n\r\n const gatewayUrlValidation = validateGatewayUrlParameter({\r\n enforceTrustedHosts: isProduction,\r\n isHostedInPortal: EnvironmentModule.isHostedInPortal\r\n });\r\n const validatedGatewayUrl = gatewayUrlValidation.value;\r\n if (!validatedGatewayUrl || gatewayUrlValidation.error) {\r\n return of(shellManifest);\r\n }\r\n\r\n return hostCoreManager.getNoCache(`${validatedGatewayUrl}/${ManifestLoader.manifestFile}`, false, 'json').pipe(\r\n map(result => {\r\n const gatewayManifest = result.response;\r\n if (Array.isArray(gatewayManifest.modules)) {\r\n if (!Array.isArray(shellManifest.modules)) {\r\n shellManifest.modules = gatewayManifest.modules;\r\n } else {\r\n gatewayManifest.modules.forEach(mod => {\r\n mod.origin = validatedGatewayUrl;\r\n const foundIndex = shellManifest.modules.findIndex(item => item.name === mod.name);\r\n if (foundIndex === -1) {\r\n shellManifest.modules.push(mod);\r\n }\r\n });\r\n }\r\n }\r\n return shellManifest;\r\n }),\r\n catchError(() => {\r\n // no localization\r\n Logging.log(<LogRecord>{\r\n source: ManifestLoader.logSourceName,\r\n level: LogLevel.Warning,\r\n consoleGroupHeader: `Unable to load gateway manifest: \"${validatedGatewayUrl}\".`,\r\n message: `Cannot load ${validatedGatewayUrl}. Please make sure that a manifest.json is available at this location.`\r\n });\r\n return of(shellManifest);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * retrieves all of the side loaded manifests.\r\n *\r\n * @return Observable<any[]> the manifests.\r\n */\r\n private static fetchSideloadManifests(hostCoreManager: HostCoreManager): Observable<any[]> {\r\n const sideLoadList = MsftSme.sideLoad();\r\n if (Object.keys(sideLoadList).length === 0) {\r\n return of([]);\r\n }\r\n\r\n const sideLoadManifestAwaiters: Observable<any>[] = [];\r\n MsftSme.forEachKey<MsftSme.SideLoad>(sideLoadList, (key, sideLoad) => {\r\n sideLoadManifestAwaiters.push(\r\n // don't send credentials when debugging a side-loading module.\r\n hostCoreManager.getNoCache(`${sideLoad.origin}/${ManifestLoader.manifestFile}`, false, 'json', false).pipe(\r\n map(result => {\r\n const manifest = result.response;\r\n manifest.origin = sideLoad.origin;\r\n return manifest;\r\n }),\r\n catchError(() => {\r\n // no localization\r\n Logging.log(<LogRecord>{\r\n source: ManifestLoader.logSourceName,\r\n level: LogLevel.Warning,\r\n consoleGroupHeader: `Unable to sideload: \"${sideLoad.origin}\".`,\r\n message: `Cannot sideload ${sideLoad.origin}. Please make sure that an extension is running at this origin.`\r\n });\r\n return of(null);\r\n })\r\n )\r\n );\r\n });\r\n\r\n return forkJoin(sideLoadManifestAwaiters);\r\n }\r\n\r\n /**\r\n * Update the environment by the manifest.\r\n */\r\n private static update(manifest: any, token: SignedHttpRequestToken): void {\r\n try {\r\n const self = MsftSme.self();\r\n if (token) {\r\n // store the last token if exists.\r\n if (!manifest.configuration) {\r\n manifest.configuration = {};\r\n }\r\n\r\n // passed the signOn objec to GatewayConnection object to configure into the SignOnManager.\r\n manifest.configuration.signOn = { signedHttpRequestToken: token };\r\n }\r\n\r\n self.Environment = EnvironmentModule.createEnvironment(manifest, self.Resources.localeId);\r\n ManifestLoader.deferred.resolve();\r\n } catch (e) {\r\n // no localization\r\n const message = 'Unable to load the manifest: {0}'.format(e);\r\n ManifestLoader.deferred.reject(message);\r\n throw new Error(message);\r\n }\r\n }\r\n}\r\n"]}
@@ -193,7 +193,7 @@
193
193
  "uniqueItems": true,
194
194
  "items": {
195
195
  "type": "string",
196
- "enum": ["compute", "storage", "networking"]
196
+ "enum": ["compute", "storage", "network"]
197
197
  }
198
198
  },
199
199
  "inventory": {
@@ -117,6 +117,8 @@ export declare class PerformanceTracker {
117
117
  static navigationInitialized(): void;
118
118
  static navigationStarted(): void;
119
119
  static navigationCompleted(moduleOpened: boolean): void;
120
+ /** Discard an abandoned navigation without emitting a successful load. */
121
+ static navigationCancelled(): void;
120
122
  static criticalDataLoaded(): void;
121
123
  /**
122
124
  * Mark an arbitrary measurement with a label. Clear the previous mark(s) prior to starting new one - allow only one at
@@ -1 +1 @@
1
- {"version":3,"file":"performance-tracker.d.ts","sourceRoot":"","sources":["../../src/performance/performance-tracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"performance-tracker.d.ts","sourceRoot":"","sources":["../../src/performance/performance-tracker.ts"],"names":[],"mappings":"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"}
@@ -295,6 +295,7 @@ export class PerformanceTracker {
295
295
  PerformanceTracker.logAppComponentLoadTime();
296
296
  }
297
297
  static navigationInitialized() {
298
+ PerformanceTracker.navigationCancelled();
298
299
  const navigationMarks = performance.getEntriesByType(PerformanceEntryType.Mark).filter(e => e.name.startsWith(PerformanceTracker.smePrefix + 'Navigation'));
299
300
  // If we reinitialize navigation, clear all previous navigation marks.
300
301
  navigationMarks.forEach(m => {
@@ -306,6 +307,8 @@ export class PerformanceTracker {
306
307
  // clear previous marks prior to starting new navigation
307
308
  performance.clearMarks(PerformanceTracker.markNavigationStarted);
308
309
  performance.clearMarks(PerformanceTracker.markNavigationCompleted);
310
+ performance.clearMarks(PerformanceTracker.markCriticalDataLoaded);
311
+ performance.clearMeasures(PerformanceTracker.markNavigationMeasure);
309
312
  performance.mark(PerformanceTracker.markNavigationStarted);
310
313
  }
311
314
  static navigationCompleted(moduleOpened) {
@@ -319,9 +322,24 @@ export class PerformanceTracker {
319
322
  // clear navigation start/end marks after we measure - only maintain one set of start/end to keep simple.
320
323
  performance.clearMarks(PerformanceTracker.markNavigationCompleted);
321
324
  performance.clearMarks(PerformanceTracker.markNavigationStarted);
325
+ // Cached data can arrive in a child layout effect before the navigation commit.
326
+ if (performance.getEntriesByName(PerformanceTracker.markCriticalDataLoaded).length) {
327
+ PerformanceTracker.logCriticalDataLoadTime();
328
+ }
329
+ }
330
+ /** Discard an abandoned navigation without emitting a successful load. */
331
+ static navigationCancelled() {
332
+ performance.clearMarks(PerformanceTracker.markNavigationInitialized);
333
+ performance.clearMarks(PerformanceTracker.markNavigationStarted);
334
+ performance.clearMarks(PerformanceTracker.markNavigationCompleted);
335
+ performance.clearMarks(PerformanceTracker.markCriticalDataLoaded);
336
+ performance.clearMeasures(PerformanceTracker.markNavigationMeasure);
322
337
  }
323
338
  static criticalDataLoaded() {
324
339
  performance.mark(PerformanceTracker.markCriticalDataLoaded);
340
+ if (performance.getEntriesByName(PerformanceTracker.markNavigationStarted).length) {
341
+ return;
342
+ }
325
343
  PerformanceTracker.logCriticalDataLoadTime();
326
344
  }
327
345
  /**