@expo/event-log 0.0.1-init
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/CHANGELOG.md +5 -0
- package/LICENSE.md +22 -0
- package/README.md +74 -0
- package/bin/cli.js +19 -0
- package/cli/package.json +17 -0
- package/dist/chunks/tap-chunk.js +536 -0
- package/dist/chunks/tap-chunk.js.map +1 -0
- package/dist/chunks/tap-chunk.mjs +522 -0
- package/dist/chunks/tap-chunk.mjs.map +1 -0
- package/dist/event-log.d.ts +142 -0
- package/dist/event-log.js +983 -0
- package/dist/event-log.js.map +1 -0
- package/dist/event-log.mjs +977 -0
- package/dist/event-log.mjs.map +1 -0
- package/dist/expo-event-log-cli.d.ts +4 -0
- package/dist/expo-event-log-cli.js +1412 -0
- package/dist/expo-event-log-cli.js.map +1 -0
- package/dist/expo-event-log-cli.mjs +1406 -0
- package/dist/expo-event-log-cli.mjs.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-log.js","sources":["../src/state.ts","../src/utils/logStream.ts","../src/api.ts","../src/utils/processOrigin.ts","../src/utils/ipcSink.ts","../src/utils/processExit.ts","../src/utils/socketServer.ts","../src/install.ts"],"sourcesContent":["import { EVENT_LOG_STATE_VERSION } from './constants';\nimport type { EventMeta, EventSink } from './utils/logStream';\n\nexport interface EventLoggerInfo {\n destination: 'file' | 'stdout' | 'stderr' | 'fd' | 'session' | 'ipc';\n isUserVisibleOutput: boolean;\n file?: string;\n fd?: number;\n sessionDir?: string;\n}\n\nexport interface EventLogState {\n logPath: string;\n primarySink?: EventSink;\n eventMeta?: EventMeta;\n eventLoggerInfo: EventLoggerInfo | null;\n}\n\nconst STATE_SYMBOL = Symbol.for(\n `@expo/event-log/state-${EVENT_LOG_STATE_VERSION}`\n);\n\ninterface EventLogGlobal {\n [STATE_SYMBOL]?: EventLogState;\n}\n\nexport const eventLogState = getEventLogState();\n\nexport function setLogPath(path: string) {\n eventLogState.logPath = path;\n}\n\nexport function setPrimarySink(sink: EventSink | undefined) {\n eventLogState.primarySink = sink;\n}\n\nexport function setEventMeta(meta: EventMeta | undefined) {\n eventLogState.eventMeta = meta;\n}\n\nexport function setEventLoggerInfo(info: EventLoggerInfo | null) {\n eventLogState.eventLoggerInfo = info;\n}\n\nexport function writeRawLine(line: string) {\n const out = line.endsWith('\\n') ? line : `${line}\\n`;\n eventLogState.primarySink?._writeln(out);\n}\n\nexport function _resetEventLogState() {\n eventLogState.primarySink?.destroy();\n eventLogState.logPath = process.cwd();\n eventLogState.primarySink = undefined;\n eventLogState.eventMeta = undefined;\n eventLogState.eventLoggerInfo = null;\n}\n\nfunction getEventLogState() {\n const globalScope = globalThis as EventLogGlobal;\n return (globalScope[STATE_SYMBOL] ??= {\n logPath: process.cwd(),\n eventLoggerInfo: null,\n });\n}\n","import { Buffer } from 'node:buffer';\nimport { EventEmitter } from 'node:events';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { performance } from 'node:perf_hooks';\n\nconst BUSY_WRITE_TIMEOUT = 100;\nconst HIGH_WATER_MARK = 16_387; /*16KB*/\nconst TIME_ORIGIN = performance.timeOrigin;\nlet cachedWorkerId: string | undefined;\nlet cachedWorkerIdJson = '';\n\nexport interface EventSink {\n readonly writable: boolean;\n readonly file?: string | null;\n _writeln(data: string): boolean;\n end(cb?: () => void): this;\n destroy(): void;\n}\n\nexport interface EventMeta {\n _w?: string;\n}\n\nexport interface LogStreamOptions {\n closeFd?: boolean;\n}\n\nexport function serializeEvent(\n category: string,\n kind: string,\n payload: Record<string, unknown> | undefined,\n meta?: EventMeta,\n duration?: number\n) {\n const timestamp = getEventTimestamp();\n if (duration == null && !meta?._w) {\n const rest = payload ? JSON.stringify(payload).slice(1) : '';\n return rest.length > 1\n ? `{\"_e\":\"${category}:${kind}\",\"_t\":${timestamp},${rest}\\n`\n : `{\"_e\":\"${category}:${kind}\",\"_t\":${timestamp}}\\n`;\n }\n\n let line = `{\"_e\":\"${category}:${kind}\",\"_t\":${timestamp}`;\n if (duration != null) line += `,\"_d\":${duration}`;\n if (meta?._w) line += `,\"_w\":${stringifyWorkerId(meta._w)}`;\n return `${appendPayload(line, payload)}}\\n`;\n}\n\nexport function writeEvent(\n dest: EventSink,\n category: string,\n kind: string,\n payload: Record<string, unknown> | undefined,\n meta?: EventMeta\n) {\n dest._writeln(serializeEvent(category, kind, payload, meta));\n}\n\nexport function writeCompleteEvent(\n dest: EventSink,\n category: string,\n kind: string,\n startPayload: Record<string, unknown> | undefined,\n endPayload: Record<string, unknown> | undefined,\n delta: number,\n meta?: EventMeta\n) {\n let line = `{\"_e\":\"${category}:${kind}\",\"_t\":${getEventTimestamp()},\"_d\":${delta}`;\n if (meta?._w) line += `,\"_w\":${stringifyWorkerId(meta._w)}`;\n dest._writeln(`${appendMergedPayload(line, startPayload, endPayload)}}\\n`);\n}\n\nexport function getEventTimestamp() {\n return TIME_ORIGIN + performance.now();\n}\n\nfunction stringifyWorkerId(workerId: string) {\n if (workerId !== cachedWorkerId) {\n cachedWorkerId = workerId;\n cachedWorkerIdJson = JSON.stringify(workerId);\n }\n return cachedWorkerIdJson;\n}\n\nfunction appendPayload(line: string, payload?: Record<string, unknown>) {\n if (!payload) return line;\n const rest = JSON.stringify(payload);\n return rest && rest.length > 2 ? `${line},${rest.slice(1, -1)}` : line;\n}\n\nfunction appendMergedPayload(\n line: string,\n startPayload?: Record<string, unknown>,\n endPayload?: Record<string, unknown>\n) {\n if (!startPayload) return appendPayload(line, endPayload);\n if (!endPayload) return appendPayload(line, startPayload);\n\n const endKeys = new Set(Object.keys(endPayload));\n for (const key of Object.keys(startPayload)) {\n if (endKeys.has(key)) continue;\n const value = JSON.stringify(startPayload[key]);\n if (value !== undefined) line += `,${JSON.stringify(key)}:${value}`;\n }\n return appendPayload(line, endPayload);\n}\n\nexport class LogStream\n extends EventEmitter\n implements NodeJS.WritableStream, EventSink\n{\n #fd = -1;\n #file: string | null = null;\n #oldFd: number | null = null;\n #closeFd = true;\n\n #writing = false;\n #ending = false;\n #flushPending = false;\n #destroyed = false;\n #opening = false;\n #reopening = false;\n\n #output = '';\n #len = 0;\n #lines: string[] = [];\n #head = 0;\n #partialLine = 0;\n #onRelease = (err: NodeJS.ErrnoException | null, written: number) =>\n this.#release(err, written);\n\n constructor(dest: string | number, options: LogStreamOptions = {}) {\n super();\n this.#closeFd = options.closeFd !== false;\n if (typeof dest === 'number') {\n try {\n fs.fsyncSync(dest);\n } catch {}\n this.#fd = dest;\n process.nextTick(() => this.emit('ready'));\n } else if (typeof dest === 'string') {\n this.#openFile(dest);\n }\n }\n\n get file(): string | null {\n return this.#file;\n }\n\n get fd(): number {\n return this.#fd;\n }\n\n get writing(): boolean {\n return this.#writing;\n }\n\n get writable(): boolean {\n return !this.#destroyed && !this.#ending;\n }\n\n reopen(file = this.#file) {\n if (this.#file == null)\n throw new Error('Cannot reopen an fd-only LogStream');\n if (this.#destroyed || this.#ending) return;\n if (file) this.#file = file;\n if (this.#opening) {\n this.once('ready', () => this.reopen(file));\n return;\n }\n this.#reopening = true;\n if (!this.#writing) this.#reopen();\n }\n\n #reopen() {\n if (this.#file == null) return;\n this.#reopening = false;\n this.#oldFd = this.#fd;\n this.#openFile(this.#file);\n }\n\n #release(error: NodeJS.ErrnoException | null, written: number) {\n if (error) {\n if (error.code === 'EAGAIN' || error.code === 'EBUSY') {\n setTimeout(() => this.#writeLine(), BUSY_WRITE_TIMEOUT);\n } else {\n this.#writing = false;\n this.emit('error', error);\n }\n } else {\n this.emit('write', written);\n\n if (written === this.#output.length) {\n // Fast path: complete write (exact for ASCII, the common case for JSONL)\n this.#len -= this.#output.length;\n this.#output = '';\n\n if (this.#lines.length - this.#head > this.#partialLine) {\n this.#writeLine();\n } else if (this.#reopening) {\n this.#writing = false;\n this.#reopen();\n } else if (this.#ending) {\n this.#writing = false;\n this.#close();\n } else {\n this.#writing = false;\n if (this.#flushPending) {\n this.emit('drain');\n }\n }\n } else {\n // Multi-byte complete write (written > length) or partial write (written < length)\n const outputLength = Buffer.byteLength(this.#output);\n if (outputLength > written) {\n const output = Buffer.from(this.#output).toString('utf8', written);\n this.#len -= this.#output.length - output.length;\n this.#output = output;\n } else {\n this.#len -= this.#output.length;\n this.#output = '';\n }\n\n if (\n this.#output ||\n this.#lines.length - this.#head > this.#partialLine\n ) {\n this.#writeLine();\n } else if (this.#reopening) {\n this.#writing = false;\n this.#reopen();\n } else if (this.#ending) {\n this.#writing = false;\n this.#close();\n } else {\n this.#writing = false;\n if (this.#flushPending) {\n this.emit('drain');\n }\n }\n }\n }\n }\n\n #openFile(file: string) {\n this.#opening = true;\n this.#writing = true;\n\n const onOpened = (error: Error | null, fd?: number | null) => {\n const oldFd = this.#oldFd;\n this.#oldFd = null;\n if (error) {\n this.#writing = false;\n this.#opening = false;\n this.emit('error', error);\n } else {\n this.#fd = fd!;\n this.#file = file;\n this.#opening = false;\n this.#writing = false;\n this.emit('ready');\n if (oldFd != null && oldFd !== this.#fd && !isStdFd(oldFd)) {\n fsFsync(oldFd, () => fs.close(oldFd, () => {}));\n }\n if (this.#destroyed) {\n // do nothing when we're already closing the file\n } else if (\n (!this.writing &&\n this.#lines.length - this.#head > this.#partialLine) ||\n this.#flushPending\n ) {\n this.#writeLine();\n }\n }\n };\n\n fs.mkdir(path.dirname(file), { recursive: true }, err => {\n if (err) return onOpened(err);\n fs.open(file, 'a', 0o666, onOpened);\n });\n }\n\n #close() {\n if (this.#fd === -1) {\n this.once('ready', () => this.#close());\n return;\n }\n\n this.#destroyed = true;\n this.#partialLine = 0;\n this.#lines.length = 0;\n this.#head = 0;\n\n const onClose = (error?: NodeJS.ErrnoException | null) => {\n if (error) {\n this.emit('error', error);\n this.emit('close', error);\n } else {\n if (this.#ending && !this.#writing) this.emit('finish');\n this.emit('close');\n }\n };\n\n fsFsync(this.#fd, error => {\n if (!error && this.#closeFd && !isStdFd(this.#fd)) {\n fs.close(this.#fd, onClose);\n } else {\n onClose(); // Error intentionally ignored, assume closed\n }\n });\n }\n\n #writeLine() {\n this.#writing = true;\n if (!this.#output) {\n const end = this.#lines.length - this.#partialLine;\n if (end > this.#head) {\n this.#output = this.#lines[this.#head++] || '';\n // Batch multiple lines into one write call below HWM, to avoid\n // excessive syscalls after when lines accumulated during a previous write\n while (this.#head < end && this.#output.length < HIGH_WATER_MARK) {\n this.#output += this.#lines[this.#head++];\n }\n if (this.#head === this.#lines.length) {\n this.#lines.length = 0;\n this.#head = 0;\n }\n }\n }\n fs.write(this.#fd, this.#output, this.#onRelease);\n }\n\n _end() {\n if (!this.#destroyed && !this.#ending) {\n this.#ending = true;\n if (this.#opening) {\n this.once('ready', () => this._end());\n } else if (!this.#writing && this.#fd >= 0) {\n if (this.#lines.length - this.#head > this.#partialLine) {\n this.#writeLine();\n } else {\n this.#close();\n }\n }\n }\n return this;\n }\n\n end(cb?: () => void): this;\n end(data: string | Uint8Array, cb?: () => void): this;\n end(str: string, encoding?: BufferEncoding, cb?: () => void): this;\n\n end(\n arg1?: Uint8Array | string | (() => void),\n arg2?: BufferEncoding | (() => void),\n arg3?: () => void\n ) {\n const maybeCb = arg3 || arg2 || arg1;\n const input = typeof arg1 !== 'function' ? arg1 : undefined;\n const encoding = typeof arg2 === 'string' ? arg2 : 'utf8';\n const cb = typeof maybeCb === 'function' ? maybeCb : undefined;\n if (typeof input === 'string') {\n this.write(input, encoding);\n } else if (input != null) {\n this.write(input);\n }\n if (cb) this.once('close', cb);\n return this._end();\n }\n\n destroy() {\n if (!this.#destroyed) this.#close();\n }\n\n flush(cb?: (error?: Error | null) => void) {\n if (this.#destroyed) {\n cb?.();\n } else {\n const onDrain = () => {\n if (!this.#destroyed) {\n fsFsync(this.#fd, error => {\n this.#flushPending = false;\n if (error?.code === 'EBADF') {\n cb?.(); // If fd is closed, ignore the error\n } else {\n cb?.(error);\n }\n });\n } else {\n this.#flushPending = false;\n cb?.();\n }\n this.off('error', onError);\n };\n\n const onError = (err: Error) => {\n this.#flushPending = false;\n this.off('drain', onDrain);\n cb?.(err);\n };\n\n this.#flushPending = true;\n this.once('drain', onDrain);\n this.once('error', onError);\n\n if (!this.#writing) {\n if (\n this.#lines.length - this.#head > this.#partialLine ||\n this.#output\n ) {\n // There are complete lines or remaining output to write\n this.#writeLine();\n } else {\n // Nothing complete to write, emit drain immediately\n process.nextTick(() => this.emit('drain'));\n }\n }\n }\n }\n\n _writeln(data: string): boolean {\n this.#len += data.length;\n if (!this.#writing && this.#lines.length === this.#head && !this.#output) {\n // Fast path: When no write is pending, directly write the line\n this.#writing = true;\n this.#output = data;\n fs.write(this.#fd, data, this.#onRelease);\n } else {\n this.#lines.push(data);\n if (!this.#writing) {\n this.#writeLine();\n }\n }\n return this.#len < HIGH_WATER_MARK;\n }\n\n _write(data: string): boolean {\n if (this.#destroyed) {\n return false;\n }\n\n // Fast path: For complete lines with no pending partial we can skip the work below\n if (\n this.#partialLine === 0 &&\n data.charCodeAt(data.length - 1) === 10 /*'\\n'*/\n ) {\n return this._writeln(data);\n }\n\n this.#len += data.length;\n\n let startIdx = 0;\n let endIdx = -1;\n while ((endIdx = data.indexOf('\\n', startIdx)) > -1) {\n const line = data.slice(startIdx, endIdx + 1);\n if (this.#partialLine > 0) {\n this.#lines[this.#lines.length - 1] += line;\n } else {\n this.#lines.push(line);\n }\n this.#partialLine = 0;\n startIdx = ++endIdx;\n }\n\n if (startIdx < data.length) {\n const line = data.slice(startIdx);\n if (this.#partialLine > 0) {\n this.#lines[this.#lines.length - 1] += line;\n } else {\n this.#lines.push(data.slice(startIdx));\n }\n this.#partialLine = 1;\n }\n\n if (!this.#writing && this.#lines.length - this.#head > this.#partialLine) {\n this.#writeLine();\n }\n\n return this.#len < HIGH_WATER_MARK;\n }\n\n write(\n buffer: Uint8Array | string,\n cb?: (err?: Error | null) => void\n ): boolean;\n write(\n str: string,\n encoding?: BufferEncoding,\n cb?: (err?: Error | null) => void\n ): boolean;\n\n write(\n input: Uint8Array | string,\n arg2?: BufferEncoding | ((err?: Error | null) => void),\n arg3?: (err?: Error | null) => void\n ): boolean {\n const maybeCb = arg3 || arg2;\n const encoding = typeof arg2 === 'string' ? arg2 : 'utf8';\n const data =\n typeof input === 'string' ? input : Buffer.from(input).toString(encoding);\n const cb = typeof maybeCb === 'function' ? maybeCb : undefined;\n try {\n return this._write(data);\n } finally {\n cb?.();\n }\n }\n\n [Symbol.dispose]() {\n this.destroy();\n }\n}\n\nexport class WritableStreamSink implements EventSink {\n constructor(private readonly stream: NodeJS.WritableStream) {}\n\n get writable() {\n return this.stream.writable !== false;\n }\n\n _writeln(data: string): boolean {\n return this.stream.write(data);\n }\n\n end(cb?: () => void): this {\n this.stream.end(cb);\n return this;\n }\n\n destroy() {\n const stream = this.stream as NodeJS.WritableStream & {\n destroy?: () => void;\n };\n stream.destroy?.();\n }\n}\n\nconst isStdFd = (fd: number) => {\n switch (fd) {\n case 1:\n case 2:\n case process.stdout.fd:\n case process.stderr.fd:\n return true;\n default:\n return false;\n }\n};\n\nconst fsFsync = (\n fd: number,\n cb: (error?: NodeJS.ErrnoException | null) => void\n) => {\n try {\n fs.fsync(fd, cb);\n } catch (error: any) {\n cb(error);\n }\n};\n","import path from 'node:path';\nimport { performance } from 'node:perf_hooks';\n\nimport { eventLogState } from './state';\nimport { writeCompleteEvent, writeEvent } from './utils/logStream';\nimport type { EventLogger, SpanEnd } from './types';\n\nconst NOOP_DONE: SpanEnd<any> = () => {};\n\nexport function events<const Category extends string>(\n category: Category\n): EventLogger<Category> {\n function log(event: string, data: Record<string, unknown>) {\n if (eventLogState.primarySink)\n writeEvent(\n eventLogState.primarySink,\n category,\n event,\n data,\n eventLogState.eventMeta\n );\n }\n\n log.span = function span(_event: string, data: Record<string, unknown>) {\n if (!eventLogState.primarySink) return NOOP_DONE;\n const start = performance.now();\n return function done(event: string, endData: Record<string, unknown>) {\n if (!eventLogState.primarySink) return;\n writeCompleteEvent(\n eventLogState.primarySink,\n category,\n event,\n data,\n endData,\n performance.now() - start,\n eventLogState.eventMeta\n );\n };\n };\n\n log.path = function relativePath(\n target: string | undefined | null\n ): string | null {\n try {\n return target != null && path.isAbsolute(target)\n ? path.relative(eventLogState.logPath, target).replace(/\\\\/g, '/') ||\n '.'\n : (target ?? null);\n } catch {\n return target || null;\n }\n };\n\n log.category = category;\n return log as EventLogger<Category>;\n}\n","import { isMainThread, threadId } from 'node:worker_threads';\n\nimport { INTERNAL_PROCESS_ORIGIN_ENV } from '../constants';\n\nconst LOCAL_PROCESS_ORIGIN = Symbol.for('@expo/event-log/process-origin');\n\ninterface EventLogGlobal {\n [LOCAL_PROCESS_ORIGIN]?: string;\n}\n\nexport interface ProcessOrigin {\n kind: 'worker_thread' | 'event_log_child' | 'child_process';\n id: string;\n}\n\nexport function setLocalProcessOrigin(id: string | undefined) {\n const globalScope = globalThis as EventLogGlobal;\n if (id) globalScope[LOCAL_PROCESS_ORIGIN] = id;\n else delete globalScope[LOCAL_PROCESS_ORIGIN];\n}\n\nexport function getProcessOrigin(): ProcessOrigin | null {\n if (!isMainThread) {\n return { kind: 'worker_thread', id: String(threadId) };\n }\n\n const localOrigin = (globalThis as EventLogGlobal)[LOCAL_PROCESS_ORIGIN];\n const inheritedOrigin = process.env[INTERNAL_PROCESS_ORIGIN_ENV];\n if (inheritedOrigin && inheritedOrigin !== localOrigin) {\n return {\n kind: 'event_log_child',\n id: inheritedOrigin,\n };\n }\n\n if (process.env.NODE_UNIQUE_ID) {\n return { kind: 'child_process', id: process.env.NODE_UNIQUE_ID };\n }\n\n return null;\n}\n\nexport function getProcessWorkerId() {\n const origin = getProcessOrigin();\n return origin ? `${origin.kind}:${origin.id}` : undefined;\n}\n","import net from 'node:net';\n\nimport type { EventSink } from './logStream';\n\nconst CONNECT_RETRY_MS = 50;\nconst MAX_CONNECT_RETRY_MS = 750;\n\nexport interface IpcSinkOptions {\n retryMs?: number;\n maxRetryMs?: number;\n}\n\nexport class IpcSink implements EventSink {\n #socket: net.Socket | null = null;\n #connected = false;\n #destroyed = false;\n #retrying = false;\n #lines: string[] = [];\n readonly #startedAt = Date.now();\n readonly #retryMs: number;\n readonly #maxRetryMs: number;\n\n constructor(\n private readonly socketPath: string,\n options: IpcSinkOptions = {}\n ) {\n this.#retryMs = options.retryMs ?? CONNECT_RETRY_MS;\n this.#maxRetryMs = options.maxRetryMs ?? MAX_CONNECT_RETRY_MS;\n this.#connect();\n }\n\n get writable() {\n return !this.#destroyed;\n }\n\n _writeln(line: string): boolean {\n if (this.#destroyed) return false;\n if (this.#connected && this.#socket) return this.#socket.write(line);\n\n this.#lines.push(line);\n return false;\n }\n\n end(cb?: () => void): this {\n this.destroy();\n cb?.();\n return this;\n }\n\n destroy() {\n this.#destroyed = true;\n this.#lines.length = 0;\n this.#socket?.destroy();\n }\n\n #connect() {\n if (this.#destroyed || this.#connected) return;\n if (Date.now() - this.#startedAt > this.#maxRetryMs) {\n this.destroy();\n return;\n }\n\n const socket = net.connect(this.socketPath);\n this.#socket = socket;\n\n socket.once('connect', () => {\n this.#retrying = false;\n this.#connected = true;\n for (const line of this.#lines.splice(0)) socket.write(line);\n });\n\n socket.once('error', () => {\n if (this.#connected) return;\n socket.destroy();\n this.#retry();\n });\n socket.once('close', () => {\n if (this.#destroyed) return;\n this.#connected = false;\n if (this.#socket === socket) this.#socket = null;\n this.#retry();\n });\n }\n\n #retry() {\n if (this.#retrying || this.#destroyed) return;\n this.#retrying = true;\n setTimeout(() => {\n this.#retrying = false;\n this.#connect();\n }, this.#retryMs);\n }\n}\n","const PROCESS_CLEANUP = Symbol.for('@expo/event-log/process-cleanup');\n\ninterface EventLogGlobal {\n [PROCESS_CLEANUP]?: ProcessCleanupState;\n}\n\ninterface ProcessCleanupState {\n registered: boolean;\n callbacks: Set<() => void>;\n}\n\nexport function registerProcessCleanup(callback: () => void) {\n const cleanup = getProcessCleanupState();\n cleanup.callbacks.add(callback);\n if (cleanup.registered) return;\n cleanup.registered = true;\n\n process.once('exit', runProcessCleanup);\n for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP'] as const) {\n process.once(signal, () => {\n runProcessCleanup();\n process.kill(process.pid, signal);\n });\n }\n}\n\nfunction getProcessCleanupState() {\n const globalScope = globalThis as EventLogGlobal;\n return (globalScope[PROCESS_CLEANUP] ??= {\n registered: false,\n callbacks: new Set(),\n });\n}\n\nfunction runProcessCleanup() {\n for (const callback of getProcessCleanupState().callbacks) {\n try {\n callback();\n } catch {}\n }\n}\n","import net from 'node:net';\n\nexport function listenUnixSocket(server: net.Server, socketPath: string) {\n let closed = false;\n let listening = false;\n let shouldClose = false;\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","import fs from 'node:fs';\nimport path from 'node:path';\nimport net from 'node:net';\nimport { createInterface } from 'node:readline';\n\nimport { events } from './api';\nimport {\n DEFAULT_SEGMENTS,\n DEFAULT_SEGMENT_SIZE,\n EVENT_LOG_FORMAT_VERSION,\n INTERNAL_IPC_ENV,\n INTERNAL_PROCESS_ORIGIN_ENV,\n LOG_EVENTS_ENV,\n SESSION_FILES,\n} from './constants';\nimport { cleanStaleSessionsSync, getSessionBaseDir } from './clean';\nimport {\n setEventLoggerInfo,\n setEventMeta,\n setLogPath,\n setPrimarySink,\n eventLogState,\n writeRawLine,\n type EventLoggerInfo,\n} from './state';\nimport {\n LogStream,\n WritableStreamSink,\n type EventSink,\n} from './utils/logStream';\nimport {\n getProcessOrigin,\n getProcessWorkerId,\n setLocalProcessOrigin,\n} from './utils/processOrigin';\nimport { redirectConsoleForFd } from './utils/redirectConsole';\nimport { IpcSink } from './utils/ipcSink';\nimport { registerProcessCleanup } from './utils/processExit';\nimport { listenUnixSocket } from './utils/socketServer';\n\nexport type { EventLoggerInfo } from './state';\n\nexport interface SessionOptions {\n command?: string;\n version?: string;\n maxSegments?: number;\n maxSegmentSize?: number;\n}\n\nexport interface SessionMeta {\n pid: number;\n formatVersion: number;\n startedAt: number;\n command: string;\n cwd: string;\n maxSegments: number;\n version?: string;\n socket: string;\n ipcSocket: string;\n origin: {\n argv: string[];\n execPath: string;\n cwd: string;\n ppid?: number;\n env?: {\n npmLifecycleEvent?: string;\n npmExecPath?: string;\n npmPackageName?: string;\n };\n };\n}\n\nexport interface SessionContext {\n sessionDir: string;\n meta: SessionMeta;\n sink: EventSink;\n destroy(): void;\n}\n\ninterface CreateSessionOptions extends SessionOptions {\n onWorkerLine(line: string): void;\n}\n\nexport interface InstallEventLoggerOptions extends SessionOptions {}\n\nlet session: SessionContext | undefined;\n\nconst rootEvent = events('root');\n\nexport function installEventLogger(\n targetOrOptions?: string | number | InstallEventLoggerOptions\n): void {\n if (eventLogState.primarySink) return;\n\n const explicitTarget =\n parseLogTarget(process.env[LOG_EVENTS_ENV]) ??\n parseLogTarget(\n typeof targetOrOptions === 'string' || typeof targetOrOptions === 'number'\n ? targetOrOptions\n : undefined\n );\n\n if (explicitTarget != null) {\n if (typeof explicitTarget === 'number')\n redirectConsoleForFd(explicitTarget);\n setEventLoggerInfo(getExplicitTargetInfo(explicitTarget));\n activateSink(new LogStream(explicitTarget));\n return;\n }\n\n const ipcPath = process.env[INTERNAL_IPC_ENV];\n if (ipcPath) {\n connectToParent(ipcPath);\n return;\n }\n\n if (targetOrOptions && typeof targetOrOptions === 'object') {\n session = createSession({\n ...targetOrOptions,\n onWorkerLine: writeRawLine,\n });\n setLogPath(session.sessionDir);\n setEventLoggerInfo({\n destination: 'session',\n isUserVisibleOutput: false,\n sessionDir: session.sessionDir,\n });\n activateSink(session.sink, targetOrOptions.version);\n return;\n }\n}\n\nexport const isEventLoggerActive = () =>\n eventLogState.primarySink?.writable ? eventLogState.eventLoggerInfo : null;\n\nexport function createSession(options: CreateSessionOptions): SessionContext {\n cleanStaleSessionsSync();\n\n const baseDir = getSessionBaseDir();\n const sessionDir = path.join(baseDir, String(process.pid));\n fs.rmSync(sessionDir, { recursive: true, force: true });\n fs.mkdirSync(sessionDir, { recursive: true });\n\n const maxSegments = options.maxSegments ?? DEFAULT_SEGMENTS;\n const maxSegmentSize = options.maxSegmentSize ?? DEFAULT_SEGMENT_SIZE;\n const liveSocket = path.join(sessionDir, SESSION_FILES.liveSocket);\n const ipcSocket = path.join(sessionDir, SESSION_FILES.ipcSocket);\n\n const fileStream = new LogStream(path.join(sessionDir, '0.jsonl'));\n const clients = new Set<EventSink>();\n let bytesWritten = 0;\n let destroyed = false;\n\n fileStream.on('write', written => {\n bytesWritten += written;\n if (bytesWritten < maxSegmentSize) return;\n bytesWritten = 0;\n rotateSegments(sessionDir, maxSegments);\n fileStream.reopen();\n });\n\n const liveServer = net.createServer(socket => {\n const sink = createSocketSink(socket);\n clients.add(sink);\n socket.on('close', () => {\n clients.delete(sink);\n sink.destroy();\n });\n socket.on('error', () => {\n clients.delete(sink);\n sink.destroy();\n socket.destroy();\n });\n });\n\n const ipcServer = net.createServer(socket => {\n const rl = createInterface({ input: socket });\n rl.on('line', options.onWorkerLine);\n socket.on('close', () => rl.close());\n socket.on('error', () => rl.close());\n });\n\n const closeLiveServer = listenUnixSocket(liveServer, liveSocket);\n const closeIpcServer = listenUnixSocket(ipcServer, ipcSocket);\n const processOrigin = String(process.pid);\n process.env[INTERNAL_IPC_ENV] = ipcSocket;\n process.env[INTERNAL_PROCESS_ORIGIN_ENV] = processOrigin;\n setLocalProcessOrigin(processOrigin);\n\n const meta: SessionMeta = {\n pid: process.pid,\n formatVersion: EVENT_LOG_FORMAT_VERSION,\n startedAt: Date.now(),\n command: options.command ?? process.argv.slice(1).join(' '),\n cwd: process.cwd(),\n maxSegments,\n version: options.version,\n socket: SESSION_FILES.liveSocket,\n ipcSocket: SESSION_FILES.ipcSocket,\n origin: createSessionOrigin(),\n };\n writeJsonAtomic(path.join(sessionDir, SESSION_FILES.meta), meta);\n\n const sink: EventSink = {\n get writable() {\n return fileStream.writable;\n },\n get file() {\n return fileStream.file;\n },\n _writeln(line: string) {\n const writable = fileStream._writeln(line);\n for (const client of clients) client._writeln(line);\n return writable;\n },\n end(cb?: () => void) {\n fileStream.end(cb);\n for (const client of clients) client.end();\n return this;\n },\n destroy() {\n fileStream.destroy();\n for (const client of clients) client.destroy();\n },\n };\n\n const destroy = () => {\n if (destroyed) return;\n destroyed = true;\n sink.destroy();\n closeLiveServer();\n closeIpcServer();\n fs.rmSync(liveSocket, { force: true });\n fs.rmSync(ipcSocket, { force: true });\n if (process.env[INTERNAL_IPC_ENV] === ipcSocket)\n delete process.env[INTERNAL_IPC_ENV];\n if (process.env[INTERNAL_PROCESS_ORIGIN_ENV] === processOrigin)\n delete process.env[INTERNAL_PROCESS_ORIGIN_ENV];\n setLocalProcessOrigin(undefined);\n };\n\n registerProcessCleanup(destroy);\n\n return { sessionDir, meta, sink, destroy };\n}\n\nfunction parseLogTarget(target: string | number | undefined) {\n if (typeof target === 'number') {\n return Number.isSafeInteger(target) && target > 0 ? target : undefined;\n }\n\n if (!target) return undefined;\n\n const fd = parseInt(target, 10);\n if (`${fd}` === target && fd > 0 && Number.isSafeInteger(fd)) return fd;\n\n try {\n const parsedPath = path.parse(target);\n const destination = path.format(parsedPath);\n setLogPath(parsedPath.dir || process.cwd());\n return destination;\n } catch {\n return undefined;\n }\n}\n\nfunction getExplicitTargetInfo(target: string | number): EventLoggerInfo {\n if (typeof target === 'number') {\n return {\n destination: target === 1 ? 'stdout' : target === 2 ? 'stderr' : 'fd',\n isUserVisibleOutput: target === 1 || target === 2,\n fd: target,\n };\n }\n\n return {\n destination: 'file',\n isUserVisibleOutput: false,\n file: target,\n };\n}\n\nfunction getInitMetadata(version?: string) {\n return {\n format: 'v0-jsonl',\n formatVersion: EVENT_LOG_FORMAT_VERSION,\n version: version ?? 'UNVERSIONED',\n processOrigin: getProcessOrigin() ?? undefined,\n };\n}\n\nfunction activateSink(sink: EventSink, version?: string) {\n setPrimarySink(sink);\n rootEvent('init', getInitMetadata(version));\n}\n\nfunction connectToParent(ipcPath: string) {\n const workerId = getProcessWorkerId();\n if (workerId) setEventMeta({ _w: workerId });\n\n const sink = new IpcSink(ipcPath);\n setPrimarySink(sink);\n setEventLoggerInfo({\n destination: 'ipc',\n isUserVisibleOutput: false,\n });\n rootEvent('init', getInitMetadata());\n}\n\nfunction rotateSegments(sessionDir: string, maxSegments: number) {\n fs.rmSync(path.join(sessionDir, `${maxSegments - 1}.jsonl`), { force: true });\n for (let i = maxSegments - 1; i >= 1; i--) {\n const from = path.join(sessionDir, `${i - 1}.jsonl`);\n const to = path.join(sessionDir, `${i}.jsonl`);\n try {\n fs.renameSync(from, to);\n } catch {}\n }\n}\n\nfunction createSocketSink(socket: net.Socket): EventSink {\n const fd = (socket as any)._handle?.fd;\n if (typeof fd === 'number' && fd >= 0)\n return new LogStream(fd, { closeFd: false });\n return new WritableStreamSink(socket);\n}\n\nfunction writeJsonAtomic(file: string, data: unknown) {\n const tmp = `${file}.${process.pid}.tmp`;\n fs.writeFileSync(tmp, JSON.stringify(data, null, 2));\n fs.renameSync(tmp, file);\n}\n\nfunction createSessionOrigin(): SessionMeta['origin'] {\n const env = {\n npmLifecycleEvent: process.env.npm_lifecycle_event,\n npmExecPath: process.env.npm_execpath,\n npmPackageName: process.env.npm_package_name,\n };\n return {\n argv: process.argv.slice(1),\n execPath: process.execPath,\n cwd: process.cwd(),\n ppid: process.ppid || undefined,\n env: Object.values(env).some(Boolean) ? env : undefined,\n };\n}\n"],"names":["STATE_SYMBOL","Symbol","for","EVENT_LOG_STATE_VERSION","eventLogState","getEventLogState","globalScope","globalThis","logPath","process","cwd","eventLoggerInfo","setLogPath","path","setPrimarySink","sink","primarySink","setEventLoggerInfo","info","writeRawLine","line","out","endsWith","_writeln","HIGH_WATER_MARK","TIME_ORIGIN","performance","timeOrigin","cachedWorkerId","cachedWorkerIdJson","writeEvent","dest","category","kind","payload","meta","serializeEvent","duration","timestamp","getEventTimestamp","_w","rest","JSON","stringify","slice","length","stringifyWorkerId","appendPayload","writeCompleteEvent","startPayload","endPayload","delta","appendMergedPayload","endKeys","Set","Object","keys","key","has","value","undefined","now","workerId","LogStream","EventEmitter","fd","file","oldFd","closeFd","writing","ending","flushPending","destroyed","opening","reopening","output","len","lines","head","partialLine","onRelease","#onRelease","err","written","this","release","constructor","options","super","fs","fsyncSync","nextTick","emit","openFile","writable","reopen","Error","once","error","code","setTimeout","writeLine","close","Buffer","byteLength","from","toString","onOpened","isStdFd","fsFsync","mkdir","dirname","recursive","open","onClose","end","write","_end","arg1","arg2","arg3","maybeCb","input","cb","destroy","flush","onDrain","off","onError","data","push","_write","charCodeAt","startIdx","endIdx","indexOf","encoding","dispose","WritableStreamSink","stream","stdout","stderr","fsync","NOOP_DONE","events","log","event","eventMeta","span","_event","start","done","endData","relativePath","target","isAbsolute","relative","replace","LOCAL_PROCESS_ORIGIN","setLocalProcessOrigin","id","getProcessOrigin","isMainThread","String","threadId","localOrigin","inheritedOrigin","env","INTERNAL_PROCESS_ORIGIN_ENV","NODE_UNIQUE_ID","IpcSink","socket","connected","retrying","startedAt","Date","retryMs","maxRetryMs","socketPath","connect","net","splice","retry","PROCESS_CLEANUP","getProcessCleanupState","registered","callbacks","runProcessCleanup","callback","listenUnixSocket","server","closed","listening","shouldClose","on","listen","session","rootEvent","parseLogTarget","Number","isSafeInteger","parseInt","parsedPath","parse","destination","format","dir","getInitMetadata","version","formatVersion","EVENT_LOG_FORMAT_VERSION","processOrigin","activateSink","createSessionOrigin","npmLifecycleEvent","npm_lifecycle_event","npmExecPath","npm_execpath","npmPackageName","npm_package_name","argv","execPath","ppid","values","some","Boolean","installEventLogger","targetOrOptions","explicitTarget","LOG_EVENTS_ENV","redirectConsoleForFd","getExplicitTargetInfo","isUserVisibleOutput","ipcPath","INTERNAL_IPC_ENV","connectToParent","getProcessWorkerId","origin","setEventMeta","createSession","cleanStaleSessionsSync","baseDir","getSessionBaseDir","sessionDir","join","pid","rmSync","force","mkdirSync","maxSegments","DEFAULT_SEGMENTS","maxSegmentSize","DEFAULT_SEGMENT_SIZE","liveSocket","SESSION_FILES","ipcSocket","fileStream","clients","bytesWritten","rotateSegments","i","to","renameSync","liveServer","createServer","createSocketSink","_handle","add","delete","ipcServer","rl","createInterface","onWorkerLine","closeLiveServer","closeIpcServer","command","writeJsonAtomic","tmp","writeFileSync","client","registerProcessCleanup","cleanup","signal","kill","isEventLoggerActive"],"mappings":"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"}
|