@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.
- package/3rdPartyDisclosure.html +10 -13
- package/README.md +110 -33
- package/angular/fesm2022/msft-sme-angular.mjs +1235 -1213
- package/angular/fesm2022/msft-sme-angular.mjs.map +1 -1
- package/angular/index.d.ts +29 -14
- package/angular/package.json +1 -1
- package/core/azure/azure-manager.d.ts +15 -3
- package/core/azure/azure-manager.d.ts.map +1 -1
- package/core/azure/azure-manager.js +29 -10
- package/core/azure/azure-manager.js.map +1 -1
- package/core/azure/models/aadAppConfig-data.d.ts +16 -0
- package/core/azure/models/aadAppConfig-data.d.ts.map +1 -1
- package/core/azure/models/aadAppConfig-data.js.map +1 -1
- package/core/base/environment.d.ts +1 -1
- package/core/base/environment.d.ts.map +1 -1
- package/core/base/environment.js.map +1 -1
- package/core/base/utilities.d.ts +10 -2
- package/core/base/utilities.d.ts.map +1 -1
- package/core/base/utilities.js +45 -25
- package/core/base/utilities.js.map +1 -1
- package/core/data/gateway-connection.d.ts.map +1 -1
- package/core/data/gateway-connection.js +1 -0
- package/core/data/gateway-connection.js.map +1 -1
- package/core/diagnostics/sme-web-telemetry.d.ts +17 -1
- package/core/diagnostics/sme-web-telemetry.d.ts.map +1 -1
- package/core/diagnostics/sme-web-telemetry.js +16 -0
- package/core/diagnostics/sme-web-telemetry.js.map +1 -1
- package/core/enterprise/enterprise-models.d.ts +10 -4
- package/core/enterprise/enterprise-models.d.ts.map +1 -1
- package/core/enterprise/enterprise-models.js +9 -4
- package/core/enterprise/enterprise-models.js.map +1 -1
- package/core/index.d.ts +5 -3
- package/core/index.d.ts.map +1 -1
- package/core/index.js +2 -1
- package/core/index.js.map +1 -1
- package/core/manifest/environment-modules.d.ts +2 -2
- package/core/manifest/environment-modules.d.ts.map +1 -1
- package/core/manifest/environment-modules.js.map +1 -1
- package/core/manifest/gateway-url-validator.d.ts +17 -0
- package/core/manifest/gateway-url-validator.d.ts.map +1 -0
- package/core/manifest/gateway-url-validator.js +56 -0
- package/core/manifest/gateway-url-validator.js.map +1 -0
- package/core/manifest/manifest-loader.d.ts +47 -11
- package/core/manifest/manifest-loader.d.ts.map +1 -1
- package/core/manifest/manifest-loader.js +141 -72
- package/core/manifest/manifest-loader.js.map +1 -1
- package/core/manifest/module-schema.json +1 -1
- package/core/performance/performance-tracker.d.ts +2 -0
- package/core/performance/performance-tracker.d.ts.map +1 -1
- package/core/performance/performance-tracker.js +18 -0
- package/core/performance/performance-tracker.js.map +1 -1
- package/core/rpc/azure/rpc-azure-model.d.ts +19 -1
- package/core/rpc/azure/rpc-azure-model.d.ts.map +1 -1
- package/core/rpc/azure/rpc-azure-model.js.map +1 -1
- package/core/rpc/forward/rpc-forward-auto-client.d.ts +5 -0
- package/core/rpc/forward/rpc-forward-auto-client.d.ts.map +1 -1
- package/core/rpc/forward/rpc-forward-auto-client.js +13 -0
- package/core/rpc/forward/rpc-forward-auto-client.js.map +1 -1
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-client.d.ts +16 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-client.d.ts.map +1 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-client.js +18 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-client.js.map +1 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-handler.d.ts +8 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-handler.d.ts.map +1 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-handler.js +2 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-handler.js.map +1 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-model.d.ts +18 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-model.d.ts.map +1 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-model.js +8 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-model.js.map +1 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.d.ts +27 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.d.ts.map +1 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.js +23 -0
- package/core/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.js.map +1 -0
- package/core/rpc/rpc-forwarder.d.ts +16 -2
- package/core/rpc/rpc-forwarder.d.ts.map +1 -1
- package/core/rpc/rpc-forwarder.js +50 -6
- package/core/rpc/rpc-forwarder.js.map +1 -1
- package/core/security/authorization-manager.d.ts +126 -4
- package/core/security/authorization-manager.d.ts.map +1 -1
- package/core/security/authorization-manager.js +381 -49
- package/core/security/authorization-manager.js.map +1 -1
- package/core/security/connection-manager.d.ts +2 -1
- package/core/security/connection-manager.d.ts.map +1 -1
- package/core/security/connection-manager.js +10 -6
- package/core/security/connection-manager.js.map +1 -1
- package/core/security/tool-condition-validator.d.ts +8 -3
- package/core/security/tool-condition-validator.d.ts.map +1 -1
- package/core/security/tool-condition-validator.js +43 -28
- package/core/security/tool-condition-validator.js.map +1 -1
- package/core/version.js +1 -1
- package/core/version.js.map +1 -1
- package/core/virtualization/virtualization-client.d.ts +47 -78
- package/core/virtualization/virtualization-client.d.ts.map +1 -1
- package/core/virtualization/virtualization-client.js +57 -77
- package/core/virtualization/virtualization-client.js.map +1 -1
- package/core/virtualization/virtualization-models.d.ts +9 -8
- package/core/virtualization/virtualization-models.d.ts.map +1 -1
- package/core/virtualization/virtualization-models.js +7 -5
- package/core/virtualization/virtualization-models.js.map +1 -1
- package/core/virtualization/virtualization-unavailable-error.d.ts +1 -1
- package/core/virtualization/virtualization-unavailable-error.js +1 -1
- package/core/virtualization/virtualization-unavailable-error.js.map +1 -1
- package/package.json +12 -17
- package/{react-sdk-core → react}/hooks/useAppContextInit.d.ts +2 -0
- package/react/hooks/useAppContextInit.d.ts.map +1 -0
- package/{react-sdk-core → react}/hooks/useAppContextInit.js +18 -2
- package/{react-sdk-core → react}/index.js +1 -1
- package/react/services/BaseNavigationService.d.ts.map +1 -0
- package/{react-sdk-core → react}/services/BaseNavigationService.js +4 -0
- package/{react-sdk-core → react}/version.d.ts.map +1 -1
- package/react/version.js +3 -0
- package/{react-sdk-core → react}/vite/smeCoreStringsPlugin.d.ts +1 -1
- package/{react-sdk-core → react}/vite/smeCoreStringsPlugin.js +1 -1
- package/{react-sdk-core → react}/vite/smeManifestResourcesPlugin.d.ts +1 -1
- package/{react-sdk-core → react}/vite/smeManifestResourcesPlugin.js +1 -1
- package/{react-sdk-core → react}/vite/smePowerShellPlugin.d.ts +1 -1
- package/{react-sdk-core → react}/vite/smePowerShellPlugin.js +1 -1
- package/styles/css/main-v2.css +1 -1
- package/styles/package.json +1 -1
- package/wac-cli/dist/angular20/configs/ci-build-yml-config.js +3 -2
- package/wac-cli/dist/angular20/configs/ci-build-yml-config.js.map +1 -1
- package/wac-cli/dist/angular20/upgrader/nvmrc-engines-upgrader.js +2 -2
- package/wac-cli/dist/create-react/main.js +3 -2
- package/wac-cli/dist/create-react/main.js.map +1 -1
- package/wac-cli/module-template/build/pipelines/ci-build.yml +2 -2
- package/wac-cli/module-template/build/pipelines/pull-request.yml +2 -2
- package/wac-cli/templates/internal/main.ts +2 -2
- package/wac-cli/templates/internal/package.json +26 -14
- package/wac-cli/templates/react-template/package.json +3 -2
- package/wac-cli/templates/react-template/src/App.tsx +1 -1
- package/wac-cli/templates/react-template/src/hooks/useServicesData.ts +1 -1
- package/wac-cli/templates/react-template/vite.config.ts +1 -1
- package/wac-cli/templates/wac-template/angular.json +8 -13
- package/wac-cli/templates/wac-template/package.json +26 -14
- package/wac-cli/templates/wac-template/src/main.ts +2 -2
- package/react-sdk-core/hooks/useAppContextInit.d.ts.map +0 -1
- package/react-sdk-core/services/BaseNavigationService.d.ts.map +0 -1
- package/react-sdk-core/version.js +0 -3
- /package/{react-sdk-core → react}/components/SplashScreen.d.ts +0 -0
- /package/{react-sdk-core → react}/components/SplashScreen.d.ts.map +0 -0
- /package/{react-sdk-core → react}/components/SplashScreen.js +0 -0
- /package/{react-sdk-core → react}/context/AppContextProvider.d.ts +0 -0
- /package/{react-sdk-core → react}/context/AppContextProvider.d.ts.map +0 -0
- /package/{react-sdk-core → react}/context/AppContextProvider.js +0 -0
- /package/{react-sdk-core → react}/hooks/useAppContext.d.ts +0 -0
- /package/{react-sdk-core → react}/hooks/useAppContext.d.ts.map +0 -0
- /package/{react-sdk-core → react}/hooks/useAppContext.js +0 -0
- /package/{react-sdk-core → react}/hooks/useSkeletonStyles.d.ts +0 -0
- /package/{react-sdk-core → react}/hooks/useSkeletonStyles.d.ts.map +0 -0
- /package/{react-sdk-core → react}/hooks/useSkeletonStyles.js +0 -0
- /package/{react-sdk-core → react}/hooks/useWacTheme.d.ts +0 -0
- /package/{react-sdk-core → react}/hooks/useWacTheme.d.ts.map +0 -0
- /package/{react-sdk-core → react}/hooks/useWacTheme.js +0 -0
- /package/{react-sdk-core → react}/index.d.ts +0 -0
- /package/{react-sdk-core → react}/index.d.ts.map +0 -0
- /package/{react-sdk-core → react}/services/AppContextService.d.ts +0 -0
- /package/{react-sdk-core → react}/services/AppContextService.d.ts.map +0 -0
- /package/{react-sdk-core → react}/services/AppContextService.js +0 -0
- /package/{react-sdk-core → react}/services/BaseNavigationService.d.ts +0 -0
- /package/{react-sdk-core → react}/services/NavigationService.d.ts +0 -0
- /package/{react-sdk-core → react}/services/NavigationService.d.ts.map +0 -0
- /package/{react-sdk-core → react}/services/NavigationService.js +0 -0
- /package/{react-sdk-core → react}/services/Polyfills.d.ts +0 -0
- /package/{react-sdk-core → react}/services/Polyfills.d.ts.map +0 -0
- /package/{react-sdk-core → react}/services/Polyfills.js +0 -0
- /package/{react-sdk-core → react}/version.d.ts +0 -0
- /package/{react-sdk-core → react}/vite/index.d.ts +0 -0
- /package/{react-sdk-core → react}/vite/index.d.ts.map +0 -0
- /package/{react-sdk-core → react}/vite/index.js +0 -0
- /package/{react-sdk-core → react}/vite/log.d.ts +0 -0
- /package/{react-sdk-core → react}/vite/log.d.ts.map +0 -0
- /package/{react-sdk-core → react}/vite/log.js +0 -0
- /package/{react-sdk-core → react}/vite/smeCoreStringsPlugin.d.ts.map +0 -0
- /package/{react-sdk-core → react}/vite/smeManifestResourcesPlugin.d.ts.map +0 -0
- /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":"
|
|
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
|
|
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 (
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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 (
|
|
266
|
+
if (isProduction && Object.keys(MsftSme.sideLoad()).length === 0) {
|
|
181
267
|
return of(shellManifest);
|
|
182
268
|
}
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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(`${
|
|
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 =
|
|
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: "${
|
|
213
|
-
message: `Cannot load ${
|
|
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"]}
|
|
@@ -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
|
/**
|