@module-federation/runtime-core 2.4.0 → 2.5.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/dist/core.cjs +8 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +62 -6
- package/dist/core.js +8 -1
- package/dist/core.js.map +1 -1
- package/dist/global.cjs +1 -1
- package/dist/global.js +1 -1
- package/dist/module/index.cjs +158 -21
- package/dist/module/index.cjs.map +1 -1
- package/dist/module/index.d.ts +5 -4
- package/dist/module/index.js +160 -23
- package/dist/module/index.js.map +1 -1
- package/dist/plugins/snapshot/SnapshotHandler.cjs +40 -16
- package/dist/plugins/snapshot/SnapshotHandler.cjs.map +1 -1
- package/dist/plugins/snapshot/SnapshotHandler.d.ts +5 -2
- package/dist/plugins/snapshot/SnapshotHandler.js +42 -18
- package/dist/plugins/snapshot/SnapshotHandler.js.map +1 -1
- package/dist/plugins/snapshot/index.cjs +6 -2
- package/dist/plugins/snapshot/index.cjs.map +1 -1
- package/dist/plugins/snapshot/index.js +6 -2
- package/dist/plugins/snapshot/index.js.map +1 -1
- package/dist/remote/index.cjs +163 -25
- package/dist/remote/index.cjs.map +1 -1
- package/dist/remote/index.d.ts +30 -4
- package/dist/remote/index.js +164 -26
- package/dist/remote/index.js.map +1 -1
- package/dist/shared/index.cjs +210 -95
- package/dist/shared/index.cjs.map +1 -1
- package/dist/shared/index.d.ts +22 -0
- package/dist/shared/index.js +211 -96
- package/dist/shared/index.js.map +1 -1
- package/dist/type/index.d.ts +2 -2
- package/dist/type/preload.d.ts +25 -1
- package/dist/types.d.ts +2 -2
- package/dist/utils/hooks/asyncHook.cjs +4 -1
- package/dist/utils/hooks/asyncHook.cjs.map +1 -1
- package/dist/utils/hooks/asyncHook.js +4 -1
- package/dist/utils/hooks/asyncHook.js.map +1 -1
- package/dist/utils/hooks/asyncWaterfallHooks.cjs +10 -8
- package/dist/utils/hooks/asyncWaterfallHooks.cjs.map +1 -1
- package/dist/utils/hooks/asyncWaterfallHooks.d.ts +2 -2
- package/dist/utils/hooks/asyncWaterfallHooks.js +10 -8
- package/dist/utils/hooks/asyncWaterfallHooks.js.map +1 -1
- package/dist/utils/hooks/pluginSystem.d.ts +1 -1
- package/dist/utils/hooks/syncHook.cjs +2 -1
- package/dist/utils/hooks/syncHook.cjs.map +1 -1
- package/dist/utils/hooks/syncHook.js +2 -1
- package/dist/utils/hooks/syncHook.js.map +1 -1
- package/dist/utils/hooks/syncWaterfallHook.cjs +1 -0
- package/dist/utils/hooks/syncWaterfallHook.cjs.map +1 -1
- package/dist/utils/hooks/syncWaterfallHook.d.ts +1 -1
- package/dist/utils/hooks/syncWaterfallHook.js +1 -0
- package/dist/utils/hooks/syncWaterfallHook.js.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/load.cjs +42 -10
- package/dist/utils/load.cjs.map +1 -1
- package/dist/utils/load.d.ts +2 -0
- package/dist/utils/load.js +42 -10
- package/dist/utils/load.js.map +1 -1
- package/dist/utils/manifest.cjs +5 -0
- package/dist/utils/manifest.cjs.map +1 -1
- package/dist/utils/manifest.js +5 -1
- package/dist/utils/manifest.js.map +1 -1
- package/dist/utils/preload.cjs +126 -63
- package/dist/utils/preload.cjs.map +1 -1
- package/dist/utils/preload.d.ts +2 -2
- package/dist/utils/preload.js +126 -63
- package/dist/utils/preload.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["PluginSystem","SyncWaterfallHook","AsyncWaterfallHook","AsyncHook","SyncHook","formatPreloadArgs","getRemoteInfo","matchRemoteWithNameAndExpose","RUNTIME_004","runtimeDescMap","optionsToMFContext","Module","isBrowserEnvValue","DEFAULT_SCOPE","DEFAULT_REMOTE_TYPE","CurrentGlobal","getRemoteEntryUniqueKey","globalLoading","getGlobalShareScope","getGlobalRemoteInfo","getInfoWithoutType","Global"],"sources":["../../src/remote/index.ts"],"sourcesContent":["import {\n isBrowserEnvValue,\n warn,\n composeKeyWithSeparator,\n ModuleInfo,\n GlobalModuleInfo,\n} from '@module-federation/sdk';\nimport { RUNTIME_004, runtimeDescMap } from '@module-federation/error-codes';\nimport {\n Global,\n getInfoWithoutType,\n globalLoading,\n CurrentGlobal,\n} from '../global';\nimport {\n Options,\n UserOptions,\n PreloadAssets,\n PreloadOptions,\n PreloadRemoteArgs,\n Remote,\n RemoteInfo,\n RemoteEntryExports,\n CallFrom,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n PluginSystem,\n AsyncHook,\n AsyncWaterfallHook,\n SyncHook,\n SyncWaterfallHook,\n} from '../utils/hooks';\nimport {\n assert,\n error,\n getRemoteInfo,\n getRemoteEntryUniqueKey,\n matchRemoteWithNameAndExpose,\n optionsToMFContext,\n logger,\n} from '../utils';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { Module, ModuleOptions } from '../module';\nimport { formatPreloadArgs, preloadAssets } from '../utils/preload';\nimport { getGlobalShareScope } from '../utils/share';\nimport { getGlobalRemoteInfo } from '../plugins/snapshot/SnapshotHandler';\n\nexport interface LoadRemoteMatch {\n id: string;\n pkgNameOrAlias: string;\n expose: string;\n remote: Remote;\n options: Options;\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteSnapshot?: ModuleInfo;\n}\n\nexport class RemoteHandler {\n host: ModuleFederation;\n idToRemoteMap: Record<string, { name: string; expose: string }>;\n\n hooks = new PluginSystem({\n beforeRegisterRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('beforeRegisterRemote'),\n registerRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('registerRemote'),\n beforeRequest: new AsyncWaterfallHook<{\n id: string;\n options: Options;\n origin: ModuleFederation;\n }>('beforeRequest'),\n onLoad: new AsyncHook<\n [\n {\n id: string;\n expose: string;\n pkgNameOrAlias: string;\n remote: Remote;\n options: ModuleOptions;\n origin: ModuleFederation;\n exposeModule: any;\n exposeModuleFactory: any;\n moduleInstance: Module;\n },\n ],\n void\n >('onLoad'),\n handlePreloadModule: new SyncHook<\n [\n {\n id: string;\n name: string;\n remote: Remote;\n remoteSnapshot: ModuleInfo;\n preloadConfig: PreloadRemoteArgs;\n origin: ModuleFederation;\n },\n ],\n void\n >('handlePreloadModule'),\n errorLoadRemote: new AsyncHook<\n [\n {\n id: string;\n error: unknown;\n options?: any;\n from: CallFrom;\n lifecycle:\n | 'beforeRequest'\n | 'beforeLoadShare'\n | 'afterResolve'\n | 'onLoad';\n origin: ModuleFederation;\n },\n ],\n void | unknown\n >('errorLoadRemote'),\n beforePreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n },\n ]\n >('beforePreloadRemote'),\n generatePreloadAssets: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n preloadOptions: PreloadOptions[number];\n remote: Remote;\n remoteInfo: RemoteInfo;\n remoteSnapshot: ModuleInfo;\n globalSnapshot: GlobalModuleInfo;\n },\n ],\n Promise<PreloadAssets>\n >('generatePreloadAssets'),\n // not used yet\n afterPreloadRemote: new AsyncHook<{\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n }>(),\n // TODO: Move to loaderHook\n loadEntry: new AsyncHook<\n [\n {\n loaderHook: ModuleFederation['loaderHook'];\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n },\n ],\n Promise<RemoteEntryExports>\n >(),\n });\n\n constructor(host: ModuleFederation) {\n this.host = host;\n this.idToRemoteMap = {};\n }\n\n formatAndRegisterRemote(globalOptions: Options, userOptions: UserOptions) {\n const userRemotes = userOptions.remotes || [];\n\n return userRemotes.reduce((res, remote) => {\n this.registerRemote(remote, res, { force: false });\n return res;\n }, globalOptions.remotes);\n }\n\n setIdToRemoteMap(id: string, remoteMatchInfo: LoadRemoteMatch) {\n const { remote, expose } = remoteMatchInfo;\n const { name, alias } = remote;\n this.idToRemoteMap[id] = { name: remote.name, expose };\n if (alias && id.startsWith(name)) {\n const idWithAlias = id.replace(name, alias);\n this.idToRemoteMap[idWithAlias] = { name: remote.name, expose };\n return;\n }\n\n if (alias && id.startsWith(alias)) {\n const idWithName = id.replace(alias, name);\n this.idToRemoteMap[idWithName] = { name: remote.name, expose };\n }\n }\n\n // eslint-disable-next-line max-lines-per-function\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async loadRemote<T>(\n id: string,\n options?: { loadFactory?: boolean; from: CallFrom },\n ): Promise<T | null> {\n const { host } = this;\n try {\n const { loadFactory = true } = options || {\n loadFactory: true,\n };\n // 1. Validate the parameters of the retrieved module. There are two module request methods: pkgName + expose and alias + expose.\n // 2. Request the snapshot information of the current host and globally store the obtained snapshot information. The retrieved module information is partially offline and partially online. The online module information will retrieve the modules used online.\n // 3. Retrieve the detailed information of the current module from global (remoteEntry address, expose resource address)\n // 4. After retrieving remoteEntry, call the init of the module, and then retrieve the exported content of the module through get\n // id: pkgName(@federation/app1) + expose(button) = @federation/app1/button\n // id: alias(app1) + expose(button) = app1/button\n // id: alias(app1/utils) + expose(loadash/sort) = app1/utils/loadash/sort\n const { module, moduleOptions, remoteMatchInfo } =\n await this.getRemoteModuleAndOptions({\n id,\n });\n const {\n pkgNameOrAlias,\n remote,\n expose,\n id: idRes,\n remoteSnapshot,\n } = remoteMatchInfo;\n\n const moduleOrFactory = (await module.get(\n idRes,\n expose,\n options,\n remoteSnapshot,\n )) as T;\n\n const moduleWrapper = await this.hooks.lifecycle.onLoad.emit({\n id: idRes,\n pkgNameOrAlias,\n expose,\n exposeModule: loadFactory ? moduleOrFactory : undefined,\n exposeModuleFactory: loadFactory ? undefined : moduleOrFactory,\n remote,\n options: moduleOptions,\n moduleInstance: module,\n origin: host,\n });\n\n this.setIdToRemoteMap(id, remoteMatchInfo);\n if (typeof moduleWrapper === 'function') {\n return moduleWrapper as T;\n }\n\n return moduleOrFactory;\n } catch (error) {\n const { from = 'runtime' } = options || { from: 'runtime' };\n\n const failOver = await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n error,\n from,\n lifecycle: 'onLoad',\n origin: host,\n });\n\n if (!failOver) {\n throw error;\n }\n\n return failOver as T;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n const { host } = this;\n\n await this.hooks.lifecycle.beforePreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n });\n\n const preloadOps: PreloadOptions = formatPreloadArgs(\n host.options.remotes,\n preloadOptions,\n );\n\n await Promise.all(\n preloadOps.map(async (ops) => {\n const { remote } = ops;\n const remoteInfo = getRemoteInfo(remote);\n const { globalSnapshot, remoteSnapshot } =\n await host.snapshotHandler.loadRemoteSnapshotInfo({\n moduleInfo: remote,\n });\n\n const assets = await this.hooks.lifecycle.generatePreloadAssets.emit({\n origin: host,\n preloadOptions: ops,\n remote,\n remoteInfo,\n globalSnapshot,\n remoteSnapshot,\n });\n if (!assets) {\n return;\n }\n preloadAssets(remoteInfo, host, assets);\n }),\n );\n }\n\n registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n const { host } = this;\n remotes.forEach((remote) => {\n this.registerRemote(remote, host.options.remotes, {\n force: options?.force,\n });\n });\n }\n\n async getRemoteModuleAndOptions(options: { id: string }): Promise<{\n module: Module;\n moduleOptions: ModuleOptions;\n remoteMatchInfo: LoadRemoteMatch;\n }> {\n const { host } = this;\n const { id } = options;\n let loadRemoteArgs;\n\n try {\n loadRemoteArgs = await this.hooks.lifecycle.beforeRequest.emit({\n id,\n options: host.options,\n origin: host,\n });\n } catch (error) {\n loadRemoteArgs = (await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n options: host.options,\n origin: host,\n from: 'runtime',\n error,\n lifecycle: 'beforeRequest',\n })) as {\n id: string;\n options: Options;\n origin: ModuleFederation;\n };\n\n if (!loadRemoteArgs) {\n throw error;\n }\n }\n\n const { id: idRes } = loadRemoteArgs;\n\n const remoteSplitInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n idRes,\n );\n if (!remoteSplitInfo) {\n error(\n RUNTIME_004,\n runtimeDescMap,\n {\n hostName: host.options.name,\n requestId: idRes,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n }\n\n const { remote: rawRemote } = remoteSplitInfo;\n const remoteInfo = getRemoteInfo(rawRemote);\n const matchInfo =\n await host.sharedHandler.hooks.lifecycle.afterResolve.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n origin: host,\n remoteInfo,\n });\n\n const { remote, expose } = matchInfo;\n assert(\n remote && expose,\n `The 'beforeRequest' hook was executed, but it failed to return the correct 'remote' and 'expose' values while loading ${idRes}.`,\n );\n let module: Module | undefined = host.moduleCache.get(remote.name);\n\n const moduleOptions: ModuleOptions = {\n host: host,\n remoteInfo,\n };\n\n if (!module) {\n module = new Module(moduleOptions);\n host.moduleCache.set(remote.name, module);\n }\n return {\n module,\n moduleOptions,\n remoteMatchInfo: matchInfo,\n };\n }\n\n registerRemote(\n remote: Remote,\n targetRemotes: Remote[],\n options?: { force?: boolean },\n ): void {\n const { host } = this;\n const normalizeRemote = () => {\n if (remote.alias) {\n // Validate if alias equals the prefix of remote.name and remote.alias, if so, throw an error\n // As multi-level path references cannot guarantee unique names, alias being a prefix of remote.name is not supported\n const findEqual = targetRemotes.find(\n (item) =>\n remote.alias &&\n (item.name.startsWith(remote.alias) ||\n item.alias?.startsWith(remote.alias)),\n );\n assert(\n !findEqual,\n `The alias ${remote.alias} of remote ${\n remote.name\n } is not allowed to be the prefix of ${\n findEqual && findEqual.name\n } name or alias`,\n );\n }\n // Set the remote entry to a complete path\n if ('entry' in remote) {\n if (\n isBrowserEnvValue &&\n typeof window !== 'undefined' &&\n !remote.entry.startsWith('http')\n ) {\n remote.entry = new URL(remote.entry, window.location.origin).href;\n }\n }\n if (!remote.shareScope) {\n remote.shareScope = DEFAULT_SCOPE;\n }\n if (!remote.type) {\n remote.type = DEFAULT_REMOTE_TYPE;\n }\n };\n this.hooks.lifecycle.beforeRegisterRemote.emit({ remote, origin: host });\n const registeredRemote = targetRemotes.find(\n (item) => item.name === remote.name,\n );\n if (!registeredRemote) {\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n } else {\n const messages = [\n `The remote \"${remote.name}\" is already registered.`,\n 'Please note that overriding it may cause unexpected errors.',\n ];\n if (options?.force) {\n // remove registered remote\n this.removeRemote(registeredRemote);\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n warn(messages.join(' '));\n }\n }\n }\n\n private removeRemote(remote: Remote): void {\n try {\n const { host } = this;\n const { name } = remote;\n const remoteIndex = host.options.remotes.findIndex(\n (item) => item.name === name,\n );\n if (remoteIndex !== -1) {\n host.options.remotes.splice(remoteIndex, 1);\n }\n const loadedModule = host.moduleCache.get(remote.name);\n if (loadedModule) {\n const remoteInfo = loadedModule.remoteInfo;\n const key = remoteInfo.entryGlobalName as keyof typeof CurrentGlobal;\n\n if (CurrentGlobal[key]) {\n if (\n Object.getOwnPropertyDescriptor(CurrentGlobal, key)?.configurable\n ) {\n delete CurrentGlobal[key];\n } else {\n // @ts-ignore\n CurrentGlobal[key] = undefined;\n }\n }\n const remoteEntryUniqueKey = getRemoteEntryUniqueKey(\n loadedModule.remoteInfo,\n );\n\n if (globalLoading[remoteEntryUniqueKey]) {\n delete globalLoading[remoteEntryUniqueKey];\n }\n\n host.snapshotHandler.manifestCache.delete(remoteInfo.entry);\n\n // delete unloaded shared and instance\n let remoteInsId = remoteInfo.buildVersion\n ? composeKeyWithSeparator(remoteInfo.name, remoteInfo.buildVersion)\n : remoteInfo.name;\n const remoteInsIndex =\n CurrentGlobal.__FEDERATION__.__INSTANCES__.findIndex((ins) => {\n if (remoteInfo.buildVersion) {\n return ins.options.id === remoteInsId;\n } else {\n return ins.name === remoteInsId;\n }\n });\n if (remoteInsIndex !== -1) {\n const remoteIns =\n CurrentGlobal.__FEDERATION__.__INSTANCES__[remoteInsIndex];\n remoteInsId = remoteIns.options.id || remoteInsId;\n const globalShareScopeMap = getGlobalShareScope();\n\n let isAllSharedNotUsed = true;\n const needDeleteKeys: Array<[string, string, string, string]> = [];\n Object.keys(globalShareScopeMap).forEach((instId) => {\n const shareScopeMap = globalShareScopeMap[instId];\n shareScopeMap &&\n Object.keys(shareScopeMap).forEach((shareScope) => {\n const shareScopeVal = shareScopeMap[shareScope];\n shareScopeVal &&\n Object.keys(shareScopeVal).forEach((shareName) => {\n const sharedPkgs = shareScopeVal[shareName];\n sharedPkgs &&\n Object.keys(sharedPkgs).forEach((shareVersion) => {\n const shared = sharedPkgs[shareVersion];\n if (\n shared &&\n typeof shared === 'object' &&\n shared.from === remoteInfo.name\n ) {\n if (shared.loaded || shared.loading) {\n shared.useIn = shared.useIn.filter(\n (usedHostName) =>\n usedHostName !== remoteInfo.name,\n );\n if (shared.useIn.length) {\n isAllSharedNotUsed = false;\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n }\n });\n });\n });\n });\n\n if (isAllSharedNotUsed) {\n remoteIns.shareScopeMap = {};\n delete globalShareScopeMap[remoteInsId];\n }\n needDeleteKeys.forEach(\n ([insId, shareScope, shareName, shareVersion]) => {\n delete globalShareScopeMap[insId]?.[shareScope]?.[shareName]?.[\n shareVersion\n ];\n },\n );\n CurrentGlobal.__FEDERATION__.__INSTANCES__.splice(remoteInsIndex, 1);\n }\n\n const { hostGlobalSnapshot } = getGlobalRemoteInfo(remote, host);\n if (hostGlobalSnapshot) {\n const remoteKey =\n hostGlobalSnapshot &&\n 'remotesInfo' in hostGlobalSnapshot &&\n hostGlobalSnapshot.remotesInfo &&\n getInfoWithoutType(hostGlobalSnapshot.remotesInfo, remote.name).key;\n if (remoteKey) {\n delete hostGlobalSnapshot.remotesInfo[remoteKey];\n if (\n //eslint-disable-next-line no-extra-boolean-cast\n Boolean(Global.__FEDERATION__.__MANIFEST_LOADING__[remoteKey])\n ) {\n delete Global.__FEDERATION__.__MANIFEST_LOADING__[remoteKey];\n }\n }\n }\n\n host.moduleCache.delete(remote.name);\n }\n } catch (err) {\n logger.error(\n `removeRemote failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["PluginSystem","SyncWaterfallHook","AsyncWaterfallHook","AsyncHook","SyncHook","matchRemoteWithNameAndExpose","getRemoteInfo","formatPreloadArgs","composeRemoteRequestId","preloadAssets","RUNTIME_004","runtimeDescMap","optionsToMFContext","Module","isBrowserEnvValue","DEFAULT_SCOPE","DEFAULT_REMOTE_TYPE","CurrentGlobal","getRemoteEntryUniqueKey","globalLoading","getGlobalShareScope","getGlobalRemoteInfo","getInfoWithoutType","Global"],"sources":["../../src/remote/index.ts"],"sourcesContent":["import {\n isBrowserEnvValue,\n warn,\n composeKeyWithSeparator,\n ModuleInfo,\n GlobalModuleInfo,\n} from '@module-federation/sdk';\nimport { RUNTIME_004, runtimeDescMap } from '@module-federation/error-codes';\nimport {\n Global,\n getInfoWithoutType,\n globalLoading,\n CurrentGlobal,\n} from '../global';\nimport {\n Options,\n UserOptions,\n PreloadAssets,\n PreloadOptions,\n PreloadRemoteArgs,\n PreloadRemoteResult,\n Remote,\n RemoteInfo,\n RemoteEntryExports,\n CallFrom,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n PluginSystem,\n AsyncHook,\n AsyncWaterfallHook,\n SyncHook,\n SyncWaterfallHook,\n} from '../utils/hooks';\nimport {\n assert,\n error,\n getRemoteInfo,\n getRemoteEntryUniqueKey,\n composeRemoteRequestId,\n matchRemoteWithNameAndExpose,\n optionsToMFContext,\n logger,\n} from '../utils';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { Module, ModuleOptions } from '../module';\nimport { formatPreloadArgs, preloadAssets } from '../utils/preload';\nimport { getGlobalShareScope } from '../utils/share';\nimport { getGlobalRemoteInfo } from '../plugins/snapshot/SnapshotHandler';\n\nexport interface LoadRemoteMatch {\n id: string;\n pkgNameOrAlias: string;\n expose: string;\n remote: Remote;\n options: Options;\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteSnapshot?: ModuleInfo;\n}\n\nexport class RemoteHandler {\n host: ModuleFederation;\n idToRemoteMap: Record<string, { name: string; expose: string }>;\n\n hooks = new PluginSystem({\n beforeRegisterRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('beforeRegisterRemote'),\n registerRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('registerRemote'),\n beforeRequest: new AsyncWaterfallHook<{\n id: string;\n options: Options;\n origin: ModuleFederation;\n }>('beforeRequest'),\n afterMatchRemote: new AsyncHook<\n [\n {\n id: string;\n options: Options;\n remote?: Remote;\n expose?: string;\n remoteInfo?: RemoteInfo;\n error?: unknown;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterMatchRemote'),\n onLoad: new AsyncHook<\n [\n {\n id: string;\n expose: string;\n pkgNameOrAlias: string;\n remote: Remote;\n options: ModuleOptions;\n origin: ModuleFederation;\n exposeModule: any;\n exposeModuleFactory: any;\n moduleInstance: Module;\n },\n ],\n unknown\n >('onLoad'),\n afterLoadRemote: new AsyncHook<\n [\n {\n id: string;\n expose?: string;\n remote?: RemoteInfo;\n options?: {\n loadFactory?: boolean;\n from?: CallFrom;\n };\n error?: unknown;\n recovered?: boolean;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterLoadRemote'),\n handlePreloadModule: new SyncHook<\n [\n {\n id: string;\n name: string;\n remote: Remote;\n remoteSnapshot: ModuleInfo;\n preloadConfig: PreloadRemoteArgs;\n origin: ModuleFederation;\n },\n ],\n void\n >('handlePreloadModule'),\n errorLoadRemote: new AsyncHook<\n [\n {\n id: string;\n error: unknown;\n options?: any;\n from: CallFrom;\n lifecycle:\n | 'beforeRequest'\n | 'beforeLoadShare'\n | 'afterResolve'\n | 'onLoad';\n remote?: RemoteInfo;\n expose?: string;\n origin: ModuleFederation;\n },\n ],\n void | unknown\n >('errorLoadRemote'),\n beforePreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n },\n ]\n >('beforePreloadRemote'),\n generatePreloadAssets: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n preloadOptions: PreloadOptions[number];\n remote: Remote;\n remoteInfo: RemoteInfo;\n remoteSnapshot: ModuleInfo;\n globalSnapshot: GlobalModuleInfo;\n },\n ],\n Promise<PreloadAssets>\n >('generatePreloadAssets'),\n afterPreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n results: PreloadRemoteResult[];\n error?: unknown;\n },\n ]\n >('afterPreloadRemote'),\n // TODO: Move to loaderHook\n loadEntry: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n loaderHook: ModuleFederation['loaderHook'];\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n },\n ],\n Promise<RemoteEntryExports | void> | RemoteEntryExports | void\n >(),\n });\n\n constructor(host: ModuleFederation) {\n this.host = host;\n this.idToRemoteMap = {};\n }\n\n formatAndRegisterRemote(globalOptions: Options, userOptions: UserOptions) {\n const userRemotes = userOptions.remotes || [];\n\n return userRemotes.reduce((res, remote) => {\n this.registerRemote(remote, res, { force: false });\n return res;\n }, globalOptions.remotes);\n }\n\n setIdToRemoteMap(id: string, remoteMatchInfo: LoadRemoteMatch) {\n const { remote, expose } = remoteMatchInfo;\n const { name, alias } = remote;\n this.idToRemoteMap[id] = { name: remote.name, expose };\n if (alias && id.startsWith(name)) {\n const idWithAlias = id.replace(name, alias);\n this.idToRemoteMap[idWithAlias] = { name: remote.name, expose };\n return;\n }\n\n if (alias && id.startsWith(alias)) {\n const idWithName = id.replace(alias, name);\n this.idToRemoteMap[idWithName] = { name: remote.name, expose };\n }\n }\n\n // eslint-disable-next-line max-lines-per-function\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async loadRemote<T>(\n id: string,\n options?: { loadFactory?: boolean; from: CallFrom },\n ): Promise<T | null> {\n const { host } = this;\n const startMatchInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n id,\n );\n let completeRequestId = id;\n let completeExpose = startMatchInfo?.expose;\n let completeRemote = startMatchInfo\n ? getRemoteInfo(startMatchInfo.remote)\n : undefined;\n let afterLoadRemoteArgs:\n | Parameters<\n RemoteHandler['hooks']['lifecycle']['afterLoadRemote']['emit']\n >[0]\n | undefined;\n\n try {\n const { loadFactory = true } = options || {\n loadFactory: true,\n };\n // 1. Validate the parameters of the retrieved module. There are two module request methods: pkgName + expose and alias + expose.\n // 2. Request the snapshot information of the current host and globally store the obtained snapshot information. The retrieved module information is partially offline and partially online. The online module information will retrieve the modules used online.\n // 3. Retrieve the detailed information of the current module from global (remoteEntry address, expose resource address)\n // 4. After retrieving remoteEntry, call the init of the module, and then retrieve the exported content of the module through get\n // id: pkgName(@federation/app1) + expose(button) = @federation/app1/button\n // id: alias(app1) + expose(button) = app1/button\n // id: alias(app1/utils) + expose(loadash/sort) = app1/utils/loadash/sort\n const { module, moduleOptions, remoteMatchInfo } =\n await this.getRemoteModuleAndOptions({\n id,\n });\n const {\n pkgNameOrAlias,\n remote,\n expose,\n id: idRes,\n remoteSnapshot,\n } = remoteMatchInfo;\n completeRequestId = idRes;\n completeExpose = expose;\n completeRemote = getRemoteInfo(remote);\n\n const moduleOrFactory = (await module.get(\n idRes,\n expose,\n options,\n remoteSnapshot,\n )) as T;\n\n const moduleWrapper = await this.hooks.lifecycle.onLoad.emit({\n id: idRes,\n pkgNameOrAlias,\n expose,\n exposeModule: loadFactory ? moduleOrFactory : undefined,\n exposeModuleFactory: loadFactory ? undefined : moduleOrFactory,\n remote,\n options: moduleOptions,\n moduleInstance: module,\n origin: host,\n });\n\n this.setIdToRemoteMap(id, remoteMatchInfo);\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n origin: host,\n };\n\n if (typeof moduleWrapper === 'function') {\n return moduleWrapper as T;\n }\n\n return moduleOrFactory;\n } catch (error) {\n const { from = 'runtime' } = options || { from: 'runtime' };\n\n let failOver;\n try {\n failOver = await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n error,\n from,\n lifecycle: 'onLoad',\n expose: completeExpose,\n remote: completeRemote,\n origin: host,\n });\n } catch (hookError) {\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error: hookError,\n origin: host,\n };\n throw hookError;\n }\n\n if (!failOver) {\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error,\n origin: host,\n };\n throw error;\n }\n\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error,\n origin: host,\n recovered: true,\n };\n\n return failOver as T;\n } finally {\n if (afterLoadRemoteArgs) {\n await this.hooks.lifecycle.afterLoadRemote.emit(afterLoadRemoteArgs);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n const { host } = this;\n const preloadResults: PreloadRemoteResult[] = [];\n\n await this.hooks.lifecycle.beforePreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n });\n\n const preloadOps: PreloadOptions = formatPreloadArgs(\n host.options.remotes,\n preloadOptions,\n );\n\n const createPreloadAssetOps = (ops: PreloadOptions[number]) => {\n const { preloadConfig, remote } = ops;\n const exposes = preloadConfig.exposes || [];\n\n if (!exposes.length) {\n return [\n {\n ops,\n id: `${remote.name}/*`,\n },\n ];\n }\n\n return exposes.map((expose) => ({\n ops: {\n ...ops,\n preloadConfig: {\n ...preloadConfig,\n exposes: [expose],\n },\n },\n id: composeRemoteRequestId(remote.name, expose),\n }));\n };\n\n let preloadError: Error | undefined;\n\n await Promise.all(\n preloadOps.flatMap(createPreloadAssetOps).map(async (assetOps) => {\n const { ops, id: preloadId } = assetOps;\n const { remote, preloadConfig } = ops;\n const remoteInfo = getRemoteInfo(remote);\n try {\n const { globalSnapshot, remoteSnapshot } =\n await host.snapshotHandler.loadRemoteSnapshotInfo({\n moduleInfo: remote,\n id: preloadId,\n initiator: 'preloadRemote',\n });\n\n const assets = await this.hooks.lifecycle.generatePreloadAssets.emit({\n origin: host,\n preloadOptions: ops,\n remote,\n remoteInfo,\n globalSnapshot,\n remoteSnapshot,\n });\n if (!assets) {\n return;\n }\n const results = await preloadAssets(remoteInfo, host, assets, true, {\n initiator: 'preloadRemote',\n id: preloadId,\n });\n preloadResults.push({\n remote,\n remoteInfo,\n preloadConfig,\n id: preloadId,\n results,\n });\n } catch (error) {\n preloadResults.push({\n remote,\n remoteInfo,\n preloadConfig,\n id: preloadId,\n results: [\n {\n url: remoteInfo.entry,\n status: 'error',\n resourceType: /\\.json(?:$|[?#])/i.test(remoteInfo.entry)\n ? 'manifest'\n : 'remoteEntry',\n initiator: 'preloadRemote',\n id: preloadId,\n error,\n },\n ],\n });\n }\n }),\n );\n\n const failedResults = preloadResults.flatMap((preloadResult) =>\n preloadResult.results.filter(\n (result) => result.status === 'error' || result.status === 'timeout',\n ),\n );\n if (failedResults.length > 0) {\n preloadError = new Error(\n `preloadRemote failed to load ${failedResults.length} resource(s).`,\n );\n Object.assign(preloadError, {\n results: preloadResults,\n failedResults,\n });\n }\n\n await this.hooks.lifecycle.afterPreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n results: preloadResults,\n error: preloadError,\n });\n\n if (preloadError) {\n throw preloadError;\n }\n }\n\n registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n const { host } = this;\n remotes.forEach((remote) => {\n this.registerRemote(remote, host.options.remotes, {\n force: options?.force,\n });\n });\n }\n\n async getRemoteModuleAndOptions(options: { id: string }): Promise<{\n module: Module;\n moduleOptions: ModuleOptions;\n remoteMatchInfo: LoadRemoteMatch;\n }> {\n const { host } = this;\n const { id } = options;\n let loadRemoteArgs;\n\n try {\n loadRemoteArgs = await this.hooks.lifecycle.beforeRequest.emit({\n id,\n options: host.options,\n origin: host,\n });\n } catch (error) {\n loadRemoteArgs = (await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n options: host.options,\n origin: host,\n from: 'runtime',\n error,\n lifecycle: 'beforeRequest',\n })) as {\n id: string;\n options: Options;\n origin: ModuleFederation;\n };\n\n if (!loadRemoteArgs) {\n throw error;\n }\n }\n\n const { id: idRes } = loadRemoteArgs;\n\n const remoteSplitInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n idRes,\n );\n if (!remoteSplitInfo) {\n try {\n error(\n RUNTIME_004,\n runtimeDescMap,\n {\n hostName: host.options.name,\n requestId: idRes,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n } catch (matchError) {\n await this.hooks.lifecycle.afterMatchRemote.emit({\n id: idRes,\n options: host.options,\n error: matchError,\n origin: host,\n });\n throw matchError;\n }\n }\n\n const { remote: rawRemote } = remoteSplitInfo;\n const remoteInfo = getRemoteInfo(rawRemote);\n await this.hooks.lifecycle.afterMatchRemote.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n remoteInfo,\n origin: host,\n });\n const matchInfo =\n await host.sharedHandler.hooks.lifecycle.afterResolve.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n origin: host,\n remoteInfo,\n });\n\n const { remote, expose } = matchInfo;\n assert(\n remote && expose,\n `The 'beforeRequest' hook was executed, but it failed to return the correct 'remote' and 'expose' values while loading ${idRes}.`,\n );\n let module: Module | undefined = host.moduleCache.get(remote.name);\n\n const moduleOptions: ModuleOptions = {\n host: host,\n remoteInfo,\n };\n\n if (!module) {\n module = new Module(moduleOptions);\n host.moduleCache.set(remote.name, module);\n }\n return {\n module,\n moduleOptions,\n remoteMatchInfo: matchInfo,\n };\n }\n\n registerRemote(\n remote: Remote,\n targetRemotes: Remote[],\n options?: { force?: boolean },\n ): void {\n const { host } = this;\n const normalizeRemote = () => {\n if (remote.alias) {\n // Validate if alias equals the prefix of remote.name and remote.alias, if so, throw an error\n // As multi-level path references cannot guarantee unique names, alias being a prefix of remote.name is not supported\n const findEqual = targetRemotes.find(\n (item) =>\n remote.alias &&\n (item.name.startsWith(remote.alias) ||\n item.alias?.startsWith(remote.alias)),\n );\n assert(\n !findEqual,\n `The alias ${remote.alias} of remote ${\n remote.name\n } is not allowed to be the prefix of ${\n findEqual && findEqual.name\n } name or alias`,\n );\n }\n // Set the remote entry to a complete path\n if ('entry' in remote) {\n if (\n isBrowserEnvValue &&\n typeof window !== 'undefined' &&\n !remote.entry.startsWith('http')\n ) {\n remote.entry = new URL(remote.entry, window.location.origin).href;\n }\n }\n if (!remote.shareScope) {\n remote.shareScope = DEFAULT_SCOPE;\n }\n if (!remote.type) {\n remote.type = DEFAULT_REMOTE_TYPE;\n }\n };\n this.hooks.lifecycle.beforeRegisterRemote.emit({ remote, origin: host });\n const registeredRemote = targetRemotes.find(\n (item) => item.name === remote.name,\n );\n if (!registeredRemote) {\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n } else {\n const messages = [\n `The remote \"${remote.name}\" is already registered.`,\n 'Please note that overriding it may cause unexpected errors.',\n ];\n if (options?.force) {\n // remove registered remote\n this.removeRemote(registeredRemote);\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n warn(messages.join(' '));\n }\n }\n }\n\n private removeRemote(remote: Remote): void {\n try {\n const { host } = this;\n const { name } = remote;\n const remoteIndex = host.options.remotes.findIndex(\n (item) => item.name === name,\n );\n if (remoteIndex !== -1) {\n host.options.remotes.splice(remoteIndex, 1);\n }\n const loadedModule = host.moduleCache.get(remote.name);\n if (loadedModule) {\n const remoteInfo = loadedModule.remoteInfo;\n const key = remoteInfo.entryGlobalName as keyof typeof CurrentGlobal;\n\n if (CurrentGlobal[key]) {\n if (\n Object.getOwnPropertyDescriptor(CurrentGlobal, key)?.configurable\n ) {\n delete CurrentGlobal[key];\n } else {\n // @ts-ignore\n CurrentGlobal[key] = undefined;\n }\n }\n const remoteEntryUniqueKey = getRemoteEntryUniqueKey(\n loadedModule.remoteInfo,\n );\n\n if (globalLoading[remoteEntryUniqueKey]) {\n delete globalLoading[remoteEntryUniqueKey];\n }\n\n host.snapshotHandler.manifestCache.delete(remoteInfo.entry);\n\n // delete unloaded shared and instance\n let remoteInsId = remoteInfo.buildVersion\n ? composeKeyWithSeparator(remoteInfo.name, remoteInfo.buildVersion)\n : remoteInfo.name;\n const remoteInsIndex =\n CurrentGlobal.__FEDERATION__.__INSTANCES__.findIndex((ins) => {\n if (remoteInfo.buildVersion) {\n return ins.options.id === remoteInsId;\n } else {\n return ins.name === remoteInsId;\n }\n });\n if (remoteInsIndex !== -1) {\n const remoteIns =\n CurrentGlobal.__FEDERATION__.__INSTANCES__[remoteInsIndex];\n remoteInsId = remoteIns.options.id || remoteInsId;\n const globalShareScopeMap = getGlobalShareScope();\n\n let isAllSharedNotUsed = true;\n const needDeleteKeys: Array<[string, string, string, string]> = [];\n Object.keys(globalShareScopeMap).forEach((instId) => {\n const shareScopeMap = globalShareScopeMap[instId];\n shareScopeMap &&\n Object.keys(shareScopeMap).forEach((shareScope) => {\n const shareScopeVal = shareScopeMap[shareScope];\n shareScopeVal &&\n Object.keys(shareScopeVal).forEach((shareName) => {\n const sharedPkgs = shareScopeVal[shareName];\n sharedPkgs &&\n Object.keys(sharedPkgs).forEach((shareVersion) => {\n const shared = sharedPkgs[shareVersion];\n if (\n shared &&\n typeof shared === 'object' &&\n shared.from === remoteInfo.name\n ) {\n if (shared.loaded || shared.loading) {\n shared.useIn = shared.useIn.filter(\n (usedHostName) =>\n usedHostName !== remoteInfo.name,\n );\n if (shared.useIn.length) {\n isAllSharedNotUsed = false;\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n }\n });\n });\n });\n });\n\n if (isAllSharedNotUsed) {\n remoteIns.shareScopeMap = {};\n delete globalShareScopeMap[remoteInsId];\n }\n needDeleteKeys.forEach(\n ([insId, shareScope, shareName, shareVersion]) => {\n delete globalShareScopeMap[insId]?.[shareScope]?.[shareName]?.[\n shareVersion\n ];\n },\n );\n CurrentGlobal.__FEDERATION__.__INSTANCES__.splice(remoteInsIndex, 1);\n }\n\n const { hostGlobalSnapshot } = getGlobalRemoteInfo(remote, host);\n if (hostGlobalSnapshot) {\n const remoteKey =\n hostGlobalSnapshot &&\n 'remotesInfo' in hostGlobalSnapshot &&\n hostGlobalSnapshot.remotesInfo &&\n getInfoWithoutType(hostGlobalSnapshot.remotesInfo, remote.name).key;\n if (remoteKey) {\n delete hostGlobalSnapshot.remotesInfo[remoteKey];\n if (\n //eslint-disable-next-line no-extra-boolean-cast\n Boolean(Global.__FEDERATION__.__MANIFEST_LOADING__[remoteKey])\n ) {\n delete Global.__FEDERATION__.__MANIFEST_LOADING__[remoteKey];\n }\n }\n }\n\n host.moduleCache.delete(remote.name);\n }\n } catch (err) {\n logger.error(\n `removeRemote failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/remote/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { AsyncWaterfallHook } from "../utils/hooks/asyncWaterfallHooks.js";
|
|
|
6
6
|
import { PluginSystem } from "../utils/hooks/pluginSystem.js";
|
|
7
7
|
import { ModuleFederation } from "../core.js";
|
|
8
8
|
import { CallFrom, Options, Remote, RemoteEntryExports, RemoteInfo, UserOptions } from "../type/config.js";
|
|
9
|
-
import { PreloadAssets, PreloadOptions, PreloadRemoteArgs } from "../type/preload.js";
|
|
9
|
+
import { PreloadAssets, PreloadOptions, PreloadRemoteArgs, PreloadRemoteResult } from "../type/preload.js";
|
|
10
10
|
import { GlobalModuleInfo, ModuleInfo } from "@module-federation/sdk";
|
|
11
11
|
|
|
12
12
|
//#region src/remote/index.d.ts
|
|
@@ -40,6 +40,15 @@ declare class RemoteHandler {
|
|
|
40
40
|
options: Options;
|
|
41
41
|
origin: ModuleFederation;
|
|
42
42
|
}>;
|
|
43
|
+
afterMatchRemote: AsyncHook<[{
|
|
44
|
+
id: string;
|
|
45
|
+
options: Options;
|
|
46
|
+
remote?: Remote;
|
|
47
|
+
expose?: string;
|
|
48
|
+
remoteInfo?: RemoteInfo;
|
|
49
|
+
error?: unknown;
|
|
50
|
+
origin: ModuleFederation;
|
|
51
|
+
}], void>;
|
|
43
52
|
onLoad: AsyncHook<[{
|
|
44
53
|
id: string;
|
|
45
54
|
expose: string;
|
|
@@ -50,6 +59,18 @@ declare class RemoteHandler {
|
|
|
50
59
|
exposeModule: any;
|
|
51
60
|
exposeModuleFactory: any;
|
|
52
61
|
moduleInstance: Module$1;
|
|
62
|
+
}], unknown>;
|
|
63
|
+
afterLoadRemote: AsyncHook<[{
|
|
64
|
+
id: string;
|
|
65
|
+
expose?: string;
|
|
66
|
+
remote?: RemoteInfo;
|
|
67
|
+
options?: {
|
|
68
|
+
loadFactory?: boolean;
|
|
69
|
+
from?: CallFrom;
|
|
70
|
+
};
|
|
71
|
+
error?: unknown;
|
|
72
|
+
recovered?: boolean;
|
|
73
|
+
origin: ModuleFederation;
|
|
53
74
|
}], void>;
|
|
54
75
|
handlePreloadModule: SyncHook<[{
|
|
55
76
|
id: string;
|
|
@@ -65,6 +86,8 @@ declare class RemoteHandler {
|
|
|
65
86
|
options?: any;
|
|
66
87
|
from: CallFrom;
|
|
67
88
|
lifecycle: "beforeRequest" | "beforeLoadShare" | "afterResolve" | "onLoad";
|
|
89
|
+
remote?: RemoteInfo;
|
|
90
|
+
expose?: string;
|
|
68
91
|
origin: ModuleFederation;
|
|
69
92
|
}], unknown>;
|
|
70
93
|
beforePreloadRemote: AsyncHook<[{
|
|
@@ -80,16 +103,19 @@ declare class RemoteHandler {
|
|
|
80
103
|
remoteSnapshot: ModuleInfo;
|
|
81
104
|
globalSnapshot: GlobalModuleInfo;
|
|
82
105
|
}], Promise<PreloadAssets>>;
|
|
83
|
-
afterPreloadRemote: AsyncHook<{
|
|
106
|
+
afterPreloadRemote: AsyncHook<[{
|
|
84
107
|
preloadOps: Array<PreloadRemoteArgs>;
|
|
85
108
|
options: Options;
|
|
86
109
|
origin: ModuleFederation;
|
|
87
|
-
|
|
110
|
+
results: PreloadRemoteResult[];
|
|
111
|
+
error?: unknown;
|
|
112
|
+
}], false | void | Promise<false | void>>;
|
|
88
113
|
loadEntry: AsyncHook<[{
|
|
114
|
+
origin: ModuleFederation;
|
|
89
115
|
loaderHook: ModuleFederation["loaderHook"];
|
|
90
116
|
remoteInfo: RemoteInfo;
|
|
91
117
|
remoteEntryExports?: RemoteEntryExports;
|
|
92
|
-
}], Promise<RemoteEntryExports>>;
|
|
118
|
+
}], void | RemoteEntryExports | Promise<void | RemoteEntryExports>>;
|
|
93
119
|
}>;
|
|
94
120
|
constructor(host: ModuleFederation);
|
|
95
121
|
formatAndRegisterRemote(globalOptions: Options, userOptions: UserOptions): Remote[];
|
package/dist/remote/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { assert, error, logger } from "../utils/logger.js";
|
|
|
2
2
|
import { CurrentGlobal, Global, getInfoWithoutType, globalLoading } from "../global.js";
|
|
3
3
|
import { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from "../constant.js";
|
|
4
4
|
import { getGlobalShareScope } from "../utils/share.js";
|
|
5
|
-
import { matchRemoteWithNameAndExpose } from "../utils/manifest.js";
|
|
5
|
+
import { composeRemoteRequestId, matchRemoteWithNameAndExpose } from "../utils/manifest.js";
|
|
6
6
|
import { getRemoteEntryUniqueKey, getRemoteInfo } from "../utils/load.js";
|
|
7
7
|
import { optionsToMFContext } from "../utils/context.js";
|
|
8
8
|
import "../utils/index.js";
|
|
@@ -25,12 +25,14 @@ var RemoteHandler = class {
|
|
|
25
25
|
beforeRegisterRemote: new SyncWaterfallHook("beforeRegisterRemote"),
|
|
26
26
|
registerRemote: new SyncWaterfallHook("registerRemote"),
|
|
27
27
|
beforeRequest: new AsyncWaterfallHook("beforeRequest"),
|
|
28
|
+
afterMatchRemote: new AsyncHook("afterMatchRemote"),
|
|
28
29
|
onLoad: new AsyncHook("onLoad"),
|
|
30
|
+
afterLoadRemote: new AsyncHook("afterLoadRemote"),
|
|
29
31
|
handlePreloadModule: new SyncHook("handlePreloadModule"),
|
|
30
32
|
errorLoadRemote: new AsyncHook("errorLoadRemote"),
|
|
31
33
|
beforePreloadRemote: new AsyncHook("beforePreloadRemote"),
|
|
32
34
|
generatePreloadAssets: new AsyncHook("generatePreloadAssets"),
|
|
33
|
-
afterPreloadRemote: new AsyncHook(),
|
|
35
|
+
afterPreloadRemote: new AsyncHook("afterPreloadRemote"),
|
|
34
36
|
loadEntry: new AsyncHook()
|
|
35
37
|
});
|
|
36
38
|
this.host = host;
|
|
@@ -67,10 +69,18 @@ var RemoteHandler = class {
|
|
|
67
69
|
}
|
|
68
70
|
async loadRemote(id, options) {
|
|
69
71
|
const { host } = this;
|
|
72
|
+
const startMatchInfo = matchRemoteWithNameAndExpose(host.options.remotes, id);
|
|
73
|
+
let completeRequestId = id;
|
|
74
|
+
let completeExpose = startMatchInfo?.expose;
|
|
75
|
+
let completeRemote = startMatchInfo ? getRemoteInfo(startMatchInfo.remote) : void 0;
|
|
76
|
+
let afterLoadRemoteArgs;
|
|
70
77
|
try {
|
|
71
78
|
const { loadFactory = true } = options || { loadFactory: true };
|
|
72
79
|
const { module, moduleOptions, remoteMatchInfo } = await this.getRemoteModuleAndOptions({ id });
|
|
73
80
|
const { pkgNameOrAlias, remote, expose, id: idRes, remoteSnapshot } = remoteMatchInfo;
|
|
81
|
+
completeRequestId = idRes;
|
|
82
|
+
completeExpose = expose;
|
|
83
|
+
completeRemote = getRemoteInfo(remote);
|
|
74
84
|
const moduleOrFactory = await module.get(idRes, expose, options, remoteSnapshot);
|
|
75
85
|
const moduleWrapper = await this.hooks.lifecycle.onLoad.emit({
|
|
76
86
|
id: idRes,
|
|
@@ -84,44 +94,155 @@ var RemoteHandler = class {
|
|
|
84
94
|
origin: host
|
|
85
95
|
});
|
|
86
96
|
this.setIdToRemoteMap(id, remoteMatchInfo);
|
|
97
|
+
afterLoadRemoteArgs = {
|
|
98
|
+
id: completeRequestId,
|
|
99
|
+
expose: completeExpose,
|
|
100
|
+
remote: completeRemote,
|
|
101
|
+
options,
|
|
102
|
+
origin: host
|
|
103
|
+
};
|
|
87
104
|
if (typeof moduleWrapper === "function") return moduleWrapper;
|
|
88
105
|
return moduleOrFactory;
|
|
89
106
|
} catch (error) {
|
|
90
107
|
const { from = "runtime" } = options || { from: "runtime" };
|
|
91
|
-
|
|
92
|
-
|
|
108
|
+
let failOver;
|
|
109
|
+
try {
|
|
110
|
+
failOver = await this.hooks.lifecycle.errorLoadRemote.emit({
|
|
111
|
+
id,
|
|
112
|
+
error,
|
|
113
|
+
from,
|
|
114
|
+
lifecycle: "onLoad",
|
|
115
|
+
expose: completeExpose,
|
|
116
|
+
remote: completeRemote,
|
|
117
|
+
origin: host
|
|
118
|
+
});
|
|
119
|
+
} catch (hookError) {
|
|
120
|
+
afterLoadRemoteArgs = {
|
|
121
|
+
id: completeRequestId,
|
|
122
|
+
expose: completeExpose,
|
|
123
|
+
remote: completeRemote,
|
|
124
|
+
options,
|
|
125
|
+
error: hookError,
|
|
126
|
+
origin: host
|
|
127
|
+
};
|
|
128
|
+
throw hookError;
|
|
129
|
+
}
|
|
130
|
+
if (!failOver) {
|
|
131
|
+
afterLoadRemoteArgs = {
|
|
132
|
+
id: completeRequestId,
|
|
133
|
+
expose: completeExpose,
|
|
134
|
+
remote: completeRemote,
|
|
135
|
+
options,
|
|
136
|
+
error,
|
|
137
|
+
origin: host
|
|
138
|
+
};
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
afterLoadRemoteArgs = {
|
|
142
|
+
id: completeRequestId,
|
|
143
|
+
expose: completeExpose,
|
|
144
|
+
remote: completeRemote,
|
|
145
|
+
options,
|
|
93
146
|
error,
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
});
|
|
98
|
-
if (!failOver) throw error;
|
|
147
|
+
origin: host,
|
|
148
|
+
recovered: true
|
|
149
|
+
};
|
|
99
150
|
return failOver;
|
|
151
|
+
} finally {
|
|
152
|
+
if (afterLoadRemoteArgs) await this.hooks.lifecycle.afterLoadRemote.emit(afterLoadRemoteArgs);
|
|
100
153
|
}
|
|
101
154
|
}
|
|
102
155
|
async preloadRemote(preloadOptions) {
|
|
103
156
|
const { host } = this;
|
|
157
|
+
const preloadResults = [];
|
|
104
158
|
await this.hooks.lifecycle.beforePreloadRemote.emit({
|
|
105
159
|
preloadOps: preloadOptions,
|
|
106
160
|
options: host.options,
|
|
107
161
|
origin: host
|
|
108
162
|
});
|
|
109
163
|
const preloadOps = formatPreloadArgs(host.options.remotes, preloadOptions);
|
|
110
|
-
|
|
111
|
-
const { remote } = ops;
|
|
164
|
+
const createPreloadAssetOps = (ops) => {
|
|
165
|
+
const { preloadConfig, remote } = ops;
|
|
166
|
+
const exposes = preloadConfig.exposes || [];
|
|
167
|
+
if (!exposes.length) return [{
|
|
168
|
+
ops,
|
|
169
|
+
id: `${remote.name}/*`
|
|
170
|
+
}];
|
|
171
|
+
return exposes.map((expose) => ({
|
|
172
|
+
ops: {
|
|
173
|
+
...ops,
|
|
174
|
+
preloadConfig: {
|
|
175
|
+
...preloadConfig,
|
|
176
|
+
exposes: [expose]
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
id: composeRemoteRequestId(remote.name, expose)
|
|
180
|
+
}));
|
|
181
|
+
};
|
|
182
|
+
let preloadError;
|
|
183
|
+
await Promise.all(preloadOps.flatMap(createPreloadAssetOps).map(async (assetOps) => {
|
|
184
|
+
const { ops, id: preloadId } = assetOps;
|
|
185
|
+
const { remote, preloadConfig } = ops;
|
|
112
186
|
const remoteInfo = getRemoteInfo(remote);
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
187
|
+
try {
|
|
188
|
+
const { globalSnapshot, remoteSnapshot } = await host.snapshotHandler.loadRemoteSnapshotInfo({
|
|
189
|
+
moduleInfo: remote,
|
|
190
|
+
id: preloadId,
|
|
191
|
+
initiator: "preloadRemote"
|
|
192
|
+
});
|
|
193
|
+
const assets = await this.hooks.lifecycle.generatePreloadAssets.emit({
|
|
194
|
+
origin: host,
|
|
195
|
+
preloadOptions: ops,
|
|
196
|
+
remote,
|
|
197
|
+
remoteInfo,
|
|
198
|
+
globalSnapshot,
|
|
199
|
+
remoteSnapshot
|
|
200
|
+
});
|
|
201
|
+
if (!assets) return;
|
|
202
|
+
const results = await preloadAssets(remoteInfo, host, assets, true, {
|
|
203
|
+
initiator: "preloadRemote",
|
|
204
|
+
id: preloadId
|
|
205
|
+
});
|
|
206
|
+
preloadResults.push({
|
|
207
|
+
remote,
|
|
208
|
+
remoteInfo,
|
|
209
|
+
preloadConfig,
|
|
210
|
+
id: preloadId,
|
|
211
|
+
results
|
|
212
|
+
});
|
|
213
|
+
} catch (error) {
|
|
214
|
+
preloadResults.push({
|
|
215
|
+
remote,
|
|
216
|
+
remoteInfo,
|
|
217
|
+
preloadConfig,
|
|
218
|
+
id: preloadId,
|
|
219
|
+
results: [{
|
|
220
|
+
url: remoteInfo.entry,
|
|
221
|
+
status: "error",
|
|
222
|
+
resourceType: /\.json(?:$|[?#])/i.test(remoteInfo.entry) ? "manifest" : "remoteEntry",
|
|
223
|
+
initiator: "preloadRemote",
|
|
224
|
+
id: preloadId,
|
|
225
|
+
error
|
|
226
|
+
}]
|
|
227
|
+
});
|
|
228
|
+
}
|
|
124
229
|
}));
|
|
230
|
+
const failedResults = preloadResults.flatMap((preloadResult) => preloadResult.results.filter((result) => result.status === "error" || result.status === "timeout"));
|
|
231
|
+
if (failedResults.length > 0) {
|
|
232
|
+
preloadError = /* @__PURE__ */ new Error(`preloadRemote failed to load ${failedResults.length} resource(s).`);
|
|
233
|
+
Object.assign(preloadError, {
|
|
234
|
+
results: preloadResults,
|
|
235
|
+
failedResults
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
await this.hooks.lifecycle.afterPreloadRemote.emit({
|
|
239
|
+
preloadOps: preloadOptions,
|
|
240
|
+
options: host.options,
|
|
241
|
+
origin: host,
|
|
242
|
+
results: preloadResults,
|
|
243
|
+
error: preloadError
|
|
244
|
+
});
|
|
245
|
+
if (preloadError) throw preloadError;
|
|
125
246
|
}
|
|
126
247
|
registerRemotes(remotes, options) {
|
|
127
248
|
const { host } = this;
|
|
@@ -152,12 +273,29 @@ var RemoteHandler = class {
|
|
|
152
273
|
}
|
|
153
274
|
const { id: idRes } = loadRemoteArgs;
|
|
154
275
|
const remoteSplitInfo = matchRemoteWithNameAndExpose(host.options.remotes, idRes);
|
|
155
|
-
if (!remoteSplitInfo)
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
276
|
+
if (!remoteSplitInfo) try {
|
|
277
|
+
error(RUNTIME_004, runtimeDescMap, {
|
|
278
|
+
hostName: host.options.name,
|
|
279
|
+
requestId: idRes
|
|
280
|
+
}, void 0, optionsToMFContext(host.options));
|
|
281
|
+
} catch (matchError) {
|
|
282
|
+
await this.hooks.lifecycle.afterMatchRemote.emit({
|
|
283
|
+
id: idRes,
|
|
284
|
+
options: host.options,
|
|
285
|
+
error: matchError,
|
|
286
|
+
origin: host
|
|
287
|
+
});
|
|
288
|
+
throw matchError;
|
|
289
|
+
}
|
|
159
290
|
const { remote: rawRemote } = remoteSplitInfo;
|
|
160
291
|
const remoteInfo = getRemoteInfo(rawRemote);
|
|
292
|
+
await this.hooks.lifecycle.afterMatchRemote.emit({
|
|
293
|
+
id: idRes,
|
|
294
|
+
...remoteSplitInfo,
|
|
295
|
+
options: host.options,
|
|
296
|
+
remoteInfo,
|
|
297
|
+
origin: host
|
|
298
|
+
});
|
|
161
299
|
const matchInfo = await host.sharedHandler.hooks.lifecycle.afterResolve.emit({
|
|
162
300
|
id: idRes,
|
|
163
301
|
...remoteSplitInfo,
|
package/dist/remote/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Module"],"sources":["../../src/remote/index.ts"],"sourcesContent":["import {\n isBrowserEnvValue,\n warn,\n composeKeyWithSeparator,\n ModuleInfo,\n GlobalModuleInfo,\n} from '@module-federation/sdk';\nimport { RUNTIME_004, runtimeDescMap } from '@module-federation/error-codes';\nimport {\n Global,\n getInfoWithoutType,\n globalLoading,\n CurrentGlobal,\n} from '../global';\nimport {\n Options,\n UserOptions,\n PreloadAssets,\n PreloadOptions,\n PreloadRemoteArgs,\n Remote,\n RemoteInfo,\n RemoteEntryExports,\n CallFrom,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n PluginSystem,\n AsyncHook,\n AsyncWaterfallHook,\n SyncHook,\n SyncWaterfallHook,\n} from '../utils/hooks';\nimport {\n assert,\n error,\n getRemoteInfo,\n getRemoteEntryUniqueKey,\n matchRemoteWithNameAndExpose,\n optionsToMFContext,\n logger,\n} from '../utils';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { Module, ModuleOptions } from '../module';\nimport { formatPreloadArgs, preloadAssets } from '../utils/preload';\nimport { getGlobalShareScope } from '../utils/share';\nimport { getGlobalRemoteInfo } from '../plugins/snapshot/SnapshotHandler';\n\nexport interface LoadRemoteMatch {\n id: string;\n pkgNameOrAlias: string;\n expose: string;\n remote: Remote;\n options: Options;\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteSnapshot?: ModuleInfo;\n}\n\nexport class RemoteHandler {\n host: ModuleFederation;\n idToRemoteMap: Record<string, { name: string; expose: string }>;\n\n hooks = new PluginSystem({\n beforeRegisterRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('beforeRegisterRemote'),\n registerRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('registerRemote'),\n beforeRequest: new AsyncWaterfallHook<{\n id: string;\n options: Options;\n origin: ModuleFederation;\n }>('beforeRequest'),\n onLoad: new AsyncHook<\n [\n {\n id: string;\n expose: string;\n pkgNameOrAlias: string;\n remote: Remote;\n options: ModuleOptions;\n origin: ModuleFederation;\n exposeModule: any;\n exposeModuleFactory: any;\n moduleInstance: Module;\n },\n ],\n void\n >('onLoad'),\n handlePreloadModule: new SyncHook<\n [\n {\n id: string;\n name: string;\n remote: Remote;\n remoteSnapshot: ModuleInfo;\n preloadConfig: PreloadRemoteArgs;\n origin: ModuleFederation;\n },\n ],\n void\n >('handlePreloadModule'),\n errorLoadRemote: new AsyncHook<\n [\n {\n id: string;\n error: unknown;\n options?: any;\n from: CallFrom;\n lifecycle:\n | 'beforeRequest'\n | 'beforeLoadShare'\n | 'afterResolve'\n | 'onLoad';\n origin: ModuleFederation;\n },\n ],\n void | unknown\n >('errorLoadRemote'),\n beforePreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n },\n ]\n >('beforePreloadRemote'),\n generatePreloadAssets: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n preloadOptions: PreloadOptions[number];\n remote: Remote;\n remoteInfo: RemoteInfo;\n remoteSnapshot: ModuleInfo;\n globalSnapshot: GlobalModuleInfo;\n },\n ],\n Promise<PreloadAssets>\n >('generatePreloadAssets'),\n // not used yet\n afterPreloadRemote: new AsyncHook<{\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n }>(),\n // TODO: Move to loaderHook\n loadEntry: new AsyncHook<\n [\n {\n loaderHook: ModuleFederation['loaderHook'];\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n },\n ],\n Promise<RemoteEntryExports>\n >(),\n });\n\n constructor(host: ModuleFederation) {\n this.host = host;\n this.idToRemoteMap = {};\n }\n\n formatAndRegisterRemote(globalOptions: Options, userOptions: UserOptions) {\n const userRemotes = userOptions.remotes || [];\n\n return userRemotes.reduce((res, remote) => {\n this.registerRemote(remote, res, { force: false });\n return res;\n }, globalOptions.remotes);\n }\n\n setIdToRemoteMap(id: string, remoteMatchInfo: LoadRemoteMatch) {\n const { remote, expose } = remoteMatchInfo;\n const { name, alias } = remote;\n this.idToRemoteMap[id] = { name: remote.name, expose };\n if (alias && id.startsWith(name)) {\n const idWithAlias = id.replace(name, alias);\n this.idToRemoteMap[idWithAlias] = { name: remote.name, expose };\n return;\n }\n\n if (alias && id.startsWith(alias)) {\n const idWithName = id.replace(alias, name);\n this.idToRemoteMap[idWithName] = { name: remote.name, expose };\n }\n }\n\n // eslint-disable-next-line max-lines-per-function\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async loadRemote<T>(\n id: string,\n options?: { loadFactory?: boolean; from: CallFrom },\n ): Promise<T | null> {\n const { host } = this;\n try {\n const { loadFactory = true } = options || {\n loadFactory: true,\n };\n // 1. Validate the parameters of the retrieved module. There are two module request methods: pkgName + expose and alias + expose.\n // 2. Request the snapshot information of the current host and globally store the obtained snapshot information. The retrieved module information is partially offline and partially online. The online module information will retrieve the modules used online.\n // 3. Retrieve the detailed information of the current module from global (remoteEntry address, expose resource address)\n // 4. After retrieving remoteEntry, call the init of the module, and then retrieve the exported content of the module through get\n // id: pkgName(@federation/app1) + expose(button) = @federation/app1/button\n // id: alias(app1) + expose(button) = app1/button\n // id: alias(app1/utils) + expose(loadash/sort) = app1/utils/loadash/sort\n const { module, moduleOptions, remoteMatchInfo } =\n await this.getRemoteModuleAndOptions({\n id,\n });\n const {\n pkgNameOrAlias,\n remote,\n expose,\n id: idRes,\n remoteSnapshot,\n } = remoteMatchInfo;\n\n const moduleOrFactory = (await module.get(\n idRes,\n expose,\n options,\n remoteSnapshot,\n )) as T;\n\n const moduleWrapper = await this.hooks.lifecycle.onLoad.emit({\n id: idRes,\n pkgNameOrAlias,\n expose,\n exposeModule: loadFactory ? moduleOrFactory : undefined,\n exposeModuleFactory: loadFactory ? undefined : moduleOrFactory,\n remote,\n options: moduleOptions,\n moduleInstance: module,\n origin: host,\n });\n\n this.setIdToRemoteMap(id, remoteMatchInfo);\n if (typeof moduleWrapper === 'function') {\n return moduleWrapper as T;\n }\n\n return moduleOrFactory;\n } catch (error) {\n const { from = 'runtime' } = options || { from: 'runtime' };\n\n const failOver = await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n error,\n from,\n lifecycle: 'onLoad',\n origin: host,\n });\n\n if (!failOver) {\n throw error;\n }\n\n return failOver as T;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n const { host } = this;\n\n await this.hooks.lifecycle.beforePreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n });\n\n const preloadOps: PreloadOptions = formatPreloadArgs(\n host.options.remotes,\n preloadOptions,\n );\n\n await Promise.all(\n preloadOps.map(async (ops) => {\n const { remote } = ops;\n const remoteInfo = getRemoteInfo(remote);\n const { globalSnapshot, remoteSnapshot } =\n await host.snapshotHandler.loadRemoteSnapshotInfo({\n moduleInfo: remote,\n });\n\n const assets = await this.hooks.lifecycle.generatePreloadAssets.emit({\n origin: host,\n preloadOptions: ops,\n remote,\n remoteInfo,\n globalSnapshot,\n remoteSnapshot,\n });\n if (!assets) {\n return;\n }\n preloadAssets(remoteInfo, host, assets);\n }),\n );\n }\n\n registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n const { host } = this;\n remotes.forEach((remote) => {\n this.registerRemote(remote, host.options.remotes, {\n force: options?.force,\n });\n });\n }\n\n async getRemoteModuleAndOptions(options: { id: string }): Promise<{\n module: Module;\n moduleOptions: ModuleOptions;\n remoteMatchInfo: LoadRemoteMatch;\n }> {\n const { host } = this;\n const { id } = options;\n let loadRemoteArgs;\n\n try {\n loadRemoteArgs = await this.hooks.lifecycle.beforeRequest.emit({\n id,\n options: host.options,\n origin: host,\n });\n } catch (error) {\n loadRemoteArgs = (await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n options: host.options,\n origin: host,\n from: 'runtime',\n error,\n lifecycle: 'beforeRequest',\n })) as {\n id: string;\n options: Options;\n origin: ModuleFederation;\n };\n\n if (!loadRemoteArgs) {\n throw error;\n }\n }\n\n const { id: idRes } = loadRemoteArgs;\n\n const remoteSplitInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n idRes,\n );\n if (!remoteSplitInfo) {\n error(\n RUNTIME_004,\n runtimeDescMap,\n {\n hostName: host.options.name,\n requestId: idRes,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n }\n\n const { remote: rawRemote } = remoteSplitInfo;\n const remoteInfo = getRemoteInfo(rawRemote);\n const matchInfo =\n await host.sharedHandler.hooks.lifecycle.afterResolve.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n origin: host,\n remoteInfo,\n });\n\n const { remote, expose } = matchInfo;\n assert(\n remote && expose,\n `The 'beforeRequest' hook was executed, but it failed to return the correct 'remote' and 'expose' values while loading ${idRes}.`,\n );\n let module: Module | undefined = host.moduleCache.get(remote.name);\n\n const moduleOptions: ModuleOptions = {\n host: host,\n remoteInfo,\n };\n\n if (!module) {\n module = new Module(moduleOptions);\n host.moduleCache.set(remote.name, module);\n }\n return {\n module,\n moduleOptions,\n remoteMatchInfo: matchInfo,\n };\n }\n\n registerRemote(\n remote: Remote,\n targetRemotes: Remote[],\n options?: { force?: boolean },\n ): void {\n const { host } = this;\n const normalizeRemote = () => {\n if (remote.alias) {\n // Validate if alias equals the prefix of remote.name and remote.alias, if so, throw an error\n // As multi-level path references cannot guarantee unique names, alias being a prefix of remote.name is not supported\n const findEqual = targetRemotes.find(\n (item) =>\n remote.alias &&\n (item.name.startsWith(remote.alias) ||\n item.alias?.startsWith(remote.alias)),\n );\n assert(\n !findEqual,\n `The alias ${remote.alias} of remote ${\n remote.name\n } is not allowed to be the prefix of ${\n findEqual && findEqual.name\n } name or alias`,\n );\n }\n // Set the remote entry to a complete path\n if ('entry' in remote) {\n if (\n isBrowserEnvValue &&\n typeof window !== 'undefined' &&\n !remote.entry.startsWith('http')\n ) {\n remote.entry = new URL(remote.entry, window.location.origin).href;\n }\n }\n if (!remote.shareScope) {\n remote.shareScope = DEFAULT_SCOPE;\n }\n if (!remote.type) {\n remote.type = DEFAULT_REMOTE_TYPE;\n }\n };\n this.hooks.lifecycle.beforeRegisterRemote.emit({ remote, origin: host });\n const registeredRemote = targetRemotes.find(\n (item) => item.name === remote.name,\n );\n if (!registeredRemote) {\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n } else {\n const messages = [\n `The remote \"${remote.name}\" is already registered.`,\n 'Please note that overriding it may cause unexpected errors.',\n ];\n if (options?.force) {\n // remove registered remote\n this.removeRemote(registeredRemote);\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n warn(messages.join(' '));\n }\n }\n }\n\n private removeRemote(remote: Remote): void {\n try {\n const { host } = this;\n const { name } = remote;\n const remoteIndex = host.options.remotes.findIndex(\n (item) => item.name === name,\n );\n if (remoteIndex !== -1) {\n host.options.remotes.splice(remoteIndex, 1);\n }\n const loadedModule = host.moduleCache.get(remote.name);\n if (loadedModule) {\n const remoteInfo = loadedModule.remoteInfo;\n const key = remoteInfo.entryGlobalName as keyof typeof CurrentGlobal;\n\n if (CurrentGlobal[key]) {\n if (\n Object.getOwnPropertyDescriptor(CurrentGlobal, key)?.configurable\n ) {\n delete CurrentGlobal[key];\n } else {\n // @ts-ignore\n CurrentGlobal[key] = undefined;\n }\n }\n const remoteEntryUniqueKey = getRemoteEntryUniqueKey(\n loadedModule.remoteInfo,\n );\n\n if (globalLoading[remoteEntryUniqueKey]) {\n delete globalLoading[remoteEntryUniqueKey];\n }\n\n host.snapshotHandler.manifestCache.delete(remoteInfo.entry);\n\n // delete unloaded shared and instance\n let remoteInsId = remoteInfo.buildVersion\n ? composeKeyWithSeparator(remoteInfo.name, remoteInfo.buildVersion)\n : remoteInfo.name;\n const remoteInsIndex =\n CurrentGlobal.__FEDERATION__.__INSTANCES__.findIndex((ins) => {\n if (remoteInfo.buildVersion) {\n return ins.options.id === remoteInsId;\n } else {\n return ins.name === remoteInsId;\n }\n });\n if (remoteInsIndex !== -1) {\n const remoteIns =\n CurrentGlobal.__FEDERATION__.__INSTANCES__[remoteInsIndex];\n remoteInsId = remoteIns.options.id || remoteInsId;\n const globalShareScopeMap = getGlobalShareScope();\n\n let isAllSharedNotUsed = true;\n const needDeleteKeys: Array<[string, string, string, string]> = [];\n Object.keys(globalShareScopeMap).forEach((instId) => {\n const shareScopeMap = globalShareScopeMap[instId];\n shareScopeMap &&\n Object.keys(shareScopeMap).forEach((shareScope) => {\n const shareScopeVal = shareScopeMap[shareScope];\n shareScopeVal &&\n Object.keys(shareScopeVal).forEach((shareName) => {\n const sharedPkgs = shareScopeVal[shareName];\n sharedPkgs &&\n Object.keys(sharedPkgs).forEach((shareVersion) => {\n const shared = sharedPkgs[shareVersion];\n if (\n shared &&\n typeof shared === 'object' &&\n shared.from === remoteInfo.name\n ) {\n if (shared.loaded || shared.loading) {\n shared.useIn = shared.useIn.filter(\n (usedHostName) =>\n usedHostName !== remoteInfo.name,\n );\n if (shared.useIn.length) {\n isAllSharedNotUsed = false;\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n }\n });\n });\n });\n });\n\n if (isAllSharedNotUsed) {\n remoteIns.shareScopeMap = {};\n delete globalShareScopeMap[remoteInsId];\n }\n needDeleteKeys.forEach(\n ([insId, shareScope, shareName, shareVersion]) => {\n delete globalShareScopeMap[insId]?.[shareScope]?.[shareName]?.[\n shareVersion\n ];\n },\n );\n CurrentGlobal.__FEDERATION__.__INSTANCES__.splice(remoteInsIndex, 1);\n }\n\n const { hostGlobalSnapshot } = getGlobalRemoteInfo(remote, host);\n if (hostGlobalSnapshot) {\n const remoteKey =\n hostGlobalSnapshot &&\n 'remotesInfo' in hostGlobalSnapshot &&\n hostGlobalSnapshot.remotesInfo &&\n getInfoWithoutType(hostGlobalSnapshot.remotesInfo, remote.name).key;\n if (remoteKey) {\n delete hostGlobalSnapshot.remotesInfo[remoteKey];\n if (\n //eslint-disable-next-line no-extra-boolean-cast\n Boolean(Global.__FEDERATION__.__MANIFEST_LOADING__[remoteKey])\n ) {\n delete Global.__FEDERATION__.__MANIFEST_LOADING__[remoteKey];\n }\n }\n }\n\n host.moduleCache.delete(remote.name);\n }\n } catch (err) {\n logger.error(\n `removeRemote failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Module"],"sources":["../../src/remote/index.ts"],"sourcesContent":["import {\n isBrowserEnvValue,\n warn,\n composeKeyWithSeparator,\n ModuleInfo,\n GlobalModuleInfo,\n} from '@module-federation/sdk';\nimport { RUNTIME_004, runtimeDescMap } from '@module-federation/error-codes';\nimport {\n Global,\n getInfoWithoutType,\n globalLoading,\n CurrentGlobal,\n} from '../global';\nimport {\n Options,\n UserOptions,\n PreloadAssets,\n PreloadOptions,\n PreloadRemoteArgs,\n PreloadRemoteResult,\n Remote,\n RemoteInfo,\n RemoteEntryExports,\n CallFrom,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n PluginSystem,\n AsyncHook,\n AsyncWaterfallHook,\n SyncHook,\n SyncWaterfallHook,\n} from '../utils/hooks';\nimport {\n assert,\n error,\n getRemoteInfo,\n getRemoteEntryUniqueKey,\n composeRemoteRequestId,\n matchRemoteWithNameAndExpose,\n optionsToMFContext,\n logger,\n} from '../utils';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { Module, ModuleOptions } from '../module';\nimport { formatPreloadArgs, preloadAssets } from '../utils/preload';\nimport { getGlobalShareScope } from '../utils/share';\nimport { getGlobalRemoteInfo } from '../plugins/snapshot/SnapshotHandler';\n\nexport interface LoadRemoteMatch {\n id: string;\n pkgNameOrAlias: string;\n expose: string;\n remote: Remote;\n options: Options;\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteSnapshot?: ModuleInfo;\n}\n\nexport class RemoteHandler {\n host: ModuleFederation;\n idToRemoteMap: Record<string, { name: string; expose: string }>;\n\n hooks = new PluginSystem({\n beforeRegisterRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('beforeRegisterRemote'),\n registerRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('registerRemote'),\n beforeRequest: new AsyncWaterfallHook<{\n id: string;\n options: Options;\n origin: ModuleFederation;\n }>('beforeRequest'),\n afterMatchRemote: new AsyncHook<\n [\n {\n id: string;\n options: Options;\n remote?: Remote;\n expose?: string;\n remoteInfo?: RemoteInfo;\n error?: unknown;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterMatchRemote'),\n onLoad: new AsyncHook<\n [\n {\n id: string;\n expose: string;\n pkgNameOrAlias: string;\n remote: Remote;\n options: ModuleOptions;\n origin: ModuleFederation;\n exposeModule: any;\n exposeModuleFactory: any;\n moduleInstance: Module;\n },\n ],\n unknown\n >('onLoad'),\n afterLoadRemote: new AsyncHook<\n [\n {\n id: string;\n expose?: string;\n remote?: RemoteInfo;\n options?: {\n loadFactory?: boolean;\n from?: CallFrom;\n };\n error?: unknown;\n recovered?: boolean;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterLoadRemote'),\n handlePreloadModule: new SyncHook<\n [\n {\n id: string;\n name: string;\n remote: Remote;\n remoteSnapshot: ModuleInfo;\n preloadConfig: PreloadRemoteArgs;\n origin: ModuleFederation;\n },\n ],\n void\n >('handlePreloadModule'),\n errorLoadRemote: new AsyncHook<\n [\n {\n id: string;\n error: unknown;\n options?: any;\n from: CallFrom;\n lifecycle:\n | 'beforeRequest'\n | 'beforeLoadShare'\n | 'afterResolve'\n | 'onLoad';\n remote?: RemoteInfo;\n expose?: string;\n origin: ModuleFederation;\n },\n ],\n void | unknown\n >('errorLoadRemote'),\n beforePreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n },\n ]\n >('beforePreloadRemote'),\n generatePreloadAssets: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n preloadOptions: PreloadOptions[number];\n remote: Remote;\n remoteInfo: RemoteInfo;\n remoteSnapshot: ModuleInfo;\n globalSnapshot: GlobalModuleInfo;\n },\n ],\n Promise<PreloadAssets>\n >('generatePreloadAssets'),\n afterPreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n results: PreloadRemoteResult[];\n error?: unknown;\n },\n ]\n >('afterPreloadRemote'),\n // TODO: Move to loaderHook\n loadEntry: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n loaderHook: ModuleFederation['loaderHook'];\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n },\n ],\n Promise<RemoteEntryExports | void> | RemoteEntryExports | void\n >(),\n });\n\n constructor(host: ModuleFederation) {\n this.host = host;\n this.idToRemoteMap = {};\n }\n\n formatAndRegisterRemote(globalOptions: Options, userOptions: UserOptions) {\n const userRemotes = userOptions.remotes || [];\n\n return userRemotes.reduce((res, remote) => {\n this.registerRemote(remote, res, { force: false });\n return res;\n }, globalOptions.remotes);\n }\n\n setIdToRemoteMap(id: string, remoteMatchInfo: LoadRemoteMatch) {\n const { remote, expose } = remoteMatchInfo;\n const { name, alias } = remote;\n this.idToRemoteMap[id] = { name: remote.name, expose };\n if (alias && id.startsWith(name)) {\n const idWithAlias = id.replace(name, alias);\n this.idToRemoteMap[idWithAlias] = { name: remote.name, expose };\n return;\n }\n\n if (alias && id.startsWith(alias)) {\n const idWithName = id.replace(alias, name);\n this.idToRemoteMap[idWithName] = { name: remote.name, expose };\n }\n }\n\n // eslint-disable-next-line max-lines-per-function\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async loadRemote<T>(\n id: string,\n options?: { loadFactory?: boolean; from: CallFrom },\n ): Promise<T | null> {\n const { host } = this;\n const startMatchInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n id,\n );\n let completeRequestId = id;\n let completeExpose = startMatchInfo?.expose;\n let completeRemote = startMatchInfo\n ? getRemoteInfo(startMatchInfo.remote)\n : undefined;\n let afterLoadRemoteArgs:\n | Parameters<\n RemoteHandler['hooks']['lifecycle']['afterLoadRemote']['emit']\n >[0]\n | undefined;\n\n try {\n const { loadFactory = true } = options || {\n loadFactory: true,\n };\n // 1. Validate the parameters of the retrieved module. There are two module request methods: pkgName + expose and alias + expose.\n // 2. Request the snapshot information of the current host and globally store the obtained snapshot information. The retrieved module information is partially offline and partially online. The online module information will retrieve the modules used online.\n // 3. Retrieve the detailed information of the current module from global (remoteEntry address, expose resource address)\n // 4. After retrieving remoteEntry, call the init of the module, and then retrieve the exported content of the module through get\n // id: pkgName(@federation/app1) + expose(button) = @federation/app1/button\n // id: alias(app1) + expose(button) = app1/button\n // id: alias(app1/utils) + expose(loadash/sort) = app1/utils/loadash/sort\n const { module, moduleOptions, remoteMatchInfo } =\n await this.getRemoteModuleAndOptions({\n id,\n });\n const {\n pkgNameOrAlias,\n remote,\n expose,\n id: idRes,\n remoteSnapshot,\n } = remoteMatchInfo;\n completeRequestId = idRes;\n completeExpose = expose;\n completeRemote = getRemoteInfo(remote);\n\n const moduleOrFactory = (await module.get(\n idRes,\n expose,\n options,\n remoteSnapshot,\n )) as T;\n\n const moduleWrapper = await this.hooks.lifecycle.onLoad.emit({\n id: idRes,\n pkgNameOrAlias,\n expose,\n exposeModule: loadFactory ? moduleOrFactory : undefined,\n exposeModuleFactory: loadFactory ? undefined : moduleOrFactory,\n remote,\n options: moduleOptions,\n moduleInstance: module,\n origin: host,\n });\n\n this.setIdToRemoteMap(id, remoteMatchInfo);\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n origin: host,\n };\n\n if (typeof moduleWrapper === 'function') {\n return moduleWrapper as T;\n }\n\n return moduleOrFactory;\n } catch (error) {\n const { from = 'runtime' } = options || { from: 'runtime' };\n\n let failOver;\n try {\n failOver = await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n error,\n from,\n lifecycle: 'onLoad',\n expose: completeExpose,\n remote: completeRemote,\n origin: host,\n });\n } catch (hookError) {\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error: hookError,\n origin: host,\n };\n throw hookError;\n }\n\n if (!failOver) {\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error,\n origin: host,\n };\n throw error;\n }\n\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error,\n origin: host,\n recovered: true,\n };\n\n return failOver as T;\n } finally {\n if (afterLoadRemoteArgs) {\n await this.hooks.lifecycle.afterLoadRemote.emit(afterLoadRemoteArgs);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n const { host } = this;\n const preloadResults: PreloadRemoteResult[] = [];\n\n await this.hooks.lifecycle.beforePreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n });\n\n const preloadOps: PreloadOptions = formatPreloadArgs(\n host.options.remotes,\n preloadOptions,\n );\n\n const createPreloadAssetOps = (ops: PreloadOptions[number]) => {\n const { preloadConfig, remote } = ops;\n const exposes = preloadConfig.exposes || [];\n\n if (!exposes.length) {\n return [\n {\n ops,\n id: `${remote.name}/*`,\n },\n ];\n }\n\n return exposes.map((expose) => ({\n ops: {\n ...ops,\n preloadConfig: {\n ...preloadConfig,\n exposes: [expose],\n },\n },\n id: composeRemoteRequestId(remote.name, expose),\n }));\n };\n\n let preloadError: Error | undefined;\n\n await Promise.all(\n preloadOps.flatMap(createPreloadAssetOps).map(async (assetOps) => {\n const { ops, id: preloadId } = assetOps;\n const { remote, preloadConfig } = ops;\n const remoteInfo = getRemoteInfo(remote);\n try {\n const { globalSnapshot, remoteSnapshot } =\n await host.snapshotHandler.loadRemoteSnapshotInfo({\n moduleInfo: remote,\n id: preloadId,\n initiator: 'preloadRemote',\n });\n\n const assets = await this.hooks.lifecycle.generatePreloadAssets.emit({\n origin: host,\n preloadOptions: ops,\n remote,\n remoteInfo,\n globalSnapshot,\n remoteSnapshot,\n });\n if (!assets) {\n return;\n }\n const results = await preloadAssets(remoteInfo, host, assets, true, {\n initiator: 'preloadRemote',\n id: preloadId,\n });\n preloadResults.push({\n remote,\n remoteInfo,\n preloadConfig,\n id: preloadId,\n results,\n });\n } catch (error) {\n preloadResults.push({\n remote,\n remoteInfo,\n preloadConfig,\n id: preloadId,\n results: [\n {\n url: remoteInfo.entry,\n status: 'error',\n resourceType: /\\.json(?:$|[?#])/i.test(remoteInfo.entry)\n ? 'manifest'\n : 'remoteEntry',\n initiator: 'preloadRemote',\n id: preloadId,\n error,\n },\n ],\n });\n }\n }),\n );\n\n const failedResults = preloadResults.flatMap((preloadResult) =>\n preloadResult.results.filter(\n (result) => result.status === 'error' || result.status === 'timeout',\n ),\n );\n if (failedResults.length > 0) {\n preloadError = new Error(\n `preloadRemote failed to load ${failedResults.length} resource(s).`,\n );\n Object.assign(preloadError, {\n results: preloadResults,\n failedResults,\n });\n }\n\n await this.hooks.lifecycle.afterPreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n results: preloadResults,\n error: preloadError,\n });\n\n if (preloadError) {\n throw preloadError;\n }\n }\n\n registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n const { host } = this;\n remotes.forEach((remote) => {\n this.registerRemote(remote, host.options.remotes, {\n force: options?.force,\n });\n });\n }\n\n async getRemoteModuleAndOptions(options: { id: string }): Promise<{\n module: Module;\n moduleOptions: ModuleOptions;\n remoteMatchInfo: LoadRemoteMatch;\n }> {\n const { host } = this;\n const { id } = options;\n let loadRemoteArgs;\n\n try {\n loadRemoteArgs = await this.hooks.lifecycle.beforeRequest.emit({\n id,\n options: host.options,\n origin: host,\n });\n } catch (error) {\n loadRemoteArgs = (await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n options: host.options,\n origin: host,\n from: 'runtime',\n error,\n lifecycle: 'beforeRequest',\n })) as {\n id: string;\n options: Options;\n origin: ModuleFederation;\n };\n\n if (!loadRemoteArgs) {\n throw error;\n }\n }\n\n const { id: idRes } = loadRemoteArgs;\n\n const remoteSplitInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n idRes,\n );\n if (!remoteSplitInfo) {\n try {\n error(\n RUNTIME_004,\n runtimeDescMap,\n {\n hostName: host.options.name,\n requestId: idRes,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n } catch (matchError) {\n await this.hooks.lifecycle.afterMatchRemote.emit({\n id: idRes,\n options: host.options,\n error: matchError,\n origin: host,\n });\n throw matchError;\n }\n }\n\n const { remote: rawRemote } = remoteSplitInfo;\n const remoteInfo = getRemoteInfo(rawRemote);\n await this.hooks.lifecycle.afterMatchRemote.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n remoteInfo,\n origin: host,\n });\n const matchInfo =\n await host.sharedHandler.hooks.lifecycle.afterResolve.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n origin: host,\n remoteInfo,\n });\n\n const { remote, expose } = matchInfo;\n assert(\n remote && expose,\n `The 'beforeRequest' hook was executed, but it failed to return the correct 'remote' and 'expose' values while loading ${idRes}.`,\n );\n let module: Module | undefined = host.moduleCache.get(remote.name);\n\n const moduleOptions: ModuleOptions = {\n host: host,\n remoteInfo,\n };\n\n if (!module) {\n module = new Module(moduleOptions);\n host.moduleCache.set(remote.name, module);\n }\n return {\n module,\n moduleOptions,\n remoteMatchInfo: matchInfo,\n };\n }\n\n registerRemote(\n remote: Remote,\n targetRemotes: Remote[],\n options?: { force?: boolean },\n ): void {\n const { host } = this;\n const normalizeRemote = () => {\n if (remote.alias) {\n // Validate if alias equals the prefix of remote.name and remote.alias, if so, throw an error\n // As multi-level path references cannot guarantee unique names, alias being a prefix of remote.name is not supported\n const findEqual = targetRemotes.find(\n (item) =>\n remote.alias &&\n (item.name.startsWith(remote.alias) ||\n item.alias?.startsWith(remote.alias)),\n );\n assert(\n !findEqual,\n `The alias ${remote.alias} of remote ${\n remote.name\n } is not allowed to be the prefix of ${\n findEqual && findEqual.name\n } name or alias`,\n );\n }\n // Set the remote entry to a complete path\n if ('entry' in remote) {\n if (\n isBrowserEnvValue &&\n typeof window !== 'undefined' &&\n !remote.entry.startsWith('http')\n ) {\n remote.entry = new URL(remote.entry, window.location.origin).href;\n }\n }\n if (!remote.shareScope) {\n remote.shareScope = DEFAULT_SCOPE;\n }\n if (!remote.type) {\n remote.type = DEFAULT_REMOTE_TYPE;\n }\n };\n this.hooks.lifecycle.beforeRegisterRemote.emit({ remote, origin: host });\n const registeredRemote = targetRemotes.find(\n (item) => item.name === remote.name,\n );\n if (!registeredRemote) {\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n } else {\n const messages = [\n `The remote \"${remote.name}\" is already registered.`,\n 'Please note that overriding it may cause unexpected errors.',\n ];\n if (options?.force) {\n // remove registered remote\n this.removeRemote(registeredRemote);\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n warn(messages.join(' '));\n }\n }\n }\n\n private removeRemote(remote: Remote): void {\n try {\n const { host } = this;\n const { name } = remote;\n const remoteIndex = host.options.remotes.findIndex(\n (item) => item.name === name,\n );\n if (remoteIndex !== -1) {\n host.options.remotes.splice(remoteIndex, 1);\n }\n const loadedModule = host.moduleCache.get(remote.name);\n if (loadedModule) {\n const remoteInfo = loadedModule.remoteInfo;\n const key = remoteInfo.entryGlobalName as keyof typeof CurrentGlobal;\n\n if (CurrentGlobal[key]) {\n if (\n Object.getOwnPropertyDescriptor(CurrentGlobal, key)?.configurable\n ) {\n delete CurrentGlobal[key];\n } else {\n // @ts-ignore\n CurrentGlobal[key] = undefined;\n }\n }\n const remoteEntryUniqueKey = getRemoteEntryUniqueKey(\n loadedModule.remoteInfo,\n );\n\n if (globalLoading[remoteEntryUniqueKey]) {\n delete globalLoading[remoteEntryUniqueKey];\n }\n\n host.snapshotHandler.manifestCache.delete(remoteInfo.entry);\n\n // delete unloaded shared and instance\n let remoteInsId = remoteInfo.buildVersion\n ? composeKeyWithSeparator(remoteInfo.name, remoteInfo.buildVersion)\n : remoteInfo.name;\n const remoteInsIndex =\n CurrentGlobal.__FEDERATION__.__INSTANCES__.findIndex((ins) => {\n if (remoteInfo.buildVersion) {\n return ins.options.id === remoteInsId;\n } else {\n return ins.name === remoteInsId;\n }\n });\n if (remoteInsIndex !== -1) {\n const remoteIns =\n CurrentGlobal.__FEDERATION__.__INSTANCES__[remoteInsIndex];\n remoteInsId = remoteIns.options.id || remoteInsId;\n const globalShareScopeMap = getGlobalShareScope();\n\n let isAllSharedNotUsed = true;\n const needDeleteKeys: Array<[string, string, string, string]> = [];\n Object.keys(globalShareScopeMap).forEach((instId) => {\n const shareScopeMap = globalShareScopeMap[instId];\n shareScopeMap &&\n Object.keys(shareScopeMap).forEach((shareScope) => {\n const shareScopeVal = shareScopeMap[shareScope];\n shareScopeVal &&\n Object.keys(shareScopeVal).forEach((shareName) => {\n const sharedPkgs = shareScopeVal[shareName];\n sharedPkgs &&\n Object.keys(sharedPkgs).forEach((shareVersion) => {\n const shared = sharedPkgs[shareVersion];\n if (\n shared &&\n typeof shared === 'object' &&\n shared.from === remoteInfo.name\n ) {\n if (shared.loaded || shared.loading) {\n shared.useIn = shared.useIn.filter(\n (usedHostName) =>\n usedHostName !== remoteInfo.name,\n );\n if (shared.useIn.length) {\n isAllSharedNotUsed = false;\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n }\n });\n });\n });\n });\n\n if (isAllSharedNotUsed) {\n remoteIns.shareScopeMap = {};\n delete globalShareScopeMap[remoteInsId];\n }\n needDeleteKeys.forEach(\n ([insId, shareScope, shareName, shareVersion]) => {\n delete globalShareScopeMap[insId]?.[shareScope]?.[shareName]?.[\n shareVersion\n ];\n },\n );\n CurrentGlobal.__FEDERATION__.__INSTANCES__.splice(remoteInsIndex, 1);\n }\n\n const { hostGlobalSnapshot } = getGlobalRemoteInfo(remote, host);\n if (hostGlobalSnapshot) {\n const remoteKey =\n hostGlobalSnapshot &&\n 'remotesInfo' in hostGlobalSnapshot &&\n hostGlobalSnapshot.remotesInfo &&\n getInfoWithoutType(hostGlobalSnapshot.remotesInfo, remote.name).key;\n if (remoteKey) {\n delete hostGlobalSnapshot.remotesInfo[remoteKey];\n if (\n //eslint-disable-next-line no-extra-boolean-cast\n Boolean(Global.__FEDERATION__.__MANIFEST_LOADING__[remoteKey])\n ) {\n delete Global.__FEDERATION__.__MANIFEST_LOADING__[remoteKey];\n }\n }\n }\n\n host.moduleCache.delete(remote.name);\n }\n } catch (err) {\n logger.error(\n `removeRemote failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n}\n"],"mappings":"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"}
|