@shieldpress/tracker 1.0.0 → 1.1.0
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.
- package/dist/express.d.mts +1 -1
- package/dist/express.d.ts +1 -1
- package/dist/express.js +89 -4
- package/dist/express.js.map +1 -1
- package/dist/express.mjs +89 -4
- package/dist/express.mjs.map +1 -1
- package/dist/index.d.mts +8 -2
- package/dist/index.d.ts +8 -2
- package/dist/index.js +89 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +89 -4
- package/dist/index.mjs.map +1 -1
- package/dist/nextjs.d.mts +1 -1
- package/dist/nextjs.d.ts +1 -1
- package/dist/nextjs.js +89 -4
- package/dist/nextjs.js.map +1 -1
- package/dist/nextjs.mjs +89 -4
- package/dist/nextjs.mjs.map +1 -1
- package/dist/{tracker-BJBniOSu.d.mts → tracker-BXvPYi1R.d.mts} +7 -0
- package/dist/{tracker-BJBniOSu.d.ts → tracker-BXvPYi1R.d.ts} +7 -0
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -5,6 +5,10 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
5
5
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
6
|
});
|
|
7
7
|
|
|
8
|
+
// src/tracker.ts
|
|
9
|
+
import http2 from "http";
|
|
10
|
+
import https2 from "https";
|
|
11
|
+
|
|
8
12
|
// src/config.ts
|
|
9
13
|
var DEFAULT_API_URL = "https://api.shieldpress.net";
|
|
10
14
|
function resolveConfig(config) {
|
|
@@ -81,8 +85,8 @@ function getPublicIpCached() {
|
|
|
81
85
|
if (Date.now() - publicIpLastFetch > 6e5) {
|
|
82
86
|
publicIpLastFetch = Date.now();
|
|
83
87
|
try {
|
|
84
|
-
const
|
|
85
|
-
const req =
|
|
88
|
+
const http3 = __require("https");
|
|
89
|
+
const req = http3.get("https://api.ipify.org", { timeout: 3e3 }, (res) => {
|
|
86
90
|
let data = "";
|
|
87
91
|
res.on("data", (chunk) => {
|
|
88
92
|
data += chunk;
|
|
@@ -1118,23 +1122,49 @@ function sanitizePayload(payload) {
|
|
|
1118
1122
|
}
|
|
1119
1123
|
return p;
|
|
1120
1124
|
}
|
|
1121
|
-
var
|
|
1125
|
+
var _Reporter = class _Reporter {
|
|
1122
1126
|
constructor(apiUrl, apiKey, logger) {
|
|
1123
1127
|
this.queue = [];
|
|
1124
1128
|
this.sending = false;
|
|
1129
|
+
this.consecutiveFailures = 0;
|
|
1130
|
+
this.backoffUntil = 0;
|
|
1125
1131
|
this.apiUrl = apiUrl.replace(/\/$/, "");
|
|
1126
1132
|
this.apiKey = apiKey;
|
|
1127
1133
|
this.logger = logger;
|
|
1128
1134
|
}
|
|
1129
1135
|
async send(payload) {
|
|
1130
1136
|
try {
|
|
1137
|
+
if (this.queue.length >= _Reporter.MAX_QUEUE_SIZE) {
|
|
1138
|
+
const dropped = this.queue.length - _Reporter.MAX_QUEUE_SIZE + 1;
|
|
1139
|
+
this.queue.splice(0, dropped);
|
|
1140
|
+
this.logger.warn(`Queue full, dropped ${dropped} oldest report(s)`);
|
|
1141
|
+
}
|
|
1131
1142
|
this.queue.push(payload);
|
|
1132
1143
|
if (this.sending) return true;
|
|
1144
|
+
const now = Date.now();
|
|
1145
|
+
if (now < this.backoffUntil) {
|
|
1146
|
+
this.logger.info(`Backoff active, will retry in ${Math.round((this.backoffUntil - now) / 1e3)}s`);
|
|
1147
|
+
return true;
|
|
1148
|
+
}
|
|
1133
1149
|
this.sending = true;
|
|
1134
1150
|
try {
|
|
1135
1151
|
while (this.queue.length > 0) {
|
|
1152
|
+
if (Date.now() < this.backoffUntil) break;
|
|
1136
1153
|
const batch = this.queue.splice(0, 10);
|
|
1137
|
-
|
|
1154
|
+
try {
|
|
1155
|
+
await this.transmit(batch);
|
|
1156
|
+
this.consecutiveFailures = 0;
|
|
1157
|
+
this.backoffUntil = 0;
|
|
1158
|
+
} catch (err) {
|
|
1159
|
+
this.queue.unshift(...batch);
|
|
1160
|
+
this.consecutiveFailures++;
|
|
1161
|
+
const delay = Math.min(1e3 * Math.pow(2, this.consecutiveFailures - 1), _Reporter.MAX_BACKOFF_MS);
|
|
1162
|
+
this.backoffUntil = Date.now() + delay;
|
|
1163
|
+
this.logger.warn(
|
|
1164
|
+
`Transmit failed (attempt ${this.consecutiveFailures}), backing off ${Math.round(delay / 1e3)}s: ${err instanceof Error ? err.message : err}`
|
|
1165
|
+
);
|
|
1166
|
+
break;
|
|
1167
|
+
}
|
|
1138
1168
|
}
|
|
1139
1169
|
return true;
|
|
1140
1170
|
} finally {
|
|
@@ -1157,6 +1187,8 @@ var Reporter = class {
|
|
|
1157
1187
|
`Payload too large (${body.length} bytes), truncating arrays (key=${maskApiKey(this.apiKey)})`
|
|
1158
1188
|
);
|
|
1159
1189
|
for (const p of sanitized) {
|
|
1190
|
+
p._truncated = true;
|
|
1191
|
+
p._originalSize = body.length;
|
|
1160
1192
|
if (p.security) {
|
|
1161
1193
|
p.security.events = p.security.events.slice(0, 10);
|
|
1162
1194
|
}
|
|
@@ -1224,6 +1256,11 @@ var Reporter = class {
|
|
|
1224
1256
|
});
|
|
1225
1257
|
}
|
|
1226
1258
|
};
|
|
1259
|
+
/** Max queued reports before dropping oldest */
|
|
1260
|
+
_Reporter.MAX_QUEUE_SIZE = 100;
|
|
1261
|
+
/** Max backoff delay in ms (60 seconds) */
|
|
1262
|
+
_Reporter.MAX_BACKOFF_MS = 6e4;
|
|
1263
|
+
var Reporter = _Reporter;
|
|
1227
1264
|
|
|
1228
1265
|
// src/tracker.ts
|
|
1229
1266
|
var ShieldPressTracker = class {
|
|
@@ -1232,6 +1269,7 @@ var ShieldPressTracker = class {
|
|
|
1232
1269
|
this.lagTimer = null;
|
|
1233
1270
|
this.started = false;
|
|
1234
1271
|
this.headersChecked = false;
|
|
1272
|
+
this.autoHooked = false;
|
|
1235
1273
|
this.config = resolveConfig(userConfig);
|
|
1236
1274
|
this.logger = createLogger(this.config.debug);
|
|
1237
1275
|
this.reporter = new Reporter(this.config.apiUrl, this.config.apiKey, this.logger);
|
|
@@ -1259,6 +1297,9 @@ var ShieldPressTracker = class {
|
|
|
1259
1297
|
this.errorCollector.capture(err, { type: "unhandledRejection" });
|
|
1260
1298
|
});
|
|
1261
1299
|
}
|
|
1300
|
+
if (this.config.httpTracking) {
|
|
1301
|
+
this.autoHookHttpServers();
|
|
1302
|
+
}
|
|
1262
1303
|
if (this.config.systemMetrics) {
|
|
1263
1304
|
collectSystemMetrics();
|
|
1264
1305
|
}
|
|
@@ -1378,6 +1419,50 @@ var ShieldPressTracker = class {
|
|
|
1378
1419
|
}
|
|
1379
1420
|
return this.reporter.send(payload);
|
|
1380
1421
|
}
|
|
1422
|
+
/**
|
|
1423
|
+
* Monkey-patch http.Server and https.Server so every incoming request
|
|
1424
|
+
* is automatically tracked without requiring the user to install middleware.
|
|
1425
|
+
* Safe to call multiple times — patches only once.
|
|
1426
|
+
*/
|
|
1427
|
+
autoHookHttpServers() {
|
|
1428
|
+
if (this.autoHooked) return;
|
|
1429
|
+
this.autoHooked = true;
|
|
1430
|
+
const tracker = this;
|
|
1431
|
+
const patchEmit = (ServerProto) => {
|
|
1432
|
+
const originalEmit = ServerProto.emit;
|
|
1433
|
+
ServerProto.emit = function(event, ...args) {
|
|
1434
|
+
if (event === "request") {
|
|
1435
|
+
const req = args[0];
|
|
1436
|
+
const res = args[1];
|
|
1437
|
+
const start = process.hrtime.bigint();
|
|
1438
|
+
const url = req.url || "/";
|
|
1439
|
+
res.on("finish", () => {
|
|
1440
|
+
try {
|
|
1441
|
+
const durationMs = Number(process.hrtime.bigint() - start) / 1e6;
|
|
1442
|
+
const parsedPath = url.split("?")[0] || "/";
|
|
1443
|
+
tracker.recordRequest({
|
|
1444
|
+
path: parsedPath,
|
|
1445
|
+
method: req.method || "GET",
|
|
1446
|
+
statusCode: res.statusCode,
|
|
1447
|
+
durationMs: Math.round(durationMs * 100) / 100
|
|
1448
|
+
});
|
|
1449
|
+
} catch {
|
|
1450
|
+
}
|
|
1451
|
+
});
|
|
1452
|
+
}
|
|
1453
|
+
return originalEmit.apply(this, [event, ...args]);
|
|
1454
|
+
};
|
|
1455
|
+
};
|
|
1456
|
+
try {
|
|
1457
|
+
patchEmit(http2.Server.prototype);
|
|
1458
|
+
patchEmit(https2.Server.prototype);
|
|
1459
|
+
this.logger.info("Auto-hooked http/https servers for request tracking");
|
|
1460
|
+
} catch (err) {
|
|
1461
|
+
this.logger.warn(
|
|
1462
|
+
`Failed to auto-hook HTTP servers: ${err instanceof Error ? err.message : err}`
|
|
1463
|
+
);
|
|
1464
|
+
}
|
|
1465
|
+
}
|
|
1381
1466
|
shouldIgnorePath(path) {
|
|
1382
1467
|
return this.config.ignorePaths.some((pattern) => {
|
|
1383
1468
|
if (pattern.endsWith("/*")) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/logger.ts","../src/collectors/system.ts","../src/collectors/http.ts","../src/collectors/errors.ts","../src/collectors/security.ts","../src/collectors/dep-audit.ts","../src/collectors/runtime.ts","../src/collectors/env-security.ts","../src/reporter.ts","../src/tracker.ts"],"sourcesContent":["import type { TrackerConfig, ResolvedConfig } from \"./types.js\";\n\nconst DEFAULT_API_URL = \"https://api.shieldpress.net\";\n\nexport function resolveConfig(config: TrackerConfig): ResolvedConfig {\n if (!config.apiKey) throw new Error(\"[ShieldPress] apiKey is required\");\n if (!config.siteId) throw new Error(\"[ShieldPress] siteId is required\");\n\n return {\n apiKey: config.apiKey,\n siteId: config.siteId,\n apiUrl: config.apiUrl || DEFAULT_API_URL,\n reportInterval: config.reportInterval ?? 60,\n systemMetrics: config.systemMetrics ?? true,\n httpTracking: config.httpTracking ?? true,\n errorTracking: config.errorTracking ?? true,\n securityTracking: config.securityTracking ?? true,\n depAudit: config.depAudit ?? true,\n depAuditInterval: config.depAuditInterval ?? 3600,\n runtimeMetrics: config.runtimeMetrics ?? true,\n envSecurity: config.envSecurity ?? true,\n heartbeat: config.heartbeat ?? true,\n appName: config.appName || \"node-app\",\n appVersion: config.appVersion || \"0.0.0\",\n environment: config.environment || process.env.NODE_ENV || \"production\",\n tags: config.tags || {},\n ignorePaths: config.ignorePaths || [\n \"/health\",\n \"/healthz\",\n \"/ready\",\n \"/favicon.ico\",\n \"/_next/static/*\",\n \"/_next/image/*\",\n ],\n maxErrorBuffer: config.maxErrorBuffer ?? 100,\n maxSecurityBuffer: config.maxSecurityBuffer ?? 500,\n debug: config.debug ?? false,\n };\n}\n","export function createLogger(debug: boolean) {\n return {\n info: (...args: unknown[]) => {\n if (debug) console.log(\"[ShieldPress]\", ...args);\n },\n warn: (...args: unknown[]) => {\n console.warn(\"[ShieldPress]\", ...args);\n },\n error: (...args: unknown[]) => {\n console.error(\"[ShieldPress]\", ...args);\n },\n };\n}\n\nexport type Logger = ReturnType<typeof createLogger>;\n","import os, { networkInterfaces } from \"os\";\nimport { readFileSync, statfsSync } from \"fs\";\nimport type { SystemMetrics } from \"../types.js\";\n\nfunction getPrivateIp(): string {\n try {\n const nets = networkInterfaces();\n for (const name of Object.keys(nets)) {\n for (const net of nets[name] || []) {\n if (net.family === \"IPv4\" && !net.internal) {\n return net.address;\n }\n }\n }\n return \"\";\n } catch {\n return \"\";\n }\n}\n\nlet cachedPublicIp = \"\";\nlet publicIpLastFetch = 0;\n\nfunction getPublicIpCached(): string {\n // Return cached IP (refreshed every 10 minutes in background)\n if (Date.now() - publicIpLastFetch > 600000) {\n publicIpLastFetch = Date.now();\n // Non-blocking fetch\n try {\n const http = require(\"https\");\n const req = http.get(\"https://api.ipify.org\", { timeout: 3000 }, (res: any) => {\n let data = \"\";\n res.on(\"data\", (chunk: string) => { data += chunk; });\n res.on(\"end\", () => { cachedPublicIp = data.trim(); });\n });\n req.on(\"error\", () => {});\n req.on(\"timeout\", () => { req.destroy(); });\n } catch {}\n }\n return cachedPublicIp;\n}\n\nfunction getDiskUsage(): { usedGb: number; totalGb: number; percent: number } {\n try {\n // statfsSync available since Node 18.15, fallback for older\n if (typeof statfsSync === \"function\") {\n const root = os.platform() === \"win32\" ? \"C:\\\\\" : \"/\";\n const stats = statfsSync(root);\n const totalBytes = stats.blocks * stats.bsize;\n const freeBytes = stats.bfree * stats.bsize;\n const usedBytes = totalBytes - freeBytes;\n return {\n totalGb: Math.round((totalBytes / 1073741824) * 100) / 100,\n usedGb: Math.round((usedBytes / 1073741824) * 100) / 100,\n percent: totalBytes > 0 ? Math.round((usedBytes / totalBytes) * 10000) / 100 : 0,\n };\n }\n\n // Fallback: parse df output (Linux/Mac)\n if (os.platform() !== \"win32\") {\n const { execSync } = require(\"child_process\");\n const output = execSync(\"df -k / 2>/dev/null\", { timeout: 3000, encoding: \"utf-8\" });\n const lines = output.trim().split(\"\\n\");\n if (lines.length >= 2) {\n const parts = lines[1].split(/\\s+/);\n const totalKb = parseInt(parts[1]) || 0;\n const usedKb = parseInt(parts[2]) || 0;\n return {\n totalGb: Math.round((totalKb / 1048576) * 100) / 100,\n usedGb: Math.round((usedKb / 1048576) * 100) / 100,\n percent: totalKb > 0 ? Math.round((usedKb / totalKb) * 10000) / 100 : 0,\n };\n }\n }\n\n return { usedGb: 0, totalGb: 0, percent: 0 };\n } catch {\n return { usedGb: 0, totalGb: 0, percent: 0 };\n }\n}\n\n// Parse /etc/os-release on Linux for distro name/version\nfunction getLinuxOsInfo(): { name: string; version: string } {\n try {\n const content = readFileSync(\"/etc/os-release\", \"utf-8\");\n const lines = content.split(\"\\n\");\n let name = \"Linux\";\n let version = \"\";\n for (const line of lines) {\n if (line.startsWith(\"NAME=\")) {\n name = line.split(\"=\")[1]?.replace(/\"/g, \"\") || \"Linux\";\n }\n if (line.startsWith(\"VERSION_ID=\")) {\n version = line.split(\"=\")[1]?.replace(/\"/g, \"\") || \"\";\n }\n }\n return { name, version };\n } catch {\n return { name: \"Linux\", version: \"\" };\n }\n}\n\nfunction getOsInfo(): { name: string; version: string } {\n const platform = os.platform();\n if (platform === \"linux\") {\n return getLinuxOsInfo();\n }\n if (platform === \"darwin\") {\n return { name: \"macOS\", version: os.release() };\n }\n if (platform === \"win32\") {\n return { name: \"Windows\", version: os.release() };\n }\n return { name: platform, version: os.release() };\n}\n\nlet prevCpuTimes: { idle: number; total: number } | null = null;\n\nfunction getCpuPercent(): number {\n const cpus = os.cpus();\n let idle = 0;\n let total = 0;\n\n for (const cpu of cpus) {\n idle += cpu.times.idle;\n total += cpu.times.user + cpu.times.nice + cpu.times.sys + cpu.times.idle + cpu.times.irq;\n }\n\n if (!prevCpuTimes) {\n prevCpuTimes = { idle, total };\n return 0;\n }\n\n const idleDiff = idle - prevCpuTimes.idle;\n const totalDiff = total - prevCpuTimes.total;\n prevCpuTimes = { idle, total };\n\n if (totalDiff === 0) return 0;\n return Math.round((1 - idleDiff / totalDiff) * 10000) / 100;\n}\n\nexport function collectSystemMetrics(): SystemMetrics {\n try {\n const mem = process.memoryUsage();\n const totalMem = os.totalmem();\n const freeMem = os.freemem();\n const loadAvg = os.loadavg() as [number, number, number];\n\n const osInfo = getOsInfo();\n const disk = getDiskUsage();\n\n return {\n cpuPercent: getCpuPercent(),\n cpuCount: os.cpus().length,\n memUsedMb: Math.round((totalMem - freeMem) / 1048576),\n memTotalMb: Math.round(totalMem / 1048576),\n memPercent: Math.round(((totalMem - freeMem) / totalMem) * 10000) / 100,\n heapUsedMb: Math.round(mem.heapUsed / 1048576),\n heapTotalMb: Math.round(mem.heapTotal / 1048576),\n externalMb: Math.round(mem.external / 1048576),\n rss: Math.round(mem.rss / 1048576),\n uptimeSeconds: Math.round(process.uptime()),\n loadAvg,\n platform: os.platform(),\n nodeVersion: process.version,\n pid: process.pid,\n osName: osInfo.name,\n osVersion: osInfo.version,\n osKernel: os.release(),\n osArch: os.arch(),\n osRelease: (() => { try { return os.version(); } catch { return os.release(); } })(),\n diskUsedGb: disk.usedGb,\n diskTotalGb: disk.totalGb,\n diskPercent: disk.percent,\n\n // Network\n publicIp: getPublicIpCached(),\n privateIp: getPrivateIp(),\n hostname: os.hostname(),\n\n // Process details\n ppid: process.ppid || 0,\n uid: process.getuid?.() ?? null,\n cwd: process.cwd(),\n execPath: process.execPath,\n nodeArgs: process.execArgv.join(\" \"),\n };\n } catch {\n return {\n cpuPercent: 0,\n cpuCount: 0,\n memUsedMb: 0,\n memTotalMb: 0,\n memPercent: 0,\n heapUsedMb: 0,\n heapTotalMb: 0,\n externalMb: 0,\n rss: 0,\n uptimeSeconds: 0,\n loadAvg: [0, 0, 0],\n platform: process.platform || \"unknown\",\n nodeVersion: process.version || \"unknown\",\n pid: process.pid || 0,\n osName: \"unknown\",\n osVersion: \"\",\n osKernel: \"\",\n osArch: \"\",\n osRelease: \"\",\n diskUsedGb: 0,\n diskTotalGb: 0,\n diskPercent: 0,\n publicIp: \"\",\n privateIp: \"\",\n hostname: \"\",\n ppid: 0,\n uid: null,\n cwd: \"\",\n execPath: \"\",\n nodeArgs: \"\",\n };\n }\n}\n","import type { HttpMetrics, PathMetric } from \"../types.js\";\n\ninterface RequestRecord {\n path: string;\n method: string;\n statusCode: number;\n durationMs: number;\n timestamp: number;\n}\n\nexport class HttpCollector {\n private records: RequestRecord[] = [];\n private windowStart = Date.now();\n\n record(req: { path: string; method: string; statusCode: number; durationMs: number }) {\n try {\n // Bound the buffer to prevent unbounded growth\n if (this.records.length >= 10000) {\n this.records.splice(0, 1000);\n }\n this.records.push({ ...req, timestamp: Date.now() });\n } catch {\n // Never throw from record\n }\n }\n\n flush(): HttpMetrics | null {\n try {\n return this._flush();\n } catch {\n this.records = [];\n return null;\n }\n }\n\n private _flush(): HttpMetrics | null {\n if (this.records.length === 0) return null;\n\n const records = this.records;\n this.records = [];\n const windowMs = Date.now() - this.windowStart;\n this.windowStart = Date.now();\n\n const durations = records.map((r) => r.durationMs).sort((a, b) => a - b);\n const statusCodes: Record<string, number> = {};\n const pathMap = new Map<string, RequestRecord[]>();\n\n for (const r of records) {\n const key = `${r.statusCode}`;\n statusCodes[key] = (statusCodes[key] || 0) + 1;\n\n const pathKey = `${r.method}:${r.path}`;\n if (!pathMap.has(pathKey)) pathMap.set(pathKey, []);\n pathMap.get(pathKey)!.push(r);\n }\n\n const topPaths: PathMetric[] = [...pathMap.entries()]\n .map(([key, recs]) => {\n const [method, path] = key.split(\":\", 2);\n const pathDurations = recs.map((r) => r.durationMs).sort((a, b) => a - b);\n return {\n path,\n method,\n count: recs.length,\n avgMs: Math.round(pathDurations.reduce((a, b) => a + b, 0) / recs.length),\n p95Ms: percentile(pathDurations, 95),\n errorCount: recs.filter((r) => r.statusCode >= 400).length,\n };\n })\n .sort((a, b) => b.count - a.count)\n .slice(0, 20);\n\n return {\n totalRequests: records.length,\n totalErrors: records.filter((r) => r.statusCode >= 500).length,\n avgResponseMs: Math.round(durations.reduce((a, b) => a + b, 0) / durations.length),\n p50ResponseMs: percentile(durations, 50),\n p95ResponseMs: percentile(durations, 95),\n p99ResponseMs: percentile(durations, 99),\n maxResponseMs: durations[durations.length - 1] || 0,\n statusCodes,\n topPaths,\n requestsPerSecond: Math.round((records.length / (windowMs / 1000)) * 100) / 100,\n };\n }\n}\n\nfunction percentile(sorted: number[], p: number): number {\n if (sorted.length === 0) return 0;\n const idx = Math.ceil((p / 100) * sorted.length) - 1;\n return sorted[Math.max(0, idx)];\n}\n","import type { ErrorEvent } from \"../types.js\";\n\nexport class ErrorCollector {\n private buffer: ErrorEvent[] = [];\n private maxBuffer: number;\n\n constructor(maxBuffer: number) {\n this.maxBuffer = maxBuffer;\n }\n\n capture(error: Error | string, meta?: { url?: string; method?: string; statusCode?: number; [key: string]: unknown }) {\n try {\n if (this.buffer.length >= this.maxBuffer) {\n this.buffer.shift();\n }\n\n const err = typeof error === \"string\" ? new Error(error) : error;\n const message = (err.message || \"\").slice(0, 4096);\n const stack = err.stack ? err.stack.slice(0, 4096) : undefined;\n\n this.buffer.push({\n message,\n stack,\n type: err.constructor.name || \"Error\",\n timestamp: new Date().toISOString(),\n url: meta?.url ? String(meta.url).slice(0, 2048) : undefined,\n method: meta?.method ? String(meta.method).slice(0, 10) : undefined,\n statusCode: meta?.statusCode,\n meta: meta ? Object.fromEntries(\n Object.entries(meta).filter(([k]) => ![\"url\", \"method\", \"statusCode\"].includes(k))\n ) : undefined,\n });\n } catch {\n // Never throw from error capture\n }\n }\n\n flush(): ErrorEvent[] {\n const errors = this.buffer;\n this.buffer = [];\n return errors;\n }\n\n get size() {\n return this.buffer.length;\n }\n}\n","import type { SecurityEvent, SecurityEventType, SecuritySeverity, SecurityMetrics } from \"../types.js\";\n\n// ─── Suspicious pattern definitions ─────────────────────────\n\nconst SQL_INJECTION_PATTERNS = [\n /(\\b(union|select|insert|update|delete|drop|alter|create|exec|execute)\\b.*\\b(from|into|table|database|where)\\b)/i,\n /(--|;|\\/\\*|\\*\\/|xp_|sp_|0x[0-9a-f]+)/i,\n /('|\\\"|`).*(\\bor\\b|\\band\\b).*('|\\\"|`).*=/i,\n /(\\bwaitfor\\b\\s+\\bdelay\\b|\\bsleep\\b\\s*\\(|\\bbenchmark\\b\\s*\\()/i,\n];\n\nconst XSS_PATTERNS = [\n /<script[\\s>]/i,\n /javascript\\s*:/i,\n /on(load|error|click|mouseover|focus|blur|submit|change|input)\\s*=/i,\n /<(iframe|object|embed|form|img)\\b[^>]*(src|data|action)\\s*=\\s*['\"]/i,\n /\\beval\\s*\\(/i,\n /\\bdocument\\.(cookie|location|write)/i,\n];\n\nconst CMD_INJECTION_PATTERNS = [\n /[;&|`$]\\s*(cat|ls|rm|mv|cp|wget|curl|nc|bash|sh|python|perl|ruby|node)\\b/i,\n /\\$\\(.*\\)/,\n /`[^`]*`/,\n /\\|\\|\\s*\\w+/,\n /&&\\s*(rm|cat|wget|curl)/i,\n];\n\nconst PATH_TRAVERSAL_PATTERNS = [\n /\\.\\.\\//,\n /\\.\\.\\\\/,\n /%2e%2e/i,\n /%252e%252e/i,\n /\\.\\.\\%00/,\n];\n\nconst SUSPICIOUS_PATHS = [\n /\\/(wp-admin|wp-login|xmlrpc|wp-content|wp-includes)\\b/i,\n /\\/(phpmyadmin|adminer|phpinfo|server-status|server-info)\\b/i,\n /\\.(env|git|svn|htaccess|htpasswd|bak|sql|dump|log|ini|cfg|conf)$/i,\n /\\/(\\.git|\\.svn|\\.env|\\.aws|\\.ssh|\\.docker)\\b/,\n /\\/(config|backup|admin|debug|console|shell|cmd)\\b/i,\n /\\/(actuator|swagger|api-docs|graphiql)\\b/i,\n];\n\nconst BOT_USER_AGENTS = [\n /sqlmap/i, /nikto/i, /nmap/i, /masscan/i, /zap\\//i, /burp/i,\n /dirbuster/i, /gobuster/i, /wfuzz/i, /hydra/i, /metasploit/i,\n /nessus/i, /openvas/i, /acunetix/i, /qualys/i, /nuclei/i,\n /whatweb/i, /wpscan/i, /joomscan/i, /skipfish/i,\n];\n\nconst SENSITIVE_DATA_PATTERNS = [\n // API keys / tokens\n /(?:api[_-]?key|apikey|access[_-]?token|auth[_-]?token|secret[_-]?key)\\s*[=:]\\s*['\"][a-zA-Z0-9_\\-]{20,}/i,\n // AWS keys\n /AKIA[0-9A-Z]{16}/,\n // Private keys\n /-----BEGIN\\s+(RSA\\s+)?PRIVATE\\s+KEY-----/,\n // JWT tokens\n /eyJ[a-zA-Z0-9_-]{10,}\\.eyJ[a-zA-Z0-9_-]{10,}\\.[a-zA-Z0-9_-]{10,}/,\n // Passwords in URLs\n /[?&](password|passwd|pwd|secret|token)=[^&\\s]{3,}/i,\n];\n\n// ─── Security Collector ─────────────────────────────────────\n\nexport class SecurityCollector {\n private events: SecurityEvent[] = [];\n private maxBuffer: number;\n private ipCounter = new Map<string, { count: number; types: Set<string>; firstSeen: number }>();\n\n constructor(maxBuffer: number) {\n this.maxBuffer = maxBuffer;\n }\n\n /** Record a security event directly */\n record(event: Omit<SecurityEvent, \"timestamp\">) {\n if (this.events.length >= this.maxBuffer) {\n this.events.shift();\n }\n this.events.push({ ...event, timestamp: new Date().toISOString() });\n if (event.ip) this.trackIp(event.ip, event.type);\n }\n\n /** Analyze an incoming HTTP request for security threats */\n analyzeRequest(req: {\n url: string;\n method: string;\n headers: Record<string, string | string[] | undefined>;\n body?: string;\n ip?: string;\n query?: Record<string, unknown>;\n }) {\n try {\n this._analyzeRequest(req);\n } catch {\n // Never throw from security analysis\n }\n }\n\n private _analyzeRequest(req: {\n url: string;\n method: string;\n headers: Record<string, string | string[] | undefined>;\n body?: string;\n ip?: string;\n query?: Record<string, unknown>;\n }) {\n const ip = req.ip || \"unknown\";\n const ua = (typeof req.headers[\"user-agent\"] === \"string\" ? req.headers[\"user-agent\"] : \"\") || \"\";\n const url = req.url;\n const fullInput = `${url} ${req.body || \"\"} ${JSON.stringify(req.query || {})}`;\n\n // Check path traversal\n for (const pattern of PATH_TRAVERSAL_PATTERNS) {\n if (pattern.test(url)) {\n this.record({\n type: \"suspicious_path\",\n severity: \"high\",\n message: `Path traversal attempt: ${url.slice(0, 200)}`,\n ip, userAgent: ua, url, method: req.method,\n });\n break;\n }\n }\n\n // Check suspicious paths (admin probing, scanner targets)\n for (const pattern of SUSPICIOUS_PATHS) {\n if (pattern.test(url)) {\n this.record({\n type: \"suspicious_path\",\n severity: \"medium\",\n message: `Suspicious path access: ${url.slice(0, 200)}`,\n ip, userAgent: ua, url, method: req.method,\n });\n break;\n }\n }\n\n // Check SQL injection\n for (const pattern of SQL_INJECTION_PATTERNS) {\n if (pattern.test(fullInput)) {\n this.record({\n type: \"sql_injection\",\n severity: \"critical\",\n message: `SQL injection pattern detected in request`,\n ip, userAgent: ua, url, method: req.method,\n payload: fullInput.slice(0, 500),\n });\n break;\n }\n }\n\n // Check XSS\n for (const pattern of XSS_PATTERNS) {\n if (pattern.test(fullInput)) {\n this.record({\n type: \"xss_attempt\",\n severity: \"high\",\n message: `XSS payload detected in request`,\n ip, userAgent: ua, url, method: req.method,\n payload: fullInput.slice(0, 500),\n });\n break;\n }\n }\n\n // Check command injection\n for (const pattern of CMD_INJECTION_PATTERNS) {\n if (pattern.test(fullInput)) {\n this.record({\n type: \"command_injection\",\n severity: \"critical\",\n message: `Command injection pattern detected`,\n ip, userAgent: ua, url, method: req.method,\n payload: fullInput.slice(0, 500),\n });\n break;\n }\n }\n\n // Check bot/scanner user-agents\n for (const pattern of BOT_USER_AGENTS) {\n if (pattern.test(ua)) {\n this.record({\n type: \"bot_detected\",\n severity: \"medium\",\n message: `Security scanner/bot detected: ${ua.slice(0, 100)}`,\n ip, userAgent: ua, url, method: req.method,\n });\n break;\n }\n }\n\n // Check oversized payload\n const contentLength = parseInt(String(req.headers[\"content-length\"] || \"0\"), 10);\n if (contentLength > 10 * 1024 * 1024) { // 10MB\n this.record({\n type: \"oversized_payload\",\n severity: \"medium\",\n message: `Oversized request: ${(contentLength / 1024 / 1024).toFixed(1)}MB`,\n ip, userAgent: ua, url, method: req.method,\n });\n }\n\n // Check sensitive data in URL query string\n for (const pattern of SENSITIVE_DATA_PATTERNS) {\n if (pattern.test(url)) {\n this.record({\n type: \"api_key_exposed\",\n severity: \"critical\",\n message: `Sensitive data exposed in URL`,\n ip, url: url.slice(0, 100) + \"...[REDACTED]\", method: req.method,\n });\n break;\n }\n }\n\n // Detect brute-force by IP frequency\n this.checkBruteForce(ip);\n }\n\n /** Analyze response for sensitive data leaks */\n analyzeResponse(data: {\n url: string;\n statusCode: number;\n body?: string;\n headers?: Record<string, string>;\n }) {\n try {\n if (!data.body) return;\n\n // Only check non-static responses\n const contentType = data.headers?.[\"content-type\"] || \"\";\n if (!contentType.includes(\"json\") && !contentType.includes(\"html\") && !contentType.includes(\"text\")) return;\n\n // Check for sensitive data in response body (sample first 10KB)\n const sample = data.body.slice(0, 10240);\n for (const pattern of SENSITIVE_DATA_PATTERNS) {\n if (pattern.test(sample)) {\n this.record({\n type: \"sensitive_data_exposed\",\n severity: \"critical\",\n message: `Sensitive data detected in response body for ${data.url}`,\n url: data.url,\n meta: { statusCode: data.statusCode },\n });\n break;\n }\n }\n } catch {\n // Never throw from response analysis\n }\n }\n\n /** Record an authentication failure */\n recordAuthFailure(data: { ip?: string; userAgent?: string; url?: string; method?: string; reason?: string }) {\n this.record({\n type: \"auth_failure\",\n severity: \"medium\",\n message: `Authentication failed${data.reason ? `: ${data.reason}` : \"\"}`,\n ...data,\n });\n }\n\n /** Record a rate limit event */\n recordRateLimit(data: { ip?: string; url?: string; method?: string; limit?: number }) {\n this.record({\n type: \"rate_limit_hit\",\n severity: \"low\",\n message: `Rate limit triggered${data.limit ? ` (limit: ${data.limit})` : \"\"}`,\n ...data,\n });\n }\n\n /** Record a CORS violation */\n recordCorsViolation(data: { ip?: string; origin?: string; url?: string }) {\n this.record({\n type: \"cors_violation\",\n severity: \"medium\",\n message: `CORS policy blocked request from origin: ${data.origin || \"unknown\"}`,\n ...data,\n });\n }\n\n /** Record a custom security event */\n recordCustom(type: SecurityEventType, severity: SecuritySeverity, message: string, meta?: Record<string, unknown>) {\n this.record({ type, severity, message, meta });\n }\n\n /** Flush and return aggregated security metrics */\n flush(): SecurityMetrics | null {\n try {\n if (this.events.length === 0 && this.ipCounter.size === 0) return null;\n\n const events = this.events;\n this.events = [];\n\n const bySeverity: Record<SecuritySeverity, number> = {\n critical: 0, high: 0, medium: 0, low: 0, info: 0,\n };\n const byType: Record<string, number> = {};\n\n for (const e of events) {\n bySeverity[e.severity]++;\n byType[e.type] = (byType[e.type] || 0) + 1;\n }\n\n const topOffendingIps = [...this.ipCounter.entries()]\n .map(([ip, data]) => ({ ip, count: data.count, types: [...data.types] }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n // Clean up old IP entries (older than 1 hour)\n const cutoff = Date.now() - 3600000;\n for (const [ip, data] of this.ipCounter.entries()) {\n if (data.firstSeen < cutoff) this.ipCounter.delete(ip);\n }\n\n return {\n totalEvents: events.length,\n bySeverity,\n byType,\n topOffendingIps,\n events: events.slice(-50), // Send last 50 events per report\n };\n } catch {\n this.events = [];\n return null;\n }\n }\n\n private trackIp(ip: string, type: string) {\n const entry = this.ipCounter.get(ip);\n if (entry) {\n entry.count++;\n entry.types.add(type);\n } else {\n this.ipCounter.set(ip, { count: 1, types: new Set([type]), firstSeen: Date.now() });\n }\n }\n\n private checkBruteForce(ip: string) {\n const entry = this.ipCounter.get(ip);\n if (!entry) return;\n\n // If same IP triggers 50+ security events in the window → brute force\n if (entry.count === 50) {\n this.record({\n type: \"auth_brute_force\",\n severity: \"critical\",\n message: `Possible brute-force/scan from IP: ${ip} (${entry.count} events)`,\n ip,\n });\n }\n }\n}\n","import { execFile } from \"child_process\";\nimport { readFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport type { DepAuditResult, DepVulnerability } from \"../types.js\";\nimport type { Logger } from \"../logger.js\";\n\nexport class DepAuditCollector {\n private lastResult: DepAuditResult | null = null;\n private lastAuditTime = 0;\n private auditIntervalMs: number;\n private logger: Logger;\n private auditing = false;\n\n constructor(auditIntervalMs: number, logger: Logger) {\n this.auditIntervalMs = auditIntervalMs;\n this.logger = logger;\n }\n\n /** Run npm audit and parse results */\n async collect(): Promise<DepAuditResult | null> {\n // Rate limit audits\n if (Date.now() - this.lastAuditTime < this.auditIntervalMs) {\n return this.lastResult;\n }\n\n if (this.auditing) return this.lastResult;\n this.auditing = true;\n\n try {\n const [auditResult, pkgInfo] = await Promise.all([\n this.runNpmAudit(),\n this.readPackageInfo(),\n ]);\n\n this.lastResult = {\n totalDeps: pkgInfo.totalDeps,\n totalVulnerabilities: auditResult.vulnerabilities.length,\n bySeverity: auditResult.bySeverity,\n vulnerabilities: auditResult.vulnerabilities.slice(0, 50), // Top 50\n outdatedCount: pkgInfo.outdatedCount,\n lastAuditAt: new Date().toISOString(),\n };\n\n this.lastAuditTime = Date.now();\n this.logger.info(`Dep audit: ${this.lastResult.totalVulnerabilities} vulnerabilities found`);\n return this.lastResult;\n } catch (err) {\n this.logger.error(\"Dep audit failed:\", err instanceof Error ? err.message : err);\n return this.lastResult;\n } finally {\n this.auditing = false;\n }\n }\n\n private runNpmAudit(): Promise<{ vulnerabilities: DepVulnerability[]; bySeverity: Record<string, number> }> {\n return new Promise((resolve) => {\n execFile(\"npm\", [\"audit\", \"--json\"], { timeout: 30000, maxBuffer: 5 * 1024 * 1024 }, (err, stdout) => {\n // npm audit exits with non-zero when vulnerabilities are found, that's normal\n try {\n const data = JSON.parse(stdout || \"{}\");\n const vulnerabilities: DepVulnerability[] = [];\n const bySeverity: Record<string, number> = { critical: 0, high: 0, moderate: 0, low: 0 };\n\n // npm audit v2 format (npm 7+)\n if (data.vulnerabilities) {\n for (const [name, vuln] of Object.entries(data.vulnerabilities) as [string, any][]) {\n const severity = vuln.severity || \"low\";\n bySeverity[severity] = (bySeverity[severity] || 0) + 1;\n\n vulnerabilities.push({\n package: name,\n installedVersion: vuln.range || \"unknown\",\n severity,\n title: vuln.title || vuln.name || name,\n url: vuln.url,\n patchedVersions: vuln.fixAvailable?.version,\n cwe: vuln.cwe ? (Array.isArray(vuln.cwe) ? vuln.cwe : [vuln.cwe]) : undefined,\n });\n }\n }\n\n // Sort by severity\n const severityOrder = { critical: 0, high: 1, moderate: 2, low: 3 };\n vulnerabilities.sort((a, b) =>\n (severityOrder[a.severity] ?? 4) - (severityOrder[b.severity] ?? 4)\n );\n\n resolve({ vulnerabilities, bySeverity });\n } catch {\n resolve({ vulnerabilities: [], bySeverity: {} });\n }\n });\n });\n }\n\n private async readPackageInfo(): Promise<{ totalDeps: number; outdatedCount: number }> {\n try {\n const lockPath = join(process.cwd(), \"package-lock.json\");\n const content = await readFile(lockPath, \"utf-8\");\n const lock = JSON.parse(content);\n\n // Count dependencies from lock file\n const packages = lock.packages || {};\n const totalDeps = Object.keys(packages).filter((k) => k !== \"\").length;\n\n return { totalDeps, outdatedCount: 0 };\n } catch {\n try {\n // Fallback: count from package.json\n const pkgPath = join(process.cwd(), \"package.json\");\n const content = await readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(content);\n const deps = Object.keys(pkg.dependencies || {}).length;\n const devDeps = Object.keys(pkg.devDependencies || {}).length;\n return { totalDeps: deps + devDeps, outdatedCount: 0 };\n } catch {\n return { totalDeps: 0, outdatedCount: 0 };\n }\n }\n }\n}\n","import v8 from \"v8\";\nimport type { RuntimeMetrics, HeapSpaceInfo } from \"../types.js\";\n\nlet lastLagCheck = process.hrtime.bigint();\nlet lagSamples: number[] = [];\n\n/** Start periodic event loop lag sampling */\nexport function startLagSampling() {\n const interval = setInterval(() => {\n const now = process.hrtime.bigint();\n // We expect ~100ms between checks; difference is the lag\n const expectedMs = 100;\n const actualMs = Number(now - lastLagCheck) / 1_000_000;\n const lag = Math.max(0, actualMs - expectedMs);\n lagSamples.push(lag);\n\n // Keep last 600 samples (1 minute at 100ms interval)\n if (lagSamples.length > 600) lagSamples.shift();\n\n lastLagCheck = now;\n }, 100);\n\n interval.unref();\n return interval;\n}\n\n/** Collect runtime performance metrics */\nexport function collectRuntimeMetrics(): RuntimeMetrics {\n try {\n const heapSpaces = v8.getHeapSpaceStatistics();\n\n // Calculate event loop lag\n const sortedLag = [...lagSamples].sort((a, b) => a - b);\n const avgLag = sortedLag.length > 0\n ? sortedLag.reduce((a, b) => a + b, 0) / sortedLag.length\n : 0;\n const p99Lag = sortedLag.length > 0\n ? sortedLag[Math.ceil(sortedLag.length * 0.99) - 1]\n : 0;\n\n // Reset samples after collection\n lagSamples = [];\n\n // Active handles & requests\n let activeHandles = 0;\n let activeRequests = 0;\n try {\n activeHandles = (process as any)._getActiveHandles?.()?.length ?? 0;\n activeRequests = (process as any)._getActiveRequests?.()?.length ?? 0;\n } catch {\n // Not available in all environments\n }\n\n // GC stats (if available via --expose-gc or perf_hooks)\n let gcPausesMsTotal = 0;\n let gcPausesCount = 0;\n\n try {\n const { performance } = require(\"perf_hooks\");\n const entries = performance.getEntriesByType(\"gc\");\n for (const entry of entries) {\n gcPausesMsTotal += entry.duration;\n gcPausesCount++;\n }\n performance.clearMarks();\n } catch {\n // GC metrics not available\n }\n\n const heapSpaceInfos: HeapSpaceInfo[] = heapSpaces.map((space) => ({\n name: space.space_name,\n sizeMb: Math.round(space.space_size / 1048576 * 100) / 100,\n usedMb: Math.round(space.space_used_size / 1048576 * 100) / 100,\n availableMb: Math.round(space.space_available_size / 1048576 * 100) / 100,\n }));\n\n return {\n eventLoopLagMs: Math.round(avgLag * 100) / 100,\n eventLoopLagP99Ms: Math.round(p99Lag * 100) / 100,\n activeHandles,\n activeRequests,\n gcPausesMsTotal: Math.round(gcPausesMsTotal * 100) / 100,\n gcPausesCount,\n heapSpaces: heapSpaceInfos,\n };\n } catch {\n lagSamples = [];\n return {\n eventLoopLagMs: 0,\n eventLoopLagP99Ms: 0,\n activeHandles: 0,\n activeRequests: 0,\n gcPausesMsTotal: 0,\n gcPausesCount: 0,\n heapSpaces: [],\n };\n }\n}\n","import { readFile, access } from \"fs/promises\";\nimport { join } from \"path\";\nimport { execFile } from \"child_process\";\nimport type { EnvSecurityReport, SecurityHeaderCheck } from \"../types.js\";\n\n// Env vars that should never be leaked\nconst SENSITIVE_ENV_PATTERNS = [\n /^(DATABASE_URL|DB_PASSWORD|DB_HOST)/i,\n /^(AWS_SECRET|AWS_ACCESS_KEY|AWS_SESSION_TOKEN)/i,\n /^(STRIPE_SECRET|PAYPAL_SECRET)/i,\n /^(PRIVATE_KEY|SECRET_KEY|ENCRYPTION_KEY|JWT_SECRET)/i,\n /^(SMTP_PASSWORD|MAIL_PASSWORD|EMAIL_PASSWORD)/i,\n /^(GITHUB_TOKEN|GITLAB_TOKEN|NPM_TOKEN)/i,\n /^(REDIS_PASSWORD|REDIS_URL)/i,\n /^(SENTRY_DSN)/i,\n /^(TWILIO_AUTH_TOKEN|SENDGRID_API_KEY)/i,\n];\n\n// Known insecure Node.js versions (EOL)\nconst EOL_NODE_MAJOR = [0, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21];\n\n/** Recommended security headers */\nconst RECOMMENDED_HEADERS: Array<{ header: string; recommendation: string }> = [\n { header: \"strict-transport-security\", recommendation: \"Add HSTS header: max-age=31536000; includeSubDomains\" },\n { header: \"x-content-type-options\", recommendation: \"Set to 'nosniff' to prevent MIME sniffing\" },\n { header: \"x-frame-options\", recommendation: \"Set to 'DENY' or 'SAMEORIGIN' to prevent clickjacking\" },\n { header: \"x-xss-protection\", recommendation: \"Set to '0' (let CSP handle it) or '1; mode=block'\" },\n { header: \"content-security-policy\", recommendation: \"Add CSP header to prevent XSS and data injection\" },\n { header: \"referrer-policy\", recommendation: \"Set to 'strict-origin-when-cross-origin'\" },\n { header: \"permissions-policy\", recommendation: \"Restrict browser features: camera, microphone, geolocation\" },\n { header: \"x-dns-prefetch-control\", recommendation: \"Set to 'off' for security-sensitive apps\" },\n { header: \"cross-origin-opener-policy\", recommendation: \"Set to 'same-origin' for cross-origin isolation\" },\n { header: \"cross-origin-resource-policy\", recommendation: \"Set to 'same-origin' or 'cross-origin' as needed\" },\n];\n\nfunction getMemoryLimit(): number | null {\n try {\n // Check --max-old-space-size from execArgv\n for (const arg of process.execArgv) {\n const match = arg.match(/--max-old-space-size=(\\d+)/);\n if (match) return parseInt(match[1]);\n }\n // Default V8 limit depends on system memory\n const v8 = require(\"v8\");\n const heapStats = v8.getHeapStatistics();\n return Math.round(heapStats.heap_size_limit / 1048576);\n } catch {\n return null;\n }\n}\n\nfunction getDnsServers(): string[] {\n try {\n const dns = require(\"dns\");\n return dns.getServers?.() || [];\n } catch {\n return [];\n }\n}\n\nexport class EnvSecurityCollector {\n private cachedReport: EnvSecurityReport | null = null;\n private lastCheck = 0;\n\n /** Collect environment security report (cached for 5 minutes) */\n async collect(): Promise<EnvSecurityReport> {\n if (this.cachedReport && Date.now() - this.lastCheck < 300000) {\n return this.cachedReport;\n }\n\n const nodeVersion = process.version;\n const nodeMajor = parseInt(nodeVersion.replace(\"v\", \"\"), 10);\n const nodeVersionSecure = !EOL_NODE_MAJOR.includes(nodeMajor);\n\n const envVarWarnings = this.checkEnvVars();\n const debugModeEnabled = this.checkDebugMode();\n const sourceMapExposed = await this.checkSourceMaps();\n const frameworkInfo = await this.detectFramework();\n const npmVersion = await this.getNpmVersion();\n\n this.cachedReport = {\n nodeVersion,\n nodeVersionSecure,\n npmVersion,\n frameworkName: frameworkInfo.name,\n frameworkVersion: frameworkInfo.version,\n securityHeaders: [], // Populated by response analysis\n envVarWarnings,\n debugModeEnabled,\n sourceMapExposed,\n\n // Runtime details\n v8Version: process.versions.v8 || \"\",\n uvVersion: process.versions.uv || \"\",\n opensslVersion: process.versions.openssl || \"\",\n zlibVersion: process.versions.zlib || \"\",\n icuVersion: process.versions.icu || \"\",\n\n // Process config\n nodeEnv: process.env.NODE_ENV || \"\",\n tz: process.env.TZ || Intl.DateTimeFormat().resolvedOptions().timeZone || \"\",\n memoryLimitMb: getMemoryLimit(),\n\n // Server info (detect from env/process)\n port: parseInt(process.env.PORT || \"0\") || null,\n host: process.env.HOST || process.env.HOSTNAME || \"\",\n\n // DNS\n dnsServers: getDnsServers(),\n };\n\n this.lastCheck = Date.now();\n return this.cachedReport;\n }\n\n /** Check response headers against security recommendations */\n checkResponseHeaders(headers: Record<string, string | string[] | undefined>): SecurityHeaderCheck[] {\n const normalizedHeaders: Record<string, string> = {};\n for (const [key, val] of Object.entries(headers)) {\n normalizedHeaders[key.toLowerCase()] = Array.isArray(val) ? val.join(\", \") : (val || \"\");\n }\n\n return RECOMMENDED_HEADERS.map(({ header, recommendation }) => ({\n header,\n present: header in normalizedHeaders,\n value: normalizedHeaders[header],\n recommendation: header in normalizedHeaders ? undefined : recommendation,\n }));\n }\n\n private checkEnvVars(): string[] {\n const warnings: string[] = [];\n const envKeys = Object.keys(process.env);\n\n for (const key of envKeys) {\n for (const pattern of SENSITIVE_ENV_PATTERNS) {\n if (pattern.test(key)) {\n // Don't leak the value, just note it's present\n warnings.push(`Sensitive env var '${key}' is set — ensure it's not exposed to client`);\n break;\n }\n }\n }\n\n // Check if running as root\n if (process.getuid && process.getuid() === 0) {\n warnings.push(\"Process is running as root — use a non-privileged user\");\n }\n\n // Check NODE_ENV\n if (!process.env.NODE_ENV || process.env.NODE_ENV === \"development\") {\n warnings.push(\"NODE_ENV is not set to 'production' — ensure proper security config\");\n }\n\n return warnings;\n }\n\n private checkDebugMode(): boolean {\n return !!(\n process.env.DEBUG ||\n process.env.NODE_DEBUG ||\n process.execArgv.some((arg) => arg.includes(\"--inspect\") || arg.includes(\"--debug\"))\n );\n }\n\n private async checkSourceMaps(): Promise<boolean> {\n // Check if .next/static has source maps exposed\n const paths = [\n join(process.cwd(), \".next\", \"static\"),\n join(process.cwd(), \"dist\"),\n join(process.cwd(), \"build\"),\n ];\n\n for (const dir of paths) {\n try {\n await access(dir);\n // Directory exists — in production, source maps should not be served\n // This is a heuristic; actual exposure depends on server config\n return process.env.NODE_ENV === \"production\" && !!process.env.GENERATE_SOURCEMAP;\n } catch {\n continue;\n }\n }\n return false;\n }\n\n private async detectFramework(): Promise<{ name?: string; version?: string }> {\n try {\n const pkgPath = join(process.cwd(), \"package.json\");\n const content = await readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(content);\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n if (allDeps.next) return { name: \"next\", version: allDeps.next };\n if (allDeps.nuxt) return { name: \"nuxt\", version: allDeps.nuxt };\n if (allDeps.express) return { name: \"express\", version: allDeps.express };\n if (allDeps.fastify) return { name: \"fastify\", version: allDeps.fastify };\n if (allDeps.koa) return { name: \"koa\", version: allDeps.koa };\n if (allDeps.hono) return { name: \"hono\", version: allDeps.hono };\n if (allDeps[\"@nestjs/core\"]) return { name: \"nestjs\", version: allDeps[\"@nestjs/core\"] };\n if (allDeps.remix || allDeps[\"@remix-run/node\"]) return { name: \"remix\", version: allDeps[\"@remix-run/node\"] || allDeps.remix };\n if (allDeps.astro) return { name: \"astro\", version: allDeps.astro };\n if (allDeps[\"@sveltejs/kit\"]) return { name: \"sveltekit\", version: allDeps[\"@sveltejs/kit\"] };\n if (allDeps.svelte) return { name: \"svelte\", version: allDeps.svelte };\n if (allDeps[\"@adonisjs/core\"]) return { name: \"adonisjs\", version: allDeps[\"@adonisjs/core\"] };\n if (allDeps.meteor) return { name: \"meteor\", version: allDeps.meteor };\n if (allDeps.strapi) return { name: \"strapi\", version: allDeps.strapi };\n if (allDeps.keystone) return { name: \"keystonejs\", version: allDeps.keystone };\n if (allDeps.payload) return { name: \"payload\", version: allDeps.payload };\n\n return {};\n } catch {\n return {};\n }\n }\n\n private getNpmVersion(): Promise<string | undefined> {\n return new Promise((resolve) => {\n execFile(\"npm\", [\"--version\"], { timeout: 5000 }, (err, stdout) => {\n resolve(err ? undefined : stdout.trim());\n });\n });\n }\n}\n","import http from \"http\";\nimport https from \"https\";\nimport { URL } from \"url\";\nimport type { ReportPayload } from \"./types.js\";\nimport type { Logger } from \"./logger.js\";\n\n/** Max payload size in bytes (512 KB) */\nconst MAX_PAYLOAD_BYTES = 512 * 1024;\n\n/** Max string length for error messages / stacks */\nconst MAX_STRING_LENGTH = 4096;\n\n/** Max array items in any payload array */\nconst MAX_ARRAY_LENGTH = 200;\n\n/** Mask an API key for safe logging: show first 6 chars + *** */\nfunction maskApiKey(key: string): string {\n if (key.length <= 6) return \"***\";\n return key.slice(0, 6) + \"***\";\n}\n\n/** Truncate a string to maxLen */\nfunction truncStr(s: string | undefined, maxLen: number): string | undefined {\n if (s == null) return s;\n return s.length > maxLen ? s.slice(0, maxLen) + \"...[truncated]\" : s;\n}\n\n/** Bound an array to maxLen elements */\nfunction boundArray<T>(arr: T[] | undefined, maxLen: number): T[] | undefined {\n if (!arr) return arr;\n return arr.length > maxLen ? arr.slice(0, maxLen) : arr;\n}\n\n/** Sanitize a report payload to prevent oversized transmissions */\nfunction sanitizePayload(payload: ReportPayload): ReportPayload {\n const p = { ...payload };\n\n // Sanitize error events\n if (p.errors) {\n p.errors = boundArray(p.errors, MAX_ARRAY_LENGTH)!;\n for (let i = 0; i < p.errors.length; i++) {\n const e = { ...p.errors[i] };\n e.message = truncStr(e.message, MAX_STRING_LENGTH) || \"\";\n e.stack = truncStr(e.stack, MAX_STRING_LENGTH);\n p.errors[i] = e;\n }\n }\n\n // Sanitize security events\n if (p.security) {\n p.security = { ...p.security };\n p.security.events = boundArray(p.security.events, 50) || [];\n for (let i = 0; i < p.security.events.length; i++) {\n const ev = { ...p.security.events[i] };\n ev.message = truncStr(ev.message, MAX_STRING_LENGTH) || \"\";\n ev.payload = truncStr(ev.payload, 500);\n p.security.events[i] = ev;\n }\n p.security.topOffendingIps = boundArray(p.security.topOffendingIps, 10) || [];\n }\n\n // Sanitize dep audit vulnerabilities\n if (p.depAudit) {\n p.depAudit = { ...p.depAudit };\n p.depAudit.vulnerabilities = boundArray(p.depAudit.vulnerabilities, 50) || [];\n }\n\n // Sanitize HTTP top paths\n if (p.http) {\n p.http = { ...p.http };\n p.http.topPaths = boundArray(p.http.topPaths, 20) || [];\n }\n\n // Sanitize runtime heap spaces\n if (p.runtime) {\n p.runtime = { ...p.runtime };\n p.runtime.heapSpaces = boundArray(p.runtime.heapSpaces, 20);\n }\n\n // Sanitize env security warnings\n if (p.envSecurity) {\n p.envSecurity = { ...p.envSecurity };\n p.envSecurity.envVarWarnings = boundArray(p.envSecurity.envVarWarnings, 50) || [];\n p.envSecurity.securityHeaders = boundArray(p.envSecurity.securityHeaders, 20) || [];\n }\n\n return p;\n}\n\nexport class Reporter {\n private apiUrl: string;\n private apiKey: string;\n private logger: Logger;\n private queue: ReportPayload[] = [];\n private sending = false;\n\n constructor(apiUrl: string, apiKey: string, logger: Logger) {\n this.apiUrl = apiUrl.replace(/\\/$/, \"\");\n this.apiKey = apiKey;\n this.logger = logger;\n }\n\n async send(payload: ReportPayload): Promise<boolean> {\n try {\n this.queue.push(payload);\n if (this.sending) return true;\n\n this.sending = true;\n try {\n while (this.queue.length > 0) {\n const batch = this.queue.splice(0, 10);\n await this.transmit(batch);\n }\n return true;\n } finally {\n this.sending = false;\n }\n } catch (err) {\n this.logger.error(\n `Failed to send report (key=${maskApiKey(this.apiKey)}):`,\n err instanceof Error ? err.message : err\n );\n return false;\n }\n }\n\n private async transmit(payloads: ReportPayload[]): Promise<void> {\n const url = `${this.apiUrl}/api/tracker/report`;\n\n // Sanitize all payloads before serializing\n const sanitized = payloads.map(sanitizePayload);\n let body = JSON.stringify(sanitized.length === 1 ? sanitized[0] : { batch: sanitized });\n\n // Truncate oversized payloads\n if (body.length > MAX_PAYLOAD_BYTES) {\n this.logger.warn(\n `Payload too large (${body.length} bytes), truncating arrays (key=${maskApiKey(this.apiKey)})`\n );\n // Strip heaviest optional fields and retry\n for (const p of sanitized) {\n if (p.security) {\n p.security.events = p.security.events.slice(0, 10);\n }\n if (p.errors) {\n p.errors = p.errors.slice(0, 20);\n }\n if (p.depAudit) {\n p.depAudit.vulnerabilities = p.depAudit.vulnerabilities.slice(0, 10);\n }\n }\n body = JSON.stringify(sanitized.length === 1 ? sanitized[0] : { batch: sanitized });\n }\n\n this.logger.info(\n `Sending report to ${url} (${payloads.length} payload(s), ${body.length} bytes, key=${maskApiKey(this.apiKey)})`\n );\n\n return new Promise<void>((resolve, reject) => {\n try {\n const parsed = new URL(url);\n const isHttps = parsed.protocol === \"https:\";\n const mod = isHttps ? https : http;\n\n const options: http.RequestOptions = {\n hostname: parsed.hostname,\n port: parsed.port || (isHttps ? 443 : 80),\n path: parsed.pathname + parsed.search,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(body, \"utf-8\"),\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": \"shieldpress-tracker/1.0.0\",\n },\n timeout: 10000,\n };\n\n const req = mod.request(options, (res) => {\n let data = \"\";\n res.on(\"data\", (chunk: Buffer | string) => {\n // Only collect up to 1KB of response body for error messages\n if (data.length < 1024) {\n data += chunk;\n }\n });\n res.on(\"end\", () => {\n const statusCode = res.statusCode || 0;\n if (statusCode >= 200 && statusCode < 300) {\n this.logger.info(\"Report sent successfully\");\n resolve();\n } else {\n reject(new Error(`HTTP ${statusCode}: ${data.slice(0, 200)}`));\n }\n });\n res.on(\"error\", (err: Error) => {\n reject(new Error(`Response error: ${err.message}`));\n });\n });\n\n // Timeout via request.setTimeout (works in Node 14+)\n req.setTimeout(10000, () => {\n req.destroy(new Error(\"Request timed out after 10000ms\"));\n });\n\n req.on(\"error\", (err: Error) => {\n reject(new Error(`Request error: ${err.message}`));\n });\n\n req.write(body);\n req.end();\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)));\n }\n });\n }\n}\n","import type { TrackerConfig, ResolvedConfig, ReportPayload } from \"./types.js\";\nimport { resolveConfig } from \"./config.js\";\nimport { createLogger, type Logger } from \"./logger.js\";\nimport { collectSystemMetrics } from \"./collectors/system.js\";\nimport { HttpCollector } from \"./collectors/http.js\";\nimport { ErrorCollector } from \"./collectors/errors.js\";\nimport { SecurityCollector } from \"./collectors/security.js\";\nimport { DepAuditCollector } from \"./collectors/dep-audit.js\";\nimport { collectRuntimeMetrics, startLagSampling } from \"./collectors/runtime.js\";\nimport { EnvSecurityCollector } from \"./collectors/env-security.js\";\nimport { Reporter } from \"./reporter.js\";\n\nexport class ShieldPressTracker {\n readonly config: ResolvedConfig;\n readonly httpCollector: HttpCollector;\n readonly errorCollector: ErrorCollector;\n readonly securityCollector: SecurityCollector;\n\n private logger: Logger;\n private reporter: Reporter;\n private depAuditCollector: DepAuditCollector;\n private envSecurityCollector: EnvSecurityCollector;\n private timer: ReturnType<typeof setInterval> | null = null;\n private lagTimer: ReturnType<typeof setInterval> | null = null;\n private started = false;\n private headersChecked = false;\n\n constructor(userConfig: TrackerConfig) {\n this.config = resolveConfig(userConfig);\n this.logger = createLogger(this.config.debug);\n this.reporter = new Reporter(this.config.apiUrl, this.config.apiKey, this.logger);\n this.httpCollector = new HttpCollector();\n this.errorCollector = new ErrorCollector(this.config.maxErrorBuffer);\n this.securityCollector = new SecurityCollector(this.config.maxSecurityBuffer);\n this.depAuditCollector = new DepAuditCollector(this.config.depAuditInterval * 1000, this.logger);\n this.envSecurityCollector = new EnvSecurityCollector();\n }\n\n /** Start the tracker — begins periodic reporting */\n start(): this {\n if (this.started) return this;\n this.started = true;\n\n this.logger.info(\n `Starting tracker for site=${this.config.siteId} env=${this.config.environment} interval=${this.config.reportInterval}s`\n );\n\n // Setup global error handlers\n if (this.config.errorTracking) {\n process.on(\"uncaughtException\", (err) => {\n this.errorCollector.capture(err, { type: \"uncaughtException\" });\n this.flush().catch(() => {});\n });\n process.on(\"unhandledRejection\", (reason) => {\n const err = reason instanceof Error ? reason : new Error(String(reason));\n this.errorCollector.capture(err, { type: \"unhandledRejection\" });\n });\n }\n\n // Initial metrics seed (for CPU delta calculation)\n if (this.config.systemMetrics) {\n collectSystemMetrics();\n }\n\n // Start event loop lag sampling\n if (this.config.runtimeMetrics) {\n this.lagTimer = startLagSampling();\n }\n\n // Start periodic reporting\n this.timer = setInterval(() => {\n this.flush().catch((err) => {\n this.logger.error(\"Flush failed:\", err);\n });\n }, this.config.reportInterval * 1000);\n\n // Don't prevent process exit\n this.timer.unref();\n\n // Flush on graceful shutdown\n const shutdown = () => {\n this.flush()\n .catch(() => {})\n .finally(() => process.exit(0));\n };\n process.on(\"SIGTERM\", shutdown);\n process.on(\"SIGINT\", shutdown);\n\n return this;\n }\n\n /** Stop the tracker */\n stop() {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n if (this.lagTimer) {\n clearInterval(this.lagTimer);\n this.lagTimer = null;\n }\n this.started = false;\n this.logger.info(\"Tracker stopped\");\n }\n\n /** Manually record an HTTP request */\n recordRequest(data: { path: string; method: string; statusCode: number; durationMs: number }) {\n if (!this.config.httpTracking) return;\n if (this.shouldIgnorePath(data.path)) return;\n this.httpCollector.record(data);\n }\n\n /** Analyze an incoming request for security threats */\n analyzeRequest(req: {\n url: string;\n method: string;\n headers: Record<string, string | string[] | undefined>;\n body?: string;\n ip?: string;\n query?: Record<string, unknown>;\n }) {\n if (!this.config.securityTracking) return;\n if (this.shouldIgnorePath(req.url)) return;\n this.securityCollector.analyzeRequest(req);\n }\n\n /** Analyze a response for security issues (headers, data leaks) */\n analyzeResponse(data: {\n url: string;\n statusCode: number;\n headers?: Record<string, string>;\n body?: string;\n }) {\n if (!this.config.securityTracking) return;\n\n // Check security headers on first response\n if (!this.headersChecked && data.headers && this.config.envSecurity) {\n const headerChecks = this.envSecurityCollector.checkResponseHeaders(data.headers);\n this.headersChecked = true;\n // Store for next report\n this.envSecurityCollector.collect().then((report) => {\n report.securityHeaders = headerChecks;\n }).catch(() => {});\n }\n\n this.securityCollector.analyzeResponse(data);\n }\n\n /** Record an authentication failure */\n recordAuthFailure(data: { ip?: string; userAgent?: string; url?: string; method?: string; reason?: string }) {\n if (!this.config.securityTracking) return;\n this.securityCollector.recordAuthFailure(data);\n }\n\n /** Record a rate limit event */\n recordRateLimit(data: { ip?: string; url?: string; method?: string; limit?: number }) {\n if (!this.config.securityTracking) return;\n this.securityCollector.recordRateLimit(data);\n }\n\n /** Record a CORS violation */\n recordCorsViolation(data: { ip?: string; origin?: string; url?: string }) {\n if (!this.config.securityTracking) return;\n this.securityCollector.recordCorsViolation(data);\n }\n\n /** Manually capture an error */\n captureError(error: Error | string, meta?: Record<string, unknown>) {\n if (!this.config.errorTracking) return;\n this.errorCollector.capture(error, meta);\n }\n\n /** Flush all collected data and send report */\n async flush(): Promise<boolean> {\n const payload: ReportPayload = {\n siteId: this.config.siteId,\n appName: this.config.appName,\n appVersion: this.config.appVersion,\n environment: this.config.environment,\n tags: this.config.tags,\n timestamp: new Date().toISOString(),\n };\n\n if (this.config.systemMetrics) {\n payload.system = collectSystemMetrics();\n }\n\n if (this.config.httpTracking) {\n const httpMetrics = this.httpCollector.flush();\n if (httpMetrics) payload.http = httpMetrics;\n }\n\n if (this.config.errorTracking) {\n const errors = this.errorCollector.flush();\n if (errors.length > 0) payload.errors = errors;\n }\n\n if (this.config.securityTracking) {\n const security = this.securityCollector.flush();\n if (security) payload.security = security;\n }\n\n if (this.config.depAudit) {\n const depAudit = await this.depAuditCollector.collect().catch(() => null);\n if (depAudit) payload.depAudit = depAudit;\n }\n\n if (this.config.runtimeMetrics) {\n payload.runtime = collectRuntimeMetrics();\n }\n\n if (this.config.envSecurity) {\n const envReport = await this.envSecurityCollector.collect().catch(() => null);\n if (envReport) payload.envSecurity = envReport;\n }\n\n if (this.config.heartbeat) {\n payload.heartbeat = true;\n }\n\n return this.reporter.send(payload);\n }\n\n private shouldIgnorePath(path: string): boolean {\n return this.config.ignorePaths.some((pattern) => {\n if (pattern.endsWith(\"/*\")) {\n return path.startsWith(pattern.slice(0, -1));\n }\n return path === pattern;\n });\n }\n}\n"],"mappings":"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","names":["http","readFile","join","execFile","v8"]}
|
|
1
|
+
{"version":3,"sources":["../src/tracker.ts","../src/config.ts","../src/logger.ts","../src/collectors/system.ts","../src/collectors/http.ts","../src/collectors/errors.ts","../src/collectors/security.ts","../src/collectors/dep-audit.ts","../src/collectors/runtime.ts","../src/collectors/env-security.ts","../src/reporter.ts"],"sourcesContent":["import http from \"http\";\nimport https from \"https\";\nimport type { TrackerConfig, ResolvedConfig, ReportPayload } from \"./types.js\";\nimport { resolveConfig } from \"./config.js\";\nimport { createLogger, type Logger } from \"./logger.js\";\nimport { collectSystemMetrics } from \"./collectors/system.js\";\nimport { HttpCollector } from \"./collectors/http.js\";\nimport { ErrorCollector } from \"./collectors/errors.js\";\nimport { SecurityCollector } from \"./collectors/security.js\";\nimport { DepAuditCollector } from \"./collectors/dep-audit.js\";\nimport { collectRuntimeMetrics, startLagSampling } from \"./collectors/runtime.js\";\nimport { EnvSecurityCollector } from \"./collectors/env-security.js\";\nimport { Reporter } from \"./reporter.js\";\n\nexport class ShieldPressTracker {\n readonly config: ResolvedConfig;\n readonly httpCollector: HttpCollector;\n readonly errorCollector: ErrorCollector;\n readonly securityCollector: SecurityCollector;\n\n private logger: Logger;\n private reporter: Reporter;\n private depAuditCollector: DepAuditCollector;\n private envSecurityCollector: EnvSecurityCollector;\n private timer: ReturnType<typeof setInterval> | null = null;\n private lagTimer: ReturnType<typeof setInterval> | null = null;\n private started = false;\n private headersChecked = false;\n private autoHooked = false;\n\n constructor(userConfig: TrackerConfig) {\n this.config = resolveConfig(userConfig);\n this.logger = createLogger(this.config.debug);\n this.reporter = new Reporter(this.config.apiUrl, this.config.apiKey, this.logger);\n this.httpCollector = new HttpCollector();\n this.errorCollector = new ErrorCollector(this.config.maxErrorBuffer);\n this.securityCollector = new SecurityCollector(this.config.maxSecurityBuffer);\n this.depAuditCollector = new DepAuditCollector(this.config.depAuditInterval * 1000, this.logger);\n this.envSecurityCollector = new EnvSecurityCollector();\n }\n\n /** Start the tracker — begins periodic reporting */\n start(): this {\n if (this.started) return this;\n this.started = true;\n\n this.logger.info(\n `Starting tracker for site=${this.config.siteId} env=${this.config.environment} interval=${this.config.reportInterval}s`\n );\n\n // Setup global error handlers\n if (this.config.errorTracking) {\n process.on(\"uncaughtException\", (err) => {\n this.errorCollector.capture(err, { type: \"uncaughtException\" });\n this.flush().catch(() => {});\n });\n process.on(\"unhandledRejection\", (reason) => {\n const err = reason instanceof Error ? reason : new Error(String(reason));\n this.errorCollector.capture(err, { type: \"unhandledRejection\" });\n });\n }\n\n // Auto-hook into http/https servers to capture request metrics\n if (this.config.httpTracking) {\n this.autoHookHttpServers();\n }\n\n // Initial metrics seed (for CPU delta calculation)\n if (this.config.systemMetrics) {\n collectSystemMetrics();\n }\n\n // Start event loop lag sampling\n if (this.config.runtimeMetrics) {\n this.lagTimer = startLagSampling();\n }\n\n // Start periodic reporting\n this.timer = setInterval(() => {\n this.flush().catch((err) => {\n this.logger.error(\"Flush failed:\", err);\n });\n }, this.config.reportInterval * 1000);\n\n // Don't prevent process exit\n this.timer.unref();\n\n // Flush on graceful shutdown\n const shutdown = () => {\n this.flush()\n .catch(() => {})\n .finally(() => process.exit(0));\n };\n process.on(\"SIGTERM\", shutdown);\n process.on(\"SIGINT\", shutdown);\n\n return this;\n }\n\n /** Stop the tracker */\n stop() {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n if (this.lagTimer) {\n clearInterval(this.lagTimer);\n this.lagTimer = null;\n }\n this.started = false;\n this.logger.info(\"Tracker stopped\");\n }\n\n /** Manually record an HTTP request */\n recordRequest(data: { path: string; method: string; statusCode: number; durationMs: number }) {\n if (!this.config.httpTracking) return;\n if (this.shouldIgnorePath(data.path)) return;\n this.httpCollector.record(data);\n }\n\n /** Analyze an incoming request for security threats */\n analyzeRequest(req: {\n url: string;\n method: string;\n headers: Record<string, string | string[] | undefined>;\n body?: string;\n ip?: string;\n query?: Record<string, unknown>;\n }) {\n if (!this.config.securityTracking) return;\n if (this.shouldIgnorePath(req.url)) return;\n this.securityCollector.analyzeRequest(req);\n }\n\n /** Analyze a response for security issues (headers, data leaks) */\n analyzeResponse(data: {\n url: string;\n statusCode: number;\n headers?: Record<string, string>;\n body?: string;\n }) {\n if (!this.config.securityTracking) return;\n\n // Check security headers on first response\n if (!this.headersChecked && data.headers && this.config.envSecurity) {\n const headerChecks = this.envSecurityCollector.checkResponseHeaders(data.headers);\n this.headersChecked = true;\n // Store for next report\n this.envSecurityCollector.collect().then((report) => {\n report.securityHeaders = headerChecks;\n }).catch(() => {});\n }\n\n this.securityCollector.analyzeResponse(data);\n }\n\n /** Record an authentication failure */\n recordAuthFailure(data: { ip?: string; userAgent?: string; url?: string; method?: string; reason?: string }) {\n if (!this.config.securityTracking) return;\n this.securityCollector.recordAuthFailure(data);\n }\n\n /** Record a rate limit event */\n recordRateLimit(data: { ip?: string; url?: string; method?: string; limit?: number }) {\n if (!this.config.securityTracking) return;\n this.securityCollector.recordRateLimit(data);\n }\n\n /** Record a CORS violation */\n recordCorsViolation(data: { ip?: string; origin?: string; url?: string }) {\n if (!this.config.securityTracking) return;\n this.securityCollector.recordCorsViolation(data);\n }\n\n /** Manually capture an error */\n captureError(error: Error | string, meta?: Record<string, unknown>) {\n if (!this.config.errorTracking) return;\n this.errorCollector.capture(error, meta);\n }\n\n /** Flush all collected data and send report */\n async flush(): Promise<boolean> {\n const payload: ReportPayload = {\n siteId: this.config.siteId,\n appName: this.config.appName,\n appVersion: this.config.appVersion,\n environment: this.config.environment,\n tags: this.config.tags,\n timestamp: new Date().toISOString(),\n };\n\n if (this.config.systemMetrics) {\n payload.system = collectSystemMetrics();\n }\n\n if (this.config.httpTracking) {\n const httpMetrics = this.httpCollector.flush();\n if (httpMetrics) payload.http = httpMetrics;\n }\n\n if (this.config.errorTracking) {\n const errors = this.errorCollector.flush();\n if (errors.length > 0) payload.errors = errors;\n }\n\n if (this.config.securityTracking) {\n const security = this.securityCollector.flush();\n if (security) payload.security = security;\n }\n\n if (this.config.depAudit) {\n const depAudit = await this.depAuditCollector.collect().catch(() => null);\n if (depAudit) payload.depAudit = depAudit;\n }\n\n if (this.config.runtimeMetrics) {\n payload.runtime = collectRuntimeMetrics();\n }\n\n if (this.config.envSecurity) {\n const envReport = await this.envSecurityCollector.collect().catch(() => null);\n if (envReport) payload.envSecurity = envReport;\n }\n\n if (this.config.heartbeat) {\n payload.heartbeat = true;\n }\n\n return this.reporter.send(payload);\n }\n\n /**\n * Monkey-patch http.Server and https.Server so every incoming request\n * is automatically tracked without requiring the user to install middleware.\n * Safe to call multiple times — patches only once.\n */\n private autoHookHttpServers(): void {\n if (this.autoHooked) return;\n this.autoHooked = true;\n\n const tracker = this;\n const patchEmit = (ServerProto: typeof http.Server.prototype) => {\n const originalEmit = ServerProto.emit;\n (ServerProto as any).emit = function (event: string, ...args: any[]) {\n if (event === \"request\") {\n const req = args[0] as http.IncomingMessage;\n const res = args[1] as http.ServerResponse;\n const start = process.hrtime.bigint();\n const url = req.url || \"/\";\n\n res.on(\"finish\", () => {\n try {\n const durationMs = Number(process.hrtime.bigint() - start) / 1_000_000;\n const parsedPath = url.split(\"?\")[0] || \"/\";\n\n tracker.recordRequest({\n path: parsedPath,\n method: req.method || \"GET\",\n statusCode: res.statusCode,\n durationMs: Math.round(durationMs * 100) / 100,\n });\n } catch {\n // Never throw from auto-hook\n }\n });\n }\n return originalEmit.apply(this, [event, ...args] as any);\n };\n };\n\n try {\n patchEmit(http.Server.prototype);\n patchEmit(https.Server.prototype);\n this.logger.info(\"Auto-hooked http/https servers for request tracking\");\n } catch (err) {\n this.logger.warn(\n `Failed to auto-hook HTTP servers: ${err instanceof Error ? err.message : err}`\n );\n }\n }\n\n private shouldIgnorePath(path: string): boolean {\n return this.config.ignorePaths.some((pattern) => {\n if (pattern.endsWith(\"/*\")) {\n return path.startsWith(pattern.slice(0, -1));\n }\n return path === pattern;\n });\n }\n}\n","import type { TrackerConfig, ResolvedConfig } from \"./types.js\";\n\nconst DEFAULT_API_URL = \"https://api.shieldpress.net\";\n\nexport function resolveConfig(config: TrackerConfig): ResolvedConfig {\n if (!config.apiKey) throw new Error(\"[ShieldPress] apiKey is required\");\n if (!config.siteId) throw new Error(\"[ShieldPress] siteId is required\");\n\n return {\n apiKey: config.apiKey,\n siteId: config.siteId,\n apiUrl: config.apiUrl || DEFAULT_API_URL,\n reportInterval: config.reportInterval ?? 60,\n systemMetrics: config.systemMetrics ?? true,\n httpTracking: config.httpTracking ?? true,\n errorTracking: config.errorTracking ?? true,\n securityTracking: config.securityTracking ?? true,\n depAudit: config.depAudit ?? true,\n depAuditInterval: config.depAuditInterval ?? 3600,\n runtimeMetrics: config.runtimeMetrics ?? true,\n envSecurity: config.envSecurity ?? true,\n heartbeat: config.heartbeat ?? true,\n appName: config.appName || \"node-app\",\n appVersion: config.appVersion || \"0.0.0\",\n environment: config.environment || process.env.NODE_ENV || \"production\",\n tags: config.tags || {},\n ignorePaths: config.ignorePaths || [\n \"/health\",\n \"/healthz\",\n \"/ready\",\n \"/favicon.ico\",\n \"/_next/static/*\",\n \"/_next/image/*\",\n ],\n maxErrorBuffer: config.maxErrorBuffer ?? 100,\n maxSecurityBuffer: config.maxSecurityBuffer ?? 500,\n debug: config.debug ?? false,\n };\n}\n","export function createLogger(debug: boolean) {\n return {\n info: (...args: unknown[]) => {\n if (debug) console.log(\"[ShieldPress]\", ...args);\n },\n warn: (...args: unknown[]) => {\n console.warn(\"[ShieldPress]\", ...args);\n },\n error: (...args: unknown[]) => {\n console.error(\"[ShieldPress]\", ...args);\n },\n };\n}\n\nexport type Logger = ReturnType<typeof createLogger>;\n","import os, { networkInterfaces } from \"os\";\nimport { readFileSync, statfsSync } from \"fs\";\nimport type { SystemMetrics } from \"../types.js\";\n\nfunction getPrivateIp(): string {\n try {\n const nets = networkInterfaces();\n for (const name of Object.keys(nets)) {\n for (const net of nets[name] || []) {\n if (net.family === \"IPv4\" && !net.internal) {\n return net.address;\n }\n }\n }\n return \"\";\n } catch {\n return \"\";\n }\n}\n\nlet cachedPublicIp = \"\";\nlet publicIpLastFetch = 0;\n\nfunction getPublicIpCached(): string {\n // Return cached IP (refreshed every 10 minutes in background)\n if (Date.now() - publicIpLastFetch > 600000) {\n publicIpLastFetch = Date.now();\n // Non-blocking fetch\n try {\n const http = require(\"https\");\n const req = http.get(\"https://api.ipify.org\", { timeout: 3000 }, (res: any) => {\n let data = \"\";\n res.on(\"data\", (chunk: string) => { data += chunk; });\n res.on(\"end\", () => { cachedPublicIp = data.trim(); });\n });\n req.on(\"error\", () => {});\n req.on(\"timeout\", () => { req.destroy(); });\n } catch {}\n }\n return cachedPublicIp;\n}\n\nfunction getDiskUsage(): { usedGb: number; totalGb: number; percent: number } {\n try {\n // statfsSync available since Node 18.15, fallback for older\n if (typeof statfsSync === \"function\") {\n const root = os.platform() === \"win32\" ? \"C:\\\\\" : \"/\";\n const stats = statfsSync(root);\n const totalBytes = stats.blocks * stats.bsize;\n const freeBytes = stats.bfree * stats.bsize;\n const usedBytes = totalBytes - freeBytes;\n return {\n totalGb: Math.round((totalBytes / 1073741824) * 100) / 100,\n usedGb: Math.round((usedBytes / 1073741824) * 100) / 100,\n percent: totalBytes > 0 ? Math.round((usedBytes / totalBytes) * 10000) / 100 : 0,\n };\n }\n\n // Fallback: parse df output (Linux/Mac)\n if (os.platform() !== \"win32\") {\n const { execSync } = require(\"child_process\");\n const output = execSync(\"df -k / 2>/dev/null\", { timeout: 3000, encoding: \"utf-8\" });\n const lines = output.trim().split(\"\\n\");\n if (lines.length >= 2) {\n const parts = lines[1].split(/\\s+/);\n const totalKb = parseInt(parts[1]) || 0;\n const usedKb = parseInt(parts[2]) || 0;\n return {\n totalGb: Math.round((totalKb / 1048576) * 100) / 100,\n usedGb: Math.round((usedKb / 1048576) * 100) / 100,\n percent: totalKb > 0 ? Math.round((usedKb / totalKb) * 10000) / 100 : 0,\n };\n }\n }\n\n return { usedGb: 0, totalGb: 0, percent: 0 };\n } catch {\n return { usedGb: 0, totalGb: 0, percent: 0 };\n }\n}\n\n// Parse /etc/os-release on Linux for distro name/version\nfunction getLinuxOsInfo(): { name: string; version: string } {\n try {\n const content = readFileSync(\"/etc/os-release\", \"utf-8\");\n const lines = content.split(\"\\n\");\n let name = \"Linux\";\n let version = \"\";\n for (const line of lines) {\n if (line.startsWith(\"NAME=\")) {\n name = line.split(\"=\")[1]?.replace(/\"/g, \"\") || \"Linux\";\n }\n if (line.startsWith(\"VERSION_ID=\")) {\n version = line.split(\"=\")[1]?.replace(/\"/g, \"\") || \"\";\n }\n }\n return { name, version };\n } catch {\n return { name: \"Linux\", version: \"\" };\n }\n}\n\nfunction getOsInfo(): { name: string; version: string } {\n const platform = os.platform();\n if (platform === \"linux\") {\n return getLinuxOsInfo();\n }\n if (platform === \"darwin\") {\n return { name: \"macOS\", version: os.release() };\n }\n if (platform === \"win32\") {\n return { name: \"Windows\", version: os.release() };\n }\n return { name: platform, version: os.release() };\n}\n\nlet prevCpuTimes: { idle: number; total: number } | null = null;\n\nfunction getCpuPercent(): number {\n const cpus = os.cpus();\n let idle = 0;\n let total = 0;\n\n for (const cpu of cpus) {\n idle += cpu.times.idle;\n total += cpu.times.user + cpu.times.nice + cpu.times.sys + cpu.times.idle + cpu.times.irq;\n }\n\n if (!prevCpuTimes) {\n prevCpuTimes = { idle, total };\n return 0;\n }\n\n const idleDiff = idle - prevCpuTimes.idle;\n const totalDiff = total - prevCpuTimes.total;\n prevCpuTimes = { idle, total };\n\n if (totalDiff === 0) return 0;\n return Math.round((1 - idleDiff / totalDiff) * 10000) / 100;\n}\n\nexport function collectSystemMetrics(): SystemMetrics {\n try {\n const mem = process.memoryUsage();\n const totalMem = os.totalmem();\n const freeMem = os.freemem();\n const loadAvg = os.loadavg() as [number, number, number];\n\n const osInfo = getOsInfo();\n const disk = getDiskUsage();\n\n return {\n cpuPercent: getCpuPercent(),\n cpuCount: os.cpus().length,\n memUsedMb: Math.round((totalMem - freeMem) / 1048576),\n memTotalMb: Math.round(totalMem / 1048576),\n memPercent: Math.round(((totalMem - freeMem) / totalMem) * 10000) / 100,\n heapUsedMb: Math.round(mem.heapUsed / 1048576),\n heapTotalMb: Math.round(mem.heapTotal / 1048576),\n externalMb: Math.round(mem.external / 1048576),\n rss: Math.round(mem.rss / 1048576),\n uptimeSeconds: Math.round(process.uptime()),\n loadAvg,\n platform: os.platform(),\n nodeVersion: process.version,\n pid: process.pid,\n osName: osInfo.name,\n osVersion: osInfo.version,\n osKernel: os.release(),\n osArch: os.arch(),\n osRelease: (() => { try { return os.version(); } catch { return os.release(); } })(),\n diskUsedGb: disk.usedGb,\n diskTotalGb: disk.totalGb,\n diskPercent: disk.percent,\n\n // Network\n publicIp: getPublicIpCached(),\n privateIp: getPrivateIp(),\n hostname: os.hostname(),\n\n // Process details\n ppid: process.ppid || 0,\n uid: process.getuid?.() ?? null,\n cwd: process.cwd(),\n execPath: process.execPath,\n nodeArgs: process.execArgv.join(\" \"),\n };\n } catch {\n return {\n cpuPercent: 0,\n cpuCount: 0,\n memUsedMb: 0,\n memTotalMb: 0,\n memPercent: 0,\n heapUsedMb: 0,\n heapTotalMb: 0,\n externalMb: 0,\n rss: 0,\n uptimeSeconds: 0,\n loadAvg: [0, 0, 0],\n platform: process.platform || \"unknown\",\n nodeVersion: process.version || \"unknown\",\n pid: process.pid || 0,\n osName: \"unknown\",\n osVersion: \"\",\n osKernel: \"\",\n osArch: \"\",\n osRelease: \"\",\n diskUsedGb: 0,\n diskTotalGb: 0,\n diskPercent: 0,\n publicIp: \"\",\n privateIp: \"\",\n hostname: \"\",\n ppid: 0,\n uid: null,\n cwd: \"\",\n execPath: \"\",\n nodeArgs: \"\",\n };\n }\n}\n","import type { HttpMetrics, PathMetric } from \"../types.js\";\n\ninterface RequestRecord {\n path: string;\n method: string;\n statusCode: number;\n durationMs: number;\n timestamp: number;\n}\n\nexport class HttpCollector {\n private records: RequestRecord[] = [];\n private windowStart = Date.now();\n\n record(req: { path: string; method: string; statusCode: number; durationMs: number }) {\n try {\n // Bound the buffer to prevent unbounded growth\n if (this.records.length >= 10000) {\n this.records.splice(0, 1000);\n }\n this.records.push({ ...req, timestamp: Date.now() });\n } catch {\n // Never throw from record\n }\n }\n\n flush(): HttpMetrics | null {\n try {\n return this._flush();\n } catch {\n this.records = [];\n return null;\n }\n }\n\n private _flush(): HttpMetrics | null {\n if (this.records.length === 0) return null;\n\n const records = this.records;\n this.records = [];\n const windowMs = Date.now() - this.windowStart;\n this.windowStart = Date.now();\n\n const durations = records.map((r) => r.durationMs).sort((a, b) => a - b);\n const statusCodes: Record<string, number> = {};\n const pathMap = new Map<string, RequestRecord[]>();\n\n for (const r of records) {\n const key = `${r.statusCode}`;\n statusCodes[key] = (statusCodes[key] || 0) + 1;\n\n const pathKey = `${r.method}:${r.path}`;\n if (!pathMap.has(pathKey)) pathMap.set(pathKey, []);\n pathMap.get(pathKey)!.push(r);\n }\n\n const topPaths: PathMetric[] = [...pathMap.entries()]\n .map(([key, recs]) => {\n const [method, path] = key.split(\":\", 2);\n const pathDurations = recs.map((r) => r.durationMs).sort((a, b) => a - b);\n return {\n path,\n method,\n count: recs.length,\n avgMs: Math.round(pathDurations.reduce((a, b) => a + b, 0) / recs.length),\n p95Ms: percentile(pathDurations, 95),\n errorCount: recs.filter((r) => r.statusCode >= 400).length,\n };\n })\n .sort((a, b) => b.count - a.count)\n .slice(0, 20);\n\n return {\n totalRequests: records.length,\n totalErrors: records.filter((r) => r.statusCode >= 500).length,\n avgResponseMs: Math.round(durations.reduce((a, b) => a + b, 0) / durations.length),\n p50ResponseMs: percentile(durations, 50),\n p95ResponseMs: percentile(durations, 95),\n p99ResponseMs: percentile(durations, 99),\n maxResponseMs: durations[durations.length - 1] || 0,\n statusCodes,\n topPaths,\n requestsPerSecond: Math.round((records.length / (windowMs / 1000)) * 100) / 100,\n };\n }\n}\n\nfunction percentile(sorted: number[], p: number): number {\n if (sorted.length === 0) return 0;\n const idx = Math.ceil((p / 100) * sorted.length) - 1;\n return sorted[Math.max(0, idx)];\n}\n","import type { ErrorEvent } from \"../types.js\";\n\nexport class ErrorCollector {\n private buffer: ErrorEvent[] = [];\n private maxBuffer: number;\n\n constructor(maxBuffer: number) {\n this.maxBuffer = maxBuffer;\n }\n\n capture(error: Error | string, meta?: { url?: string; method?: string; statusCode?: number; [key: string]: unknown }) {\n try {\n if (this.buffer.length >= this.maxBuffer) {\n this.buffer.shift();\n }\n\n const err = typeof error === \"string\" ? new Error(error) : error;\n const message = (err.message || \"\").slice(0, 4096);\n const stack = err.stack ? err.stack.slice(0, 4096) : undefined;\n\n this.buffer.push({\n message,\n stack,\n type: err.constructor.name || \"Error\",\n timestamp: new Date().toISOString(),\n url: meta?.url ? String(meta.url).slice(0, 2048) : undefined,\n method: meta?.method ? String(meta.method).slice(0, 10) : undefined,\n statusCode: meta?.statusCode,\n meta: meta ? Object.fromEntries(\n Object.entries(meta).filter(([k]) => ![\"url\", \"method\", \"statusCode\"].includes(k))\n ) : undefined,\n });\n } catch {\n // Never throw from error capture\n }\n }\n\n flush(): ErrorEvent[] {\n const errors = this.buffer;\n this.buffer = [];\n return errors;\n }\n\n get size() {\n return this.buffer.length;\n }\n}\n","import type { SecurityEvent, SecurityEventType, SecuritySeverity, SecurityMetrics } from \"../types.js\";\n\n// ─── Suspicious pattern definitions ─────────────────────────\n\nconst SQL_INJECTION_PATTERNS = [\n /(\\b(union|select|insert|update|delete|drop|alter|create|exec|execute)\\b.*\\b(from|into|table|database|where)\\b)/i,\n /(--|;|\\/\\*|\\*\\/|xp_|sp_|0x[0-9a-f]+)/i,\n /('|\\\"|`).*(\\bor\\b|\\band\\b).*('|\\\"|`).*=/i,\n /(\\bwaitfor\\b\\s+\\bdelay\\b|\\bsleep\\b\\s*\\(|\\bbenchmark\\b\\s*\\()/i,\n];\n\nconst XSS_PATTERNS = [\n /<script[\\s>]/i,\n /javascript\\s*:/i,\n /on(load|error|click|mouseover|focus|blur|submit|change|input)\\s*=/i,\n /<(iframe|object|embed|form|img)\\b[^>]*(src|data|action)\\s*=\\s*['\"]/i,\n /\\beval\\s*\\(/i,\n /\\bdocument\\.(cookie|location|write)/i,\n];\n\nconst CMD_INJECTION_PATTERNS = [\n /[;&|`$]\\s*(cat|ls|rm|mv|cp|wget|curl|nc|bash|sh|python|perl|ruby|node)\\b/i,\n /\\$\\(.*\\)/,\n /`[^`]*`/,\n /\\|\\|\\s*\\w+/,\n /&&\\s*(rm|cat|wget|curl)/i,\n];\n\nconst PATH_TRAVERSAL_PATTERNS = [\n /\\.\\.\\//,\n /\\.\\.\\\\/,\n /%2e%2e/i,\n /%252e%252e/i,\n /\\.\\.\\%00/,\n];\n\nconst SUSPICIOUS_PATHS = [\n /\\/(wp-admin|wp-login|xmlrpc|wp-content|wp-includes)\\b/i,\n /\\/(phpmyadmin|adminer|phpinfo|server-status|server-info)\\b/i,\n /\\.(env|git|svn|htaccess|htpasswd|bak|sql|dump|log|ini|cfg|conf)$/i,\n /\\/(\\.git|\\.svn|\\.env|\\.aws|\\.ssh|\\.docker)\\b/,\n /\\/(config|backup|admin|debug|console|shell|cmd)\\b/i,\n /\\/(actuator|swagger|api-docs|graphiql)\\b/i,\n];\n\nconst BOT_USER_AGENTS = [\n /sqlmap/i, /nikto/i, /nmap/i, /masscan/i, /zap\\//i, /burp/i,\n /dirbuster/i, /gobuster/i, /wfuzz/i, /hydra/i, /metasploit/i,\n /nessus/i, /openvas/i, /acunetix/i, /qualys/i, /nuclei/i,\n /whatweb/i, /wpscan/i, /joomscan/i, /skipfish/i,\n];\n\nconst SENSITIVE_DATA_PATTERNS = [\n // API keys / tokens\n /(?:api[_-]?key|apikey|access[_-]?token|auth[_-]?token|secret[_-]?key)\\s*[=:]\\s*['\"][a-zA-Z0-9_\\-]{20,}/i,\n // AWS keys\n /AKIA[0-9A-Z]{16}/,\n // Private keys\n /-----BEGIN\\s+(RSA\\s+)?PRIVATE\\s+KEY-----/,\n // JWT tokens\n /eyJ[a-zA-Z0-9_-]{10,}\\.eyJ[a-zA-Z0-9_-]{10,}\\.[a-zA-Z0-9_-]{10,}/,\n // Passwords in URLs\n /[?&](password|passwd|pwd|secret|token)=[^&\\s]{3,}/i,\n];\n\n// ─── Security Collector ─────────────────────────────────────\n\nexport class SecurityCollector {\n private events: SecurityEvent[] = [];\n private maxBuffer: number;\n private ipCounter = new Map<string, { count: number; types: Set<string>; firstSeen: number }>();\n\n constructor(maxBuffer: number) {\n this.maxBuffer = maxBuffer;\n }\n\n /** Record a security event directly */\n record(event: Omit<SecurityEvent, \"timestamp\">) {\n if (this.events.length >= this.maxBuffer) {\n this.events.shift();\n }\n this.events.push({ ...event, timestamp: new Date().toISOString() });\n if (event.ip) this.trackIp(event.ip, event.type);\n }\n\n /** Analyze an incoming HTTP request for security threats */\n analyzeRequest(req: {\n url: string;\n method: string;\n headers: Record<string, string | string[] | undefined>;\n body?: string;\n ip?: string;\n query?: Record<string, unknown>;\n }) {\n try {\n this._analyzeRequest(req);\n } catch {\n // Never throw from security analysis\n }\n }\n\n private _analyzeRequest(req: {\n url: string;\n method: string;\n headers: Record<string, string | string[] | undefined>;\n body?: string;\n ip?: string;\n query?: Record<string, unknown>;\n }) {\n const ip = req.ip || \"unknown\";\n const ua = (typeof req.headers[\"user-agent\"] === \"string\" ? req.headers[\"user-agent\"] : \"\") || \"\";\n const url = req.url;\n const fullInput = `${url} ${req.body || \"\"} ${JSON.stringify(req.query || {})}`;\n\n // Check path traversal\n for (const pattern of PATH_TRAVERSAL_PATTERNS) {\n if (pattern.test(url)) {\n this.record({\n type: \"suspicious_path\",\n severity: \"high\",\n message: `Path traversal attempt: ${url.slice(0, 200)}`,\n ip, userAgent: ua, url, method: req.method,\n });\n break;\n }\n }\n\n // Check suspicious paths (admin probing, scanner targets)\n for (const pattern of SUSPICIOUS_PATHS) {\n if (pattern.test(url)) {\n this.record({\n type: \"suspicious_path\",\n severity: \"medium\",\n message: `Suspicious path access: ${url.slice(0, 200)}`,\n ip, userAgent: ua, url, method: req.method,\n });\n break;\n }\n }\n\n // Check SQL injection\n for (const pattern of SQL_INJECTION_PATTERNS) {\n if (pattern.test(fullInput)) {\n this.record({\n type: \"sql_injection\",\n severity: \"critical\",\n message: `SQL injection pattern detected in request`,\n ip, userAgent: ua, url, method: req.method,\n payload: fullInput.slice(0, 500),\n });\n break;\n }\n }\n\n // Check XSS\n for (const pattern of XSS_PATTERNS) {\n if (pattern.test(fullInput)) {\n this.record({\n type: \"xss_attempt\",\n severity: \"high\",\n message: `XSS payload detected in request`,\n ip, userAgent: ua, url, method: req.method,\n payload: fullInput.slice(0, 500),\n });\n break;\n }\n }\n\n // Check command injection\n for (const pattern of CMD_INJECTION_PATTERNS) {\n if (pattern.test(fullInput)) {\n this.record({\n type: \"command_injection\",\n severity: \"critical\",\n message: `Command injection pattern detected`,\n ip, userAgent: ua, url, method: req.method,\n payload: fullInput.slice(0, 500),\n });\n break;\n }\n }\n\n // Check bot/scanner user-agents\n for (const pattern of BOT_USER_AGENTS) {\n if (pattern.test(ua)) {\n this.record({\n type: \"bot_detected\",\n severity: \"medium\",\n message: `Security scanner/bot detected: ${ua.slice(0, 100)}`,\n ip, userAgent: ua, url, method: req.method,\n });\n break;\n }\n }\n\n // Check oversized payload\n const contentLength = parseInt(String(req.headers[\"content-length\"] || \"0\"), 10);\n if (contentLength > 10 * 1024 * 1024) { // 10MB\n this.record({\n type: \"oversized_payload\",\n severity: \"medium\",\n message: `Oversized request: ${(contentLength / 1024 / 1024).toFixed(1)}MB`,\n ip, userAgent: ua, url, method: req.method,\n });\n }\n\n // Check sensitive data in URL query string\n for (const pattern of SENSITIVE_DATA_PATTERNS) {\n if (pattern.test(url)) {\n this.record({\n type: \"api_key_exposed\",\n severity: \"critical\",\n message: `Sensitive data exposed in URL`,\n ip, url: url.slice(0, 100) + \"...[REDACTED]\", method: req.method,\n });\n break;\n }\n }\n\n // Detect brute-force by IP frequency\n this.checkBruteForce(ip);\n }\n\n /** Analyze response for sensitive data leaks */\n analyzeResponse(data: {\n url: string;\n statusCode: number;\n body?: string;\n headers?: Record<string, string>;\n }) {\n try {\n if (!data.body) return;\n\n // Only check non-static responses\n const contentType = data.headers?.[\"content-type\"] || \"\";\n if (!contentType.includes(\"json\") && !contentType.includes(\"html\") && !contentType.includes(\"text\")) return;\n\n // Check for sensitive data in response body (sample first 10KB)\n const sample = data.body.slice(0, 10240);\n for (const pattern of SENSITIVE_DATA_PATTERNS) {\n if (pattern.test(sample)) {\n this.record({\n type: \"sensitive_data_exposed\",\n severity: \"critical\",\n message: `Sensitive data detected in response body for ${data.url}`,\n url: data.url,\n meta: { statusCode: data.statusCode },\n });\n break;\n }\n }\n } catch {\n // Never throw from response analysis\n }\n }\n\n /** Record an authentication failure */\n recordAuthFailure(data: { ip?: string; userAgent?: string; url?: string; method?: string; reason?: string }) {\n this.record({\n type: \"auth_failure\",\n severity: \"medium\",\n message: `Authentication failed${data.reason ? `: ${data.reason}` : \"\"}`,\n ...data,\n });\n }\n\n /** Record a rate limit event */\n recordRateLimit(data: { ip?: string; url?: string; method?: string; limit?: number }) {\n this.record({\n type: \"rate_limit_hit\",\n severity: \"low\",\n message: `Rate limit triggered${data.limit ? ` (limit: ${data.limit})` : \"\"}`,\n ...data,\n });\n }\n\n /** Record a CORS violation */\n recordCorsViolation(data: { ip?: string; origin?: string; url?: string }) {\n this.record({\n type: \"cors_violation\",\n severity: \"medium\",\n message: `CORS policy blocked request from origin: ${data.origin || \"unknown\"}`,\n ...data,\n });\n }\n\n /** Record a custom security event */\n recordCustom(type: SecurityEventType, severity: SecuritySeverity, message: string, meta?: Record<string, unknown>) {\n this.record({ type, severity, message, meta });\n }\n\n /** Flush and return aggregated security metrics */\n flush(): SecurityMetrics | null {\n try {\n if (this.events.length === 0 && this.ipCounter.size === 0) return null;\n\n const events = this.events;\n this.events = [];\n\n const bySeverity: Record<SecuritySeverity, number> = {\n critical: 0, high: 0, medium: 0, low: 0, info: 0,\n };\n const byType: Record<string, number> = {};\n\n for (const e of events) {\n bySeverity[e.severity]++;\n byType[e.type] = (byType[e.type] || 0) + 1;\n }\n\n const topOffendingIps = [...this.ipCounter.entries()]\n .map(([ip, data]) => ({ ip, count: data.count, types: [...data.types] }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n // Clean up old IP entries (older than 1 hour)\n const cutoff = Date.now() - 3600000;\n for (const [ip, data] of this.ipCounter.entries()) {\n if (data.firstSeen < cutoff) this.ipCounter.delete(ip);\n }\n\n return {\n totalEvents: events.length,\n bySeverity,\n byType,\n topOffendingIps,\n events: events.slice(-50), // Send last 50 events per report\n };\n } catch {\n this.events = [];\n return null;\n }\n }\n\n private trackIp(ip: string, type: string) {\n const entry = this.ipCounter.get(ip);\n if (entry) {\n entry.count++;\n entry.types.add(type);\n } else {\n this.ipCounter.set(ip, { count: 1, types: new Set([type]), firstSeen: Date.now() });\n }\n }\n\n private checkBruteForce(ip: string) {\n const entry = this.ipCounter.get(ip);\n if (!entry) return;\n\n // If same IP triggers 50+ security events in the window → brute force\n if (entry.count === 50) {\n this.record({\n type: \"auth_brute_force\",\n severity: \"critical\",\n message: `Possible brute-force/scan from IP: ${ip} (${entry.count} events)`,\n ip,\n });\n }\n }\n}\n","import { execFile } from \"child_process\";\nimport { readFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport type { DepAuditResult, DepVulnerability } from \"../types.js\";\nimport type { Logger } from \"../logger.js\";\n\nexport class DepAuditCollector {\n private lastResult: DepAuditResult | null = null;\n private lastAuditTime = 0;\n private auditIntervalMs: number;\n private logger: Logger;\n private auditing = false;\n\n constructor(auditIntervalMs: number, logger: Logger) {\n this.auditIntervalMs = auditIntervalMs;\n this.logger = logger;\n }\n\n /** Run npm audit and parse results */\n async collect(): Promise<DepAuditResult | null> {\n // Rate limit audits\n if (Date.now() - this.lastAuditTime < this.auditIntervalMs) {\n return this.lastResult;\n }\n\n if (this.auditing) return this.lastResult;\n this.auditing = true;\n\n try {\n const [auditResult, pkgInfo] = await Promise.all([\n this.runNpmAudit(),\n this.readPackageInfo(),\n ]);\n\n this.lastResult = {\n totalDeps: pkgInfo.totalDeps,\n totalVulnerabilities: auditResult.vulnerabilities.length,\n bySeverity: auditResult.bySeverity,\n vulnerabilities: auditResult.vulnerabilities.slice(0, 50), // Top 50\n outdatedCount: pkgInfo.outdatedCount,\n lastAuditAt: new Date().toISOString(),\n };\n\n this.lastAuditTime = Date.now();\n this.logger.info(`Dep audit: ${this.lastResult.totalVulnerabilities} vulnerabilities found`);\n return this.lastResult;\n } catch (err) {\n this.logger.error(\"Dep audit failed:\", err instanceof Error ? err.message : err);\n return this.lastResult;\n } finally {\n this.auditing = false;\n }\n }\n\n private runNpmAudit(): Promise<{ vulnerabilities: DepVulnerability[]; bySeverity: Record<string, number> }> {\n return new Promise((resolve) => {\n execFile(\"npm\", [\"audit\", \"--json\"], { timeout: 30000, maxBuffer: 5 * 1024 * 1024 }, (err, stdout) => {\n // npm audit exits with non-zero when vulnerabilities are found, that's normal\n try {\n const data = JSON.parse(stdout || \"{}\");\n const vulnerabilities: DepVulnerability[] = [];\n const bySeverity: Record<string, number> = { critical: 0, high: 0, moderate: 0, low: 0 };\n\n // npm audit v2 format (npm 7+)\n if (data.vulnerabilities) {\n for (const [name, vuln] of Object.entries(data.vulnerabilities) as [string, any][]) {\n const severity = vuln.severity || \"low\";\n bySeverity[severity] = (bySeverity[severity] || 0) + 1;\n\n vulnerabilities.push({\n package: name,\n installedVersion: vuln.range || \"unknown\",\n severity,\n title: vuln.title || vuln.name || name,\n url: vuln.url,\n patchedVersions: vuln.fixAvailable?.version,\n cwe: vuln.cwe ? (Array.isArray(vuln.cwe) ? vuln.cwe : [vuln.cwe]) : undefined,\n });\n }\n }\n\n // Sort by severity\n const severityOrder = { critical: 0, high: 1, moderate: 2, low: 3 };\n vulnerabilities.sort((a, b) =>\n (severityOrder[a.severity] ?? 4) - (severityOrder[b.severity] ?? 4)\n );\n\n resolve({ vulnerabilities, bySeverity });\n } catch {\n resolve({ vulnerabilities: [], bySeverity: {} });\n }\n });\n });\n }\n\n private async readPackageInfo(): Promise<{ totalDeps: number; outdatedCount: number }> {\n try {\n const lockPath = join(process.cwd(), \"package-lock.json\");\n const content = await readFile(lockPath, \"utf-8\");\n const lock = JSON.parse(content);\n\n // Count dependencies from lock file\n const packages = lock.packages || {};\n const totalDeps = Object.keys(packages).filter((k) => k !== \"\").length;\n\n return { totalDeps, outdatedCount: 0 };\n } catch {\n try {\n // Fallback: count from package.json\n const pkgPath = join(process.cwd(), \"package.json\");\n const content = await readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(content);\n const deps = Object.keys(pkg.dependencies || {}).length;\n const devDeps = Object.keys(pkg.devDependencies || {}).length;\n return { totalDeps: deps + devDeps, outdatedCount: 0 };\n } catch {\n return { totalDeps: 0, outdatedCount: 0 };\n }\n }\n }\n}\n","import v8 from \"v8\";\nimport type { RuntimeMetrics, HeapSpaceInfo } from \"../types.js\";\n\nlet lastLagCheck = process.hrtime.bigint();\nlet lagSamples: number[] = [];\n\n/** Start periodic event loop lag sampling */\nexport function startLagSampling() {\n const interval = setInterval(() => {\n const now = process.hrtime.bigint();\n // We expect ~100ms between checks; difference is the lag\n const expectedMs = 100;\n const actualMs = Number(now - lastLagCheck) / 1_000_000;\n const lag = Math.max(0, actualMs - expectedMs);\n lagSamples.push(lag);\n\n // Keep last 600 samples (1 minute at 100ms interval)\n if (lagSamples.length > 600) lagSamples.shift();\n\n lastLagCheck = now;\n }, 100);\n\n interval.unref();\n return interval;\n}\n\n/** Collect runtime performance metrics */\nexport function collectRuntimeMetrics(): RuntimeMetrics {\n try {\n const heapSpaces = v8.getHeapSpaceStatistics();\n\n // Calculate event loop lag\n const sortedLag = [...lagSamples].sort((a, b) => a - b);\n const avgLag = sortedLag.length > 0\n ? sortedLag.reduce((a, b) => a + b, 0) / sortedLag.length\n : 0;\n const p99Lag = sortedLag.length > 0\n ? sortedLag[Math.ceil(sortedLag.length * 0.99) - 1]\n : 0;\n\n // Reset samples after collection\n lagSamples = [];\n\n // Active handles & requests\n let activeHandles = 0;\n let activeRequests = 0;\n try {\n activeHandles = (process as any)._getActiveHandles?.()?.length ?? 0;\n activeRequests = (process as any)._getActiveRequests?.()?.length ?? 0;\n } catch {\n // Not available in all environments\n }\n\n // GC stats (if available via --expose-gc or perf_hooks)\n let gcPausesMsTotal = 0;\n let gcPausesCount = 0;\n\n try {\n const { performance } = require(\"perf_hooks\");\n const entries = performance.getEntriesByType(\"gc\");\n for (const entry of entries) {\n gcPausesMsTotal += entry.duration;\n gcPausesCount++;\n }\n performance.clearMarks();\n } catch {\n // GC metrics not available\n }\n\n const heapSpaceInfos: HeapSpaceInfo[] = heapSpaces.map((space) => ({\n name: space.space_name,\n sizeMb: Math.round(space.space_size / 1048576 * 100) / 100,\n usedMb: Math.round(space.space_used_size / 1048576 * 100) / 100,\n availableMb: Math.round(space.space_available_size / 1048576 * 100) / 100,\n }));\n\n return {\n eventLoopLagMs: Math.round(avgLag * 100) / 100,\n eventLoopLagP99Ms: Math.round(p99Lag * 100) / 100,\n activeHandles,\n activeRequests,\n gcPausesMsTotal: Math.round(gcPausesMsTotal * 100) / 100,\n gcPausesCount,\n heapSpaces: heapSpaceInfos,\n };\n } catch {\n lagSamples = [];\n return {\n eventLoopLagMs: 0,\n eventLoopLagP99Ms: 0,\n activeHandles: 0,\n activeRequests: 0,\n gcPausesMsTotal: 0,\n gcPausesCount: 0,\n heapSpaces: [],\n };\n }\n}\n","import { readFile, access } from \"fs/promises\";\nimport { join } from \"path\";\nimport { execFile } from \"child_process\";\nimport type { EnvSecurityReport, SecurityHeaderCheck } from \"../types.js\";\n\n// Env vars that should never be leaked\nconst SENSITIVE_ENV_PATTERNS = [\n /^(DATABASE_URL|DB_PASSWORD|DB_HOST)/i,\n /^(AWS_SECRET|AWS_ACCESS_KEY|AWS_SESSION_TOKEN)/i,\n /^(STRIPE_SECRET|PAYPAL_SECRET)/i,\n /^(PRIVATE_KEY|SECRET_KEY|ENCRYPTION_KEY|JWT_SECRET)/i,\n /^(SMTP_PASSWORD|MAIL_PASSWORD|EMAIL_PASSWORD)/i,\n /^(GITHUB_TOKEN|GITLAB_TOKEN|NPM_TOKEN)/i,\n /^(REDIS_PASSWORD|REDIS_URL)/i,\n /^(SENTRY_DSN)/i,\n /^(TWILIO_AUTH_TOKEN|SENDGRID_API_KEY)/i,\n];\n\n// Known insecure Node.js versions (EOL)\nconst EOL_NODE_MAJOR = [0, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21];\n\n/** Recommended security headers */\nconst RECOMMENDED_HEADERS: Array<{ header: string; recommendation: string }> = [\n { header: \"strict-transport-security\", recommendation: \"Add HSTS header: max-age=31536000; includeSubDomains\" },\n { header: \"x-content-type-options\", recommendation: \"Set to 'nosniff' to prevent MIME sniffing\" },\n { header: \"x-frame-options\", recommendation: \"Set to 'DENY' or 'SAMEORIGIN' to prevent clickjacking\" },\n { header: \"x-xss-protection\", recommendation: \"Set to '0' (let CSP handle it) or '1; mode=block'\" },\n { header: \"content-security-policy\", recommendation: \"Add CSP header to prevent XSS and data injection\" },\n { header: \"referrer-policy\", recommendation: \"Set to 'strict-origin-when-cross-origin'\" },\n { header: \"permissions-policy\", recommendation: \"Restrict browser features: camera, microphone, geolocation\" },\n { header: \"x-dns-prefetch-control\", recommendation: \"Set to 'off' for security-sensitive apps\" },\n { header: \"cross-origin-opener-policy\", recommendation: \"Set to 'same-origin' for cross-origin isolation\" },\n { header: \"cross-origin-resource-policy\", recommendation: \"Set to 'same-origin' or 'cross-origin' as needed\" },\n];\n\nfunction getMemoryLimit(): number | null {\n try {\n // Check --max-old-space-size from execArgv\n for (const arg of process.execArgv) {\n const match = arg.match(/--max-old-space-size=(\\d+)/);\n if (match) return parseInt(match[1]);\n }\n // Default V8 limit depends on system memory\n const v8 = require(\"v8\");\n const heapStats = v8.getHeapStatistics();\n return Math.round(heapStats.heap_size_limit / 1048576);\n } catch {\n return null;\n }\n}\n\nfunction getDnsServers(): string[] {\n try {\n const dns = require(\"dns\");\n return dns.getServers?.() || [];\n } catch {\n return [];\n }\n}\n\nexport class EnvSecurityCollector {\n private cachedReport: EnvSecurityReport | null = null;\n private lastCheck = 0;\n\n /** Collect environment security report (cached for 5 minutes) */\n async collect(): Promise<EnvSecurityReport> {\n if (this.cachedReport && Date.now() - this.lastCheck < 300000) {\n return this.cachedReport;\n }\n\n const nodeVersion = process.version;\n const nodeMajor = parseInt(nodeVersion.replace(\"v\", \"\"), 10);\n const nodeVersionSecure = !EOL_NODE_MAJOR.includes(nodeMajor);\n\n const envVarWarnings = this.checkEnvVars();\n const debugModeEnabled = this.checkDebugMode();\n const sourceMapExposed = await this.checkSourceMaps();\n const frameworkInfo = await this.detectFramework();\n const npmVersion = await this.getNpmVersion();\n\n this.cachedReport = {\n nodeVersion,\n nodeVersionSecure,\n npmVersion,\n frameworkName: frameworkInfo.name,\n frameworkVersion: frameworkInfo.version,\n securityHeaders: [], // Populated by response analysis\n envVarWarnings,\n debugModeEnabled,\n sourceMapExposed,\n\n // Runtime details\n v8Version: process.versions.v8 || \"\",\n uvVersion: process.versions.uv || \"\",\n opensslVersion: process.versions.openssl || \"\",\n zlibVersion: process.versions.zlib || \"\",\n icuVersion: process.versions.icu || \"\",\n\n // Process config\n nodeEnv: process.env.NODE_ENV || \"\",\n tz: process.env.TZ || Intl.DateTimeFormat().resolvedOptions().timeZone || \"\",\n memoryLimitMb: getMemoryLimit(),\n\n // Server info (detect from env/process)\n port: parseInt(process.env.PORT || \"0\") || null,\n host: process.env.HOST || process.env.HOSTNAME || \"\",\n\n // DNS\n dnsServers: getDnsServers(),\n };\n\n this.lastCheck = Date.now();\n return this.cachedReport;\n }\n\n /** Check response headers against security recommendations */\n checkResponseHeaders(headers: Record<string, string | string[] | undefined>): SecurityHeaderCheck[] {\n const normalizedHeaders: Record<string, string> = {};\n for (const [key, val] of Object.entries(headers)) {\n normalizedHeaders[key.toLowerCase()] = Array.isArray(val) ? val.join(\", \") : (val || \"\");\n }\n\n return RECOMMENDED_HEADERS.map(({ header, recommendation }) => ({\n header,\n present: header in normalizedHeaders,\n value: normalizedHeaders[header],\n recommendation: header in normalizedHeaders ? undefined : recommendation,\n }));\n }\n\n private checkEnvVars(): string[] {\n const warnings: string[] = [];\n const envKeys = Object.keys(process.env);\n\n for (const key of envKeys) {\n for (const pattern of SENSITIVE_ENV_PATTERNS) {\n if (pattern.test(key)) {\n // Don't leak the value, just note it's present\n warnings.push(`Sensitive env var '${key}' is set — ensure it's not exposed to client`);\n break;\n }\n }\n }\n\n // Check if running as root\n if (process.getuid && process.getuid() === 0) {\n warnings.push(\"Process is running as root — use a non-privileged user\");\n }\n\n // Check NODE_ENV\n if (!process.env.NODE_ENV || process.env.NODE_ENV === \"development\") {\n warnings.push(\"NODE_ENV is not set to 'production' — ensure proper security config\");\n }\n\n return warnings;\n }\n\n private checkDebugMode(): boolean {\n return !!(\n process.env.DEBUG ||\n process.env.NODE_DEBUG ||\n process.execArgv.some((arg) => arg.includes(\"--inspect\") || arg.includes(\"--debug\"))\n );\n }\n\n private async checkSourceMaps(): Promise<boolean> {\n // Check if .next/static has source maps exposed\n const paths = [\n join(process.cwd(), \".next\", \"static\"),\n join(process.cwd(), \"dist\"),\n join(process.cwd(), \"build\"),\n ];\n\n for (const dir of paths) {\n try {\n await access(dir);\n // Directory exists — in production, source maps should not be served\n // This is a heuristic; actual exposure depends on server config\n return process.env.NODE_ENV === \"production\" && !!process.env.GENERATE_SOURCEMAP;\n } catch {\n continue;\n }\n }\n return false;\n }\n\n private async detectFramework(): Promise<{ name?: string; version?: string }> {\n try {\n const pkgPath = join(process.cwd(), \"package.json\");\n const content = await readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(content);\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n if (allDeps.next) return { name: \"next\", version: allDeps.next };\n if (allDeps.nuxt) return { name: \"nuxt\", version: allDeps.nuxt };\n if (allDeps.express) return { name: \"express\", version: allDeps.express };\n if (allDeps.fastify) return { name: \"fastify\", version: allDeps.fastify };\n if (allDeps.koa) return { name: \"koa\", version: allDeps.koa };\n if (allDeps.hono) return { name: \"hono\", version: allDeps.hono };\n if (allDeps[\"@nestjs/core\"]) return { name: \"nestjs\", version: allDeps[\"@nestjs/core\"] };\n if (allDeps.remix || allDeps[\"@remix-run/node\"]) return { name: \"remix\", version: allDeps[\"@remix-run/node\"] || allDeps.remix };\n if (allDeps.astro) return { name: \"astro\", version: allDeps.astro };\n if (allDeps[\"@sveltejs/kit\"]) return { name: \"sveltekit\", version: allDeps[\"@sveltejs/kit\"] };\n if (allDeps.svelte) return { name: \"svelte\", version: allDeps.svelte };\n if (allDeps[\"@adonisjs/core\"]) return { name: \"adonisjs\", version: allDeps[\"@adonisjs/core\"] };\n if (allDeps.meteor) return { name: \"meteor\", version: allDeps.meteor };\n if (allDeps.strapi) return { name: \"strapi\", version: allDeps.strapi };\n if (allDeps.keystone) return { name: \"keystonejs\", version: allDeps.keystone };\n if (allDeps.payload) return { name: \"payload\", version: allDeps.payload };\n\n return {};\n } catch {\n return {};\n }\n }\n\n private getNpmVersion(): Promise<string | undefined> {\n return new Promise((resolve) => {\n execFile(\"npm\", [\"--version\"], { timeout: 5000 }, (err, stdout) => {\n resolve(err ? undefined : stdout.trim());\n });\n });\n }\n}\n","import http from \"http\";\nimport https from \"https\";\nimport { URL } from \"url\";\nimport type { ReportPayload } from \"./types.js\";\nimport type { Logger } from \"./logger.js\";\n\n/** Max payload size in bytes (512 KB) */\nconst MAX_PAYLOAD_BYTES = 512 * 1024;\n\n/** Max string length for error messages / stacks */\nconst MAX_STRING_LENGTH = 4096;\n\n/** Max array items in any payload array */\nconst MAX_ARRAY_LENGTH = 200;\n\n/** Mask an API key for safe logging: show first 6 chars + *** */\nfunction maskApiKey(key: string): string {\n if (key.length <= 6) return \"***\";\n return key.slice(0, 6) + \"***\";\n}\n\n/** Truncate a string to maxLen */\nfunction truncStr(s: string | undefined, maxLen: number): string | undefined {\n if (s == null) return s;\n return s.length > maxLen ? s.slice(0, maxLen) + \"...[truncated]\" : s;\n}\n\n/** Bound an array to maxLen elements */\nfunction boundArray<T>(arr: T[] | undefined, maxLen: number): T[] | undefined {\n if (!arr) return arr;\n return arr.length > maxLen ? arr.slice(0, maxLen) : arr;\n}\n\n/** Sanitize a report payload to prevent oversized transmissions */\nfunction sanitizePayload(payload: ReportPayload): ReportPayload {\n const p = { ...payload };\n\n // Sanitize error events\n if (p.errors) {\n p.errors = boundArray(p.errors, MAX_ARRAY_LENGTH)!;\n for (let i = 0; i < p.errors.length; i++) {\n const e = { ...p.errors[i] };\n e.message = truncStr(e.message, MAX_STRING_LENGTH) || \"\";\n e.stack = truncStr(e.stack, MAX_STRING_LENGTH);\n p.errors[i] = e;\n }\n }\n\n // Sanitize security events\n if (p.security) {\n p.security = { ...p.security };\n p.security.events = boundArray(p.security.events, 50) || [];\n for (let i = 0; i < p.security.events.length; i++) {\n const ev = { ...p.security.events[i] };\n ev.message = truncStr(ev.message, MAX_STRING_LENGTH) || \"\";\n ev.payload = truncStr(ev.payload, 500);\n p.security.events[i] = ev;\n }\n p.security.topOffendingIps = boundArray(p.security.topOffendingIps, 10) || [];\n }\n\n // Sanitize dep audit vulnerabilities\n if (p.depAudit) {\n p.depAudit = { ...p.depAudit };\n p.depAudit.vulnerabilities = boundArray(p.depAudit.vulnerabilities, 50) || [];\n }\n\n // Sanitize HTTP top paths\n if (p.http) {\n p.http = { ...p.http };\n p.http.topPaths = boundArray(p.http.topPaths, 20) || [];\n }\n\n // Sanitize runtime heap spaces\n if (p.runtime) {\n p.runtime = { ...p.runtime };\n p.runtime.heapSpaces = boundArray(p.runtime.heapSpaces, 20);\n }\n\n // Sanitize env security warnings\n if (p.envSecurity) {\n p.envSecurity = { ...p.envSecurity };\n p.envSecurity.envVarWarnings = boundArray(p.envSecurity.envVarWarnings, 50) || [];\n p.envSecurity.securityHeaders = boundArray(p.envSecurity.securityHeaders, 20) || [];\n }\n\n return p;\n}\n\nexport class Reporter {\n private apiUrl: string;\n private apiKey: string;\n private logger: Logger;\n private queue: ReportPayload[] = [];\n private sending = false;\n private consecutiveFailures = 0;\n private backoffUntil = 0;\n\n /** Max queued reports before dropping oldest */\n private static readonly MAX_QUEUE_SIZE = 100;\n /** Max backoff delay in ms (60 seconds) */\n private static readonly MAX_BACKOFF_MS = 60_000;\n\n constructor(apiUrl: string, apiKey: string, logger: Logger) {\n this.apiUrl = apiUrl.replace(/\\/$/, \"\");\n this.apiKey = apiKey;\n this.logger = logger;\n }\n\n async send(payload: ReportPayload): Promise<boolean> {\n try {\n // Enforce max queue size — drop oldest if full\n if (this.queue.length >= Reporter.MAX_QUEUE_SIZE) {\n const dropped = this.queue.length - Reporter.MAX_QUEUE_SIZE + 1;\n this.queue.splice(0, dropped);\n this.logger.warn(`Queue full, dropped ${dropped} oldest report(s)`);\n }\n this.queue.push(payload);\n\n if (this.sending) return true;\n\n // Respect exponential backoff\n const now = Date.now();\n if (now < this.backoffUntil) {\n this.logger.info(`Backoff active, will retry in ${Math.round((this.backoffUntil - now) / 1000)}s`);\n return true; // queued for later\n }\n\n this.sending = true;\n try {\n while (this.queue.length > 0) {\n // Check backoff before each batch\n if (Date.now() < this.backoffUntil) break;\n\n const batch = this.queue.splice(0, 10);\n try {\n await this.transmit(batch);\n // Success — reset backoff\n this.consecutiveFailures = 0;\n this.backoffUntil = 0;\n } catch (err) {\n // Put batch back at front of queue\n this.queue.unshift(...batch);\n // Exponential backoff: 1s, 2s, 4s, 8s, ... max 60s\n this.consecutiveFailures++;\n const delay = Math.min(1000 * Math.pow(2, this.consecutiveFailures - 1), Reporter.MAX_BACKOFF_MS);\n this.backoffUntil = Date.now() + delay;\n this.logger.warn(\n `Transmit failed (attempt ${this.consecutiveFailures}), backing off ${Math.round(delay / 1000)}s: ${err instanceof Error ? err.message : err}`\n );\n break;\n }\n }\n return true;\n } finally {\n this.sending = false;\n }\n } catch (err) {\n this.logger.error(\n `Failed to send report (key=${maskApiKey(this.apiKey)}):`,\n err instanceof Error ? err.message : err\n );\n return false;\n }\n }\n\n private async transmit(payloads: ReportPayload[]): Promise<void> {\n const url = `${this.apiUrl}/api/tracker/report`;\n\n // Sanitize all payloads before serializing\n const sanitized = payloads.map(sanitizePayload);\n let body = JSON.stringify(sanitized.length === 1 ? sanitized[0] : { batch: sanitized });\n\n // Truncate oversized payloads\n if (body.length > MAX_PAYLOAD_BYTES) {\n this.logger.warn(\n `Payload too large (${body.length} bytes), truncating arrays (key=${maskApiKey(this.apiKey)})`\n );\n // Strip heaviest optional fields and retry\n for (const p of sanitized) {\n (p as any)._truncated = true;\n (p as any)._originalSize = body.length;\n if (p.security) {\n p.security.events = p.security.events.slice(0, 10);\n }\n if (p.errors) {\n p.errors = p.errors.slice(0, 20);\n }\n if (p.depAudit) {\n p.depAudit.vulnerabilities = p.depAudit.vulnerabilities.slice(0, 10);\n }\n }\n body = JSON.stringify(sanitized.length === 1 ? sanitized[0] : { batch: sanitized });\n }\n\n this.logger.info(\n `Sending report to ${url} (${payloads.length} payload(s), ${body.length} bytes, key=${maskApiKey(this.apiKey)})`\n );\n\n return new Promise<void>((resolve, reject) => {\n try {\n const parsed = new URL(url);\n const isHttps = parsed.protocol === \"https:\";\n const mod = isHttps ? https : http;\n\n const options: http.RequestOptions = {\n hostname: parsed.hostname,\n port: parsed.port || (isHttps ? 443 : 80),\n path: parsed.pathname + parsed.search,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(body, \"utf-8\"),\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": \"shieldpress-tracker/1.0.0\",\n },\n timeout: 10000,\n };\n\n const req = mod.request(options, (res) => {\n let data = \"\";\n res.on(\"data\", (chunk: Buffer | string) => {\n // Only collect up to 1KB of response body for error messages\n if (data.length < 1024) {\n data += chunk;\n }\n });\n res.on(\"end\", () => {\n const statusCode = res.statusCode || 0;\n if (statusCode >= 200 && statusCode < 300) {\n this.logger.info(\"Report sent successfully\");\n resolve();\n } else {\n reject(new Error(`HTTP ${statusCode}: ${data.slice(0, 200)}`));\n }\n });\n res.on(\"error\", (err: Error) => {\n reject(new Error(`Response error: ${err.message}`));\n });\n });\n\n // Timeout via request.setTimeout (works in Node 14+)\n req.setTimeout(10000, () => {\n req.destroy(new Error(\"Request timed out after 10000ms\"));\n });\n\n req.on(\"error\", (err: Error) => {\n reject(new Error(`Request error: ${err.message}`));\n });\n\n req.write(body);\n req.end();\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)));\n }\n });\n }\n}\n"],"mappings":"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","names":["http","https","http","readFile","join","execFile","v8","http","https"]}
|