3.0 KiB
03 · Endor 执行、并发请求与发布
完整程序提交的时序
图简化了 HTTP Response 的持有:原始请求在入队后由 worker 完成响应,不是 GUI 执行 HTTP 请求。可编辑来源:publication.puml。
不同入口的语义
| 入口 | VM / 发布行为 |
|---|---|
GET /agent |
按当前 namespace 生成使用指南,不执行 Endor |
GET .../code |
读取最后成功发布的源码文本 |
PUT .../code |
新候选执行;成功后接替活跃运行时,失败保留原程序 |
POST .../repl |
在活跃 Console/程序 VM 内执行,不靠重放历史恢复对象 |
DELETE .../repl |
清理 Console 上下文,重新建立可用会话 |
DELETE .../code |
清空并使旧工作失去发布资格 |
POST .../events |
校验窗口、运行时代际与布局身份,再在拥有对象的 VM 中分发 |
POST .../evaluate |
独立表达式求值;不是替换当前页面的入口 |
在线契约以 GET http://127.0.0.1:4737/agent 为准,静态正文实现位于 runtime/api/guide.rs。
Console 的编译错误发生在执行前;运行期错误则可能保留此前已经完成的赋值,所以它不是数据库事务回滚。故障运行时有单独的停用/清理规则;完整 PUT 的隔离候选和 REPL 的活对象修改不能混为一谈。
代际与失败边界
这是候选和活跃运行时的概念状态图,并非源码中一个同名 enum。刷新具体由 RefreshWork、PendingLayout、paint Work 与 worker 的 PendingRequest 协作,不能在挂起时换一个 VM 恢复。
异步任务
ui.after、ui.readText、ui.fetchText 和协作任务由托管 Task 表示。回调及 scope 是 VM 强边,调度索引保留弱身份。I/O 池只接收路径/URL等原生数据、取消控制及完成消息,不拿着 ObjectRef 在其他线程调用 VM。
源码的 Task 状态为 pending、running、completed、cancelled、failed;具体 provider 可能在 Pending 期间已开展后台 I/O,图中的 Running 不表示后台 I/O 一定此时才启动。见 tasks.puml。
预算与实际边界
源码上限 1 MiB;AST 访问上限 10000、深度 64;VM 栈帧上限 128;指令预算、UI 对象和页面预算各有上限。完整脚本各输入共享分摊总指令额度;Console 还检查累计来源与活对象限制。队列上限是 8,不是无限吞吐。
这些预算帮助限制失控工作,不构成执行任意不可信代码的安全沙箱。当前程序仍运行在桌面进程内,文件和网络能力没有完成产品级权限治理。


