hl7v2-net 1.8.2 → 1.9.0
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 +27 -1
- package/hl7-client.js +2 -2
- package/hl7-response.d.ts +1 -1
- package/hl7-response.js +3 -4
- package/hl7-router.d.ts +9 -3
- package/hl7-router.js +89 -34
- package/hl7-server.d.ts +3 -2
- package/hl7-server.js +6 -3
- package/package.json +3 -3
- package/types.d.ts +2 -1
package/README.md
CHANGED
|
@@ -113,7 +113,7 @@ await server.close(5000); // Wait up to 5s for running handlers
|
|
|
113
113
|
|
|
114
114
|
##### .use()
|
|
115
115
|
|
|
116
|
-
Adds a middleware handler to the server.
|
|
116
|
+
Adds a middleware handler or another router to the server.
|
|
117
117
|
`use(handler: HL7Middleware | HL7Router, priority?: number): void`
|
|
118
118
|
example
|
|
119
119
|
|
|
@@ -124,6 +124,20 @@ server.use((req, res, next) => {
|
|
|
124
124
|
});
|
|
125
125
|
```
|
|
126
126
|
|
|
127
|
+
##### .onError()
|
|
128
|
+
|
|
129
|
+
Adds an error middleware handler or another router to the server.
|
|
130
|
+
`onError(handler: HL7ErrorMiddleware | HL7Router, priority?: number): void`
|
|
131
|
+
example
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
server.onError((err, req, res, next) => {
|
|
135
|
+
console.error(err);
|
|
136
|
+
res.failed(err);
|
|
137
|
+
next();
|
|
138
|
+
});
|
|
139
|
+
```
|
|
140
|
+
|
|
127
141
|
---
|
|
128
142
|
|
|
129
143
|
### Hl7Client
|
|
@@ -251,6 +265,18 @@ router.use((req, res) => { ... });
|
|
|
251
265
|
server.use(router);
|
|
252
266
|
```
|
|
253
267
|
|
|
268
|
+
##### .onError()
|
|
269
|
+
|
|
270
|
+
Adds an error middleware or another router to this router.
|
|
271
|
+
`onError(handler: HL7ErrorMiddleware | HL7Router, priority?: number): void`
|
|
272
|
+
example
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
const router = new HL7Router();
|
|
276
|
+
router.onError((err, req, res, next) => { ... });
|
|
277
|
+
server.use(router);
|
|
278
|
+
```
|
|
279
|
+
|
|
254
280
|
---
|
|
255
281
|
|
|
256
282
|
### HL7Request
|
package/hl7-client.js
CHANGED
|
@@ -194,8 +194,8 @@ export class Hl7Client extends AsyncEventEmitter {
|
|
|
194
194
|
const req = new HL7Request(this._socket, message);
|
|
195
195
|
const res = new HL7Response(req);
|
|
196
196
|
this._router.handle(req, res, () => {
|
|
197
|
-
if (res.
|
|
198
|
-
this.emit('error', res.
|
|
197
|
+
if (res.error)
|
|
198
|
+
this.emit('error', res.error);
|
|
199
199
|
});
|
|
200
200
|
}
|
|
201
201
|
}
|
package/hl7-response.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { HL7Socket } from './hl7-socket.js';
|
|
|
4
4
|
export declare class HL7Response {
|
|
5
5
|
protected _finished: boolean;
|
|
6
6
|
readonly request: HL7Request;
|
|
7
|
-
|
|
7
|
+
error?: Error;
|
|
8
8
|
message: HL7Message;
|
|
9
9
|
constructor(request: HL7Request);
|
|
10
10
|
get socket(): HL7Socket;
|
package/hl7-response.js
CHANGED
|
@@ -2,7 +2,7 @@ import { MSASegment } from 'hl7v2';
|
|
|
2
2
|
export class HL7Response {
|
|
3
3
|
_finished = false;
|
|
4
4
|
request;
|
|
5
|
-
|
|
5
|
+
error;
|
|
6
6
|
message;
|
|
7
7
|
constructor(request) {
|
|
8
8
|
this.request = request;
|
|
@@ -18,10 +18,9 @@ export class HL7Response {
|
|
|
18
18
|
return this._finished;
|
|
19
19
|
}
|
|
20
20
|
failed(error) {
|
|
21
|
+
this.error = error;
|
|
21
22
|
const msa = this.message.getSegment('MSA');
|
|
22
23
|
if (msa?.field(MSASegment.AcknowledgmentCode).getValue() !== 'AE')
|
|
23
|
-
this.message = this.request.message.createNak(
|
|
24
|
-
this.errors.push(error);
|
|
25
|
-
this.message.addError(error);
|
|
24
|
+
this.message = this.request.message.createNak([error]);
|
|
26
25
|
}
|
|
27
26
|
}
|
package/hl7-router.d.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { HL7Request } from './hl7-request.js';
|
|
2
2
|
import { HL7Response } from './hl7-response.js';
|
|
3
|
-
import type { HL7Middleware } from './types.js';
|
|
3
|
+
import type { HL7ErrorMiddleware, HL7Middleware } from './types.js';
|
|
4
4
|
export declare class HL7Router {
|
|
5
5
|
protected _handlerStack: Map<number, (HL7Middleware | HL7Router)[]>;
|
|
6
|
+
protected _errorHandlerStack: Map<number, (HL7ErrorMiddleware | HL7Router)[]>;
|
|
6
7
|
protected _needPrepare: boolean;
|
|
7
8
|
protected _handlers: HL7Middleware[];
|
|
9
|
+
protected _errorHandlers: HL7ErrorMiddleware[];
|
|
8
10
|
use(handler: HL7Middleware | HL7Router, priority?: number): void;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
onError(handler: HL7ErrorMiddleware | HL7Router, priority?: number): void;
|
|
12
|
+
handle(req: HL7Request, res: HL7Response, callback: (err?: Error) => void): void;
|
|
13
|
+
protected _handle(req: HL7Request, res: HL7Response, callback: (err?: Error) => void): void;
|
|
14
|
+
protected _handleError(error: any, req: HL7Request, res: HL7Response, callback: (err?: any) => void): void | Promise<void>;
|
|
15
|
+
protected _prepareStack(): void;
|
|
16
|
+
protected _finalHandler(req: HL7Request, res: HL7Response): void;
|
|
11
17
|
}
|
package/hl7-router.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export class HL7Router {
|
|
2
2
|
_handlerStack = new Map();
|
|
3
|
+
_errorHandlerStack = new Map();
|
|
3
4
|
_needPrepare = true;
|
|
4
|
-
_handlers = [];
|
|
5
5
|
use(handler, priority = 0) {
|
|
6
6
|
let list = this._handlerStack.get(priority);
|
|
7
7
|
if (!list) {
|
|
@@ -11,63 +11,118 @@ export class HL7Router {
|
|
|
11
11
|
list.push(handler);
|
|
12
12
|
this._needPrepare = true;
|
|
13
13
|
}
|
|
14
|
+
onError(handler, priority = 0) {
|
|
15
|
+
let list = this._errorHandlerStack.get(priority);
|
|
16
|
+
if (!list) {
|
|
17
|
+
list = [];
|
|
18
|
+
this._errorHandlerStack.set(priority, list);
|
|
19
|
+
}
|
|
20
|
+
list.push(handler);
|
|
21
|
+
this._needPrepare = true;
|
|
22
|
+
}
|
|
14
23
|
handle(req, res, callback) {
|
|
15
|
-
this._prepareStack(
|
|
16
|
-
let handlerIdx = -1;
|
|
24
|
+
this._prepareStack();
|
|
17
25
|
let callbackCalled = false;
|
|
18
|
-
|
|
26
|
+
this._handle(req, res, err => {
|
|
19
27
|
if (callbackCalled)
|
|
20
28
|
return;
|
|
21
29
|
callbackCalled = true;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
30
|
+
try {
|
|
31
|
+
if (err)
|
|
32
|
+
res.failed(err);
|
|
33
|
+
this._finalHandler(req, res);
|
|
34
|
+
callback(err);
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
callback(e instanceof Error ? e : new Error(e));
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
_handle(req, res, callback) {
|
|
42
|
+
let handlerIdx = -1;
|
|
43
|
+
const next = async (err) => {
|
|
44
|
+
if (err) {
|
|
45
|
+
this._handleError(err, req, res, callback);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
25
48
|
try {
|
|
26
49
|
handlerIdx++;
|
|
27
50
|
const handler = this._handlers[handlerIdx];
|
|
28
|
-
if (handler)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
handler(req, res, next);
|
|
51
|
+
if (!handler)
|
|
52
|
+
return callback();
|
|
53
|
+
if (handler.length < 3) {
|
|
54
|
+
await handler(req, res);
|
|
55
|
+
next();
|
|
35
56
|
return;
|
|
36
57
|
}
|
|
37
|
-
|
|
38
|
-
|
|
58
|
+
await handler(req, res, next);
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
this._handleError(e, req, res, callback);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
next();
|
|
65
|
+
}
|
|
66
|
+
_handleError(error, req, res, callback) {
|
|
67
|
+
let handlerIdx = -1;
|
|
68
|
+
const next = async (err) => {
|
|
69
|
+
if (err)
|
|
70
|
+
error = err;
|
|
71
|
+
try {
|
|
72
|
+
handlerIdx++;
|
|
73
|
+
const handler = this._errorHandlers[handlerIdx];
|
|
74
|
+
if (!handler)
|
|
75
|
+
return callback(error);
|
|
76
|
+
if (handler.length < 4) {
|
|
77
|
+
await handler(error, req, res);
|
|
78
|
+
next();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
await handler(error, req, res, next);
|
|
39
82
|
}
|
|
40
83
|
catch (e) {
|
|
41
|
-
|
|
42
|
-
return next();
|
|
84
|
+
callback(e);
|
|
43
85
|
}
|
|
44
86
|
};
|
|
45
|
-
return next();
|
|
87
|
+
return next(error);
|
|
46
88
|
}
|
|
47
|
-
_prepareStack(
|
|
89
|
+
_prepareStack() {
|
|
48
90
|
if (!this._needPrepare)
|
|
49
91
|
return;
|
|
50
92
|
this._needPrepare = false;
|
|
93
|
+
this._handlers = [];
|
|
94
|
+
this._errorHandlers = [];
|
|
51
95
|
Array.from(this._handlerStack.keys())
|
|
52
96
|
.sort()
|
|
53
97
|
.forEach(p => {
|
|
54
98
|
const list = this._handlerStack.get(p);
|
|
55
|
-
for (const
|
|
56
|
-
if (
|
|
57
|
-
|
|
58
|
-
this._handlers.push(...
|
|
99
|
+
for (const x of list) {
|
|
100
|
+
if (x instanceof HL7Router) {
|
|
101
|
+
x._prepareStack();
|
|
102
|
+
this._handlers.push(...x._handlers);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this._handlers.push(x);
|
|
59
106
|
}
|
|
60
|
-
else
|
|
61
|
-
this._handlers.push(h);
|
|
62
107
|
}
|
|
63
108
|
});
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
109
|
+
Array.from(this._errorHandlerStack.keys())
|
|
110
|
+
.sort()
|
|
111
|
+
.forEach(p => {
|
|
112
|
+
const list = this._errorHandlerStack.get(p);
|
|
113
|
+
for (const x of list) {
|
|
114
|
+
if (x instanceof HL7Router) {
|
|
115
|
+
x._prepareStack();
|
|
116
|
+
this._errorHandlers.push(...x._errorHandlers);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
this._errorHandlers.push(x);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
_finalHandler(req, res) {
|
|
125
|
+
if (!res.finished)
|
|
126
|
+
req.socket.sendMessage(res.message);
|
|
72
127
|
}
|
|
73
128
|
}
|
package/hl7-server.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { AddressInfo, ListenOptions, Socket } from 'net';
|
|
|
6
6
|
import { AsyncEventEmitter } from 'node-events-async';
|
|
7
7
|
import { HL7Router } from './hl7-router.js';
|
|
8
8
|
import { HL7Socket } from './hl7-socket.js';
|
|
9
|
-
import { HL7Middleware } from './types.js';
|
|
9
|
+
import { HL7ErrorMiddleware, HL7Middleware } from './types.js';
|
|
10
10
|
export declare class HL7Server extends AsyncEventEmitter<HL7Server.Events> {
|
|
11
11
|
protected _server: net.Server | tls.Server;
|
|
12
12
|
protected _sockets: Set<HL7Socket>;
|
|
@@ -78,7 +78,8 @@ export declare class HL7Server extends AsyncEventEmitter<HL7Server.Events> {
|
|
|
78
78
|
* connections.
|
|
79
79
|
*/
|
|
80
80
|
close(waitRunningHandlers?: number): Promise<void>;
|
|
81
|
-
use(handler: HL7Middleware, priority?: number): void;
|
|
81
|
+
use(handler: HL7Router | HL7Middleware, priority?: number): void;
|
|
82
|
+
onError(handler: HL7Router | HL7ErrorMiddleware, priority?: number): void;
|
|
82
83
|
/**
|
|
83
84
|
* Asynchronously get the number of concurrent connections on the server. Works
|
|
84
85
|
* when sockets were sent to forks.
|
package/hl7-server.js
CHANGED
|
@@ -146,6 +146,9 @@ export class HL7Server extends AsyncEventEmitter {
|
|
|
146
146
|
use(handler, priority = 0) {
|
|
147
147
|
this._router.use(handler, priority);
|
|
148
148
|
}
|
|
149
|
+
onError(handler, priority = 0) {
|
|
150
|
+
this._router.onError(handler, priority);
|
|
151
|
+
}
|
|
149
152
|
/**
|
|
150
153
|
* Asynchronously get the number of concurrent connections on the server. Works
|
|
151
154
|
* when sockets were sent to forks.
|
|
@@ -217,10 +220,10 @@ export class HL7Server extends AsyncEventEmitter {
|
|
|
217
220
|
resolve();
|
|
218
221
|
}
|
|
219
222
|
}, this.responseTimeout || 30000).unref();
|
|
220
|
-
this._router.handle(req, res,
|
|
223
|
+
this._router.handle(req, res, err => {
|
|
221
224
|
clearTimeout(timeoutTimer);
|
|
222
|
-
if (
|
|
223
|
-
this.emit('error',
|
|
225
|
+
if (err)
|
|
226
|
+
this.emit('error', err, socket);
|
|
224
227
|
resolve();
|
|
225
228
|
});
|
|
226
229
|
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hl7v2-net",
|
|
3
3
|
"description": "HL7 v2 server/client for NodeJS",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.9.0",
|
|
5
5
|
"author": "Panates",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"dependencies": {
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
"uid": "^2.0.2"
|
|
18
18
|
},
|
|
19
19
|
"peerDependencies": {
|
|
20
|
-
"hl7v2": "^1.
|
|
21
|
-
"hl7v2-dictionary": "^1.
|
|
20
|
+
"hl7v2": "^1.9.0",
|
|
21
|
+
"hl7v2-dictionary": "^1.9.0"
|
|
22
22
|
},
|
|
23
23
|
"type": "module",
|
|
24
24
|
"module": "./index.js",
|
package/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { HL7Request } from './hl7-request.js';
|
|
2
2
|
import { HL7Response } from './hl7-response.js';
|
|
3
|
-
export type NextFunction = () => void | Promise<void>;
|
|
3
|
+
export type NextFunction = (err?: Error) => void | Promise<void>;
|
|
4
4
|
export type HL7Middleware = ((req: HL7Request, res: HL7Response) => void) | ((req: HL7Request, res: HL7Response) => Promise<void>) | ((req: HL7Request, res: HL7Response, next: NextFunction) => void);
|
|
5
|
+
export type HL7ErrorMiddleware = ((error: Error, req: HL7Request, res: HL7Response) => void) | ((error: Error, req: HL7Request, res: HL7Response) => Promise<void>) | ((error: Error, req: HL7Request, res: HL7Response, next: NextFunction) => void);
|