webloom-framework 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/contracts/plugin.ts","../src/authoring/definePlugin.ts","../src/runtime/pluginDefinitions.ts","../src/runtime/runtimeTypes.ts","../src/runtime/runtimeProtocol.ts","../src/runtime/windowRuntime.ts","../src/transport/messagePortServiceProvider.ts","../src/runtime/sharedWorkerHost.ts","../src/runtime/connectSharedWorker.ts","../src/lifecycle/permissionVerifier.ts","../src/lifecycle/scopedRegistry.ts","../src/lifecycle/upgradeGate.ts"],"names":["errorMessage","makeRuntimeInstanceId","before","listeners","dispatch","addMessageListener","post","state","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 PluginPermission,\n PermissionLease,\n RemoteServiceBridge,\n RuntimeKind,\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/** v1 运行时依赖;跨 Runtime 绑定必须使用精确契约版本和来源 Runtime。 */\nexport interface RuntimeDependency {\n /** 依赖的 capability 标识。 */\n capability: string;\n /** 精确契约版本;跨 Runtime 依赖必须显式填写,本地可由 helper 推导。 */\n contractVersion?: string;\n /** 提供者实际运行空间;省略时由当前 Runtime 补齐。 */\n sourceRuntime?: RuntimeKind;\n /** 可选的人类可读诊断说明。 */\n reason?: string;\n /** 缺失时只关闭局部能力,不阻止主体运行。 */\n optional?: boolean;\n}\n\n/** 简单插件的产品级依赖别名。 */\nexport type PluginDependency = RuntimeDependency;\n\n/** 运行单元的严格依赖描述。 */\nexport interface RuntimeUnitDependency {\n /** 依赖的 capability 标识。 */\n capability: string;\n /** 精确契约版本;第一阶段只接受完全匹配。 */\n contractVersion: string;\n /** 提供者实际运行空间;跨 Runtime 依赖在 materialize/validate 边界必须补齐。 */\n sourceRuntime: RuntimeKind;\n /** 可选的人类可读诊断说明。 */\n reason?: string;\n /** 缺失时只关闭局部能力;未填写表示硬依赖。 */\n optional?: boolean;\n}\n\n/** 作者入口的未归一化 unit 依赖;进入 Host 前必须补齐版本和来源 Runtime。 */\nexport type RuntimeUnitDependencyInput = Omit<RuntimeUnitDependency, \"contractVersion\" | \"sourceRuntime\"> & {\n contractVersion?: string;\n sourceRuntime?: RuntimeKind;\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: { sourceRuntime: RuntimeKind },\n): RuntimeUnitDependency[] {\n return dependencies.map((dependency) => ({\n capability: dependency.capability,\n contractVersion: runtimeCapabilityContractVersion(dependency.capability),\n sourceRuntime: defaults.sourceRuntime,\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/** 插件装配元数据;v1 不解释产品分类字段。 */\nexport interface PluginMeta {\n /** 首次装配时默认是否启用。 */\n defaultEnabled: boolean;\n /** 是否允许产品控制面禁用。 */\n canDisable: boolean;\n /** 是否属于启动必需插件。 */\n startup?: PluginStartupMode;\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 /** 运行代码所在真实 Runtime。 */\n runtime: RuntimeKind;\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/** 作者入口的未归一化运行单元;runtime 可由 createWindowApp/startSharedWorkerApp 注入。 */\nexport type RuntimeUnitDescriptorInput<\n TContribution = PluginContribution,\n TConfig extends PluginConfig = PluginConfig,\n> = Omit<RuntimeUnitDescriptor<TContribution, TConfig>, \"runtime\" | \"dependencies\"> & {\n runtime?: RuntimeKind;\n dependencies?: readonly RuntimeUnitDependencyInput[];\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/** 作者入口的未归一化静态清单;进入 Host 前必须 materialize 成 PluginManifest。 */\nexport type PluginManifestInput<\n TContribution = PluginContribution,\n TConfig extends PluginConfig = PluginConfig,\n TExtension extends PluginContextExtension = PluginContextExtension,\n> = Omit<PluginManifest<TContribution, TConfig, TExtension>, \"units\"> & {\n units?: readonly RuntimeUnitDescriptorInput<TContribution, 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 runtime: RuntimeKind;\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 runtime: RuntimeKind;\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 unitId?: string;\n /** 能力列表。 */\n capabilities: string[];\n /** 当前状态。 */\n state: PluginStateKind;\n /** 最近错误。 */\n error?: string;\n}\n","// 面向普通插件作者的声明入口。\n//\n// definePlugin() 只返回“静态 descriptor + 本地实现”这两个内部装配所需的\n// 部分。manifest 永远不携带 setup,因此可以安全地用于快照、诊断和跨\n// realm 传输;实现函数只会在调用 definePlugin() 的那个 realm 被使用。\n\nimport type {\n PluginConfig,\n PluginContextExtension,\n PluginDependency,\n PluginManifestInput,\n PluginMeta,\n PluginSetup,\n PluginContribution,\n RuntimeDependency,\n RuntimeUnitDependencyInput,\n RuntimeUnitDescriptorInput,\n} from \"../contracts/plugin.js\";\nimport {\n defineRuntimeUnitProvidedContracts,\n runtimeCapabilityContractVersion,\n} from \"../contracts/plugin.js\";\nimport type { PluginPermission, RuntimeKind } from \"../contracts/lifecycle.js\";\n\nexport interface DefinePluginOptions<\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 /** 普通插件的可执行实现;不会进入静态 descriptor。 */\n setup: PluginSetup<TConfig, TExtension>;\n /** 默认目标 Runtime;普通 Window 插件通常省略,由 App 注入。 */\n runtime?: RuntimeKind;\n /** 默认 unit id;省略时使用插件 id。 */\n unitId?: string;\n /** 插件依赖;helper 会为本地依赖补齐 v1 契约版本。 */\n dependencies?: readonly (RuntimeDependency | PluginDependency)[];\n /** 本单元提供的 capability。 */\n provides?: readonly string[];\n /** 跨 Runtime 时可显式覆盖 capability 契约版本。 */\n providedContracts?: Readonly<Record<string, string>>;\n /** 请求的权限集合。 */\n permissions?: readonly PluginPermission[];\n /** 单元只读配置。 */\n config?: TConfig;\n /** 产品贡献;不会被框架解释。 */\n contribution?: TContribution;\n /** 是否默认启用;默认为 true。 */\n defaultEnabled?: boolean;\n /** 是否允许控制面停用;默认为 true。 */\n canDisable?: boolean;\n /** required 插件在 App 初始启动时必须成功。 */\n required?: boolean;\n /** 显式启动模式;required=true 时不能覆盖为 optional。 */\n startup?: \"required\" | \"optional\";\n /** 仅用于兼容低层消费方的静态 meta 扩展;WebLoom 不解释分类字段。 */\n meta?: Partial<PluginMeta>;\n}\n\n/** 静态 descriptor 与当前 realm 的实现函数分离。 */\nexport interface PluginDefinition<\n TContribution = PluginContribution,\n TConfig extends PluginConfig = PluginConfig,\n TExtension extends PluginContextExtension = PluginContextExtension,\n> {\n readonly manifest: PluginManifestInput<TContribution, TConfig, TExtension>;\n readonly descriptor: RuntimeUnitDescriptorInput<TContribution, TConfig>;\n readonly setup: PluginSetup<TConfig, TExtension>;\n}\n\nfunction normalizeDependency(dependency: RuntimeDependency | PluginDependency): RuntimeUnitDependencyInput {\n const contractVersion = dependency.contractVersion ?? runtimeCapabilityContractVersion(dependency.capability);\n return {\n capability: dependency.capability,\n contractVersion,\n ...(dependency.sourceRuntime !== undefined ? { sourceRuntime: dependency.sourceRuntime } : {}),\n ...(dependency.reason !== undefined ? { reason: dependency.reason } : {}),\n ...(dependency.optional !== undefined ? { optional: dependency.optional } : {}),\n };\n}\n\n/**\n * 声明一个插件。\n *\n * 该函数不创建 Host,也不启动 setup;真正的启动边界由\n * createWindowApp()/startSharedWorkerApp() 拥有。\n */\nexport function definePlugin<\n TContribution = PluginContribution,\n TConfig extends PluginConfig = PluginConfig,\n TExtension extends PluginContextExtension = PluginContextExtension,\n>(options: DefinePluginOptions<TContribution, TConfig, TExtension>): PluginDefinition<TContribution, TConfig, TExtension> {\n if (!options || typeof options.id !== \"string\" || options.id.trim() === \"\") {\n throw new Error(\"Plugin id must be a non-empty string\");\n }\n if (typeof options.setup !== \"function\") throw new Error(`Plugin \"${options.id}\" setup must be a function`);\n\n const unitId = options.unitId ?? options.id;\n if (unitId.trim() === \"\") throw new Error(`Plugin \"${options.id}\" unitId must be a non-empty string`);\n const provides = [...new Set(options.provides ?? [])];\n const dependencies = (options.dependencies ?? []).map(normalizeDependency);\n const providedContracts = {\n ...defineRuntimeUnitProvidedContracts(provides),\n ...(options.providedContracts ?? {}),\n };\n const descriptor: RuntimeUnitDescriptorInput<TContribution, TConfig> = {\n id: unitId,\n ...(options.runtime !== undefined ? { runtime: options.runtime } : {}),\n ...(dependencies.length > 0 ? { dependencies } : {}),\n ...(provides.length > 0 ? { provides } : {}),\n ...(Object.keys(providedContracts).length > 0 ? { providedContracts } : {}),\n ...(options.contribution !== undefined ? { contribution: options.contribution } : {}),\n ...(options.permissions !== undefined ? { permissions: [...options.permissions] } : {}),\n ...(options.config !== undefined ? { config: options.config } : {}),\n };\n const metaInput = options.meta ?? {};\n const required = options.required === true\n || options.startup === \"required\"\n || metaInput.startup === \"required\";\n const meta: PluginMeta = {\n ...metaInput,\n defaultEnabled: options.defaultEnabled ?? metaInput.defaultEnabled ?? true,\n canDisable: options.canDisable ?? metaInput.canDisable ?? !required,\n startup: required ? \"required\" : (options.startup ?? metaInput.startup ?? \"optional\"),\n };\n // A required plugin must have one unambiguous policy. Do this at the authoring\n // boundary so createWindowApp() can fail before mutating a Host.\n if (meta.startup === \"required\" && (meta.canDisable || !meta.defaultEnabled)) {\n throw new Error(`Plugin \"${options.id}\" required metadata is inconsistent`);\n }\n const manifest: PluginManifestInput<TContribution, TConfig, TExtension> = {\n id: options.id,\n name: options.name ?? options.id,\n ...(options.description !== undefined ? { description: options.description } : {}),\n meta,\n units: [descriptor],\n };\n return Object.freeze({\n manifest: Object.freeze(manifest),\n descriptor: Object.freeze(descriptor),\n setup: options.setup,\n });\n}\n","import type {\n PluginDefinition,\n} from \"../authoring/definePlugin.js\";\nimport type {\n PluginDependency,\n PluginManifest,\n PluginManifestInput,\n RuntimeUnitDescriptor,\n RuntimeUnitDescriptorInput,\n} from \"../contracts/plugin.js\";\nimport {\n defineRuntimeUnitProvidedContracts,\n runtimeCapabilityContractVersion,\n} from \"../contracts/plugin.js\";\nimport type { RuntimeKind } from \"../contracts/lifecycle.js\";\n\n// Runtime assembly intentionally accepts definitions with product-specific\n// config/contribution/extension generics. The materializer normalizes those\n// values into the framework's structural manifest before Host registration;\n// keeping this boundary generic avoids making every author cast a valid\n// definePlugin() result just to call createWindowApp().\nexport type RuntimePluginDefinition = PluginDefinition<any, any, any> | {\n readonly manifest: PluginManifest | PluginManifestInput;\n readonly setup: import(\"../contracts/plugin.js\").PluginSetup<any, any>;\n /** 多 unit manifest 中 setup 所实现的目标 unit;单一匹配 unit 可省略。 */\n readonly unitId?: string;\n};\n\nexport interface MaterializedPluginDefinition {\n readonly manifest: PluginManifest;\n /** 当前 Runtime 中由 setup 实现的 unit。 */\n readonly unitId: string;\n readonly setup: import(\"../contracts/plugin.js\").PluginSetup;\n}\n\nfunction normalizeProductDependencies(\n dependencies: readonly PluginDependency[] | undefined,\n runtime: RuntimeKind,\n) {\n return dependencies?.map((dependency) => ({\n capability: dependency.capability,\n contractVersion: dependency.contractVersion ?? runtimeCapabilityContractVersion(dependency.capability),\n sourceRuntime: dependency.sourceRuntime ?? runtime,\n ...(dependency.reason !== undefined ? { reason: dependency.reason } : {}),\n ...(dependency.optional !== undefined ? { optional: dependency.optional } : {}),\n }));\n}\n\n/** 将作者定义绑定到真实 Runtime;不把 setup 复制进 manifest。 */\nexport function materializePluginDefinition(\n input: RuntimePluginDefinition,\n runtime: RuntimeKind,\n): MaterializedPluginDefinition {\n const manifest = input.manifest;\n const setup = input.setup;\n if (!manifest || typeof manifest.id !== \"string\" || manifest.id.trim() === \"\") {\n throw new Error(\"Plugin manifest id must be a non-empty string\");\n }\n const existingUnits: readonly RuntimeUnitDescriptorInput[] = (manifest.units ?? []) as readonly RuntimeUnitDescriptorInput[];\n const requestedUnitId = \"unitId\" in input ? input.unitId : undefined;\n const matchingUnits = existingUnits.filter((unit) => unit.runtime === undefined || unit.runtime === runtime);\n let implementationUnitId: string;\n if (existingUnits.length === 0) {\n implementationUnitId = manifest.id;\n } else if (requestedUnitId !== undefined) {\n const selected = existingUnits.find((unit) => unit.id === requestedUnitId);\n if (!selected) throw new Error(`Plugin \"${manifest.id}\" does not declare unit \"${requestedUnitId}\"`);\n if (selected.runtime !== undefined && selected.runtime !== runtime) {\n throw new Error(`Plugin \"${manifest.id}\" unit \"${requestedUnitId}\" targets ${selected.runtime}, not ${runtime}`);\n }\n implementationUnitId = selected.id;\n } else if (matchingUnits.length === 1 && matchingUnits[0]) {\n implementationUnitId = matchingUnits[0].id;\n } else {\n throw new Error(\n `Plugin \"${manifest.id}\" has ${matchingUnits.length} implementation units for ${runtime}; specify unitId explicitly`,\n );\n }\n const selectedUnit = existingUnits.length > 0\n ? existingUnits.find((unit) => unit.id === implementationUnitId)\n : undefined;\n const units: RuntimeUnitDescriptor[] = selectedUnit\n ? [(() => {\n const unitRuntime = selectedUnit.runtime ?? runtime;\n const provides = [...(selectedUnit.provides ?? [])];\n const dependencies = selectedUnit.dependencies?.map((dependency): import(\"../contracts/plugin.js\").RuntimeUnitDependency => ({\n capability: dependency.capability,\n contractVersion: dependency.contractVersion ?? runtimeCapabilityContractVersion(dependency.capability),\n sourceRuntime: dependency.sourceRuntime ?? unitRuntime,\n ...(dependency.reason !== undefined ? { reason: dependency.reason } : {}),\n ...(dependency.optional !== undefined ? { optional: dependency.optional } : {}),\n }));\n return {\n ...selectedUnit,\n runtime: unitRuntime,\n dependencies,\n ...(provides.length > 0\n ? { providedContracts: { ...defineRuntimeUnitProvidedContracts(provides), ...(selectedUnit.providedContracts ?? {}) } }\n : {}),\n };\n })()]\n : [{\n id: manifest.id,\n runtime,\n dependencies: normalizeProductDependencies(manifest.dependencies, runtime),\n ...(manifest.provides && manifest.provides.length > 0 ? {\n provides: [...manifest.provides],\n providedContracts: defineRuntimeUnitProvidedContracts(manifest.provides),\n } : {}),\n ...(manifest.permissions !== undefined ? { permissions: [...manifest.permissions] } : {}),\n ...(manifest.config !== undefined ? { config: manifest.config } : {}),\n ...(manifest.contribution !== undefined ? { contribution: manifest.contribution } : {}),\n }];\n const normalized: PluginManifest = {\n ...manifest,\n units,\n // Product-level declarations are retained only for compatibility with\n // low-level manifests; the selected unit is the source of truth in Host.\n };\n return { manifest: normalized, unitId: implementationUnitId, setup };\n}\n\nexport function materializePluginDefinitions(\n inputs: readonly RuntimePluginDefinition[],\n runtime: RuntimeKind,\n): MaterializedPluginDefinition[] {\n return inputs.map((input) => materializePluginDefinition(input, runtime));\n}\n","import type {\n LifecycleDisposeResult,\n RemoteServiceBridge,\n RemoteServiceProxy,\n RemoteServiceReference,\n RuntimeKind,\n} from \"../contracts/lifecycle.js\";\nimport type { PluginHost } from \"../host/createPluginHost.js\";\nimport type { RuntimeSnapshotUnit } from \"./runtimeProtocol.js\";\n\nexport type RuntimeAppState =\n | \"starting\"\n | \"ready\"\n | \"stopping\"\n | \"failed\"\n | \"disposed\"\n | \"connecting\"\n | \"disconnected\";\n\nexport interface RuntimeStatusSnapshot {\n runtimeId: string;\n runtimeKind: RuntimeKind;\n runtimeInstanceId: string;\n state: RuntimeAppState;\n snapshotRevision: number;\n connectionId?: string;\n units: readonly RuntimeSnapshotUnit[];\n services: readonly RemoteServiceReference[];\n error?: string;\n}\n\nexport type RuntimeStatusListener = (snapshot: RuntimeStatusSnapshot) => void;\n\nexport interface WindowApp {\n readonly runtimeKind: \"window-main\";\n readonly runtimeId: string;\n readonly runtimeInstanceId: string;\n /** 已由 createWindowApp 装配并注册完成的本地 Host。 */\n readonly host: PluginHost;\n state(): RuntimeStatusSnapshot;\n /** 获取当前本地 capability;停止或销毁后同步抛错。 */\n capability<T>(capabilityId: string): T;\n subscribe(listener: RuntimeStatusListener): () => void;\n dispose(reason?: string): Promise<LifecycleDisposeResult>;\n}\n\nexport interface RuntimeHandle {\n readonly runtimeKind: \"shared-worker\";\n readonly runtimeId: string;\n /** 当前连接绑定的 Worker 启动身份;未握手时为 undefined。 */\n readonly runtimeInstanceId?: string;\n /** 当前物理连接身份;未握手时为 undefined。 */\n readonly connectionId?: string;\n /** 当前连接已校验的服务桥;不暴露原始 MessagePort。 */\n readonly serviceBridge: RemoteServiceBridge;\n state(): RuntimeStatusSnapshot;\n ready(): Promise<void>;\n capability<T = unknown>(capabilityId: string, options?: {\n contractVersion?: string;\n }): RemoteServiceProxy & { readonly serviceType?: T };\n subscribe(listener: RuntimeStatusListener): () => void;\n dispose(reason?: string): Promise<void>;\n}\n\n/** 跨 realm 初始化失败;不把 required 插件错误包装成成功状态。 */\nexport interface RuntimeInitializationErrorDetails {\n pluginId?: string;\n unitId?: string;\n phase: \"validate\" | \"register\" | \"startup\" | \"snapshot\" | \"handshake\";\n error: string;\n}\n\nexport class RuntimeInitializationError extends Error {\n readonly code = \"runtime.initialization_failed\" as const;\n readonly details: RuntimeInitializationErrorDetails;\n\n constructor(details: RuntimeInitializationErrorDetails) {\n super(\n `Runtime initialization failed${details.pluginId ? ` for ${details.pluginId}` : \"\"}`\n + ` during ${details.phase}: ${details.error}`,\n );\n this.name = \"RuntimeInitializationError\";\n this.details = details;\n }\n}\n\nexport class RuntimeUnavailableError extends Error {\n readonly code = \"runtime.unavailable\" as const;\n\n constructor(message = \"Runtime is unavailable\") {\n super(message);\n this.name = \"RuntimeUnavailableError\";\n }\n}\n","// Window <-> SharedWorker 的轻量运行时协议。\n//\n// 服务调用仍复用 RemoteServiceMessageCodec / MessagePort transport;本文件\n// 只定义运行时握手、快照和重同步消息。setup 函数、Context 和业务私密值\n// 永远不进入这些结构化克隆消息。\n\nimport type { PluginStateKind, PluginUnitState } from \"../contracts/plugin.js\";\nimport type {\n RemoteServiceMessageCodec,\n RemoteServiceReference,\n} from \"../contracts/lifecycle.js\";\nimport { createRemoteServiceMessageCodec } from \"../contracts/lifecycle.js\";\nimport type { RuntimeKind } from \"../contracts/lifecycle.js\";\n\nexport const RUNTIME_PROTOCOL_VERSION = \"webloom.runtime.v1\";\nexport const RUNTIME_HELLO_TYPE = \"webloom.runtime.hello\";\nexport const RUNTIME_SNAPSHOT_TYPE = \"webloom.runtime.snapshot\";\nexport const RUNTIME_RESYNC_TYPE = \"webloom.runtime.resync\";\nexport const RUNTIME_ERROR_TYPE = \"webloom.runtime.error\";\n\nexport interface RuntimeHelloMessage {\n type: typeof RUNTIME_HELLO_TYPE;\n protocolVersion: string;\n connectionId: string;\n runtimeId: string;\n}\n\nexport interface RuntimeResyncMessage {\n type: typeof RUNTIME_RESYNC_TYPE;\n connectionId: string;\n}\n\nexport interface RuntimeErrorMessage {\n type: typeof RUNTIME_ERROR_TYPE;\n protocolVersion: string;\n code: \"runtime.protocol_mismatch\" | \"runtime.initialization_failed\" | \"runtime.invalid_connection\";\n message: string;\n pluginId?: string;\n unitId?: string;\n phase?: string;\n}\n\nexport interface RuntimeSnapshot {\n type: typeof RUNTIME_SNAPSHOT_TYPE;\n protocolVersion: string;\n runtimeId: string;\n runtimeKind: RuntimeKind;\n runtimeInstanceId: string;\n connectionId: string;\n snapshotRevision: number;\n baseline: boolean;\n state: \"starting\" | \"ready\" | \"stopping\" | \"failed\" | \"disposed\";\n units: readonly RuntimeSnapshotUnit[];\n services: readonly RemoteServiceReference[];\n}\n\nexport interface RuntimeSnapshotUnit {\n pluginId: string;\n unitId: string;\n runtime: RuntimeKind;\n instanceId?: string;\n state: PluginStateKind;\n}\n\nfunction isRecord(input: unknown): input is Record<string, unknown> {\n return typeof input === \"object\" && input !== null;\n}\n\nfunction isNonEmptyString(input: unknown): input is string {\n return typeof input === \"string\" && input.length > 0;\n}\n\nfunction isRuntimeKind(input: unknown): input is RuntimeKind {\n return input === \"window-main\" || input === \"shared-worker\";\n}\n\nfunction isPluginStateKind(input: unknown): input is PluginStateKind {\n return input === \"registered\"\n || input === \"starting\"\n || input === \"stopping\"\n || input === \"enabled\"\n || input === \"disabled\"\n || input === \"blocked\"\n || input === \"error-disabled\"\n || input === \"cleanup-pending\"\n || input === \"unknown\";\n}\n\nfunction isRemoteServiceReference(input: unknown): input is RemoteServiceReference {\n if (!isRecord(input)) return false;\n const reference = input as Partial<RemoteServiceReference>;\n return isNonEmptyString(reference.capabilityId)\n && isNonEmptyString(reference.providerInstanceId)\n && isRuntimeKind(reference.runtime)\n && isNonEmptyString(reference.contractVersion)\n && isNonEmptyString(reference.authorityInstanceId)\n && isNonEmptyString(reference.scopeId)\n && Number.isSafeInteger(reference.handoverGeneration)\n && (reference.handoverGeneration as number) >= 0\n && isRecord(reference.attributes)\n && !Array.isArray(reference.attributes)\n && (reference.status === \"starting\"\n || reference.status === \"ready\"\n || reference.status === \"unavailable\"\n || reference.status === \"failed\")\n && Number.isSafeInteger(reference.snapshotRevision)\n && (reference.snapshotRevision as number) >= 0\n && (reference.connectionId === undefined || isNonEmptyString(reference.connectionId))\n && (reference.grantId === undefined || isNonEmptyString(reference.grantId))\n && (reference.authorizationRevision === undefined\n || (Number.isSafeInteger(reference.authorizationRevision) && reference.authorizationRevision >= 0));\n}\n\nfunction isRuntimeSnapshotUnit(input: unknown): input is RuntimeSnapshotUnit {\n if (!isRecord(input)) return false;\n const unit = input as Partial<RuntimeSnapshotUnit>;\n return isNonEmptyString(unit.pluginId)\n && isNonEmptyString(unit.unitId)\n && isRuntimeKind(unit.runtime)\n && isPluginStateKind(unit.state)\n && (unit.instanceId === undefined || isNonEmptyString(unit.instanceId));\n}\n\nexport function createRuntimeMessageCodec(): RemoteServiceMessageCodec {\n return createRemoteServiceMessageCodec({\n prefix: \"webloom.runtime\",\n protocolVersion: RUNTIME_PROTOCOL_VERSION,\n });\n}\n\nexport function isRuntimeHello(input: unknown): input is RuntimeHelloMessage {\n if (!isRecord(input)) return false;\n const message = input as Partial<RuntimeHelloMessage>;\n return message.type === RUNTIME_HELLO_TYPE\n && isNonEmptyString(message.protocolVersion)\n && isNonEmptyString(message.connectionId)\n && isNonEmptyString(message.runtimeId);\n}\n\nexport function isRuntimeResync(input: unknown): input is RuntimeResyncMessage {\n if (!isRecord(input)) return false;\n const message = input as Partial<RuntimeResyncMessage>;\n return message.type === RUNTIME_RESYNC_TYPE\n && isNonEmptyString(message.connectionId);\n}\n\nexport function isRuntimeSnapshot(input: unknown): input is RuntimeSnapshot {\n if (!isRecord(input)) return false;\n const message = input as Partial<RuntimeSnapshot>;\n return message.type === RUNTIME_SNAPSHOT_TYPE\n && message.protocolVersion === RUNTIME_PROTOCOL_VERSION\n && isNonEmptyString(message.runtimeId)\n && isRuntimeKind(message.runtimeKind)\n && isNonEmptyString(message.runtimeInstanceId)\n && isNonEmptyString(message.connectionId)\n && Number.isSafeInteger(message.snapshotRevision)\n && (message.snapshotRevision as number) >= 0\n && typeof message.baseline === \"boolean\"\n && Array.isArray(message.units)\n && message.units.every(isRuntimeSnapshotUnit)\n && Array.isArray(message.services)\n && message.services.every(isRemoteServiceReference)\n && (message.state === \"starting\"\n || message.state === \"ready\"\n || message.state === \"stopping\"\n || message.state === \"failed\"\n || message.state === \"disposed\");\n}\n\nexport function isRuntimeError(input: unknown): input is RuntimeErrorMessage {\n if (!isRecord(input)) return false;\n const message = input as Partial<RuntimeErrorMessage>;\n return message.type === RUNTIME_ERROR_TYPE\n && isNonEmptyString(message.protocolVersion)\n && (message.code === \"runtime.protocol_mismatch\"\n || message.code === \"runtime.initialization_failed\"\n || message.code === \"runtime.invalid_connection\")\n && isNonEmptyString(message.message)\n && (message.pluginId === undefined || isNonEmptyString(message.pluginId))\n && (message.unitId === undefined || isNonEmptyString(message.unitId))\n && (message.phase === undefined || isNonEmptyString(message.phase));\n}\n\n/** 将 Host 的 PluginUnitState 映射成不会泄露领域配置的运行时快照。 */\nexport function unitSnapshotFromState(\n state: PluginUnitState,\n runtime: RuntimeKind,\n): RuntimeSnapshotUnit {\n return {\n pluginId: state.pluginId,\n unitId: state.unitId,\n runtime,\n ...(state.instanceId !== undefined ? { instanceId: state.instanceId } : {}),\n state: state.kind,\n };\n}\n","import type {\n LifecycleDisposeResult,\n RemoteServiceReference,\n} from \"../contracts/lifecycle.js\";\nimport type { PluginManifest } from \"../contracts/plugin.js\";\nimport {\n createPluginHost,\n type CreatePluginHostOptions,\n type PluginHost,\n} from \"../host/createPluginHost.js\";\nimport { createRuntimeUnitImplementationRegistry } from \"../host/runtimeUnitImplementationRegistry.js\";\nimport { StartupPluginError } from \"../host/createPluginHost.js\";\nimport type { RuntimePluginDefinition } from \"./pluginDefinitions.js\";\nimport { materializePluginDefinitions } from \"./pluginDefinitions.js\";\nimport { unitSnapshotFromState } from \"./runtimeProtocol.js\";\nimport {\n RuntimeInitializationError,\n RuntimeUnavailableError,\n type RuntimeStatusListener,\n type RuntimeStatusSnapshot,\n type RuntimeHandle,\n type WindowApp,\n} from \"./runtimeTypes.js\";\n\nexport interface CreateWindowAppOptions extends Omit<CreatePluginHostOptions, \"runtime\" | \"runtimeUnitImplementationRegistry\"> {\n /** 逻辑 Runtime 标识;同一页面通常只创建一个 App。 */\n id?: string;\n /** 当前 Window 的插件定义;setup 只在当前 Window realm 执行。 */\n plugins: readonly RuntimePluginDefinition[];\n /**\n * 供领域适配层接管分阶段注册时复用已经创建的 Window Host。\n * 普通插件应省略该字段;传入后由调用方负责后续 register,App 仍负责\n * Window Runtime 快照、远端投影和最终 dispose。\n */\n host?: PluginHost;\n /** 可选的 SharedWorker Runtime;Window 单元只投影其状态,不创建 Worker 假实例。 */\n remoteRuntime?: RuntimeHandle;\n}\n\nfunction makeRuntimeInstanceId(runtimeId: string): string {\n try {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return `${runtimeId}:${crypto.randomUUID()}`;\n }\n } catch {\n // 仅用于实例身份,不承担授权或密钥语义。\n }\n return `${runtimeId}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isStartupPluginError(error: unknown): error is StartupPluginError {\n return error instanceof StartupPluginError\n && typeof error.details?.pluginId === \"string\";\n}\n\nfunction buildLocalServices(\n host: PluginHost,\n manifests: readonly PluginManifest[],\n runtimeInstanceId: string,\n revision: number,\n): readonly RemoteServiceReference[] {\n const services: RemoteServiceReference[] = [];\n for (const manifest of manifests) {\n const state = host.state(manifest.id);\n const unit = manifest.units?.find((candidate) => candidate.id === state.unitId)\n ?? manifest.units?.[0];\n if (!unit || unit.runtime === undefined || !state.instanceId || state.kind !== \"enabled\") continue;\n const scopeId = host.scope(manifest.id)?.identity.scopeId ?? `scope:${state.instanceId}`;\n for (const capability of unit.provides ?? []) {\n services.push({\n capabilityId: capability,\n providerInstanceId: state.instanceId,\n runtime: unit.runtime,\n contractVersion: unit.providedContracts?.[capability] ?? `${capability}.v1`,\n authorityInstanceId: runtimeInstanceId,\n scopeId,\n handoverGeneration: 0,\n attributes: Object.freeze({}),\n status: \"ready\",\n snapshotRevision: revision,\n });\n }\n }\n return services;\n}\n\n/** 创建当前 Window 的唯一 window-main Runtime。 */\nexport async function createWindowApp(options: CreateWindowAppOptions): Promise<WindowApp> {\n const runtimeId = options.id ?? \"window-main\";\n const remoteRuntime = options.remoteRuntime;\n const runtimeInstanceId = makeRuntimeInstanceId(runtimeId);\n let currentState: RuntimeStatusSnapshot = {\n runtimeId,\n runtimeKind: \"window-main\",\n runtimeInstanceId,\n state: \"starting\",\n snapshotRevision: 0,\n units: [],\n services: [],\n };\n const listeners = new Set<RuntimeStatusListener>();\n let disposed = false;\n let disposePromise: Promise<LifecycleDisposeResult> | undefined;\n\n const emit = (next: RuntimeStatusSnapshot): void => {\n currentState = Object.freeze({\n ...next,\n units: Object.freeze([...next.units]),\n services: Object.freeze([...next.services]),\n });\n for (const listener of [...listeners]) {\n try { listener(currentState); } catch { /* 观察者不能改变 Runtime 状态。 */ }\n }\n };\n\n let materialized: ReturnType<typeof materializePluginDefinitions>;\n try {\n materialized = materializePluginDefinitions(options.plugins, \"window-main\");\n } catch (error) {\n throw new RuntimeInitializationError({ phase: \"validate\", error: errorMessage(error) });\n }\n const manifests = materialized.map((item) => item.manifest);\n let implementations: ReturnType<typeof createRuntimeUnitImplementationRegistry>;\n try {\n const duplicate = manifests.find((manifest, index) => (\n manifests.findIndex((candidate) => candidate.id === manifest.id) !== index\n ));\n if (duplicate) throw new Error(`Plugin \"${duplicate.id}\" is declared more than once`);\n implementations = createRuntimeUnitImplementationRegistry(\n materialized.map((item) => ({\n pluginId: item.manifest.id,\n unitId: item.unitId,\n setup: item.setup,\n })),\n );\n } catch (error) {\n throw new RuntimeInitializationError({ phase: \"validate\", error: errorMessage(error) });\n }\n\n let host: PluginHost;\n const suppliedHost = options.host;\n try {\n const {\n id: _id,\n plugins: _plugins,\n host: _host,\n remoteRuntime: _remoteRuntime,\n ...hostOptions\n } = options;\n const suppliedBridgeFactory = hostOptions.serviceBridgeForPlugin;\n host = suppliedHost ?? createPluginHost({\n ...hostOptions,\n runtime: \"window-main\",\n externalRuntimeDependencies: remoteRuntime !== undefined || hostOptions.externalRuntimeDependencies,\n remoteServiceReferences: () => remoteRuntime?.state().services ?? hostOptions.remoteServiceReferences?.() ?? [],\n runtimeSnapshots: () => remoteRuntime\n ? remoteRuntime.state().units.map((unit) => ({\n pluginId: unit.pluginId,\n unitId: unit.unitId,\n runtime: unit.runtime,\n ...(unit.instanceId !== undefined ? { instanceId: unit.instanceId } : {}),\n state: unit.state,\n }))\n : hostOptions.runtimeSnapshots?.() ?? [],\n serviceBridgeForPlugin: (pluginId, instanceId) => (\n suppliedBridgeFactory?.(pluginId, instanceId) ?? remoteRuntime?.serviceBridge\n ),\n rootAttributes: {\n ...(hostOptions.rootAttributes ?? {}),\n runtimeId,\n runtimeInstanceId,\n },\n runtimeUnitImplementationRegistry: implementations,\n });\n } catch (error) {\n throw new RuntimeInitializationError({ phase: \"validate\", error: errorMessage(error) });\n }\n\n let removeRemoteSubscription: (() => void) | undefined;\n\n const manifestsForSnapshot = (): readonly PluginManifest[] => {\n if (!suppliedHost) return manifests;\n return suppliedHost.manifests()\n .map((pluginId) => suppliedHost.getManifest(pluginId))\n .filter((manifest): manifest is PluginManifest => manifest !== undefined);\n };\n\n const refresh = (): void => {\n const snapshotManifests = manifestsForSnapshot();\n const units = snapshotManifests.flatMap((manifest) => {\n const state = host.state(manifest.id);\n return (state.units ?? []).map((unit) => unitSnapshotFromState(\n unit,\n unit.runtime,\n ));\n });\n const revision = Math.max(currentState.snapshotRevision + 1, host.version());\n emit({\n ...currentState,\n snapshotRevision: revision,\n units,\n services: [\n ...buildLocalServices(host, snapshotManifests, runtimeInstanceId, revision),\n ...(remoteRuntime?.state().services ?? []),\n ],\n });\n };\n const removeHostSubscription = host.subscribe(refresh);\n\n try {\n if (!suppliedHost) await host.registerAll(manifests);\n const failedRequired = suppliedHost ? undefined : manifests.find((manifest) => {\n const required = manifest.meta.startup === \"required\" || manifest.meta.canDisable === false;\n return required && host.state(manifest.id).kind !== \"enabled\";\n });\n if (failedRequired) {\n const state = host.state(failedRequired.id);\n throw new StartupPluginError({\n pluginId: failedRequired.id,\n unitId: state.unitId ?? failedRequired.units?.[0]?.id ?? failedRequired.id,\n capabilities: [],\n state: state.kind,\n error: state.error ?? `Required plugin is ${state.kind}${state.blockedBy ? `: ${state.blockedBy.join(\", \")}` : \"\"}`,\n });\n }\n } catch (error) {\n refresh();\n const pluginId = isStartupPluginError(error) ? error.details.pluginId : undefined;\n const manifest = pluginId ? manifests.find((candidate) => candidate.id === pluginId) : undefined;\n const required = manifest?.meta.startup === \"required\" || manifest?.meta.canDisable === false;\n if (required || !isStartupPluginError(error)) {\n removeHostSubscription();\n removeRemoteSubscription?.();\n await host.dispose(\"window runtime initialization failed\").catch(() => undefined);\n if (error instanceof RuntimeInitializationError) throw error;\n throw new RuntimeInitializationError({\n pluginId,\n unitId: isStartupPluginError(error) ? error.details.unitId : manifest?.units?.[0]?.id,\n phase: \"startup\",\n error: errorMessage(error),\n });\n }\n // 非 required 插件的失败保留在 Host 快照中;App 本身仍可观察并继续运行。\n }\n refresh();\n emit({ ...currentState, state: \"ready\" });\n removeRemoteSubscription = remoteRuntime?.subscribe(() => {\n host.refreshRuntimeUnitSnapshots();\n void host.reconcile().catch(() => undefined);\n });\n\n const app: WindowApp = {\n runtimeKind: \"window-main\",\n runtimeId,\n runtimeInstanceId,\n host,\n state: () => currentState,\n capability<T>(capabilityId: string): T {\n if (disposed || currentState.state === \"disposed\" || currentState.state === \"stopping\") {\n throw new RuntimeUnavailableError(\"Window Runtime has been disposed\");\n }\n return host.capabilities.get<T>(capabilityId);\n },\n subscribe(listener) {\n listeners.add(listener);\n listener(currentState);\n return () => listeners.delete(listener);\n },\n dispose(reason = \"window runtime disposed\") {\n if (disposePromise) return disposePromise;\n disposed = true;\n emit({ ...currentState, state: \"stopping\" });\n removeHostSubscription();\n removeRemoteSubscription?.();\n disposePromise = host.dispose(reason).then((result) => {\n emit({ ...currentState, state: \"disposed\" });\n return result;\n }, (error) => {\n emit({ ...currentState, state: \"failed\", error: errorMessage(error) });\n throw error;\n });\n return disposePromise;\n },\n };\n return app;\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","import type {\n LifecycleDisposeResult,\n RemoteServiceReference,\n RemoteServiceSnapshot,\n} from \"../contracts/lifecycle.js\";\nimport type { PluginManifest } from \"../contracts/plugin.js\";\nimport {\n createPluginHost,\n type CreatePluginHostOptions,\n type PluginHost,\n} from \"../host/createPluginHost.js\";\nimport { StartupPluginError } from \"../host/createPluginHost.js\";\nimport { createRuntimeUnitImplementationRegistry } from \"../host/runtimeUnitImplementationRegistry.js\";\nimport { createMessagePortServiceProvider, type MessagePortServiceProvider } from \"../transport/messagePortServiceProvider.js\";\nimport type { RemoteServicePortCallMessage } from \"../transport/messagePortServiceTransport.js\";\nimport type { RuntimePluginDefinition } from \"./pluginDefinitions.js\";\nimport { materializePluginDefinitions } from \"./pluginDefinitions.js\";\nimport {\n createRuntimeMessageCodec,\n isRuntimeHello,\n isRuntimeResync,\n RUNTIME_ERROR_TYPE,\n RUNTIME_PROTOCOL_VERSION,\n RUNTIME_SNAPSHOT_TYPE,\n type RuntimeErrorMessage,\n type RuntimeHelloMessage,\n type RuntimeSnapshot,\n type RuntimeSnapshotUnit,\n} from \"./runtimeProtocol.js\";\nimport {\n RuntimeInitializationError,\n type RuntimeStatusListener,\n type RuntimeStatusSnapshot,\n type RuntimeAppState,\n} from \"./runtimeTypes.js\";\n\nexport interface SharedWorkerScopeLike {\n onconnect: ((event: { ports: MessagePort[] }) => void) | null;\n}\n\nexport interface StartSharedWorkerAppOptions extends Omit<CreatePluginHostOptions, \"runtime\" | \"runtimeUnitImplementationRegistry\"> {\n /** SharedWorker 的逻辑稳定标识。 */\n id: string;\n /** 只在 SharedWorker realm 执行的插件定义。 */\n plugins: readonly RuntimePluginDefinition[];\n /** 测试 fixture 可注入结构等价的 SharedWorkerGlobalScope。 */\n globalScope?: SharedWorkerScopeLike;\n /**\n * 复用已有领域 Worker 入口的 onconnect 装配。回调只负责安装领域协议\n * listener;WebLoom 仍在同一端口上安装自己的 Runtime listener,不会创建\n * 第二个 Worker 或第二条物理连接。\n */\n onPortConnect?: (event: { ports: MessagePort[] }) => void;\n}\n\nexport interface SharedWorkerApp {\n readonly runtimeKind: \"shared-worker\";\n readonly runtimeId: string;\n readonly runtimeInstanceId: string;\n ready(): Promise<void>;\n /** 重新按当前外部身份/意图对账运行单元;不会创建第二个 Worker。 */\n reconcile(): Promise<void>;\n state(): RuntimeStatusSnapshot;\n subscribe(listener: RuntimeStatusListener): () => void;\n dispose(reason?: string): Promise<LifecycleDisposeResult>;\n}\n\ninterface WorkerEndpoint {\n port: MessagePort;\n connectionId: string;\n provider: MessagePortServiceProvider;\n removeMessage: () => void;\n closed: boolean;\n}\n\nfunction makeRuntimeInstanceId(runtimeId: string): string {\n try {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return `${runtimeId}:${crypto.randomUUID()}`;\n }\n } catch {\n // 仅用于 Runtime 身份去重。\n }\n return `${runtimeId}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`;\n}\n\nfunction makeConnectionId(): never {\n // connectionId 必须由 Window 端生成并在 hello 中回显,Worker 不能根据\n // port 对象或 Window 名称猜测它。该函数用于类型上阻止 Worker 生成连接。\n throw new Error(\"SharedWorker connectionId must be supplied by the Window handshake\");\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction startupDetails(error: unknown): { pluginId?: string; unitId?: string; message: string } {\n if (error instanceof StartupPluginError) {\n return {\n pluginId: error.details.pluginId,\n unitId: error.details.unitId,\n message: error.details.error ?? error.message,\n };\n }\n if (error instanceof RuntimeInitializationError) {\n return {\n pluginId: error.details.pluginId,\n unitId: error.details.unitId,\n message: error.message,\n };\n }\n return { message: errorMessage(error) };\n}\n\nfunction addPortListener(port: MessagePort, listener: (event: MessageEvent) => void): () => void {\n // 浏览器 MessagePort 同时支持 onmessage 和 addEventListener;测试宿主和\n // 少数嵌入环境则可能只实现 onmessage,或把 addEventListener 简化成覆盖\n // onmessage。Worker 的领域协议 listener 已经由 onPortConnect 安装在同一\n // 端口上,因此这里必须保留它,不能让 Runtime 握手吞掉领域消息。\n const target = port as unknown as {\n onmessage: ((this: MessagePort, event: MessageEvent) => unknown) | null;\n addEventListener?: (this: MessagePort, type: string, listener: (event: MessageEvent) => void) => void;\n removeEventListener?: (this: MessagePort, type: string, listener: (event: MessageEvent) => void) => void;\n };\n const add = target.addEventListener;\n const remove = target.removeEventListener;\n if (add && remove) {\n const before = target.onmessage;\n const probe = (): void => undefined;\n add.call(port, \"message\", probe);\n const overwritesProperty = target.onmessage === probe;\n remove.call(port, \"message\", probe);\n if (!overwritesProperty) {\n add.call(port, \"message\", listener);\n return () => remove.call(port, \"message\", listener);\n }\n\n const listeners = new Set<(event: MessageEvent) => void>();\n const dispatch = (event: MessageEvent): void => {\n before?.call(port, event);\n for (const current of [...listeners]) current(event);\n };\n target.addEventListener = function addMessageListener(type, current) {\n if (type === \"message\") listeners.add(current);\n else add.call(port, type, current);\n };\n target.removeEventListener = function removeMessageListener(type, current) {\n if (type === \"message\") listeners.delete(current);\n else remove.call(port, type, current);\n };\n target.onmessage = dispatch;\n listeners.add(listener);\n return () => listeners.delete(listener);\n }\n\n const listeners = new Set<(event: MessageEvent) => void>();\n const before = target.onmessage;\n const dispatch = (event: MessageEvent): void => {\n before?.call(port, event);\n for (const current of [...listeners]) current(event);\n };\n target.addEventListener = function addMessageListener(type, current) {\n if (type === \"message\") listeners.add(current);\n };\n target.removeEventListener = function removeMessageListener(type, current) {\n if (type === \"message\") listeners.delete(current);\n };\n target.onmessage = dispatch;\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nfunction post(port: MessagePort, message: unknown): void {\n try { port.postMessage(message); } catch { /* 端口已断开时由连接状态收敛。 */ }\n}\n\n/** 在当前 SharedWorkerGlobalScope 中安装唯一的 Worker Runtime。 */\nexport function startSharedWorkerApp(options: StartSharedWorkerAppOptions): SharedWorkerApp {\n if (!options || typeof options.id !== \"string\" || options.id.trim() === \"\") {\n throw new Error(\"SharedWorker runtime id must be a non-empty string\");\n }\n const workerScope = options.globalScope\n ?? (\"onconnect\" in globalThis\n ? globalThis as unknown as SharedWorkerScopeLike\n : undefined);\n if (!workerScope) {\n throw new RuntimeInitializationError({\n phase: \"validate\",\n error: \"startSharedWorkerApp must run in a SharedWorkerGlobalScope\",\n });\n }\n\n const runtimeId = options.id;\n const runtimeInstanceId = makeRuntimeInstanceId(runtimeId);\n const listeners = new Set<RuntimeStatusListener>();\n const endpoints = new Set<WorkerEndpoint>();\n const codec = createRuntimeMessageCodec();\n let runtimeState: Exclude<RuntimeAppState, \"connecting\" | \"disconnected\"> = \"starting\";\n let revision = 0;\n let host: PluginHost | undefined;\n let manifests: readonly PluginManifest[] = [];\n let disposed = false;\n let disposePromise: Promise<LifecycleDisposeResult> | undefined;\n\n const emit = (): void => {\n const snapshot = currentSnapshot();\n for (const listener of [...listeners]) {\n try { listener(snapshot); } catch { /* observer isolation */ }\n }\n };\n\n const currentSnapshot = (): RuntimeStatusSnapshot => Object.freeze({\n runtimeId,\n runtimeKind: \"shared-worker\",\n runtimeInstanceId,\n state: runtimeState,\n snapshotRevision: revision,\n units: Object.freeze(host && runtimeState !== \"failed\"\n ? manifests.flatMap((manifest) => {\n const state = host?.state(manifest.id);\n return (state?.units ?? []).map((unit) => ({\n pluginId: unit.pluginId,\n unitId: unit.unitId,\n runtime: unit.runtime,\n ...(unit.instanceId !== undefined ? { instanceId: unit.instanceId } : {}),\n state: unit.kind,\n } satisfies RuntimeSnapshotUnit));\n })\n : []),\n services: Object.freeze(host && runtimeState !== \"failed\" ? serviceReferences(\"\", revision) : []),\n });\n\n const serviceReferences = (connectionId: string, snapshotRevision: number): RemoteServiceReference[] => {\n if (!host || runtimeState === \"failed\" || runtimeState === \"disposed\") return [];\n const services: RemoteServiceReference[] = [];\n for (const manifest of manifests) {\n const state = host.state(manifest.id);\n const unit = manifest.units?.find((candidate) => candidate.id === state.unitId)\n ?? manifest.units?.[0];\n if (!unit || unit.runtime === undefined || !state.instanceId || state.kind !== \"enabled\") continue;\n const scopeId = host.scope(manifest.id)?.identity.scopeId ?? `scope:${state.instanceId}`;\n for (const capability of unit.provides ?? []) {\n services.push({\n capabilityId: capability,\n providerInstanceId: state.instanceId,\n runtime: unit.runtime,\n contractVersion: unit.providedContracts?.[capability] ?? `${capability}.v1`,\n authorityInstanceId: runtimeInstanceId,\n scopeId,\n handoverGeneration: 0,\n attributes: Object.freeze({}),\n status: \"ready\",\n snapshotRevision,\n // The same service object is never valid through another port.\n ...(connectionId ? { connectionId } : {}),\n });\n }\n }\n return services;\n };\n\n const runtimeSnapshotFor = (\n endpoint: Pick<WorkerEndpoint, \"connectionId\">,\n baseline: boolean,\n ): RuntimeSnapshot => ({\n type: RUNTIME_SNAPSHOT_TYPE,\n protocolVersion: RUNTIME_PROTOCOL_VERSION,\n runtimeId,\n runtimeKind: \"shared-worker\",\n runtimeInstanceId,\n connectionId: endpoint.connectionId,\n snapshotRevision: revision,\n baseline,\n state: runtimeState,\n units: currentSnapshot().units,\n services: serviceReferences(endpoint.connectionId, revision),\n });\n\n const serviceSnapshotFor = (\n endpoint: Pick<WorkerEndpoint, \"connectionId\">,\n baseline: boolean,\n ): RemoteServiceSnapshot => ({\n connectionId: endpoint.connectionId,\n authorityInstanceId: runtimeInstanceId,\n snapshotRevision: revision,\n baseline,\n services: serviceReferences(endpoint.connectionId, revision),\n });\n\n const publishEndpoint = (endpoint: WorkerEndpoint, baseline: boolean): void => {\n if (endpoint.closed || disposed) return;\n const serviceSnapshot = serviceSnapshotFor(endpoint, baseline);\n endpoint.provider.publishSnapshot(serviceSnapshot);\n post(endpoint.port, codec.encode(runtimeSnapshotFor(endpoint, baseline) as unknown as Record<string, unknown>));\n };\n\n const publishAll = (baseline = false): void => {\n for (const endpoint of [...endpoints]) publishEndpoint(endpoint, baseline);\n };\n\n const closeEndpoint = (endpoint: WorkerEndpoint, reason: string): void => {\n if (endpoint.closed) return;\n endpoint.closed = true;\n endpoints.delete(endpoint);\n endpoint.removeMessage();\n endpoint.provider.disconnect(reason);\n };\n\n const sendError = (\n port: MessagePort,\n code: RuntimeErrorMessage[\"code\"],\n message: string,\n details: { pluginId?: string; unitId?: string; phase?: string } = {},\n ): void => {\n const error: RuntimeErrorMessage = {\n type: RUNTIME_ERROR_TYPE,\n protocolVersion: RUNTIME_PROTOCOL_VERSION,\n code,\n message,\n ...(details.pluginId !== undefined ? { pluginId: details.pluginId } : {}),\n ...(details.unitId !== undefined ? { unitId: details.unitId } : {}),\n ...(details.phase !== undefined ? { phase: details.phase } : {}),\n };\n post(port, error);\n };\n\n const handleCall = async (\n connectionId: string,\n input: { message: RemoteServicePortCallMessage; signal: AbortSignal },\n ): Promise<unknown> => {\n if (!host || runtimeState !== \"ready\") throw new Error(\"SharedWorker Runtime is not ready\");\n const message = input.message;\n if (message.connectionId !== connectionId) throw new Error(\"Runtime connection mismatch\");\n const reference = message.reference;\n if (message.providerInstanceId !== reference.providerInstanceId\n || reference.authorityInstanceId !== runtimeInstanceId\n || reference.connectionId !== connectionId\n || reference.runtime !== \"shared-worker\"\n || reference.status !== \"ready\"\n || reference.snapshotRevision !== revision\n || reference.handoverGeneration !== 0) {\n throw new Error(\"Runtime service reference is stale\");\n }\n const manifest = manifests.find((candidate) => {\n const state = host?.state(candidate.id);\n return state?.instanceId === reference.providerInstanceId;\n });\n if (!manifest) throw new Error(\"Runtime service provider is no longer active\");\n const state = host.state(manifest.id);\n if (state.kind !== \"enabled\" || state.instanceId !== reference.providerInstanceId) {\n throw new Error(\"Runtime service provider is no longer active\");\n }\n const unit = manifest.units?.find((candidate) => candidate.id === state.unitId);\n if (!unit || unit.runtime !== \"shared-worker\" || !unit.provides?.includes(reference.capabilityId)) {\n throw new Error(\"Runtime capability is not declared\");\n }\n const expectedScopeId = host.scope(manifest.id)?.identity.scopeId ?? `scope:${state.instanceId}`;\n if (reference.scopeId !== expectedScopeId) throw new Error(\"Runtime service scope is stale\");\n const expectedVersion = unit.providedContracts?.[reference.capabilityId] ?? `${reference.capabilityId}.v1`;\n if (expectedVersion !== reference.contractVersion) throw new Error(\"Runtime capability contract mismatch\");\n const value = host.capabilities.get<unknown>(reference.capabilityId);\n if (input.signal.aborted) throw input.signal.reason ?? new Error(\"Runtime service request cancelled\");\n const request = message.request as unknown;\n if (typeof value === \"function\") return await (value as (request: unknown, signal: AbortSignal) => unknown)(request, input.signal);\n if (value && typeof value === \"object\") {\n const object = value as Record<string, unknown>;\n if (typeof object.handle === \"function\") return await (object.handle as (request: unknown, signal: AbortSignal) => unknown)(request, input.signal);\n if (request && typeof request === \"object\" && typeof (request as { method?: unknown }).method === \"string\") {\n const method = (request as { method: string }).method;\n const methodValue = object[method];\n if (typeof methodValue === \"function\") {\n const args = (request as { args?: unknown[] }).args;\n return await (methodValue as (...args: unknown[]) => unknown)(...(Array.isArray(args) ? args : []));\n }\n }\n }\n throw new Error(`Runtime capability \"${reference.capabilityId}\" does not expose an RPC handler`);\n };\n\n const attachPort = (port: MessagePort): void => {\n let endpoint: WorkerEndpoint | undefined;\n let helloSeen = false;\n let removeMessage: () => void = () => undefined;\n const onMessage = (event: MessageEvent): void => {\n if (endpoint?.closed) return;\n const decoded = codec.decode(event.data);\n if (!helloSeen) {\n if (!isRuntimeHello(event.data)) return;\n const hello = event.data as RuntimeHelloMessage;\n helloSeen = true;\n if (hello.protocolVersion !== RUNTIME_PROTOCOL_VERSION) {\n sendError(port, \"runtime.protocol_mismatch\", \"Runtime protocol version mismatch\", { phase: \"handshake\" });\n try { port.close(); } catch { /* noop */ }\n return;\n }\n if (hello.runtimeId !== runtimeId) {\n sendError(port, \"runtime.invalid_connection\", \"Runtime id mismatch\", { phase: \"handshake\" });\n try { port.close(); } catch { /* noop */ }\n return;\n }\n if (runtimeState === \"failed\") {\n const detail = startupDetails(startupError);\n sendError(port, \"runtime.initialization_failed\", detail.message, {\n pluginId: detail.pluginId,\n unitId: detail.unitId,\n phase: \"startup\",\n });\n try { port.close(); } catch { /* noop */ }\n return;\n }\n if (runtimeState === \"stopping\" || runtimeState === \"disposed\") {\n sendError(port, \"runtime.invalid_connection\", \"SharedWorker Runtime is no longer accepting connections\", { phase: \"handshake\" });\n try { port.close(); } catch { /* noop */ }\n return;\n }\n if (endpointsHasConnection(hello.connectionId)) {\n sendError(port, \"runtime.invalid_connection\", \"Connection id is already active\", { phase: \"handshake\" });\n try { port.close(); } catch { /* noop */ }\n return;\n }\n const candidate = { port, connectionId: hello.connectionId } as WorkerEndpoint;\n const provider = createMessagePortServiceProvider({\n port,\n codec,\n handshake: {\n connectionId: hello.connectionId,\n authorityInstanceId: runtimeInstanceId,\n protocolVersion: RUNTIME_PROTOCOL_VERSION,\n },\n snapshot: serviceSnapshotFor(candidate, true),\n handleCall: (input) => handleCall(hello.connectionId, input),\n });\n endpoint = { ...candidate, provider, removeMessage, closed: false };\n endpoints.add(endpoint);\n if (runtimeState === \"ready\") publishEndpoint(endpoint, true);\n return;\n }\n if (!endpoint) return;\n if (isRuntimeResync(event.data)) {\n if (event.data.connectionId === endpoint.connectionId) publishEndpoint(endpoint, true);\n return;\n }\n if (decoded?.type === codec.type(\"disconnect\")) {\n closeEndpoint(endpoint, typeof decoded.reason === \"string\" ? decoded.reason : \"Window disconnected\");\n }\n };\n removeMessage = addPortListener(port, onMessage);\n port.start();\n };\n\n const endpointsHasConnection = (connectionId: string): boolean => (\n [...endpoints].some((endpoint) => endpoint.connectionId === connectionId)\n );\n let startupError: unknown;\n\n // Install onconnect before asynchronous plugin startup so the browser never\n // loses an initial port. Ports remain pending until the Host is ready.\n workerScope.onconnect = (event) => {\n try {\n options.onPortConnect?.(event);\n } catch (error) {\n // The existing product protocol is allowed to install listeners before\n // WebLoom attaches its own Runtime listener. If that migration hook\n // fails, none of the event's ports may remain in an unowned pending\n // state: notify every Window with the same structured initialization\n // error, then close every physical port without calling attachPort().\n const detail = startupDetails(error);\n for (const port of event.ports ?? []) {\n sendError(port, \"runtime.initialization_failed\", detail.message, {\n pluginId: detail.pluginId,\n unitId: detail.unitId,\n phase: \"handshake\",\n });\n }\n for (const port of event.ports ?? []) {\n try { port.close(); } catch { /* noop */ }\n }\n return;\n }\n for (const port of event.ports ?? []) attachPort(port);\n };\n\n let materialized: ReturnType<typeof materializePluginDefinitions> = [];\n let readyPromise: Promise<void>;\n try {\n materialized = materializePluginDefinitions(options.plugins, \"shared-worker\");\n manifests = materialized.map((item) => item.manifest);\n const implementations = createRuntimeUnitImplementationRegistry(\n materialized.map((item) => ({\n pluginId: item.manifest.id,\n unitId: item.unitId,\n setup: item.setup,\n })),\n );\n const { id: _id, plugins: _plugins, globalScope: _scope, onPortConnect: _onPortConnect, ...hostOptions } = options;\n host = createPluginHost({\n ...hostOptions,\n runtime: \"shared-worker\",\n rootAttributes: {\n ...(hostOptions.rootAttributes ?? {}),\n runtimeId,\n runtimeInstanceId,\n },\n runtimeUnitImplementationRegistry: implementations,\n });\n host.subscribe(() => {\n if (runtimeState !== \"ready\" || disposed) return;\n revision += 1;\n publishAll(false);\n emit();\n });\n readyPromise = host.registerAll(manifests).then(() => {\n if (disposed) return;\n const runtimeHost = host;\n if (!runtimeHost) throw new Error(\"SharedWorker Plugin Host is unavailable\");\n const failedRequired = manifests.find((manifest) => {\n const required = manifest.meta.startup === \"required\" || manifest.meta.canDisable === false;\n return required && runtimeHost.state(manifest.id).kind !== \"enabled\";\n });\n if (failedRequired) {\n const state = runtimeHost.state(failedRequired.id);\n throw new StartupPluginError({\n pluginId: failedRequired.id,\n unitId: state.unitId ?? failedRequired.units?.[0]?.id ?? failedRequired.id,\n capabilities: [],\n state: state.kind,\n error: state.error ?? `Required plugin is ${state.kind}${state.blockedBy ? `: ${state.blockedBy.join(\", \")}` : \"\"}`,\n });\n }\n runtimeState = \"ready\";\n revision = Math.max(1, revision + 1);\n publishAll(true);\n emit();\n }).catch((error) => {\n startupError = error;\n runtimeState = \"failed\";\n emit();\n const detail = startupDetails(error);\n for (const endpoint of [...endpoints]) {\n sendError(endpoint.port, \"runtime.initialization_failed\", detail.message, {\n pluginId: detail.pluginId,\n unitId: detail.unitId,\n phase: \"startup\",\n });\n closeEndpoint(endpoint, \"Runtime initialization failed\");\n }\n throw new RuntimeInitializationError({\n pluginId: detail.pluginId,\n unitId: detail.unitId,\n phase: \"startup\",\n error: detail.message,\n });\n });\n } catch (error) {\n startupError = error;\n runtimeState = \"failed\";\n emit();\n readyPromise = Promise.reject(error instanceof RuntimeInitializationError\n ? error\n : new RuntimeInitializationError({ phase: \"validate\", error: errorMessage(error) }));\n }\n\n const app: SharedWorkerApp = {\n runtimeKind: \"shared-worker\",\n runtimeId,\n runtimeInstanceId,\n ready: () => readyPromise,\n async reconcile() {\n if (!host) {\n await readyPromise;\n return;\n }\n if (runtimeState === \"failed\" || runtimeState === \"disposed\" || disposed) {\n await readyPromise;\n return;\n }\n await host.reconcile();\n },\n state: currentSnapshot,\n subscribe(listener) {\n listeners.add(listener);\n listener(currentSnapshot());\n return () => listeners.delete(listener);\n },\n dispose(reason = \"shared worker runtime disposed\") {\n if (disposePromise) return disposePromise;\n disposed = true;\n runtimeState = \"stopping\";\n emit();\n disposePromise = (async () => {\n for (const endpoint of [...endpoints]) closeEndpoint(endpoint, reason);\n const result = host\n ? await host.dispose(reason)\n : { scopeId: `runtime:${runtimeInstanceId}`, state: \"stopped\" as const, attempted: 0, released: 0, pending: [], errors: [], cleanupIncomplete: false };\n runtimeState = \"disposed\";\n emit();\n return result;\n })();\n return disposePromise;\n },\n };\n return app;\n}\n","import type {\n RemoteServiceCallContext,\n RemoteServiceTransport,\n} from \"../contracts/lifecycle.js\";\nimport { createServiceBridge } from \"../transport/serviceBridge.js\";\nimport { createMessagePortServiceTransport } from \"../transport/messagePortServiceTransport.js\";\nimport {\n createRuntimeMessageCodec,\n isRuntimeError,\n isRuntimeSnapshot,\n RUNTIME_ERROR_TYPE,\n RUNTIME_HELLO_TYPE,\n RUNTIME_PROTOCOL_VERSION,\n type RuntimeErrorMessage,\n type RuntimeSnapshot,\n} from \"./runtimeProtocol.js\";\nimport {\n RuntimeInitializationError,\n RuntimeUnavailableError,\n type RuntimeHandle,\n type RuntimeStatusListener,\n type RuntimeStatusSnapshot,\n} from \"./runtimeTypes.js\";\n\nexport interface SharedWorkerLike {\n readonly port: MessagePort;\n onerror?: (event: Event) => void;\n /** 浏览器 SharedWorker 的错误事件;测试 fake 可省略。 */\n addEventListener?(type: \"error\", listener: (event: Event) => void): void;\n removeEventListener?(type: \"error\", listener: (event: Event) => void): void;\n}\n\nexport type SharedWorkerFactory = (\n url: string | URL,\n options: { type: \"module\"; name?: string },\n) => SharedWorkerLike;\n\n/**\n * 供仍需在同一物理连接上承载产品 RPC 的装配层使用。\n *\n * 普通调用方不需要这个接缝;它们只使用 RuntimeHandle 的状态和\n * serviceBridge。已有大量领域 RPC 的应用迁移时可以先把\n * Runtime 握手与旧 RPC 复用同一 MessagePort,再逐步把领域调用收敛到\n * capability service,而不会偷偷创建第二个 SharedWorker 连接。\n */\nexport interface SharedWorkerConnectionContext {\n readonly worker: SharedWorkerLike;\n readonly port: MessagePort;\n readonly connectionId: string;\n}\n\nexport interface ConnectSharedWorkerOptions {\n /** Worker 入口的逻辑 Runtime 标识。 */\n id: string;\n /** module SharedWorker URL;默认直接传给 new SharedWorker。 */\n url: string | URL;\n /** 可选的浏览器 SharedWorker name;不传时由 URL 参与实例隔离。 */\n name?: string;\n /** 断线后是否建立新连接;旧代理仍永久失效。默认为 true。 */\n autoReconnect?: boolean;\n /** 自动重连等待毫秒数。 */\n reconnectDelayMs?: number;\n /** 首个 runtime snapshot 到达前的握手超时;默认 10000ms。 */\n handshakeTimeoutMs?: number;\n /** 测试 fixture 使用;生产默认使用 globalThis.SharedWorker。 */\n workerFactory?: SharedWorkerFactory;\n /**\n * 每次建立实际物理连接时调用一次;自动重连会再次调用。\n * 回调可以在同一端口上安装产品协议,但不得替换 Runtime 的消息\n * 监听器,也不得把旧端口保存为可重用连接。\n */\n onConnection?: (context: SharedWorkerConnectionContext) => void | Promise<void>;\n}\n\nfunction makeConnectionId(runtimeId: string): string {\n try {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return `${runtimeId}:connection:${crypto.randomUUID()}`;\n }\n } catch {\n // connection id is not an authorization secret.\n }\n return `${runtimeId}:connection:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\ninterface Deferred<T> {\n promise: Promise<T>;\n settled: boolean;\n resolve(value: T): void;\n reject(error: unknown): void;\n}\n\ninterface ConnectionResources {\n readonly generation: number;\n readonly worker: SharedWorkerLike;\n readonly port: MessagePort;\n readonly connectionId: string;\n removeMessage?: () => void;\n removeWorkerError?: () => void;\n transport?: RemoteServiceTransport & { dispose(): void };\n handshakeTimer?: ReturnType<typeof setTimeout>;\n cleaned: boolean;\n}\n\nfunction createDeferred<T>(): Deferred<T> {\n let resolvePromise!: (value: T) => void;\n let rejectPromise!: (error: unknown) => void;\n const deferred: Deferred<T> = {\n promise: new Promise<T>((resolve, reject) => {\n resolvePromise = resolve;\n rejectPromise = reject;\n }),\n settled: false,\n resolve(value) {\n if (deferred.settled) return;\n deferred.settled = true;\n resolvePromise(value);\n },\n reject(error) {\n if (deferred.settled) return;\n deferred.settled = true;\n rejectPromise(error);\n },\n };\n return deferred;\n}\n\nfunction post(port: MessagePort, message: unknown): void {\n try { port.postMessage(message); } catch { /* disconnect path converges through state */ }\n}\n\nfunction addMessageListener(port: MessagePort, listener: (event: MessageEvent) => void): () => void {\n // 真实 MessagePort 的 onmessage 与 addEventListener 可以并存;测试宿主\n // 和少数嵌入环境可能把 addEventListener 简化成覆盖 onmessage。检测这\n // 一类实现并保留已有领域 listener,避免 Runtime 握手吞掉产品协议。\n const before = port.onmessage;\n port.addEventListener(\"message\", listener);\n if (port.onmessage === listener && before && before !== listener) {\n port.removeEventListener(\"message\", listener);\n const composed = (event: MessageEvent): void => {\n before.call(port, event);\n listener(event);\n };\n port.addEventListener(\"message\", composed);\n return () => port.removeEventListener(\"message\", composed);\n }\n return () => port.removeEventListener(\"message\", listener);\n}\n\n/**\n * 保留标准 MessagePort API;极简测试宿主有时只实现 onmessage。这个适配\n * 只补 listener 注册面,不改变真实浏览器端口或其消息语义。\n */\nfunction ensureMessageEventTarget(port: MessagePort): void {\n const target = port as unknown as {\n onmessage: ((this: MessagePort, event: MessageEvent) => unknown) | null;\n addEventListener?: (this: MessagePort, type: string, listener: (event: MessageEvent) => void) => void;\n removeEventListener?: (this: MessagePort, type: string, listener: (event: MessageEvent) => void) => void;\n };\n const add = target.addEventListener;\n const remove = target.removeEventListener;\n if (add && remove) {\n // Detect a minimal fake whose addEventListener implementation overwrites\n // onmessage. Standard MessagePort leaves the property untouched.\n const before = target.onmessage;\n const probe = (): void => undefined;\n add.call(port, \"message\", probe);\n const overwritesProperty = target.onmessage === probe;\n remove.call(port, \"message\", probe);\n if (!overwritesProperty) return;\n const listeners = new Set<(event: MessageEvent) => void>();\n const dispatch = (event: MessageEvent): void => {\n before?.call(port, event);\n for (const listener of [...listeners]) listener(event);\n };\n target.addEventListener = function addMessageListener(type, listener) {\n if (type === \"message\") listeners.add(listener);\n else add.call(port, type, listener);\n };\n target.removeEventListener = function removeMessageListener(type, listener) {\n if (type === \"message\") listeners.delete(listener);\n else remove.call(port, type, listener);\n };\n target.onmessage = dispatch;\n return;\n }\n\n const listeners = new Set<(event: MessageEvent) => void>();\n const original = target.onmessage;\n const dispatch = (event: MessageEvent): void => {\n original?.call(port, event);\n for (const listener of [...listeners]) listener(event);\n };\n target.addEventListener = function addMessageListener(type, listener) {\n if (type === \"message\") listeners.add(listener);\n };\n target.removeEventListener = function removeMessageListener(type, listener) {\n if (type === \"message\") listeners.delete(listener);\n };\n target.onmessage = dispatch;\n}\n\nfunction makeWorker(options: ConnectSharedWorkerOptions): SharedWorkerLike {\n const workerOptions = {\n type: \"module\" as const,\n ...(options.name ? { name: options.name } : {}),\n };\n if (options.workerFactory) return options.workerFactory(options.url, workerOptions);\n const WorkerConstructor = (globalThis as unknown as {\n SharedWorker?: new (url: string | URL, options: { type: \"module\"; name?: string }) => SharedWorkerLike;\n }).SharedWorker;\n if (!WorkerConstructor) throw new RuntimeUnavailableError(\"SharedWorker is not supported by this browser\");\n return new WorkerConstructor(options.url, workerOptions);\n}\n\n/**\n * 从 Window 连接真实 module SharedWorker。\n *\n * Promise 只在首个完整 baseline 快照到达后成功;调用方得到的代理均绑定\n * 当前 connection/runtime/provider/revision,断线或重启不会静默换绑旧代理。\n */\nexport async function connectSharedWorker(options: ConnectSharedWorkerOptions): Promise<RuntimeHandle> {\n if (!options || typeof options.id !== \"string\" || options.id.trim() === \"\") {\n throw new Error(\"SharedWorker runtime id must be a non-empty string\");\n }\n const codec = createRuntimeMessageCodec();\n const listeners = new Set<RuntimeStatusListener>();\n const autoReconnect = options.autoReconnect ?? true;\n const reconnectDelayMs = Math.max(0, options.reconnectDelayMs ?? 25);\n const handshakeTimeoutMs = Math.max(1, options.handshakeTimeoutMs ?? 10_000);\n let disposed = false;\n let currentWorker: SharedWorkerLike | undefined;\n let currentPort: MessagePort | undefined;\n let currentTransport: (RemoteServiceTransport & { dispose(): void }) | undefined;\n let removeMessage: (() => void) | undefined;\n let removeWorkerError: (() => void) | undefined;\n let handshakeTimer: ReturnType<typeof setTimeout> | undefined;\n let reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n let connectionGeneration = 0;\n let currentConnection: ConnectionResources | undefined;\n let readyDeferred = createDeferred<void>();\n let initialConnection = true;\n let runtimeInstanceId: string | undefined;\n let connectionId: string | undefined;\n let currentSnapshot: RuntimeStatusSnapshot = {\n runtimeId: options.id,\n runtimeKind: \"shared-worker\",\n runtimeInstanceId: \"\",\n state: \"connecting\",\n snapshotRevision: 0,\n units: [],\n services: [],\n };\n\n const bridgeTransport: RemoteServiceTransport = {\n call<TRequest, TResult>(request: TRequest, context: RemoteServiceCallContext): Promise<TResult> {\n if (!currentTransport) return Promise.reject(new RuntimeUnavailableError(\"SharedWorker connection is unavailable\"));\n return currentTransport.call<TRequest, TResult>(request, context);\n },\n };\n const bridge = createServiceBridge({ protocolVersion: RUNTIME_PROTOCOL_VERSION, transport: bridgeTransport });\n\n const emit = (next: RuntimeStatusSnapshot): void => {\n currentSnapshot = Object.freeze({\n ...next,\n units: Object.freeze([...next.units]),\n services: Object.freeze([...next.services]),\n });\n for (const listener of [...listeners]) {\n try { listener(currentSnapshot); } catch { /* observer isolation */ }\n }\n };\n\n const rejectReady = (error: unknown): void => {\n readyDeferred.reject(error);\n // A rejected readiness is also exposed through RuntimeHandle.ready() after\n // the transition. Mark the promise as observed here so a caller that only\n // subscribes to state does not create an unhandled-rejection noise source.\n void readyDeferred.promise.catch(() => undefined);\n };\n\n const beginReadinessGeneration = (reason: string): void => {\n rejectReady(new RuntimeUnavailableError(reason));\n readyDeferred = createDeferred<void>();\n };\n\n const replaceWithRejectedReadiness = (error: unknown): void => {\n rejectReady(error);\n readyDeferred = createDeferred<void>();\n rejectReady(error);\n };\n\n const scheduleReconnect = (): void => {\n if (disposed || !autoReconnect || reconnectTimer !== undefined) return;\n reconnectTimer = setTimeout(() => {\n reconnectTimer = undefined;\n void openConnection().catch((error) => {\n if (disposed) return;\n // makeWorker() can fail before a port exists (bad URL/unsupported\n // constructor). Settle this connection generation as well; it must not\n // leave callers waiting on a forever-pending ready() promise.\n if (currentSnapshot.state !== \"disconnected\") {\n emit({ ...currentSnapshot, state: \"disconnected\", error: errorMessage(error), units: [], services: [] });\n }\n rejectReady(error);\n beginReadinessGeneration(\"SharedWorker reconnecting\");\n scheduleReconnect();\n });\n }, reconnectDelayMs);\n };\n\n const cleanupConnection = (connection: ConnectionResources | undefined): void => {\n if (!connection || connection.cleaned) return;\n connection.cleaned = true;\n const timer = connection.handshakeTimer;\n const removeMessageForConnection = connection.removeMessage;\n const removeWorkerErrorForConnection = connection.removeWorkerError;\n const transport = connection.transport;\n if (timer !== undefined) clearTimeout(timer);\n connection.handshakeTimer = undefined;\n removeMessageForConnection?.();\n connection.removeMessage = undefined;\n removeWorkerErrorForConnection?.();\n connection.removeWorkerError = undefined;\n transport?.dispose();\n connection.transport = undefined;\n if (currentConnection === connection) currentConnection = undefined;\n if (currentWorker === connection.worker) currentWorker = undefined;\n if (currentPort === connection.port) currentPort = undefined;\n if (currentTransport === transport) currentTransport = undefined;\n if (removeMessage === removeMessageForConnection) removeMessage = undefined;\n if (removeWorkerError === removeWorkerErrorForConnection) removeWorkerError = undefined;\n if (handshakeTimer === timer) handshakeTimer = undefined;\n try { connection.port.close(); } catch { /* noop */ }\n };\n\n const disconnect = (reason: string, failure?: unknown, fatal = false): void => {\n if (disposed) return;\n const connection = currentConnection;\n const port = connection?.port ?? currentPort;\n cleanupConnection(connection);\n currentTransport = undefined;\n currentWorker = undefined;\n currentPort = undefined;\n connectionId = undefined;\n bridge.disconnect(reason);\n emit({\n ...currentSnapshot,\n state: fatal ? \"failed\" : \"disconnected\",\n error: failure ? errorMessage(failure) : reason,\n runtimeInstanceId: \"\",\n connectionId: undefined,\n units: [],\n services: [],\n });\n runtimeInstanceId = undefined;\n const unavailable = failure ?? new RuntimeUnavailableError(reason);\n if (!initialConnection && !fatal && autoReconnect) {\n beginReadinessGeneration(\"SharedWorker reconnecting\");\n scheduleReconnect();\n } else {\n // No new baseline can make this generation ready. Replace the current\n // promise as well as rejecting the old one so ready() called after a\n // terminal/non-reconnecting transition remains rejected.\n replaceWithRejectedReadiness(unavailable);\n }\n };\n\n const onRuntimeError = (message: RuntimeErrorMessage): void => {\n const error = new RuntimeInitializationError({\n pluginId: message.pluginId,\n unitId: message.unitId,\n phase: message.phase === \"handshake\" ? \"handshake\" : \"startup\",\n error: message.message,\n });\n const fatal = message.code === \"runtime.protocol_mismatch\"\n || message.code === \"runtime.initialization_failed\";\n disconnect(message.message, error, fatal);\n };\n\n const onSnapshot = (snapshot: RuntimeSnapshot): void => {\n if (snapshot.runtimeId !== options.id || snapshot.connectionId !== connectionId) return;\n if (snapshot.runtimeKind !== \"shared-worker\") {\n onRuntimeError({\n type: RUNTIME_ERROR_TYPE,\n protocolVersion: RUNTIME_PROTOCOL_VERSION,\n code: \"runtime.protocol_mismatch\",\n message: \"Connected Runtime is not a SharedWorker Runtime\",\n phase: \"handshake\",\n });\n return;\n }\n const isNewAuthority = runtimeInstanceId !== snapshot.runtimeInstanceId;\n if (isNewAuthority || bridge.state === \"disconnected\") {\n const result = bridge.handshake({\n connectionId: snapshot.connectionId,\n authorityInstanceId: snapshot.runtimeInstanceId,\n protocolVersion: snapshot.protocolVersion,\n });\n if (!result.accepted) {\n onRuntimeError({\n type: RUNTIME_ERROR_TYPE,\n protocolVersion: RUNTIME_PROTOCOL_VERSION,\n code: \"runtime.protocol_mismatch\",\n message: \"Runtime protocol version mismatch\",\n phase: \"handshake\",\n });\n return;\n }\n }\n runtimeInstanceId = snapshot.runtimeInstanceId;\n const applied = bridge.applySnapshot({\n connectionId: snapshot.connectionId,\n authorityInstanceId: snapshot.runtimeInstanceId,\n snapshotRevision: snapshot.snapshotRevision,\n baseline: snapshot.baseline,\n services: snapshot.services,\n });\n if (!applied.accepted) {\n if (applied.reason === \"revision-gap\" || applied.reason === \"baseline-required\") {\n beginReadinessGeneration(`Runtime snapshot ${applied.reason}`);\n emit({\n ...currentSnapshot,\n state: \"disconnected\",\n error: `Runtime snapshot ${applied.reason}`,\n units: [],\n services: [],\n });\n const port = currentPort;\n if (port && connectionId) post(port, { type: \"webloom.runtime.resync\", connectionId });\n }\n return;\n }\n emit({\n runtimeId: snapshot.runtimeId,\n runtimeKind: snapshot.runtimeKind,\n runtimeInstanceId: snapshot.runtimeInstanceId,\n state: snapshot.state === \"ready\" ? \"ready\" : snapshot.state,\n snapshotRevision: snapshot.snapshotRevision,\n connectionId: snapshot.connectionId,\n units: snapshot.units,\n services: snapshot.services,\n });\n if (snapshot.baseline && snapshot.state === \"ready\" && bridge.state === \"ready\") {\n if (handshakeTimer !== undefined) clearTimeout(handshakeTimer);\n handshakeTimer = undefined;\n readyDeferred.resolve(undefined);\n initialConnection = false;\n }\n };\n\n async function openConnection(): Promise<void> {\n if (disposed) return;\n const generation = ++connectionGeneration;\n if (readyDeferred.settled) readyDeferred = createDeferred<void>();\n let connection: ConnectionResources | undefined;\n try {\n const worker = makeWorker(options);\n const port = worker.port;\n const nextConnectionId = makeConnectionId(options.id);\n connection = {\n generation,\n worker,\n port,\n connectionId: nextConnectionId,\n cleaned: false,\n };\n currentConnection = connection;\n currentWorker = worker;\n currentPort = port;\n connectionId = nextConnectionId;\n emit({\n ...currentSnapshot,\n state: \"connecting\",\n connectionId: nextConnectionId,\n error: undefined,\n });\n\n // This callback runs before WebLoom installs its own listeners so an\n // existing product protocol can share the same physical port. A thrown\n // callback is still a failed physical connection: the generation owns\n // the port from this point and must close it before rejecting ready().\n await options.onConnection?.({\n worker,\n port,\n connectionId: nextConnectionId,\n });\n if (disposed || currentConnection !== connection) {\n cleanupConnection(connection);\n return;\n }\n\n ensureMessageEventTarget(port);\n connection.transport = createMessagePortServiceTransport({ port, codec });\n currentTransport = connection.transport;\n const onWorkerError = (event: Event): void => {\n if (disposed || generation !== connectionGeneration || worker !== currentWorker) return;\n disconnect(`SharedWorker error${event.type ? `: ${event.type}` : \"\"}`);\n };\n if (worker.addEventListener) {\n worker.addEventListener(\"error\", onWorkerError);\n connection.removeWorkerError = () => worker.removeEventListener?.(\"error\", onWorkerError);\n removeWorkerError = connection.removeWorkerError;\n } else {\n const workerWithOnError = worker as SharedWorkerLike & {\n onerror?: (event: Event) => void;\n };\n const previousOnError = workerWithOnError.onerror;\n const composedOnError = (event: Event): void => {\n previousOnError?.(event);\n onWorkerError(event);\n };\n workerWithOnError.onerror = composedOnError;\n connection.removeWorkerError = () => {\n if (workerWithOnError.onerror === composedOnError) workerWithOnError.onerror = previousOnError;\n };\n removeWorkerError = connection.removeWorkerError;\n }\n const onMessage = (event: MessageEvent): void => {\n if (disposed || generation !== connectionGeneration || port !== currentPort) return;\n if (isRuntimeError(event.data)) {\n onRuntimeError(event.data);\n return;\n }\n if (isSnapshot(event.data)) {\n onSnapshot(event.data);\n return;\n }\n const decoded = codec.decode(event.data);\n if (decoded?.type === codec.type(\"disconnect\")) {\n disconnect(typeof decoded.reason === \"string\" ? decoded.reason : \"SharedWorker disconnected\");\n }\n };\n connection.removeMessage = addMessageListener(port, onMessage);\n removeMessage = connection.removeMessage;\n port.start();\n const timer = setTimeout(() => {\n if (disposed || generation !== connectionGeneration || port !== currentPort) return;\n const error = new RuntimeInitializationError({\n phase: \"handshake\",\n error: `SharedWorker handshake timed out after ${handshakeTimeoutMs}ms`,\n });\n disconnect(error.message, error, false);\n }, handshakeTimeoutMs);\n connection.handshakeTimer = timer;\n handshakeTimer = timer;\n post(port, {\n type: RUNTIME_HELLO_TYPE,\n protocolVersion: RUNTIME_PROTOCOL_VERSION,\n connectionId: nextConnectionId,\n runtimeId: options.id,\n });\n await readyDeferred.promise;\n } catch (error) {\n // disconnect() already owns cleanup and reconnection when the failure\n // came from a live connection (handshake/error/runtime message). For a\n // callback/setup failure, no RuntimeHandle exists yet, so this catch is\n // the last safe owner of the generation's physical port.\n if (connection && !connection.cleaned && currentConnection === connection) {\n disconnect(\"SharedWorker connection setup failed\", error, false);\n } else if (connection && !connection.cleaned) {\n cleanupConnection(connection);\n } else if (!connection && !disposed && initialConnection) {\n replaceWithRejectedReadiness(error);\n }\n throw error;\n }\n }\n\n function isSnapshot(input: unknown): input is RuntimeSnapshot {\n return isRuntimeSnapshot(input);\n }\n\n const app: RuntimeHandle = {\n runtimeKind: \"shared-worker\",\n runtimeId: options.id,\n serviceBridge: bridge,\n get runtimeInstanceId() { return runtimeInstanceId; },\n get connectionId() { return connectionId; },\n state: () => currentSnapshot,\n ready: () => readyDeferred.promise,\n capability<T = unknown>(capabilityId: string, capabilityOptions: { contractVersion?: string } = {}) {\n if (disposed || currentSnapshot.state !== \"ready\") {\n throw new RuntimeUnavailableError(`Capability \"${capabilityId}\" is not ready`);\n }\n return bridge.requireProxy({\n capabilityId,\n contractVersion: capabilityOptions.contractVersion ?? `${capabilityId}.v1`,\n }) as ReturnType<typeof bridge.requireProxy> & { readonly serviceType?: T };\n },\n subscribe(listener) {\n listeners.add(listener);\n listener(currentSnapshot);\n return () => listeners.delete(listener);\n },\n dispose(reason = \"SharedWorker connection disposed\") {\n if (disposed) return Promise.resolve();\n disposed = true;\n if (reconnectTimer !== undefined) clearTimeout(reconnectTimer);\n replaceWithRejectedReadiness(new RuntimeUnavailableError(reason));\n const connection = currentConnection;\n const port = connection?.port ?? currentPort;\n if (port) post(port, codec.encode({ type: codec.type(\"disconnect\"), reason }));\n cleanupConnection(connection);\n currentWorker = undefined;\n currentPort = undefined;\n connectionId = undefined;\n runtimeInstanceId = undefined;\n currentTransport?.dispose();\n currentTransport = undefined;\n bridge.disconnect(reason);\n emit({\n ...currentSnapshot,\n state: \"disposed\",\n runtimeInstanceId: \"\",\n connectionId: undefined,\n units: [],\n services: [],\n });\n return Promise.resolve();\n },\n };\n\n try {\n await openConnection();\n } catch (error) {\n if (!disposed) {\n emit({ ...currentSnapshot, state: \"failed\", error: errorMessage(error) });\n }\n throw error;\n }\n return app;\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"]}
1
+ {"version":3,"sources":["../src/contracts/plugin.ts","../src/authoring/definePlugin.ts","../src/runtime/pluginDefinitions.ts","../src/runtime/windowRuntime.ts","../src/transport/messagePortServiceProvider.ts","../src/runtime/sharedWorkerHost.ts","../src/lifecycle/permissionVerifier.ts","../src/lifecycle/scopedRegistry.ts","../src/lifecycle/upgradeGate.ts"],"names":["errorMessage","call","makeRuntimeInstanceId","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 PluginPermission,\n PermissionLease,\n RemoteServiceBridge,\n RuntimeKind,\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/** v1 运行时依赖;跨 Runtime 绑定必须使用精确契约版本和来源 Runtime。 */\nexport interface RuntimeDependency {\n /** 依赖的 capability 标识。 */\n capability: string;\n /** 精确契约版本;跨 Runtime 依赖必须显式填写,本地可由 helper 推导。 */\n contractVersion?: string;\n /** 提供者实际运行空间;省略时由当前 Runtime 补齐。 */\n sourceRuntime?: RuntimeKind;\n /** 可选的人类可读诊断说明。 */\n reason?: string;\n /** 缺失时只关闭局部能力,不阻止主体运行。 */\n optional?: boolean;\n}\n\n/** 简单插件的产品级依赖别名。 */\nexport type PluginDependency = RuntimeDependency;\n\n/** 运行单元的严格依赖描述。 */\nexport interface RuntimeUnitDependency {\n /** 依赖的 capability 标识。 */\n capability: string;\n /** 精确契约版本;第一阶段只接受完全匹配。 */\n contractVersion: string;\n /** 提供者实际运行空间;跨 Runtime 依赖在 materialize/validate 边界必须补齐。 */\n sourceRuntime: RuntimeKind;\n /** 可选的人类可读诊断说明。 */\n reason?: string;\n /** 缺失时只关闭局部能力;未填写表示硬依赖。 */\n optional?: boolean;\n}\n\n/** 作者入口的未归一化 unit 依赖;进入 Host 前必须补齐版本和来源 Runtime。 */\nexport type RuntimeUnitDependencyInput = Omit<RuntimeUnitDependency, \"contractVersion\" | \"sourceRuntime\"> & {\n contractVersion?: string;\n sourceRuntime?: RuntimeKind;\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: { sourceRuntime: RuntimeKind },\n): RuntimeUnitDependency[] {\n return dependencies.map((dependency) => ({\n capability: dependency.capability,\n contractVersion: runtimeCapabilityContractVersion(dependency.capability),\n sourceRuntime: defaults.sourceRuntime,\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/** 插件装配元数据;v1 不解释产品分类字段。 */\nexport interface PluginMeta {\n /** 首次装配时默认是否启用。 */\n defaultEnabled: boolean;\n /** 是否允许产品控制面禁用。 */\n canDisable: boolean;\n /** 是否属于启动必需插件。 */\n startup?: PluginStartupMode;\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 /** 运行代码所在真实 Runtime。 */\n runtime: RuntimeKind;\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/** 作者入口的未归一化运行单元;runtime 可由 createWindowApp/startSharedWorkerApp 注入。 */\nexport type RuntimeUnitDescriptorInput<\n TContribution = PluginContribution,\n TConfig extends PluginConfig = PluginConfig,\n> = Omit<RuntimeUnitDescriptor<TContribution, TConfig>, \"runtime\" | \"dependencies\"> & {\n runtime?: RuntimeKind;\n dependencies?: readonly RuntimeUnitDependencyInput[];\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/** 作者入口的未归一化静态清单;进入 Host 前必须 materialize 成 PluginManifest。 */\nexport type PluginManifestInput<\n TContribution = PluginContribution,\n TConfig extends PluginConfig = PluginConfig,\n TExtension extends PluginContextExtension = PluginContextExtension,\n> = Omit<PluginManifest<TContribution, TConfig, TExtension>, \"units\"> & {\n units?: readonly RuntimeUnitDescriptorInput<TContribution, 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 runtime: RuntimeKind;\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 runtime: RuntimeKind;\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 unitId?: string;\n /** 能力列表。 */\n capabilities: string[];\n /** 当前状态。 */\n state: PluginStateKind;\n /** 最近错误。 */\n error?: string;\n}\n","// 面向普通插件作者的声明入口。\n//\n// definePlugin() 只返回“静态 descriptor + 本地实现”这两个内部装配所需的\n// 部分。manifest 永远不携带 setup,因此可以安全地用于快照、诊断和跨\n// realm 传输;实现函数只会在调用 definePlugin() 的那个 realm 被使用。\n\nimport type {\n PluginConfig,\n PluginContextExtension,\n PluginDependency,\n PluginManifestInput,\n PluginMeta,\n PluginSetup,\n PluginContribution,\n RuntimeDependency,\n RuntimeUnitDependencyInput,\n RuntimeUnitDescriptorInput,\n} from \"../contracts/plugin.js\";\nimport {\n defineRuntimeUnitProvidedContracts,\n runtimeCapabilityContractVersion,\n} from \"../contracts/plugin.js\";\nimport type { PluginPermission, RuntimeKind } from \"../contracts/lifecycle.js\";\n\nexport interface DefinePluginOptions<\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 /** 普通插件的可执行实现;不会进入静态 descriptor。 */\n setup: PluginSetup<TConfig, TExtension>;\n /** 默认目标 Runtime;普通 Window 插件通常省略,由 App 注入。 */\n runtime?: RuntimeKind;\n /** 默认 unit id;省略时使用插件 id。 */\n unitId?: string;\n /** 插件依赖;helper 会为本地依赖补齐 v1 契约版本。 */\n dependencies?: readonly (RuntimeDependency | PluginDependency)[];\n /** 本单元提供的 capability。 */\n provides?: readonly string[];\n /** 跨 Runtime 时可显式覆盖 capability 契约版本。 */\n providedContracts?: Readonly<Record<string, string>>;\n /** 请求的权限集合。 */\n permissions?: readonly PluginPermission[];\n /** 单元只读配置。 */\n config?: TConfig;\n /** 产品贡献;不会被框架解释。 */\n contribution?: TContribution;\n /** 是否默认启用;默认为 true。 */\n defaultEnabled?: boolean;\n /** 是否允许控制面停用;默认为 true。 */\n canDisable?: boolean;\n /** required 插件在 App 初始启动时必须成功。 */\n required?: boolean;\n /** 显式启动模式;required=true 时不能覆盖为 optional。 */\n startup?: \"required\" | \"optional\";\n /** 仅用于兼容低层消费方的静态 meta 扩展;WebLoom 不解释分类字段。 */\n meta?: Partial<PluginMeta>;\n}\n\n/** 静态 descriptor 与当前 realm 的实现函数分离。 */\nexport interface PluginDefinition<\n TContribution = PluginContribution,\n TConfig extends PluginConfig = PluginConfig,\n TExtension extends PluginContextExtension = PluginContextExtension,\n> {\n readonly manifest: PluginManifestInput<TContribution, TConfig, TExtension>;\n readonly descriptor: RuntimeUnitDescriptorInput<TContribution, TConfig>;\n readonly setup: PluginSetup<TConfig, TExtension>;\n}\n\nfunction normalizeDependency(dependency: RuntimeDependency | PluginDependency): RuntimeUnitDependencyInput {\n const contractVersion = dependency.contractVersion ?? runtimeCapabilityContractVersion(dependency.capability);\n return {\n capability: dependency.capability,\n contractVersion,\n ...(dependency.sourceRuntime !== undefined ? { sourceRuntime: dependency.sourceRuntime } : {}),\n ...(dependency.reason !== undefined ? { reason: dependency.reason } : {}),\n ...(dependency.optional !== undefined ? { optional: dependency.optional } : {}),\n };\n}\n\n/**\n * 声明一个插件。\n *\n * 该函数不创建 Host,也不启动 setup;真正的启动边界由\n * createWindowApp()/startSharedWorkerApp() 拥有。\n */\nexport function definePlugin<\n TContribution = PluginContribution,\n TConfig extends PluginConfig = PluginConfig,\n TExtension extends PluginContextExtension = PluginContextExtension,\n>(options: DefinePluginOptions<TContribution, TConfig, TExtension>): PluginDefinition<TContribution, TConfig, TExtension> {\n if (!options || typeof options.id !== \"string\" || options.id.trim() === \"\") {\n throw new Error(\"Plugin id must be a non-empty string\");\n }\n if (typeof options.setup !== \"function\") throw new Error(`Plugin \"${options.id}\" setup must be a function`);\n\n const unitId = options.unitId ?? options.id;\n if (unitId.trim() === \"\") throw new Error(`Plugin \"${options.id}\" unitId must be a non-empty string`);\n const provides = [...new Set(options.provides ?? [])];\n const dependencies = (options.dependencies ?? []).map(normalizeDependency);\n const providedContracts = {\n ...defineRuntimeUnitProvidedContracts(provides),\n ...(options.providedContracts ?? {}),\n };\n const descriptor: RuntimeUnitDescriptorInput<TContribution, TConfig> = {\n id: unitId,\n ...(options.runtime !== undefined ? { runtime: options.runtime } : {}),\n ...(dependencies.length > 0 ? { dependencies } : {}),\n ...(provides.length > 0 ? { provides } : {}),\n ...(Object.keys(providedContracts).length > 0 ? { providedContracts } : {}),\n ...(options.contribution !== undefined ? { contribution: options.contribution } : {}),\n ...(options.permissions !== undefined ? { permissions: [...options.permissions] } : {}),\n ...(options.config !== undefined ? { config: options.config } : {}),\n };\n const metaInput = options.meta ?? {};\n const required = options.required === true\n || options.startup === \"required\"\n || metaInput.startup === \"required\";\n const meta: PluginMeta = {\n ...metaInput,\n defaultEnabled: options.defaultEnabled ?? metaInput.defaultEnabled ?? true,\n canDisable: options.canDisable ?? metaInput.canDisable ?? !required,\n startup: required ? \"required\" : (options.startup ?? metaInput.startup ?? \"optional\"),\n };\n // A required plugin must have one unambiguous policy. Do this at the authoring\n // boundary so createWindowApp() can fail before mutating a Host.\n if (meta.startup === \"required\" && (meta.canDisable || !meta.defaultEnabled)) {\n throw new Error(`Plugin \"${options.id}\" required metadata is inconsistent`);\n }\n const manifest: PluginManifestInput<TContribution, TConfig, TExtension> = {\n id: options.id,\n name: options.name ?? options.id,\n ...(options.description !== undefined ? { description: options.description } : {}),\n meta,\n units: [descriptor],\n };\n return Object.freeze({\n manifest: Object.freeze(manifest),\n descriptor: Object.freeze(descriptor),\n setup: options.setup,\n });\n}\n","import type {\n PluginDefinition,\n} from \"../authoring/definePlugin.js\";\nimport type {\n PluginDependency,\n PluginManifest,\n PluginManifestInput,\n RuntimeUnitDescriptor,\n RuntimeUnitDescriptorInput,\n} from \"../contracts/plugin.js\";\nimport {\n defineRuntimeUnitProvidedContracts,\n runtimeCapabilityContractVersion,\n} from \"../contracts/plugin.js\";\nimport type { RuntimeKind } from \"../contracts/lifecycle.js\";\n\n// Runtime assembly intentionally accepts definitions with product-specific\n// config/contribution/extension generics. The materializer normalizes those\n// values into the framework's structural manifest before Host registration;\n// keeping this boundary generic avoids making every author cast a valid\n// definePlugin() result just to call createWindowApp().\nexport type RuntimePluginDefinition = PluginDefinition<any, any, any> | {\n readonly manifest: PluginManifest | PluginManifestInput;\n readonly setup: import(\"../contracts/plugin.js\").PluginSetup<any, any>;\n /** 多 unit manifest 中 setup 所实现的目标 unit;单一匹配 unit 可省略。 */\n readonly unitId?: string;\n};\n\nexport interface MaterializedPluginDefinition {\n readonly manifest: PluginManifest;\n /** 当前 Runtime 中由 setup 实现的 unit。 */\n readonly unitId: string;\n readonly setup: import(\"../contracts/plugin.js\").PluginSetup;\n}\n\nfunction normalizeProductDependencies(\n dependencies: readonly PluginDependency[] | undefined,\n runtime: RuntimeKind,\n) {\n return dependencies?.map((dependency) => ({\n capability: dependency.capability,\n contractVersion: dependency.contractVersion ?? runtimeCapabilityContractVersion(dependency.capability),\n sourceRuntime: dependency.sourceRuntime ?? runtime,\n ...(dependency.reason !== undefined ? { reason: dependency.reason } : {}),\n ...(dependency.optional !== undefined ? { optional: dependency.optional } : {}),\n }));\n}\n\n/** 将作者定义绑定到真实 Runtime;不把 setup 复制进 manifest。 */\nexport function materializePluginDefinition(\n input: RuntimePluginDefinition,\n runtime: RuntimeKind,\n): MaterializedPluginDefinition {\n const manifest = input.manifest;\n const setup = input.setup;\n if (!manifest || typeof manifest.id !== \"string\" || manifest.id.trim() === \"\") {\n throw new Error(\"Plugin manifest id must be a non-empty string\");\n }\n const existingUnits: readonly RuntimeUnitDescriptorInput[] = (manifest.units ?? []) as readonly RuntimeUnitDescriptorInput[];\n const requestedUnitId = \"unitId\" in input ? input.unitId : undefined;\n const matchingUnits = existingUnits.filter((unit) => unit.runtime === undefined || unit.runtime === runtime);\n let implementationUnitId: string;\n if (existingUnits.length === 0) {\n implementationUnitId = manifest.id;\n } else if (requestedUnitId !== undefined) {\n const selected = existingUnits.find((unit) => unit.id === requestedUnitId);\n if (!selected) throw new Error(`Plugin \"${manifest.id}\" does not declare unit \"${requestedUnitId}\"`);\n if (selected.runtime !== undefined && selected.runtime !== runtime) {\n throw new Error(`Plugin \"${manifest.id}\" unit \"${requestedUnitId}\" targets ${selected.runtime}, not ${runtime}`);\n }\n implementationUnitId = selected.id;\n } else if (matchingUnits.length === 1 && matchingUnits[0]) {\n implementationUnitId = matchingUnits[0].id;\n } else {\n throw new Error(\n `Plugin \"${manifest.id}\" has ${matchingUnits.length} implementation units for ${runtime}; specify unitId explicitly`,\n );\n }\n const selectedUnit = existingUnits.length > 0\n ? existingUnits.find((unit) => unit.id === implementationUnitId)\n : undefined;\n const units: RuntimeUnitDescriptor[] = selectedUnit\n ? [(() => {\n const unitRuntime = selectedUnit.runtime ?? runtime;\n const provides = [...(selectedUnit.provides ?? [])];\n const dependencies = selectedUnit.dependencies?.map((dependency): import(\"../contracts/plugin.js\").RuntimeUnitDependency => ({\n capability: dependency.capability,\n contractVersion: dependency.contractVersion ?? runtimeCapabilityContractVersion(dependency.capability),\n sourceRuntime: dependency.sourceRuntime ?? unitRuntime,\n ...(dependency.reason !== undefined ? { reason: dependency.reason } : {}),\n ...(dependency.optional !== undefined ? { optional: dependency.optional } : {}),\n }));\n return {\n ...selectedUnit,\n runtime: unitRuntime,\n dependencies,\n ...(provides.length > 0\n ? { providedContracts: { ...defineRuntimeUnitProvidedContracts(provides), ...(selectedUnit.providedContracts ?? {}) } }\n : {}),\n };\n })()]\n : [{\n id: manifest.id,\n runtime,\n dependencies: normalizeProductDependencies(manifest.dependencies, runtime),\n ...(manifest.provides && manifest.provides.length > 0 ? {\n provides: [...manifest.provides],\n providedContracts: defineRuntimeUnitProvidedContracts(manifest.provides),\n } : {}),\n ...(manifest.permissions !== undefined ? { permissions: [...manifest.permissions] } : {}),\n ...(manifest.config !== undefined ? { config: manifest.config } : {}),\n ...(manifest.contribution !== undefined ? { contribution: manifest.contribution } : {}),\n }];\n const normalized: PluginManifest = {\n ...manifest,\n units,\n // Product-level declarations are retained only for compatibility with\n // low-level manifests; the selected unit is the source of truth in Host.\n };\n return { manifest: normalized, unitId: implementationUnitId, setup };\n}\n\nexport function materializePluginDefinitions(\n inputs: readonly RuntimePluginDefinition[],\n runtime: RuntimeKind,\n): MaterializedPluginDefinition[] {\n return inputs.map((input) => materializePluginDefinition(input, runtime));\n}\n","import type {\n LifecycleDisposeResult,\n RemoteServiceBridge,\n RemoteServiceReference,\n} from \"../contracts/lifecycle.js\";\nimport type { PluginManifest } from \"../contracts/plugin.js\";\nimport {\n createPluginHost,\n type CreatePluginHostOptions,\n type PluginHost,\n} from \"../host/createPluginHost.js\";\nimport { createRuntimeUnitImplementationRegistry } from \"../host/runtimeUnitImplementationRegistry.js\";\nimport { StartupPluginError } from \"../host/createPluginHost.js\";\nimport type { RuntimePluginDefinition } from \"./pluginDefinitions.js\";\nimport { materializePluginDefinitions } from \"./pluginDefinitions.js\";\nimport { unitSnapshotFromState } from \"./runtimeProtocol.js\";\nimport {\n RuntimeInitializationError,\n RuntimeUnavailableError,\n type RuntimeStatusListener,\n type RuntimeStatusSnapshot,\n type RuntimeHandle,\n type WindowApp,\n} from \"./runtimeTypes.js\";\n\nexport interface CreateWindowAppOptions extends Omit<CreatePluginHostOptions, \"runtime\" | \"runtimeUnitImplementationRegistry\"> {\n /** 逻辑 Runtime 标识;同一页面通常只创建一个 App。 */\n id?: string;\n /** 当前 Window 的插件定义;setup 只在当前 Window realm 执行。 */\n plugins: readonly RuntimePluginDefinition[];\n /**\n * 供领域适配层接管分阶段注册时复用已经创建的 Window Host。\n * 普通插件应省略该字段;传入后由调用方负责后续 register,App 仍负责\n * Window Runtime 快照、远端投影和最终 dispose。\n */\n host?: PluginHost;\n /** 可选的 SharedWorker Runtime;Window 单元只投影其状态,不创建 Worker 假实例。 */\n remoteRuntime?: RuntimeHandle;\n}\n\nfunction makeRuntimeInstanceId(runtimeId: string): string {\n try {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return `${runtimeId}:${crypto.randomUUID()}`;\n }\n } catch {\n // 仅用于实例身份,不承担授权或密钥语义。\n }\n return `${runtimeId}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isStartupPluginError(error: unknown): error is StartupPluginError {\n return error instanceof StartupPluginError\n && typeof error.details?.pluginId === \"string\";\n}\n\nfunction buildLocalServices(\n host: PluginHost,\n manifests: readonly PluginManifest[],\n runtimeInstanceId: string,\n): readonly RemoteServiceReference[] {\n const services: RemoteServiceReference[] = [];\n for (const manifest of manifests) {\n const state = host.state(manifest.id);\n const unit = manifest.units?.find((candidate) => candidate.id === state.unitId)\n ?? manifest.units?.[0];\n if (!unit || unit.runtime === undefined || !state.instanceId || state.kind !== \"enabled\") continue;\n for (const capability of unit.provides ?? []) {\n services.push({\n capabilityId: capability,\n contractVersion: unit.providedContracts?.[capability] ?? `${capability}.v1`,\n runtime: unit.runtime,\n runtimeInstanceId,\n serviceInstanceId: state.instanceId,\n status: \"ready\",\n attributes: Object.freeze({}),\n });\n }\n }\n return services;\n}\n\n/** 创建当前 Window 的唯一 window-main Runtime。 */\nexport async function createWindowApp(options: CreateWindowAppOptions): Promise<WindowApp> {\n const runtimeId = options.id ?? \"window-main\";\n const remoteRuntime = options.remoteRuntime;\n const runtimeInstanceId = makeRuntimeInstanceId(runtimeId);\n let currentState: RuntimeStatusSnapshot = {\n runtimeId,\n runtimeKind: \"window-main\",\n runtimeInstanceId,\n state: \"starting\",\n revision: 0,\n units: [],\n services: [],\n };\n const listeners = new Set<RuntimeStatusListener>();\n let disposed = false;\n let disposePromise: Promise<LifecycleDisposeResult> | undefined;\n\n const emit = (next: RuntimeStatusSnapshot): void => {\n currentState = Object.freeze({\n ...next,\n units: Object.freeze([...next.units]),\n services: Object.freeze([...next.services]),\n });\n for (const listener of [...listeners]) {\n try { listener(currentState); } catch { /* 观察者不能改变 Runtime 状态。 */ }\n }\n };\n\n let materialized: ReturnType<typeof materializePluginDefinitions>;\n try {\n materialized = materializePluginDefinitions(options.plugins, \"window-main\");\n } catch (error) {\n throw new RuntimeInitializationError({ phase: \"validate\", error: errorMessage(error) });\n }\n const manifests = materialized.map((item) => item.manifest);\n let implementations: ReturnType<typeof createRuntimeUnitImplementationRegistry>;\n try {\n const duplicate = manifests.find((manifest, index) => (\n manifests.findIndex((candidate) => candidate.id === manifest.id) !== index\n ));\n if (duplicate) throw new Error(`Plugin \"${duplicate.id}\" is declared more than once`);\n implementations = createRuntimeUnitImplementationRegistry(\n materialized.map((item) => ({\n pluginId: item.manifest.id,\n unitId: item.unitId,\n setup: item.setup,\n })),\n );\n } catch (error) {\n throw new RuntimeInitializationError({ phase: \"validate\", error: errorMessage(error) });\n }\n\n let host: PluginHost;\n const suppliedHost = options.host;\n const remoteServiceBridge = remoteRuntime\n ? (remoteRuntime as RuntimeHandle & { readonly serviceBridge: RemoteServiceBridge }).serviceBridge\n : undefined;\n try {\n const {\n id: _id,\n plugins: _plugins,\n host: _host,\n remoteRuntime: _remoteRuntime,\n ...hostOptions\n } = options;\n const suppliedBridgeFactory = hostOptions.serviceBridgeForPlugin;\n host = suppliedHost ?? createPluginHost({\n ...hostOptions,\n runtime: \"window-main\",\n externalRuntimeDependencies: remoteRuntime !== undefined || hostOptions.externalRuntimeDependencies,\n remoteServiceReferences: () => remoteRuntime?.state().services ?? hostOptions.remoteServiceReferences?.() ?? [],\n runtimeSnapshots: () => remoteRuntime\n ? remoteRuntime.state().units.map((unit) => ({\n pluginId: unit.pluginId,\n unitId: unit.unitId,\n runtime: unit.runtime,\n ...(unit.instanceId !== undefined ? { instanceId: unit.instanceId } : {}),\n state: unit.state,\n }))\n : hostOptions.runtimeSnapshots?.() ?? [],\n serviceBridgeForPlugin: (pluginId, instanceId) => (\n suppliedBridgeFactory?.(pluginId, instanceId) ?? remoteServiceBridge\n ),\n rootAttributes: {\n ...(hostOptions.rootAttributes ?? {}),\n runtimeId,\n runtimeInstanceId,\n },\n runtimeUnitImplementationRegistry: implementations,\n });\n } catch (error) {\n throw new RuntimeInitializationError({ phase: \"validate\", error: errorMessage(error) });\n }\n\n let removeRemoteSubscription: (() => void) | undefined;\n\n const manifestsForSnapshot = (): readonly PluginManifest[] => {\n if (!suppliedHost) return manifests;\n return suppliedHost.manifests()\n .map((pluginId) => suppliedHost.getManifest(pluginId))\n .filter((manifest): manifest is PluginManifest => manifest !== undefined);\n };\n\n const refresh = (): void => {\n const snapshotManifests = manifestsForSnapshot();\n const units = snapshotManifests.flatMap((manifest) => {\n const state = host.state(manifest.id);\n return (state.units ?? []).map((unit) => unitSnapshotFromState(\n unit,\n unit.runtime,\n ));\n });\n const revision = Math.max(currentState.revision + 1, host.version());\n emit({\n ...currentState,\n revision,\n units,\n services: [\n ...buildLocalServices(host, snapshotManifests, runtimeInstanceId),\n ...(remoteRuntime?.state().services ?? []),\n ],\n });\n };\n const removeHostSubscription = host.subscribe(refresh);\n\n try {\n if (!suppliedHost) await host.registerAll(manifests);\n const failedRequired = suppliedHost ? undefined : manifests.find((manifest) => {\n const required = manifest.meta.startup === \"required\" || manifest.meta.canDisable === false;\n return required && host.state(manifest.id).kind !== \"enabled\";\n });\n if (failedRequired) {\n const state = host.state(failedRequired.id);\n throw new StartupPluginError({\n pluginId: failedRequired.id,\n unitId: state.unitId ?? failedRequired.units?.[0]?.id ?? failedRequired.id,\n capabilities: [],\n state: state.kind,\n error: state.error ?? `Required plugin is ${state.kind}${state.blockedBy ? `: ${state.blockedBy.join(\", \")}` : \"\"}`,\n });\n }\n } catch (error) {\n refresh();\n const pluginId = isStartupPluginError(error) ? error.details.pluginId : undefined;\n const manifest = pluginId ? manifests.find((candidate) => candidate.id === pluginId) : undefined;\n const required = manifest?.meta.startup === \"required\" || manifest?.meta.canDisable === false;\n if (required || !isStartupPluginError(error)) {\n removeHostSubscription();\n removeRemoteSubscription?.();\n await host.dispose(\"window runtime initialization failed\").catch(() => undefined);\n if (error instanceof RuntimeInitializationError) throw error;\n throw new RuntimeInitializationError({\n pluginId,\n unitId: isStartupPluginError(error) ? error.details.unitId : manifest?.units?.[0]?.id,\n phase: \"startup\",\n error: errorMessage(error),\n });\n }\n // 非 required 插件的失败保留在 Host 快照中;App 本身仍可观察并继续运行。\n }\n refresh();\n emit({ ...currentState, state: \"ready\" });\n removeRemoteSubscription = remoteRuntime?.subscribe(() => {\n host.refreshRuntimeUnitSnapshots();\n void host.reconcile().catch(() => undefined);\n });\n\n const app: WindowApp = {\n runtimeKind: \"window-main\",\n runtimeId,\n runtimeInstanceId,\n host,\n state: () => currentState,\n capability<T>(capabilityId: string): T {\n if (disposed || currentState.state === \"disposed\" || currentState.state === \"stopping\") {\n throw new RuntimeUnavailableError(\"Window Runtime has been disposed\");\n }\n return host.capabilities.get<T>(capabilityId);\n },\n subscribe(listener) {\n listeners.add(listener);\n listener(currentState);\n return () => listeners.delete(listener);\n },\n dispose(reason = \"window runtime disposed\") {\n if (disposePromise) return disposePromise;\n disposed = true;\n emit({ ...currentState, state: \"stopping\" });\n removeHostSubscription();\n removeRemoteSubscription?.();\n disposePromise = host.dispose(reason).then((result) => {\n emit({ ...currentState, state: \"disposed\" });\n return result;\n }, (error) => {\n emit({ ...currentState, state: \"failed\", error: errorMessage(error) });\n throw error;\n });\n return disposePromise;\n },\n };\n return app;\n}\n","// MessagePort Provider。\n//\n// Provider 不发送握手、目录或失效控制包。Runtime Host 是完整快照的唯一\n// 发布者;Provider 只维护自己端点的权威目录,按 call 中的精确标识重新\n// 查找服务,并把取消传给当前 handler。\n\nimport type {\n RemoteServiceMessageCodec,\n RemoteServiceReference,\n} from \"../contracts/lifecycle.js\";\nimport {\n createRemoteServiceMessageCodec,\n RemoteServiceError,\n} from \"../contracts/lifecycle.js\";\nimport type {\n MessagePortServiceCallInput,\n RemoteServicePortCallMessage,\n RemoteServicePortCancelMessage,\n RemoteServicePortErrorMessage,\n RemoteServicePortResultMessage,\n} from \"./messagePortServiceTransport.js\";\n\nexport interface CreateMessagePortServiceProviderOptions {\n /** 与页面服务桥配对的专用双工端口。 */\n port: MessagePort;\n /** Provider 的本地权威目录;不会采信客户端回传的完整 reference。 */\n services?: () => readonly RemoteServiceReference[];\n /** 具体服务分派;这里不自动重放调用。 */\n handleCall(input: MessagePortServiceCallInput): Promise<unknown>;\n /** dispose 时是否关闭本端端口;默认关闭。 */\n closeOnDispose?: boolean;\n /** wire 消息 codec;默认 webloom.remote-service.v2。 */\n codec?: RemoteServiceMessageCodec;\n}\n\nexport interface MessagePortServiceProvider {\n /** 替换 Provider 本地权威目录;不产生 wire 控制消息。 */\n setServices(services: readonly RemoteServiceReference[]): void;\n /** 同步停止新调用并 abort 当前 handler。 */\n revoke(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.protocolVersion === \"string\"\n && typeof message.callId === \"string\"\n && message.callId.length > 0\n && typeof message.capabilityId === \"string\"\n && typeof message.contractVersion === \"string\"\n && typeof message.serviceInstanceId === \"string\";\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.protocolVersion === \"string\"\n && typeof message.callId === \"string\"\n && typeof message.serviceInstanceId === \"string\";\n}\n\nfunction errorMessage(error: unknown): RemoteServicePortErrorMessage[\"error\"] {\n const candidate = error && typeof error === \"object\"\n ? error as { name?: unknown; message?: unknown; code?: unknown; details?: unknown }\n : undefined;\n const code = typeof candidate?.code === \"string\" && candidate.code.length > 0\n ? candidate.code\n : \"handler_failed\";\n return {\n ...(typeof candidate?.name === \"string\" ? { name: candidate.name } : {}),\n message: typeof candidate?.message === \"string\" ? candidate.message : String(error),\n code,\n ...(candidate?.details && typeof candidate.details === \"object\" && !Array.isArray(candidate.details)\n ? { details: candidate.details as Readonly<Record<string, unknown>> }\n : {}),\n };\n}\n\nfunction stableValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(stableValue);\n if (!value || typeof value !== \"object\") return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => [key, stableValue(item)]),\n );\n}\n\nfunction bindingKey(reference: Pick<RemoteServiceReference, \"capabilityId\" | \"contractVersion\" | \"runtime\" | \"runtimeInstanceId\" | \"serviceInstanceId\">): string {\n return [\n reference.capabilityId,\n reference.contractVersion,\n reference.runtime,\n reference.runtimeInstanceId,\n reference.serviceInstanceId,\n ].join(\"\\u0000\");\n}\n\nfunction referenceFingerprint(reference: RemoteServiceReference): string {\n return JSON.stringify({\n ...reference,\n attributes: stableValue(reference.attributes),\n });\n}\n\ninterface ServiceBinding {\n readonly reference: RemoteServiceReference;\n readonly epoch: number;\n}\n\ninterface PendingCall {\n readonly message: RemoteServicePortCallMessage;\n readonly controller: AbortController;\n readonly serviceInstanceId: string;\n readonly bindingKey: string;\n readonly bindingEpoch: number;\n}\n\nfunction postBestEffort(port: MessagePort, message: unknown): void {\n try { port.postMessage(message); } catch { /* 端口关闭时由调用方 deadline 收敛 */ }\n}\n\n/** 创建一条只服务于当前 MessagePort 的 Provider 端点。 */\nexport function createMessagePortServiceProvider(\n options: CreateMessagePortServiceProviderOptions,\n): MessagePortServiceProvider {\n const pending = new Map<string, PendingCall>();\n const codec = options.codec ?? createRemoteServiceMessageCodec();\n let services = [...(options.services?.() ?? [])];\n let bindings = new Map<string, ServiceBinding>();\n let nextBindingEpoch = 0;\n let revoked = false;\n let disposed = false;\n\n const buildBindings = (nextServices: readonly RemoteServiceReference[]): Map<string, ServiceBinding> => {\n const nextBindings = new Map<string, ServiceBinding>();\n for (const reference of nextServices) {\n const key = bindingKey(reference);\n const previous = bindings.get(key);\n const epoch = previous && referenceFingerprint(previous.reference) === referenceFingerprint(reference)\n ? previous.epoch\n : ++nextBindingEpoch;\n nextBindings.set(key, { reference, epoch });\n }\n return nextBindings;\n };\n\n const isCurrent = (callId: string, call: PendingCall): boolean => {\n const current = bindings.get(call.bindingKey);\n return !disposed\n && !revoked\n && pending.get(callId) === call\n && current?.epoch === call.bindingEpoch\n && current.reference.serviceInstanceId === call.serviceInstanceId;\n };\n\n const revokeReplacedCalls = (nextBindings: ReadonlyMap<string, ServiceBinding>): void => {\n for (const call of pending.values()) {\n const next = nextBindings.get(call.bindingKey);\n if (!next || next.epoch !== call.bindingEpoch) {\n sendError(call.message, new RemoteServiceError(\"service_revoked\", \"Remote service binding was replaced\"));\n call.controller.abort(new RemoteServiceError(\"service_revoked\", \"Remote service binding was replaced\"));\n }\n }\n };\n\n bindings = buildBindings(services);\n\n const sendError = (message: RemoteServicePortCallMessage, error: unknown): void => {\n const response: RemoteServicePortErrorMessage = {\n type: codec.type(\"error\"),\n protocolVersion: codec.protocolVersion,\n callId: message.callId,\n serviceInstanceId: message.serviceInstanceId,\n error: errorMessage(error),\n };\n postBestEffort(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.protocolVersion !== codec.protocolVersion) return;\n const call = pending.get(decoded.callId);\n if (call?.serviceInstanceId === decoded.serviceInstanceId) {\n call.controller.abort(new RemoteServiceError(\"request_cancelled\", \"Remote service request cancelled\"));\n }\n return;\n }\n if (!isCallMessage(decoded, codec)) return;\n const message = decoded;\n if (message.protocolVersion !== codec.protocolVersion) {\n sendError(message, new RemoteServiceError(\"protocol_mismatch\", \"Remote service protocol version mismatch\"));\n return;\n }\n if (revoked) {\n sendError(message, new RemoteServiceError(\"service_revoked\", \"Remote service Provider has been revoked\"));\n return;\n }\n const reference = services.find((candidate) => candidate.status === \"ready\"\n && candidate.capabilityId === message.capabilityId\n && candidate.contractVersion === message.contractVersion\n && candidate.serviceInstanceId === message.serviceInstanceId);\n if (!reference) {\n sendError(message, new RemoteServiceError(\"service_stale\", \"Remote service instance is stale or unavailable\"));\n return;\n }\n if (pending.has(message.callId)) {\n sendError(message, new RemoteServiceError(\"handler_failed\", \"Remote service callId is duplicated\"));\n return;\n }\n const controller = new AbortController();\n const currentBindingKey = bindingKey(reference);\n const currentBinding = bindings.get(currentBindingKey);\n if (!currentBinding || currentBinding.reference !== reference) {\n sendError(message, new RemoteServiceError(\"service_stale\", \"Remote service binding changed\"));\n return;\n }\n const call: PendingCall = {\n message,\n controller,\n serviceInstanceId: message.serviceInstanceId,\n bindingKey: currentBindingKey,\n bindingEpoch: currentBinding.epoch,\n };\n pending.set(message.callId, call);\n void (async () => {\n try {\n const result = await options.handleCall({ message, reference, signal: controller.signal });\n if (controller.signal.aborted || !isCurrent(message.callId, call)) return;\n const response: RemoteServicePortResultMessage = {\n type: codec.type(\"result\"),\n protocolVersion: codec.protocolVersion,\n callId: message.callId,\n serviceInstanceId: message.serviceInstanceId,\n result,\n };\n postBestEffort(options.port, codec.encode(response as unknown as Record<string, unknown>));\n } catch (error) {\n if (controller.signal.aborted || !isCurrent(message.callId, call)) return;\n sendError(message, error);\n } finally {\n if (pending.get(message.callId) === call) pending.delete(message.callId);\n }\n })();\n };\n\n options.port.addEventListener(\"message\", onMessage);\n options.port.start();\n\n const provider: MessagePortServiceProvider = {\n setServices(nextServices): void {\n if (disposed) return;\n const next = [...nextServices];\n const nextBindings = buildBindings(next);\n // Withdraw the old directory first. Abort is synchronous; a handler that\n // ignores AbortSignal is fenced again by isCurrent() before any response.\n revoked = true;\n revokeReplacedCalls(nextBindings);\n services = next;\n bindings = nextBindings;\n revoked = false;\n },\n revoke(reason = \"Remote service Provider revoked\"): void {\n if (disposed) return;\n revoked = true;\n for (const call of pending.values()) {\n sendError(call.message, new RemoteServiceError(\"service_revoked\", reason));\n call.controller.abort(new RemoteServiceError(\"service_revoked\", reason));\n }\n services = [];\n bindings = new Map();\n },\n dispose(): void {\n if (disposed) return;\n disposed = true;\n revoked = true;\n options.port.removeEventListener(\"message\", onMessage);\n for (const { controller } of pending.values()) {\n controller.abort(new RemoteServiceError(\"transport_unavailable\", \"Remote service Provider disposed\"));\n }\n pending.clear();\n services = [];\n bindings = new Map();\n if (options.closeOnDispose !== false) {\n try { options.port.close(); } catch { /* noop */ }\n }\n },\n };\n return provider;\n}\n","import type {\n LifecycleDisposeResult,\n RemoteServiceReference,\n} from \"../contracts/lifecycle.js\";\nimport type { PluginManifest } from \"../contracts/plugin.js\";\nimport {\n createPluginHost,\n type CreatePluginHostOptions,\n type PluginHost,\n} from \"../host/createPluginHost.js\";\nimport { StartupPluginError } from \"../host/createPluginHost.js\";\nimport { createRuntimeUnitImplementationRegistry } from \"../host/runtimeUnitImplementationRegistry.js\";\nimport {\n createMessagePortServiceProvider,\n type MessagePortServiceProvider,\n} from \"../transport/messagePortServiceProvider.js\";\nimport type { MessagePortServiceCallInput } from \"../transport/messagePortServiceTransport.js\";\nimport type { RuntimePluginDefinition } from \"./pluginDefinitions.js\";\nimport { materializePluginDefinitions } from \"./pluginDefinitions.js\";\nimport {\n createRuntimeMessageCodec,\n RUNTIME_ERROR_TYPE,\n RUNTIME_PROTOCOL_VERSION,\n RUNTIME_SNAPSHOT_TYPE,\n type RuntimeErrorMessage,\n type RuntimeSnapshot,\n type RuntimeSnapshotUnit,\n} from \"./runtimeProtocol.js\";\nimport {\n RuntimeInitializationError,\n type RuntimeStatusListener,\n type RuntimeStatusSnapshot,\n type RuntimeAppState,\n} from \"./runtimeTypes.js\";\n\nexport interface SharedWorkerScopeLike {\n onconnect: ((event: { ports: MessagePort[] }) => void) | null;\n}\n\nexport interface StartSharedWorkerAppOptions extends Omit<CreatePluginHostOptions, \"runtime\" | \"runtimeUnitImplementationRegistry\"> {\n id: string;\n plugins: readonly RuntimePluginDefinition[];\n globalScope?: SharedWorkerScopeLike;\n /** SWCF-009 完成前的临时领域端口装配接缝。 */\n onPortConnect?: (event: { ports: MessagePort[] }) => void;\n}\n\nexport interface SharedWorkerApp {\n readonly runtimeKind: \"shared-worker\";\n readonly runtimeId: string;\n readonly runtimeInstanceId: string;\n ready(): Promise<void>;\n reconcile(): Promise<void>;\n state(): RuntimeStatusSnapshot;\n subscribe(listener: RuntimeStatusListener): () => void;\n dispose(reason?: string): Promise<LifecycleDisposeResult>;\n}\n\ninterface WorkerEndpoint {\n port: MessagePort;\n provider: MessagePortServiceProvider;\n removeMessage: () => void;\n closed: boolean;\n}\n\nfunction makeRuntimeInstanceId(runtimeId: string): string {\n try {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return `${runtimeId}:${crypto.randomUUID()}`;\n }\n } catch {\n // 仅用于 Runtime 身份去重。\n }\n return `${runtimeId}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction startupDetails(error: unknown): { pluginId?: string; unitId?: string; message: string } {\n if (error instanceof StartupPluginError) {\n return { pluginId: error.details.pluginId, unitId: error.details.unitId, message: error.details.error ?? error.message };\n }\n if (error instanceof RuntimeInitializationError) {\n return { pluginId: error.details.pluginId, unitId: error.details.unitId, message: error.message };\n }\n return { message: errorMessage(error) };\n}\n\nfunction addPortListener(port: MessagePort, listener: (event: MessageEvent) => void): () => void {\n port.addEventListener(\"message\", listener);\n return () => port.removeEventListener(\"message\", listener);\n}\n\nfunction post(port: MessagePort, message: unknown): void {\n try { port.postMessage(message); } catch { /* 端口已断开 */ }\n}\n\n/** 在当前 SharedWorkerGlobalScope 中安装唯一的 Worker Runtime。 */\nexport function startSharedWorkerApp(options: StartSharedWorkerAppOptions): SharedWorkerApp {\n if (!options || typeof options.id !== \"string\" || options.id.trim() === \"\") {\n throw new Error(\"SharedWorker runtime id must be a non-empty string\");\n }\n const workerScope = options.globalScope\n ?? (\"onconnect\" in globalThis ? globalThis as unknown as SharedWorkerScopeLike : undefined);\n if (!workerScope) {\n throw new RuntimeInitializationError({\n phase: \"validate\",\n error: \"startSharedWorkerApp must run in a SharedWorkerGlobalScope\",\n });\n }\n\n const runtimeId = options.id;\n const runtimeInstanceId = makeRuntimeInstanceId(runtimeId);\n const listeners = new Set<RuntimeStatusListener>();\n const endpoints = new Set<WorkerEndpoint>();\n const codec = createRuntimeMessageCodec();\n let runtimeState: Exclude<RuntimeAppState, \"disconnected\"> = \"starting\";\n let revision = 0;\n let host: PluginHost | undefined;\n let manifests: readonly PluginManifest[] = [];\n let disposed = false;\n let acceptingConnections = true;\n let disposePromise: Promise<LifecycleDisposeResult> | undefined;\n let startupError: unknown;\n\n const serviceReferences = (): RemoteServiceReference[] => {\n // A stopping/disposed Runtime has no callable services. Keeping the\n // directory empty is also what synchronously revokes Provider pending\n // calls before the terminal snapshot is published.\n if (!host || runtimeState !== \"ready\") return [];\n const services: RemoteServiceReference[] = [];\n for (const manifest of manifests) {\n const state = host.state(manifest.id);\n const unit = manifest.units?.find((candidate) => candidate.id === state.unitId) ?? manifest.units?.[0];\n if (!unit || unit.runtime === undefined || !state.instanceId || state.kind !== \"enabled\") continue;\n const scope = host.scope(manifest.id);\n const attributes = Object.freeze({ ...(scope?.identity.attributes ?? {}) });\n for (const capability of unit.provides ?? []) {\n services.push({\n capabilityId: capability,\n contractVersion: unit.providedContracts?.[capability] ?? `${capability}.v1`,\n runtime: unit.runtime,\n runtimeInstanceId,\n serviceInstanceId: state.instanceId,\n status: \"ready\",\n attributes,\n });\n }\n }\n return services;\n };\n\n const currentSnapshot = (): RuntimeStatusSnapshot => Object.freeze({\n runtimeId,\n runtimeKind: \"shared-worker\",\n runtimeInstanceId,\n state: runtimeState,\n revision,\n units: Object.freeze(host && runtimeState !== \"failed\"\n ? manifests.flatMap((manifest) => {\n const state = host?.state(manifest.id);\n return (state?.units ?? []).map((unit) => ({\n pluginId: unit.pluginId,\n unitId: unit.unitId,\n runtime: unit.runtime,\n ...(unit.instanceId !== undefined ? { instanceId: unit.instanceId } : {}),\n state: unit.kind,\n } satisfies RuntimeSnapshotUnit));\n })\n : []),\n services: Object.freeze(serviceReferences()),\n });\n\n const emit = (): void => {\n const snapshot = currentSnapshot();\n for (const listener of [...listeners]) {\n try { listener(snapshot); } catch { /* observer isolation */ }\n }\n };\n\n const runtimeSnapshot = (): RuntimeSnapshot => ({\n type: RUNTIME_SNAPSHOT_TYPE,\n protocolVersion: RUNTIME_PROTOCOL_VERSION,\n runtimeId,\n runtimeKind: \"shared-worker\",\n runtimeInstanceId,\n revision,\n state: runtimeState,\n units: currentSnapshot().units,\n services: serviceReferences(),\n });\n\n const publishEndpoint = (endpoint: WorkerEndpoint): void => {\n if (endpoint.closed) return;\n endpoint.provider.setServices(serviceReferences());\n post(endpoint.port, codec.encode(runtimeSnapshot() as unknown as Record<string, unknown>));\n };\n\n const publishAll = (): void => {\n for (const endpoint of [...endpoints]) publishEndpoint(endpoint);\n };\n\n const closeEndpoint = (endpoint: WorkerEndpoint, _reason: string): void => {\n if (endpoint.closed) return;\n endpoint.closed = true;\n endpoints.delete(endpoint);\n endpoint.removeMessage();\n endpoint.provider.dispose();\n };\n\n const sendError = (\n port: MessagePort,\n code: RuntimeErrorMessage[\"code\"],\n message: string,\n details: { pluginId?: string; unitId?: string; phase?: RuntimeErrorMessage[\"phase\"] } = {},\n ): void => {\n const error: RuntimeErrorMessage = {\n type: RUNTIME_ERROR_TYPE,\n protocolVersion: RUNTIME_PROTOCOL_VERSION,\n code,\n message,\n ...(details.pluginId !== undefined ? { pluginId: details.pluginId } : {}),\n ...(details.unitId !== undefined ? { unitId: details.unitId } : {}),\n ...(details.phase !== undefined ? { phase: details.phase } : {}),\n };\n post(port, error);\n };\n\n const isAcceptingConnections = (): boolean => (\n acceptingConnections\n && runtimeState !== \"stopping\"\n && runtimeState !== \"disposed\"\n && !disposed\n );\n\n const rejectLateConnection = (port: MessagePort): void => {\n // The port never becomes an endpoint and the domain hook is never called.\n // Publish the current terminal snapshot so a late client fails at its\n // call-first boundary immediately instead of waiting for a timeout. Delay\n // close by one task so the snapshot has a delivery opportunity.\n post(port, codec.encode(runtimeSnapshot() as unknown as Record<string, unknown>));\n setTimeout(() => {\n try { port.close(); } catch { /* noop */ }\n }, 0);\n };\n\n const handleCall = async (input: MessagePortServiceCallInput): Promise<unknown> => {\n if (!host || runtimeState !== \"ready\") throw new Error(\"SharedWorker Runtime is not ready\");\n const { message, reference } = input;\n if (reference.runtimeInstanceId !== runtimeInstanceId\n || reference.runtime !== \"shared-worker\"\n || reference.status !== \"ready\") {\n throw new Error(\"Runtime service reference is stale\");\n }\n const manifest = manifests.find((candidate) => host?.state(candidate.id).instanceId === reference.serviceInstanceId);\n if (!manifest) throw new Error(\"Runtime service provider is no longer active\");\n const state = host.state(manifest.id);\n if (state.kind !== \"enabled\" || state.instanceId !== reference.serviceInstanceId) {\n throw new Error(\"Runtime service provider is no longer active\");\n }\n const unit = manifest.units?.find((candidate) => candidate.id === state.unitId);\n if (!unit || unit.runtime !== \"shared-worker\" || !unit.provides?.includes(reference.capabilityId)) {\n throw new Error(\"Runtime capability is not declared\");\n }\n const expectedVersion = unit.providedContracts?.[reference.capabilityId] ?? `${reference.capabilityId}.v1`;\n if (expectedVersion !== reference.contractVersion) throw new Error(\"Runtime capability contract mismatch\");\n const value = host.capabilities.get<unknown>(reference.capabilityId);\n if (input.signal.aborted) throw input.signal.reason ?? new Error(\"Runtime service request cancelled\");\n const request = message.request;\n if (typeof value === \"function\") return await (value as (request: unknown, signal: AbortSignal) => unknown)(request, input.signal);\n if (value && typeof value === \"object\") {\n const object = value as Record<string, unknown>;\n if (typeof object.handle === \"function\") return await (object.handle as (request: unknown, signal: AbortSignal) => unknown)(request, input.signal);\n if (request && typeof request === \"object\" && typeof (request as { method?: unknown }).method === \"string\") {\n const method = (request as { method: string }).method;\n const methodValue = object[method];\n if (typeof methodValue === \"function\") {\n const args = (request as { args?: unknown[] }).args;\n return await (methodValue as (...args: unknown[]) => unknown)(...(Array.isArray(args) ? args : []));\n }\n }\n }\n throw new Error(`Runtime capability \"${reference.capabilityId}\" does not expose an RPC handler`);\n };\n\n const attachPort = (port: MessagePort): void => {\n let endpoint: WorkerEndpoint | undefined;\n let removeMessage: () => void = () => undefined;\n const onMessageError = (): void => {\n if (endpoint) closeEndpoint(endpoint, \"MessagePort error\");\n };\n endpoint = {\n port,\n provider: undefined as unknown as MessagePortServiceProvider,\n removeMessage: () => undefined,\n closed: false,\n };\n endpoint.provider = createMessagePortServiceProvider({\n port,\n codec,\n services: serviceReferences,\n handleCall,\n });\n endpoints.add(endpoint);\n const onMessage = (event: MessageEvent): void => {\n // Runtime has no client control messages. Domain listeners installed by\n // onPortConnect own their own message schema on this same port.\n void event;\n };\n removeMessage = addPortListener(port, onMessage);\n endpoint.removeMessage = () => {\n removeMessage();\n port.removeEventListener(\"messageerror\", onMessageError);\n };\n port.addEventListener(\"messageerror\", onMessageError);\n port.start();\n publishEndpoint(endpoint);\n };\n\n // Install onconnect before asynchronous plugin startup so every new port\n // immediately receives a complete starting snapshot.\n workerScope.onconnect = (event) => {\n const ports = event.ports ?? [];\n if (!isAcceptingConnections()) {\n for (const port of ports) rejectLateConnection(port);\n return;\n }\n try {\n options.onPortConnect?.(event);\n } catch (error) {\n const detail = startupDetails(error);\n for (const port of ports) {\n sendError(port, \"runtime_initialization_failed\", detail.message, {\n pluginId: detail.pluginId,\n unitId: detail.unitId,\n phase: \"startup\",\n });\n try { port.close(); } catch { /* noop */ }\n }\n return;\n }\n // A synchronous domain hook may itself initiate disposal. Re-check before\n // creating any Provider endpoint so the hook cannot open a new callable\n // port after the lifecycle gate has closed.\n if (!isAcceptingConnections()) {\n for (const port of ports) rejectLateConnection(port);\n return;\n }\n for (const port of ports) attachPort(port);\n };\n\n let materialized: ReturnType<typeof materializePluginDefinitions> = [];\n let readyPromise: Promise<void>;\n try {\n materialized = materializePluginDefinitions(options.plugins, \"shared-worker\");\n manifests = materialized.map((item) => item.manifest);\n const implementations = createRuntimeUnitImplementationRegistry(materialized.map((item) => ({\n pluginId: item.manifest.id,\n unitId: item.unitId,\n setup: item.setup,\n })));\n const { id: _id, plugins: _plugins, globalScope: _scope, onPortConnect: _onPortConnect, ...hostOptions } = options;\n host = createPluginHost({\n ...hostOptions,\n runtime: \"shared-worker\",\n rootAttributes: { ...(hostOptions.rootAttributes ?? {}), runtimeId, runtimeInstanceId },\n runtimeUnitImplementationRegistry: implementations,\n });\n host.subscribe(() => {\n if (runtimeState !== \"ready\" || disposed) return;\n revision += 1;\n publishAll();\n emit();\n });\n readyPromise = host.registerAll(manifests).then(() => {\n if (runtimeState === \"stopping\" || disposed) return;\n const runtimeHost = host;\n if (!runtimeHost) throw new Error(\"SharedWorker Plugin Host is unavailable\");\n const failedRequired = manifests.find((manifest) => {\n const required = manifest.meta.startup === \"required\" || manifest.meta.canDisable === false;\n return required && runtimeHost.state(manifest.id).kind !== \"enabled\";\n });\n if (failedRequired) {\n const state = runtimeHost.state(failedRequired.id);\n throw new StartupPluginError({\n pluginId: failedRequired.id,\n unitId: state.unitId ?? failedRequired.units?.[0]?.id ?? failedRequired.id,\n capabilities: [],\n state: state.kind,\n error: state.error ?? `Required plugin is ${state.kind}`,\n });\n }\n runtimeState = \"ready\";\n revision = Math.max(1, revision + 1);\n publishAll();\n emit();\n }).catch((error) => {\n // dispose() may have begun while required plugin startup was still\n // pending. Keep the stopping/terminal sequence authoritative; startup\n // must not resurrect a callable directory or overwrite its state with\n // a late failed snapshot.\n if (runtimeState === \"stopping\" || disposed) return;\n startupError = error;\n runtimeState = \"failed\";\n emit();\n const detail = startupDetails(error);\n for (const endpoint of [...endpoints]) {\n sendError(endpoint.port, \"runtime_initialization_failed\", detail.message, {\n pluginId: detail.pluginId,\n unitId: detail.unitId,\n phase: \"startup\",\n });\n closeEndpoint(endpoint, \"Runtime initialization failed\");\n }\n throw new RuntimeInitializationError({\n pluginId: detail.pluginId,\n unitId: detail.unitId,\n phase: \"startup\",\n error: detail.message,\n });\n });\n } catch (error) {\n startupError = error;\n runtimeState = \"failed\";\n emit();\n readyPromise = Promise.reject(error instanceof RuntimeInitializationError\n ? error\n : new RuntimeInitializationError({ phase: \"validate\", error: errorMessage(error) }));\n void readyPromise.catch(() => undefined);\n }\n\n const app: SharedWorkerApp = {\n runtimeKind: \"shared-worker\",\n runtimeId,\n runtimeInstanceId,\n ready: () => readyPromise,\n async reconcile() {\n if (!host) {\n await readyPromise;\n return;\n }\n if (runtimeState === \"failed\" || runtimeState === \"stopping\" || runtimeState === \"disposed\" || disposed) {\n await readyPromise;\n return;\n }\n await host.reconcile();\n },\n state: currentSnapshot,\n subscribe(listener) {\n listeners.add(listener);\n listener(currentSnapshot());\n return () => listeners.delete(listener);\n },\n dispose(reason = \"shared worker runtime disposed\") {\n if (disposePromise) return disposePromise;\n // Close admission before publishing stopping or entering async Host\n // drain. No later onconnect may reach a domain hook or Provider.\n acceptingConnections = false;\n runtimeState = \"stopping\";\n revision += 1;\n // Publish stopping while endpoints are still open. publishEndpoint also\n // clears the Provider directory, aborting pending calls before the\n // asynchronous Host drain starts.\n publishAll();\n emit();\n disposePromise = (async () => {\n let result: LifecycleDisposeResult;\n let failure: unknown;\n try {\n result = host\n ? await host.dispose(reason)\n : { scopeId: `runtime:${runtimeInstanceId}`, state: \"stopped\" as const, attempted: 0, released: 0, pending: [], errors: [], cleanupIncomplete: false };\n } catch (error) {\n failure = error;\n result = {\n scopeId: `runtime:${runtimeInstanceId}`,\n state: \"stopped\",\n attempted: 0,\n released: 0,\n pending: [],\n errors: [{ resourceId: \"runtime.dispose\", code: \"lifecycle.cleanup_failed\", message: errorMessage(error) }],\n cleanupIncomplete: true,\n };\n }\n\n // Keep both terminal snapshots observable before closing any port.\n // The Provider has already been emptied by the stopping publication;\n // this second publication gives clients a deterministic terminal state.\n runtimeState = \"disposed\";\n revision += 1;\n publishAll();\n emit();\n disposed = true;\n for (const endpoint of [...endpoints]) closeEndpoint(endpoint, reason);\n if (failure) throw failure;\n return result;\n })();\n return disposePromise;\n },\n };\n void startupError;\n return app;\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"]}