UNPKG

agentcrumbs

Version:
123 lines 4.26 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.CollectorServer = void 0; const node_http_1 = __importDefault(require("node:http")); const node_fs_1 = __importDefault(require("node:fs")); const node_events_1 = require("node:events"); const store_js_1 = require("./store.js"); const SESSION_FILE = "/tmp/agentcrumbs.session"; class CollectorServer extends node_events_1.EventEmitter { server; stores = new Map(); baseDir; port; constructor(port, storeDir) { super(); this.port = port; this.baseDir = storeDir; } getStoreForApp(app) { let store = this.stores.get(app); if (!store) { store = store_js_1.CrumbStore.forApp(app, this.baseDir); this.stores.set(app, store); } return store; } start() { return new Promise((resolve, reject) => { this.server = node_http_1.default.createServer((req, res) => { res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); res.setHeader("Access-Control-Allow-Headers", "Content-Type"); if (req.method === "OPTIONS") { res.writeHead(204); res.end(); return; } if (req.url === "/health" && req.method === "GET") { const apps = store_js_1.CrumbStore.listApps(this.baseDir); res.writeHead(200, { "Content-Type": "application/json" }); res.end(JSON.stringify({ status: "ok", port: this.port, apps, session: this.getActiveSession() ?? null, })); return; } if (req.url === "/crumb" && req.method === "POST") { let body = ""; req.on("data", (chunk) => { body += chunk.toString(); }); req.on("end", () => { try { const crumb = JSON.parse(body); const app = crumb.app || "unknown"; const store = this.getStoreForApp(app); store.appendRaw(body); this.emit("crumb", crumb); res.writeHead(200); res.end("ok"); } catch { res.writeHead(400); res.end("bad json"); } }); return; } res.writeHead(404); res.end(); }); this.server.on("error", (err) => { this.emit("error", err); reject(err); }); this.server.listen(this.port, () => { resolve(); }); }); } stop() { if (this.server) { this.server.close(); this.server = undefined; } for (const store of this.stores.values()) { store.close(); } this.stores.clear(); } getPort() { return this.port; } startSession(id) { node_fs_1.default.writeFileSync(SESSION_FILE, id); } stopSession() { try { const id = node_fs_1.default.readFileSync(SESSION_FILE, "utf-8").trim(); node_fs_1.default.unlinkSync(SESSION_FILE); return id || undefined; } catch { return undefined; } } getActiveSession() { try { const id = node_fs_1.default.readFileSync(SESSION_FILE, "utf-8").trim(); return id || undefined; } catch { return undefined; } } } exports.CollectorServer = CollectorServer; //# sourceMappingURL=server.js.map