@ cosyte/ mllp
HL7 v2 over MLLP for Node.js, 有框架,ACK 关联, 并为您处理重联.
一个用于 Node.js 的 MLLP 客户端和服务器: 仅传输的同父异母到@cosyte/hl7 .
目录
为什么会这样
HL7 v2 接口仍然会移动到 MLLP 上,协议停止在帧: VT + payload + FS + CR
没有别的了。 所有决定一个接口是否存活的 糟糕的夜晚就留给了
编组员,所以每个团队 写同样的承认 关联者,相同的重联循环
同样的后压后卫, 其中有一个是隐性错误的。 最近的替代品是全
集成引擎, 如 Mirth Connect, 它带来运行时间、数据库和部署故事
您可能不希望在节点服务内. @cosyte/mllp 是你自己的交通:一个图书馆
在零运行时间的依赖性下,导入一个内移,这样测试就不会打开套接字
一种保证是,它不会变卖, 即积极的承认不能先于
持久的承诺.
状态
此 README 描述为 0.1 行. 公众API是解决的,可以安全地依赖:客户端
服务器、 框架编码器、 内移和可选 ack-from-hl7 桥是什么
释放承诺。 稳定的警示代码和安全警示代码是其中的一部分
表面,所以重命名或去掉一个是一个突破性的变化.
名称而非暗示, 这里仍然在移动:
- 批次确认没有建立 . HL7批量信封(
FHS编号 :BHS,HL7 v2.5.1§2.10.3或 包含一个以上的框架MSH警告者,是非阳性的AE这是故意的,因为 与第一个信息相关的肯定承认会告诉发送者一个整批是 在其余部分未读的情况下被接受,但它意味着将携带批量支持的表面确实 尚不存在. - 被验证的引擎覆盖是一个不断增长的列表,而不是一个完整的列表. 差分带跑 仅限自由引擎使用 见 兼容性 谁在其中,谁在其中 没有.
- MLLP 软件 第2版没有播出,没有选项选择它.
安装
pnpm add @cosyte/mllp
# optional peer, needed only for the ack-from-hl7 subpath
pnpm add @cosyte/hl7
22号或以后试验的节点js 22、24和26(engines.node 实值 >=22.0.0) (中文(简体) ). 货船
双重无害环境管理(import)和通用JS(英语:require建筑,每个都有自己的申报类型,并有
零运行时间依赖。 可选 @cosyte/mllp/arbitraries 入口,快速检查
发电机
属性测试自己的代码, (中文(简体) ),
需求 fast-check 安装在旁边;主入口从不加载.
使用量
启动服务器,发送信息,并读取它构建的承认. 自动ACK在默认情况下, 而服务器等待您的操作器, 这是持久的承诺步骤, 在它回答之前。 有效载荷 API为 缓冲第一 到处都是: HL7 v2 消息是带有呼叫器管理的字符集解码的原始字节.
import { createStarterClient, createStarterServer } from "@cosyte/mllp";
const committed: Buffer[] = [];
// Port 0: the OS picks a free port. The host defaults to loopback, 127.0.0.1.
const server = await createStarterServer({
port: 0,
onMessage: async (payload) => {
committed.push(payload); // your durable commit: a throw here answers AE, never AA
},
});
const client = await createStarterClient({ host: "127.0.0.1", port: server.getStats().port ?? 0 });
const ack = await client.send(
Buffer.from(
"MSH|^~\\&|SENDING_APP|SENDING_FAC|RECEIVING_APP|RECEIVING_FAC|20260101120000||ADT^A01|CTRL0001|P|2.5.1\r",
),
);
// Log the shape of the acknowledgement, never its field values.
const msa = ack
.toString("utf8")
.split("\r")
.find((segment) => segment.startsWith("MSA|"))
?.split("|");
console.log("acknowledgement code:", msa?.[1]);
console.log("MSA-2 echoes the control id sent:", msa?.[2] === "CTRL0001");
console.log("messages committed:", committed.length);
await client.close();
await server.close();
acknowledgement code: AA
MSA-2 echoes the control id sent: true
messages committed: 1
MSA-2 响应您发送的控制 id, 字节的字节, 让客户端匹配答案
给信息。 承认是自己的 MSH-7 财务报告和审定财务报表 MSH-10 每次跑步都要换.
单打独斗
encodeFrame 财务报告和审定财务报表 FrameReader 用于导出,这样您就可以在没有套接字的情况下设定框架和取消框架。 这个
读取器是一个很好的解码器:无论TCP给你什么,都喂它,并完成帧起火 onFrame。 。 。 .
import { encodeFrame, FrameReader } from "@cosyte/mllp";
const payload = Buffer.from(
"MSH|^~\\&|SENDING_APP|SENDING_FAC|RECEIVING_APP|RECEIVING_FAC|20260101120000||ADT^A01|CTRL0001|P|2.5.1\r",
);
const frame = encodeFrame(payload);
console.log(frame.subarray(0, 3).toString("hex"), frame.subarray(-2).toString("hex"));
console.log("frame", frame.length, "payload", payload.length);
const reader = new FrameReader({
onFrame: (bytes, byteOffset, warnings) => {
console.log("onFrame at", byteOffset, bytes.length, "bytes,", warnings.length, "warnings");
},
});
reader.push(frame.subarray(0, 10)); // partial chunk: nothing fires
reader.push(frame.subarray(10)); // completes the frame
0b4d53 1c0d
frame 105 payload 102
onFrame at 0 102 bytes, 0 warnings
0b 领先 VT, (中文(简体) ), 1c0d 线索 FS CR,而三个框架字节是整个
105和102之间的差额.
承诺合同
积极的承认(AA)告诉发送者 "你可以忘记这个消息。 我拥有它。" 这么说
接收者在信件被持久地处理之前决不能发出一个,否则信件会默默地丢失.
@cosyte/mllp 使结构:对 autoAck: 'AA' 带有 onMessage 处理器和服务器
等待您的操作员,然后确认。 。 。 .
汉德勒决定,你得到 AA, (中文(简体) ), 除非入境者不能携带可腐蚀的阳性
承认 (无可读) MSH,一个空的 MSH-10,批量或压缩载荷,或尾随
已丢弃的框架字节 。 如果那样的话 承诺还是发生了 但承认
降级至 AE (单位:千美元) nack 事件指定了原因, 因为肯定承认发件人
无法匹配的是它会重新发送 。 手推车,你得到 AE,或 AR 通过 MllpAckError。 。 。 .
autoAck: 'AA' 无 处理器被记录为运输接受: "收到并装帧",而不是
"处理".
运输安全
TLS 是基于 node:tls:没有捆绑的TLS,没有额外的依赖性. 证书验证为 日期
默认,服务器绑定 127.0.0.1 并绑定所有接口
allowWildcardBind: true。 。 。 .
import { createServer, createClient } from "@cosyte/mllp";
// Server: mutual TLS (IHE ATNA ITI-19)
const server = createServer({
tls: { cert: certPem, key: keyPem, ca: clientCaPem, clientAuth: "MUST" },
});
await server.listen(2575, "127.0.0.1");
// Client: verify the peer, and present a certificate of our own
const client = createClient({
host: "mllp.example.com",
port: 2575,
tls: { ca: caPem, cert: clientCertPem, key: clientKeyPem },
});
这个 TLS 指南 拥有 ClientAuth
表格,TLS 1.2层(IHE ATNA ITI-19),打出故障模式(tls-verify 反对
tls-handshake安全的细节.
API 密码
4个密码子通道,加 @cosyte/mllp/package.json数字 :
@cosyte/mllp即整个运输:createServer财务报告和审定财务报表createStarterServer, (中文(简体) ),createClient财务报告和审定财务报表createStarterClient, (中文(简体) ),encodeFrame财务报告和审定财务报表FrameReader, (中文(简体) ),Connection, (中文(简体) ),buildRawAck键入 误差和相差带runDifferential) (中文(简体) ).@cosyte/mllp/testing实值InMemoryTransport一个确定性的无套接字测试双人。 每个 测试可以运行 它应该.@cosyte/mllp/ack-from-hl7从解析信件或从原始字节中建立确认 剖析对等点,是可选位置之一@cosyte/hl7需要对等关系.@cosyte/mllp/arbitraries是快速检查生成器的属性测试代码 运输:payload, (中文(简体) ),frame, (中文(简体) ),chunked财务报告和审定财务报表stream为犬形字节,messyStream页:1 框框怪异,一个宽大的读者接受hostileInput对于流,读者可能拒绝 但绝不能挂或坠入。 它需要可选的fast-check,不导入 从图书馆运行的时间.
他们怎么了
- 严格框架 (单位:千美元)
VT + payload + FS + CR),承认相关性,自动重联 后退 后压. - 宽大的解码器和严格的解码器 (波斯特尔法) 11个稳定的警告代码 携带 页:1 容忍是每个旗帜的选择;服务器船容忍默认.
- 明确 6 态连接机
(单位:千美元)
CONNECTING | CONNECTED | DRAINING | RECONNECTING | DISCONNECTED | CLOSED与stateChange事件,从不插上旗帜. AbortSignal每个等待者 财务报告和审定财务报表Symbol.asyncDispose每个可关闭的.- 排水沟
close()说出一个信息 它从来没有被写 与谁的命运 未知, 因为其中只有一个可以安全重传. - 零运行时间依赖关系. 只有节点stdlib.
全文见 (原始内容存档于2017-09-28). docs.cosyte.com/mllp; 见 文档。 。 。 .
兼容性
- 节点js22或后期,于22,24和26日进行测试.
engines.node实值>=22.0.0。 。 。 . - HL7 v2有效载荷是这里的字节,例外被命名. 运输不解析
HL7:它读到
MSH标出其承认来源于MSA入境者 承认,每个人都被限制在该部分自己的终结者。 选入ack-from-hl7子路径 整个消息被解析的地方. PHI 与安全 把这些都写出来 满分 对于实际解析,将这个配给@cosyte/hl7,哪个 这正是那个子路径所做的. - 对照可自由使用的发动机的条框检查结构: 密尔斯连接
NextGen,以及Google Cloud保健MLLP适配器. 框从
规格,没有从运行的引擎中捕获, 并且没有运行在我们的CI中. 图片和图片
瑟纳不是那把绳子的一部分,这里也没有提出任何索赔.
runDifferential在已公布的文物中,可以瞄准 它在自己的测试或中转端点,并获得每个交换帧的平分和MSA-2关联 报告您实际整合的引擎. - 已知的空白,是说而不是隐藏的. 没有批量确认,没有MLLP 第2版,没有持久性 排队收集未确认的信息,没有临床接受决定,也没有公用钥匙基础结构。 这个 已知限制 页面为 完整名单。 以此相依前读.
文档
完整参考文献 (原始内容存档于2017-09-28). docs.cosyte.com/mllp,从此构建
存储器 docs-content/。每页
此处按站台侧栏的顺序和组数列出:
- 概览:包裹是什么,它留给你什么.
- 安装 财务报告和审定财务报表 快速启动:安装它,然后 启动服务器,发送消息并读取确认.
- 如何引导 :
- 解释:
- 参考:
- 解决问题:当联系失败时,症状如何.
- 测试和质量 财务报告和审定财务报表 业绩:我们如何 测试包,以及我们测量.
支助
问题、错误报告和互操作性发现始于 问题跟踪器,那么任何改变都足够大 在拉动请求之前商定办法。 该组织 支持页面 包括跨越我们 图书馆.
需要一个 MLLP 集成, 或者主机和运行你? 看我们的 融合服务。 。 。 .
警卫
私下报告脆弱性,如: 安全政策 描述,从来没有在 公共问题.
PHI 与安全
MLLP框架搭载了HL7 v2信息,而HL7 v2信息搭载了病人数据. 这个软件包是 运输工具,所以它对这些字节所做的 是一个安全财产而不是一个 页:1.
你的载荷有什么用. 它把缓冲器移到对等器上,然后把对等器交给对等器
字节返回您的处理器 。 它只保存一个记忆中的信息 当这个信息在飞行中:
send() 直到其承认是相互关联的,或直到 close() 排水或报告
未解决。 在接收一侧,你的操作员得到一份副本。 一个横穿读取的相框
聚集在解码器的内部积分器中, 它从未被零化 : 最多保留 4 KiB 的框架
在私人缓冲器中直到一个后框覆盖它, 只要读者活着
装有更大一个的缓冲器,在框架交付后被扔到垃圾上
收藏家们 这是缓冲再利用,而不是存储, 没有公共API将缓冲,但它
不是洗手间.
阅读运输的表演, 和在哪里停止. 运输没有分析HL7,而是它
对有效载荷也不视而不见 束缚比口号更值钱 回答一个
信息必须连接到答案,从而找到 MSH 块并读取页眉字段
承认的根据和答复如下: MSH-10,对应字节的字节 MSA-2,则
发送和接收申请和设施,这些申请和设施在答复中互换,申报
分隔器、处理 id 和版本以及确认模式 MSH-15 财务报告和审定财务报表 MSH-16。 。 。 .
扫描范围在 MSH 分区本身的终止符,所以它没有达到任何经过
页眉: 在运输路径 PID和每个带临床内容的其他部分 永远不会
读取,从不解码,从不回音。 读取输入的确认会增加一个部分, 否
再来, MSA,因为它的确认代码和控制id 它回放,解码 在相同的
绑在那个部分自己的终结者。 这两个是整个的,在一个地方, 分享给
客户的关联者 和两个承认建设者。 分别列出每个
检查片段,以便批量信封或第二个 MSH 可以拒绝而不是虚假
已确认;这些部分没有字段被读取.
例外,是选入: @cosyte/mllp/ack-from-hl7。 。 。 . 这个子路径是一个解析器前端
而不是运输。 手 buildMllpAck 或者说 detectMode 有效载荷和此包解码
全部信息,包括后一部分,并交给可选
@cosyte/hl7 解决每个部分的每一个领域,
PID 在他们中间 解码器是这个包裹自己的密码 装在了这个包裹的焦油丸里
算作你的,而不是同伴的 默认无法到达它:客户端、服务器和
buildRawAck 绝不导入该子路径, 端点是您安装的可选依赖
故意的 故意的 如果您的数据流边界打开后段, 则永远无法实现解码
文本,这是要删除的子路径.
它没有做什么. 在那条子道外,它不解析信息, 在两条道外
上方有界段不检查 它没有写入磁盘: 没有队列, 没有
写入- ahead 日志, 没有重放商店, 也没有此包中的任何缓存 。 库代码调用无日志
没有 console 方法.
它的诊断能携带什么. 形状而非内容:无出错、警告、事件有效载荷或 stats 对象总是对消息内容进行回响.
- A 类 框架错误 最多只带一个字节 在结构违规, 加上字节 页:1.
- A 类 警告消息 带有结构事实:字节相抵、计数和累积大小。 两个
框架代码是值得了解的例外.
MLLP_MISSING_LEADING_VT财务报告和审定财务报表MLLP_FS_WITHOUT_CR使所发现的单一字节的六分位值符合一个框架字节的要求, 在一条流中,它忽略了它的主线VT那个字节是未设定内容的第一个字节. 一个字节,从不运行, 相同的束缚一个框架错误携带。 如果这不只是你的威胁 模式允许, 日志code财务报告和审定财务报表byteOffset而不是说message。 。 。 . - 这个 承认-血缘关系诊断 更严格。 他们的文字来自冰冻 仅在代码上按键的注册,其中没有值参数,因此控制 id 无法 到达一个;它们报告字节长度而不是字节长度.
getStats()返回简单的 JSON 序列大小的计数器,并发出两次安全警告 结束process.emitWarning携带他们的代码和固定的描述。 通配符警告 命名您绑定的地址,这是您自己的配置,从不发送信息内容.
你仍然拥有的东西.
- 中途加密. 一条简单的MLLP连接是线上清晰的文字. TLS 内置,但 你必须打开它 并提供材料.
- 伐木和保留. 当你记录一个有效载荷, 一个承认身体,或者一个控制身份, 这是你的保护。 这里没有信息存储, 所以这里没有信息可按请求删除 也一样.
- 引证无能. MLLP 加上一个承认 充其量至少是一次 不再复制
MSH-10加号MSH-7在您的申请. - 暴露出来. 这个
127.0.0.1默认, 而通配符- bind 选入是守护符, 而不是网络 政策。 拓宽也是你的决定.
本页面的每一个例子都使用占位符应用程序和设施名称以及合成控制 编号. 这里没有标本,没有标有姓名,出生日期,识别标志,或地址,也没有标本.
捐款
欢迎拉动请求。 该组织 贡献指南 财务报告和审定财务报表 行为守则 在此应用.
每一扇门都必须清空所有寄存器的船, 所有你可以运行的脚本:
pnpm typecheck
pnpm lint
pnpm test
pnpm format:check
pnpm check:no-emdash
pnpm check:no-internal-refs
pnpm check:documents # the README, CLAUDE.md and catalog line
pnpm phi-scan
pnpm build
pnpm changeset # every meaningful change carries one
从不提供真正的病人数据, 在测试固定或其他任何地方. pnpm phi-scan 运行于每个
犯罪,而且刻意绕道.
商标
Epic, Cerner, Mirth Connect, NextGen, 和Google Cloud 医疗保健是各自的商标 拥有者。 科西特不附属于其中任何一家,得到其认可或赞助. 名称识别 这个包的引擎被测试, 而那些它不是。 见 贸易。 。 。 .
许可证
MIT,版权 (c) 2026 Cosyte LLC. 见 自由主义。 。 。 .