2g 0.4.2 → 0.4.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"sessionSockets-chunk.mjs","sources":["../../src/constants.ts","../../src/clean.ts","../../src/utils/eventFilter.ts","../../src/utils/sessionSockets.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\n\n// The POSIX tmpdir is shared across users; Windows %TEMP% is per-user\nconst uid = process.getuid?.();\nexport const EVENT_LOG_TMP_DIR = path.join(\n os.tmpdir(),\n uid == null ? 'event-log' : `event-log-${uid}`\n);\nexport const EVENT_LOG_FORMAT_VERSION = 1;\nexport const EVENT_LEVEL_DEBUG = 1;\nexport const EVENT_LOG_STATE_VERSION = 1;\nexport const LOG_DEBUG_ENV = 'LOG_DEBUG';\nexport const LOG_EVENTS_ENV = 'LOG_EVENTS';\nexport const INTERNAL_IPC_ENV = '__eventLogIpc';\nexport const INTERNAL_PROCESS_ORIGIN_ENV = '__eventLogProcessOrigin';\n\nexport const SESSION_FILES = {\n meta: 'meta.json',\n liveSocket: 'live.sock',\n ipcSocket: 'ipc.sock',\n} as const;\n\nexport const DEFAULT_SEGMENTS = 3;\nexport const DEFAULT_SEGMENT_SIZE = 512 * 1024;\n\n// Debug recording emits far more events, so retain a larger ring buffer\nexport const DEBUG_SEGMENTS = 6;\nexport const DEBUG_SEGMENT_SIZE = 1024 * 1024;\n\nexport const DEFAULT_RETAIN_MS = 7 * 24 * 60 * 60 * 1000;\nexport const DEFAULT_MAX_SESSIONS = 100;\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport {\n DEFAULT_MAX_SESSIONS,\n DEFAULT_RETAIN_MS,\n EVENT_LOG_TMP_DIR,\n EVENT_LOG_FORMAT_VERSION,\n SESSION_FILES,\n} from './constants';\nimport type { SessionMeta } from './session';\n\ninterface SessionEntry {\n id: string;\n dir: string;\n meta: SessionMeta;\n alive: boolean;\n}\n\nconst SESSION_BASE_DIR_OVERRIDE = Symbol.for('2g/session-base-dir-override');\n\ninterface EventLogGlobal {\n [SESSION_BASE_DIR_OVERRIDE]?: string;\n}\n\nexport function cleanStaleSessionsSync() {\n const now = Date.now();\n const dead: SessionEntry[] = [];\n let removed = 0;\n\n for (const entry of getSessionEntries()) {\n if (entry.alive) continue;\n if (now - entry.meta.startedAt > DEFAULT_RETAIN_MS) {\n fs.rmSync(entry.dir, { recursive: true, force: true });\n removed++;\n } else {\n dead.push(entry);\n }\n }\n\n dead.sort((a, b) => b.meta.startedAt - a.meta.startedAt);\n for (let idx = DEFAULT_MAX_SESSIONS; idx < dead.length; idx++) {\n fs.rmSync(dead[idx].dir, { recursive: true, force: true });\n removed++;\n }\n\n return removed;\n}\n\nexport function cleanExitedSessionsSync() {\n let removed = 0;\n for (const entry of getSessionEntries()) {\n if (!entry.alive) {\n fs.rmSync(entry.dir, { recursive: true, force: true });\n removed++;\n }\n }\n return removed;\n}\n\nexport function readMetaSync(sessionDir: string): SessionMeta | null {\n try {\n const meta = JSON.parse(\n fs.readFileSync(path.join(sessionDir, SESSION_FILES.meta), 'utf8')\n );\n return isCompatibleSessionMeta(meta) ? meta : null;\n } catch {\n return null;\n }\n}\n\nexport function getSessionBaseDir() {\n return (\n (globalThis as EventLogGlobal)[SESSION_BASE_DIR_OVERRIDE] ||\n EVENT_LOG_TMP_DIR\n );\n}\n\nexport function _setSessionBaseDir(dir: string | undefined) {\n const globalScope = globalThis as EventLogGlobal;\n if (dir) globalScope[SESSION_BASE_DIR_OVERRIDE] = dir;\n else delete globalScope[SESSION_BASE_DIR_OVERRIDE];\n}\n\n// Only the newest session per pid can be alive: whatever owns a recycled PID\n// now is not the process behind any older dir claiming it\nexport function newestSessionIds(\n sessions: Array<{ id: string; pid: number; startedAt: number }>\n) {\n const newest = new Map<number, { id: string; startedAt: number }>();\n for (const session of sessions) {\n const current = newest.get(session.pid);\n if (\n !current ||\n session.startedAt > current.startedAt ||\n (session.startedAt === current.startedAt && session.id > current.id)\n ) {\n newest.set(session.pid, session);\n }\n }\n return new Set([...newest.values()].map(session => session.id));\n}\n\nexport function isPidAlive(pid: number) {\n if (!pid || pid === process.pid) return true;\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getSessionEntries() {\n try {\n const baseDir = getSessionBaseDir();\n const entries = fs\n .readdirSync(baseDir, { withFileTypes: true })\n .filter(entry => entry.isDirectory())\n .map(entry => {\n const dir = path.join(baseDir, entry.name);\n return { id: entry.name, dir, meta: readMetaSync(dir), alive: false };\n })\n .filter((entry): entry is SessionEntry => entry.meta !== null);\n const newest = newestSessionIds(\n entries.map(entry => ({\n id: entry.id,\n pid: entry.meta.pid,\n startedAt: entry.meta.startedAt,\n }))\n );\n return entries.map(entry => ({\n ...entry,\n alive: isPidAlive(entry.meta.pid) && newest.has(entry.id),\n }));\n } catch {\n return [];\n }\n}\n\nfunction isCompatibleSessionMeta(meta: unknown): meta is SessionMeta {\n return (\n !!meta &&\n typeof meta === 'object' &&\n (meta as SessionMeta).formatVersion === EVENT_LOG_FORMAT_VERSION\n );\n}\n","import type { ParsedEvent } from '../types';\n\nconst DURATION_UNITS: Record<string, number> = {\n ms: 1,\n msec: 1,\n msecs: 1,\n millisecond: 1,\n milliseconds: 1,\n s: 1000,\n sec: 1000,\n secs: 1000,\n second: 1000,\n seconds: 1000,\n m: 60_000,\n min: 60_000,\n mins: 60_000,\n minute: 60_000,\n minutes: 60_000,\n h: 3_600_000,\n hr: 3_600_000,\n hrs: 3_600_000,\n hour: 3_600_000,\n hours: 3_600_000,\n};\n\nexport interface EventFilterOptions {\n since?: number | string | Date;\n filter?: string | string[];\n spans?: boolean;\n debug?: boolean;\n}\n\nexport function parseEventLine(\n line: string,\n options: EventFilterOptions = {},\n eventFilter = compileEventFilter(options.filter),\n since = parseSince(options.since)\n): ParsedEvent | null {\n try {\n const event = JSON.parse(line) as ParsedEvent;\n return event &&\n typeof event._e === 'string' &&\n typeof event._t === 'number' &&\n matches(event, options.debug, since, options.spans, eventFilter)\n ? event\n : null;\n } catch {\n return null;\n }\n}\n\nexport function parseSince(value: EventFilterOptions['since']) {\n if (value == null) return undefined;\n if (value instanceof Date) {\n const timestamp = value.getTime();\n if (Number.isFinite(timestamp)) return timestamp;\n throw new Error(`Invalid since: ${value.toString()}`);\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || value < 0)\n throw new Error(`Invalid since: ${value}`);\n return normalizeUnixTimestamp(value);\n }\n\n const input = value.trim();\n if (!input) return undefined;\n if (/^\\d+(?:\\.\\d+)?$/.test(input))\n return normalizeUnixTimestamp(Number(input));\n\n const duration = parseDuration(input);\n if (duration != null) return Date.now() - duration;\n\n const timestamp = Date.parse(input);\n if (Number.isFinite(timestamp)) return timestamp;\n throw new Error(`Invalid since: ${value}`);\n}\n\nexport function parseDuration(value: string) {\n const input = value.trim().toLowerCase();\n if (!input) return undefined;\n\n let total = 0;\n let index = 0;\n const pattern =\n /(\\d+(?:\\.\\d+)?)\\s*(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h)?/gy;\n\n while (index < input.length) {\n pattern.lastIndex = index;\n const match = pattern.exec(input);\n if (!match) return undefined;\n const amount = Number(match[1]);\n if (!Number.isFinite(amount)) return undefined;\n total += amount * DURATION_UNITS[match[2] ?? 'ms'];\n index = pattern.lastIndex;\n while (input[index] === ' ' || input[index] === ',') index++;\n }\n\n return total;\n}\n\nexport function compileEventFilter(filter: string | string[] | undefined) {\n const patterns = normalizeEventFilter(filter);\n if (!patterns.length) return null;\n return new RegExp(`^(?:${patterns.map(eventPatternToRegex).join('|')})$`);\n}\n\nexport function matchesTapOptions(\n event: ParsedEvent,\n options: {\n since?: number;\n spans?: boolean;\n debug?: boolean;\n filter?: EventFilterOptions['filter'];\n },\n eventFilter = compileEventFilter(options.filter)\n) {\n return matches(\n event,\n options.debug,\n options.since,\n options.spans,\n eventFilter\n );\n}\n\nfunction matches(\n event: ParsedEvent,\n debug: boolean | undefined,\n since: number | undefined,\n spans: boolean | undefined,\n eventFilter: RegExp | null\n) {\n if (debug !== true && event._l) return false;\n if (since !== undefined && event._t < since) return false;\n if (spans === true && typeof event._d !== 'number') return false;\n return !eventFilter || eventFilter.test(event._e);\n}\n\nfunction normalizeEventFilter(filter: string | string[] | undefined) {\n const values = Array.isArray(filter) ? filter : filter ? [filter] : [];\n return values\n .flatMap(value => value.split(','))\n .map(value => value.trim())\n .filter(Boolean);\n}\n\nfunction eventPatternToRegex(pattern: string) {\n if (pattern.includes('*')) {\n return pattern.split('*').map(escapeRegex).join('.*');\n } else {\n return `${escapeRegex(pattern)}(?::.*)?`;\n }\n}\n\nfunction escapeRegex(value: string) {\n return value.replace(/[|\\\\{}()[\\]^$+?.]/g, '\\\\$&');\n}\n\nfunction normalizeUnixTimestamp(value: number) {\n return value < 10_000_000_000 ? value * 1000 : value;\n}\n","import fs from 'node:fs';\nimport net from 'node:net';\nimport path from 'node:path';\n\nimport { SESSION_FILES } from '../constants';\n\nexport interface SocketAddress {\n // Relative to the session dir, or a Windows named-pipe name\n name: string;\n path: string;\n}\n\n// Windows net servers cannot listen on filesystem paths\nexport function createSocketAddress(\n sessionDir: string,\n sessionId: string,\n kind: 'live' | 'ipc'\n): SocketAddress {\n const name =\n process.platform === 'win32'\n ? `\\\\\\\\.\\\\pipe\\\\event-log-${sessionId}-${kind}`\n : kind === 'live'\n ? SESSION_FILES.liveSocket\n : SESSION_FILES.ipcSocket;\n return { name, path: resolveSocketPath(sessionDir, name) };\n}\n\n// Meta socket values are relative to the session dir; pipe names are never relative\nexport function resolveSocketPath(sessionDir: string, value: string) {\n return value.startsWith('\\\\\\\\') ? value : path.join(sessionDir, value);\n}\n\n// Pipes are not filesystem entries\nexport function removeSocket(socketPath: string) {\n if (!socketPath.startsWith('\\\\\\\\')) fs.rmSync(socketPath, { force: true });\n}\n\nexport function listenSocket(server: net.Server, socketPath: string) {\n let closed = false;\n let listening = false;\n let shouldClose = false;\n\n // Session sockets must never hold the host process open\n server.unref();\n\n const close = () => {\n shouldClose = true;\n if (listening && !closed) server.close();\n };\n\n server.once('listening', () => {\n listening = true;\n if (shouldClose) close();\n });\n server.once('close', () => {\n closed = true;\n listening = false;\n });\n server.on('error', () => {\n closed = true;\n try {\n server.close(() => {});\n } catch {}\n });\n server.listen(socketPath);\n\n return close;\n}\n"],"names":["uid","process","getuid","EVENT_LOG_TMP_DIR","path","join","os","tmpdir","EVENT_LOG_FORMAT_VERSION","EVENT_LEVEL_DEBUG","EVENT_LOG_STATE_VERSION","LOG_DEBUG_ENV","LOG_EVENTS_ENV","INTERNAL_IPC_ENV","INTERNAL_PROCESS_ORIGIN_ENV","SESSION_FILES","meta","liveSocket","ipcSocket","DEFAULT_SEGMENTS","DEFAULT_SEGMENT_SIZE","DEBUG_SEGMENTS","DEBUG_SEGMENT_SIZE","SESSION_BASE_DIR_OVERRIDE","Symbol","for","cleanStaleSessionsSync","now","Date","dead","removed","entry","getSessionEntries","alive","startedAt","fs","rmSync","dir","recursive","force","push","sort","a","b","idx","length","cleanExitedSessionsSync","readMetaSync","sessionDir","JSON","parse","readFileSync","isCompatibleSessionMeta","formatVersion","getSessionBaseDir","globalThis","newestSessionIds","sessions","newest","Map","session","current","get","pid","id","set","Set","values","map","isPidAlive","kill","baseDir","entries","readdirSync","withFileTypes","filter","isDirectory","name","has","DURATION_UNITS","ms","msec","msecs","millisecond","milliseconds","s","sec","secs","second","seconds","m","min","mins","minute","minutes","h","hr","hrs","hour","hours","parseEventLine","line","options","eventFilter","compileEventFilter","since","parseSince","event","_e","_t","matches","debug","spans","value","timestamp","getTime","Number","isFinite","Error","toString","normalizeUnixTimestamp","input","trim","test","duration","parseDuration","toLowerCase","total","index","pattern","lastIndex","match","exec","amount","patterns","normalizeEventFilter","Array","isArray","flatMap","split","Boolean","RegExp","eventPatternToRegex","matchesTapOptions","_l","undefined","_d","includes","escapeRegex","replace","createSocketAddress","sessionId","kind","platform","resolveSocketPath","startsWith","removeSocket","socketPath","listenSocket","server","closed","listening","shouldClose","unref","close","once","on","listen"],"mappings":"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"}
1
+ {"version":3,"file":"sessionSockets-chunk.mjs","sources":["../../src/constants.ts","../../src/clean.ts","../../src/utils/eventFilter.ts","../../src/utils/sessionSockets.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\n\n// The POSIX tmpdir is shared across users; Windows %TEMP% is per-user\nconst uid = process.getuid?.();\nexport const EVENT_LOG_TMP_DIR = path.join(\n os.tmpdir(),\n uid == null ? 'event-log' : `event-log-${uid}`\n);\nexport const EVENT_LOG_FORMAT_VERSION = 1;\nexport const EVENT_LEVEL_DEBUG = 1;\nexport const EVENT_LOG_STATE_VERSION = 1;\nexport const LOG_DEBUG_ENV = 'LOG_DEBUG';\nexport const LOG_EVENTS_ENV = 'LOG_EVENTS';\nexport const INTERNAL_DEBUG_ENV = '__eventLogDebug';\nexport const INTERNAL_IPC_ENV = '__eventLogIpc';\nexport const INTERNAL_PROCESS_ORIGIN_ENV = '__eventLogProcessOrigin';\n\nexport const SESSION_FILES = {\n meta: 'meta.json',\n liveSocket: 'live.sock',\n ipcSocket: 'ipc.sock',\n} as const;\n\nexport const DEFAULT_SEGMENTS = 3;\nexport const DEFAULT_SEGMENT_SIZE = 512 * 1024;\n\n// Debug recording emits far more events, so retain a larger ring buffer\nexport const DEBUG_SEGMENTS = 6;\nexport const DEBUG_SEGMENT_SIZE = 1024 * 1024;\n\nexport const DEFAULT_RETAIN_MS = 7 * 24 * 60 * 60 * 1000;\nexport const DEFAULT_MAX_SESSIONS = 100;\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport {\n DEFAULT_MAX_SESSIONS,\n DEFAULT_RETAIN_MS,\n EVENT_LOG_TMP_DIR,\n EVENT_LOG_FORMAT_VERSION,\n SESSION_FILES,\n} from './constants';\nimport type { SessionMeta } from './session';\n\ninterface SessionEntry {\n id: string;\n dir: string;\n meta: SessionMeta;\n alive: boolean;\n}\n\nconst SESSION_BASE_DIR_OVERRIDE = Symbol.for('2g/session-base-dir-override');\n\ninterface EventLogGlobal {\n [SESSION_BASE_DIR_OVERRIDE]?: string;\n}\n\nexport function cleanStaleSessionsSync() {\n const now = Date.now();\n const dead: SessionEntry[] = [];\n let removed = 0;\n\n for (const entry of getSessionEntries()) {\n if (entry.alive) continue;\n if (now - entry.meta.startedAt > DEFAULT_RETAIN_MS) {\n fs.rmSync(entry.dir, { recursive: true, force: true });\n removed++;\n } else {\n dead.push(entry);\n }\n }\n\n dead.sort((a, b) => b.meta.startedAt - a.meta.startedAt);\n for (let idx = DEFAULT_MAX_SESSIONS; idx < dead.length; idx++) {\n fs.rmSync(dead[idx].dir, { recursive: true, force: true });\n removed++;\n }\n\n return removed;\n}\n\nexport function cleanExitedSessionsSync() {\n let removed = 0;\n for (const entry of getSessionEntries()) {\n if (!entry.alive) {\n fs.rmSync(entry.dir, { recursive: true, force: true });\n removed++;\n }\n }\n return removed;\n}\n\nexport function readMetaSync(sessionDir: string): SessionMeta | null {\n try {\n const meta = JSON.parse(\n fs.readFileSync(path.join(sessionDir, SESSION_FILES.meta), 'utf8')\n );\n return isCompatibleSessionMeta(meta) ? meta : null;\n } catch {\n return null;\n }\n}\n\nexport function getSessionBaseDir() {\n return (\n (globalThis as EventLogGlobal)[SESSION_BASE_DIR_OVERRIDE] ||\n EVENT_LOG_TMP_DIR\n );\n}\n\nexport function _setSessionBaseDir(dir: string | undefined) {\n const globalScope = globalThis as EventLogGlobal;\n if (dir) globalScope[SESSION_BASE_DIR_OVERRIDE] = dir;\n else delete globalScope[SESSION_BASE_DIR_OVERRIDE];\n}\n\n// Only the newest session per pid can be alive: whatever owns a recycled PID\n// now is not the process behind any older dir claiming it\nexport function newestSessionIds(\n sessions: Array<{ id: string; pid: number; startedAt: number }>\n) {\n const newest = new Map<number, { id: string; startedAt: number }>();\n for (const session of sessions) {\n const current = newest.get(session.pid);\n if (\n !current ||\n session.startedAt > current.startedAt ||\n (session.startedAt === current.startedAt && session.id > current.id)\n ) {\n newest.set(session.pid, session);\n }\n }\n return new Set([...newest.values()].map(session => session.id));\n}\n\nexport function isPidAlive(pid: number) {\n if (!pid || pid === process.pid) return true;\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getSessionEntries() {\n try {\n const baseDir = getSessionBaseDir();\n const entries = fs\n .readdirSync(baseDir, { withFileTypes: true })\n .filter(entry => entry.isDirectory())\n .map(entry => {\n const dir = path.join(baseDir, entry.name);\n return { id: entry.name, dir, meta: readMetaSync(dir), alive: false };\n })\n .filter((entry): entry is SessionEntry => entry.meta !== null);\n const newest = newestSessionIds(\n entries.map(entry => ({\n id: entry.id,\n pid: entry.meta.pid,\n startedAt: entry.meta.startedAt,\n }))\n );\n return entries.map(entry => ({\n ...entry,\n alive: isPidAlive(entry.meta.pid) && newest.has(entry.id),\n }));\n } catch {\n return [];\n }\n}\n\nfunction isCompatibleSessionMeta(meta: unknown): meta is SessionMeta {\n return (\n !!meta &&\n typeof meta === 'object' &&\n (meta as SessionMeta).formatVersion === EVENT_LOG_FORMAT_VERSION\n );\n}\n","import type { ParsedEvent } from '../types';\n\nconst DURATION_UNITS: Record<string, number> = {\n ms: 1,\n msec: 1,\n msecs: 1,\n millisecond: 1,\n milliseconds: 1,\n s: 1000,\n sec: 1000,\n secs: 1000,\n second: 1000,\n seconds: 1000,\n m: 60_000,\n min: 60_000,\n mins: 60_000,\n minute: 60_000,\n minutes: 60_000,\n h: 3_600_000,\n hr: 3_600_000,\n hrs: 3_600_000,\n hour: 3_600_000,\n hours: 3_600_000,\n};\n\nexport interface EventFilterOptions {\n since?: number | string | Date;\n filter?: string | string[];\n spans?: boolean;\n debug?: boolean;\n}\n\nexport function parseEventLine(\n line: string,\n options: EventFilterOptions = {},\n eventFilter = compileEventFilter(options.filter),\n since = parseSince(options.since)\n): ParsedEvent | null {\n try {\n const event = JSON.parse(line) as ParsedEvent;\n return event &&\n typeof event._e === 'string' &&\n typeof event._t === 'number' &&\n matches(event, options.debug, since, options.spans, eventFilter)\n ? event\n : null;\n } catch {\n return null;\n }\n}\n\nexport function parseSince(value: EventFilterOptions['since']) {\n if (value == null) return undefined;\n if (value instanceof Date) {\n const timestamp = value.getTime();\n if (Number.isFinite(timestamp)) return timestamp;\n throw new Error(`Invalid since: ${value.toString()}`);\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || value < 0)\n throw new Error(`Invalid since: ${value}`);\n return normalizeUnixTimestamp(value);\n }\n\n const input = value.trim();\n if (!input) return undefined;\n if (/^\\d+(?:\\.\\d+)?$/.test(input))\n return normalizeUnixTimestamp(Number(input));\n\n const duration = parseDuration(input);\n if (duration != null) return Date.now() - duration;\n\n const timestamp = Date.parse(input);\n if (Number.isFinite(timestamp)) return timestamp;\n throw new Error(`Invalid since: ${value}`);\n}\n\nexport function parseDuration(value: string) {\n const input = value.trim().toLowerCase();\n if (!input) return undefined;\n\n let total = 0;\n let index = 0;\n const pattern =\n /(\\d+(?:\\.\\d+)?)\\s*(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h)?/gy;\n\n while (index < input.length) {\n pattern.lastIndex = index;\n const match = pattern.exec(input);\n if (!match) return undefined;\n const amount = Number(match[1]);\n if (!Number.isFinite(amount)) return undefined;\n total += amount * DURATION_UNITS[match[2] ?? 'ms'];\n index = pattern.lastIndex;\n while (input[index] === ' ' || input[index] === ',') index++;\n }\n\n return total;\n}\n\nexport function compileEventFilter(filter: string | string[] | undefined) {\n const patterns = normalizeEventFilter(filter);\n if (!patterns.length) return null;\n return new RegExp(`^(?:${patterns.map(eventPatternToRegex).join('|')})$`);\n}\n\nexport function matchesTapOptions(\n event: ParsedEvent,\n options: {\n since?: number;\n spans?: boolean;\n debug?: boolean;\n filter?: EventFilterOptions['filter'];\n },\n eventFilter = compileEventFilter(options.filter)\n) {\n return matches(\n event,\n options.debug,\n options.since,\n options.spans,\n eventFilter\n );\n}\n\nfunction matches(\n event: ParsedEvent,\n debug: boolean | undefined,\n since: number | undefined,\n spans: boolean | undefined,\n eventFilter: RegExp | null\n) {\n if (debug !== true && event._l) return false;\n if (since !== undefined && event._t < since) return false;\n if (spans === true && typeof event._d !== 'number') return false;\n return !eventFilter || eventFilter.test(event._e);\n}\n\nfunction normalizeEventFilter(filter: string | string[] | undefined) {\n const values = Array.isArray(filter) ? filter : filter ? [filter] : [];\n return values\n .flatMap(value => value.split(','))\n .map(value => value.trim())\n .filter(Boolean);\n}\n\nfunction eventPatternToRegex(pattern: string) {\n if (pattern.includes('*')) {\n return pattern.split('*').map(escapeRegex).join('.*');\n } else {\n return `${escapeRegex(pattern)}(?::.*)?`;\n }\n}\n\nfunction escapeRegex(value: string) {\n return value.replace(/[|\\\\{}()[\\]^$+?.]/g, '\\\\$&');\n}\n\nfunction normalizeUnixTimestamp(value: number) {\n return value < 10_000_000_000 ? value * 1000 : value;\n}\n","import fs from 'node:fs';\nimport net from 'node:net';\nimport path from 'node:path';\n\nimport { SESSION_FILES } from '../constants';\n\nexport interface SocketAddress {\n // Relative to the session dir, or a Windows named-pipe name\n name: string;\n path: string;\n}\n\n// Windows net servers cannot listen on filesystem paths\nexport function createSocketAddress(\n sessionDir: string,\n sessionId: string,\n kind: 'live' | 'ipc'\n): SocketAddress {\n const name =\n process.platform === 'win32'\n ? `\\\\\\\\.\\\\pipe\\\\event-log-${sessionId}-${kind}`\n : kind === 'live'\n ? SESSION_FILES.liveSocket\n : SESSION_FILES.ipcSocket;\n return { name, path: resolveSocketPath(sessionDir, name) };\n}\n\n// Meta socket values are relative to the session dir; pipe names are never relative\nexport function resolveSocketPath(sessionDir: string, value: string) {\n return value.startsWith('\\\\\\\\') ? value : path.join(sessionDir, value);\n}\n\n// Pipes are not filesystem entries\nexport function removeSocket(socketPath: string) {\n if (!socketPath.startsWith('\\\\\\\\')) fs.rmSync(socketPath, { force: true });\n}\n\nexport function listenSocket(server: net.Server, socketPath: string) {\n let closed = false;\n let listening = false;\n let shouldClose = false;\n\n // Session sockets must never hold the host process open\n server.unref();\n\n const close = () => {\n shouldClose = true;\n if (listening && !closed) server.close();\n };\n\n server.once('listening', () => {\n listening = true;\n if (shouldClose) close();\n });\n server.once('close', () => {\n closed = true;\n listening = false;\n });\n server.on('error', () => {\n closed = true;\n try {\n server.close(() => {});\n } catch {}\n });\n server.listen(socketPath);\n\n return close;\n}\n"],"names":["uid","process","getuid","EVENT_LOG_TMP_DIR","path","join","os","tmpdir","EVENT_LOG_FORMAT_VERSION","EVENT_LEVEL_DEBUG","EVENT_LOG_STATE_VERSION","LOG_DEBUG_ENV","LOG_EVENTS_ENV","INTERNAL_DEBUG_ENV","INTERNAL_IPC_ENV","INTERNAL_PROCESS_ORIGIN_ENV","SESSION_FILES","meta","liveSocket","ipcSocket","DEFAULT_SEGMENTS","DEFAULT_SEGMENT_SIZE","DEBUG_SEGMENTS","DEBUG_SEGMENT_SIZE","SESSION_BASE_DIR_OVERRIDE","Symbol","for","cleanStaleSessionsSync","now","Date","dead","removed","entry","getSessionEntries","alive","startedAt","fs","rmSync","dir","recursive","force","push","sort","a","b","idx","length","cleanExitedSessionsSync","readMetaSync","sessionDir","JSON","parse","readFileSync","isCompatibleSessionMeta","formatVersion","getSessionBaseDir","globalThis","newestSessionIds","sessions","newest","Map","session","current","get","pid","id","set","Set","values","map","isPidAlive","kill","baseDir","entries","readdirSync","withFileTypes","filter","isDirectory","name","has","DURATION_UNITS","ms","msec","msecs","millisecond","milliseconds","s","sec","secs","second","seconds","m","min","mins","minute","minutes","h","hr","hrs","hour","hours","parseEventLine","line","options","eventFilter","compileEventFilter","since","parseSince","event","_e","_t","matches","debug","spans","value","timestamp","getTime","Number","isFinite","Error","toString","normalizeUnixTimestamp","input","trim","test","duration","parseDuration","toLowerCase","total","index","pattern","lastIndex","match","exec","amount","patterns","normalizeEventFilter","Array","isArray","flatMap","split","Boolean","RegExp","eventPatternToRegex","matchesTapOptions","_l","undefined","_d","includes","escapeRegex","replace","createSocketAddress","sessionId","kind","platform","resolveSocketPath","startsWith","removeSocket","socketPath","listenSocket","server","closed","listening","shouldClose","unref","close","once","on","listen"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "2g",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "description": "Low-overhead structured event logs for agents and developers",
5
5
  "author": "Phil Pluckthun <phil@kitten.sh>",
6
6
  "source": "./src/index.ts",