# DSH 插件机制:0.6.2 候选 本说明针对本项目当前实现和 DSH 0.2.0-rc.2 所用接口,不承诺所有未来版本。完整安全接触面见 [SECURITY](../SECURITY.md)。 ## 两半都在工作 | 半侧 | 入口 | 职责 | |---|---|---| | host | [lib/index.js](../lib/index.js) | 认证余额路由、命名凭据读取、供应商适配器、生命周期 | | browser | [lib/client.js](../lib/client.js) | 公开的自包含组件、同源数据请求、金额与额度合并显示 | | Codex 协议 | [lib/codex.js](../lib/codex.js) | 固定 app-server 握手、账户/额度读取、错误与子进程处理 | | Codex 状态 | [lib/codex-entry.js](../lib/codex-entry.js) | 每次激活独立的预热、上一读数、旧数据标记和终止 | 浏览器产物由[模板](../src/client.bundle.js)、[core](../lib/core.js)、[registry](../lib/registry.js)内联生成。只依赖 `react`、`react/jsx-runtime` 等平台种子模块,不用包子路径同步 require。 ## 两种依赖声明不是一个数组 [包清单](../package.json)的 `dsh.client.inject` 是客户端包依赖。产物的 `exports.inject = ['slots', 'remote']` 是运行时服务依赖,不能把这两者强行改成字面相同。 账号命名空间不是硬依赖:缺少 `remote.account` 时,账号这一条显示不可用,其余 host 路线继续显示。 [Loader 层](../cordis.patch.yml)中的 name 严格等于包名。改名需同步包、补丁、安装器和生成 ID,不能仅改某一处。 ## 认证路由不能抢在 admission 前面 注册路线为: ```js ctx.inject(['connection'], scope => { scope.effect(() => scope.connection.fetch.register({ path: '/api/dsh-route-balance/balances', methods: ['GET', 'HEAD'], requestBody: 'buffered', fetch: async request => new Response(/* formatted JSON */), }), 'route-balance route'); }); ``` DSH 的共享 `/api` 入口先执行 Host/Origin 和浏览器 cookie 验证,再选择已注册的精确 Fetch 路线。直接调用 webServer 注册 exact 路线会优先于 prefix admission,不能用它来假装已经受 `/api` 认证保护。 此路由路径固定,浏览器以 same-origin 凭据请求。HEAD 不读上游;未注册的方法在官方组合入口会落到 404。直接调用插件 handler 的防御性 405 不等于网络端点总会返回 405。 ## Entry 契约 ```js { ok: true, version: 1, generated: '', entries: [{ id: '', label: '