# 电脑端扩展 Worker 模式

[English](EXTENSION_WORKERS.en.md) · [返回定制功能](../README.md#扩展与自定义)

> 插件 0.6.3 新增功能，由电脑端插件实现，不要求 App 同步版本或重新配对。

Worker 模式把选中的本地 `host.mjs` 放到独立工作线程，使同步 JavaScript 循环不再占住网关主线程。默认仍使用 `in-process`；已有扩展和普通 Cordis 插件不会被自动迁移。

## 适合哪些扩展

适合通过 `/mobile` 或本地目录创建、使用 Node.js 与扩展 API 的可信代码。Worker 内仍可使用 `api.manifest`、`api.schema`、`api.action`、`api.route`、`api.effect`；`api.context.logger` 只提供 `debug`、`info`、`warn`、`error`，不是完整的 Cordis Context 或 Logger。需要直接使用 Cordis 服务的扩展保留进程内模式，不会静默回退。

Worker **不是安全沙箱**：代码仍有本机用户权限，可以访问文件、网络和进程。V8 内存限制不覆盖全部原生／ArrayBuffer 内存，也不能保证全进程不会 OOM。停止线程不保证执行清理回调，不撤销已经发生的文件或远程操作。[Node 的限制说明](https://nodejs.org/download/release/v22.19.0/docs/api/worker_threads.html#new-workerfilename-options)。

## 按需启用

在当前 DSH profile 的 `mobile-access` 配置中添加以下字段，再正常重启或重新加载插件；不要修改 `extension.json`：

```yaml
hostExecution:
  mode: worker
  extensions:
    - media-remote
  maxWorkers: 8
```

`extensions` 只选择这些本地扩展 ID，其他扩展继续进程内执行；省略列表选择所有本地 Host，空列表不选择任何 Host。配置放在实际承载插件的 profile，Desktop 与 Web 的 profile 不应混用。恢复 `mode: in-process` 后正常重新加载插件即可关闭 Worker 模式。

## 扩展停止后

电脑端打开 **移动访问**。停止的 Worker 会显示“扩展需要重启”；点击目标扩展的“重启扩展”并确认。此卡片在局域网、远程和诊断视图共用。只有不可用的 Worker 显示该入口，不自动重启，也不要求改文件来触发恢复。

触发截止的调用保留超时结果；同一 Worker 中其他未完成调用会收到 `extension_host_unavailable`。其他运行实例不会被一起终止。已发出响应头的流会结束连接，不能在半截内容后补一份 JSON 错误。未完成动作不自动重放；恢复前请确认已经产生的副作用是否需要处理。

同一扩展存在尚未结束的废弃工作时，新请求仍可能收到 `extension_busy`；线程退出确认或对应工作真正结束后才释放记账。正在退出、保留旧版本及启动中的 Worker 都占线程预算；预算耗尽时不会偷偷使用进程内模式绕过。

## 可调整的预算

| 预算 | `hostExecution` 字段 |
| --- | --- |
| 线程与注册数量 | `maxWorkers`、`maxRegistrations` |
| V8 堆与栈 | `maxOldGenerationSizeMb`、`maxYoungGenerationSizeMb`、`stackSizeMb` |
| 激活、动作、取消与清理 | `activationTimeoutMs`、`operationTimeoutMs`、`cancelGraceMs`、`streamCancelGraceMs`、`disposeGraceMs` |
| 动作 JSON 与流 | `resultMaxBytes`、`streamWindowBytes`、`streamChunkBytes`、`streamAggregateBytes` |
| 日志 | `logWindowMs`、`logMessagesPerWindow`、`logMessageBytes` |

参数必须是范围内的整数；流块不能大于单流窗口，单流窗口不能大于聚合预算。初次启用建议保留默认值。配置定义与校验由 `src/extension-worker-config.ts` 管理。Node 的全局堆参数可能覆盖 Worker 资源配置，因此检测到会覆盖限制的父进程启动参数时，Worker 会在导入扩展前拒绝启动并报告 `extension_worker_heap_override`。请检查 DSH 的启动参数；需要保留这些参数时可继续使用进程内模式，不会静默绕过。

流量按消费确认回填，未读完的 EOF 数据继续占预算；日志和结果在 Worker 内先转换为受限数据，再交给网关。该机制约束传输与 JavaScript 阻塞风险，不是整个操作系统或进程的资源沙箱。
