dsh-shared
September 3, 2026 · View on GitHub
DSH 插件共享工具包:多插件共用的 server 端工具,消除复制粘贴(issue #45)。
功能
- 信任围栏
isTrustedApiRequest(request, trustedHosts)/header(headers, name)— Host-header 信任围栏(与 /api 网关一致的契约):host 必须为 loopback 或受信权威,且 sec-fetch-site 不得为 cross-site、origin(若存在)必须与 host 同源。 - HTTP JSON 工具
readJsonBody(request)/writeJson(response, status, value)/writeError(response, error)— 有界 JSON 请求体读取与 JSON 响应写入。 - 配置持久化
currentProfile()/profileDirOf(profile)/patchFileOf(profile)/extractConfig(text, rowId)/writePatchConfig(file, rowId, config)— cordis.patch.yml 的 YAML 子集读写(设置页保存配置,原子写 tmp+rename)。 - 项目根解析
findProjectRoot(cwd)— 最近.git祖先目录(项目级配置/记忆的根)。 - 异步与消息
withTimeout(promise, ms)/userMessage(text)— 超时包装(不 reject)与 user 角色消息构造。 - 原子写(护栏版)
atomicWriteJson(file, value, logger, prefix, options?)— JSON 快照原子写(tmp+rename,自动建目录,失败仅告警);options 护栏:minIntervalMs节流、maxBytes巨型对象拒绝,超限 warn 并返回 false。 - jsonl 增量追加
jsonlAppender(file, options)(+parseJsonlLines)— 防写放大持久化原语:append(obj)只写新行(防抖批量 appendFile)、行数达compactLines阈值回调onCompact宿主做snapshot(lines)原子快照、dispose()冲刷、stats()暴露写入字节/次数。高频事件持久化必须用它(9/2 审计插件写放大事故的根治模式,口径见resource-budget-review)。
安装
dsh-shared 是纯工具库(dsh.kind=library,非 DSH 插件,无 cordis.patch.yml),无需单独安装——依赖方在 dependencies 声明后由 npm 自动安装(issue #72:依赖随插件安装自动安装,用户无需手动处理)。
使用
import { isTrustedApiRequest, readJsonBody, writeJson } from 'dsh-shared'
// 路由注册时用信任围栏过滤非可信来源
const fence = (request) => isTrustedApiRequest(request, ctx.webRuntime.trustedHosts)
// 处理请求体与响应
const body = await readJsonBody(request)
writeJson(response, 200, { ok: true })
依赖方
依赖本包的插件须在 dependencies 声明 dsh-shared(issue #72:dsh-shared 是自家工具库而非宿主提供的运行时,用 dependencies 语义——npm 随插件安装自动安装,用户无需手动装;依赖先发版,见 scripts/release.mjs 跨插件依赖校验):
{
"dependencies": {
"dsh-shared": "^0.1.0"
}
}
开发
cd plugins/dsh-shared && npm test