@cliz/inlets
Version:
Cloud Native Tunnel
61 lines (60 loc) • 2.3 kB
JavaScript
;
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;