platform-core-ng 22.9.0-rc.2 → 22.9.0-rc.4
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/README.md +23 -1
- package/fesm2022/platform-core-ng-providers.mjs +5 -10
- package/fesm2022/platform-core-ng-providers.mjs.map +1 -1
- package/fesm2022/platform-core-ng-runtime.mjs +2 -25
- package/fesm2022/platform-core-ng-runtime.mjs.map +1 -1
- package/fesm2022/platform-core-ng-ui-common.mjs +103 -11
- package/fesm2022/platform-core-ng-ui-common.mjs.map +1 -1
- package/fesm2022/platform-core-ng-ui-desktop.mjs +55 -22
- package/fesm2022/platform-core-ng-ui-desktop.mjs.map +1 -1
- package/fesm2022/platform-core-ng-ui-mobile.mjs +2 -2
- package/fesm2022/platform-core-ng-ui-mobile.mjs.map +1 -1
- package/package.json +1 -1
- package/shared/components/s-dialog/s-dialog-container.component.scss +1 -1
- package/styles/index.scss +1 -0
- package/styles/recipes/_index.scss +2 -1
- package/styles/recipes/_list-page-filter.scss +269 -0
- package/styles/themes/_table.scss +1 -1
- package/styles/tokens/_table.scss +1 -1
- package/styles/tokens/table.tokens.json +2 -2
- package/types/platform-core-ng-runtime.d.ts +2 -18
- package/types/platform-core-ng-ui-common.d.ts +30 -6
- package/types/platform-core-ng-ui-desktop.d.ts +17 -2
package/README.md
CHANGED
|
@@ -53,12 +53,16 @@ packed/registry 矩阵和回滚验证全部清零后删除。
|
|
|
53
53
|
|
|
54
54
|
页面/组件的 loading 输入由本页请求或操作生命周期设置,不能用应用总活动默认点亮所有页面遮罩。只有平台装配适配器可使用 `PLATFORM_REQUEST_ACTIVITY_WRITER`;自定义 HTTP 栈通过现有 `HTTP_ACTIVITY_PORT` 扩展,不让业务页面写入应用总计数。
|
|
55
55
|
|
|
56
|
-
旧 `isLoading`、`increaseLoading`、`decreaseLoading`
|
|
56
|
+
旧 `isLoading`、`increaseLoading`、`decreaseLoading` 已按 [ADR-0052](../../docs/adr/0052-retire-global-loading-api.md) 从源码退役。应用总进度读取 `PlatformRequestActivity`,页面使用局部状态。`BaseListComponent.isLoading` 只跟随该实例最新有效查询,不等待被替换的旧查询。此破坏性变更须在新的不可变版本发布后生效,不能覆盖已有 RC。
|
|
57
57
|
|
|
58
58
|
请求活动由 `requestInterceptor` 在订阅和 finalize 中配对,包含同步异常、错误、取消和重试。`responseInterceptor` 不再结束活动;自定义组合不得依赖它释放手工 begin。回退需同时恢复同一版本的 Runtime、Provider 和请求/响应拦截器。
|
|
59
59
|
|
|
60
60
|
### 列表与上传组合
|
|
61
61
|
|
|
62
|
+
局部加载的竞态与展示合同见 [ADR-0053](../../docs/adr/0053-local-loading-concurrency-and-presentation.md)。按 [ADR-0055](../../docs/adr/0055-latest-query-cancellation-and-lifecycle.md),BaseList 使用组合查询工具,只接受最新结果,由 DestroyRef 自动清理,子类无需调用父销毁钩子;`isDeleting` 独立跟踪删除。业务保存、删除、导出各自持有状态并用 finally 释放,不用运行时总活动驱动页面遮罩。
|
|
63
|
+
|
|
64
|
+
`[sLoading]` 立即表达 `aria-busy` 并显示动画;按 [ADR-0054](../../docs/adr/0054-loading-minimum-visible-duration.md) 每次活动至少展示 150ms,销毁立即清理。原生按钮呈现内联进度,调用方同时绑定 `[disabled]="saving()"` 并防重复提交;表格沿用局部遮罩。联系人、消息等内容首屏使用骨架,刷新保留已有内容。
|
|
65
|
+
|
|
62
66
|
新列表页面组合原生 Table 增强、分页/选择展示和应用查询状态;应用拥有请求 DTO、权限、删除后刷新及错误恢复。BaseList 的既有正式 API 继续保留,当前消费者与删除窗口见 [列表兼容合同](../../governance/platform-core-ng/list-composition-compatibility.json),不能从静态未检出推断允许删除。
|
|
63
67
|
|
|
64
68
|
Upload 保留受控文件项/进度及事件接口,内部组合选择、裁剪队列与弹窗生命周期。应用提供 HTTP、鉴权、存储及类型/字节校验,不将上传业务策略提升到 Core。边界见 [上传组合决策](../../docs/adr/0040-upload-composition-and-crop-lifetime.md),可运行用法复用组件文档 Upload 场景。
|
|
@@ -189,3 +193,21 @@ npm run test:m-page-safe-area-acceptance
|
|
|
189
193
|
## Additional Resources
|
|
190
194
|
|
|
191
195
|
For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
|
|
196
|
+
|
|
197
|
+
### 可取消的页面查询
|
|
198
|
+
|
|
199
|
+
在组件字段初始化时调用 `/ui/common` 的 `createLatestQuery()`,将其 `loading` 绑定到现有展示。查询直接返回服务的 HttpClient Observable,替换或销毁时自动退订;不要先用 firstValueFrom 转为不可取消的 Promise。
|
|
200
|
+
|
|
201
|
+
```ts
|
|
202
|
+
private readonly query = createLatestQuery();
|
|
203
|
+
protected readonly loading = this.query.loading;
|
|
204
|
+
|
|
205
|
+
protected refresh(): Promise<void> {
|
|
206
|
+
return this.query.run(
|
|
207
|
+
() => this.api.list(this.buildQuery()),
|
|
208
|
+
result => this.rows.set(result.items),
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
有效查询错误仍由返回的 Promise 传播;可选第三个回调仅同步更新页面错误状态,不代替统一错误处理。替换和销毁属于正常取消。不要在全局单例创建页面查询状态,也不要将保存、删除等写操作交给该工具。旧 Promise 查询仍兼容,但只有服务消费 AbortSignal 才能协作取消底层工作。
|
|
@@ -3,7 +3,7 @@ import * as i0 from '@angular/core';
|
|
|
3
3
|
import { inject, Injectable, DestroyRef, InjectionToken, makeEnvironmentProviders, provideEnvironmentInitializer, Injector, effect, ErrorHandler } from '@angular/core';
|
|
4
4
|
import { HTTP_ACTIVITY_PORT, requestInterceptor, responseInterceptor, httpFeedbackOwnershipInterceptor, HTTP_FEEDBACK_EVENT_PORT, HTTP_AUTH_TOKEN_GETTER, HTTP_CONFIG, HTTP_RESPONSE_INTERCEPTOR_CONFIG, HTTP_UNAUTHORIZED_HANDLER, HttpUnauthorizedException } from 'platform-core-ng/http';
|
|
5
5
|
import { providePlatformFeedbackScope, registerHostedPlatformFeedbackTarget, PLATFORM_FEEDBACK_INGRESS_PORT, PlatformFeedbackService } from 'platform-core-ng/feedback';
|
|
6
|
-
import { RuntimeService, PLATFORM_REQUEST_ACTIVITY_WRITER,
|
|
6
|
+
import { RuntimeService, PLATFORM_REQUEST_ACTIVITY_WRITER, RuntimeSessionReaderService, provideWorkspaceApplicationHostScope, provideRuntimeContext, providePlatformRequestActivityScope, APP_RUNTIME_CONTEXT, synchronizeHostedRuntimeContext, normalizeRuntimeContext, HOSTED_RUNTIME_CAPABILITIES } from 'platform-core-ng/runtime';
|
|
7
7
|
import { PermissionService, PERMISSION_AUDIT_PORT } from 'platform-core-ng/permission';
|
|
8
8
|
import { from } from 'rxjs';
|
|
9
9
|
import { getPlatformError, getHttpStatusMessage } from 'platform-core-ts';
|
|
@@ -171,7 +171,7 @@ function providePlatformAuditLogger(auditLogger) {
|
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
/**
|
|
174
|
-
* 装配当前 HTTP
|
|
174
|
+
* 装配当前 HTTP 的作用域计数;只由标准 Standalone 装配调用。
|
|
175
175
|
* @returns 绑定当前注入器生命周期的 HTTP 活动适配 Provider。
|
|
176
176
|
*/
|
|
177
177
|
function provideRequestActivityAdapter() {
|
|
@@ -184,11 +184,8 @@ function provideRequestActivityAdapter() {
|
|
|
184
184
|
let disposed = false;
|
|
185
185
|
destroyRef.onDestroy(() => {
|
|
186
186
|
disposed = true;
|
|
187
|
-
//
|
|
188
|
-
|
|
189
|
-
outstanding -= 1;
|
|
190
|
-
decreaseLoading();
|
|
191
|
-
}
|
|
187
|
+
// Runtime 同步销毁自身计数;迟到的完成通知不能影响重建后的作用域。
|
|
188
|
+
outstanding = 0;
|
|
192
189
|
});
|
|
193
190
|
return {
|
|
194
191
|
begin: () => {
|
|
@@ -196,15 +193,13 @@ function provideRequestActivityAdapter() {
|
|
|
196
193
|
return;
|
|
197
194
|
outstanding += 1;
|
|
198
195
|
writer.begin();
|
|
199
|
-
increaseLoading();
|
|
200
196
|
},
|
|
201
197
|
end: () => {
|
|
202
|
-
//
|
|
198
|
+
// 已销毁或未开始的活动不能扣减作用域计数。
|
|
203
199
|
if (disposed || outstanding === 0)
|
|
204
200
|
return;
|
|
205
201
|
outstanding -= 1;
|
|
206
202
|
writer.end();
|
|
207
|
-
decreaseLoading();
|
|
208
203
|
},
|
|
209
204
|
};
|
|
210
205
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-core-ng-providers.mjs","sources":["../../providers/src/observability/platform-observability.ts","../../providers/src/request-activity-adapter.ts","../../providers/src/app-runtime-providers.ts","../../providers/src/electron-request.ts","../../providers/src/global-error-handler.ts","../../providers/public-api.ts","../../providers/platform-core-ng-providers.ts"],"sourcesContent":["import { Injectable, inject, type Provider, type Type } from '@angular/core';\r\nimport { RuntimeService } from 'platform-core-ng/runtime';\r\n\r\n/** 平台审计动作的最终执行结果。 */\r\nexport type PlatformAuditResult = 'success' | 'failure';\r\n\r\n/** 平台基础能力可复用的标准审计动作编码。 */\r\nexport const PLATFORM_AUDIT_ACTIONS = {\r\n login: 'login',\r\n logout: 'logout',\r\n permissionDenied: 'permission_denied',\r\n export: 'export',\r\n delete: 'delete',\r\n approval: 'approval',\r\n fileUpload: 'file_upload',\r\n configChange: 'config_change',\r\n hostedAppInitFailure: 'hosted_app_init_failure',\r\n workspaceTabAbnormalClose: 'workspace_tab_abnormal_close',\r\n} as const;\r\n\r\n/** 已补齐应用、用户与时间信息,可交给审计后端持久化的事件。 */\r\nexport interface PlatformAuditEvent {\r\n readonly action: string;\r\n readonly appCode: string;\r\n readonly userId?: string;\r\n readonly resource?: string;\r\n readonly resourceId?: string;\r\n readonly result: PlatformAuditResult;\r\n readonly reason?: string;\r\n readonly timestamp: string;\r\n}\r\n\r\n/** 调用方记录审计事件时提交的输入;缺省上下文由 Runtime 补齐。 */\r\nexport interface PlatformAuditRecordInput extends Omit<\r\n PlatformAuditEvent,\r\n 'appCode' | 'timestamp'\r\n> {\r\n readonly appCode?: string;\r\n readonly timestamp?: string;\r\n}\r\n\r\n/** 记录成功或失败动作时可附带的资源与原因信息。 */\r\nexport type PlatformAuditRecordDetails = Omit<\r\n PlatformAuditRecordInput,\r\n 'action' | 'result'\r\n>;\r\n\r\n/** 平台日志 Port;应用可通过 Provider 替换实现,但不能改变方法语义。 */\r\n@Injectable({\r\n providedIn: 'root',\r\n useFactory: () => inject(ConsolePlatformLogger),\r\n})\r\nexport abstract class PlatformLogger {\r\n /** 记录仅用于诊断的调试信息。 */\r\n abstract debug(message: string, context?: unknown): void;\r\n /** 记录正常运行期间的重要信息。 */\r\n abstract info(message: string, context?: unknown): void;\r\n /** 记录可恢复但需要关注的异常状态。 */\r\n abstract warn(message: string, context?: unknown): void;\r\n /** 记录失败及其原始错误;不得在此吞掉业务控制流。 */\r\n abstract error(message: string, error?: unknown, context?: unknown): void;\r\n}\r\n\r\n/** 默认把平台日志写入宿主控制台的实现。 */\r\n@Injectable({ providedIn: 'root' })\r\nexport class ConsolePlatformLogger extends PlatformLogger {\r\n override debug(message: string, context?: unknown): void {\r\n this.write('debug', message, context);\r\n }\r\n\r\n override info(message: string, context?: unknown): void {\r\n this.write('info', message, context);\r\n }\r\n\r\n override warn(message: string, context?: unknown): void {\r\n this.write('warn', message, context);\r\n }\r\n\r\n override error(message: string, error?: unknown, context?: unknown): void {\r\n if (context !== undefined) {\r\n console.error(message, error, context);\r\n return;\r\n }\r\n\r\n if (error !== undefined) {\r\n console.error(message, error);\r\n return;\r\n }\r\n\r\n console.error(message);\r\n }\r\n\r\n private write(\r\n level: 'debug' | 'info' | 'warn',\r\n message: string,\r\n context?: unknown,\r\n ): void {\r\n if (context === undefined) {\r\n console[level](message);\r\n return;\r\n }\r\n\r\n console[level](message, context);\r\n }\r\n}\r\n\r\n/** 审计输出 Port;实现失败不能阻断原业务动作。 */\r\n@Injectable({\r\n providedIn: 'root',\r\n useFactory: () => inject(LoggingPlatformAuditLogger),\r\n})\r\nexport abstract class PlatformAuditLogger {\r\n /** 输出已经归一化的审计事件。 */\r\n abstract record(event: PlatformAuditEvent): void;\r\n}\r\n\r\n/** 默认通过平台日志输出结构化审计事件的实现。 */\r\n@Injectable({ providedIn: 'root' })\r\nexport class LoggingPlatformAuditLogger extends PlatformAuditLogger {\r\n private readonly logger = inject(PlatformLogger);\r\n\r\n override record(event: PlatformAuditEvent): void {\r\n this.logger.info(`[audit] ${event.action}`, event);\r\n }\r\n}\r\n\r\n/** 统一补齐 Runtime 上下文并以容错方式记录平台审计事件。 */\r\n@Injectable({ providedIn: 'root' })\r\nexport class PlatformAuditService {\r\n private readonly auditLogger = inject(PlatformAuditLogger);\r\n private readonly logger = inject(PlatformLogger);\r\n private readonly runtime = inject(RuntimeService);\r\n\r\n /** 记录自定义结果的审计事件;审计输出失败只写错误日志,不影响业务动作。 */\r\n record(event: PlatformAuditRecordInput): void {\r\n const auditEvent = this.normalizeEvent(event);\r\n\r\n try {\r\n this.auditLogger.record(auditEvent);\r\n } catch (error) {\r\n this.logger.error(\r\n '[audit] Failed to record platform audit event.',\r\n error,\r\n auditEvent,\r\n );\r\n }\r\n }\r\n\r\n /** 记录成功动作,并由 Runtime 补齐缺省应用和用户信息。 */\r\n recordSuccess(\r\n action: string,\r\n details: PlatformAuditRecordDetails = {},\r\n ): void {\r\n this.record({\r\n ...details,\r\n action,\r\n result: 'success',\r\n });\r\n }\r\n\r\n /** 记录失败动作;调用方应在 details 中给出可审计原因。 */\r\n recordFailure(\r\n action: string,\r\n details: PlatformAuditRecordDetails = {},\r\n ): void {\r\n this.record({\r\n ...details,\r\n action,\r\n result: 'failure',\r\n });\r\n }\r\n\r\n private normalizeEvent(event: PlatformAuditRecordInput): PlatformAuditEvent {\r\n const context = this.runtime.context();\r\n\r\n return {\r\n action: event.action,\r\n appCode: event.appCode ?? context.appCode ?? context.host,\r\n userId: event.userId ?? context.userId,\r\n resource: event.resource,\r\n resourceId: event.resourceId,\r\n result: event.result,\r\n reason: event.reason,\r\n timestamp: event.timestamp ?? new Date().toISOString(),\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * 用应用自有日志实现替换平台日志 Port。\r\n *\r\n * @param logger 已在同一注入器中注册的日志实现类型\r\n * @returns 指向该实现的别名 Provider\r\n */\r\nexport function providePlatformLogger(logger: Type<PlatformLogger>): Provider {\r\n return {\r\n provide: PlatformLogger,\r\n useExisting: logger,\r\n };\r\n}\r\n\r\n/**\r\n * 用应用自有审计实现替换默认日志审计 Port。\r\n *\r\n * @param auditLogger 已在同一注入器中注册的审计实现类型\r\n * @returns 指向该实现的别名 Provider\r\n */\r\nexport function providePlatformAuditLogger(\r\n auditLogger: Type<PlatformAuditLogger>,\r\n): Provider {\r\n return {\r\n provide: PlatformAuditLogger,\r\n useExisting: auditLogger,\r\n };\r\n}\r\n","import { DestroyRef, inject, type Provider } from '@angular/core';\nimport {\n HTTP_ACTIVITY_PORT,\n type HttpActivityPort,\n} from 'platform-core-ng/http';\nimport {\n decreaseLoading,\n increaseLoading,\n PLATFORM_REQUEST_ACTIVITY_WRITER,\n} from 'platform-core-ng/runtime';\n\n/**\n * 装配当前 HTTP 的作用域计数与限期旧全局桥;只由标准 Standalone 装配调用。\n * @returns 绑定当前注入器生命周期的 HTTP 活动适配 Provider。\n */\nexport function provideRequestActivityAdapter(): Provider {\n return {\n provide: HTTP_ACTIVITY_PORT,\n useFactory: (): HttpActivityPort => {\n const writer = inject(PLATFORM_REQUEST_ACTIVITY_WRITER);\n const destroyRef = inject(DestroyRef);\n let outstanding = 0;\n let disposed = false;\n destroyRef.onDestroy(() => {\n disposed = true;\n // 只归还本适配贡献的旧全局份额,不能清空其他 HTTP scope 的活动。\n while (outstanding > 0) {\n outstanding -= 1;\n decreaseLoading();\n }\n });\n return {\n begin: () => {\n if (disposed) return;\n outstanding += 1;\n writer.begin();\n increaseLoading();\n },\n end: () => {\n // 销毁已归还份额,迟到 finalize 不能再次扣减兼容桥。\n if (disposed || outstanding === 0) return;\n outstanding -= 1;\n writer.end();\n decreaseLoading();\n },\n };\n },\n };\n}\n","import {\n provideHttpClient,\n withInterceptors,\n withRequestsMadeViaParent,\n type HttpInterceptorFn,\n} from '@angular/common/http';\nimport {\n effect,\n ErrorHandler,\n inject,\n InjectionToken,\n Injector,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n type EnvironmentProviders,\n type Provider,\n type Type,\n} from '@angular/core';\nimport {\n HTTP_AUTH_TOKEN_GETTER,\n HTTP_CONFIG,\n HTTP_FEEDBACK_EVENT_PORT,\n HTTP_RESPONSE_INTERCEPTOR_CONFIG,\n HTTP_UNAUTHORIZED_HANDLER,\n httpFeedbackOwnershipInterceptor,\n requestInterceptor,\n responseInterceptor,\n type HttpFeedbackEvent,\n} from 'platform-core-ng/http';\nimport {\n PLATFORM_FEEDBACK_INGRESS_PORT,\n providePlatformFeedbackScope,\n registerHostedPlatformFeedbackTarget,\n type PlatformFeedbackIngressPort,\n} from 'platform-core-ng/feedback';\nimport { PLATFORM_AUDIT_ACTIONS, PlatformAuditService } from './observability';\nimport { provideRequestActivityAdapter } from './request-activity-adapter';\nimport {\n PERMISSION_AUDIT_PORT,\n PermissionService,\n type PermissionDeniedEvent,\n} from 'platform-core-ng/permission';\nimport {\n APP_RUNTIME_CONTEXT,\n HOSTED_RUNTIME_CAPABILITIES,\n type AppRuntimeContext,\n normalizeRuntimeContext,\n provideRuntimeContext,\n RuntimeService,\n synchronizeHostedRuntimeContext,\n RuntimeSessionReaderService,\n provideWorkspaceApplicationHostScope,\n providePlatformRequestActivityScope,\n type WorkspaceApplicationHostScopeOptions,\n} from 'platform-core-ng/runtime';\n\nconst HOSTED_RUNTIME_AUTHORITY = new InjectionToken<RuntimeService>(\n 'HOSTED_RUNTIME_AUTHORITY',\n);\nconst HOSTED_PERMISSION_AUTHORITY = new InjectionToken<PermissionService>(\n 'HOSTED_PERMISSION_AUTHORITY',\n);\n\n/** 应用 Provider 可装配的运行模式;Hosted 模式不得拥有宿主认证与 HTTP 生命周期。 */\nexport type HostedAppRuntimeMode = 'standalone' | 'hosted';\n\n/** Workspace 页面渲染模式;该类型不表示导航入口类型。 */\nexport type HostedWorkspaceIntegrationMode = 'shell' | 'breadcrumb';\n\n/** 应用级 Provider 的最小运行配置。 */\nexport interface HostedAppConfig {\n /** 明确声明当前应用是否由主工作台托管。 */\n runtime: HostedAppRuntimeMode;\n /** 应用在当前宿主中的稳定路由基址。 */\n routeBasePath?: string;\n}\n\n/** 归一化后注入业务应用的运行配置。 */\nexport interface HostedAppRuntimeConfig {\n /** 当前应用的明确运行模式。 */\n runtime: HostedAppRuntimeMode;\n /** 已移除尾部斜杠的稳定路由基址。 */\n routeBasePath: string;\n}\n\n/** Standalone 应用可拥有的本地 Provider 选项。 */\nexport interface StandaloneAppOptions extends Omit<HostedAppConfig, 'runtime'> {\n /** 应用自有拦截器;平台 request/response 拦截器始终在其后注册。 */\n readonly httpInterceptors?: readonly HttpInterceptorFn[];\n}\n\n/** Hosted 应用允许覆盖的路由选项;认证、会话和 HTTP 仍由宿主拥有。 */\nexport type HostedAppOptions = Omit<HostedAppConfig, 'runtime'>;\n\n/** 应用装配工厂接受的 Angular Provider 联合类型。 */\nexport type AppRuntimeExtraProvider = EnvironmentProviders | Provider;\n\n/** Hosted Component 页面在 Workspace 中的注册合同。 */\nexport interface HostedWorkspaceShellViewportRegistration {\n /** 由当前应用直接渲染的 Angular 组件类型。 */\n readonly component: Type<unknown>;\n /** Hosted Component 固定使用 `shell` 渲染模式。 */\n readonly mode: 'shell';\n /** 与导航、权限和生命周期关联的稳定页面身份。 */\n readonly page: string;\n}\n\n/** Breadcrumb Route 页面在 Workspace 中的注册合同。 */\nexport interface HostedWorkspaceBreadcrumbViewportRegistration {\n /** Breadcrumb Route 固定使用 `breadcrumb` 渲染模式。 */\n readonly mode: 'breadcrumb';\n /** 与路由、权限和生命周期关联的稳定页面身份。 */\n readonly page: string;\n}\n\n/** Workspace 支持的两类应用视口注册合同。 */\nexport type HostedWorkspaceViewportRegistration =\n | HostedWorkspaceShellViewportRegistration\n | HostedWorkspaceBreadcrumbViewportRegistration;\n\n/** 当前应用注入器拥有的 Workspace 视口注册清单。 */\nexport const HOSTED_WORKSPACE_VIEWPORTS = new InjectionToken<\n readonly HostedWorkspaceViewportRegistration[]\n>('HOSTED_WORKSPACE_VIEWPORTS', { factory: () => [] });\n\nexport interface CreateAppRuntimeProvidersOptions<\n TRuntimeConfig extends HostedAppRuntimeConfig,\n> {\n /** 权限、反馈与审计使用的稳定应用编码,不能从路由或包名推断。 */\n appCode: string;\n /** 仅在 Hosted 模式安装且由应用自身拥有的 Provider。 */\n hostedProviders?: readonly Provider[];\n /** 当前应用拥有的一个或多个 Workspace 页面视口。 */\n hostedWorkspaceViewport?:\n | HostedWorkspaceViewportRegistration\n | readonly HostedWorkspaceViewportRegistration[];\n /** 向业务代码暴露归一化运行配置的应用自有 Token。 */\n runtimeConfigToken: InjectionToken<TRuntimeConfig>;\n /** 仅在 Standalone 模式安装且由应用自身拥有的 Provider。 */\n standaloneProviders?: readonly AppRuntimeExtraProvider[];\n /** Hosted 模式的默认稳定路由基址。 */\n hostedRouteBasePath: string;\n}\n\n/** 业务应用统一暴露的 Standalone、Hosted 与 Workspace 装配表面。 */\nexport interface AppRuntimeProviders<\n TRuntimeConfig extends HostedAppRuntimeConfig,\n> {\n /** 注入业务应用自身的归一化运行配置。 */\n provideApp(config: HostedAppConfig): EnvironmentProviders;\n\n /** 安装由当前应用拥有的完整 HTTP、反馈和 Runtime 边界。 */\n provideStandaloneApp(options?: StandaloneAppOptions): EnvironmentProviders;\n\n /** 安装只消费宿主认证、Runtime 与父级 HTTP 链路的应用边界。 */\n provideHostedApp(options?: HostedAppOptions): EnvironmentProviders;\n\n /**\n * 只为特殊 Hosted 集成建立父级 HTTP 链路。\n *\n * 普通业务清单应调用 `provideHostedApp`,不应直接使用此逃生口。\n */\n provideHostedHttp(\n interceptors?: readonly HttpInterceptorFn[],\n ): EnvironmentProviders;\n\n /**\n * 为单个 workspace-tab 的 page/viewport 注入器提供关闭能力。\n *\n * 该 Provider 必须与 hosted 应用 Provider 分层安装,不能放入同时服务 Outer Shell\n * 或多个 page 的 manifest 级注入器。\n *\n * @param options 绑定当前 Workspace 应用稳定 page 的作用域配置\n */\n provideWorkspaceTab(\n options: WorkspaceApplicationHostScopeOptions,\n ): EnvironmentProviders;\n}\n\nexport interface PlatformHostedAppConfig<\n TRuntimeConfig extends HostedAppRuntimeConfig = HostedAppRuntimeConfig,\n> {\n /** 权限、反馈与审计使用的稳定应用编码。 */\n readonly appCode: string;\n /** 当前 Hosted 应用拥有的 Workspace 视口。 */\n readonly hostedWorkspaceViewport?:\n | HostedWorkspaceViewportRegistration\n | readonly HostedWorkspaceViewportRegistration[];\n /** 由应用自身拥有、且不会覆盖宿主边界的 Provider。 */\n readonly providers?: readonly Provider[];\n /** Hosted 应用在主工作台中的稳定路由基址。 */\n readonly routeBasePath: string;\n /** 可选的应用运行配置 Token;存在时由本工厂注入 Hosted 配置。 */\n readonly runtimeConfigToken?: InjectionToken<TRuntimeConfig>;\n}\n\n/**\n * 创建只消费宿主 Runtime、认证和父级 HTTP 链路的 Hosted App Provider。\n *\n * Hosted 运行时只安装反馈归属补齐拦截器和 App 级 FeedbackService,不注册 request/response\n * 成功处理栈;最终成功反馈始终由父级唯一 responseInterceptor 处理。\n *\n * @param config Hosted App 的稳定 appCode、路由、视口和应用自有 Provider\n * @returns 可加入 Hosted Route/Viewport EnvironmentInjector 的 Provider 集合\n */\nexport function providePlatformHostedApp<\n TRuntimeConfig extends HostedAppRuntimeConfig = HostedAppRuntimeConfig,\n>(config: PlatformHostedAppConfig<TRuntimeConfig>): EnvironmentProviders {\n const routeBasePath = normalizeRouteBasePath(config.routeBasePath);\n const hostedWorkspaceViewports = toHostedWorkspaceViewports(\n config.hostedWorkspaceViewport,\n );\n\n return makeEnvironmentProviders([\n ...(config.providers ?? []),\n ...(config.runtimeConfigToken\n ? [\n {\n provide: config.runtimeConfigToken,\n useValue: {\n runtime: 'hosted',\n routeBasePath,\n } as TRuntimeConfig,\n },\n ]\n : []),\n provideHostedRuntimeContext(config, routeBasePath),\n { provide: HOSTED_RUNTIME_AUTHORITY, useClass: RuntimeService },\n { provide: RuntimeService, useExisting: HOSTED_RUNTIME_AUTHORITY },\n providePlatformFeedbackScope(),\n providePermissionAuditAdapter(),\n provideEnvironmentInitializer(() =>\n registerHostedPlatformFeedbackTarget(config.appCode),\n ),\n RuntimeSessionReaderService,\n { provide: HOSTED_PERMISSION_AUTHORITY, useClass: PermissionService },\n { provide: PermissionService, useExisting: HOSTED_PERMISSION_AUTHORITY },\n provideParentHostedHttp(),\n provideHostedBoundaryValidation(config, routeBasePath),\n provideHostedRuntimeContextSync(config, routeBasePath),\n ...hostedWorkspaceViewports.map((viewport) => ({\n provide: HOSTED_WORKSPACE_VIEWPORTS,\n multi: true,\n useValue: viewport,\n })),\n ]);\n}\n\n/**\n * 为业务应用生成一致的 Standalone/Hosted Runtime Provider 表面。\n *\n * Standalone 拥有完整 request/response HTTP 栈和本地反馈上下文;Hosted 只使用父级 HTTP,并在\n * 请求方向补齐可信 App 归属,防止父子链路重复处理成功反馈。\n *\n * @param options 应用稳定 appCode、配置 Token、路由、视口和应用自有 Provider\n * @returns 标准 provideApp/provideStandaloneApp/provideHostedApp/providerHostedHttp 工厂\n */\nexport function createAppRuntimeProviders<\n TRuntimeConfig extends HostedAppRuntimeConfig,\n>(\n options: CreateAppRuntimeProvidersOptions<TRuntimeConfig>,\n): AppRuntimeProviders<TRuntimeConfig> {\n const hostedWorkspaceViewports = toHostedWorkspaceViewports(\n options.hostedWorkspaceViewport,\n );\n const provideApp = (config: HostedAppConfig): EnvironmentProviders =>\n makeEnvironmentProviders([\n {\n provide: options.runtimeConfigToken,\n useValue: normalizeRuntimeConfig(config, options.hostedRouteBasePath),\n },\n ]);\n\n return {\n provideApp,\n provideStandaloneApp: (appOptions: StandaloneAppOptions = {}) => {\n const { httpInterceptors = [], ...runtimeOptions } = appOptions;\n\n return makeEnvironmentProviders([\n provideHttpClient(\n withInterceptors([\n ...httpInterceptors,\n requestInterceptor,\n responseInterceptor,\n ]),\n ),\n provideApp({ ...runtimeOptions, runtime: 'standalone' }),\n provideRuntimeContext({\n appCode: options.appCode,\n baseHref:\n normalizeRouteBasePath(runtimeOptions.routeBasePath ?? '') || '/',\n mode: 'standalone',\n }),\n providePlatformFeedbackScope(),\n providePlatformRequestActivityScope(),\n ...provideStandaloneCapabilityAdapters(),\n ...(options.standaloneProviders ?? []),\n ]);\n },\n provideHostedApp: (appOptions: HostedAppOptions = {}) => {\n const routeBasePath = normalizeRouteBasePath(\n appOptions.routeBasePath ?? options.hostedRouteBasePath,\n );\n\n return makeEnvironmentProviders([\n provideApp({ ...appOptions, runtime: 'hosted' }),\n providePlatformHostedApp({\n appCode: options.appCode,\n providers: options.hostedProviders,\n routeBasePath,\n }),\n ...hostedWorkspaceViewports.map((viewport) => ({\n provide: HOSTED_WORKSPACE_VIEWPORTS,\n multi: true,\n useValue: viewport,\n })),\n ]);\n },\n provideHostedHttp: provideParentHostedHttp,\n provideWorkspaceTab: provideWorkspaceApplicationHostScope,\n };\n}\n\nfunction provideParentHostedHttp(\n interceptors: readonly HttpInterceptorFn[] = [],\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideHttpClient(\n withInterceptors([httpFeedbackOwnershipInterceptor, ...interceptors]),\n withRequestsMadeViaParent(),\n ),\n ]);\n}\n\nfunction provideStandaloneCapabilityAdapters(): readonly Provider[] {\n return [\n provideRequestActivityAdapter(),\n {\n provide: HTTP_FEEDBACK_EVENT_PORT,\n useFactory: () =>\n createHttpFeedbackAdapter(inject(PLATFORM_FEEDBACK_INGRESS_PORT)),\n },\n providePermissionAuditAdapter(),\n ];\n}\n\nfunction createHttpFeedbackAdapter(feedback: PlatformFeedbackIngressPort): {\n readonly emit: (event: HttpFeedbackEvent) => void;\n} {\n return {\n emit: (event) =>\n void feedback.emit({\n tone: event.type,\n message: event.message,\n options: event.options,\n context: event.callerContext,\n }),\n };\n}\n\nfunction providePermissionAuditAdapter(): Provider {\n return {\n provide: PERMISSION_AUDIT_PORT,\n useFactory: () => {\n const audit = inject(PlatformAuditService);\n return {\n recordDenied: (event: PermissionDeniedEvent) =>\n audit.recordFailure(PLATFORM_AUDIT_ACTIONS.permissionDenied, event),\n };\n },\n };\n}\n\nfunction provideHostedRuntimeContext(\n config: PlatformHostedAppConfig,\n routeBasePath: string,\n): Provider {\n return {\n provide: APP_RUNTIME_CONTEXT,\n useFactory: () => {\n const parentRuntime = inject(RuntimeService, { skipSelf: true });\n\n return createHostedRuntimeContext(\n config,\n routeBasePath,\n parentRuntime.context(),\n );\n },\n };\n}\n\nfunction provideHostedRuntimeContextSync(\n config: PlatformHostedAppConfig,\n routeBasePath: string,\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideEnvironmentInitializer(() => {\n const parentRuntime = inject(RuntimeService, { skipSelf: true });\n const hostedRuntime = inject(RuntimeService);\n const injector = inject(Injector);\n effect(\n () => {\n synchronizeHostedRuntimeContext(\n hostedRuntime,\n createHostedRuntimeContext(\n config,\n routeBasePath,\n parentRuntime.context(),\n ),\n );\n },\n { injector },\n );\n }),\n ]);\n}\n\nfunction createHostedRuntimeContext(\n config: PlatformHostedAppConfig,\n routeBasePath: string,\n parentContext: AppRuntimeContext,\n): AppRuntimeContext {\n return normalizeRuntimeContext({\n ...inheritHostedRuntimeContext(parentContext),\n appCode: config.appCode,\n baseHref: routeBasePath || '/',\n capabilities: HOSTED_RUNTIME_CAPABILITIES,\n host: 'main',\n mode: 'hosted',\n });\n}\n\nfunction inheritHostedRuntimeContext(\n parentContext: AppRuntimeContext,\n): Partial<AppRuntimeContext> {\n return {\n apiBaseUrl: parentContext.apiBaseUrl,\n dataScopes: parentContext.dataScopes,\n metadata: parentContext.metadata,\n permissions: parentContext.permissions,\n roles: parentContext.roles,\n shellBaseUrl: parentContext.shellBaseUrl,\n userId: parentContext.userId,\n };\n}\n\nfunction provideHostedBoundaryValidation(\n config: PlatformHostedAppConfig,\n routeBasePath: string,\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideEnvironmentInitializer(() => {\n const parentRuntime = inject(RuntimeService, { skipSelf: true });\n const hostedRuntime = inject(RuntimeService, { self: true });\n const hostedPermission = inject(PermissionService, { self: true });\n const runtimeAuthority = inject(HOSTED_RUNTIME_AUTHORITY, { self: true });\n const permissionAuthority = inject(HOSTED_PERMISSION_AUTHORITY, {\n self: true,\n });\n const localRuntimeContext = inject(APP_RUNTIME_CONTEXT, { self: true });\n const localAuthTokenGetter = inject(HTTP_AUTH_TOKEN_GETTER, {\n optional: true,\n self: true,\n });\n const localHttpConfig = inject(HTTP_CONFIG, {\n optional: true,\n self: true,\n });\n const localResponseConfig = inject(HTTP_RESPONSE_INTERCEPTOR_CONFIG, {\n optional: true,\n self: true,\n });\n const localUnauthorizedHandler = inject(HTTP_UNAUTHORIZED_HANDLER, {\n optional: true,\n self: true,\n });\n const localErrorHandler = inject(ErrorHandler, {\n optional: true,\n self: true,\n });\n const ownedProviders = [\n localAuthTokenGetter ? 'HTTP_AUTH_TOKEN_GETTER' : '',\n localHttpConfig ? 'HTTP_CONFIG' : '',\n localResponseConfig ? 'HTTP_RESPONSE_INTERCEPTOR_CONFIG' : '',\n localUnauthorizedHandler ? 'HTTP_UNAUTHORIZED_HANDLER' : '',\n localErrorHandler ? 'ErrorHandler' : '',\n hostedRuntime !== runtimeAuthority ? 'RuntimeService' : '',\n hostedPermission !== permissionAuthority ? 'PermissionService' : '',\n ].filter(Boolean);\n\n if (ownedProviders.length > 0) {\n throw new Error(\n `Hosted applications must inherit the host HTTP/auth boundary; remove local providers: ${ownedProviders.join(', ')}.`,\n );\n }\n\n const expectedContext = createHostedRuntimeContext(\n config,\n routeBasePath,\n parentRuntime.context(),\n );\n const mismatchedFields = Array.from(\n new Set([\n ...findHostedRuntimeMismatches(localRuntimeContext, expectedContext),\n ...findHostedRuntimeMismatches(\n hostedRuntime.context(),\n expectedContext,\n ),\n ]),\n );\n if (mismatchedFields.length > 0) {\n throw new Error(\n `Hosted applications must inherit the host runtime context; locally overridden fields: ${mismatchedFields.join(', ')}.`,\n );\n }\n }),\n ]);\n}\n\nfunction findHostedRuntimeMismatches(\n actual: AppRuntimeContext,\n expected: AppRuntimeContext,\n): readonly string[] {\n const referenceFields = [\n 'apiBaseUrl',\n 'appCode',\n 'appName',\n 'baseHref',\n 'dataScopes',\n 'host',\n 'metadata',\n 'mode',\n 'permissions',\n 'roles',\n 'shellBaseUrl',\n 'userId',\n ] as const satisfies readonly (keyof AppRuntimeContext)[];\n const mismatches: (keyof AppRuntimeContext)[] = referenceFields.filter(\n (field) => !runtimeContextValuesEqual(actual[field], expected[field]),\n );\n const capabilityFields = Object.keys(\n HOSTED_RUNTIME_CAPABILITIES,\n ) as (keyof typeof HOSTED_RUNTIME_CAPABILITIES)[];\n\n if (\n capabilityFields.some(\n (field) => actual.capabilities[field] !== expected.capabilities[field],\n )\n ) {\n mismatches.push('capabilities');\n }\n\n return mismatches;\n}\n\nfunction runtimeContextValuesEqual(\n actual: unknown,\n expected: unknown,\n): boolean {\n if (Object.is(actual, expected)) {\n return true;\n }\n\n if (actual instanceof Date && expected instanceof Date) {\n return actual.getTime() === expected.getTime();\n }\n\n if (Array.isArray(actual) && Array.isArray(expected)) {\n return (\n actual.length === expected.length &&\n actual.every((item, index) =>\n runtimeContextValuesEqual(item, expected[index]),\n )\n );\n }\n\n if (\n isComparableRuntimeRecord(actual) &&\n isComparableRuntimeRecord(expected)\n ) {\n const actualKeys = Object.keys(actual);\n const expectedKeys = Object.keys(expected);\n return (\n actualKeys.length === expectedKeys.length &&\n actualKeys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(expected, key) &&\n runtimeContextValuesEqual(actual[key], expected[key]),\n )\n );\n }\n\n return false;\n}\n\nfunction isComparableRuntimeRecord(\n value: unknown,\n): value is Readonly<Record<string, unknown>> {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction toHostedWorkspaceViewports(\n viewport:\n | HostedWorkspaceViewportRegistration\n | readonly HostedWorkspaceViewportRegistration[]\n | undefined,\n): readonly HostedWorkspaceViewportRegistration[] {\n if (!viewport) {\n return [];\n }\n\n return isHostedWorkspaceViewportArray(viewport) ? viewport : [viewport];\n}\n\nfunction isHostedWorkspaceViewportArray(\n value:\n | HostedWorkspaceViewportRegistration\n | readonly HostedWorkspaceViewportRegistration[],\n): value is readonly HostedWorkspaceViewportRegistration[] {\n return Array.isArray(value);\n}\n\nfunction normalizeRuntimeConfig<TRuntimeConfig extends HostedAppRuntimeConfig>(\n config: HostedAppConfig,\n hostedRouteBasePath: string,\n): TRuntimeConfig {\n return {\n runtime: config.runtime,\n routeBasePath: normalizeRouteBasePath(\n config.routeBasePath ??\n (config.runtime === 'hosted' ? hostedRouteBasePath : ''),\n ),\n } as TRuntimeConfig;\n}\n\nfunction normalizeRouteBasePath(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n","import { from, Observable } from 'rxjs';\r\n\r\ninterface ElectronRequestBridge {\r\n get<T>(url: string, option: string): Promise<T>;\r\n post<T>(url: string, data: unknown): Promise<T>;\r\n delete<T>(url: string, option: string): Promise<T>;\r\n put<T>(url: string, data: unknown): Promise<T>;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n electronRequest: ElectronRequestBridge;\r\n }\r\n}\r\n\r\n/**\r\n * 把宿主预加载脚本暴露的 Electron IPC 请求桥转换为 Observable。\r\n *\r\n * 该适配器只适用于已经注入 `window.electronRequest` 的可信 Electron 窗口;浏览器环境调用会失败,\r\n * 业务代码不得借此绕过平台 HTTP、认证与错误处理合同。\r\n */\r\nexport class ElectronRequest {\r\n /**\r\n * 发送 GET 请求\r\n * @param url 请求 URL\r\n * @param option 请求选项\r\n * @returns 响应数据\r\n */\r\n get<T>(url: string, option: string): Observable<T> {\r\n return from(window.electronRequest.get<T>(url, option));\r\n }\r\n\r\n /**\r\n * 发送 POST 请求\r\n * @param url 请求 URL\r\n * @param data 请求数据\r\n * @returns 响应数据\r\n */\r\n post<T>(url: string, data: unknown): Observable<T> {\r\n return from(window.electronRequest.post<T>(url, data));\r\n }\r\n\r\n /**\r\n * 发送 DELETE 请求\r\n * @param url 请求 URL\r\n * @param option 请求选项\r\n * @returns 响应数据\r\n */\r\n delete<T>(url: string, option: string): Observable<T> {\r\n return from(window.electronRequest.delete<T>(url, option));\r\n }\r\n\r\n /**\r\n * 发送 PUT 请求\r\n * @param url 请求 URL\r\n * @param data 请求数据\r\n * @returns 响应数据\r\n */\r\n put<T>(url: string, data: unknown): Observable<T> {\r\n return from(window.electronRequest.put<T>(url, data));\r\n }\r\n}\r\n","import { ErrorHandler, Injectable, inject, type Provider } from '@angular/core';\r\nimport { getPlatformError, getHttpStatusMessage } from 'platform-core-ts';\r\n\r\nimport {\r\n HTTP_UNAUTHORIZED_HANDLER,\r\n HttpUnauthorizedException,\r\n} from 'platform-core-ng/http';\r\nimport { PlatformFeedbackService } from 'platform-core-ng/feedback';\r\n\r\n/**\r\n * 将未被业务流程消费的异常统一转换为平台反馈,并委托最终认证失效处理。\r\n *\r\n * 错误反馈直接进入当前运行时作用域的 `PlatformFeedbackService`,不再经过历史消息 Token;\r\n * 认证失效仍遵循“先反馈、后清理会话和导航”的平台契约。\r\n */\r\n@Injectable()\r\nexport class GlobalErrorHandler implements ErrorHandler {\r\n private readonly feedback = inject(PlatformFeedbackService);\r\n private readonly unauthorizedHandler = inject(HTTP_UNAUTHORIZED_HANDLER, {\r\n optional: true,\r\n });\r\n\r\n /**\r\n * 处理 Angular 冒泡到全局边界的异常。\r\n *\r\n * @param error 原始异常或 Angular 包装后的异常\r\n */\r\n handleError(error: unknown): void {\r\n const unwrappedError = unwrapError(error);\r\n const platformError = getPlatformError(unwrappedError);\r\n\r\n if (platformError?.terminalAuthenticationFailure) {\r\n this.handleUnauthorizedError(unwrappedError, platformError.message);\r\n return;\r\n }\r\n\r\n if (platformError) {\n this.feedback.error(platformError.message, feedbackOptions(platformError));\n if (platformError.type !== 'business') {\r\n console.error(unwrappedError);\r\n }\r\n return;\r\n }\r\n\r\n this.feedback.error('未知错误', { title: '请联系管理员' });\r\n console.error(unwrappedError);\r\n }\r\n\r\n private handleUnauthorizedError(error: unknown, message: string): void {\r\n this.feedback.error(message || getHttpStatusMessage(401));\r\n\r\n if (!this.unauthorizedHandler) {\r\n console.error(\r\n '[GlobalErrorHandler] HTTP_UNAUTHORIZED_HANDLER not provided.',\r\n error,\r\n );\r\n return;\r\n }\r\n\r\n const httpErrorResponse =\r\n error instanceof HttpUnauthorizedException ? error.response : undefined;\r\n\r\n try {\r\n const result = this.unauthorizedHandler(httpErrorResponse);\r\n if (isPromiseLike(result)) {\r\n void result.catch((handlerError: unknown) => {\r\n console.error(\r\n '[GlobalErrorHandler] HTTP_UNAUTHORIZED_HANDLER failed.',\r\n handlerError,\r\n );\r\n });\r\n }\r\n } catch (handlerError) {\r\n console.error(\r\n '[GlobalErrorHandler] HTTP_UNAUTHORIZED_HANDLER failed.',\r\n handlerError,\r\n );\r\n }\r\n }\r\n}\n\n/**\n * 为可重试的基础连接故障提供稳定去重键,避免并发请求把同一条网络提示排队多次。\n * 业务错误不共用去重键,以免不同操作的失败提示被错误合并。\n */\nfunction feedbackOptions(platformError: {\n readonly type: string;\n readonly code: string;\n}): { readonly dedupeKey?: string } {\n if (platformError.type === 'connection' || platformError.type === 'timeout') {\n return { dedupeKey: `global-feedback:${platformError.code}` };\n }\n\n return {};\n}\n\r\n/**\r\n * 注册平台全局异常处理器。\r\n *\r\n * 调用方必须同时提供当前运行模式的 `PlatformFeedbackService` 作用域;认证应用还应提供\r\n * `HTTP_UNAUTHORIZED_HANDLER` 完成自身会话清理和安全导航。\r\n *\r\n * @returns Angular 全局错误处理 Provider\r\n */\r\nexport function provideGlobalErrorHandler(): Provider {\r\n return { provide: ErrorHandler, useClass: GlobalErrorHandler };\r\n}\r\n\r\nfunction unwrapError(error: unknown): unknown {\r\n const visited = new WeakSet<object>();\r\n let current = error;\r\n\r\n while (\r\n current !== null &&\r\n typeof current === 'object' &&\r\n !visited.has(current)\r\n ) {\r\n // Error Contract 异常的 cause 只用于诊断,不能把已分类错误再解包回框架原始异常。\r\n if (getPlatformError(current)) {\r\n return current;\r\n }\r\n visited.add(current);\r\n const wrapper = current as {\r\n cause?: unknown;\r\n ngOriginalError?: unknown;\r\n originalError?: unknown;\r\n rejection?: unknown;\r\n };\r\n const next =\r\n wrapper.ngOriginalError ??\r\n wrapper.rejection ??\r\n wrapper.originalError ??\r\n wrapper.cause;\r\n\r\n if (next === undefined || next === current) {\r\n return current;\r\n }\r\n\r\n current = next;\r\n }\r\n\r\n return current;\r\n}\r\n\r\nfunction isPromiseLike(value: void | Promise<void>): value is Promise<void> {\r\n return !!value && typeof value.catch === 'function';\r\n}\r\n","/**\r\n * 平台应用级 Provider 与跨能力装配正式入口。\r\n *\r\n * 该入口只组合 Runtime、HTTP、Auth、Permission、Feedback 与 UI Port,不拥有业务状态,\r\n * 也不得被任何底层正式入口反向依赖。\r\n */\r\nexport * from './src';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"platform-core-ng-providers.mjs","sources":["../../providers/src/observability/platform-observability.ts","../../providers/src/request-activity-adapter.ts","../../providers/src/app-runtime-providers.ts","../../providers/src/electron-request.ts","../../providers/src/global-error-handler.ts","../../providers/public-api.ts","../../providers/platform-core-ng-providers.ts"],"sourcesContent":["import { Injectable, inject, type Provider, type Type } from '@angular/core';\r\nimport { RuntimeService } from 'platform-core-ng/runtime';\r\n\r\n/** 平台审计动作的最终执行结果。 */\r\nexport type PlatformAuditResult = 'success' | 'failure';\r\n\r\n/** 平台基础能力可复用的标准审计动作编码。 */\r\nexport const PLATFORM_AUDIT_ACTIONS = {\r\n login: 'login',\r\n logout: 'logout',\r\n permissionDenied: 'permission_denied',\r\n export: 'export',\r\n delete: 'delete',\r\n approval: 'approval',\r\n fileUpload: 'file_upload',\r\n configChange: 'config_change',\r\n hostedAppInitFailure: 'hosted_app_init_failure',\r\n workspaceTabAbnormalClose: 'workspace_tab_abnormal_close',\r\n} as const;\r\n\r\n/** 已补齐应用、用户与时间信息,可交给审计后端持久化的事件。 */\r\nexport interface PlatformAuditEvent {\r\n readonly action: string;\r\n readonly appCode: string;\r\n readonly userId?: string;\r\n readonly resource?: string;\r\n readonly resourceId?: string;\r\n readonly result: PlatformAuditResult;\r\n readonly reason?: string;\r\n readonly timestamp: string;\r\n}\r\n\r\n/** 调用方记录审计事件时提交的输入;缺省上下文由 Runtime 补齐。 */\r\nexport interface PlatformAuditRecordInput extends Omit<\r\n PlatformAuditEvent,\r\n 'appCode' | 'timestamp'\r\n> {\r\n readonly appCode?: string;\r\n readonly timestamp?: string;\r\n}\r\n\r\n/** 记录成功或失败动作时可附带的资源与原因信息。 */\r\nexport type PlatformAuditRecordDetails = Omit<\r\n PlatformAuditRecordInput,\r\n 'action' | 'result'\r\n>;\r\n\r\n/** 平台日志 Port;应用可通过 Provider 替换实现,但不能改变方法语义。 */\r\n@Injectable({\r\n providedIn: 'root',\r\n useFactory: () => inject(ConsolePlatformLogger),\r\n})\r\nexport abstract class PlatformLogger {\r\n /** 记录仅用于诊断的调试信息。 */\r\n abstract debug(message: string, context?: unknown): void;\r\n /** 记录正常运行期间的重要信息。 */\r\n abstract info(message: string, context?: unknown): void;\r\n /** 记录可恢复但需要关注的异常状态。 */\r\n abstract warn(message: string, context?: unknown): void;\r\n /** 记录失败及其原始错误;不得在此吞掉业务控制流。 */\r\n abstract error(message: string, error?: unknown, context?: unknown): void;\r\n}\r\n\r\n/** 默认把平台日志写入宿主控制台的实现。 */\r\n@Injectable({ providedIn: 'root' })\r\nexport class ConsolePlatformLogger extends PlatformLogger {\r\n override debug(message: string, context?: unknown): void {\r\n this.write('debug', message, context);\r\n }\r\n\r\n override info(message: string, context?: unknown): void {\r\n this.write('info', message, context);\r\n }\r\n\r\n override warn(message: string, context?: unknown): void {\r\n this.write('warn', message, context);\r\n }\r\n\r\n override error(message: string, error?: unknown, context?: unknown): void {\r\n if (context !== undefined) {\r\n console.error(message, error, context);\r\n return;\r\n }\r\n\r\n if (error !== undefined) {\r\n console.error(message, error);\r\n return;\r\n }\r\n\r\n console.error(message);\r\n }\r\n\r\n private write(\r\n level: 'debug' | 'info' | 'warn',\r\n message: string,\r\n context?: unknown,\r\n ): void {\r\n if (context === undefined) {\r\n console[level](message);\r\n return;\r\n }\r\n\r\n console[level](message, context);\r\n }\r\n}\r\n\r\n/** 审计输出 Port;实现失败不能阻断原业务动作。 */\r\n@Injectable({\r\n providedIn: 'root',\r\n useFactory: () => inject(LoggingPlatformAuditLogger),\r\n})\r\nexport abstract class PlatformAuditLogger {\r\n /** 输出已经归一化的审计事件。 */\r\n abstract record(event: PlatformAuditEvent): void;\r\n}\r\n\r\n/** 默认通过平台日志输出结构化审计事件的实现。 */\r\n@Injectable({ providedIn: 'root' })\r\nexport class LoggingPlatformAuditLogger extends PlatformAuditLogger {\r\n private readonly logger = inject(PlatformLogger);\r\n\r\n override record(event: PlatformAuditEvent): void {\r\n this.logger.info(`[audit] ${event.action}`, event);\r\n }\r\n}\r\n\r\n/** 统一补齐 Runtime 上下文并以容错方式记录平台审计事件。 */\r\n@Injectable({ providedIn: 'root' })\r\nexport class PlatformAuditService {\r\n private readonly auditLogger = inject(PlatformAuditLogger);\r\n private readonly logger = inject(PlatformLogger);\r\n private readonly runtime = inject(RuntimeService);\r\n\r\n /** 记录自定义结果的审计事件;审计输出失败只写错误日志,不影响业务动作。 */\r\n record(event: PlatformAuditRecordInput): void {\r\n const auditEvent = this.normalizeEvent(event);\r\n\r\n try {\r\n this.auditLogger.record(auditEvent);\r\n } catch (error) {\r\n this.logger.error(\r\n '[audit] Failed to record platform audit event.',\r\n error,\r\n auditEvent,\r\n );\r\n }\r\n }\r\n\r\n /** 记录成功动作,并由 Runtime 补齐缺省应用和用户信息。 */\r\n recordSuccess(\r\n action: string,\r\n details: PlatformAuditRecordDetails = {},\r\n ): void {\r\n this.record({\r\n ...details,\r\n action,\r\n result: 'success',\r\n });\r\n }\r\n\r\n /** 记录失败动作;调用方应在 details 中给出可审计原因。 */\r\n recordFailure(\r\n action: string,\r\n details: PlatformAuditRecordDetails = {},\r\n ): void {\r\n this.record({\r\n ...details,\r\n action,\r\n result: 'failure',\r\n });\r\n }\r\n\r\n private normalizeEvent(event: PlatformAuditRecordInput): PlatformAuditEvent {\r\n const context = this.runtime.context();\r\n\r\n return {\r\n action: event.action,\r\n appCode: event.appCode ?? context.appCode ?? context.host,\r\n userId: event.userId ?? context.userId,\r\n resource: event.resource,\r\n resourceId: event.resourceId,\r\n result: event.result,\r\n reason: event.reason,\r\n timestamp: event.timestamp ?? new Date().toISOString(),\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * 用应用自有日志实现替换平台日志 Port。\r\n *\r\n * @param logger 已在同一注入器中注册的日志实现类型\r\n * @returns 指向该实现的别名 Provider\r\n */\r\nexport function providePlatformLogger(logger: Type<PlatformLogger>): Provider {\r\n return {\r\n provide: PlatformLogger,\r\n useExisting: logger,\r\n };\r\n}\r\n\r\n/**\r\n * 用应用自有审计实现替换默认日志审计 Port。\r\n *\r\n * @param auditLogger 已在同一注入器中注册的审计实现类型\r\n * @returns 指向该实现的别名 Provider\r\n */\r\nexport function providePlatformAuditLogger(\r\n auditLogger: Type<PlatformAuditLogger>,\r\n): Provider {\r\n return {\r\n provide: PlatformAuditLogger,\r\n useExisting: auditLogger,\r\n };\r\n}\r\n","import { DestroyRef, inject, type Provider } from '@angular/core';\nimport {\n HTTP_ACTIVITY_PORT,\n type HttpActivityPort,\n} from 'platform-core-ng/http';\nimport {\n PLATFORM_REQUEST_ACTIVITY_WRITER,\n} from 'platform-core-ng/runtime';\n\n/**\n * 装配当前 HTTP 的作用域计数;只由标准 Standalone 装配调用。\n * @returns 绑定当前注入器生命周期的 HTTP 活动适配 Provider。\n */\nexport function provideRequestActivityAdapter(): Provider {\n return {\n provide: HTTP_ACTIVITY_PORT,\n useFactory: (): HttpActivityPort => {\n const writer = inject(PLATFORM_REQUEST_ACTIVITY_WRITER);\n const destroyRef = inject(DestroyRef);\n let outstanding = 0;\n let disposed = false;\n destroyRef.onDestroy(() => {\n disposed = true;\n // Runtime 同步销毁自身计数;迟到的完成通知不能影响重建后的作用域。\n outstanding = 0;\n });\n return {\n begin: () => {\n if (disposed) return;\n outstanding += 1;\n writer.begin();\n },\n end: () => {\n // 已销毁或未开始的活动不能扣减作用域计数。\n if (disposed || outstanding === 0) return;\n outstanding -= 1;\n writer.end();\n },\n };\n },\n };\n}\n","import {\n provideHttpClient,\n withInterceptors,\n withRequestsMadeViaParent,\n type HttpInterceptorFn,\n} from '@angular/common/http';\nimport {\n effect,\n ErrorHandler,\n inject,\n InjectionToken,\n Injector,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n type EnvironmentProviders,\n type Provider,\n type Type,\n} from '@angular/core';\nimport {\n HTTP_AUTH_TOKEN_GETTER,\n HTTP_CONFIG,\n HTTP_FEEDBACK_EVENT_PORT,\n HTTP_RESPONSE_INTERCEPTOR_CONFIG,\n HTTP_UNAUTHORIZED_HANDLER,\n httpFeedbackOwnershipInterceptor,\n requestInterceptor,\n responseInterceptor,\n type HttpFeedbackEvent,\n} from 'platform-core-ng/http';\nimport {\n PLATFORM_FEEDBACK_INGRESS_PORT,\n providePlatformFeedbackScope,\n registerHostedPlatformFeedbackTarget,\n type PlatformFeedbackIngressPort,\n} from 'platform-core-ng/feedback';\nimport { PLATFORM_AUDIT_ACTIONS, PlatformAuditService } from './observability';\nimport { provideRequestActivityAdapter } from './request-activity-adapter';\nimport {\n PERMISSION_AUDIT_PORT,\n PermissionService,\n type PermissionDeniedEvent,\n} from 'platform-core-ng/permission';\nimport {\n APP_RUNTIME_CONTEXT,\n HOSTED_RUNTIME_CAPABILITIES,\n type AppRuntimeContext,\n normalizeRuntimeContext,\n provideRuntimeContext,\n RuntimeService,\n synchronizeHostedRuntimeContext,\n RuntimeSessionReaderService,\n provideWorkspaceApplicationHostScope,\n providePlatformRequestActivityScope,\n type WorkspaceApplicationHostScopeOptions,\n} from 'platform-core-ng/runtime';\n\nconst HOSTED_RUNTIME_AUTHORITY = new InjectionToken<RuntimeService>(\n 'HOSTED_RUNTIME_AUTHORITY',\n);\nconst HOSTED_PERMISSION_AUTHORITY = new InjectionToken<PermissionService>(\n 'HOSTED_PERMISSION_AUTHORITY',\n);\n\n/** 应用 Provider 可装配的运行模式;Hosted 模式不得拥有宿主认证与 HTTP 生命周期。 */\nexport type HostedAppRuntimeMode = 'standalone' | 'hosted';\n\n/** Workspace 页面渲染模式;该类型不表示导航入口类型。 */\nexport type HostedWorkspaceIntegrationMode = 'shell' | 'breadcrumb';\n\n/** 应用级 Provider 的最小运行配置。 */\nexport interface HostedAppConfig {\n /** 明确声明当前应用是否由主工作台托管。 */\n runtime: HostedAppRuntimeMode;\n /** 应用在当前宿主中的稳定路由基址。 */\n routeBasePath?: string;\n}\n\n/** 归一化后注入业务应用的运行配置。 */\nexport interface HostedAppRuntimeConfig {\n /** 当前应用的明确运行模式。 */\n runtime: HostedAppRuntimeMode;\n /** 已移除尾部斜杠的稳定路由基址。 */\n routeBasePath: string;\n}\n\n/** Standalone 应用可拥有的本地 Provider 选项。 */\nexport interface StandaloneAppOptions extends Omit<HostedAppConfig, 'runtime'> {\n /** 应用自有拦截器;平台 request/response 拦截器始终在其后注册。 */\n readonly httpInterceptors?: readonly HttpInterceptorFn[];\n}\n\n/** Hosted 应用允许覆盖的路由选项;认证、会话和 HTTP 仍由宿主拥有。 */\nexport type HostedAppOptions = Omit<HostedAppConfig, 'runtime'>;\n\n/** 应用装配工厂接受的 Angular Provider 联合类型。 */\nexport type AppRuntimeExtraProvider = EnvironmentProviders | Provider;\n\n/** Hosted Component 页面在 Workspace 中的注册合同。 */\nexport interface HostedWorkspaceShellViewportRegistration {\n /** 由当前应用直接渲染的 Angular 组件类型。 */\n readonly component: Type<unknown>;\n /** Hosted Component 固定使用 `shell` 渲染模式。 */\n readonly mode: 'shell';\n /** 与导航、权限和生命周期关联的稳定页面身份。 */\n readonly page: string;\n}\n\n/** Breadcrumb Route 页面在 Workspace 中的注册合同。 */\nexport interface HostedWorkspaceBreadcrumbViewportRegistration {\n /** Breadcrumb Route 固定使用 `breadcrumb` 渲染模式。 */\n readonly mode: 'breadcrumb';\n /** 与路由、权限和生命周期关联的稳定页面身份。 */\n readonly page: string;\n}\n\n/** Workspace 支持的两类应用视口注册合同。 */\nexport type HostedWorkspaceViewportRegistration =\n | HostedWorkspaceShellViewportRegistration\n | HostedWorkspaceBreadcrumbViewportRegistration;\n\n/** 当前应用注入器拥有的 Workspace 视口注册清单。 */\nexport const HOSTED_WORKSPACE_VIEWPORTS = new InjectionToken<\n readonly HostedWorkspaceViewportRegistration[]\n>('HOSTED_WORKSPACE_VIEWPORTS', { factory: () => [] });\n\nexport interface CreateAppRuntimeProvidersOptions<\n TRuntimeConfig extends HostedAppRuntimeConfig,\n> {\n /** 权限、反馈与审计使用的稳定应用编码,不能从路由或包名推断。 */\n appCode: string;\n /** 仅在 Hosted 模式安装且由应用自身拥有的 Provider。 */\n hostedProviders?: readonly Provider[];\n /** 当前应用拥有的一个或多个 Workspace 页面视口。 */\n hostedWorkspaceViewport?:\n | HostedWorkspaceViewportRegistration\n | readonly HostedWorkspaceViewportRegistration[];\n /** 向业务代码暴露归一化运行配置的应用自有 Token。 */\n runtimeConfigToken: InjectionToken<TRuntimeConfig>;\n /** 仅在 Standalone 模式安装且由应用自身拥有的 Provider。 */\n standaloneProviders?: readonly AppRuntimeExtraProvider[];\n /** Hosted 模式的默认稳定路由基址。 */\n hostedRouteBasePath: string;\n}\n\n/** 业务应用统一暴露的 Standalone、Hosted 与 Workspace 装配表面。 */\nexport interface AppRuntimeProviders<\n TRuntimeConfig extends HostedAppRuntimeConfig,\n> {\n /** 注入业务应用自身的归一化运行配置。 */\n provideApp(config: HostedAppConfig): EnvironmentProviders;\n\n /** 安装由当前应用拥有的完整 HTTP、反馈和 Runtime 边界。 */\n provideStandaloneApp(options?: StandaloneAppOptions): EnvironmentProviders;\n\n /** 安装只消费宿主认证、Runtime 与父级 HTTP 链路的应用边界。 */\n provideHostedApp(options?: HostedAppOptions): EnvironmentProviders;\n\n /**\n * 只为特殊 Hosted 集成建立父级 HTTP 链路。\n *\n * 普通业务清单应调用 `provideHostedApp`,不应直接使用此逃生口。\n */\n provideHostedHttp(\n interceptors?: readonly HttpInterceptorFn[],\n ): EnvironmentProviders;\n\n /**\n * 为单个 workspace-tab 的 page/viewport 注入器提供关闭能力。\n *\n * 该 Provider 必须与 hosted 应用 Provider 分层安装,不能放入同时服务 Outer Shell\n * 或多个 page 的 manifest 级注入器。\n *\n * @param options 绑定当前 Workspace 应用稳定 page 的作用域配置\n */\n provideWorkspaceTab(\n options: WorkspaceApplicationHostScopeOptions,\n ): EnvironmentProviders;\n}\n\nexport interface PlatformHostedAppConfig<\n TRuntimeConfig extends HostedAppRuntimeConfig = HostedAppRuntimeConfig,\n> {\n /** 权限、反馈与审计使用的稳定应用编码。 */\n readonly appCode: string;\n /** 当前 Hosted 应用拥有的 Workspace 视口。 */\n readonly hostedWorkspaceViewport?:\n | HostedWorkspaceViewportRegistration\n | readonly HostedWorkspaceViewportRegistration[];\n /** 由应用自身拥有、且不会覆盖宿主边界的 Provider。 */\n readonly providers?: readonly Provider[];\n /** Hosted 应用在主工作台中的稳定路由基址。 */\n readonly routeBasePath: string;\n /** 可选的应用运行配置 Token;存在时由本工厂注入 Hosted 配置。 */\n readonly runtimeConfigToken?: InjectionToken<TRuntimeConfig>;\n}\n\n/**\n * 创建只消费宿主 Runtime、认证和父级 HTTP 链路的 Hosted App Provider。\n *\n * Hosted 运行时只安装反馈归属补齐拦截器和 App 级 FeedbackService,不注册 request/response\n * 成功处理栈;最终成功反馈始终由父级唯一 responseInterceptor 处理。\n *\n * @param config Hosted App 的稳定 appCode、路由、视口和应用自有 Provider\n * @returns 可加入 Hosted Route/Viewport EnvironmentInjector 的 Provider 集合\n */\nexport function providePlatformHostedApp<\n TRuntimeConfig extends HostedAppRuntimeConfig = HostedAppRuntimeConfig,\n>(config: PlatformHostedAppConfig<TRuntimeConfig>): EnvironmentProviders {\n const routeBasePath = normalizeRouteBasePath(config.routeBasePath);\n const hostedWorkspaceViewports = toHostedWorkspaceViewports(\n config.hostedWorkspaceViewport,\n );\n\n return makeEnvironmentProviders([\n ...(config.providers ?? []),\n ...(config.runtimeConfigToken\n ? [\n {\n provide: config.runtimeConfigToken,\n useValue: {\n runtime: 'hosted',\n routeBasePath,\n } as TRuntimeConfig,\n },\n ]\n : []),\n provideHostedRuntimeContext(config, routeBasePath),\n { provide: HOSTED_RUNTIME_AUTHORITY, useClass: RuntimeService },\n { provide: RuntimeService, useExisting: HOSTED_RUNTIME_AUTHORITY },\n providePlatformFeedbackScope(),\n providePermissionAuditAdapter(),\n provideEnvironmentInitializer(() =>\n registerHostedPlatformFeedbackTarget(config.appCode),\n ),\n RuntimeSessionReaderService,\n { provide: HOSTED_PERMISSION_AUTHORITY, useClass: PermissionService },\n { provide: PermissionService, useExisting: HOSTED_PERMISSION_AUTHORITY },\n provideParentHostedHttp(),\n provideHostedBoundaryValidation(config, routeBasePath),\n provideHostedRuntimeContextSync(config, routeBasePath),\n ...hostedWorkspaceViewports.map((viewport) => ({\n provide: HOSTED_WORKSPACE_VIEWPORTS,\n multi: true,\n useValue: viewport,\n })),\n ]);\n}\n\n/**\n * 为业务应用生成一致的 Standalone/Hosted Runtime Provider 表面。\n *\n * Standalone 拥有完整 request/response HTTP 栈和本地反馈上下文;Hosted 只使用父级 HTTP,并在\n * 请求方向补齐可信 App 归属,防止父子链路重复处理成功反馈。\n *\n * @param options 应用稳定 appCode、配置 Token、路由、视口和应用自有 Provider\n * @returns 标准 provideApp/provideStandaloneApp/provideHostedApp/providerHostedHttp 工厂\n */\nexport function createAppRuntimeProviders<\n TRuntimeConfig extends HostedAppRuntimeConfig,\n>(\n options: CreateAppRuntimeProvidersOptions<TRuntimeConfig>,\n): AppRuntimeProviders<TRuntimeConfig> {\n const hostedWorkspaceViewports = toHostedWorkspaceViewports(\n options.hostedWorkspaceViewport,\n );\n const provideApp = (config: HostedAppConfig): EnvironmentProviders =>\n makeEnvironmentProviders([\n {\n provide: options.runtimeConfigToken,\n useValue: normalizeRuntimeConfig(config, options.hostedRouteBasePath),\n },\n ]);\n\n return {\n provideApp,\n provideStandaloneApp: (appOptions: StandaloneAppOptions = {}) => {\n const { httpInterceptors = [], ...runtimeOptions } = appOptions;\n\n return makeEnvironmentProviders([\n provideHttpClient(\n withInterceptors([\n ...httpInterceptors,\n requestInterceptor,\n responseInterceptor,\n ]),\n ),\n provideApp({ ...runtimeOptions, runtime: 'standalone' }),\n provideRuntimeContext({\n appCode: options.appCode,\n baseHref:\n normalizeRouteBasePath(runtimeOptions.routeBasePath ?? '') || '/',\n mode: 'standalone',\n }),\n providePlatformFeedbackScope(),\n providePlatformRequestActivityScope(),\n ...provideStandaloneCapabilityAdapters(),\n ...(options.standaloneProviders ?? []),\n ]);\n },\n provideHostedApp: (appOptions: HostedAppOptions = {}) => {\n const routeBasePath = normalizeRouteBasePath(\n appOptions.routeBasePath ?? options.hostedRouteBasePath,\n );\n\n return makeEnvironmentProviders([\n provideApp({ ...appOptions, runtime: 'hosted' }),\n providePlatformHostedApp({\n appCode: options.appCode,\n providers: options.hostedProviders,\n routeBasePath,\n }),\n ...hostedWorkspaceViewports.map((viewport) => ({\n provide: HOSTED_WORKSPACE_VIEWPORTS,\n multi: true,\n useValue: viewport,\n })),\n ]);\n },\n provideHostedHttp: provideParentHostedHttp,\n provideWorkspaceTab: provideWorkspaceApplicationHostScope,\n };\n}\n\nfunction provideParentHostedHttp(\n interceptors: readonly HttpInterceptorFn[] = [],\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideHttpClient(\n withInterceptors([httpFeedbackOwnershipInterceptor, ...interceptors]),\n withRequestsMadeViaParent(),\n ),\n ]);\n}\n\nfunction provideStandaloneCapabilityAdapters(): readonly Provider[] {\n return [\n provideRequestActivityAdapter(),\n {\n provide: HTTP_FEEDBACK_EVENT_PORT,\n useFactory: () =>\n createHttpFeedbackAdapter(inject(PLATFORM_FEEDBACK_INGRESS_PORT)),\n },\n providePermissionAuditAdapter(),\n ];\n}\n\nfunction createHttpFeedbackAdapter(feedback: PlatformFeedbackIngressPort): {\n readonly emit: (event: HttpFeedbackEvent) => void;\n} {\n return {\n emit: (event) =>\n void feedback.emit({\n tone: event.type,\n message: event.message,\n options: event.options,\n context: event.callerContext,\n }),\n };\n}\n\nfunction providePermissionAuditAdapter(): Provider {\n return {\n provide: PERMISSION_AUDIT_PORT,\n useFactory: () => {\n const audit = inject(PlatformAuditService);\n return {\n recordDenied: (event: PermissionDeniedEvent) =>\n audit.recordFailure(PLATFORM_AUDIT_ACTIONS.permissionDenied, event),\n };\n },\n };\n}\n\nfunction provideHostedRuntimeContext(\n config: PlatformHostedAppConfig,\n routeBasePath: string,\n): Provider {\n return {\n provide: APP_RUNTIME_CONTEXT,\n useFactory: () => {\n const parentRuntime = inject(RuntimeService, { skipSelf: true });\n\n return createHostedRuntimeContext(\n config,\n routeBasePath,\n parentRuntime.context(),\n );\n },\n };\n}\n\nfunction provideHostedRuntimeContextSync(\n config: PlatformHostedAppConfig,\n routeBasePath: string,\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideEnvironmentInitializer(() => {\n const parentRuntime = inject(RuntimeService, { skipSelf: true });\n const hostedRuntime = inject(RuntimeService);\n const injector = inject(Injector);\n effect(\n () => {\n synchronizeHostedRuntimeContext(\n hostedRuntime,\n createHostedRuntimeContext(\n config,\n routeBasePath,\n parentRuntime.context(),\n ),\n );\n },\n { injector },\n );\n }),\n ]);\n}\n\nfunction createHostedRuntimeContext(\n config: PlatformHostedAppConfig,\n routeBasePath: string,\n parentContext: AppRuntimeContext,\n): AppRuntimeContext {\n return normalizeRuntimeContext({\n ...inheritHostedRuntimeContext(parentContext),\n appCode: config.appCode,\n baseHref: routeBasePath || '/',\n capabilities: HOSTED_RUNTIME_CAPABILITIES,\n host: 'main',\n mode: 'hosted',\n });\n}\n\nfunction inheritHostedRuntimeContext(\n parentContext: AppRuntimeContext,\n): Partial<AppRuntimeContext> {\n return {\n apiBaseUrl: parentContext.apiBaseUrl,\n dataScopes: parentContext.dataScopes,\n metadata: parentContext.metadata,\n permissions: parentContext.permissions,\n roles: parentContext.roles,\n shellBaseUrl: parentContext.shellBaseUrl,\n userId: parentContext.userId,\n };\n}\n\nfunction provideHostedBoundaryValidation(\n config: PlatformHostedAppConfig,\n routeBasePath: string,\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideEnvironmentInitializer(() => {\n const parentRuntime = inject(RuntimeService, { skipSelf: true });\n const hostedRuntime = inject(RuntimeService, { self: true });\n const hostedPermission = inject(PermissionService, { self: true });\n const runtimeAuthority = inject(HOSTED_RUNTIME_AUTHORITY, { self: true });\n const permissionAuthority = inject(HOSTED_PERMISSION_AUTHORITY, {\n self: true,\n });\n const localRuntimeContext = inject(APP_RUNTIME_CONTEXT, { self: true });\n const localAuthTokenGetter = inject(HTTP_AUTH_TOKEN_GETTER, {\n optional: true,\n self: true,\n });\n const localHttpConfig = inject(HTTP_CONFIG, {\n optional: true,\n self: true,\n });\n const localResponseConfig = inject(HTTP_RESPONSE_INTERCEPTOR_CONFIG, {\n optional: true,\n self: true,\n });\n const localUnauthorizedHandler = inject(HTTP_UNAUTHORIZED_HANDLER, {\n optional: true,\n self: true,\n });\n const localErrorHandler = inject(ErrorHandler, {\n optional: true,\n self: true,\n });\n const ownedProviders = [\n localAuthTokenGetter ? 'HTTP_AUTH_TOKEN_GETTER' : '',\n localHttpConfig ? 'HTTP_CONFIG' : '',\n localResponseConfig ? 'HTTP_RESPONSE_INTERCEPTOR_CONFIG' : '',\n localUnauthorizedHandler ? 'HTTP_UNAUTHORIZED_HANDLER' : '',\n localErrorHandler ? 'ErrorHandler' : '',\n hostedRuntime !== runtimeAuthority ? 'RuntimeService' : '',\n hostedPermission !== permissionAuthority ? 'PermissionService' : '',\n ].filter(Boolean);\n\n if (ownedProviders.length > 0) {\n throw new Error(\n `Hosted applications must inherit the host HTTP/auth boundary; remove local providers: ${ownedProviders.join(', ')}.`,\n );\n }\n\n const expectedContext = createHostedRuntimeContext(\n config,\n routeBasePath,\n parentRuntime.context(),\n );\n const mismatchedFields = Array.from(\n new Set([\n ...findHostedRuntimeMismatches(localRuntimeContext, expectedContext),\n ...findHostedRuntimeMismatches(\n hostedRuntime.context(),\n expectedContext,\n ),\n ]),\n );\n if (mismatchedFields.length > 0) {\n throw new Error(\n `Hosted applications must inherit the host runtime context; locally overridden fields: ${mismatchedFields.join(', ')}.`,\n );\n }\n }),\n ]);\n}\n\nfunction findHostedRuntimeMismatches(\n actual: AppRuntimeContext,\n expected: AppRuntimeContext,\n): readonly string[] {\n const referenceFields = [\n 'apiBaseUrl',\n 'appCode',\n 'appName',\n 'baseHref',\n 'dataScopes',\n 'host',\n 'metadata',\n 'mode',\n 'permissions',\n 'roles',\n 'shellBaseUrl',\n 'userId',\n ] as const satisfies readonly (keyof AppRuntimeContext)[];\n const mismatches: (keyof AppRuntimeContext)[] = referenceFields.filter(\n (field) => !runtimeContextValuesEqual(actual[field], expected[field]),\n );\n const capabilityFields = Object.keys(\n HOSTED_RUNTIME_CAPABILITIES,\n ) as (keyof typeof HOSTED_RUNTIME_CAPABILITIES)[];\n\n if (\n capabilityFields.some(\n (field) => actual.capabilities[field] !== expected.capabilities[field],\n )\n ) {\n mismatches.push('capabilities');\n }\n\n return mismatches;\n}\n\nfunction runtimeContextValuesEqual(\n actual: unknown,\n expected: unknown,\n): boolean {\n if (Object.is(actual, expected)) {\n return true;\n }\n\n if (actual instanceof Date && expected instanceof Date) {\n return actual.getTime() === expected.getTime();\n }\n\n if (Array.isArray(actual) && Array.isArray(expected)) {\n return (\n actual.length === expected.length &&\n actual.every((item, index) =>\n runtimeContextValuesEqual(item, expected[index]),\n )\n );\n }\n\n if (\n isComparableRuntimeRecord(actual) &&\n isComparableRuntimeRecord(expected)\n ) {\n const actualKeys = Object.keys(actual);\n const expectedKeys = Object.keys(expected);\n return (\n actualKeys.length === expectedKeys.length &&\n actualKeys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(expected, key) &&\n runtimeContextValuesEqual(actual[key], expected[key]),\n )\n );\n }\n\n return false;\n}\n\nfunction isComparableRuntimeRecord(\n value: unknown,\n): value is Readonly<Record<string, unknown>> {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction toHostedWorkspaceViewports(\n viewport:\n | HostedWorkspaceViewportRegistration\n | readonly HostedWorkspaceViewportRegistration[]\n | undefined,\n): readonly HostedWorkspaceViewportRegistration[] {\n if (!viewport) {\n return [];\n }\n\n return isHostedWorkspaceViewportArray(viewport) ? viewport : [viewport];\n}\n\nfunction isHostedWorkspaceViewportArray(\n value:\n | HostedWorkspaceViewportRegistration\n | readonly HostedWorkspaceViewportRegistration[],\n): value is readonly HostedWorkspaceViewportRegistration[] {\n return Array.isArray(value);\n}\n\nfunction normalizeRuntimeConfig<TRuntimeConfig extends HostedAppRuntimeConfig>(\n config: HostedAppConfig,\n hostedRouteBasePath: string,\n): TRuntimeConfig {\n return {\n runtime: config.runtime,\n routeBasePath: normalizeRouteBasePath(\n config.routeBasePath ??\n (config.runtime === 'hosted' ? hostedRouteBasePath : ''),\n ),\n } as TRuntimeConfig;\n}\n\nfunction normalizeRouteBasePath(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n","import { from, Observable } from 'rxjs';\r\n\r\ninterface ElectronRequestBridge {\r\n get<T>(url: string, option: string): Promise<T>;\r\n post<T>(url: string, data: unknown): Promise<T>;\r\n delete<T>(url: string, option: string): Promise<T>;\r\n put<T>(url: string, data: unknown): Promise<T>;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n electronRequest: ElectronRequestBridge;\r\n }\r\n}\r\n\r\n/**\r\n * 把宿主预加载脚本暴露的 Electron IPC 请求桥转换为 Observable。\r\n *\r\n * 该适配器只适用于已经注入 `window.electronRequest` 的可信 Electron 窗口;浏览器环境调用会失败,\r\n * 业务代码不得借此绕过平台 HTTP、认证与错误处理合同。\r\n */\r\nexport class ElectronRequest {\r\n /**\r\n * 发送 GET 请求\r\n * @param url 请求 URL\r\n * @param option 请求选项\r\n * @returns 响应数据\r\n */\r\n get<T>(url: string, option: string): Observable<T> {\r\n return from(window.electronRequest.get<T>(url, option));\r\n }\r\n\r\n /**\r\n * 发送 POST 请求\r\n * @param url 请求 URL\r\n * @param data 请求数据\r\n * @returns 响应数据\r\n */\r\n post<T>(url: string, data: unknown): Observable<T> {\r\n return from(window.electronRequest.post<T>(url, data));\r\n }\r\n\r\n /**\r\n * 发送 DELETE 请求\r\n * @param url 请求 URL\r\n * @param option 请求选项\r\n * @returns 响应数据\r\n */\r\n delete<T>(url: string, option: string): Observable<T> {\r\n return from(window.electronRequest.delete<T>(url, option));\r\n }\r\n\r\n /**\r\n * 发送 PUT 请求\r\n * @param url 请求 URL\r\n * @param data 请求数据\r\n * @returns 响应数据\r\n */\r\n put<T>(url: string, data: unknown): Observable<T> {\r\n return from(window.electronRequest.put<T>(url, data));\r\n }\r\n}\r\n","import { ErrorHandler, Injectable, inject, type Provider } from '@angular/core';\r\nimport { getPlatformError, getHttpStatusMessage } from 'platform-core-ts';\r\n\r\nimport {\r\n HTTP_UNAUTHORIZED_HANDLER,\r\n HttpUnauthorizedException,\r\n} from 'platform-core-ng/http';\r\nimport { PlatformFeedbackService } from 'platform-core-ng/feedback';\r\n\r\n/**\r\n * 将未被业务流程消费的异常统一转换为平台反馈,并委托最终认证失效处理。\r\n *\r\n * 错误反馈直接进入当前运行时作用域的 `PlatformFeedbackService`,不再经过历史消息 Token;\r\n * 认证失效仍遵循“先反馈、后清理会话和导航”的平台契约。\r\n */\r\n@Injectable()\r\nexport class GlobalErrorHandler implements ErrorHandler {\r\n private readonly feedback = inject(PlatformFeedbackService);\r\n private readonly unauthorizedHandler = inject(HTTP_UNAUTHORIZED_HANDLER, {\r\n optional: true,\r\n });\r\n\r\n /**\r\n * 处理 Angular 冒泡到全局边界的异常。\r\n *\r\n * @param error 原始异常或 Angular 包装后的异常\r\n */\r\n handleError(error: unknown): void {\r\n const unwrappedError = unwrapError(error);\r\n const platformError = getPlatformError(unwrappedError);\r\n\r\n if (platformError?.terminalAuthenticationFailure) {\r\n this.handleUnauthorizedError(unwrappedError, platformError.message);\r\n return;\r\n }\r\n\r\n if (platformError) {\n this.feedback.error(platformError.message, feedbackOptions(platformError));\n if (platformError.type !== 'business') {\r\n console.error(unwrappedError);\r\n }\r\n return;\r\n }\r\n\r\n this.feedback.error('未知错误', { title: '请联系管理员' });\r\n console.error(unwrappedError);\r\n }\r\n\r\n private handleUnauthorizedError(error: unknown, message: string): void {\r\n this.feedback.error(message || getHttpStatusMessage(401));\r\n\r\n if (!this.unauthorizedHandler) {\r\n console.error(\r\n '[GlobalErrorHandler] HTTP_UNAUTHORIZED_HANDLER not provided.',\r\n error,\r\n );\r\n return;\r\n }\r\n\r\n const httpErrorResponse =\r\n error instanceof HttpUnauthorizedException ? error.response : undefined;\r\n\r\n try {\r\n const result = this.unauthorizedHandler(httpErrorResponse);\r\n if (isPromiseLike(result)) {\r\n void result.catch((handlerError: unknown) => {\r\n console.error(\r\n '[GlobalErrorHandler] HTTP_UNAUTHORIZED_HANDLER failed.',\r\n handlerError,\r\n );\r\n });\r\n }\r\n } catch (handlerError) {\r\n console.error(\r\n '[GlobalErrorHandler] HTTP_UNAUTHORIZED_HANDLER failed.',\r\n handlerError,\r\n );\r\n }\r\n }\r\n}\n\n/**\n * 为可重试的基础连接故障提供稳定去重键,避免并发请求把同一条网络提示排队多次。\n * 业务错误不共用去重键,以免不同操作的失败提示被错误合并。\n */\nfunction feedbackOptions(platformError: {\n readonly type: string;\n readonly code: string;\n}): { readonly dedupeKey?: string } {\n if (platformError.type === 'connection' || platformError.type === 'timeout') {\n return { dedupeKey: `global-feedback:${platformError.code}` };\n }\n\n return {};\n}\n\r\n/**\r\n * 注册平台全局异常处理器。\r\n *\r\n * 调用方必须同时提供当前运行模式的 `PlatformFeedbackService` 作用域;认证应用还应提供\r\n * `HTTP_UNAUTHORIZED_HANDLER` 完成自身会话清理和安全导航。\r\n *\r\n * @returns Angular 全局错误处理 Provider\r\n */\r\nexport function provideGlobalErrorHandler(): Provider {\r\n return { provide: ErrorHandler, useClass: GlobalErrorHandler };\r\n}\r\n\r\nfunction unwrapError(error: unknown): unknown {\r\n const visited = new WeakSet<object>();\r\n let current = error;\r\n\r\n while (\r\n current !== null &&\r\n typeof current === 'object' &&\r\n !visited.has(current)\r\n ) {\r\n // Error Contract 异常的 cause 只用于诊断,不能把已分类错误再解包回框架原始异常。\r\n if (getPlatformError(current)) {\r\n return current;\r\n }\r\n visited.add(current);\r\n const wrapper = current as {\r\n cause?: unknown;\r\n ngOriginalError?: unknown;\r\n originalError?: unknown;\r\n rejection?: unknown;\r\n };\r\n const next =\r\n wrapper.ngOriginalError ??\r\n wrapper.rejection ??\r\n wrapper.originalError ??\r\n wrapper.cause;\r\n\r\n if (next === undefined || next === current) {\r\n return current;\r\n }\r\n\r\n current = next;\r\n }\r\n\r\n return current;\r\n}\r\n\r\nfunction isPromiseLike(value: void | Promise<void>): value is Promise<void> {\r\n return !!value && typeof value.catch === 'function';\r\n}\r\n","/**\r\n * 平台应用级 Provider 与跨能力装配正式入口。\r\n *\r\n * 该入口只组合 Runtime、HTTP、Auth、Permission、Feedback 与 UI Port,不拥有业务状态,\r\n * 也不得被任何底层正式入口反向依赖。\r\n */\r\nexport * from './src';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -263,6 +263,7 @@ class RuntimeService {
|
|
|
263
263
|
}
|
|
264
264
|
assertCanOwnRuntime(requestedMode = this.contextState().mode) {
|
|
265
265
|
if (this.contextState().mode !== 'standalone' || requestedMode !== 'standalone') {
|
|
266
|
+
// TODO 这里为什么抛出的是 Error?
|
|
266
267
|
throw new Error('Hosted and embedded runtime contexts are read-only; update the host runtime instead.');
|
|
267
268
|
}
|
|
268
269
|
}
|
|
@@ -664,30 +665,6 @@ function providePlatformRequestActivityScope() {
|
|
|
664
665
|
]);
|
|
665
666
|
}
|
|
666
667
|
|
|
667
|
-
// 限期兼容旧无上下文 API;新作用域活动绝不读取这个模块级计数。
|
|
668
|
-
const requestCount = signal(0, /* @ts-ignore */
|
|
669
|
-
...(ngDevMode ? [{ debugName: "requestCount" }] : /* istanbul ignore next */ []));
|
|
670
|
-
/**
|
|
671
|
-
* 旧模块全局忙碌状态,合计标准 HTTP 兼容桥与旧手工计数,不具备注入器隔离性。
|
|
672
|
-
* @deprecated 应用总进度改用 PlatformRequestActivity,页面使用自己的 loading;桥接期限见机器治理。
|
|
673
|
-
*/
|
|
674
|
-
const isLoading = computed(() => requestCount() > 0, /* @ts-ignore */
|
|
675
|
-
...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
|
|
676
|
-
/**
|
|
677
|
-
* 增加一次旧全局活动;只能与 decreaseLoading 配对,不会影响新作用域状态。
|
|
678
|
-
* @deprecated 保留至兼容窗口结束,禁止新业务使用;不推断调用方注入器。
|
|
679
|
-
*/
|
|
680
|
-
function increaseLoading() {
|
|
681
|
-
requestCount.update((count) => count + 1);
|
|
682
|
-
}
|
|
683
|
-
/**
|
|
684
|
-
* 归还一次旧全局活动,保留历史的零下限;不改变任何独立作用域计数。
|
|
685
|
-
* @deprecated 保留至兼容窗口结束,禁止新业务使用;须与旧 increaseLoading 配对。
|
|
686
|
-
*/
|
|
687
|
-
function decreaseLoading() {
|
|
688
|
-
requestCount.update((count) => Math.max(0, count - 1));
|
|
689
|
-
}
|
|
690
|
-
|
|
691
668
|
/**
|
|
692
669
|
* Angular 平台 Runtime 正式入口。
|
|
693
670
|
*
|
|
@@ -699,5 +676,5 @@ function decreaseLoading() {
|
|
|
699
676
|
* Generated bundle index. Do not edit.
|
|
700
677
|
*/
|
|
701
678
|
|
|
702
|
-
export { APP_RUNTIME_CONTEXT, APP_RUNTIME_USER_PROFILE_METADATA_KEY, DEFAULT_APP_RUNTIME_CONTEXT, EMBEDDED_RUNTIME_CAPABILITIES, HOSTED_RUNTIME_CAPABILITIES, PLATFORM_REQUEST_ACTIVITY_WRITER, PlatformRequestActivity, RuntimeService, RuntimeSessionReaderService, STANDALONE_RUNTIME_CAPABILITIES, WORKSPACE_APPLICATION_HOST, WORKSPACE_APPLICATION_HOST_CONTROLLER, WorkspaceApplicationLifecycleRegistry,
|
|
679
|
+
export { APP_RUNTIME_CONTEXT, APP_RUNTIME_USER_PROFILE_METADATA_KEY, DEFAULT_APP_RUNTIME_CONTEXT, EMBEDDED_RUNTIME_CAPABILITIES, HOSTED_RUNTIME_CAPABILITIES, PLATFORM_REQUEST_ACTIVITY_WRITER, PlatformRequestActivity, RuntimeService, RuntimeSessionReaderService, STANDALONE_RUNTIME_CAPABILITIES, WORKSPACE_APPLICATION_HOST, WORKSPACE_APPLICATION_HOST_CONTROLLER, WorkspaceApplicationLifecycleRegistry, normalizeRuntimeContext, providePlatformRequestActivityScope, provideRuntimeContext, provideWorkspaceApplicationHostScope, registerWorkspaceApplicationLifecycleParticipant, synchronizeHostedRuntimeContext };
|
|
703
680
|
//# sourceMappingURL=platform-core-ng-runtime.mjs.map
|