UNPKG

@cliz/inlets

Version:
61 lines (60 loc) 2.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createMonitor = void 0; const http = require("http"); const url = require("url"); const doreamon_1 = require("@zodash/doreamon"); const ws_1 = require("./ws"); const tcp_1 = require("./tcp"); function createMonitor(ctx, options) { const logger = doreamon_1.default.logger.getLogger('monitor'); const server = http.createServer(); const ws = (0, ws_1.createWebSocketMonitor)(ctx, options); const tcp = (0, tcp_1.createTCPMonitor)(ctx, { ...options, port: options.tcpPort, }); const tunnel = (callback) => { ws.emitter.on('tunnel', (data) => { callback(data); }); }; ws.ws.attach(server); server.on('request', (req, res) => { const parsedUrl = url.parse(req.url || '', true); const pathname = parsedUrl.pathname || ''; if (pathname === '/api/stats' && req.method === 'GET') { const stats = ctx.trafficStats.getStats(); res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' }); res.end(JSON.stringify(stats, null, 2)); return; } const statsMatch = pathname.match(/^\/api\/stats\/(.+)$/); if (statsMatch && req.method === 'GET') { const clientId = decodeURIComponent(statsMatch[1]); const clientStats = ctx.trafficStats.getStats(clientId); if (clientStats) { res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' }); res.end(JSON.stringify(clientStats, null, 2)); } else { res.writeHead(404, { 'Content-Type': 'application/json; charset=utf-8' }); res.end(JSON.stringify({ error: 'Client not found' }, null, 2)); } return; } }); server.listen(options.port, '0.0.0.0', () => { logger.info(`Version: ${options.version}`); logger.info(`Monitor: http://127.0.0.1:${options.port}`); logger.info(`Monitor(tcp): tcp://127.0.0.1:${options.tcpPort}`); logger.info(`Domain: ${options.domain}`); }); return { ws, tcp, server, tunnel, }; } exports.createMonitor = createMonitor;