@solongate/proxy 0.81.49 → 0.81.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,19 @@
1
+ export declare const LOGS_SERVER_PORT = 8788;
2
+ export interface LogsServerStatus {
3
+ desired: 'on' | 'off';
4
+ running: boolean;
5
+ pid?: number;
6
+ port: number;
7
+ }
8
+ export declare function logsServerStatus(): LogsServerStatus;
9
+ /** Called from runLogsServer when a (foreground or daemon) server starts. */
10
+ export declare function recordLogsServerStarted(port: number): void;
11
+ /** Spawn the detached daemon (idempotent — no-op when already running). */
12
+ export declare function startLogsServerDaemon(): LogsServerStatus;
13
+ /** Explicit disable — the ONLY thing that flips desired to 'off'. */
14
+ export declare function stopLogsServerDaemon(): LogsServerStatus;
15
+ /**
16
+ * Resurrect the daemon when it SHOULD be running but isn't (machine reboot,
17
+ * Ctrl+C on a foreground run, crash). Called from every human CLI startup.
18
+ */
19
+ export declare function ensureLogsServerDaemon(): void;
@@ -1,8 +1,118 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __esm = (fn, res) => function __init() {
4
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
5
+ };
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+
11
+ // src/logs-server-daemon.ts
12
+ var logs_server_daemon_exports = {};
13
+ __export(logs_server_daemon_exports, {
14
+ LOGS_SERVER_PORT: () => LOGS_SERVER_PORT,
15
+ ensureLogsServerDaemon: () => ensureLogsServerDaemon,
16
+ logsServerStatus: () => logsServerStatus,
17
+ recordLogsServerStarted: () => recordLogsServerStarted,
18
+ startLogsServerDaemon: () => startLogsServerDaemon,
19
+ stopLogsServerDaemon: () => stopLogsServerDaemon
20
+ });
21
+ import { spawn } from "child_process";
22
+ import { mkdirSync, openSync, readFileSync, writeFileSync } from "fs";
23
+ import { homedir } from "os";
24
+ import { dirname, join } from "path";
25
+ import { fileURLToPath } from "url";
26
+ function readState() {
27
+ try {
28
+ const s = JSON.parse(readFileSync(STATE_FILE, "utf-8"));
29
+ return s && typeof s === "object" ? s : {};
30
+ } catch {
31
+ return {};
32
+ }
33
+ }
34
+ function writeState(s) {
35
+ try {
36
+ mkdirSync(DIR, { recursive: true });
37
+ writeFileSync(STATE_FILE, JSON.stringify(s));
38
+ } catch {
39
+ }
40
+ }
41
+ function pidAlive(pid) {
42
+ if (!pid || pid <= 0) return false;
43
+ try {
44
+ process.kill(pid, 0);
45
+ return true;
46
+ } catch (e) {
47
+ return e.code === "EPERM";
48
+ }
49
+ }
50
+ function logsServerStatus() {
51
+ const s = readState();
52
+ const running = pidAlive(s.pid);
53
+ return { desired: s.desired === "on" ? "on" : "off", running, pid: running ? s.pid : void 0, port: s.port || LOGS_SERVER_PORT };
54
+ }
55
+ function recordLogsServerStarted(port) {
56
+ writeState({ desired: "on", pid: process.pid, port, startedAt: Date.now() });
57
+ }
58
+ function startLogsServerDaemon() {
59
+ const cur = logsServerStatus();
60
+ if (cur.running) {
61
+ writeState({ ...readState(), desired: "on" });
62
+ return { ...cur, desired: "on" };
63
+ }
64
+ try {
65
+ mkdirSync(DIR, { recursive: true });
66
+ const log = openSync(LOG_FILE, "a");
67
+ const cli = join(dirname(fileURLToPath(import.meta.url)), "index.js");
68
+ const p = spawn(process.execPath, [cli, "logs-server"], {
69
+ detached: true,
70
+ stdio: ["ignore", log, log],
71
+ windowsHide: true
72
+ });
73
+ p.on("error", () => {
74
+ });
75
+ p.unref();
76
+ writeState({ desired: "on", pid: p.pid, port: LOGS_SERVER_PORT, startedAt: Date.now() });
77
+ return { desired: "on", running: true, pid: p.pid, port: LOGS_SERVER_PORT };
78
+ } catch {
79
+ return { ...cur, desired: "on", running: false };
80
+ }
81
+ }
82
+ function stopLogsServerDaemon() {
83
+ const s = readState();
84
+ if (pidAlive(s.pid)) {
85
+ try {
86
+ process.kill(s.pid);
87
+ } catch {
88
+ }
89
+ }
90
+ writeState({ desired: "off", port: s.port });
91
+ return { desired: "off", running: false, port: s.port || LOGS_SERVER_PORT };
92
+ }
93
+ function ensureLogsServerDaemon() {
94
+ try {
95
+ const s = logsServerStatus();
96
+ if (s.desired === "on" && !s.running) startLogsServerDaemon();
97
+ } catch {
98
+ }
99
+ }
100
+ var DIR, STATE_FILE, LOG_FILE, LOGS_SERVER_PORT;
101
+ var init_logs_server_daemon = __esm({
102
+ "src/logs-server-daemon.ts"() {
103
+ "use strict";
104
+ DIR = join(homedir(), ".solongate");
105
+ STATE_FILE = join(DIR, ".logs-server.json");
106
+ LOG_FILE = join(DIR, "logs-server.log");
107
+ LOGS_SERVER_PORT = 8788;
108
+ }
109
+ });
110
+
1
111
  // src/logs-server.ts
2
112
  import { createServer } from "http";
3
- import { readFileSync, statSync } from "fs";
4
- import { resolve, join, isAbsolute } from "path";
5
- import { homedir } from "os";
113
+ import { readFileSync as readFileSync2, statSync } from "fs";
114
+ import { resolve, join as join2, isAbsolute } from "path";
115
+ import { homedir as homedir2 } from "os";
6
116
  import { readdirSync } from "fs";
7
117
  var LOG_FILENAME = "solongate-audit.jsonl";
8
118
  var DEFAULT_PORT = 8788;
@@ -21,15 +131,15 @@ function resolveLocalLogDir(rawPath) {
21
131
  const dir = String(rawPath || "").trim().replace(/[\\/]+$/, "");
22
132
  if (!dir) return null;
23
133
  if (isAbsolute(dir)) return dir;
24
- return resolve(homedir(), ".solongate", "local-logs");
134
+ return resolve(homedir2(), ".solongate", "local-logs");
25
135
  }
26
136
  async function findLogDir() {
27
- const base = resolve(homedir(), ".solongate");
137
+ const base = resolve(homedir2(), ".solongate");
28
138
  try {
29
139
  const files = readdirSync(base).filter((f) => f.startsWith(".policy-cache-") && f.endsWith(".json"));
30
140
  for (const f of files) {
31
141
  try {
32
- const c = JSON.parse(readFileSync(join(base, f), "utf-8"));
142
+ const c = JSON.parse(readFileSync2(join2(base, f), "utf-8"));
33
143
  const p = c?.security?.localLogs?.path;
34
144
  if (typeof p === "string" && p.trim()) return { dir: resolveLocalLogDir(p), configured: p };
35
145
  } catch {
@@ -38,7 +148,7 @@ async function findLogDir() {
38
148
  } catch {
39
149
  }
40
150
  try {
41
- const cfgRaw = readFileSync(join(base, "cloud-guard.json"), "utf-8");
151
+ const cfgRaw = readFileSync2(join2(base, "cloud-guard.json"), "utf-8");
42
152
  const { apiKey, apiUrl } = JSON.parse(cfgRaw);
43
153
  if (apiKey) {
44
154
  const url = `${apiUrl || "https://api.solongate.com"}/api/v1/policies/active`;
@@ -67,7 +177,7 @@ function setCors(req, res) {
67
177
  }
68
178
  function fileInfo(dir) {
69
179
  if (!dir) return { file: null, exists: false, size: 0, mtimeMs: 0 };
70
- const file = join(dir, LOG_FILENAME);
180
+ const file = join2(dir, LOG_FILENAME);
71
181
  try {
72
182
  const st = statSync(file);
73
183
  return { file, exists: true, size: st.size, mtimeMs: st.mtimeMs };
@@ -128,7 +238,7 @@ async function runLogsServer() {
128
238
  return;
129
239
  }
130
240
  try {
131
- const text = readFileSync(info.file, "utf-8");
241
+ const text = readFileSync2(info.file, "utf-8");
132
242
  res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8", "Last-Modified": lastMod, "X-Solongate-Exists": "1" });
133
243
  res.end(text);
134
244
  } catch {
@@ -141,6 +251,8 @@ async function runLogsServer() {
141
251
  res.end("not found");
142
252
  });
143
253
  server.listen(port, "127.0.0.1", async () => {
254
+ const { recordLogsServerStarted: recordLogsServerStarted2 } = await Promise.resolve().then(() => (init_logs_server_daemon(), logs_server_daemon_exports));
255
+ recordLogsServerStarted2(port);
144
256
  const { dir, configured } = await findLogDir();
145
257
  process.stdout.write(`[SolonGate] Local logs agent listening on http://127.0.0.1:${port}
146
258
  `);