webloom-framework 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +92 -0
- package/dist/chunk-KGNF36DZ.js +3736 -0
- package/dist/chunk-KGNF36DZ.js.map +1 -0
- package/dist/createPluginHost-CcW9sPNs.d.ts +1340 -0
- package/dist/index.d.ts +159 -0
- package/dist/index.js +583 -0
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +80 -0
- package/dist/react.js +177 -0
- package/dist/react.js.map +1 -0
- package/dist/resourceRegistry-BAnqKcp7.d.ts +157 -0
- package/dist/testing.d.ts +23 -0
- package/dist/testing.js +27 -0
- package/dist/testing.js.map +1 -0
- package/docs/api.md +29 -0
- package/docs/migration-baseline.md +32 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contracts/plugin.ts","../src/lifecycle/permissionVerifier.ts","../src/lifecycle/scopedRegistry.ts","../src/lifecycle/upgradeGate.ts","../src/transport/messagePortServiceProvider.ts"],"names":["input"],"mappings":"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","file":"index.js","sourcesContent":["// WebLoom 插件公共契约。\n//\n// 这里故意只描述插件、运行单元和宿主扩展点。具体产品可以通过泛型扩展\n// contribution、config、attributes 和 Context Extension,但不能把领域字段\n// 反向写进 WebLoom 核心。\n\nimport type { MessageBus } from \"./messageBus.js\";\nimport type {\n LifecycleScope,\n PluginExecution,\n PluginLifetime,\n PluginPermission,\n PermissionLease,\n RemoteServiceBridge,\n ScopedTaskScheduler,\n} from \"./lifecycle.js\";\n\n/** 宿主注入的只读结构化属性;不得放入私钥、口令或 Seed。 */\nexport type PluginAttributes = Readonly<Record<string, unknown>>;\n\n/** 插件配置的默认形状;具体配置由产品通过泛型约束。 */\nexport type PluginConfig = Readonly<Record<string, unknown>>;\n\n/** 插件对宿主贡献的默认形状;具体贡献由产品通过泛型约束。 */\nexport type PluginContribution = unknown;\n\n/** 插件 Context Extension 的默认形状;领域服务只能从这里注入。 */\nexport type PluginContextExtension = Readonly<Record<string, unknown>>;\n\n/** 插件运行时上下文,由 Host 创建并传入运行单元实现。 */\nexport interface PluginContext<\n TConfig extends PluginConfig = PluginConfig,\n TExtension extends PluginContextExtension = PluginContextExtension,\n> {\n /** Host 绑定的稳定产品标识;插件不能从调用参数伪造其它标识。 */\n readonly pluginId: string;\n /** 本次装配生成的实例标识;重启不得复用。 */\n readonly instanceId: string;\n /** 稳定运行单元标识;不等于本次启动的 instanceId。 */\n readonly unitId: string;\n /** 当前插件实例的作用域;业务资源应登记到此作用域。 */\n readonly scope: LifecycleScope;\n /** 作用域撤权信号;停止、禁用和宿主关闭时触发。 */\n readonly signal: AbortSignal;\n /** 可信装配层批准后的权限视图;插件自声明不能扩大集合。 */\n readonly permissions: readonly PluginPermission[];\n /** 绑定当前实例和权限身份的租约;最终 I/O 仍需再次校验。 */\n readonly permissionLease: PermissionLease;\n /** 已完成握手和快照校验的远程服务桥。 */\n readonly serviceBridge?: RemoteServiceBridge;\n /** 绑定当前插件实例的后台任务注册面。 */\n readonly taskScheduler?: ScopedTaskScheduler;\n /** 宿主注入的领域扩展;只读且不能替换实例身份。 */\n readonly extension: TExtension;\n /** 注册在停止前运行的清理函数;重复停止必须幂等。 */\n onDispose(cleanup: PluginTeardown): void;\n /** 注册 capability;重复注册会抛错。 */\n provide<T>(key: string, value: T): void;\n /** 读取 capability;缺失会抛错。 */\n get<T>(key: string): T;\n /** 探测 capability 是否存在。 */\n has(key: string): boolean;\n /** 要求 capability 存在,否则抛错。 */\n require(key: string): void;\n /** 事件、命令和请求响应的统一入口。 */\n readonly messageBus: MessageBus;\n /** 宿主注入的只读配置;不与启停意图存储混用。 */\n readonly config?: TConfig;\n}\n\n/** 产品级依赖描述;简单插件可使用,跨环境单元应使用严格依赖。 */\nexport interface PluginDependency {\n /** 依赖的 capability 标识。 */\n capability: string;\n /** 精确契约版本;跨环境依赖不得省略。 */\n contractVersion?: string;\n /** 提供者代码所在执行环境;由宿主定义。 */\n sourceExecution?: PluginExecution;\n /** 提供者允许存在的生命周期;由宿主定义。 */\n scope?: PluginLifetime;\n /** 可选的人类可读诊断说明。 */\n reason?: string;\n /** 缺失时只关闭局部能力,不阻止主体运行。 */\n optional?: boolean;\n}\n\n/** 运行单元的严格依赖描述。 */\nexport interface RuntimeUnitDependency {\n /** 依赖的 capability 标识。 */\n capability: string;\n /** 精确契约版本;第一阶段只接受完全匹配。 */\n contractVersion: string;\n /** 提供者实际运行环境。 */\n sourceExecution: PluginExecution;\n /** 提供者允许存在的生命周期。 */\n scope: PluginLifetime;\n /** 可选的人类可读诊断说明。 */\n reason?: string;\n /** 缺失时只关闭局部能力;未填写表示硬依赖。 */\n optional?: boolean;\n}\n\n/** 返回稳定的 capability 契约版本。 */\nexport function runtimeCapabilityContractVersion(capability: string): string {\n return `${capability}.v1`;\n}\n\n/** 将依赖清单补齐为严格运行单元依赖。 */\nexport function defineRuntimeUnitDependencies(\n dependencies: readonly Pick<PluginDependency, \"capability\" | \"reason\" | \"optional\">[],\n defaults: Partial<Pick<RuntimeUnitDependency, \"sourceExecution\" | \"scope\">> = {},\n): RuntimeUnitDependency[] {\n return dependencies.map((dependency) => ({\n capability: dependency.capability,\n contractVersion: runtimeCapabilityContractVersion(dependency.capability),\n sourceExecution: defaults.sourceExecution ?? \"default\",\n scope: defaults.scope ?? \"root\",\n ...(dependency.reason !== undefined ? { reason: dependency.reason } : {}),\n ...(dependency.optional !== undefined ? { optional: dependency.optional } : {}),\n }));\n}\n\n/** 为运行单元生成精确的 capability 契约版本表。 */\nexport function defineRuntimeUnitProvidedContracts(\n capabilities: readonly string[],\n): Record<string, string> {\n return Object.fromEntries(\n capabilities.map((capability) => [capability, runtimeCapabilityContractVersion(capability)]),\n );\n}\n\n/** 插件在产品清单中的启动要求。 */\nexport type PluginStartupMode = \"required\" | \"optional\";\n\n/** 插件展示元数据;kind、group 和 execution 都由宿主或产品定义。 */\nexport interface PluginMeta {\n /** 产品自定义分类,不由 WebLoom 解释。 */\n kind?: string;\n /** 首次装配时默认是否启用。 */\n defaultEnabled: boolean;\n /** 是否允许产品控制面禁用。 */\n canDisable: boolean;\n /** 是否属于启动必需插件。 */\n startup?: PluginStartupMode;\n /** 产品自定义展示分组。 */\n displayGroup?: string;\n /** 默认运行生命周期;未填写时使用宿主默认值。 */\n lifetime?: PluginLifetime;\n /** 默认执行环境;不从 UI 或实现类型推断。 */\n execution?: PluginExecution;\n}\n\n/** 插件 setup 返回的清理函数。 */\nexport type PluginTeardown = () => void | Promise<void>;\n\n/** 插件运行单元的无 UI 装配入口。 */\nexport type PluginSetup<\n TConfig extends PluginConfig = PluginConfig,\n TExtension extends PluginContextExtension = PluginContextExtension,\n> = (ctx: PluginContext<TConfig, TExtension>) =>\n void | Promise<void> | PluginTeardown | Promise<PluginTeardown>;\n\n/** 当前执行环境中按 productId + unitId 解析实现。 */\nexport interface RuntimeUnitImplementationRegistry<\n TConfig extends PluginConfig = PluginConfig,\n TExtension extends PluginContextExtension = PluginContextExtension,\n> {\n /** 未装配实现时返回 undefined。 */\n get(pluginId: string, unitId: string): PluginSetup<TConfig, TExtension> | undefined;\n}\n\n/** 一个产品可以装配的运行单元。 */\nexport interface RuntimeUnitDescriptor<\n TContribution = PluginContribution,\n TConfig extends PluginConfig = PluginConfig,\n> {\n /** 稳定运行单元标识。 */\n id: string;\n /** 运行代码所在环境。 */\n execution: PluginExecution;\n /** 依附的作用域寿命。 */\n lifetime: PluginLifetime;\n /** 本单元所需的精确 capability 契约。 */\n dependencies?: RuntimeUnitDependency[];\n /** 本单元提供的 capability。 */\n provides?: string[];\n /** 本单元每个 capability 的精确版本。 */\n providedContracts?: Record<string, string>;\n /** 宿主贡献;内容由产品泛型定义。 */\n contribution?: TContribution;\n /** 本单元申请的权限。 */\n permissions?: PluginPermission[];\n /** 单元专属只读配置声明或装配默认值。 */\n config?: TConfig;\n}\n\n/** 插件清单;插件作者导出的唯一静态描述。 */\nexport interface PluginManifest<\n TContribution = PluginContribution,\n TConfig extends PluginConfig = PluginConfig,\n TExtension extends PluginContextExtension = PluginContextExtension,\n> {\n /** 全局稳定产品标识。 */\n id: string;\n /** 展示名称。 */\n name: string;\n /** 展示描述。 */\n description?: string;\n /** 简单插件的宿主贡献;复杂产品通过运行单元声明。 */\n contribution?: TContribution;\n /** 简单插件的兼容依赖。 */\n dependencies?: PluginDependency[];\n /** 简单插件声明提供的 capability;多单元插件必须放入 unit.provides。 */\n provides?: string[];\n /** 产品元数据。 */\n meta: PluginMeta;\n /** 简单插件的申请权限。 */\n permissions?: PluginPermission[];\n /** 多环境插件的静态运行单元描述。 */\n units?: readonly RuntimeUnitDescriptor<TContribution, TConfig>[];\n /** 简单插件的只读配置。 */\n config?: TConfig;\n}\n\n/** 插件运行状态类别;registered 不代表已经运行。 */\nexport type PluginStateKind =\n | \"registered\"\n | \"starting\"\n | \"stopping\"\n | \"enabled\"\n | \"disabled\"\n | \"blocked\"\n | \"error-disabled\"\n | \"cleanup-pending\"\n | \"unknown\";\n\n/** 对外稳定的产品运行语义。 */\nexport type PluginLifecycleState = \"disabled\" | \"waiting\" | \"starting\" | \"running\" | \"stopping\" | \"failed\";\n\n/** Host 查询到的插件状态。 */\nexport interface PluginState {\n /** 产品标识。 */\n id: string;\n /** 兼容状态类别。 */\n kind: PluginStateKind;\n /** 稳定生命周期语义。 */\n lifecycleState?: PluginLifecycleState;\n /** 最近一次错误。 */\n error?: string;\n /** 持久化启用意图。 */\n desiredEnabled?: boolean;\n /** 当前产品意图修订。 */\n desiredRevision?: number;\n /** 当前运行实例标识。 */\n instanceId?: string;\n /** 当前运行单元标识。 */\n unitId?: string;\n /** 当前阻塞或清理原因。 */\n blockedBy?: string[];\n /** 最近一次结构化清理结果。 */\n cleanup?: import(\"./lifecycle.js\").LifecycleDisposeResult;\n /** 当前产品下的运行单元状态。 */\n units?: readonly PluginUnitState[];\n}\n\n/** 运行单元状态;唯一身份由 product、unit 和 instance 共同组成。 */\nexport interface PluginUnitState {\n /** 所属产品标识。 */\n pluginId: string;\n /** 稳定运行单元标识。 */\n unitId: string;\n /** 运行环境。 */\n execution: PluginExecution;\n /** 当前运行实例。 */\n instanceId?: string;\n /** 当前意图修订。 */\n desiredRevision?: number;\n /** 单元状态。 */\n kind: PluginStateKind;\n /** 单元失败原因。 */\n error?: string;\n /** 单元清理结果。 */\n cleanup?: import(\"./lifecycle.js\").LifecycleDisposeResult;\n}\n\n/** 依赖图中的反向依赖者。 */\nexport interface PluginReverseDep {\n /** 反向依赖产品标识。 */\n pluginId: string;\n /** 依赖者当前是否运行。 */\n enabled: boolean;\n /** 触发依赖的 capability。 */\n capabilities: string[];\n}\n\n/** 插件依赖图快照。 */\nexport interface PluginGraph {\n /** 已知产品标识列表。 */\n plugins: string[];\n /** 产品依赖的 capability。 */\n dependencies: Record<string, string[]>;\n /** 产品的可选依赖。 */\n optionalDependencies?: Record<string, string[]>;\n /** 产品声明提供的 capability。 */\n provides: Record<string, string[]>;\n /** capability 到反向依赖者。 */\n reverse: Record<string, PluginReverseDep[]>;\n /** capability 到声明提供者。 */\n providers?: Record<string, string[]>;\n /** 精确依赖描述。 */\n dependencyDetails?: Record<string, PluginDependency[]>;\n /** 发现的硬依赖环。 */\n cycles?: string[][];\n /** 当前图中的运行单元。 */\n units?: Record<string, PluginUnitGraph>;\n}\n\n/** 运行单元依赖图节点。 */\nexport interface PluginUnitGraph {\n /** 所属产品标识。 */\n pluginId: string;\n /** 稳定运行单元标识。 */\n unitId: string;\n /** 运行环境。 */\n execution: PluginExecution;\n /** capability 依赖。 */\n dependencies: string[];\n /** 精确依赖描述。 */\n dependencyDetails?: RuntimeUnitDependency[];\n /** capability 提供。 */\n provides: string[];\n /** capability 精确版本。 */\n providedContracts?: Record<string, string>;\n}\n\n/** Host 版本或状态变化监听器。 */\nexport type HostListener = (snapshot: { version: number }) => void;\n\n/** 启动前能力检查的结构化详情。 */\nexport interface StartupCapabilityErrorDetails {\n /** 缺失 capability 标识。 */\n capability: string;\n /** 已知提供者产品标识。 */\n providerPluginId?: string;\n /** 提供者状态。 */\n providerState?: PluginStateKind;\n /** 提供者错误。 */\n providerError?: string;\n /** 当前持久化意图。 */\n configuredEnabled?: boolean;\n}\n\n/** 启动插件失败的结构化详情。 */\nexport interface StartupPluginErrorDetails {\n /** 产品标识。 */\n pluginId: string;\n /** 能力列表。 */\n capabilities: string[];\n /** 当前状态。 */\n state: PluginStateKind;\n /** 最近错误。 */\n error?: string;\n}\n","// 权限租约的最终边界验证器。\n//\n// Context 中的 permissions 只用于限制误用;RPC handler、最终存储写入或\n// 签名提交处必须调用这里,不能信任请求体自带的 pluginId / owner / 世代。\n\nimport type {\n PermissionLease,\n PluginPermission,\n} from \"../contracts/lifecycle.js\";\n\nexport interface VerifyPermissionLeaseOptions {\n /** 已由受信装配层创建的租约。 */\n lease: PermissionLease;\n /** 本次实际操作所需的最小权限。 */\n permission: PluginPermission;\n /** 从端口 / 当前会话权威取得的绑定值。 */\n binding?: Parameters<PermissionLease[\"assertBinding\"]>[0];\n}\n/** 在最终 RPC / I/O 边界执行一次 fail-closed 校验。 */\nexport function verifyPermissionLease(options: VerifyPermissionLeaseOptions): void {\n options.lease.assert(options.permission);\n if (options.binding) options.lease.assertBinding(options.binding);\n}\n","// 把已有 Registry 绑定到插件实例作用域。\n//\n// 该 facade 不改变 Registry 的业务类型,只在注册方法周围登记所有权:\n// 资源创建成功后立刻绑定 instance scope,停止时按 after-teardown 阶段\n// 注销。setup 前后 snapshot 仍保留作旧插件兼容兜底,但新注册不依赖它。\n\nimport type { LifecycleScope } from \"../contracts/lifecycle.js\";\n\nexport interface ScopedRegistryRegistration {\n /** 注册方法名,例如 register / registerFeature。 */\n method: string;\n /** 从参数哪个位置读取带 id 的定义。 */\n idArgument?: number;\n /** 没有返回取消函数时使用的注销方法。 */\n unregisterMethod?: string;\n /** 注销方法的参数位置;默认使用 idArgument。 */\n unregisterArgument?: number;\n /** 含 ownerPluginId 参数的注册方法;由 Host 绑定当前插件身份。 */\n bindPluginIdArgument?: number;\n /** 定义对象中的 ownerPluginId 字段;存在时必须与当前插件一致。 */\n ownerPluginIdProperty?: string;\n}\n\nexport interface CreateScopedRegistryFacadeOptions {\n /** 日志和作用域资源中显示的注册表名。 */\n name: string;\n /** 注册方法规则;缺省只包装 register(item)。 */\n registrations?: readonly ScopedRegistryRegistration[];\n}\n\ntype AnyFunction = (...args: any[]) => any;\ntype RegistryTarget = Record<PropertyKey, any>;\n\nfunction definitionId(value: unknown): string | undefined {\n if (!value || typeof value !== \"object\") return undefined;\n const id = (value as { id?: unknown }).id;\n return typeof id === \"string\" && id.length > 0 ? id : undefined;\n}\n\nfunction defaultRegistrationRules(): ScopedRegistryRegistration[] {\n return [{ method: \"register\", idArgument: 0, unregisterMethod: \"unregister\" }];\n}\n\n/** 创建一个只对当前插件实例开放的 Registry 视图。 */\nexport function createScopedRegistryFacade<T extends object>(\n target: T,\n scope: LifecycleScope,\n options: CreateScopedRegistryFacadeOptions\n): T {\n const rules = options.registrations ?? defaultRegistrationRules();\n const byMethod = new Map(rules.map((rule) => [rule.method, rule]));\n const unregisterMethods = new Set(\n rules.map((rule) => rule.unregisterMethod).filter((method): method is string => Boolean(method))\n );\n interface OwnedRegistration {\n id?: string;\n unregisterMethod?: string;\n active: boolean;\n /** revoke 时同步失效的入口;异步 dispose 只作为兜底。 */\n revokeNow: (reason: string) => void;\n /** revoke 已触发但尚未完成的底层注销;dispose 需要等待它。 */\n revokedCleanup?: Promise<void>;\n removeScopeCleanup: () => void;\n }\n const ownedRegistrations = new Set<OwnedRegistration>();\n const objectTarget = target as RegistryTarget;\n\n const remember = (\n rule: ScopedRegistryRegistration,\n id: string | undefined,\n result: unknown,\n args: unknown[]\n ): unknown => {\n const unregisterMethod = rule.unregisterMethod;\n if (typeof result !== \"function\" && (!unregisterMethod || id === undefined)) return result;\n const key = rule.method + \":\" + (id ?? \"returned\");\n let active = true;\n let removeScopeRevoke: () => void = () => undefined;\n let removeScopeCleanup: () => void = () => undefined;\n const entry = {} as OwnedRegistration;\n const clearOwnership = (removeDispose = true): boolean => {\n if (!active) return false;\n active = false;\n ownedRegistrations.delete(entry);\n removeScopeRevoke();\n if (removeDispose) removeScopeCleanup();\n return true;\n };\n const invokeUnregister = (...offArgs: unknown[]): unknown => {\n if (typeof result === \"function\") {\n return (result as AnyFunction).apply(target, offArgs);\n }\n const unregister = objectTarget[unregisterMethod!];\n if (typeof unregister !== \"function\") return undefined;\n const unregisterArgument = rule.unregisterArgument ?? rule.idArgument ?? 0;\n const unregisterArgs = [...args];\n unregisterArgs[unregisterArgument] = id;\n return unregister.apply(target, unregisterArgs);\n };\n const cleanup = async (_reason: string): Promise<void> => {\n if (!active) {\n if (entry.revokedCleanup) await entry.revokedCleanup;\n return;\n }\n if (!clearOwnership()) return;\n await invokeUnregister();\n };\n const revokeNow = (_reason: string): void => {\n if (!clearOwnership(false)) return;\n try {\n const pending = invokeUnregister();\n if (pending && typeof (pending as PromiseLike<unknown>).then === \"function\") {\n const revokedCleanup = Promise.resolve(pending).then(() => undefined);\n entry.revokedCleanup = revokedCleanup;\n revokedCleanup.catch(() => undefined);\n }\n } catch (error) {\n // revoke 必须继续同步撤权;把同步失败留给 dispose 的结果,不能\n // 重新暴露旧注册项,也不能让失败 Promise 变成未处理异常。\n entry.revokedCleanup = Promise.reject(error);\n entry.revokedCleanup.catch(() => undefined);\n }\n };\n entry.id = id;\n entry.unregisterMethod = unregisterMethod;\n entry.revokeNow = revokeNow;\n Object.defineProperty(entry, \"active\", {\n enumerable: true,\n configurable: false,\n get: () => active,\n set: (value: boolean) => { active = value; },\n });\n entry.removeScopeCleanup = removeScopeCleanup;\n ownedRegistrations.add(entry);\n removeScopeCleanup = scope.onDispose(\n cleanup,\n options.name + \":\" + key,\n \"after-teardown\"\n );\n entry.removeScopeCleanup = removeScopeCleanup;\n removeScopeRevoke = scope.onRevoke(revokeNow);\n\n if (typeof result === \"function\") {\n return (...offArgs: unknown[]) => {\n if (!clearOwnership()) return undefined;\n return (result as AnyFunction).apply(target, offArgs);\n };\n }\n return result;\n };\n\n return new Proxy(target, {\n get(current, property, receiver) {\n const value = Reflect.get(current, property, receiver);\n if (typeof value !== \"function\") return value;\n const rule = typeof property === \"string\" ? byMethod.get(property) : undefined;\n if (rule) {\n return (...args: unknown[]) => {\n scope.assertActive();\n const callArgs = [...args];\n if (rule.bindPluginIdArgument !== undefined && scope.identity.pluginId) {\n const claimedPluginId = callArgs[rule.bindPluginIdArgument];\n if (claimedPluginId !== undefined && claimedPluginId !== scope.identity.pluginId) {\n throw new Error(\n \"Registry owner \\\"\" + String(claimedPluginId) +\n \"\\\" does not match plugin instance \\\"\" + scope.identity.pluginId + \"\\\"\"\n );\n }\n callArgs[rule.bindPluginIdArgument] = scope.identity.pluginId;\n }\n if (rule.ownerPluginIdProperty && scope.identity.pluginId) {\n const definition = callArgs[rule.idArgument ?? 0];\n if (definition && typeof definition === \"object\") {\n const claimedPluginId = (definition as Record<string, unknown>)[rule.ownerPluginIdProperty];\n if (claimedPluginId !== undefined && claimedPluginId !== scope.identity.pluginId) {\n throw new Error(\n \"Registry owner \\\"\" + String(claimedPluginId) +\n \"\\\" does not match plugin instance \\\"\" + scope.identity.pluginId + \"\\\"\"\n );\n }\n }\n }\n const result = (value as AnyFunction).apply(target, callArgs);\n const id = rule.idArgument === undefined ? undefined : definitionId(callArgs[rule.idArgument]);\n return remember(rule, id, result, callArgs);\n };\n }\n // 插件主动注销只能操作自己在本作用域登记过的 id;例如\n // protected-outpoint 的 unregisterByOwner 属于领域批量操作,不在这里\n // 冒充单条资源注销,仍由领域接口自己做 owner 校验。\n if (typeof property === \"string\" && unregisterMethods.has(property)) {\n return (...args: unknown[]) => {\n scope.assertActive();\n const id = definitionId(args[0]) ?? (typeof args[0] === \"string\" ? args[0] : undefined);\n const owned = [...ownedRegistrations].find((entry) =>\n entry.active && entry.id === id && entry.unregisterMethod === property\n );\n if (!owned) {\n throw new Error(\n \"Registry resource \\\"\" + (id ?? \"unknown\") + \"\\\" is not owned by this plugin instance\"\n );\n }\n const result = (value as AnyFunction).apply(target, args);\n owned.active = false;\n ownedRegistrations.delete(owned);\n owned.removeScopeCleanup();\n return result;\n };\n }\n return (value as AnyFunction).bind(target);\n },\n }) as T;\n}\n","// Worker / 页面升级接管门禁。\n//\n// 这是一个本地写入栅栏,不是 leader 选举器,也不是跨 Worker 调度器:\n// - handshake 只校验协议、构建、接管世代和精确契约版本;\n// - active 期间才发放新的 I/O 租约;\n// - beginDrain 同步关闭新入口,已有 I/O 可以继续排空;\n// - drain 超时返回未排空,调用方不能据此开放下一代写入。\n//\n// 真正的存储 / 签名服务仍必须在最终边界重复校验 authorityInstanceId 和\n// handoverGeneration。这个模块只能提供可复用的接管语义,不能替代服务端校验。\n\nimport type {\n CreateUpgradeGateOptions,\n UpgradeDrainResult,\n UpgradeGate,\n UpgradeGateState,\n UpgradeHandshake,\n UpgradeHandshakeResult,\n UpgradeIoLease,\n UpgradeSession,\n} from \"../contracts/lifecycle.js\";\nimport { UpgradeGateRejectedError } from \"../contracts/lifecycle.js\";\n\ninterface LeaseRecord {\n session: SessionRecord;\n operation: \"read\" | \"write\";\n controller: AbortController;\n revoked: boolean;\n reason: string;\n removeExternalAbort?: () => void;\n}\n\ninterface SessionRecord {\n sessionId: string;\n connectionId: string;\n contractVersion: string;\n controller: AbortController;\n revoked: boolean;\n reason: string;\n leases: Set<LeaseRecord>;\n session?: UpgradeSession;\n}\n\nfunction validGeneration(value: number): boolean {\n return Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n return [...new Set(values.filter((value) => typeof value === \"string\" && value.length > 0))];\n}\n\nfunction makeSessionId(): string {\n try {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return `upgrade-session:${crypto.randomUUID()}`;\n }\n } catch {\n // 会话标识用于防止误绑定;真正的授权仍由握手和最终边界校验。\n }\n return `upgrade-session:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`;\n}\n\nfunction buildIsCompatible(options: CreateUpgradeGateOptions, buildId: string): boolean {\n try {\n if (options.isBuildCompatible) return options.isBuildCompatible(buildId);\n } catch {\n return false;\n }\n return buildId === options.buildId || options.compatibleBuildIds?.has(buildId) === true;\n}\n\n/** 创建一个绑定当前构建和接管世代的升级门禁。 */\nexport function createUpgradeGate(options: CreateUpgradeGateOptions): UpgradeGate {\n if (!options.protocolVersion || !options.buildId || !options.authorityInstanceId) {\n throw new Error(\"升级门禁的 protocolVersion、buildId 和 authorityInstanceId 必须有效\");\n }\n if (!validGeneration(options.handoverGeneration)) {\n throw new Error(\"升级门禁的 handoverGeneration 必须是非负安全整数\");\n }\n const contractVersions = uniqueStrings(options.supportedContractVersions);\n if (contractVersions.length === 0) {\n throw new Error(\"升级门禁至少需要一个 supportedContractVersions\");\n }\n\n let currentState: UpgradeGateState = \"active\";\n let closeReason = \"upgrade gate closed\";\n const leases = new Set<LeaseRecord>();\n const sessions = new Set<SessionRecord>();\n const sessionByObject = new WeakMap<UpgradeSession, SessionRecord>();\n const emptyWaiters = new Set<() => void>();\n\n const notifyEmpty = () => {\n if (leases.size !== 0) return;\n for (const resolve of [...emptyWaiters]) {\n emptyWaiters.delete(resolve);\n resolve();\n }\n };\n\n const removeLease = (record: LeaseRecord) => {\n if (!leases.delete(record)) return;\n record.session.leases.delete(record);\n record.removeExternalAbort?.();\n record.removeExternalAbort = undefined;\n notifyEmpty();\n };\n\n const revokeSession = (record: SessionRecord, reason: string) => {\n if (record.revoked) return;\n record.revoked = true;\n record.reason = reason;\n try {\n record.controller.abort(new UpgradeGateRejectedError(reason));\n } catch {\n record.controller.abort();\n }\n for (const lease of [...record.leases]) revokeLease(lease, reason);\n sessions.delete(record);\n };\n\n const revokeLease = (record: LeaseRecord, reason: string) => {\n if (record.revoked) return;\n record.revoked = true;\n record.reason = reason;\n try {\n record.controller.abort(new UpgradeGateRejectedError(reason));\n } catch {\n record.controller.abort();\n }\n removeLease(record);\n };\n\n const assertAccepting = () => {\n if (currentState === \"active\") return;\n throw new UpgradeGateRejectedError(currentState === \"draining\" ? \"draining\" : \"closed\", closeReason);\n };\n\n const handshake = (input: UpgradeHandshake): UpgradeHandshakeResult => {\n if (currentState !== \"active\") {\n return { accepted: false, reason: currentState === \"draining\" ? \"draining\" : \"closed\" };\n }\n if (\n typeof input.connectionId !== \"string\"\n || input.connectionId.length === 0\n || input.protocolVersion !== options.protocolVersion\n || typeof input.protocolVersion !== \"string\"\n || typeof input.buildId !== \"string\"\n || typeof input.authorityInstanceId !== \"string\"\n || input.authorityInstanceId.length === 0\n ) {\n return { accepted: false, reason: \"protocol-mismatch\" };\n }\n if (!buildIsCompatible(options, input.buildId)) {\n return { accepted: false, reason: \"build-incompatible\" };\n }\n if (!validGeneration(input.handoverGeneration)) {\n return { accepted: false, reason: \"stale-generation\" };\n }\n if (input.handoverGeneration < options.handoverGeneration) {\n return { accepted: false, reason: \"stale-generation\" };\n }\n if (input.handoverGeneration > options.handoverGeneration) {\n return { accepted: false, reason: \"future-generation\" };\n }\n const contractVersion = contractVersions.find((version) => input.supportedContractVersions.includes(version));\n if (!contractVersion) return { accepted: false, reason: \"contract-mismatch\" };\n const sessionRecord: SessionRecord = {\n sessionId: makeSessionId(),\n connectionId: input.connectionId,\n contractVersion,\n controller: new AbortController(),\n revoked: false,\n reason: \"upgrade session closed\",\n leases: new Set(),\n };\n const session: UpgradeSession = {\n connectionId: sessionRecord.connectionId,\n sessionId: sessionRecord.sessionId,\n authorityInstanceId: options.authorityInstanceId,\n handoverGeneration: options.handoverGeneration,\n contractVersion,\n get revoked() {\n return sessionRecord.revoked || !sessions.has(sessionRecord);\n },\n signal: sessionRecord.controller.signal,\n assertActive() {\n if (sessionRecord.revoked || !sessions.has(sessionRecord)) {\n throw new UpgradeGateRejectedError(sessionRecord.reason, \"升级握手会话已失效\");\n }\n if (currentState === \"closed\") {\n throw new UpgradeGateRejectedError(\"closed\", closeReason);\n }\n },\n admit(input) {\n return admitForSession(sessionRecord, input);\n },\n close(reason = \"upgrade session closed\") {\n revokeSession(sessionRecord, reason);\n },\n };\n sessionRecord.session = session;\n sessions.add(sessionRecord);\n sessionByObject.set(session, sessionRecord);\n return {\n accepted: true,\n mode: options.mode ?? \"cold-switch\",\n handoverGeneration: options.handoverGeneration,\n contractVersion,\n connectionId: sessionRecord.connectionId,\n sessionId: sessionRecord.sessionId,\n session,\n };\n };\n\n const admitForSession = (\n sessionRecord: SessionRecord,\n input: { operation: \"read\" | \"write\"; signal?: AbortSignal }\n ): UpgradeIoLease => {\n if (sessionRecord.revoked || !sessions.has(sessionRecord)) {\n throw new UpgradeGateRejectedError(sessionRecord.reason, \"升级握手会话已失效\");\n }\n assertAccepting();\n if (input.signal?.aborted) {\n throw new UpgradeGateRejectedError(\"caller-aborted\", \"I/O 在取得接管租约前已取消\");\n }\n\n const record: LeaseRecord = {\n session: sessionRecord,\n operation: input.operation,\n controller: new AbortController(),\n revoked: false,\n reason: \"upgrade I/O lease released\",\n };\n leases.add(record);\n sessionRecord.leases.add(record);\n if (input.signal) {\n const onAbort = () => revokeLease(record, \"caller-aborted\");\n input.signal.addEventListener(\"abort\", onAbort, { once: true });\n record.removeExternalAbort = () => input.signal?.removeEventListener(\"abort\", onAbort);\n }\n\n const lease: UpgradeIoLease = {\n connectionId: sessionRecord.connectionId,\n sessionId: sessionRecord.sessionId,\n authorityInstanceId: options.authorityInstanceId,\n handoverGeneration: options.handoverGeneration,\n contractVersion: sessionRecord.contractVersion,\n operation: record.operation,\n get revoked() {\n return record.revoked || !leases.has(record);\n },\n signal: record.controller.signal,\n assertActive() {\n if (record.revoked || !leases.has(record)) {\n throw new UpgradeGateRejectedError(record.reason, \"升级 I/O 租约已失效\");\n }\n // beginDrain 不撤销已发租约;它只阻止新 I/O,给已提交操作一个排空窗口。\n if (currentState === \"closed\") {\n throw new UpgradeGateRejectedError(\"closed\", closeReason);\n }\n },\n release() {\n if (record.revoked) return;\n record.revoked = true;\n record.reason = \"upgrade I/O lease released\";\n removeLease(record);\n },\n };\n return lease;\n };\n\n const admit = (input: Parameters<UpgradeGate[\"admit\"]>[0]): UpgradeIoLease => {\n const sessionRecord = sessionByObject.get(input.session);\n if (!sessionRecord) {\n throw new UpgradeGateRejectedError(\"invalid-session\", \"I/O 必须使用当前门禁握手返回的会话\");\n }\n return admitForSession(sessionRecord, input);\n };\n\n const beginDrain = (reason = \"upgrade handover draining\") => {\n if (currentState !== \"active\") return;\n closeReason = reason;\n currentState = \"draining\";\n };\n\n const drain = async (timeoutMs?: number): Promise<UpgradeDrainResult> => {\n beginDrain();\n if (leases.size === 0) return { state: currentState, drained: true, pending: 0 };\n if (timeoutMs !== undefined && (!Number.isFinite(timeoutMs) || timeoutMs < 0)) {\n throw new Error(\"升级排空 timeoutMs 必须是非负有限数\");\n }\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let timerResolve: (() => void) | undefined;\n const empty = new Promise<void>((resolve) => {\n emptyWaiters.add(resolve);\n timerResolve = resolve;\n });\n const timeoutPromise = timeoutMs === undefined\n ? undefined\n : new Promise<void>((resolve) => {\n timeout = setTimeout(resolve, timeoutMs);\n });\n if (timeoutPromise) await Promise.race([empty, timeoutPromise]);\n else await empty;\n if (timeout !== undefined) clearTimeout(timeout);\n if (timerResolve) emptyWaiters.delete(timerResolve);\n const pending = leases.size;\n return { state: currentState, drained: pending === 0, pending };\n };\n\n const close = (reason = \"upgrade gate closed\") => {\n if (currentState === \"closed\") return;\n closeReason = reason;\n currentState = \"closed\";\n for (const session of [...sessions]) revokeSession(session, reason);\n for (const lease of [...leases]) revokeLease(lease, reason);\n notifyEmpty();\n };\n\n return {\n get state() { return currentState; },\n mode: options.mode ?? \"cold-switch\",\n authorityInstanceId: options.authorityInstanceId,\n handoverGeneration: options.handoverGeneration,\n handshake,\n assertAccepting,\n admit,\n beginDrain,\n drain,\n close,\n activeIo: () => leases.size,\n };\n}\n","// 基于 MessagePort 的服务提供端点。\n//\n// 该模块是 Coordinator/Provider 侧的物理端点:它发送握手和服务目录,\n// 接收代理调用,并把取消信号传给实际 handler。它不决定谁有权限使用\n// 服务;handler 必须在这里之后继续做引用、授权、owner 和世代校验。\n\nimport type {\n RemoteServiceHandshake,\n RemoteServiceMessageCodec,\n RemoteServicePortControlMessage,\n RemoteServiceSnapshot,\n} from \"../contracts/lifecycle.js\";\nimport { createRemoteServiceMessageCodec } from \"../contracts/lifecycle.js\";\nimport type {\n RemoteServicePortCallMessage,\n RemoteServicePortCancelMessage,\n RemoteServicePortErrorMessage,\n RemoteServicePortResultMessage,\n} from \"./messagePortServiceTransport.js\";\n\nexport interface MessagePortServiceCallInput {\n /** 传输层生成的调用包;业务 handler 不得把 callId 当业务幂等键。 */\n message: RemoteServicePortCallMessage;\n /** 调用方撤销或端点失效时自动终止的信号。 */\n signal: AbortSignal;\n}\n\nexport interface CreateMessagePortServiceProviderOptions {\n /** 与页面服务桥配对的专用双工端口。 */\n port: MessagePort;\n /** 本端产生的握手身份。 */\n handshake: RemoteServiceHandshake;\n /** 初始必须是完整基线快照。 */\n snapshot: RemoteServiceSnapshot;\n /** 具体服务分派;这里不自动重放调用。 */\n handleCall(input: MessagePortServiceCallInput): Promise<unknown>;\n /** dispose 时是否关闭本端端口;默认关闭。 */\n closeOnDispose?: boolean;\n /** wire 消息 codec;默认使用 webloom.remote-service.*。 */\n codec?: RemoteServiceMessageCodec;\n}\n\nexport interface MessagePortServiceProvider {\n /** 发布同一连接上的下一份连续目录快照。 */\n publishSnapshot(snapshot: RemoteServiceSnapshot): void;\n /** 同步通知消费者撤销当前代理;调用仍由 handler 自己做最终校验。 */\n invalidate(reason?: string): void;\n /** 发送断线控制消息并关闭端点。 */\n disconnect(reason?: string): void;\n /** 撤销未决调用、移除监听器并释放端口。 */\n dispose(): void;\n}\n\nfunction isCallMessage(input: unknown, codec: RemoteServiceMessageCodec): input is RemoteServicePortCallMessage {\n if (!input || typeof input !== \"object\") return false;\n const message = input as Partial<RemoteServicePortCallMessage>;\n return message.type === codec.type(\"call\")\n && typeof message.callId === \"string\"\n && message.callId.length > 0\n && typeof message.connectionId === \"string\"\n && typeof message.providerInstanceId === \"string\"\n && Boolean(message.reference);\n}\n\nfunction isCancelMessage(input: unknown, codec: RemoteServiceMessageCodec): input is RemoteServicePortCancelMessage {\n if (!input || typeof input !== \"object\") return false;\n const message = input as Partial<RemoteServicePortCancelMessage>;\n return message.type === codec.type(\"cancel\")\n && typeof message.callId === \"string\"\n && typeof message.connectionId === \"string\"\n && typeof message.providerInstanceId === \"string\";\n}\n\nfunction errorMessage(error: unknown): RemoteServicePortErrorMessage[\"error\"] {\n const candidate = error && typeof error === \"object\" ? error as { name?: unknown; message?: unknown; code?: unknown } : undefined;\n return {\n ...(typeof candidate?.name === \"string\" ? { name: candidate.name } : {}),\n message: typeof candidate?.message === \"string\" ? candidate.message : String(error),\n ...(typeof candidate?.code === \"string\" ? { code: candidate.code } : {}),\n };\n}\n\nfunction post(port: MessagePort, message: unknown): void {\n try {\n port.postMessage(message);\n } catch {\n // 端口断开后调用方会通过连接状态和超时收敛;不能用异常打断 Worker。\n }\n}\n\n/** 创建一个只服务于一条实际 MessagePort 连接的 Provider 端点。 */\nexport function createMessagePortServiceProvider(\n options: CreateMessagePortServiceProviderOptions\n): MessagePortServiceProvider {\n const pending = new Map<string, { controller: AbortController; providerInstanceId: string }>();\n const codec = options.codec ?? createRemoteServiceMessageCodec();\n let activeProviderInstanceIds = new Set(\n options.snapshot.services.map((service) => service.providerInstanceId)\n );\n let disposed = false;\n\n const sendError = (message: RemoteServicePortCallMessage, error: unknown): void => {\n const response: RemoteServicePortErrorMessage = {\n type: codec.type(\"error\"),\n callId: message.callId,\n connectionId: message.connectionId,\n providerInstanceId: message.providerInstanceId,\n error: errorMessage(error),\n };\n post(options.port, codec.encode(response as unknown as Record<string, unknown>));\n };\n\n const onMessage = (event: MessageEvent): void => {\n if (disposed) return;\n const decoded = codec.decode(event.data);\n if (isCancelMessage(decoded, codec)) {\n if (decoded.connectionId !== options.handshake.connectionId) return;\n const call = pending.get(decoded.callId);\n if (call?.providerInstanceId === decoded.providerInstanceId) {\n call.controller.abort(new Error(\"Remote service request cancelled\"));\n }\n return;\n }\n if (!isCallMessage(decoded, codec)) return;\n const message = decoded;\n if (message.connectionId !== options.handshake.connectionId) {\n sendError(message, Object.assign(new Error(\"Remote service connection mismatch\"), { code: \"service.connection_mismatch\" }));\n return;\n }\n // providerInstanceId 由服务引用绑定。不同 Provider 的调用不能共用一条端点。\n if (!activeProviderInstanceIds.has(message.providerInstanceId)) {\n sendError(message, Object.assign(new Error(\"Remote service provider mismatch\"), { code: \"service.provider_mismatch\" }));\n return;\n }\n if (pending.has(message.callId)) {\n sendError(message, Object.assign(new Error(\"Remote service callId is duplicated\"), { code: \"service.duplicate_call\" }));\n return;\n }\n\n const controller = new AbortController();\n pending.set(message.callId, { controller, providerInstanceId: message.providerInstanceId });\n void (async () => {\n try {\n const result = await options.handleCall({ message, signal: controller.signal });\n if (controller.signal.aborted || disposed) return;\n const response: RemoteServicePortResultMessage = {\n type: codec.type(\"result\"),\n callId: message.callId,\n connectionId: message.connectionId,\n providerInstanceId: message.providerInstanceId,\n result,\n };\n post(options.port, codec.encode(response as unknown as Record<string, unknown>));\n } catch (error) {\n if (disposed) return;\n sendError(message, error);\n } finally {\n pending.delete(message.callId);\n }\n })();\n };\n\n options.port.addEventListener(\"message\", onMessage);\n options.port.start();\n post(options.port, codec.encode({\n type: codec.type(\"handshake\"),\n handshake: options.handshake,\n } satisfies RemoteServicePortControlMessage));\n post(options.port, codec.encode({\n type: codec.type(\"snapshot\"),\n snapshot: options.snapshot,\n } satisfies RemoteServicePortControlMessage));\n\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n options.port.removeEventListener(\"message\", onMessage);\n for (const { controller } of pending.values()) controller.abort(new Error(\"Remote service provider disposed\"));\n pending.clear();\n if (options.closeOnDispose !== false) options.port.close();\n };\n\n const provider: MessagePortServiceProvider = {\n publishSnapshot(snapshot) {\n if (disposed) return;\n activeProviderInstanceIds = new Set(\n snapshot.services.map((service) => service.providerInstanceId)\n );\n post(options.port, codec.encode({\n type: codec.type(\"snapshot\"),\n snapshot,\n } satisfies RemoteServicePortControlMessage));\n },\n invalidate(reason = \"Remote service invalidated\") {\n if (disposed) return;\n // 撤销是同步调用边界:在下一份快照到达前,旧 Provider 实例不能再\n // 接受新请求。否则消费者虽已撤下代理,恶意/迟到的旧报文仍可能\n // 进入 handler;publishSnapshot() 重新建立当前实例后才恢复接收。\n activeProviderInstanceIds = new Set();\n for (const { controller } of pending.values()) controller.abort(new Error(reason));\n post(options.port, codec.encode({\n type: codec.type(\"invalidate\"),\n reason,\n } satisfies RemoteServicePortControlMessage));\n },\n disconnect(reason = \"Remote service disconnected\") {\n if (disposed) return;\n post(options.port, codec.encode({\n type: codec.type(\"disconnect\"),\n reason,\n } satisfies RemoteServicePortControlMessage));\n dispose();\n },\n dispose,\n };\n return provider;\n}\n"]}
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
|
+
import { a0 as PluginHost, ac as PluginState, b as PluginGraph, d as PluginReverseDep, a6 as PluginIntentSubmissionResult, a as PluginManifest, aD as ResourceStoreApi, aB as ResourceSnapshot } from './createPluginHost-CcW9sPNs.js';
|
|
5
|
+
|
|
6
|
+
declare const PluginHostContext: react.Context<PluginHost | undefined>;
|
|
7
|
+
interface PluginHostProviderProps {
|
|
8
|
+
host: PluginHost;
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
}
|
|
11
|
+
declare function PluginHostProvider({ host, children }: PluginHostProviderProps): react_jsx_runtime.JSX.Element;
|
|
12
|
+
declare function usePluginHost(): PluginHost;
|
|
13
|
+
/**
|
|
14
|
+
* 订阅 host.version:host 每次 enable / disable / unregister 后 version 递增,
|
|
15
|
+
* 订阅组件会重新渲染。这是"硬切换 001"让 React 层感知 host 变化的关键 hook。
|
|
16
|
+
*/
|
|
17
|
+
declare function useHostVersion(): number;
|
|
18
|
+
|
|
19
|
+
declare function useCapability<T>(key: string): T;
|
|
20
|
+
/** 读取可选兼容 capability;缺失时返回 undefined,不把页面渲染打崩。 */
|
|
21
|
+
declare function useOptionalCapability<T>(key: string): T | undefined;
|
|
22
|
+
declare function useHasCapability(key: string): boolean;
|
|
23
|
+
|
|
24
|
+
declare function useRegistry<T>(selector: (host: PluginHost) => T): T;
|
|
25
|
+
|
|
26
|
+
interface UsePluginRuntime {
|
|
27
|
+
state(id: string): PluginState;
|
|
28
|
+
graph(): PluginGraph;
|
|
29
|
+
reverseDeps(id: string): PluginReverseDep[];
|
|
30
|
+
enable(id: string): Promise<void>;
|
|
31
|
+
disable(id: string): Promise<{
|
|
32
|
+
ok: true;
|
|
33
|
+
} | {
|
|
34
|
+
ok: false;
|
|
35
|
+
reason: string;
|
|
36
|
+
}>;
|
|
37
|
+
/** 提交产品级绝对启停意图;accepted 只表示意图已持久化。 */
|
|
38
|
+
submitIntent(id: string, desiredEnabled: boolean): Promise<PluginIntentSubmissionResult>;
|
|
39
|
+
unregister(id: string): Promise<void>;
|
|
40
|
+
version(): number;
|
|
41
|
+
manifests(): string[];
|
|
42
|
+
installed(): string[];
|
|
43
|
+
isEnabled(id: string): boolean;
|
|
44
|
+
/** 拿单条 plugin 的 manifest。id 未知时返回 undefined。 */
|
|
45
|
+
getManifest(id: string): PluginManifest | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* 探测 capability 是否存在。供 UI 判断"依赖的 capability 是否满足",
|
|
48
|
+
* 依赖列表里写的是 capability key(如 "route.registry"),不是 plugin id。
|
|
49
|
+
*/
|
|
50
|
+
hasCapability(key: string): boolean;
|
|
51
|
+
}
|
|
52
|
+
declare function usePluginRuntime(): UsePluginRuntime;
|
|
53
|
+
/** 旧调用方兼容:单纯拿 host 引用。 */
|
|
54
|
+
declare function useHost(): PluginHost;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* useResource React Hook
|
|
58
|
+
*
|
|
59
|
+
* 设计缘由:负责 ensure + useSyncExternalStore 订阅并返回完整 snapshot。
|
|
60
|
+
* 不暴露 store 内部可变对象。
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
/** useResource hook:返回完整资源快照 */
|
|
64
|
+
declare function useResource<T>(store: ResourceStoreApi, definitionId: string, args: readonly string[]): ResourceSnapshot<T>;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* useResourceSelector React Hook
|
|
68
|
+
*
|
|
69
|
+
* 设计缘由:只在 selector 结果发生语义变化时重渲染。
|
|
70
|
+
* selector 和 equality 必须为纯函数。
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
/** useResourceSelector hook:只在 selector 结果变化时重渲染 */
|
|
74
|
+
declare function useResourceSelector<T, TSelected>(store: ResourceStoreApi, definitionId: string, args: readonly string[], selector: (snapshot: ResourceSnapshot<T>) => TSelected, equality?: (a: TSelected, b: TSelected) => boolean): TSelected;
|
|
75
|
+
|
|
76
|
+
declare function countRender(name: string): void;
|
|
77
|
+
declare function getRenderCount(name: string): number;
|
|
78
|
+
declare function resetRenderCounters(): void;
|
|
79
|
+
|
|
80
|
+
export { PluginHostContext, PluginHostProvider, type PluginHostProviderProps, type UsePluginRuntime, countRender, getRenderCount, resetRenderCounters, useCapability, useHasCapability, useHost, useHostVersion, useOptionalCapability, usePluginHost, usePluginRuntime, useRegistry, useResource, useResourceSelector };
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { createContext, useState, useEffect, useContext, useMemo, useCallback, useSyncExternalStore, useRef } from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/react/PluginHostProvider.tsx
|
|
5
|
+
var PluginHostContext = createContext(void 0);
|
|
6
|
+
function PluginHostProvider({ host, children }) {
|
|
7
|
+
const [version, setVersion] = useState(host.version());
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
return host.subscribe((snap) => {
|
|
10
|
+
setVersion(snap.version);
|
|
11
|
+
});
|
|
12
|
+
}, [host]);
|
|
13
|
+
return /* @__PURE__ */ jsx(PluginHostContext.Provider, { value: host, children });
|
|
14
|
+
}
|
|
15
|
+
function usePluginHost() {
|
|
16
|
+
const host = useContext(PluginHostContext);
|
|
17
|
+
if (!host) throw new Error("PluginHostContext is missing");
|
|
18
|
+
return host;
|
|
19
|
+
}
|
|
20
|
+
function useHostVersion() {
|
|
21
|
+
const host = usePluginHost();
|
|
22
|
+
const [v, setV] = useState(host.version());
|
|
23
|
+
useEffect(() => host.subscribe((s) => setV(s.version)), [host]);
|
|
24
|
+
return v;
|
|
25
|
+
}
|
|
26
|
+
function useCapability(key) {
|
|
27
|
+
const host = usePluginHost();
|
|
28
|
+
const version = useHostVersion();
|
|
29
|
+
return useMemo(() => host.capabilities.get(key), [host, version, key]);
|
|
30
|
+
}
|
|
31
|
+
function useOptionalCapability(key) {
|
|
32
|
+
const host = usePluginHost();
|
|
33
|
+
const version = useHostVersion();
|
|
34
|
+
return useMemo(() => host.capabilities.has(key) ? host.capabilities.get(key) : void 0, [host, version, key]);
|
|
35
|
+
}
|
|
36
|
+
function useHasCapability(key) {
|
|
37
|
+
const host = usePluginHost();
|
|
38
|
+
const version = useHostVersion();
|
|
39
|
+
return useMemo(() => host.capabilities.has(key), [host, version, key]);
|
|
40
|
+
}
|
|
41
|
+
function useRegistry(selector) {
|
|
42
|
+
const host = usePluginHost();
|
|
43
|
+
const version = useHostVersion();
|
|
44
|
+
return useMemo(() => selector(host), [version, host, selector]);
|
|
45
|
+
}
|
|
46
|
+
function usePluginRuntime() {
|
|
47
|
+
const host = usePluginHost();
|
|
48
|
+
const version = useHostVersion();
|
|
49
|
+
return useMemo(() => {
|
|
50
|
+
const api = {
|
|
51
|
+
state(id) {
|
|
52
|
+
return host.state(id);
|
|
53
|
+
},
|
|
54
|
+
graph() {
|
|
55
|
+
return host.graph();
|
|
56
|
+
},
|
|
57
|
+
reverseDeps(id) {
|
|
58
|
+
return host.reverseDeps(id);
|
|
59
|
+
},
|
|
60
|
+
enable(id) {
|
|
61
|
+
return host.enable(id);
|
|
62
|
+
},
|
|
63
|
+
disable(id) {
|
|
64
|
+
return host.disable(id);
|
|
65
|
+
},
|
|
66
|
+
submitIntent(id, desiredEnabled) {
|
|
67
|
+
return host.submitIntent(id, desiredEnabled);
|
|
68
|
+
},
|
|
69
|
+
unregister(id) {
|
|
70
|
+
return host.unregister(id);
|
|
71
|
+
},
|
|
72
|
+
version() {
|
|
73
|
+
return host.version();
|
|
74
|
+
},
|
|
75
|
+
manifests() {
|
|
76
|
+
return host.manifests();
|
|
77
|
+
},
|
|
78
|
+
installed() {
|
|
79
|
+
return host.installed();
|
|
80
|
+
},
|
|
81
|
+
isEnabled(id) {
|
|
82
|
+
return host.state(id).kind === "enabled";
|
|
83
|
+
},
|
|
84
|
+
getManifest(id) {
|
|
85
|
+
return host.getManifest(id);
|
|
86
|
+
},
|
|
87
|
+
hasCapability(key) {
|
|
88
|
+
return host.capabilities.has(key);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
return api;
|
|
92
|
+
}, [host, version]);
|
|
93
|
+
}
|
|
94
|
+
function useHost() {
|
|
95
|
+
return usePluginHost();
|
|
96
|
+
}
|
|
97
|
+
function useResource(store, definitionId, args) {
|
|
98
|
+
const subscribe = useCallback((callback) => {
|
|
99
|
+
return store.subscribe(definitionId, args, callback);
|
|
100
|
+
}, [store, definitionId, ...args]);
|
|
101
|
+
const getSnapshot = useCallback(() => {
|
|
102
|
+
return store.ensure(definitionId, args);
|
|
103
|
+
}, [store, definitionId, ...args]);
|
|
104
|
+
const getServerSnapshot = useCallback(() => {
|
|
105
|
+
return {
|
|
106
|
+
key: [definitionId, ...args],
|
|
107
|
+
status: "pending",
|
|
108
|
+
data: void 0,
|
|
109
|
+
revision: 0
|
|
110
|
+
};
|
|
111
|
+
}, [definitionId, ...args]);
|
|
112
|
+
return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
|
113
|
+
}
|
|
114
|
+
function defaultEquality(a, b) {
|
|
115
|
+
return Object.is(a, b);
|
|
116
|
+
}
|
|
117
|
+
function useResourceSelector(store, definitionId, args, selector, equality = defaultEquality) {
|
|
118
|
+
const selectedRef = useRef();
|
|
119
|
+
const hasSelectedRef = useRef(false);
|
|
120
|
+
const sourceSnapshotRef = useRef();
|
|
121
|
+
const selectorRef = useRef(selector);
|
|
122
|
+
const equalityRef = useRef(equality);
|
|
123
|
+
selectorRef.current = selector;
|
|
124
|
+
equalityRef.current = equality;
|
|
125
|
+
const subscribe = useCallback(
|
|
126
|
+
(callback) => {
|
|
127
|
+
return store.subscribe(definitionId, args, callback);
|
|
128
|
+
},
|
|
129
|
+
[store, definitionId, ...args]
|
|
130
|
+
);
|
|
131
|
+
const getSnapshot = useCallback(() => {
|
|
132
|
+
const snapshot = store.ensure(definitionId, args);
|
|
133
|
+
if (hasSelectedRef.current && sourceSnapshotRef.current === snapshot) {
|
|
134
|
+
return selectedRef.current;
|
|
135
|
+
}
|
|
136
|
+
const selected = selectorRef.current(snapshot);
|
|
137
|
+
if (hasSelectedRef.current && equalityRef.current(selectedRef.current, selected)) {
|
|
138
|
+
sourceSnapshotRef.current = snapshot;
|
|
139
|
+
return selectedRef.current;
|
|
140
|
+
}
|
|
141
|
+
selectedRef.current = selected;
|
|
142
|
+
hasSelectedRef.current = true;
|
|
143
|
+
sourceSnapshotRef.current = snapshot;
|
|
144
|
+
return selected;
|
|
145
|
+
}, [store, definitionId, ...args]);
|
|
146
|
+
const getServerSnapshot = useCallback(() => {
|
|
147
|
+
const snapshot = {
|
|
148
|
+
key: [definitionId, ...args],
|
|
149
|
+
status: "pending",
|
|
150
|
+
data: void 0,
|
|
151
|
+
revision: 0
|
|
152
|
+
};
|
|
153
|
+
return selectorRef.current(snapshot);
|
|
154
|
+
}, [definitionId, ...args]);
|
|
155
|
+
return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// src/react/renderCounter.ts
|
|
159
|
+
var counters = /* @__PURE__ */ new Map();
|
|
160
|
+
function enabled() {
|
|
161
|
+
const env = import.meta.env;
|
|
162
|
+
return env?.DEV !== false;
|
|
163
|
+
}
|
|
164
|
+
function countRender(name) {
|
|
165
|
+
if (!enabled()) return;
|
|
166
|
+
counters.set(name, (counters.get(name) ?? 0) + 1);
|
|
167
|
+
}
|
|
168
|
+
function getRenderCount(name) {
|
|
169
|
+
return counters.get(name) ?? 0;
|
|
170
|
+
}
|
|
171
|
+
function resetRenderCounters() {
|
|
172
|
+
counters.clear();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export { PluginHostContext, PluginHostProvider, countRender, getRenderCount, resetRenderCounters, useCapability, useHasCapability, useHost, useHostVersion, useOptionalCapability, usePluginHost, usePluginRuntime, useRegistry, useResource, useResourceSelector };
|
|
176
|
+
//# sourceMappingURL=react.js.map
|
|
177
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/PluginHostProvider.tsx","../src/react/useCapability.ts","../src/react/useRegistry.ts","../src/react/usePluginRuntime.ts","../src/react/useResource.ts","../src/react/useResourceSelector.ts","../src/react/renderCounter.ts"],"names":["useMemo","useCallback","useSyncExternalStore"],"mappings":"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","file":"react.js","sourcesContent":["// packages/runtime/src/react/PluginHostProvider.tsx\n// 把 PluginHost 注入 React 树。\n// 设计缘由:组件层只通过 hooks 访问能力,不要直接 import 内部模块。\n// 硬切换 001:host 进入运行期可卸载,host.version 变化要触发订阅者重渲染。\n\nimport { createContext, type ReactNode, useContext, useEffect, useState } from \"react\";\nimport type { PluginHost } from \"../host/createPluginHost.js\";\n\nexport const PluginHostContext = createContext<PluginHost | undefined>(undefined);\n\nexport interface PluginHostProviderProps {\n host: PluginHost;\n children: ReactNode;\n}\n\nexport function PluginHostProvider({ host, children }: PluginHostProviderProps) {\n // 订阅 host 变化:每次 enable / disable / unregister 后 bump version,\n // 我们把 version 透到 state 触发子树重渲染(hooks 自身也用 useHostVersion)。\n const [version, setVersion] = useState<number>(host.version());\n useEffect(() => {\n return host.subscribe((snap) => {\n setVersion(snap.version);\n });\n }, [host]);\n // version 仅作为\"key 变化\"挂在这里,不再通过 context 暴露(避免误用)。\n void version;\n return <PluginHostContext.Provider value={host}>{children}</PluginHostContext.Provider>;\n}\n\nexport function usePluginHost(): PluginHost {\n const host = useContext(PluginHostContext);\n if (!host) throw new Error(\"PluginHostContext is missing\");\n return host;\n}\n\n/**\n * 订阅 host.version:host 每次 enable / disable / unregister 后 version 递增,\n * 订阅组件会重新渲染。这是\"硬切换 001\"让 React 层感知 host 变化的关键 hook。\n */\nexport function useHostVersion(): number {\n const host = usePluginHost();\n const [v, setV] = useState<number>(host.version());\n useEffect(() => host.subscribe((s) => setV(s.version)), [host]);\n return v;\n}\n","// packages/runtime/src/react/useCapability.ts\n// 组件读取 capability 的唯一入口。\n// 设计缘由:业务组件不得直接调用 host.capabilities.get(),\n// 一律通过 hook 走,确保调用路径可观察。\n//\n// 硬切换 001:capability 在 plugin disable 时被 revoke。\n// 组件如果仍然用 has/capability 缓存结果,旧值会\"看起来还能用\"。\n// 改为基于 host.version 重新求值:disable 后 version 递增 -> 重渲染 ->\n// has/capability 走新值。\n\nimport { useMemo } from \"react\";\nimport { usePluginHost, useHostVersion } from \"./PluginHostProvider.js\";\n\nexport function useCapability<T>(key: string): T {\n const host = usePluginHost();\n const version = useHostVersion();\n return useMemo(() => host.capabilities.get<T>(key), [host, version, key]);\n}\n\n/** 读取可选兼容 capability;缺失时返回 undefined,不把页面渲染打崩。 */\nexport function useOptionalCapability<T>(key: string): T | undefined {\n const host = usePluginHost();\n const version = useHostVersion();\n return useMemo(() => host.capabilities.has(key) ? host.capabilities.get<T>(key) : undefined, [host, version, key]);\n}\n\nexport function useHasCapability(key: string): boolean {\n const host = usePluginHost();\n const version = useHostVersion();\n return useMemo(() => host.capabilities.has(key), [host, version, key]);\n}\n","// packages/runtime/src/react/useRegistry.ts\n// 通用 registry 读取 hook:基于 host.version 重新计算 selector 输出。\n//\n// 硬切换 001:runtime 进入热卸载模型后,host 可能在 React 挂载后变化。\n// 我们用 useHostVersion() 触发重新计算;selector 仍然纯同步(host 是稳定\n// 引用),不会出现 useSyncExternalStore 那种 snapshot 误判。\n//\n// 用法:\n// const routes = useRegistry(h => h.routes.list());\n// const route = useRegistry(h => h.routes.byPath('/poker'));\n// 不再假定\"host 挂载后不变\"。\n\nimport { useMemo } from \"react\";\nimport type { PluginHost } from \"../host/createPluginHost.js\";\nimport { usePluginHost, useHostVersion } from \"./PluginHostProvider.js\";\n\nexport function useRegistry<T>(selector: (host: PluginHost) => T): T {\n const host = usePluginHost();\n const version = useHostVersion();\n // version 变化时强制重算 selector;selector host 是稳定引用。\n return useMemo(() => selector(host), [version, host, selector]);\n}\n","// packages/runtime/src/react/usePluginRuntime.ts\n// 插件运行时操作 hook。\n// 设计缘由(硬切换 001):\n// - UI 层(plugin manager)需要 enable / disable 插件。\n// - 业务组件可能需要查 graph / state。\n// - 把这些操作收拢到 hook,调用方拿到的是一个稳定 API 对象。\n\nimport { useMemo } from \"react\";\nimport type { PluginGraph, PluginState, PluginReverseDep, PluginManifest } from \"../contracts/plugin.js\";\nimport type { PluginIntentSubmissionResult } from \"../contracts/lifecycle.js\";\nimport type { PluginHost } from \"../host/createPluginHost.js\";\nimport { usePluginHost, useHostVersion } from \"./PluginHostProvider.js\";\n\nexport interface UsePluginRuntime {\n state(id: string): PluginState;\n graph(): PluginGraph;\n reverseDeps(id: string): PluginReverseDep[];\n enable(id: string): Promise<void>;\n disable(id: string): Promise<{ ok: true } | { ok: false; reason: string }>;\n /** 提交产品级绝对启停意图;accepted 只表示意图已持久化。 */\n submitIntent(id: string, desiredEnabled: boolean): Promise<PluginIntentSubmissionResult>;\n unregister(id: string): Promise<void>;\n version(): number;\n manifests(): string[];\n installed(): string[];\n isEnabled(id: string): boolean;\n /** 拿单条 plugin 的 manifest。id 未知时返回 undefined。 */\n getManifest(id: string): PluginManifest | undefined;\n /**\n * 探测 capability 是否存在。供 UI 判断\"依赖的 capability 是否满足\",\n * 依赖列表里写的是 capability key(如 \"route.registry\"),不是 plugin id。\n */\n hasCapability(key: string): boolean;\n}\n\nexport function usePluginRuntime(): UsePluginRuntime {\n const host = usePluginHost();\n const version = useHostVersion();\n return useMemo<UsePluginRuntime>(() => {\n const api: UsePluginRuntime = {\n state(id) {\n return host.state(id);\n },\n graph() {\n return host.graph();\n },\n reverseDeps(id) {\n return host.reverseDeps(id);\n },\n enable(id) {\n return host.enable(id);\n },\n disable(id) {\n return host.disable(id);\n },\n submitIntent(id, desiredEnabled) {\n return host.submitIntent(id, desiredEnabled);\n },\n unregister(id) {\n return host.unregister(id);\n },\n version() {\n return host.version();\n },\n manifests() {\n return host.manifests();\n },\n installed() {\n return host.installed();\n },\n isEnabled(id) {\n return host.state(id).kind === \"enabled\";\n },\n getManifest(id) {\n return host.getManifest(id);\n },\n hasCapability(key) {\n return host.capabilities.has(key);\n }\n };\n return api;\n }, [host, version]);\n}\n\n/** 旧调用方兼容:单纯拿 host 引用。 */\nexport function useHost(): PluginHost {\n return usePluginHost();\n}\n","/**\n * useResource React Hook\n *\n * 设计缘由:负责 ensure + useSyncExternalStore 订阅并返回完整 snapshot。\n * 不暴露 store 内部可变对象。\n */\n\nimport { useCallback, useSyncExternalStore } from \"react\";\nimport type { ResourceSnapshot } from \"../contracts/resource.js\";\nimport type { ResourceStoreApi } from \"../resources/resourceStore.js\";\n\n/** useResource hook:返回完整资源快照 */\nexport function useResource<T>(\n store: ResourceStoreApi,\n definitionId: string,\n args: readonly string[]\n): ResourceSnapshot<T> {\n const subscribe = useCallback((callback: () => void) => {\n return store.subscribe(definitionId, args, callback);\n }, [store, definitionId, ...args]);\n\n const getSnapshot = useCallback((): ResourceSnapshot<T> => {\n return store.ensure<T>(definitionId, args);\n }, [store, definitionId, ...args]);\n\n const getServerSnapshot = useCallback((): ResourceSnapshot<T> => {\n // SSR 稳定快照\n return {\n key: [definitionId, ...args],\n status: \"pending\",\n data: undefined,\n revision: 0,\n };\n }, [definitionId, ...args]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n","/**\n * useResourceSelector React Hook\n *\n * 设计缘由:只在 selector 结果发生语义变化时重渲染。\n * selector 和 equality 必须为纯函数。\n */\n\nimport { useSyncExternalStore, useCallback, useRef } from \"react\";\nimport type { ResourceSnapshot } from \"../contracts/resource.js\";\nimport type { ResourceStoreApi } from \"../resources/resourceStore.js\";\n\n/** 默认相等判断:Object.is */\nfunction defaultEquality<T>(a: T, b: T): boolean {\n return Object.is(a, b);\n}\n\n/** useResourceSelector hook:只在 selector 结果变化时重渲染 */\nexport function useResourceSelector<T, TSelected>(\n store: ResourceStoreApi,\n definitionId: string,\n args: readonly string[],\n selector: (snapshot: ResourceSnapshot<T>) => TSelected,\n equality: (a: TSelected, b: TSelected) => boolean = defaultEquality\n): TSelected {\n const selectedRef = useRef<TSelected>();\n const hasSelectedRef = useRef(false);\n const sourceSnapshotRef = useRef<ResourceSnapshot<T>>();\n const selectorRef = useRef(selector);\n const equalityRef = useRef(equality);\n\n // 更新 refs\n selectorRef.current = selector;\n equalityRef.current = equality;\n\n const subscribe = useCallback(\n (callback: () => void) => {\n return store.subscribe(definitionId, args, callback);\n },\n [store, definitionId, ...args]\n );\n\n const getSnapshot = useCallback((): TSelected => {\n const snapshot = store.ensure<T>(definitionId, args);\n\n // React's useSyncExternalStore requires referentially stable results when\n // the backing store did not change. A selector may legitimately allocate\n // (for example `rows.slice().sort(...)`), so equality alone cannot uphold\n // that requirement when callers use reference equality.\n if (hasSelectedRef.current && sourceSnapshotRef.current === snapshot) {\n return selectedRef.current as TSelected;\n }\n\n const selected = selectorRef.current(snapshot);\n\n // 检查是否变化\n if (\n hasSelectedRef.current &&\n equalityRef.current(selectedRef.current as TSelected, selected)\n ) {\n sourceSnapshotRef.current = snapshot;\n return selectedRef.current as TSelected;\n }\n\n selectedRef.current = selected as TSelected;\n hasSelectedRef.current = true;\n sourceSnapshotRef.current = snapshot;\n return selected;\n }, [store, definitionId, ...args]);\n\n const getServerSnapshot = useCallback((): TSelected => {\n const snapshot: ResourceSnapshot<T> = {\n key: [definitionId, ...args],\n status: \"pending\",\n data: undefined,\n revision: 0,\n };\n return selectorRef.current(snapshot);\n }, [definitionId, ...args]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n","// 仅用于开发/测试观察组件 render 次数;生产构建中保持 no-op。\n\nconst counters = new Map<string, number>();\n\nfunction enabled(): boolean {\n const env = (import.meta as ImportMeta & { env?: { DEV?: boolean } }).env;\n return env?.DEV !== false;\n}\n\nexport function countRender(name: string): void {\n if (!enabled()) return;\n counters.set(name, (counters.get(name) ?? 0) + 1);\n}\n\nexport function getRenderCount(name: string): number {\n return counters.get(name) ?? 0;\n}\n\nexport function resetRenderCounters(): void {\n counters.clear();\n}\n"]}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { aa as PluginSetup, aG as RuntimeUnitImplementationRegistry, M as MessageBus, y as LifecycleScopeKind, e as LifecycleScopeIdentity, L as LifecycleScope, v as LifecycleDisposeResult, a5 as PluginIntentSnapshot, a3 as PluginIntentController, au as RemoteServiceTransport, al as RemoteServiceBridge, as as RemoteServiceReference, an as RemoteServiceCallContext, i as RemoteServiceMessageCodec, aA as ResourceRegistry, ay as ResourceDefinition } from './createPluginHost-CcW9sPNs.js';
|
|
2
|
+
|
|
3
|
+
interface RuntimeUnitImplementation {
|
|
4
|
+
/** 产品标识。 */
|
|
5
|
+
pluginId: string;
|
|
6
|
+
/** 稳定运行单元标识。 */
|
|
7
|
+
unitId: string;
|
|
8
|
+
/** 当前环境的可执行入口。 */
|
|
9
|
+
setup: PluginSetup;
|
|
10
|
+
}
|
|
11
|
+
/** 创建一个拒绝重复注册、按产品和单元查找实现的运行时注册表。 */
|
|
12
|
+
declare function createRuntimeUnitImplementationRegistry(implementations?: readonly RuntimeUnitImplementation[]): RuntimeUnitImplementationRegistry & {
|
|
13
|
+
register(implementation: RuntimeUnitImplementation): void;
|
|
14
|
+
unregister(pluginId: string, unitId: string): void;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
declare function createMessageBus(): MessageBus;
|
|
18
|
+
|
|
19
|
+
interface CreateResourceScopeOptions {
|
|
20
|
+
/** 可选固定作用域标识;生产代码通常省略,让实现生成不可复用 ID。 */
|
|
21
|
+
scopeId?: string;
|
|
22
|
+
/** 运行实例标识;省略时与 scopeId 同源生成。 */
|
|
23
|
+
instanceId?: string;
|
|
24
|
+
/** 作用域类型。 */
|
|
25
|
+
kind: LifecycleScopeKind;
|
|
26
|
+
/** 绑定插件和宿主只读属性。 */
|
|
27
|
+
metadata?: Omit<Partial<LifecycleScopeIdentity>, "scopeId" | "instanceId" | "kind">;
|
|
28
|
+
/** 测试或宿主诊断使用的状态变更回调。 */
|
|
29
|
+
onChange?: (scope: LifecycleScope) => void;
|
|
30
|
+
/** 子作用域生成最终清理结果后的内部通知;用于更新父级登记。 */
|
|
31
|
+
onDisposeResult?: (result: LifecycleDisposeResult) => void;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 创建一个可嵌套的生命周期作用域。
|
|
35
|
+
*
|
|
36
|
+
* `createResourceScope` 是 `createLifecycleScope` 的同义入口,方便不同
|
|
37
|
+
* 模块按“作用域”或“资源”语义调用;两者不代表两套实现。
|
|
38
|
+
*/
|
|
39
|
+
declare function createLifecycleScope(options: CreateResourceScopeOptions): LifecycleScope;
|
|
40
|
+
/** 语义别名:资源管理代码通常以 ResourceScope 称呼同一原语。 */
|
|
41
|
+
declare const createResourceScope: typeof createLifecycleScope;
|
|
42
|
+
type ResourceScopeOptions = CreateResourceScopeOptions;
|
|
43
|
+
|
|
44
|
+
interface CreatePluginIntentControllerOptions {
|
|
45
|
+
/** 当前控制面启动身份;Worker 重启时应传入新值。 */
|
|
46
|
+
authorityInstanceId?: string;
|
|
47
|
+
/** Worker 恢复后读取的平台意图。 */
|
|
48
|
+
initial?: Partial<PluginIntentSnapshot>;
|
|
49
|
+
/** 将候选快照原子写入平台存储;缺省表示内存控制面(测试用)。 */
|
|
50
|
+
persist?: (snapshot: PluginIntentSnapshot) => Promise<void>;
|
|
51
|
+
/** 有界去重记录数量,避免 commandId 永久增长。 */
|
|
52
|
+
maxCommandRecords?: number;
|
|
53
|
+
}
|
|
54
|
+
/** 创建单一控制面上的插件意图控制器。 */
|
|
55
|
+
declare function createPluginIntentController(options?: CreatePluginIntentControllerOptions): PluginIntentController;
|
|
56
|
+
|
|
57
|
+
interface CreateServiceBridgeOptions {
|
|
58
|
+
/** 桥协议版本;握手要求精确匹配。 */
|
|
59
|
+
protocolVersion: string;
|
|
60
|
+
/** 实际端口 RPC 传输;桥不负责重放请求。 */
|
|
61
|
+
transport: RemoteServiceTransport;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 创建一个绑定端口的服务桥。
|
|
65
|
+
*
|
|
66
|
+
* 快照规则:必须先接受 baseline;后续 revision 必须连续递增。发现缺口后
|
|
67
|
+
* 立即清空代理,等待新 baseline,不能拿旧服务继续运行。
|
|
68
|
+
*/
|
|
69
|
+
declare function createServiceBridge(options: CreateServiceBridgeOptions): RemoteServiceBridge;
|
|
70
|
+
/** 兼容“服务桥 / 远程服务桥”两种调用语义;实现仍只有一套。 */
|
|
71
|
+
declare const createRemoteServiceBridge: typeof createServiceBridge;
|
|
72
|
+
|
|
73
|
+
/** MessagePort 上的调用请求;request 内容由具体服务契约定义。 */
|
|
74
|
+
interface RemoteServicePortCallMessage {
|
|
75
|
+
/** 固定协议类型,避免与业务 MessageBus 事件混用。 */
|
|
76
|
+
/** codec 绑定的调用消息类型。 */
|
|
77
|
+
type: string;
|
|
78
|
+
/** 由传输层生成的唯一关联键;不接受调用方提供的业务 ID。 */
|
|
79
|
+
callId: string;
|
|
80
|
+
/** 实际端口连接标识。 */
|
|
81
|
+
connectionId: string;
|
|
82
|
+
/** 提供者运行实例;响应必须原样回显。 */
|
|
83
|
+
providerInstanceId: string;
|
|
84
|
+
/** 调用方可复用的业务操作标识;不参与 pending 映射。 */
|
|
85
|
+
operationId?: string;
|
|
86
|
+
/** 外部授权标识;Provider 最终边界必须核验。 */
|
|
87
|
+
grantId?: string;
|
|
88
|
+
/** Provider 必须在最终边界重新核验的服务引用。 */
|
|
89
|
+
reference: RemoteServiceReference;
|
|
90
|
+
/** 具体服务请求体;桥不解释也不重放。 */
|
|
91
|
+
request: unknown;
|
|
92
|
+
}
|
|
93
|
+
/** MessagePort 上的成功响应。 */
|
|
94
|
+
interface RemoteServicePortResultMessage {
|
|
95
|
+
/** codec 绑定的成功消息类型。 */
|
|
96
|
+
type: string;
|
|
97
|
+
callId: string;
|
|
98
|
+
connectionId: string;
|
|
99
|
+
providerInstanceId: string;
|
|
100
|
+
result: unknown;
|
|
101
|
+
}
|
|
102
|
+
/** MessagePort 上的失败响应;只传可序列化错误信息。 */
|
|
103
|
+
interface RemoteServicePortErrorMessage {
|
|
104
|
+
/** codec 绑定的失败消息类型。 */
|
|
105
|
+
type: string;
|
|
106
|
+
callId: string;
|
|
107
|
+
connectionId: string;
|
|
108
|
+
providerInstanceId: string;
|
|
109
|
+
error: {
|
|
110
|
+
name?: string;
|
|
111
|
+
message: string;
|
|
112
|
+
code?: string;
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/** 请求取消通知;Provider 仍需在最终提交前做自己的世代校验。 */
|
|
116
|
+
interface RemoteServicePortCancelMessage {
|
|
117
|
+
/** codec 绑定的取消消息类型。 */
|
|
118
|
+
type: string;
|
|
119
|
+
callId: string;
|
|
120
|
+
connectionId: string;
|
|
121
|
+
providerInstanceId: string;
|
|
122
|
+
}
|
|
123
|
+
type RemoteServicePortResponseMessage = RemoteServicePortResultMessage | RemoteServicePortErrorMessage;
|
|
124
|
+
interface CreateMessagePortServiceTransportOptions {
|
|
125
|
+
/** 已由实际 Worker / Window 连接产生的双工端口。 */
|
|
126
|
+
port: MessagePort;
|
|
127
|
+
/** 可选 transferable 提取器;默认只发送结构化克隆数据。 */
|
|
128
|
+
transferForRequest?: (request: unknown, context: RemoteServiceCallContext) => readonly Transferable[];
|
|
129
|
+
/** dispose 时是否关闭端口;默认不关闭,由端口所有者决定。 */
|
|
130
|
+
closeOnDispose?: boolean;
|
|
131
|
+
/** wire 消息 codec;默认使用 webloom.remote-service.*。 */
|
|
132
|
+
codec?: RemoteServiceMessageCodec;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 创建一个真实 MessagePort 传输。
|
|
136
|
+
*
|
|
137
|
+
* 返回对象的 `dispose()` 只关闭本端请求表和监听器;默认不关闭端口,
|
|
138
|
+
* 以免误伤同一端口上的握手 / 快照订阅。需要独占端口时可显式设置
|
|
139
|
+
* `closeOnDispose: true`。
|
|
140
|
+
*/
|
|
141
|
+
declare function createMessagePortServiceTransport(options: CreateMessagePortServiceTransportOptions): RemoteServiceTransport & {
|
|
142
|
+
dispose(): void;
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* 资源注册表实现
|
|
147
|
+
*
|
|
148
|
+
* 设计缘由:管理资源定义的注册和查询,支持 owner-aware 生命周期。
|
|
149
|
+
* 重复 id 抛错,disable 时可回收。
|
|
150
|
+
*/
|
|
151
|
+
|
|
152
|
+
/** 资源注册表实现 */
|
|
153
|
+
declare function createResourceRegistry(): ResourceRegistry;
|
|
154
|
+
/** Internal runtime hook; deliberately absent from ResourceRegistry's public type. */
|
|
155
|
+
declare function registerOwnedResource(registry: ResourceRegistry, ownerId: string, definition: ResourceDefinition<any, any>): void;
|
|
156
|
+
|
|
157
|
+
export { type CreateMessagePortServiceTransportOptions as C, type RemoteServicePortCallMessage as R, type CreatePluginIntentControllerOptions as a, type CreateResourceScopeOptions as b, type CreateServiceBridgeOptions as c, type RemoteServicePortCancelMessage as d, type RemoteServicePortErrorMessage as e, type RemoteServicePortResponseMessage as f, type RemoteServicePortResultMessage as g, type ResourceScopeOptions as h, type RuntimeUnitImplementation as i, createLifecycleScope as j, createMessageBus as k, createMessagePortServiceTransport as l, createPluginIntentController as m, createRemoteServiceBridge as n, createResourceRegistry as o, createResourceScope as p, createRuntimeUnitImplementationRegistry as q, createServiceBridge as r, registerOwnedResource as s };
|