一期已实现

Cordis 风格云端扩展运行时

扩展不是能随意读取 Worker 绑定的脚本片段,而是由云端控制面创建、在服务器租户 Context 中运行、受依赖图与能力权限约束的生命周期单元。

一期已实现

Cordis 风格云端扩展运行时

扩展不是能随意读取 Worker 绑定的脚本片段,而是由云端控制面创建、在服务器租户 Context 中运行、受依赖图与能力权限约束的生命周期单元。

  1. Extension Context

    每个已启动扩展拥有独立 Context:其中保存扩展标识、所属服务器与租户、解析后的依赖、已获授权的能力、运行状态和专属 disposer 栈。扩展之间不共享可变全局状态,Context 是资源与授权的唯一宿主。

  2. 依赖拓扑

    控制面将扩展清单中的依赖构成有向图,在启动或更新前检查缺失依赖、循环依赖和版本约束。只有依赖全部处于可用状态时,目标扩展才可启动。

  3. LIFO disposer

    Context 使用后进先出释放策略。资源通常有依赖建立顺序:最后登记的订阅、任务或桥接句柄最先释放,先登记的底层资源最后关闭。

原子热更新与 last-known-good

更新从候选包与候选配置开始,而不是原地改写正在运行的实例。控制面先校验清单、依赖图、授权能力和沙箱装载,再在独立候选 Context 中启动。

  1. 01验证候选扩展的标识、版本、依赖、配置结构与能力声明。
  2. 02在不影响当前运行实例的候选 Context 中装载 Lua 或 JavaScript 沙箱,并等待启动完成。
  3. 03候选启动成功后,原子切换活动版本指针;新的 Context 成为唯一可接收控制面操作的实例。
  4. 04旧实例按 LIFO disposer 完整退出;成功运行的版本与已解析配置被保存为 last-known-good。
  5. 05候选任一步失败时,候选 Context 立即释放,活动实例和 last-known-good 保持不变,不以部分更新覆盖线上扩展。

云端增删、启停与审计

已登录服主只能在自己拥有的服务器范围内创建、编辑、安装、更新、启用、禁用、启动、停止和删除扩展。控制面负责状态机与资源清理,不把这些操作下放给浏览器本地状态。

操作

创建与编辑

结果
保存扩展标识、清单、配置和依赖声明,但不会绕开权限与依赖校验直接运行。

启动与启用

结果
验证依赖图与能力后创建 Context;成功才标记为运行中。

停止与禁用

结果
阻止新工作进入,按依赖反序和 LIFO disposer 释放资源,再更新状态。

热更新

结果
在候选 Context 中验证并启动,原子切换或保留 last-known-good。

删除

结果
先完成停止与资源释放,再删除该服务器范围内的扩展记录;不会跨租户删除同名扩展。

可追溯审计

每次控制面动作都会记录发起用户、所属租户与服务器、扩展标识、动作、结果、时间、关联版本和失败原因摘要。敏感配置、API Key 和沙箱源代码不写入可见审计字段。

事件入口
  • 创建、编辑、授权变更、安装、启用、禁用、启动、停止、删除。
  • 依赖图拒绝、权限拒绝、沙箱装载失败、disposer 失败、热更新成功与回退到 last-known-good。