@crvouga/mockingbird-service-odx

中文文档
3.10.9发布于 2026/11/03MITTypeScriptES Module构建来源已验证近 30 天下载 1.6万

(已退休)最佳DX合作伙伴API的模拟器:病人、伙伴链接、HL7和结构化实验室进口、功能健康报告(JSON/PDF)、网络记录和签名患者 测试网呼.

中文使用文档
文档目录9 节
  1. 安装
  2. 使用量
  3. 路线
  4. 网络呼号
  5. 管理员(超过标准合同)
  6. 命名空间
  7. 已知的消费者错误
  8. 故意不模拟
  9. API 密码

@crvouga/ mockingbird-service-odx (英语)

本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .

国家模拟器 优化DX(ODX) 测试套房的API:伙伴实验室及其 生物标记元素、练习病人(创建、更新、删除、伙伴链接、搜索)、实验室 《功能卫生报告》(JSON或PDF), 网络记录和签名 PatientTest (原始内容存档于2018-10-21). Webhoks ODX spots back.

该供应商已退役 2026-07-22. 我们的队列路径只能由 acme-pdf-enabled 旗帜( 默认) false),所以一个没有PostHog的本地堆栈仍然呼叫ODX. 更便宜的修补就是通过PostHog模拟器把旗子打开 (单位:千美元)@crvouga/mockingbird-service-posthog); 当套房必须练习 ODX 时使用此模拟器 路径本身(生物时代的网络呼声、健康PDF上传、迁移).

  • 行动范围: 支助
  • ODX 发布无 spec : openapi.yaml 由我们消费者的电线形状手工制作 (单位:千美元)optimal.dx.service.ts和QA的防线 odx-client.ts) (中文(简体) ).

安装

npm install -D @crvouga/mockingbird-service-odx

仅限无害环境管理。 节点 22或 Bun 1.2. 无土生属地. 给它服务 npx mockingbird-odx serve, (中文(简体) ), createServer 从 ./server (节点),或 createRuntime 带有任意 获取服务器 .

使用量

真正的基础 URL 是 https://odxinstanceresource.azure-api.net/<partner>;伙伴部分为 你的账户是sult. 点 OPTIMAL_URL 在模拟器上( 它是压倒性的; 不需要路径前缀), 保留任何 OPTIMAL_API_KEY 财务报告和审定财务报表 OPTIMAL_PRACTICE_ID。预先登记后端的 Webhook, 或者让 manageWebhooks 通过注册 POST /v1/webhook 在生产方面:

npx mockingbird-odx serve --port 8817 \
  --webhook-url http://127.0.0.1:3000/odx/webhook   # must equal SYSTEM_API_DEPLOYMENT_URL/odx/webhook
import { createServer } from "@crvouga/mockingbird-service-odx/server"

// Test setup: the emulator, with the backend's webhook pre-registered.
const server = await createServer({ webhook: { url: "http://127.0.0.1:3000/odx/webhook" } })

// Application code: OPTIMAL_URL is server.url; any OPTIMAL_API_KEY and practice id.
const baseUrl = server.url
const created = await fetch(`${baseUrl}/v1/practice/p1/patient`, {
  method: "POST",
  headers: { ApiKey: "any", "content-type": "application/json" },
  body: JSON.stringify({
    firstName: "Ada",
    lastName: "Lovelace",
    gender: "Female",
    email: "[email protected]",
  }),
})
const patient = (await created.json()) as { patientId: number }
// …the app posts HL7 to /v1/practice/p1/patient/{patientId}/test; the emulator answers the parsed
// PatientTest and posts a signed `Created` webhook to /odx/webhook.
await server.close()

路线

路线行为
GET /v1/partner/labs[{labId, name, isCurrentLab}]: AHA (1), 查询(2), LabCorp (3).
GET /v1/elements/{labId}要件ELEMENTS实验室: elementId, (中文(简体) ), elementName, (中文(简体) ), elementGenderType, (中文(简体) ), cuUnit, (中文(简体) ), siUnit, (中文(简体) ), cuToSiConversionFactor, (中文(简体) ), elementReferences[{elementCode}] (LOINC代码为HL7 OBX-3被映射出). 包括九种同龄输入(494,496,506,511,537/538,556,564,568,571). 未知实验室 ~ 404 {Message}。 。 。 .
POST /v1/practice/{pid}/patient创建一个 OdxPatient 带有数字 patientId (10001...) (中文(简体) ). firstName, (中文(简体) ), lastName, (中文(简体) ), email ,否则ASP.NET问题细节400. dateOfBirth 变成 YYYY-MM-DDT00:00:00· ; gender 改为 Male编号 :Female编号 :Unknown。 。 。 .
PUT /v1/practice/{pid}/patient/{id}替换患者; 404 {Message} 在那个惯例中未知.
DELETE /v1/practice/{pid}/patient/{id}204; 放弃测试(QA destroption).
POST /v1/practice/{pid}/patient/{id}/partner/{localUserId}身体为文字 false; 存储我们的用户代号(admin-visible). 答复 true。 。 。 .
GET /v1/practice/{pid}/patients所有患者;其中任何一位 email, (中文(简体) ), firstName, (中文(简体) ), lastName, (中文(简体) ), dateOfBirth 这是一个对案件不敏感的搜索 答案 404 当没有匹配时 (我们的客户通行证) ignore404) (中文(简体) ).
POST …/patient/{id}/testHL7 导入 : {labProfileId, labId, testDate, unitType, userId, externalReference, externalMessageControlId?, externalPatientTestId, menstrualPhase, isFasting, hl7}目标3 code^text 根据实验室代码绘制到元素的地图, EL<id>,或名称(hs-CRP选择病人的性别);OBX-5等值 <0.2 变成 comparison: "<"。未映射/非数值观测地 importLogs释放 Created。没有MSH或OBX的信息是400.
PUT …/patient/{id}/test/{testId}再入; 输出 Updated (ODX发送一个Created+更新的配对,数据相同).
POST …/patient/{id}/testresults结构化导入( E)results[{elementId, value, comparison}]; 发射 Created。 。 。 .
GET …/patient/{id}/tests病人的测试,最古老的第一.
POST /v1/reports/FunctionalHealthReportoutputType: Json → {metadata, labs, elements, sections} 与部分 我们 storeHealthData a. 读取(组、上/下最佳、“功能体系统”条件、健康问题); Pdf • 有效的单页 application/pdf。未知测试 ~ 404.
GET /v1/webhooks[{partnerWebhookId, signingKey, createDate, entityEvents: {PatientTest}, webhookUrl}] - 我们的后卫呼吁这个 每个 输入到 webhook 获取密钥.
POST /v1/webhook, (中文(简体) ), PUT /v1/webhook/{id}登记册/更新manageWebhooks) (中文(简体) ).

错误: 缺少/ 未知 ApiKey 第401条 {statusCode, message} (Azure API 管理形状); ODX 错误 {Message}; 验证 → ASP.NET 问题细节 {title, status, errors}。 。 。 .

网络呼号

每个测试进口或再进口站 {entityType: "PatientTest", eventType, data: <PatientTest>} 连接到每个已注册的 Webhook URL 订阅该事件,并 optimaldx-signature: <UPPERCASE hex HMAC-SHA256(signingKey, rawBody)>。 。 。 . data 是全数 病人试验(results[].comparison 永远是弦,正如我们的接收器的 zod DTO 要求. 非-2xx的答案被重审(即即时5 s,5 min,30 min,2 h). GET /__admin/webhooks, (中文(简体) ), /__admin/webhooks/events, (中文(简体) ), POST /__admin/webhooks/flush 财务报告和审定财务报表 …/replay 工作如常.

管理员(超过标准合同)

路线效果
POST /__admin/tests/:id/webhook{eventType?: Created|Updated|Deleted, signature?: valid|short|bad}: 释放出一个被存储的测试的网页.
DELETE /__admin/tests/:id释放 Deleted 并放弃测试.
GET /__admin/patients, (中文(简体) ), GET /__admin/tests命名空间的记录(病人包括 partnerUserId; HL7 文本从未被存储).
GET编号 :PUT /__admin/settings{apiKeys?: string[]} (空接受任何密钥).

错误预设( E)POST /__admin/faults {"preset": "<name>", "count"?: n}: wrong_length_signature, (中文(简体) ), bad_signature, (中文(简体) ), empty_success, (中文(简体) ), no_content, (中文(简体) ), not_found, (中文(简体) ), server_error, (中文(简体) ), slow, (中文(简体) ), webhook_duplicate, (中文(简体) ), webhook_reorder, (中文(简体) ), webhook_drop。 。 。 .

命名空间

x-mockingbird-namespace页:1 /__admin/ns/<name> 前缀在 OPTIMAL_URL,或用 API 键: PUT /__admin/credentials {"credentials": {"<OPTIMAL_API_KEY>": "<namespace>"}}。 。 。 .

已知的消费者错误

  • 错误的签名 − 500. OdxSignatureGuard.verifyHmac 电话 crypto.timingSafeEqual 不同长度的缓冲器,可抛出 RangeError 改为 回来的假,所以一个短 optimaldx-signature 是一个500(ODX然后重试)而不是一个 403. 国家 wrong_length_signature 预设发送32个特征的签名来复制.
  • manageWebhooks “更新”一个自有的旧 URL 的呆滞注册( 无), 然后注册 新的,所以 stale 注册积累.
  • updateWebhook 通过方法为 'Put'; 节点的取来使其正常化( Bun 的取出没有—— 即 随着应用程序运行在节点上,消费端口恢复正常.

故意不模拟

  • 临床逻辑:报告状况和健康问题仅产生结果 生物年龄没有计算.
  • 真正的元素目录(千个元素,实验室专用代码):13个元素体 满足消费者的需求 HL7除MSH/OBX以外的部分被忽略;PID从未被存储.
  • 报告主题,超出元数据标签的收件人,以及PDF内容.
  • 没有正式的SDK存在,所以没有SDK放入测试.

API 密码

导出仁爱说明
OdxAPI类进程模拟器 : fetch(request), (中文(简体) ), reset(), (中文(简体) ), emit(testId, eventType, signature?), (中文(简体) ), patients(), (中文(简体) ), tests()选项: sqlite, (中文(简体) ), now, (中文(简体) ), namespace, (中文(简体) ), settings, (中文(简体) ), onWebhook。 。 。 .
createRuntime函数服务合同的模拟者。 选项 : webhook: {url, signingKey?}, (中文(简体) ), settings, (中文(简体) ), retryDelaysMs, (中文(简体) ), fetch, (中文(简体) ), clock, (中文(简体) ), seed, (中文(简体) ), adminKey, (中文(简体) ), onLog。 。 。 .
ODX_PRESETS对象每个命名的断层预设.
ODX_NAMESPACE字符串服务名称, "odx"。 。 。 .
SIGNATURE_HEADER字符串"optimaldx-signature"。 。 。 .
signOdx函数(signingKey, body) → UPPERCASE hex HMAC-SHA256。 。 。 .
apiKeyCredential函数这个 ApiKey 页眉( 如何将证书映射到命名空间) .
ELEMENTS, (中文(简体) ), LABS数组元素体和伙伴实验室.
matchElement, (中文(简体) ), parseObservations函数HL7 OBX解析和代码 → 元素映射.
DEFAULT_SETTINGS对象人名空间默认值 .
document, (中文(简体) ), operationIds, (中文(简体) ), supportedOperationIds数值销售商为OpenAPI合同及其业务代号.
createServer, (中文(简体) ), serveTarget, (中文(简体) ), DEFAULT_PORT (单位:千美元)./server(中文(简体) )节点服务过来 node:http; 数据 serve CLI目标; 第8817口.

部分 嘲笑鸟。 。 。 .

版本与发布记录

@crvouga/mockingbird-service-odx 共发布 41 个版本,首次发布于 2026/09/23;过去 12 个月发布了 41 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
3.10.9latest2026/11/038 天前
3.10.82026/11/038 天前
3.10.72026/11/038 天前
3.10.62026/11/038 天前
3.10.52026/11/038 天前
3.10.42026/11/038 天前

关于 @crvouga/mockingbird-service-odx 的常见问题

@crvouga/mockingbird-service-odx 是什么?

(已退休)最佳DX合作伙伴API的模拟器:病人、伙伴链接、HL7和结构化实验室进口、功能健康报告(JSON/PDF)、网络记录和签名患者 测试网呼.

如何安装 @crvouga/mockingbird-service-odx?

在项目目录运行 npm install @crvouga/mockingbird-service-odx,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 mockingbird-odx,可以用 npx mockingbird-odx 直接运行。

@crvouga/mockingbird-service-odx 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@crvouga/mockingbird-service-odx 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@crvouga/mockingbird-service-odx 可以商用吗?

@crvouga/mockingbird-service-odx 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@crvouga/mockingbird-service-odx 的下载量有多少?

根据 npm 官方下载统计,@crvouga/mockingbird-service-odx 在 2026/10/11 – 2026/11/09 这 30 天内被下载 16,247 次,日均约 542 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@crvouga/mockingbird-service-odx 还在维护吗?

最新版本 3.10.9 发布于 2026/11/03(8 天前);至今共发布 41 个版本,其中过去 12 个月发布了 41 个;首次发布于 2026/09/23。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。