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 +1 -1
- package/dist/advanced.d.ts +20 -8
- package/dist/advanced.js +4 -4
- package/dist/advanced.js.map +1 -1
- package/dist/{chunk-JHJZIO2H.js → chunk-CKML74MG.js} +25 -4
- package/dist/chunk-CKML74MG.js.map +1 -0
- package/dist/{chunk-YOIH6H36.js → chunk-RRNUE457.js} +112 -32
- package/dist/chunk-RRNUE457.js.map +1 -0
- package/dist/{chunk-RAQOFUZY.js → chunk-XVD7ALPV.js} +461 -46
- package/dist/chunk-XVD7ALPV.js.map +1 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +4 -4
- package/dist/{messageBus-CtrwkjrO.d.ts → messageBus-BDtkjs6y.d.ts} +1 -1
- package/dist/messagePortServiceTransport-DyNmdgoa.d.ts +150 -0
- package/dist/react.d.ts +1 -1
- package/dist/react.js +1 -1
- package/dist/{runtimeTypes-DquUCHz-.d.ts → runtimeTypes-CleHMFaq.d.ts} +269 -3
- package/dist/{sharedWorkerHost-Cb2a1_KD.d.ts → sharedWorkerHost-BNMUW-8v.d.ts} +37 -2
- package/dist/testing.d.ts +6 -6
- package/dist/testing.js +4 -4
- package/dist/{windowRuntime-B6Ue8jso.d.ts → windowRuntime-BGl_jfbK.d.ts} +2 -2
- package/docs/api.md +1 -1
- package/docs/proposals/webloom-v4/verification.md +100 -54
- package/package.json +5 -3
- package/dist/chunk-JHJZIO2H.js.map +0 -1
- package/dist/chunk-RAQOFUZY.js.map +0 -1
- package/dist/chunk-YOIH6H36.js.map +0 -1
- package/dist/messagePortServiceTransport-B0FyJr43.d.ts +0 -264
package/README.md
CHANGED
package/dist/advanced.d.ts
CHANGED
|
@@ -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
|
|
2
|
-
export {
|
|
3
|
-
import {
|
|
4
|
-
export { C as CreateCapabilityBridgeOptions, b as CreatePluginIntentControllerOptions, c as
|
|
5
|
-
import { R as ReceivePortLedger, a as RuntimeLimitsInput, b as RuntimeBudget, c as RuntimePluginDefinition } from './sharedWorkerHost-
|
|
6
|
-
export { C as CreateResourceScopeOptions, P as PeerController, d as PeerExposureOptions, e as ResourceScopeOptions, S as SharedWorkerApp,
|
|
7
|
-
export { c as createWindowAppFromHost, h as hostForWindowApp } from './windowRuntime-
|
|
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-
|
|
3
|
-
export { bridgeForRuntimeHandle, createCapabilityBridge, createMessagePortRuntimeTransport, createMessagePortServiceProvider, validateTransferables } from './chunk-
|
|
4
|
-
import { hostForWindowApp, materializePluginDefinitions, UpgradeGateRejectedError } from './chunk-
|
|
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-
|
|
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) {
|
package/dist/advanced.js.map
CHANGED
|
@@ -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-
|
|
4018
|
-
//# sourceMappingURL=chunk-
|
|
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
|