@medplum/hl7 3.1.6 → 3.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  Server and client.
4
4
 
5
+ ## Character Encoding
6
+
7
+ List of iconv-lite character encodings
8
+
9
+ See: https://github.com/ashtuchkin/iconv-lite/wiki/Supported-Encodings
10
+
5
11
  ## License
6
12
 
7
13
  Apache 2.0. Copyright © Medplum 2023
@@ -1,2 +1,2 @@
1
- "use strict";var b=Object.create;var p=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty;var O=(o,e)=>{for(var t in e)p(o,t,{get:e[t],enumerable:!0})},g=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of L(e))!y.call(o,r)&&r!==t&&p(o,r,{get:()=>e[r],enumerable:!(n=M(e,r))||n.enumerable});return o};var w=(o,e,t)=>(t=o!=null?b(C(o)):{},g(e||!o||!o.__esModule?p(t,"default",{value:o,enumerable:!0}):t,o)),P=o=>g(p({},"__esModule",{value:!0}),o);var S={};O(S,{CR:()=>m,FS:()=>v,Hl7Base:()=>i,Hl7Client:()=>f,Hl7Connection:()=>c,Hl7ErrorEvent:()=>d,Hl7MessageEvent:()=>l,Hl7Server:()=>E,VT:()=>h});module.exports=P(S);var i=class extends EventTarget{addEventListener(e,t,n){super.addEventListener(e,t,n)}removeEventListener(e,t,n){super.removeEventListener(e,t,n)}};var H=require("net");var u=require("@medplum/core");var h="\v",v="",m="\r";var l=class extends Event{constructor(t,n){super("message");this.connection=t;this.message=n}},d=class extends Event{constructor(t){super("error");this.error=t}};var c=class extends i{constructor(t,n){super();this.socket=t;this.encoding=n;let r="";t.on("data",s=>{try{if(r+=s.toString(),r.endsWith(v+m)){let a=u.Hl7Message.parse(r.substring(1,r.length-2));this.dispatchEvent(new l(this,a)),r=""}}catch(a){this.dispatchEvent(new d(a))}}).setEncoding(n??"utf-8"),t.on("error",s=>{r="",this.dispatchEvent(new d(s))})}send(t){this.socket.write(h+t.toString()+v+m)}async sendAndWait(t){let n=new Promise(r=>{function s(a){a.target.removeEventListener("message",s),r(a.message)}this.addEventListener("message",s)});return this.send(t),n}close(){this.socket.end(),this.socket.destroy()}};var f=class extends i{constructor(e){super(),this.options=e,this.host=this.options.host,this.port=this.options.port}connect(){return this.connection?Promise.resolve(this.connection):new Promise((e,t)=>{let n=(0,H.connect)({host:this.host,port:this.port},()=>{this.connection=new c(n),n.off("error",t),e(this.connection)});n.on("error",t)})}async send(e){return(await this.connect()).send(e)}async sendAndWait(e){return(await this.connect()).sendAndWait(e)}close(){this.connection&&(this.connection.close(),delete this.connection)}};var x=w(require("net"));var E=class{constructor(e){this.handler=e}start(e,t){let n=x.default.createServer(r=>{let s=new c(r,t);this.handler(s)});n.listen(e),this.server=n}async stop(){return new Promise((e,t)=>{this.server&&(this.server.close(n=>{if(n){t(n);return}e()}),this.server=void 0)})}};0&&(module.exports={CR,FS,Hl7Base,Hl7Client,Hl7Connection,Hl7ErrorEvent,Hl7MessageEvent,Hl7Server,VT});
1
+ "use strict";var M=Object.create;var l=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,B=Object.prototype.hasOwnProperty;var C=(o,e)=>{for(var t in e)l(o,t,{get:e[t],enumerable:!0})},f=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of w(e))!B.call(o,s)&&s!==t&&l(o,s,{get:()=>e[s],enumerable:!(n=L(e,s))||n.enumerable});return o};var k=(o,e,t)=>(t=o!=null?M(O(o)):{},f(e||!o||!o.__esModule?l(t,"default",{value:o,enumerable:!0}):t,o)),P=o=>f(l({},"__esModule",{value:!0}),o);var S={};C(S,{CR:()=>u,FS:()=>g,Hl7Base:()=>i,Hl7Client:()=>h,Hl7Connection:()=>c,Hl7ErrorEvent:()=>a,Hl7MessageEvent:()=>p,Hl7Server:()=>m,VT:()=>A});module.exports=P(S);var i=class extends EventTarget{addEventListener(e,t,n){super.addEventListener(e,t,n)}removeEventListener(e,t,n){super.removeEventListener(e,t,n)}};var H=require("net");var E=require("@medplum/core"),v=require("iconv-lite");var A=11,u=13,g=28;var p=class extends Event{constructor(t,n){super("message");this.connection=t;this.message=n}},a=class extends Event{constructor(t){super("error");this.error=t}};var c=class extends i{constructor(t,n="utf-8"){super();this.socket=t;this.encoding=n;this.chunks=[];t.on("data",s=>{try{if(this.appendData(s),s.at(-2)===28&&s.at(-1)===13){let r=Buffer.concat(this.chunks),d=r.subarray(1,r.length-2),y=(0,v.decode)(d,this.encoding),b=E.Hl7Message.parse(y);this.dispatchEvent(new p(this,b)),this.resetBuffer()}}catch(r){this.dispatchEvent(new a(r))}}),t.on("error",s=>{this.resetBuffer(),this.dispatchEvent(new a(s))})}send(t){let n=t.toString(),s=(0,v.encode)(n,this.encoding),r=Buffer.alloc(s.length+3);r.writeInt8(11,0),s.copy(r,1),r.writeInt8(28,s.length+1),r.writeInt8(13,s.length+2),this.socket.write(r)}async sendAndWait(t){let n=new Promise(s=>{function r(d){d.target.removeEventListener("message",r),s(d.message)}this.addEventListener("message",r)});return this.send(t),n}close(){this.socket.end(),this.socket.destroy()}appendData(t){this.chunks.push(t)}resetBuffer(){this.chunks=[]}};var h=class extends i{constructor(e){super(),this.options=e,this.host=this.options.host,this.port=this.options.port,this.encoding=this.options.encoding}connect(){return this.connection?Promise.resolve(this.connection):new Promise((e,t)=>{let n=(0,H.connect)({host:this.host,port:this.port},()=>{this.connection=new c(n,this.encoding),n.off("error",t),e(this.connection)});n.on("error",t)})}async send(e){return(await this.connect()).send(e)}async sendAndWait(e){return(await this.connect()).sendAndWait(e)}close(){this.connection&&(this.connection.close(),delete this.connection)}};var x=k(require("net"));var m=class{constructor(e){this.handler=e}start(e,t){let n=x.default.createServer(s=>{let r=new c(s,t);this.handler(r)});n.listen(e),this.server=n}async stop(){return new Promise((e,t)=>{this.server&&(this.server.close(n=>{if(n){t(n);return}e()}),this.server=void 0)})}};0&&(module.exports={CR,FS,Hl7Base,Hl7Client,Hl7Connection,Hl7ErrorEvent,Hl7MessageEvent,Hl7Server,VT});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts", "../../src/base.ts", "../../src/client.ts", "../../src/connection.ts", "../../src/constants.ts", "../../src/events.ts", "../../src/server.ts"],
4
- "sourcesContent": ["export * from './base';\nexport * from './client';\nexport * from './connection';\nexport * from './constants';\nexport * from './events';\nexport * from './server';\n", "import { Hl7ErrorEvent, Hl7MessageEvent } from './events';\n\nexport interface Hl7EventMap {\n message: Hl7MessageEvent;\n error: Hl7ErrorEvent;\n}\n\nexport abstract class Hl7Base extends EventTarget {\n addEventListener<K extends keyof Hl7EventMap>(\n type: K,\n listener: ((event: Hl7EventMap[K]) => void) | EventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void;\n\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void {\n super.addEventListener(type, listener, options);\n }\n removeEventListener<K extends keyof Hl7EventMap>(\n type: K,\n listener: ((event: Hl7EventMap[K]) => void) | EventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void;\n\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void {\n super.removeEventListener(type, listener, options);\n }\n}\n", "import { Hl7Message } from '@medplum/core';\nimport { connect } from 'node:net';\nimport { Hl7Base } from './base';\nimport { Hl7Connection } from './connection';\n\nexport interface Hl7ClientOptions {\n host: string;\n port: number;\n}\n\nexport class Hl7Client extends Hl7Base {\n options: Hl7ClientOptions;\n host: string;\n port: number;\n connection?: Hl7Connection;\n\n constructor(options: Hl7ClientOptions) {\n super();\n this.options = options;\n this.host = this.options.host;\n this.port = this.options.port;\n }\n\n connect(): Promise<Hl7Connection> {\n if (this.connection) {\n return Promise.resolve(this.connection);\n }\n\n return new Promise((resolve, reject) => {\n const socket = connect({ host: this.host, port: this.port }, () => {\n this.connection = new Hl7Connection(socket);\n socket.off('error', reject);\n resolve(this.connection);\n });\n\n socket.on('error', reject);\n });\n }\n\n async send(msg: Hl7Message): Promise<void> {\n return (await this.connect()).send(msg);\n }\n\n async sendAndWait(msg: Hl7Message): Promise<Hl7Message> {\n return (await this.connect()).sendAndWait(msg);\n }\n\n close(): void {\n if (this.connection) {\n this.connection.close();\n delete this.connection;\n }\n }\n}\n", "import { Hl7Message } from '@medplum/core';\nimport net from 'node:net';\nimport { Hl7Base } from './base';\nimport { CR, FS, VT } from './constants';\nimport { Hl7ErrorEvent, Hl7MessageEvent } from './events';\n\nexport class Hl7Connection extends Hl7Base {\n constructor(\n readonly socket: net.Socket,\n readonly encoding?: BufferEncoding\n ) {\n super();\n\n let buffer = '';\n\n socket\n .on('data', (data) => {\n try {\n buffer += data.toString();\n if (buffer.endsWith(FS + CR)) {\n const message = Hl7Message.parse(buffer.substring(1, buffer.length - 2));\n this.dispatchEvent(new Hl7MessageEvent(this, message));\n buffer = '';\n }\n } catch (err) {\n this.dispatchEvent(new Hl7ErrorEvent(err as Error));\n }\n })\n .setEncoding(encoding ?? 'utf-8');\n\n socket.on('error', (err) => {\n buffer = '';\n this.dispatchEvent(new Hl7ErrorEvent(err));\n });\n }\n\n send(reply: Hl7Message): void {\n this.socket.write(VT + reply.toString() + FS + CR);\n }\n\n async sendAndWait(msg: Hl7Message): Promise<Hl7Message> {\n const promise = new Promise<Hl7Message>((resolve) => {\n function handler(event: Hl7MessageEvent): void {\n (event.target as Hl7Connection).removeEventListener('message', handler);\n resolve(event.message);\n }\n this.addEventListener('message', handler);\n });\n\n this.send(msg);\n return promise;\n }\n\n close(): void {\n this.socket.end();\n this.socket.destroy();\n }\n}\n", "export const VT = String.fromCharCode(0x0b);\nexport const FS = String.fromCharCode(0x1c);\nexport const CR = String.fromCharCode(0x0d);\n", "import { Hl7Message } from '@medplum/core';\nimport { Hl7Connection } from './connection';\n\nexport class Hl7MessageEvent extends Event {\n constructor(\n public readonly connection: Hl7Connection,\n public readonly message: Hl7Message\n ) {\n super('message');\n }\n}\n\nexport class Hl7ErrorEvent extends Event {\n constructor(public readonly error: Error) {\n super('error');\n }\n}\n", "import net from 'node:net';\nimport { Hl7Connection } from './connection';\n\nexport class Hl7Server {\n server?: net.Server;\n\n constructor(public readonly handler: (connection: Hl7Connection) => void) {}\n\n start(port: number, encoding?: BufferEncoding): void {\n const server = net.createServer((socket) => {\n const connection = new Hl7Connection(socket, encoding);\n this.handler(connection);\n });\n\n server.listen(port);\n this.server = server;\n }\n\n async stop(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.server) {\n this.server.close((err) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n });\n this.server = undefined;\n }\n });\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["src_exports", "__export", "CR", "FS", "Hl7Base", "Hl7Client", "Hl7Connection", "Hl7ErrorEvent", "Hl7MessageEvent", "Hl7Server", "VT", "__toCommonJS", "Hl7Base", "type", "listener", "options", "import_node_net", "import_core", "VT", "FS", "CR", "Hl7MessageEvent", "connection", "message", "Hl7ErrorEvent", "error", "Hl7Connection", "Hl7Base", "socket", "encoding", "buffer", "data", "FS", "CR", "message", "Hl7MessageEvent", "err", "Hl7ErrorEvent", "reply", "VT", "msg", "promise", "resolve", "handler", "event", "Hl7Client", "Hl7Base", "options", "resolve", "reject", "socket", "Hl7Connection", "msg", "import_node_net", "Hl7Server", "handler", "port", "encoding", "server", "net", "socket", "connection", "Hl7Connection", "resolve", "reject", "err"]
4
+ "sourcesContent": ["export * from './base';\nexport * from './client';\nexport * from './connection';\nexport * from './constants';\nexport * from './events';\nexport * from './server';\n", "import { Hl7ErrorEvent, Hl7MessageEvent } from './events';\n\nexport interface Hl7EventMap {\n message: Hl7MessageEvent;\n error: Hl7ErrorEvent;\n}\n\nexport abstract class Hl7Base extends EventTarget {\n addEventListener<K extends keyof Hl7EventMap>(\n type: K,\n listener: ((event: Hl7EventMap[K]) => void) | EventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void;\n\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void {\n super.addEventListener(type, listener, options);\n }\n removeEventListener<K extends keyof Hl7EventMap>(\n type: K,\n listener: ((event: Hl7EventMap[K]) => void) | EventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void;\n\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void {\n super.removeEventListener(type, listener, options);\n }\n}\n", "import { Hl7Message } from '@medplum/core';\nimport { connect } from 'node:net';\nimport { Hl7Base } from './base';\nimport { Hl7Connection } from './connection';\n\nexport interface Hl7ClientOptions {\n host: string;\n port: number;\n encoding?: string;\n}\n\nexport class Hl7Client extends Hl7Base {\n options: Hl7ClientOptions;\n host: string;\n port: number;\n encoding?: string;\n connection?: Hl7Connection;\n\n constructor(options: Hl7ClientOptions) {\n super();\n this.options = options;\n this.host = this.options.host;\n this.port = this.options.port;\n this.encoding = this.options.encoding;\n }\n\n connect(): Promise<Hl7Connection> {\n if (this.connection) {\n return Promise.resolve(this.connection);\n }\n\n return new Promise((resolve, reject) => {\n const socket = connect({ host: this.host, port: this.port }, () => {\n this.connection = new Hl7Connection(socket, this.encoding);\n socket.off('error', reject);\n resolve(this.connection);\n });\n\n socket.on('error', reject);\n });\n }\n\n async send(msg: Hl7Message): Promise<void> {\n return (await this.connect()).send(msg);\n }\n\n async sendAndWait(msg: Hl7Message): Promise<Hl7Message> {\n return (await this.connect()).sendAndWait(msg);\n }\n\n close(): void {\n if (this.connection) {\n this.connection.close();\n delete this.connection;\n }\n }\n}\n", "import { Hl7Message } from '@medplum/core';\nimport { decode, encode } from 'iconv-lite';\nimport net from 'node:net';\nimport { Hl7Base } from './base';\nimport { CR, FS, VT } from './constants';\nimport { Hl7ErrorEvent, Hl7MessageEvent } from './events';\n\n// iconv-lite docs have great examples and explanations for how to use Buffers with iconv-lite:\n// See: https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding\n\nexport class Hl7Connection extends Hl7Base {\n private chunks: Buffer[] = [];\n\n constructor(\n readonly socket: net.Socket,\n readonly encoding: string = 'utf-8'\n ) {\n super();\n\n socket.on('data', (data: Buffer) => {\n try {\n this.appendData(data);\n if (data.at(-2) === FS && data.at(-1) === CR) {\n const buffer = Buffer.concat(this.chunks);\n const contentBuffer = buffer.subarray(1, buffer.length - 2);\n const contentString = decode(contentBuffer, this.encoding);\n const message = Hl7Message.parse(contentString);\n this.dispatchEvent(new Hl7MessageEvent(this, message));\n this.resetBuffer();\n }\n } catch (err) {\n this.dispatchEvent(new Hl7ErrorEvent(err as Error));\n }\n });\n\n socket.on('error', (err) => {\n this.resetBuffer();\n this.dispatchEvent(new Hl7ErrorEvent(err));\n });\n }\n\n send(reply: Hl7Message): void {\n const replyString = reply.toString();\n const replyBuffer = encode(replyString, this.encoding);\n const outputBuffer = Buffer.alloc(replyBuffer.length + 3);\n outputBuffer.writeInt8(VT, 0);\n replyBuffer.copy(outputBuffer, 1);\n outputBuffer.writeInt8(FS, replyBuffer.length + 1);\n outputBuffer.writeInt8(CR, replyBuffer.length + 2);\n this.socket.write(outputBuffer);\n }\n\n async sendAndWait(msg: Hl7Message): Promise<Hl7Message> {\n const promise = new Promise<Hl7Message>((resolve) => {\n function handler(event: Hl7MessageEvent): void {\n (event.target as Hl7Connection).removeEventListener('message', handler);\n resolve(event.message);\n }\n this.addEventListener('message', handler);\n });\n\n this.send(msg);\n return promise;\n }\n\n close(): void {\n this.socket.end();\n this.socket.destroy();\n }\n\n private appendData(data: Buffer): void {\n this.chunks.push(data);\n }\n\n private resetBuffer(): void {\n this.chunks = [];\n }\n}\n", "/**\n * VT (Vertical Tab) character.\n *\n * In HL7 messages, this character is used to indicate the start of a message.\n */\nexport const VT = 0x0b;\n\n/**\n * CR (Carriage Return) character.\n *\n * In HL7 messages, this character is used to indicate the end of a message.\n */\nexport const CR = 0x0d;\n\n/**\n * FS (File Separator) character.\n *\n * In HL7 messages, this character is used to separate fields.\n */\nexport const FS = 0x1c;\n", "import { Hl7Message } from '@medplum/core';\nimport { Hl7Connection } from './connection';\n\nexport class Hl7MessageEvent extends Event {\n constructor(\n public readonly connection: Hl7Connection,\n public readonly message: Hl7Message\n ) {\n super('message');\n }\n}\n\nexport class Hl7ErrorEvent extends Event {\n constructor(public readonly error: Error) {\n super('error');\n }\n}\n", "import net from 'node:net';\nimport { Hl7Connection } from './connection';\n\nexport class Hl7Server {\n server?: net.Server;\n\n constructor(public readonly handler: (connection: Hl7Connection) => void) {}\n\n start(port: number, encoding?: string): void {\n const server = net.createServer((socket) => {\n const connection = new Hl7Connection(socket, encoding);\n this.handler(connection);\n });\n\n server.listen(port);\n this.server = server;\n }\n\n async stop(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.server) {\n this.server.close((err) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n });\n this.server = undefined;\n }\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["src_exports", "__export", "CR", "FS", "Hl7Base", "Hl7Client", "Hl7Connection", "Hl7ErrorEvent", "Hl7MessageEvent", "Hl7Server", "VT", "__toCommonJS", "Hl7Base", "type", "listener", "options", "import_node_net", "import_core", "import_iconv_lite", "VT", "CR", "FS", "Hl7MessageEvent", "connection", "message", "Hl7ErrorEvent", "error", "Hl7Connection", "Hl7Base", "socket", "encoding", "data", "buffer", "contentBuffer", "contentString", "message", "Hl7MessageEvent", "err", "Hl7ErrorEvent", "reply", "replyString", "replyBuffer", "outputBuffer", "msg", "promise", "resolve", "handler", "event", "Hl7Client", "Hl7Base", "options", "resolve", "reject", "socket", "Hl7Connection", "msg", "import_node_net", "Hl7Server", "handler", "port", "encoding", "server", "net", "socket", "connection", "Hl7Connection", "resolve", "reject", "err"]
7
7
  }
@@ -3,9 +3,19 @@
3
3
  import { Hl7Message } from '@medplum/core';
4
4
  import net from 'node:net';
5
5
 
6
- export declare const CR: string;
6
+ /**
7
+ * CR (Carriage Return) character.
8
+ *
9
+ * In HL7 messages, this character is used to indicate the end of a message.
10
+ */
11
+ export declare const CR = 13;
7
12
 
8
- export declare const FS: string;
13
+ /**
14
+ * FS (File Separator) character.
15
+ *
16
+ * In HL7 messages, this character is used to separate fields.
17
+ */
18
+ export declare const FS = 28;
9
19
 
10
20
  export declare abstract class Hl7Base extends EventTarget {
11
21
  addEventListener<K extends keyof Hl7EventMap>(type: K, listener: ((event: Hl7EventMap[K]) => void) | EventListenerObject | null, options?: boolean | AddEventListenerOptions): void;
@@ -16,6 +26,7 @@ export declare class Hl7Client extends Hl7Base {
16
26
  options: Hl7ClientOptions;
17
27
  host: string;
18
28
  port: number;
29
+ encoding?: string;
19
30
  connection?: Hl7Connection;
20
31
  constructor(options: Hl7ClientOptions);
21
32
  connect(): Promise<Hl7Connection>;
@@ -27,15 +38,19 @@ export declare class Hl7Client extends Hl7Base {
27
38
  export declare interface Hl7ClientOptions {
28
39
  host: string;
29
40
  port: number;
41
+ encoding?: string;
30
42
  }
31
43
 
32
44
  export declare class Hl7Connection extends Hl7Base {
33
45
  readonly socket: net.Socket;
34
- readonly encoding?: BufferEncoding | undefined;
35
- constructor(socket: net.Socket, encoding?: BufferEncoding | undefined);
46
+ readonly encoding: string;
47
+ private chunks;
48
+ constructor(socket: net.Socket, encoding?: string);
36
49
  send(reply: Hl7Message): void;
37
50
  sendAndWait(msg: Hl7Message): Promise<Hl7Message>;
38
51
  close(): void;
52
+ private appendData;
53
+ private resetBuffer;
39
54
  }
40
55
 
41
56
  export declare class Hl7ErrorEvent extends Event {
@@ -58,10 +73,15 @@ export declare class Hl7Server {
58
73
  readonly handler: (connection: Hl7Connection) => void;
59
74
  server?: net.Server;
60
75
  constructor(handler: (connection: Hl7Connection) => void);
61
- start(port: number, encoding?: BufferEncoding): void;
76
+ start(port: number, encoding?: string): void;
62
77
  stop(): Promise<void>;
63
78
  }
64
79
 
65
- export declare const VT: string;
80
+ /**
81
+ * VT (Vertical Tab) character.
82
+ *
83
+ * In HL7 messages, this character is used to indicate the start of a message.
84
+ */
85
+ export declare const VT = 11;
66
86
 
67
87
  export { }
@@ -3,9 +3,19 @@
3
3
  import { Hl7Message } from '@medplum/core';
4
4
  import net from 'node:net';
5
5
 
6
- export declare const CR: string;
6
+ /**
7
+ * CR (Carriage Return) character.
8
+ *
9
+ * In HL7 messages, this character is used to indicate the end of a message.
10
+ */
11
+ export declare const CR = 13;
7
12
 
8
- export declare const FS: string;
13
+ /**
14
+ * FS (File Separator) character.
15
+ *
16
+ * In HL7 messages, this character is used to separate fields.
17
+ */
18
+ export declare const FS = 28;
9
19
 
10
20
  export declare abstract class Hl7Base extends EventTarget {
11
21
  addEventListener<K extends keyof Hl7EventMap>(type: K, listener: ((event: Hl7EventMap[K]) => void) | EventListenerObject | null, options?: boolean | AddEventListenerOptions): void;
@@ -16,6 +26,7 @@ export declare class Hl7Client extends Hl7Base {
16
26
  options: Hl7ClientOptions;
17
27
  host: string;
18
28
  port: number;
29
+ encoding?: string;
19
30
  connection?: Hl7Connection;
20
31
  constructor(options: Hl7ClientOptions);
21
32
  connect(): Promise<Hl7Connection>;
@@ -27,15 +38,19 @@ export declare class Hl7Client extends Hl7Base {
27
38
  export declare interface Hl7ClientOptions {
28
39
  host: string;
29
40
  port: number;
41
+ encoding?: string;
30
42
  }
31
43
 
32
44
  export declare class Hl7Connection extends Hl7Base {
33
45
  readonly socket: net.Socket;
34
- readonly encoding?: BufferEncoding | undefined;
35
- constructor(socket: net.Socket, encoding?: BufferEncoding | undefined);
46
+ readonly encoding: string;
47
+ private chunks;
48
+ constructor(socket: net.Socket, encoding?: string);
36
49
  send(reply: Hl7Message): void;
37
50
  sendAndWait(msg: Hl7Message): Promise<Hl7Message>;
38
51
  close(): void;
52
+ private appendData;
53
+ private resetBuffer;
39
54
  }
40
55
 
41
56
  export declare class Hl7ErrorEvent extends Event {
@@ -58,10 +73,15 @@ export declare class Hl7Server {
58
73
  readonly handler: (connection: Hl7Connection) => void;
59
74
  server?: net.Server;
60
75
  constructor(handler: (connection: Hl7Connection) => void);
61
- start(port: number, encoding?: BufferEncoding): void;
76
+ start(port: number, encoding?: string): void;
62
77
  stop(): Promise<void>;
63
78
  }
64
79
 
65
- export declare const VT: string;
80
+ /**
81
+ * VT (Vertical Tab) character.
82
+ *
83
+ * In HL7 messages, this character is used to indicate the start of a message.
84
+ */
85
+ export declare const VT = 11;
66
86
 
67
87
  export { }
@@ -1,2 +1,2 @@
1
- var i=class extends EventTarget{addEventListener(e,t,n){super.addEventListener(e,t,n)}removeEventListener(e,t,n){super.removeEventListener(e,t,n)}};import{connect as g}from"net";import{Hl7Message as E}from"@medplum/core";var m="\v",p="",v="\r";var l=class extends Event{constructor(t,n){super("message");this.connection=t;this.message=n}},d=class extends Event{constructor(t){super("error");this.error=t}};var c=class extends i{constructor(t,n){super();this.socket=t;this.encoding=n;let o="";t.on("data",r=>{try{if(o+=r.toString(),o.endsWith(p+v)){let s=E.parse(o.substring(1,o.length-2));this.dispatchEvent(new l(this,s)),o=""}}catch(s){this.dispatchEvent(new d(s))}}).setEncoding(n??"utf-8"),t.on("error",r=>{o="",this.dispatchEvent(new d(r))})}send(t){this.socket.write(m+t.toString()+p+v)}async sendAndWait(t){let n=new Promise(o=>{function r(s){s.target.removeEventListener("message",r),o(s.message)}this.addEventListener("message",r)});return this.send(t),n}close(){this.socket.end(),this.socket.destroy()}};var h=class extends i{constructor(e){super(),this.options=e,this.host=this.options.host,this.port=this.options.port}connect(){return this.connection?Promise.resolve(this.connection):new Promise((e,t)=>{let n=g({host:this.host,port:this.port},()=>{this.connection=new c(n),n.off("error",t),e(this.connection)});n.on("error",t)})}async send(e){return(await this.connect()).send(e)}async sendAndWait(e){return(await this.connect()).sendAndWait(e)}close(){this.connection&&(this.connection.close(),delete this.connection)}};import u from"net";var f=class{constructor(e){this.handler=e}start(e,t){let n=u.createServer(o=>{let r=new c(o,t);this.handler(r)});n.listen(e),this.server=n}async stop(){return new Promise((e,t)=>{this.server&&(this.server.close(n=>{if(n){t(n);return}e()}),this.server=void 0)})}};export{v as CR,p as FS,i as Hl7Base,h as Hl7Client,c as Hl7Connection,d as Hl7ErrorEvent,l as Hl7MessageEvent,f as Hl7Server,m as VT};
1
+ var r=class extends EventTarget{addEventListener(t,e,n){super.addEventListener(t,e,n)}removeEventListener(t,e,n){super.removeEventListener(t,e,n)}};import{connect as y}from"net";import{Hl7Message as E}from"@medplum/core";import{decode as H,encode as x}from"iconv-lite";var g=11,l=13,v=28;var d=class extends Event{constructor(e,n){super("message");this.connection=e;this.message=n}},a=class extends Event{constructor(e){super("error");this.error=e}};var i=class extends r{constructor(e,n="utf-8"){super();this.socket=e;this.encoding=n;this.chunks=[];e.on("data",s=>{try{if(this.appendData(s),s.at(-2)===28&&s.at(-1)===13){let o=Buffer.concat(this.chunks),p=o.subarray(1,o.length-2),f=H(p,this.encoding),u=E.parse(f);this.dispatchEvent(new d(this,u)),this.resetBuffer()}}catch(o){this.dispatchEvent(new a(o))}}),e.on("error",s=>{this.resetBuffer(),this.dispatchEvent(new a(s))})}send(e){let n=e.toString(),s=x(n,this.encoding),o=Buffer.alloc(s.length+3);o.writeInt8(11,0),s.copy(o,1),o.writeInt8(28,s.length+1),o.writeInt8(13,s.length+2),this.socket.write(o)}async sendAndWait(e){let n=new Promise(s=>{function o(p){p.target.removeEventListener("message",o),s(p.message)}this.addEventListener("message",o)});return this.send(e),n}close(){this.socket.end(),this.socket.destroy()}appendData(e){this.chunks.push(e)}resetBuffer(){this.chunks=[]}};var h=class extends r{constructor(t){super(),this.options=t,this.host=this.options.host,this.port=this.options.port,this.encoding=this.options.encoding}connect(){return this.connection?Promise.resolve(this.connection):new Promise((t,e)=>{let n=y({host:this.host,port:this.port},()=>{this.connection=new i(n,this.encoding),n.off("error",e),t(this.connection)});n.on("error",e)})}async send(t){return(await this.connect()).send(t)}async sendAndWait(t){return(await this.connect()).sendAndWait(t)}close(){this.connection&&(this.connection.close(),delete this.connection)}};import b from"net";var m=class{constructor(t){this.handler=t}start(t,e){let n=b.createServer(s=>{let o=new i(s,e);this.handler(o)});n.listen(t),this.server=n}async stop(){return new Promise((t,e)=>{this.server&&(this.server.close(n=>{if(n){e(n);return}t()}),this.server=void 0)})}};export{l as CR,v as FS,r as Hl7Base,h as Hl7Client,i as Hl7Connection,a as Hl7ErrorEvent,d as Hl7MessageEvent,m as Hl7Server,g as VT};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/base.ts", "../../src/client.ts", "../../src/connection.ts", "../../src/constants.ts", "../../src/events.ts", "../../src/server.ts"],
4
- "sourcesContent": ["import { Hl7ErrorEvent, Hl7MessageEvent } from './events';\n\nexport interface Hl7EventMap {\n message: Hl7MessageEvent;\n error: Hl7ErrorEvent;\n}\n\nexport abstract class Hl7Base extends EventTarget {\n addEventListener<K extends keyof Hl7EventMap>(\n type: K,\n listener: ((event: Hl7EventMap[K]) => void) | EventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void;\n\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void {\n super.addEventListener(type, listener, options);\n }\n removeEventListener<K extends keyof Hl7EventMap>(\n type: K,\n listener: ((event: Hl7EventMap[K]) => void) | EventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void;\n\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void {\n super.removeEventListener(type, listener, options);\n }\n}\n", "import { Hl7Message } from '@medplum/core';\nimport { connect } from 'node:net';\nimport { Hl7Base } from './base';\nimport { Hl7Connection } from './connection';\n\nexport interface Hl7ClientOptions {\n host: string;\n port: number;\n}\n\nexport class Hl7Client extends Hl7Base {\n options: Hl7ClientOptions;\n host: string;\n port: number;\n connection?: Hl7Connection;\n\n constructor(options: Hl7ClientOptions) {\n super();\n this.options = options;\n this.host = this.options.host;\n this.port = this.options.port;\n }\n\n connect(): Promise<Hl7Connection> {\n if (this.connection) {\n return Promise.resolve(this.connection);\n }\n\n return new Promise((resolve, reject) => {\n const socket = connect({ host: this.host, port: this.port }, () => {\n this.connection = new Hl7Connection(socket);\n socket.off('error', reject);\n resolve(this.connection);\n });\n\n socket.on('error', reject);\n });\n }\n\n async send(msg: Hl7Message): Promise<void> {\n return (await this.connect()).send(msg);\n }\n\n async sendAndWait(msg: Hl7Message): Promise<Hl7Message> {\n return (await this.connect()).sendAndWait(msg);\n }\n\n close(): void {\n if (this.connection) {\n this.connection.close();\n delete this.connection;\n }\n }\n}\n", "import { Hl7Message } from '@medplum/core';\nimport net from 'node:net';\nimport { Hl7Base } from './base';\nimport { CR, FS, VT } from './constants';\nimport { Hl7ErrorEvent, Hl7MessageEvent } from './events';\n\nexport class Hl7Connection extends Hl7Base {\n constructor(\n readonly socket: net.Socket,\n readonly encoding?: BufferEncoding\n ) {\n super();\n\n let buffer = '';\n\n socket\n .on('data', (data) => {\n try {\n buffer += data.toString();\n if (buffer.endsWith(FS + CR)) {\n const message = Hl7Message.parse(buffer.substring(1, buffer.length - 2));\n this.dispatchEvent(new Hl7MessageEvent(this, message));\n buffer = '';\n }\n } catch (err) {\n this.dispatchEvent(new Hl7ErrorEvent(err as Error));\n }\n })\n .setEncoding(encoding ?? 'utf-8');\n\n socket.on('error', (err) => {\n buffer = '';\n this.dispatchEvent(new Hl7ErrorEvent(err));\n });\n }\n\n send(reply: Hl7Message): void {\n this.socket.write(VT + reply.toString() + FS + CR);\n }\n\n async sendAndWait(msg: Hl7Message): Promise<Hl7Message> {\n const promise = new Promise<Hl7Message>((resolve) => {\n function handler(event: Hl7MessageEvent): void {\n (event.target as Hl7Connection).removeEventListener('message', handler);\n resolve(event.message);\n }\n this.addEventListener('message', handler);\n });\n\n this.send(msg);\n return promise;\n }\n\n close(): void {\n this.socket.end();\n this.socket.destroy();\n }\n}\n", "export const VT = String.fromCharCode(0x0b);\nexport const FS = String.fromCharCode(0x1c);\nexport const CR = String.fromCharCode(0x0d);\n", "import { Hl7Message } from '@medplum/core';\nimport { Hl7Connection } from './connection';\n\nexport class Hl7MessageEvent extends Event {\n constructor(\n public readonly connection: Hl7Connection,\n public readonly message: Hl7Message\n ) {\n super('message');\n }\n}\n\nexport class Hl7ErrorEvent extends Event {\n constructor(public readonly error: Error) {\n super('error');\n }\n}\n", "import net from 'node:net';\nimport { Hl7Connection } from './connection';\n\nexport class Hl7Server {\n server?: net.Server;\n\n constructor(public readonly handler: (connection: Hl7Connection) => void) {}\n\n start(port: number, encoding?: BufferEncoding): void {\n const server = net.createServer((socket) => {\n const connection = new Hl7Connection(socket, encoding);\n this.handler(connection);\n });\n\n server.listen(port);\n this.server = server;\n }\n\n async stop(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.server) {\n this.server.close((err) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n });\n this.server = undefined;\n }\n });\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["Hl7Base", "type", "listener", "options", "connect", "Hl7Message", "VT", "FS", "CR", "Hl7MessageEvent", "connection", "message", "Hl7ErrorEvent", "error", "Hl7Connection", "Hl7Base", "socket", "encoding", "buffer", "data", "FS", "CR", "message", "Hl7Message", "Hl7MessageEvent", "err", "Hl7ErrorEvent", "reply", "VT", "msg", "promise", "resolve", "handler", "event", "Hl7Client", "Hl7Base", "options", "resolve", "reject", "socket", "connect", "Hl7Connection", "msg", "net", "Hl7Server", "handler", "port", "encoding", "server", "net", "socket", "connection", "Hl7Connection", "resolve", "reject", "err"]
4
+ "sourcesContent": ["import { Hl7ErrorEvent, Hl7MessageEvent } from './events';\n\nexport interface Hl7EventMap {\n message: Hl7MessageEvent;\n error: Hl7ErrorEvent;\n}\n\nexport abstract class Hl7Base extends EventTarget {\n addEventListener<K extends keyof Hl7EventMap>(\n type: K,\n listener: ((event: Hl7EventMap[K]) => void) | EventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void;\n\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void {\n super.addEventListener(type, listener, options);\n }\n removeEventListener<K extends keyof Hl7EventMap>(\n type: K,\n listener: ((event: Hl7EventMap[K]) => void) | EventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void;\n\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions\n ): void {\n super.removeEventListener(type, listener, options);\n }\n}\n", "import { Hl7Message } from '@medplum/core';\nimport { connect } from 'node:net';\nimport { Hl7Base } from './base';\nimport { Hl7Connection } from './connection';\n\nexport interface Hl7ClientOptions {\n host: string;\n port: number;\n encoding?: string;\n}\n\nexport class Hl7Client extends Hl7Base {\n options: Hl7ClientOptions;\n host: string;\n port: number;\n encoding?: string;\n connection?: Hl7Connection;\n\n constructor(options: Hl7ClientOptions) {\n super();\n this.options = options;\n this.host = this.options.host;\n this.port = this.options.port;\n this.encoding = this.options.encoding;\n }\n\n connect(): Promise<Hl7Connection> {\n if (this.connection) {\n return Promise.resolve(this.connection);\n }\n\n return new Promise((resolve, reject) => {\n const socket = connect({ host: this.host, port: this.port }, () => {\n this.connection = new Hl7Connection(socket, this.encoding);\n socket.off('error', reject);\n resolve(this.connection);\n });\n\n socket.on('error', reject);\n });\n }\n\n async send(msg: Hl7Message): Promise<void> {\n return (await this.connect()).send(msg);\n }\n\n async sendAndWait(msg: Hl7Message): Promise<Hl7Message> {\n return (await this.connect()).sendAndWait(msg);\n }\n\n close(): void {\n if (this.connection) {\n this.connection.close();\n delete this.connection;\n }\n }\n}\n", "import { Hl7Message } from '@medplum/core';\nimport { decode, encode } from 'iconv-lite';\nimport net from 'node:net';\nimport { Hl7Base } from './base';\nimport { CR, FS, VT } from './constants';\nimport { Hl7ErrorEvent, Hl7MessageEvent } from './events';\n\n// iconv-lite docs have great examples and explanations for how to use Buffers with iconv-lite:\n// See: https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding\n\nexport class Hl7Connection extends Hl7Base {\n private chunks: Buffer[] = [];\n\n constructor(\n readonly socket: net.Socket,\n readonly encoding: string = 'utf-8'\n ) {\n super();\n\n socket.on('data', (data: Buffer) => {\n try {\n this.appendData(data);\n if (data.at(-2) === FS && data.at(-1) === CR) {\n const buffer = Buffer.concat(this.chunks);\n const contentBuffer = buffer.subarray(1, buffer.length - 2);\n const contentString = decode(contentBuffer, this.encoding);\n const message = Hl7Message.parse(contentString);\n this.dispatchEvent(new Hl7MessageEvent(this, message));\n this.resetBuffer();\n }\n } catch (err) {\n this.dispatchEvent(new Hl7ErrorEvent(err as Error));\n }\n });\n\n socket.on('error', (err) => {\n this.resetBuffer();\n this.dispatchEvent(new Hl7ErrorEvent(err));\n });\n }\n\n send(reply: Hl7Message): void {\n const replyString = reply.toString();\n const replyBuffer = encode(replyString, this.encoding);\n const outputBuffer = Buffer.alloc(replyBuffer.length + 3);\n outputBuffer.writeInt8(VT, 0);\n replyBuffer.copy(outputBuffer, 1);\n outputBuffer.writeInt8(FS, replyBuffer.length + 1);\n outputBuffer.writeInt8(CR, replyBuffer.length + 2);\n this.socket.write(outputBuffer);\n }\n\n async sendAndWait(msg: Hl7Message): Promise<Hl7Message> {\n const promise = new Promise<Hl7Message>((resolve) => {\n function handler(event: Hl7MessageEvent): void {\n (event.target as Hl7Connection).removeEventListener('message', handler);\n resolve(event.message);\n }\n this.addEventListener('message', handler);\n });\n\n this.send(msg);\n return promise;\n }\n\n close(): void {\n this.socket.end();\n this.socket.destroy();\n }\n\n private appendData(data: Buffer): void {\n this.chunks.push(data);\n }\n\n private resetBuffer(): void {\n this.chunks = [];\n }\n}\n", "/**\n * VT (Vertical Tab) character.\n *\n * In HL7 messages, this character is used to indicate the start of a message.\n */\nexport const VT = 0x0b;\n\n/**\n * CR (Carriage Return) character.\n *\n * In HL7 messages, this character is used to indicate the end of a message.\n */\nexport const CR = 0x0d;\n\n/**\n * FS (File Separator) character.\n *\n * In HL7 messages, this character is used to separate fields.\n */\nexport const FS = 0x1c;\n", "import { Hl7Message } from '@medplum/core';\nimport { Hl7Connection } from './connection';\n\nexport class Hl7MessageEvent extends Event {\n constructor(\n public readonly connection: Hl7Connection,\n public readonly message: Hl7Message\n ) {\n super('message');\n }\n}\n\nexport class Hl7ErrorEvent extends Event {\n constructor(public readonly error: Error) {\n super('error');\n }\n}\n", "import net from 'node:net';\nimport { Hl7Connection } from './connection';\n\nexport class Hl7Server {\n server?: net.Server;\n\n constructor(public readonly handler: (connection: Hl7Connection) => void) {}\n\n start(port: number, encoding?: string): void {\n const server = net.createServer((socket) => {\n const connection = new Hl7Connection(socket, encoding);\n this.handler(connection);\n });\n\n server.listen(port);\n this.server = server;\n }\n\n async stop(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.server) {\n this.server.close((err) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n });\n this.server = undefined;\n }\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Hl7Base", "type", "listener", "options", "connect", "Hl7Message", "decode", "encode", "VT", "CR", "FS", "Hl7MessageEvent", "connection", "message", "Hl7ErrorEvent", "error", "Hl7Connection", "Hl7Base", "socket", "encoding", "data", "buffer", "contentBuffer", "contentString", "decode", "message", "Hl7Message", "Hl7MessageEvent", "err", "Hl7ErrorEvent", "reply", "replyString", "replyBuffer", "encode", "outputBuffer", "msg", "promise", "resolve", "handler", "event", "Hl7Client", "Hl7Base", "options", "resolve", "reject", "socket", "connect", "Hl7Connection", "msg", "net", "Hl7Server", "handler", "port", "encoding", "server", "net", "socket", "connection", "Hl7Connection", "resolve", "reject", "err"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medplum/hl7",
3
- "version": "3.1.6",
3
+ "version": "3.1.7",
4
4
  "description": "Medplum HL7 Utilities",
5
5
  "keywords": [
6
6
  "medplum",
@@ -53,10 +53,11 @@
53
53
  "test": "jest"
54
54
  },
55
55
  "dependencies": {
56
- "@medplum/core": "3.1.6"
56
+ "@medplum/core": "3.1.7",
57
+ "iconv-lite": "0.6.3"
57
58
  },
58
59
  "devDependencies": {
59
- "@medplum/fhirtypes": "3.1.6"
60
+ "@medplum/fhirtypes": "3.1.7"
60
61
  },
61
62
  "engines": {
62
63
  "node": ">=18.0.0"