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 };