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 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.errors.length)
198
- this.emit('error', res.errors[0]);
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
- errors: Error[];
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
- errors = [];
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(this.errors);
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
- handle(req: HL7Request, res: HL7Response, callback: () => void): void | Promise<void>;
10
- protected _prepareStack(root?: boolean): void;
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(true);
16
- let handlerIdx = -1;
24
+ this._prepareStack();
17
25
  let callbackCalled = false;
18
- const doCallback = () => {
26
+ this._handle(req, res, err => {
19
27
  if (callbackCalled)
20
28
  return;
21
29
  callbackCalled = true;
22
- callback();
23
- };
24
- const next = async () => {
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
- if (handler.length < 3) {
30
- await handler(req, res);
31
- next();
32
- return;
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
- doCallback();
38
- return;
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
- res.failed(e);
42
- return next();
84
+ callback(e);
43
85
  }
44
86
  };
45
- return next();
87
+ return next(error);
46
88
  }
47
- _prepareStack(root) {
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 h of list) {
56
- if (h instanceof HL7Router) {
57
- h._prepareStack(false);
58
- this._handlers.push(...h._handlers);
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
- if (root) {
65
- const finalHandler = (req, res) => {
66
- if (res.finished || req.message.messageType.startsWith('ACK^'))
67
- return;
68
- req.socket.sendMessage(res.message);
69
- };
70
- this._handlers.push(finalHandler);
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 (res.errors.length)
223
- this.emit('error', res.errors[0], socket);
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.8.2",
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.8.2",
21
- "hl7v2-dictionary": "^1.8.2"
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);