mahdahar 10f8dbbb83 refactor: consolidate core runtime and docs
Move middleware sources into core/, refresh config paths, and update design/user docs to reflect the raw payload pipeline.
2026-04-07 11:30:11 +07:00

77 lines
2.1 KiB
JavaScript

const net = require('net');
const config = require('../config/config');
const logger = require('../logger');
function createHl7TcpConnector(options = {}) {
let server;
let messageHandler = async () => {};
let errorHandler = (err) => logger.error({ err }, 'hl7 connector error');
const port = Number(options.port || config.connectors.hl7TcpPort);
const instrumentId = options.instrument_id || null;
const connections = new Set();
function handleData(socket, chunk) {
const payload = chunk.toString('utf8').trim();
if (!payload) return;
messageHandler({
payload,
context: {
connector: 'hl7-tcp',
instrument_id: instrumentId,
remoteAddress: socket.remoteAddress,
remotePort: socket.remotePort,
localPort: socket.localPort || port
}
}).catch(errorHandler);
}
function attach(socket) {
connections.add(socket);
socket.on('data', (chunk) => handleData(socket, chunk));
socket.on('error', (err) => errorHandler(err));
socket.on('close', () => connections.delete(socket));
}
return {
name: () => 'hl7-tcp',
type: () => 'hl7-tcp',
async start() {
server = net.createServer(attach);
return new Promise((resolve, reject) => {
server.listen(port, () => {
logger.info({ port, instrument_id: instrumentId }, 'hl7 tcp connector listening');
resolve();
});
server.on('error', (err) => {
errorHandler(err);
reject(err);
});
});
},
async stop() {
for (const socket of connections) {
socket.destroy();
}
if (!server) return;
return new Promise((resolve, reject) => {
server.close((err) => {
if (err) return reject(err);
resolve();
});
});
},
health() {
return { status: server ? 'up' : 'down', port, instrument_id: instrumentId };
},
onMessage(handler) {
messageHandler = handler;
},
onError(handler) {
errorHandler = handler;
}
};
}
module.exports = { createHl7TcpConnector };