webloom-framework 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # WebLoom
2
2
 
3
- WebLoom 是一个只面向浏览器的插件 Runtime 框架。0.4.0 管理真实的
3
+ WebLoom 是一个只面向浏览器的插件 Runtime 框架。0.4.2 管理真实的
4
4
  `window-main` 和 `shared-worker` JavaScript realm、插件运行单元、实例、依赖图、
5
5
  ResourceScope、权限租约、typed capability、服务桥和资源缓存;路由、存储、日志、
6
6
  国际化等产品能力由插件或下游应用注入。
@@ -1,10 +1,10 @@
1
- import { R as RuntimeKind, C as CapabilityDescriptor, P as PluginManifest, a as PluginGraph, b as RuntimeUnitDependency, c as PluginReverseDep, d as RuntimeUnitDescriptor, L as LifecycleScopeIdentity, e as PluginPermission, f as LifecycleScope, g as PermissionLease, S as ScopedTaskScheduler, h as CreateUpgradeGateOptions, U as UpgradeGate, i as ServiceReference, j as CapabilityPeer, k as ResourceStoreApi$1, W as WindowApp, l as RuntimeHandle } from './runtimeTypes-DquUCHz-.js';
2
- export { m as CapabilityRegistration, n as CapabilityRegistry, o as ContextExtensionInput, p as ContributionAdapter, q as ContributionAdapterInput, r as ContributionHandle, s as CreatePluginHostOptions, H as HostCapabilityRegistration, t as HostInspection, u as PermissionPolicyInput, v as PermissionPolicyResult, w as PluginConfigStore, x as PluginHost, y as RuntimeUnitAttributesInput, z as RuntimeUnitAvailabilityInput, A as RuntimeUnitParentScopeInput, B as RuntimeUnitSnapshot, D as StartupCapabilityError, E as StartupPluginError, F as createCapabilityRegistry, G as createInMemoryPluginConfigStore, I as createPluginHost, J as invokeCapabilityHandler } from './runtimeTypes-DquUCHz-.js';
3
- import { R as RuntimeCallMessage, M as MessagePortLike, a as RuntimeTransport } from './messagePortServiceTransport-B0FyJr43.js';
4
- export { C as CreateCapabilityBridgeOptions, b as CreatePluginIntentControllerOptions, c as RUNTIME_CALL_TYPE, d as RUNTIME_CANCEL_TYPE, e as RUNTIME_CREDIT_TYPE, f as RUNTIME_ERROR_MESSAGE_TYPE, g as RUNTIME_ERROR_TYPE, h as RUNTIME_NEXT_TYPE, i as RUNTIME_PROTOCOL_VERSION, j as RUNTIME_RESULT_TYPE, k as RUNTIME_SNAPSHOT_TYPE, l as RuntimeCancelMessage, m as RuntimeCreditMessage, n as RuntimeErrorMessage, o as RuntimeErrorResponseMessage, p as RuntimeMessageCodec, q as RuntimeNextMessage, r as RuntimeReceiveMetadata, s as RuntimeResultMessage, t as RuntimeSnapshotMessage, u as RuntimeSnapshotUnit, v as RuntimeStreamDoneMessage, w as RuntimeStreamReadyMessage, x as RuntimeUnaryResultMessage, y as RuntimeUnitImplementation, z as RuntimeWireMessage, A as createCapabilityBridge, B as createMessagePortRuntimeTransport, D as createPluginIntentController, E as createResourceRegistry, F as createRuntimeMessageCodec, G as createRuntimeUnitImplementationRegistry, H as isRuntimeSnapshot, I as registerOwnedResource, J as validateTransferables } from './messagePortServiceTransport-B0FyJr43.js';
5
- import { R as ReceivePortLedger, a as RuntimeLimitsInput, b as RuntimeBudget, c as RuntimePluginDefinition } from './sharedWorkerHost-Cb2a1_KD.js';
6
- export { C as CreateResourceScopeOptions, P as PeerController, d as PeerExposureOptions, e as ResourceScopeOptions, S as SharedWorkerApp, f as StartSharedWorkerAppForTestingOptions, g as StartSharedWorkerAppOptions, h as bridgeForRuntimeHandle, i as createLifecycleScope, j as createResourceScope } from './sharedWorkerHost-Cb2a1_KD.js';
7
- export { c as createWindowAppFromHost, h as hostForWindowApp } from './windowRuntime-B6Ue8jso.js';
1
+ import { R as RuntimeKind, C as CapabilityDescriptor, P as PluginManifest, a as PluginGraph, b as RuntimeUnitDependency, c as PluginReverseDep, d as RuntimeUnitDescriptor, L as LifecycleScopeIdentity, e as PluginPermission, f as LifecycleScope, g as PermissionLease, S as ScopedTaskScheduler, h as CreateUpgradeGateOptions, U as UpgradeGate, i as RuntimeCallMessage, j as ServiceReference, k as RuntimeEndpointBinding, l as CapabilityPeer, m as RuntimeDrainResult, n as ResourceStoreApi$1, W as WindowApp, o as RuntimeHandle } from './runtimeTypes-CleHMFaq.js';
2
+ export { p as CapabilityRegistration, q as CapabilityRegistry, r as ContextExtensionInput, s as ContributionAdapter, t as ContributionAdapterInput, u as ContributionHandle, v as CreatePluginHostOptions, H as HostCapabilityRegistration, w as HostInspection, x as PermissionPolicyInput, y as PermissionPolicyResult, z as PluginConfigStore, A as PluginHost, B as RUNTIME_CALL_TYPE, D as RUNTIME_CANCEL_TYPE, E as RUNTIME_CLOSE_ACK_TYPE, F as RUNTIME_CLOSE_TYPE, G as RUNTIME_CREDIT_TYPE, I as RUNTIME_ERROR_MESSAGE_TYPE, J as RUNTIME_ERROR_TYPE, K as RUNTIME_NEXT_TYPE, M as RUNTIME_PROTOCOL_VERSION, N as RUNTIME_RESULT_TYPE, O as RUNTIME_SNAPSHOT_TYPE, Q as RuntimeCancelMessage, T as RuntimeCloseAckMessage, V as RuntimeCloseMessage, X as RuntimeCreditMessage, Y as RuntimeErrorMessage, Z as RuntimeErrorResponseMessage, _ as RuntimeMessageCodec, $ as RuntimeNextMessage, a0 as RuntimeResultMessage, a1 as RuntimeSessionBinding, a2 as RuntimeSnapshotMessage, a3 as RuntimeSnapshotUnit, a4 as RuntimeStreamDoneMessage, a5 as RuntimeStreamReadyMessage, a6 as RuntimeUnaryResultMessage, a7 as RuntimeUnitAttributesInput, a8 as RuntimeUnitAvailabilityInput, a9 as RuntimeUnitParentScopeInput, aa as RuntimeUnitSnapshot, ab as RuntimeWireMessage, ac as StartupCapabilityError, ad as StartupPluginError, ae as createCapabilityRegistry, af as createInMemoryPluginConfigStore, ag as createPluginHost, ah as createRuntimeMessageCodec, ai as invokeCapabilityHandler, aj as isRuntimeSnapshot } from './runtimeTypes-CleHMFaq.js';
3
+ import { M as MessagePortLike, R as RuntimeTransport, a as RuntimeEndpointSession } from './messagePortServiceTransport-DyNmdgoa.js';
4
+ export { C as CreateCapabilityBridgeOptions, b as CreatePluginIntentControllerOptions, D as DEFAULT_RUNTIME_DRAIN_TIMEOUT_MS, c as RuntimeDrainParticipant, d as RuntimeReceiveMetadata, e as RuntimeUnitImplementation, f as createCapabilityBridge, g as createMessagePortRuntimeTransport, h as createPluginIntentController, i as createResourceRegistry, j as createRuntimeEndpointBinding, k as createRuntimeEndpointSession, l as createRuntimeUnitImplementationRegistry, m as isRuntimeEndpointBinding, r as registerOwnedResource, s as sameRuntimeEndpointBinding, v as validateTransferables } from './messagePortServiceTransport-DyNmdgoa.js';
5
+ import { R as ReceivePortLedger, a as RuntimeLimitsInput, b as RuntimeBudget, c as RuntimePluginDefinition } from './sharedWorkerHost-BNMUW-8v.js';
6
+ export { A as ActivePeerSnapshot, C as CreateResourceScopeOptions, P as PeerController, d as PeerExposureOptions, e as PeerLifecycleEvent, f as ResourceScopeOptions, S as SharedWorkerApp, g as StartSharedWorkerAppForTestingOptions, h as StartSharedWorkerAppOptions, i as bridgeForRuntimeHandle, j as createLifecycleScope, k as createResourceScope } from './sharedWorkerHost-BNMUW-8v.js';
7
+ export { c as createWindowAppFromHost, h as hostForWindowApp } from './windowRuntime-BGl_jfbK.js';
8
8
 
9
9
  interface PluginGraphOptions {
10
10
  /** 当前 Host 的 Runtime;未指定时只用于静态检查。 */
@@ -110,6 +110,8 @@ interface MessagePortServiceCallInput {
110
110
  readonly signal: AbortSignal;
111
111
  /** 本端以接收时钟计算的调用截止时间。 */
112
112
  readonly deadlineAt: number;
113
+ /** 发起此调用的物理 endpoint binding。 */
114
+ readonly binding: RuntimeEndpointBinding;
113
115
  /** 对端 peer 视图。 */
114
116
  readonly peer?: CapabilityPeer;
115
117
  }
@@ -146,11 +148,21 @@ interface MessagePortServiceProviderOptions {
146
148
  readonly limits?: RuntimeLimitsInput;
147
149
  /** 可选的 Runtime 方向共享计数器。 */
148
150
  readonly budget?: RuntimeBudget;
151
+ /** 当前物理 endpoint 的框架 binding;省略时由 provider 生成。 */
152
+ readonly binding?: RuntimeEndpointBinding;
153
+ /** 与同一端口 bridge 共用的 endpoint session。 */
154
+ readonly session?: RuntimeEndpointSession;
155
+ /** 关闭握手默认 drain deadline。 */
156
+ readonly drainTimeoutMs?: number;
149
157
  }
150
158
  /** 创建一个严格 bounded 的 MessagePort provider。 */
151
159
  declare function createMessagePortServiceProvider(options: MessagePortServiceProviderOptions): {
152
160
  setServices(): void;
153
161
  dispose(): void;
162
+ readonly binding: RuntimeEndpointBinding;
163
+ readonly endpointState: "active" | "closing" | "closed";
164
+ beginClose(reason?: string): void;
165
+ drain(timeoutMs?: number): Promise<RuntimeDrainResult>;
154
166
  pendingCount(): number;
155
167
  executionCount(): number;
156
168
  nonCooperativeExecutionCount(): number;
@@ -165,4 +177,4 @@ declare function registerPlugins(app: WindowApp, definitions: readonly RuntimePl
165
177
  /** 把一个连接绑定到现有 WindowApp;替换时先撤销旧 bridge。 */
166
178
  declare function attachRemote(app: WindowApp, runtime: RuntimeHandle): Promise<() => void>;
167
179
 
168
- export { type CreatePermissionLeaseOptions, type CreateScopedRegistryFacadeOptions, type CreateScopedTaskSchedulerOptions, MessagePortLike, type MessagePortServiceCallInput, type MessagePortServiceProviderOptions, type PluginGraphOptions, type PreparedRequest, type ResourceStoreApi, RuntimeCallMessage, RuntimeTransport, type ScopedRegistryRegistration, type VerifyPermissionLeaseOptions, attachRemote, buildPluginGraph, createMessagePortServiceProvider, createPermissionLease, createScopedRegistryFacade, createScopedTaskScheduler, createUpgradeGate, dependenciesOfManifest, providesOfManifest, registerPlugins, reverseDependentsOf, selectRuntimeUnit, validatePluginGraph, verifyPermissionLease };
180
+ export { type CreatePermissionLeaseOptions, type CreateScopedRegistryFacadeOptions, type CreateScopedTaskSchedulerOptions, MessagePortLike, type MessagePortServiceCallInput, type MessagePortServiceProviderOptions, type PluginGraphOptions, type PreparedRequest, type ResourceStoreApi, RuntimeCallMessage, RuntimeEndpointSession, RuntimeTransport, type ScopedRegistryRegistration, type VerifyPermissionLeaseOptions, attachRemote, buildPluginGraph, createMessagePortServiceProvider, createPermissionLease, createScopedRegistryFacade, createScopedTaskScheduler, createUpgradeGate, dependenciesOfManifest, providesOfManifest, registerPlugins, reverseDependentsOf, selectRuntimeUnit, validatePluginGraph, verifyPermissionLease };
package/dist/advanced.js CHANGED
@@ -1,8 +1,8 @@
1
1
  export { createPluginIntentController } from './chunk-4DSINPZD.js';
2
- import { bridgeForRuntimeHandle } from './chunk-RAQOFUZY.js';
3
- export { bridgeForRuntimeHandle, createCapabilityBridge, createMessagePortRuntimeTransport, createMessagePortServiceProvider, validateTransferables } from './chunk-RAQOFUZY.js';
4
- import { hostForWindowApp, materializePluginDefinitions, UpgradeGateRejectedError } from './chunk-JHJZIO2H.js';
5
- export { RUNTIME_CALL_TYPE, RUNTIME_CANCEL_TYPE, RUNTIME_CREDIT_TYPE, RUNTIME_ERROR_MESSAGE_TYPE, RUNTIME_ERROR_TYPE, RUNTIME_NEXT_TYPE, RUNTIME_PROTOCOL_VERSION, RUNTIME_RESULT_TYPE, RUNTIME_SNAPSHOT_TYPE, StartupCapabilityError, StartupPluginError, buildPluginGraph, createCapabilityRegistry, createInMemoryPluginConfigStore, createLifecycleScope, createPermissionLease, createPluginHost, createResourceRegistry, createResourceScope, createRuntimeMessageCodec, createRuntimeUnitImplementationRegistry, createScopedTaskScheduler, createWindowAppFromHost, dependenciesOfManifest, hostForWindowApp, invokeCapabilityHandler, isRuntimeSnapshot, providesOfManifest, registerOwnedResource, reverseDependentsOf, selectRuntimeUnit, validatePluginGraph } from './chunk-JHJZIO2H.js';
2
+ import { bridgeForRuntimeHandle } from './chunk-XVD7ALPV.js';
3
+ export { DEFAULT_RUNTIME_DRAIN_TIMEOUT_MS, bridgeForRuntimeHandle, createCapabilityBridge, createMessagePortRuntimeTransport, createMessagePortServiceProvider, createRuntimeEndpointBinding, createRuntimeEndpointSession, isRuntimeEndpointBinding, sameRuntimeEndpointBinding, validateTransferables } from './chunk-XVD7ALPV.js';
4
+ import { hostForWindowApp, materializePluginDefinitions, UpgradeGateRejectedError } from './chunk-CKML74MG.js';
5
+ export { RUNTIME_CALL_TYPE, RUNTIME_CANCEL_TYPE, RUNTIME_CLOSE_ACK_TYPE, RUNTIME_CLOSE_TYPE, RUNTIME_CREDIT_TYPE, RUNTIME_ERROR_MESSAGE_TYPE, RUNTIME_ERROR_TYPE, RUNTIME_NEXT_TYPE, RUNTIME_PROTOCOL_VERSION, RUNTIME_RESULT_TYPE, RUNTIME_SNAPSHOT_TYPE, StartupCapabilityError, StartupPluginError, buildPluginGraph, createCapabilityRegistry, createInMemoryPluginConfigStore, createLifecycleScope, createPermissionLease, createPluginHost, createResourceRegistry, createResourceScope, createRuntimeMessageCodec, createRuntimeUnitImplementationRegistry, createScopedTaskScheduler, createWindowAppFromHost, dependenciesOfManifest, hostForWindowApp, invokeCapabilityHandler, isRuntimeSnapshot, providesOfManifest, registerOwnedResource, reverseDependentsOf, selectRuntimeUnit, validatePluginGraph } from './chunk-CKML74MG.js';
6
6
 
7
7
  // src/lifecycle/permissionVerifier.ts
8
8
  function verifyPermissionLease(options) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lifecycle/permissionVerifier.ts","../src/lifecycle/scopedRegistry.ts","../src/lifecycle/upgradeGate.ts","../src/advanced.ts"],"names":["input"],"mappings":"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","file":"advanced.js","sourcesContent":["// 权限租约的最终边界验证器。\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","// WebLoom v4 advanced 装配入口。\n// 这些 API 是同一套 Host/transport 实现的显式扩展,不提供旧 API 兼容层。\n\nexport * from \"./host/createPluginHost.js\";\nexport * from \"./host/pluginGraph.js\";\nexport * from \"./host/capabilityRegistry.js\";\nexport * from \"./host/runtimeUnitImplementationRegistry.js\";\nexport * from \"./lifecycle/resourceScope.js\";\nexport * from \"./lifecycle/permissionLease.js\";\nexport * from \"./lifecycle/permissionVerifier.js\";\nexport * from \"./lifecycle/pluginIntentController.js\";\nexport * from \"./lifecycle/taskScheduler.js\";\nexport * from \"./lifecycle/scopedRegistry.js\";\nexport * from \"./lifecycle/upgradeGate.js\";\nexport { createResourceRegistry, registerOwnedResource } from \"./resources/resourceRegistry.js\";\n/** Resource Store 的 advanced 类型出口;显式 alias 可被 dts bundler 保留。 */\nexport type ResourceStoreApi = import(\"./resources/resourceStore.js\").ResourceStoreApi;\nexport * from \"./transport/serviceBridge.js\";\nexport * from \"./transport/messagePortServiceTransport.js\";\nexport * from \"./transport/messagePortServiceProvider.js\";\nexport { createWindowAppFromHost, hostForWindowApp } from \"./runtime/windowRuntime.js\";\nexport { bridgeForRuntimeHandle } from \"./runtime/connectSharedWorker.js\";\nexport type { PeerController, PeerExposureOptions, StartSharedWorkerAppOptions, StartSharedWorkerAppForTestingOptions, SharedWorkerApp } from \"./runtime/sharedWorkerHost.js\";\nexport * from \"./runtime/runtimeProtocol.js\";\n\nimport type { RuntimeHandle, WindowApp } from \"./runtime/runtimeTypes.js\";\nimport type { RuntimePluginDefinition } from \"./runtime/pluginDefinitions.js\";\nimport { materializePluginDefinitions } from \"./runtime/pluginDefinitions.js\";\nimport { hostForWindowApp } from \"./runtime/windowRuntime.js\";\nimport { bridgeForRuntimeHandle } from \"./runtime/connectSharedWorker.js\";\nimport type { CapabilityBridge } from \"./contracts/capability.js\";\n\n/** 分阶段向已经拥有的 App 注册新的 typed plugin definitions。 */\nexport async function registerPlugins(app: WindowApp, definitions: readonly RuntimePluginDefinition[]): Promise<void> {\n const host = hostForWindowApp(app);\n const materialized = materializePluginDefinitions(definitions, app.runtimeKind);\n for (const definition of materialized) host.registerImplementation({ pluginId: definition.manifest.id, unitId: definition.unitId, setup: definition.setup, capabilities: definition.capabilities });\n await host.registerAll(materialized.map((definition) => definition.manifest));\n}\n\n/** 把一个连接绑定到现有 WindowApp;替换时先撤销旧 bridge。 */\nexport async function attachRemote(app: WindowApp, runtime: RuntimeHandle): Promise<() => void> {\n const host = hostForWindowApp(app);\n const bridge: CapabilityBridge = bridgeForRuntimeHandle(runtime);\n host.attachRemote(bridge);\n await host.reconcile();\n return () => host.detachRemote(\"Remote Runtime detached\");\n}\n"]}
1
+ {"version":3,"sources":["../src/lifecycle/permissionVerifier.ts","../src/lifecycle/scopedRegistry.ts","../src/lifecycle/upgradeGate.ts","../src/advanced.ts"],"names":["input"],"mappings":"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","file":"advanced.js","sourcesContent":["// 权限租约的最终边界验证器。\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","// WebLoom v4 advanced 装配入口。\n// 这些 API 是同一套 Host/transport 实现的显式扩展,不提供旧 API 兼容层。\n\nexport * from \"./host/createPluginHost.js\";\nexport * from \"./host/pluginGraph.js\";\nexport * from \"./host/capabilityRegistry.js\";\nexport * from \"./host/runtimeUnitImplementationRegistry.js\";\nexport * from \"./lifecycle/resourceScope.js\";\nexport * from \"./lifecycle/permissionLease.js\";\nexport * from \"./lifecycle/permissionVerifier.js\";\nexport * from \"./lifecycle/pluginIntentController.js\";\nexport * from \"./lifecycle/taskScheduler.js\";\nexport * from \"./lifecycle/scopedRegistry.js\";\nexport * from \"./lifecycle/upgradeGate.js\";\nexport { createResourceRegistry, registerOwnedResource } from \"./resources/resourceRegistry.js\";\n/** Resource Store 的 advanced 类型出口;显式 alias 可被 dts bundler 保留。 */\nexport type ResourceStoreApi = import(\"./resources/resourceStore.js\").ResourceStoreApi;\nexport * from \"./transport/serviceBridge.js\";\nexport * from \"./transport/messagePortServiceTransport.js\";\nexport * from \"./transport/messagePortServiceProvider.js\";\nexport { createWindowAppFromHost, hostForWindowApp } from \"./runtime/windowRuntime.js\";\nexport { bridgeForRuntimeHandle } from \"./runtime/connectSharedWorker.js\";\nexport type { ActivePeerSnapshot, PeerController, PeerExposureOptions, PeerLifecycleEvent, StartSharedWorkerAppOptions, StartSharedWorkerAppForTestingOptions, SharedWorkerApp } from \"./runtime/sharedWorkerHost.js\";\nexport * from \"./runtime/runtimeProtocol.js\";\nexport * from \"./runtime/runtimeSession.js\";\n\nimport type { RuntimeHandle, WindowApp } from \"./runtime/runtimeTypes.js\";\nimport type { RuntimePluginDefinition } from \"./runtime/pluginDefinitions.js\";\nimport { materializePluginDefinitions } from \"./runtime/pluginDefinitions.js\";\nimport { hostForWindowApp } from \"./runtime/windowRuntime.js\";\nimport { bridgeForRuntimeHandle } from \"./runtime/connectSharedWorker.js\";\nimport type { CapabilityBridge } from \"./contracts/capability.js\";\n\n/** 分阶段向已经拥有的 App 注册新的 typed plugin definitions。 */\nexport async function registerPlugins(app: WindowApp, definitions: readonly RuntimePluginDefinition[]): Promise<void> {\n const host = hostForWindowApp(app);\n const materialized = materializePluginDefinitions(definitions, app.runtimeKind);\n for (const definition of materialized) host.registerImplementation({ pluginId: definition.manifest.id, unitId: definition.unitId, setup: definition.setup, capabilities: definition.capabilities });\n await host.registerAll(materialized.map((definition) => definition.manifest));\n}\n\n/** 把一个连接绑定到现有 WindowApp;替换时先撤销旧 bridge。 */\nexport async function attachRemote(app: WindowApp, runtime: RuntimeHandle): Promise<() => void> {\n const host = hostForWindowApp(app);\n const bridge: CapabilityBridge = bridgeForRuntimeHandle(runtime);\n host.attachRemote(bridge);\n await host.reconcile();\n return () => host.detachRemote(\"Remote Runtime detached\");\n}\n"]}
@@ -485,11 +485,17 @@ function validateTransferListWithStats(value, transfer, options = {}) {
485
485
  maxEdges: limits.maxDtoEdges,
486
486
  maxBudgetBytes: limits.maxMessageBudgetBytes
487
487
  },
488
+ // MessagePort presence is checked below so a missing declaration is
489
+ // reported as a transfer-contract error, while the walker still validates
490
+ // the complete DTO graph and preserves the actual port identity set.
491
+ allowUnlistedMessagePorts: true,
488
492
  transferables: new Set(result),
489
493
  phase: options.phase ?? "validate"
490
494
  });
491
495
  const reachable = new Set(stats.reachableTransferables);
492
496
  if (result.some((item) => !reachable.has(item))) throw new WebLoomError("transfer_invalid", "Capability transfer resource is not reachable from its payload", options.phase ?? "validate");
497
+ const declared = new Set(result);
498
+ if (stats.messagePorts.some((port) => !declared.has(port))) throw new WebLoomError("transfer_invalid", "Capability payload contains a MessagePort missing from its transfer declaration", options.phase ?? "validate");
493
499
  return { transfer: Object.freeze(result), stats };
494
500
  }
495
501
  function validateTransferList(value, transfer, options = {}) {
@@ -608,6 +614,8 @@ var RUNTIME_ERROR_MESSAGE_TYPE = `${RUNTIME_PROTOCOL_VERSION}.error`;
608
614
  var RUNTIME_CANCEL_TYPE = `${RUNTIME_PROTOCOL_VERSION}.cancel`;
609
615
  var RUNTIME_NEXT_TYPE = `${RUNTIME_PROTOCOL_VERSION}.next`;
610
616
  var RUNTIME_CREDIT_TYPE = `${RUNTIME_PROTOCOL_VERSION}.credit`;
617
+ var RUNTIME_CLOSE_TYPE = `${RUNTIME_PROTOCOL_VERSION}.close`;
618
+ var RUNTIME_CLOSE_ACK_TYPE = `${RUNTIME_PROTOCOL_VERSION}.close-ack`;
611
619
  function record(value) {
612
620
  return !!value && typeof value === "object" && !Array.isArray(value);
613
621
  }
@@ -658,11 +666,21 @@ function validDetails(value) {
658
666
  function validIdentity(message2) {
659
667
  return boundedText(message2.protocolVersion, MAX_VERSION_LENGTH) && message2.protocolVersion === RUNTIME_PROTOCOL_VERSION;
660
668
  }
669
+ function validBinding(value) {
670
+ if (!record(value)) return false;
671
+ return boundedText(value.runtimeInstanceId, MAX_ID_LENGTH) && boundedText(value.connectionId, MAX_ID_LENGTH);
672
+ }
673
+ function validDrainResult(value) {
674
+ if (typeof value.drained !== "boolean" || typeof value.timedOut !== "boolean" || !Number.isSafeInteger(value.pendingExecutions) || value.pendingExecutions < 0) return false;
675
+ if (value.drained && (value.timedOut || value.pendingExecutions !== 0)) return false;
676
+ if (value.timedOut && (!value.pendingExecutions || value.drained)) return false;
677
+ return true;
678
+ }
661
679
  function validServiceIdentity(message2) {
662
680
  return boundedText(message2.callId, MAX_CALL_ID_LENGTH) && boundedText(message2.serviceInstanceId, MAX_ID_LENGTH);
663
681
  }
664
682
  function validateSnapshot(value) {
665
- if (value.type !== RUNTIME_SNAPSHOT_TYPE || !validIdentity(value) || !boundedText(value.runtimeId, MAX_ID_LENGTH) || !boundedText(value.runtimeInstanceId, MAX_ID_LENGTH) || value.runtimeKind !== "window-main" && value.runtimeKind !== "shared-worker" || !Number.isSafeInteger(value.revision) || value.revision < 0 || !["starting", "ready", "stopping", "failed", "disposed"].includes(String(value.state)) || !Array.isArray(value.units) || !Array.isArray(value.services) || value.units.length > MAX_SNAPSHOT_UNITS || value.services.length > MAX_SNAPSHOT_SERVICES) return false;
683
+ if (value.type !== RUNTIME_SNAPSHOT_TYPE || !validIdentity(value) || !validBinding(value.binding) || !boundedText(value.runtimeId, MAX_ID_LENGTH) || !boundedText(value.runtimeInstanceId, MAX_ID_LENGTH) || value.runtimeKind !== "window-main" && value.runtimeKind !== "shared-worker" || !Number.isSafeInteger(value.revision) || value.revision < 0 || !["starting", "ready", "stopping", "failed", "disposed"].includes(String(value.state)) || !Array.isArray(value.units) || !Array.isArray(value.services) || value.units.length > MAX_SNAPSHOT_UNITS || value.services.length > MAX_SNAPSHOT_SERVICES) return false;
666
684
  if (value.state !== "ready" && value.services.length !== 0) return false;
667
685
  const unitKeys = /* @__PURE__ */ new Set();
668
686
  for (const unit of value.units) {
@@ -692,6 +710,7 @@ function validateSnapshot(value) {
692
710
  function validateMessage(value) {
693
711
  if (!record(value) || !text(value.type) || !validIdentity(value)) return false;
694
712
  if (value.type === RUNTIME_SNAPSHOT_TYPE) return validateSnapshot(value);
713
+ if (!validBinding(value.binding) && value.type !== RUNTIME_SNAPSHOT_TYPE) return false;
695
714
  if (value.type === RUNTIME_ERROR_TYPE) return boundedText(value.code, MAX_ID_LENGTH) && boundedText(value.message, MAX_ERROR_MESSAGE_LENGTH) && phase(value.phase) && (value.pluginId === void 0 || boundedText(value.pluginId, MAX_ID_LENGTH)) && (value.unitId === void 0 || boundedText(value.unitId, MAX_ID_LENGTH));
696
715
  if (value.type === RUNTIME_CALL_TYPE) return validServiceIdentity(value) && boundedText(value.capabilityId, MAX_ID_LENGTH) && boundedText(value.contractVersion, MAX_VERSION_LENGTH) && Object.hasOwn(value, "request") && validPayload(value.request) && (value.mode === "unary" || value.mode === "stream") && typeof value.timeoutMs === "number" && Number.isFinite(value.timeoutMs) && value.timeoutMs > 0 && value.timeoutMs <= 3e5 && (value.operationId === void 0 || boundedText(value.operationId, MAX_ID_LENGTH)) && (value.grantId === void 0 || boundedText(value.grantId, MAX_ID_LENGTH)) && (value.mode !== "stream" ? !Object.hasOwn(value, "initialCredit") : Number.isSafeInteger(value.initialCredit) && value.initialCredit >= 1 && value.initialCredit <= 256);
697
716
  if (value.type === RUNTIME_RESULT_TYPE) return validServiceIdentity(value) && ((!Object.hasOwn(value, "result") || validPayload(value.result)) && (value.streamReady === true && !Object.hasOwn(value, "result") && !Object.hasOwn(value, "done") || value.done === true && !Object.hasOwn(value, "result") && !Object.hasOwn(value, "streamReady") || Object.hasOwn(value, "result") && !Object.hasOwn(value, "done") && !Object.hasOwn(value, "streamReady")));
@@ -699,6 +718,8 @@ function validateMessage(value) {
699
718
  if (value.type === RUNTIME_CANCEL_TYPE) return validServiceIdentity(value);
700
719
  if (value.type === RUNTIME_NEXT_TYPE) return validServiceIdentity(value) && Object.hasOwn(value, "item") && validPayload(value.item) && Number.isSafeInteger(value.sequence) && value.sequence >= 1;
701
720
  if (value.type === RUNTIME_CREDIT_TYPE) return validServiceIdentity(value) && Number.isSafeInteger(value.count) && value.count >= 1 && value.count <= 256;
721
+ if (value.type === RUNTIME_CLOSE_TYPE) return !Object.hasOwn(value, "reason") && (value.timeoutMs === void 0 || Number.isFinite(value.timeoutMs) && value.timeoutMs >= 1 && value.timeoutMs <= 3e5);
722
+ if (value.type === RUNTIME_CLOSE_ACK_TYPE) return validBinding(value.acknowledgedBinding) && validDrainResult(value);
702
723
  return false;
703
724
  }
704
725
  function validPayload(value) {
@@ -4013,6 +4034,6 @@ function hostForWindowApp(app) {
4013
4034
  return host;
4014
4035
  }
4015
4036
 
4016
- export { DEFAULT_RUNTIME_LIMITS, LIFECYCLE_ERROR_TEXT, LifecycleScopeRevokedError, PermissionDeniedError, PermissionLeaseRevokedError, RESOURCE_OWNER, RESOURCE_REGISTRY, RUNTIME_CALL_TYPE, RUNTIME_CANCEL_TYPE, RUNTIME_CREDIT_TYPE, RUNTIME_ERROR_MESSAGE_TYPE, RUNTIME_ERROR_TYPE, RUNTIME_NEXT_TYPE, RUNTIME_PROTOCOL_VERSION, RUNTIME_RESULT_TYPE, RUNTIME_SNAPSHOT_TYPE, RuntimeInitializationError, RuntimeUnavailableError, SCOPED_TASK_SCHEDULER_CAPABILITY, StartupCapabilityError, StartupPluginError, UpgradeGateRejectedError, WebLoomError, assertCapability, assertReceivedPortSet, buildPluginGraph, capabilityDescriptor, capabilityKey, cloneFrozenAttributes, createCapabilityRegistry, createInMemoryPluginConfigStore, createLifecycleScope, createMessageBus, createPermissionLease, createPluginHost, createReceivePortLedger, createResourceRegistry, createResourceScope, createResourceStore, createRuntimeBudget, createRuntimeMessageCodec, createRuntimeUnitImplementationRegistry, createScopedTaskScheduler, createWindowApp, createWindowAppFromHost, defineCapability, dependenciesOfManifest, hostForWindowApp, invokeCapabilityHandler, isCapability, isCapabilityDescriptor, isRuntimeSnapshot, lifecycleErrorText, materializePluginDefinitions, normalizeRuntimeLimits, providesOfManifest, registerOwnedResource, reverseDependentsOf, selectRuntimeUnit, validateDto, validatePluginGraph, validateRawDto, validateTransferList, validateTransferListWithStats };
4017
- //# sourceMappingURL=chunk-JHJZIO2H.js.map
4018
- //# sourceMappingURL=chunk-JHJZIO2H.js.map
4037
+ export { DEFAULT_RUNTIME_LIMITS, LIFECYCLE_ERROR_TEXT, LifecycleScopeRevokedError, PermissionDeniedError, PermissionLeaseRevokedError, RESOURCE_OWNER, RESOURCE_REGISTRY, RUNTIME_CALL_TYPE, RUNTIME_CANCEL_TYPE, RUNTIME_CLOSE_ACK_TYPE, RUNTIME_CLOSE_TYPE, RUNTIME_CREDIT_TYPE, RUNTIME_ERROR_MESSAGE_TYPE, RUNTIME_ERROR_TYPE, RUNTIME_NEXT_TYPE, RUNTIME_PROTOCOL_VERSION, RUNTIME_RESULT_TYPE, RUNTIME_SNAPSHOT_TYPE, RuntimeInitializationError, RuntimeUnavailableError, SCOPED_TASK_SCHEDULER_CAPABILITY, StartupCapabilityError, StartupPluginError, UpgradeGateRejectedError, WebLoomError, assertCapability, assertReceivedPortSet, buildPluginGraph, capabilityDescriptor, capabilityKey, cloneFrozenAttributes, createCapabilityRegistry, createInMemoryPluginConfigStore, createLifecycleScope, createMessageBus, createPermissionLease, createPluginHost, createReceivePortLedger, createResourceRegistry, createResourceScope, createResourceStore, createRuntimeBudget, createRuntimeMessageCodec, createRuntimeUnitImplementationRegistry, createScopedTaskScheduler, createWindowApp, createWindowAppFromHost, defineCapability, dependenciesOfManifest, hostForWindowApp, invokeCapabilityHandler, isCapability, isCapabilityDescriptor, isRuntimeSnapshot, lifecycleErrorText, materializePluginDefinitions, normalizeRuntimeLimits, providesOfManifest, registerOwnedResource, reverseDependentsOf, selectRuntimeUnit, validateDto, validatePluginGraph, validateRawDto, validateTransferList, validateTransferListWithStats };
4038
+ //# sourceMappingURL=chunk-CKML74MG.js.map
4039
+ //# sourceMappingURL=chunk-CKML74MG.js.map