@ equinor/ 组合框架- 模块- app
用于运行时加载,配置和管理Fusion应用程序的框架模块.
主要用于: 门户主机 和其他需要动态发现、加载和在应用程序之间切换的框架发起者。 模块处理显示获取、构建解析度、配置加载、每个用户的应用程序设置,以及应用程序捆绑的脚本导入.
何时使用
- 您正在构建一个门户或外壳, 托管多个 Fusion 应用程序 .
- 您需要从 Fusion app 服务中获取应用程序清单和配置 .
- 您需要在运行时动态导入应用程序的 JavaScript 捆绑 .
- 您需要读取或写入每个用户的应用程序设置 .
[注] 通过设计,这个模块只允许 一个活动应用程序 一次( e)
currentApp) (中文(简体) ). 如果您需要多个并行应用实例,请使用部件模块取而代之 .
快速启动
启用框架配置符中的模块 :
import { enableAppModule } from '@equinor/fusion-framework-module-app';
export const configure = async (configurator: FrameworkConfigurator) => {
enableAppModule(configurator);
};
一旦启用 AppModuleProvider 可在框架实例中找到:
const appProvider = framework.modules.app;
// Set the current application by key
appProvider.setCurrentApp('my-app');
// React to current app changes
appProvider.current$.subscribe((app) => {
if (app) {
console.log('Current app:', app.appKey);
}
});
核心概念
应用程序
主运行时间入站. 提供下列方法:
- 获取清单 – 说吧 –
getAppManifest(appKey)财务报告和审定财务报表getAppManifests()返回可观测流AppManifest对象. - 获取配置 – 说吧 –
getAppConfig(appKey)返回应用程序的环境和端点配置. - 管理设置 – 说吧 –
getAppSettings(appKey)财务报告和审定财务报表updateAppSettings(appKey, settings)每个用户读取和写入设置. - 设置/ 清除当前应用程序 – 说吧 –
setCurrentApp(appKey)创建一个App实例并发布current$。 。 。 .clearCurrentApp()处理当前应用程序 .
应用
代表一个装入的应用程序 。 通过被动状态机器管理显示、配置、设置和导入脚本模块的内部状态(FlowSubject) (中文(简体) ). 密钥可观察到 :
| 可观察 | 输出 |
|---|---|
manifest$ | AppManifest 解决后 |
config$ | AppConfig 解决后 |
settings$ | AppSettings (比较订阅) |
modules$ | 已导入 AppScriptModule |
instance$ | 已初始化 AppModulesInstance |
status$ | 一组在建行动类型 |
打电话 app.initialize() 将显示、配置和脚本平行地加载,并将其作为可观测的集合.
用户
与Fusion App服务API通信的低等HTTP客户端. 处理缓存( 通过 Query),响应解析(通过Zod schemas),以及将错误映射到打入错误类(AppManifestError, (中文(简体) ), AppConfigError, (中文(简体) ), AppBuildError, (中文(简体) ), AppSettingsError) (中文(简体) ).
应用程序
不可移动、被深冻的配置对象 environment (任意键值数据)和 endpoints (有 OAuth 范围的名称 URL). 使用 config.getEndpoint('api') 以获取特定终点.
应用程序配置器
模块初始化时使用的配置构建器 。 允许压倒默认的 HTTP 客户端和资产 URI :
enableAppModule(configurator, (builder) => {
builder.setClient(async (args) => {
const http = await args.requireInstance('http');
return new AppClient(http.createClient('my-custom-apps'));
});
builder.setAssetUri('/custom-proxy');
});
活动
当 EventModule 可用时,应用程序模块会发送显示、配置、设置和脚本加载的生命周期事件。 主要活动包括:
onCurrentAppChanged- 当setCurrentApp或者说clearCurrentApp名为onAppManifestLoad编号 :onAppManifestLoaded编号 :onAppManifestFailureonAppConfigLoad编号 :onAppConfigLoaded编号 :onAppConfigFailureonAppSettingsLoad编号 :onAppSettingsLoaded编号 :onAppSettingsFailureonAppScriptLoad编号 :onAppScriptLoaded编号 :onAppScriptFailureonAppInitialize编号 :onAppInitialized编号 :onAppInitializeFailureonAppDispose
处理错误
所有 API 请求映射 HTTP 状态代码以输入错误类 :
| 错误类 | 当抛出时 |
|---|---|
AppManifestError | 求解失败( 404, 401, 410) |
AppConfigError | 配置获取失败 |
AppBuildError | 构建元数据获取失败 |
AppSettingsError | 设置获取或更新失败 |
AppScriptModuleError | 脚本导入失败 |
每个错误包括: type 财产('not_found', (中文(简体) ), 'unauthorized', (中文(简体) ), 'deleted',或 'unknown'用于方案处理.
操作遥测
提供工具 TelemetryConnectable ,并通过
telemetry.scope('app'),有一个懒惰的工厂 倒背旧的定制供应商.
每个应用程序都拥有一个儿童范围;舞台观察员留在当地,
时间、安全身份和处置采用共享遥测方法.
当主机登记遥测时,每个应用程序都会报告一个 fusion.app.<stage>.duration
每个尝试阶段的结果: load-manifest, (中文(简体) ), load-config, (中文(简体) ), load-settings, (中文(简体) ),
update-settings, (中文(简体) ), import, (中文(简体) ), load,以及 unload 当应用程序被替换或清除时.
load 每个结果 initialize() 订阅:结果、错误或
cancelled 当召人先不订阅. 结果是 success, (中文(简体) ), failure (单位:千美元)
一个消毒 .failure 例外; 阶段故障带有静态原因, 如
not-found)或(或) cancelled (理由 superseded, (中文(简体) ), unloaded,或 disposed 当应用程序
模块被处理). 丢出记录失败的倒数 unload记录只携带
验证的 appKey 财务报告和审定财务报表 appVersion; 清单、配置、设置、 URL 和
错误消息从不导出 。 一个被替换的应用程序 停止载入报告,
即便同步模块被拆卸等待;其单独拥有 unload
当拆解结束时,测量结束。 排队阶段结果与
产生它们的请求, 不是一个新的请求 在同一阶段.
遥测在初始化后是相连的 从未等待过 所以装入结果,
错误和取消保持不变。 排除带有遥测适配器的这些记录
打开中继过滤器 diagnostic.module === 'app'。见 操作遥测。 。 。 .
测试
从 @equinor/fusion-framework-module-app/mock 以服务一个应用程序的列表
并本地配置, 而不是联系应用程序服务 。 真实的 AppClient
仍然支持所有其他请求——其他应用密钥,标记请求,构建,
设置——如此指向 setClient 在不同的 http 客户端或服务中
发现登记册的工作保持不变.
import { MockAppClient } from '@equinor/fusion-framework-module-app/mock';
enableAppModule(configurator, (builder) => {
builder.setClient(async ({ requireInstance }) => {
const http = await requireInstance('http');
return new MockAppClient(http.createClient('apps'), manifest, config);
});
});
getAppManifest 仅本地解析 manifest.appKey 没有 tag 时间
都说吧. getAppConfig 决定 manifest.appKey 何时 tag 要么缺席
或等于仪表本身 build.version - 同样的标签 App 请求
当装入显示器的配置时,它已经解决了。 任何其他应用密钥,
标记,否则错误的请求会传递给真正的客户端.
[注]
@equinor/fusion-framework-app/mock是因为mockAppModules以此为基础 类,通常是测试应用程序的更简单的切入点—— 见它的 测试 向导.
主要出口
| 导出 | 说明 |
|---|---|
enableAppModule | 用框架配置器注册模块 |
AppModuleProvider | 具有应用生命周期方法的运行时间提供者 |
AppClient | 应用服务的低级 HTTP 客户端 |
AppConfigurator | 模块设置配置构建器 |
AppConfig | Immultable app 配置 (env + end points) 软件 |
App 编号 : IApp | 反应状态的申请实例 |
AppModule | 框架的模块定义 |
MockAppClient | 测试双倍服务一个应用程序的显示和本地配置( T)/mock(中文(简体) ) |