const express = require('express'); const config = require('../../config/app'); const logger = require('../utils/logger'); function createHttpJsonConnector(options = {}) { let server; let messageHandler = async () => {}; let errorHandler = (err) => logger.error({ err }, 'connector error'); const port = Number(options.port || config.connectors.httpJsonPort); const instrumentId = options.instrument_id || null; const app = express(); app.use(express.json()); app.post('/messages', async (req, res) => { try { await messageHandler({ payload: req.body, context: { connector: 'http-json', instrument_id: instrumentId, remoteAddress: req.socket?.remoteAddress, remotePort: req.socket?.remotePort, localPort: req.socket?.localPort || port } }); res.status(202).json({ status: 'queued' }); } catch (err) { errorHandler(err); res.status(500).json({ status: 'error', message: err.message }); } }); return { name: () => 'http-json', type: () => 'http-json', async start() { return new Promise((resolve) => { server = app.listen(port, () => { logger.info({ port, instrument_id: instrumentId }, 'http-json connector listening'); resolve(); }); }); }, async stop() { 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 = { createHttpJsonConnector };