51 lines
3.0 KiB
Markdown
51 lines
3.0 KiB
Markdown
# 03 · Endor 执行、并发请求与发布
|
||
|
||
## 完整程序提交的时序
|
||
|
||

|
||
|
||
[放大 SVG](uml/rendered/publication.svg) · [编辑 UML 源码](uml/publication.puml)
|
||
|
||
图简化了 HTTP Response 的持有:原始请求在入队后由 worker 完成响应,不是 GUI 执行 HTTP 请求。可编辑来源:[publication.puml](uml/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 的活对象修改不能混为一谈。
|
||
|
||
## 代际与失败边界
|
||
|
||

|
||
|
||
[放大 SVG](uml/rendered/runtime.svg) · [编辑 UML 源码](uml/runtime.puml)
|
||
|
||
这是候选和活跃运行时的概念状态图,并非源码中一个同名 enum。刷新具体由 `RefreshWork`、`PendingLayout`、paint Work 与 worker 的 PendingRequest 协作,不能在挂起时换一个 VM 恢复。
|
||
|
||
## 异步任务
|
||
|
||
`ui.after`、`ui.readText`、`ui.fetchText` 和协作任务由托管 Task 表示。回调及 scope 是 VM 强边,调度索引保留弱身份。I/O 池只接收路径/URL等原生数据、取消控制及完成消息,不拿着 ObjectRef 在其他线程调用 VM。
|
||
|
||

|
||
|
||
[放大 SVG](uml/rendered/tasks.svg) · [编辑 UML 源码](uml/tasks.puml)
|
||
|
||
源码的 Task 状态为 pending、running、completed、cancelled、failed;具体 provider 可能在 Pending 期间已开展后台 I/O,图中的 Running 不表示后台 I/O 一定此时才启动。见 [tasks.puml](uml/tasks.puml)。
|
||
|
||
## 预算与实际边界
|
||
|
||
源码上限 1 MiB;AST 访问上限 10000、深度 64;VM 栈帧上限 128;指令预算、UI 对象和页面预算各有上限。完整脚本各输入共享分摊总指令额度;Console 还检查累计来源与活对象限制。队列上限是 8,不是无限吞吐。
|
||
|
||
这些预算帮助限制失控工作,**不构成执行任意不可信代码的安全沙箱**。当前程序仍运行在桌面进程内,文件和网络能力没有完成产品级权限治理。
|