const { dotnet: dotnet2 } = await import('./_framework/dotnet.js?instance=2');
const runtime2 = await dotnet2
.withStartupMemoryCache(false)
- .withConfig({
- assetUniqueQuery: "?instance=2",
- })
.create();
const increment1 = await getIncrementStateFunction(App.runtime);
* application environment
*/
applicationEnvironment?: string;
- /**
- * query string to be used for asset loading
- */
- assetUniqueQuery?: string;
};
interface ResourceRequest {
name: string;
// in order to prevent net::ERR_INSUFFICIENT_RESOURCES if we start downloading too many files at same time
let parallel_count = 0;
-// don't `fetch` javaScript files
-const skipDownloadsByAssetTypes: {
+const jsModulesAssetTypes: {
[k: string]: boolean
} = {
"js-module-threads": true,
"js-module-runtime": true,
"js-module-native": true,
"js-module-dotnet": true,
+};
+
+// don't `fetch` javaScript and wasm files
+const skipDownloadsByAssetTypes: {
+ [k: string]: boolean
+} = {
+ ...jsModulesAssetTypes,
"dotnetwasm": true,
};
"pdb": true,
"heap": true,
"icu": true,
- "js-module-threads": true,
- "js-module-runtime": true,
- "js-module-native": true,
- "js-module-dotnet": true,
+ ...jsModulesAssetTypes,
"dotnetwasm": true,
};
const skipInstantiateByAssetTypes: {
[k: string]: boolean
} = {
- "js-module-threads": true,
- "js-module-runtime": true,
- "js-module-native": true,
- "js-module-dotnet": true,
+ ...jsModulesAssetTypes,
"dotnetwasm": true,
"symbols": true,
};
} else {
attemptUrl = sourcePrefix + asset.name;
}
- attemptUrl = loaderHelpers.locateFile(attemptUrl);
- if (loaderHelpers.assetUniqueQuery) {
- attemptUrl = attemptUrl + loaderHelpers.assetUniqueQuery;
- }
+ attemptUrl = appendUniqueQuery(loaderHelpers.locateFile(attemptUrl), asset.behavior);
}
else {
attemptUrl = asset.resolvedUrl;
return attemptUrl;
}
+export function appendUniqueQuery(attemptUrl: string, behavior: AssetBehaviours): string {
+ // apply unique query to js modules to make the module state independent of the other runtime instances
+ if (loaderHelpers.modulesUniqueQuery && jsModulesAssetTypes[behavior]) {
+ attemptUrl = attemptUrl + loaderHelpers.modulesUniqueQuery;
+ }
+
+ return attemptUrl;
+}
+
+
+
function download_resource(request: ResourceRequest): LoadingResource {
try {
if (typeof loaderHelpers.downloadResource === "function") {
import { WebAssemblyResourceLoader } from "./WebAssemblyResourceLoader";
import { hasDebuggingEnabled } from "./_Polyfill";
import { ICUDataMode } from "../../types/blazor";
+import { appendUniqueQuery } from "../assets";
let resourceLoader: WebAssemblyResourceLoader;
loaderHelpers.downloadResource = downloadResource; // polyfills were already assigned
}
-function appendUniqueQuery(attemptUrl: string): string {
- if (loaderHelpers.assetUniqueQuery) {
- attemptUrl = attemptUrl + loaderHelpers.assetUniqueQuery;
- }
-
- return attemptUrl;
-}
-
export function mapBootConfigToMonoConfig(moduleConfig: MonoConfigInternal, applicationEnvironment: string) {
const resources = resourceLoader.bootConfig.resources;
for (const name in resources.runtimeAssets) {
const asset = resources.runtimeAssets[name] as AssetEntry;
asset.name = name;
- asset.resolvedUrl = appendUniqueQuery(loaderHelpers.locateFile(name));
+ asset.resolvedUrl = appendUniqueQuery(loaderHelpers.locateFile(name), asset.behavior);
assets.push(asset);
}
for (const name in resources.assembly) {
const asset: AssetEntry = {
name,
- resolvedUrl: appendUniqueQuery(loaderHelpers.locateFile(name)),
+ resolvedUrl: appendUniqueQuery(loaderHelpers.locateFile(name), "assembly"),
hash: resources.assembly[name],
behavior: "assembly",
};
for (const name in resources.pdb) {
const asset: AssetEntry = {
name,
- resolvedUrl: appendUniqueQuery(loaderHelpers.locateFile(name)),
+ resolvedUrl: appendUniqueQuery(loaderHelpers.locateFile(name), "pdb"),
hash: resources.pdb[name],
behavior: "pdb",
};
continue;
}
- const resolvedUrl = appendUniqueQuery(loaderHelpers.locateFile(name));
+ const resolvedUrl = appendUniqueQuery(loaderHelpers.locateFile(name), behavior);
const asset: AssetEntry = {
name,
resolvedUrl,
if (config === "appsettings.json" || config === `appsettings.${applicationEnvironment}.json`) {
assets.push({
name: config,
- resolvedUrl: appendUniqueQuery((document ? document.baseURI : "/") + config),
+ resolvedUrl: appendUniqueQuery((document ? document.baseURI : "/") + config, "vfs"),
behavior: "vfs",
});
}
for (const name in resources.vfs[virtualPath]) {
const asset: AssetEntry = {
name,
- resolvedUrl: appendUniqueQuery(loaderHelpers.locateFile(name)),
+ resolvedUrl: appendUniqueQuery(loaderHelpers.locateFile(name), "vfs"),
hash: resources.vfs[virtualPath][name],
behavior: "vfs",
virtualPath
config.diagnosticTracing = true;
}
runtimeHelpers.diagnosticTracing = loaderHelpers.diagnosticTracing = !!config.diagnosticTracing;
- loaderHelpers.assetUniqueQuery = config.assetUniqueQuery;
runtimeHelpers.waitForDebugger = config.waitForDebugger;
config.startupMemoryCache = !!config.startupMemoryCache;
if (config.startupMemoryCache && runtimeHelpers.waitForDebugger) {
export async function detect_features_and_polyfill(module: DotnetModuleInternal): Promise<void> {
- loaderHelpers.scriptUrl = normalizeFileUrl(/* webpackIgnore: true */import.meta.url);
+ const scriptUrlQuery =/* webpackIgnore: true */import.meta.url;
+ const queryIndex = scriptUrlQuery.indexOf("?");
+ if (queryIndex > 0) {
+ loaderHelpers.modulesUniqueQuery = scriptUrlQuery.substring(queryIndex);
+ }
+ loaderHelpers.scriptUrl = normalizeFileUrl(scriptUrlQuery);
loaderHelpers.scriptDirectory = normalizeDirectoryUrl(loaderHelpers.scriptUrl);
loaderHelpers.locateFile = (path) => {
if (isPathAbsolute(path)) return path;
delete inputs.maxParallelDownloads;
delete inputs.enableDownloadRetry;
delete inputs.exitAfterSnapshot;
- delete inputs.assetUniqueQuery;
inputs.GitHash = GitHash;
inputs.ProductVersion = ProductVersion;
* application environment
*/
applicationEnvironment?: string,
- /**
- * query string to be used for asset loading
- */
- assetUniqueQuery?: string,
};
export interface ResourceRequest {
_loaded_files: { url: string, file: string }[];
scriptDirectory: string
scriptUrl: string
- assetUniqueQuery?: string
+ modulesUniqueQuery?: string
preferredIcuAsset: string | null,
invariantMode: boolean,
appendElementOnExit: false,
logExitCode: false,
pthreadPoolSize: 0,
- assetUniqueQuery: "?dry_run=true",
// this just means to not continue startup after the snapshot is taken.
// If there was previously a matching snapshot, it will be used.
exitAfterSnapshot: true