@peac/capture-node 0.10.12
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/LICENSE +190 -0
- package/README.md +97 -0
- package/dist/errors.d.ts +43 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/fs-dedupe-index.d.ts +58 -0
- package/dist/fs-dedupe-index.d.ts.map +1 -0
- package/dist/fs-spool-store.d.ts +167 -0
- package/dist/fs-spool-store.d.ts.map +1 -0
- package/dist/index.cjs +864 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +833 -0
- package/dist/index.mjs.map +1 -0
- package/dist/line-reader.d.ts +56 -0
- package/dist/line-reader.d.ts.map +1 -0
- package/dist/lockfile.d.ts +27 -0
- package/dist/lockfile.d.ts.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/lockfile.ts","../src/line-reader.ts","../src/fs-spool-store.ts","../src/fs-dedupe-index.ts"],"names":["fs","stat","hostname","createReadStream","GENESIS_DIGEST","path","fs2","fs3","path2"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @peac/capture-node - Error Types\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Why the spool was marked corrupt. Exposed in SpoolDiagnostics.corruptReason.\n */\nexport type CorruptReason = 'CHAIN_BROKEN' | 'MALFORMED_JSON' | 'LINE_TOO_LARGE';\n\n// =============================================================================\n// Errors\n// =============================================================================\n\n/**\n * Thrown when a spool reaches its hard-cap limits (maxEntries or maxFileBytes).\n *\n * CaptureSession catches this and returns E_CAPTURE_STORE_FAILED.\n * The adapter stays running (hooks fire, tools work) -- only new captures are blocked.\n */\nexport class SpoolFullError extends Error {\n readonly code = 'E_SPOOL_FULL' as const;\n\n constructor(\n readonly current: number,\n readonly max: number,\n readonly unit: 'entries' | 'bytes'\n ) {\n super(`Spool full: ${current}/${max} ${unit}`);\n this.name = 'SpoolFullError';\n }\n}\n\n/**\n * Thrown when spool corruption is detected (linkage, malformed JSON, oversized line).\n *\n * Blocks new appends. Tools still work so the user can export/inspect\n * salvageable data. Operator must take explicit action to clear/reset.\n */\nexport class SpoolCorruptError extends Error {\n readonly code = 'E_SPOOL_CORRUPT' as const;\n\n constructor(\n readonly reason: CorruptReason,\n readonly corruptAtSequence?: number,\n readonly details?: string\n ) {\n super(\n `Spool corrupt: ${reason}` +\n (corruptAtSequence !== undefined ? ` at sequence ${corruptAtSequence}` : '') +\n (details ? ` -- ${details}` : '')\n );\n this.name = 'SpoolCorruptError';\n }\n}\n\n/**\n * Thrown when a lockfile cannot be acquired (another instance holds it).\n */\nexport class LockfileError extends Error {\n readonly code = 'E_LOCKFILE' as const;\n\n constructor(\n readonly lockPath: string,\n readonly holderPid?: number\n ) {\n const pidInfo = holderPid !== undefined ? ` PID: ${holderPid}.` : '';\n super(\n `Another PEAC instance holds the lock.${pidInfo} If stale, delete ${lockPath} or set allowStaleLockBreak: true`\n );\n this.name = 'LockfileError';\n }\n}\n","/**\n * @peac/capture-node - Lockfile\n *\n * Single-writer guard using exclusive file creation (O_CREAT | O_EXCL).\n * Default: fail loudly if lock exists. Stale lock break is opt-in only.\n */\n\nimport * as fs from 'node:fs/promises';\nimport { hostname } from 'node:os';\nimport { LockfileError } from './errors.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface LockOptions {\n /** Allow breaking stale locks. Default: false (conservative). */\n allowStaleLockBreak?: boolean;\n /** Max age in ms before a lock is considered stale. Default: 3600000 (1 hour). */\n staleLockMaxAgeMs?: number;\n}\n\ninterface LockPayload {\n pid: number;\n startTime: number;\n hostname: string;\n createdAt: string;\n}\n\nexport interface LockHandle {\n /** Path to the lockfile. */\n lockPath: string;\n /** Release the lock (deletes the lockfile). */\n release(): Promise<void>;\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Acquire an exclusive lockfile.\n *\n * Uses `fs.writeFile` with `wx` flag (O_CREAT | O_EXCL) for atomic creation.\n * If the lock already exists, either fail loudly (default) or attempt stale\n * lock break (opt-in).\n */\nexport async function acquireLock(filePath: string, options?: LockOptions): Promise<LockHandle> {\n const lockPath = filePath + '.lock';\n const allowStaleBreak = options?.allowStaleLockBreak ?? false;\n const staleMaxAge = options?.staleLockMaxAgeMs ?? 3_600_000;\n\n const payload: LockPayload = {\n pid: process.pid,\n startTime: Date.now(),\n hostname: getHostname(),\n createdAt: new Date().toISOString(),\n };\n\n try {\n // Atomic exclusive create -- fails if file exists\n await fs.writeFile(lockPath, JSON.stringify(payload, null, 2) + '\\n', {\n flag: 'wx',\n mode: 0o644,\n });\n } catch (err: unknown) {\n if (!isEnoent(err) && isEexist(err)) {\n // Lock file exists -- attempt stale break if allowed\n if (allowStaleBreak) {\n const broke = await tryBreakStaleLock(lockPath, staleMaxAge);\n if (broke) {\n // Retry after breaking stale lock\n try {\n await fs.writeFile(lockPath, JSON.stringify(payload, null, 2) + '\\n', {\n flag: 'wx',\n mode: 0o644,\n });\n } catch (retryErr: unknown) {\n if (isEexist(retryErr)) {\n // Race: another process grabbed it between break and retry\n const holder = await readLockHolder(lockPath);\n throw new LockfileError(lockPath, holder?.pid);\n }\n throw retryErr;\n }\n } else {\n // Lock is not stale -- fail\n const holder = await readLockHolder(lockPath);\n throw new LockfileError(lockPath, holder?.pid);\n }\n } else {\n // Conservative mode: fail loudly\n const holder = await readLockHolder(lockPath);\n throw new LockfileError(lockPath, holder?.pid);\n }\n } else {\n // Unexpected error (permissions, disk full, etc.)\n throw err;\n }\n }\n\n let released = false;\n return {\n lockPath,\n async release() {\n if (released) return;\n released = true;\n try {\n await fs.unlink(lockPath);\n } catch {\n // Ignore unlink errors on release (lockfile may already be gone)\n }\n },\n };\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Read the lock holder info from the lockfile.\n */\nasync function readLockHolder(lockPath: string): Promise<LockPayload | undefined> {\n try {\n const content = await fs.readFile(lockPath, 'utf-8');\n return JSON.parse(content) as LockPayload;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Attempt to break a stale lock.\n *\n * A lock is stale if its age exceeds staleLockMaxAgeMs.\n * Returns true if the lock was broken.\n */\nasync function tryBreakStaleLock(lockPath: string, maxAgeMs: number): Promise<boolean> {\n try {\n const stat = await fs.stat(lockPath);\n const ageMs = Date.now() - stat.mtimeMs;\n\n if (ageMs > maxAgeMs) {\n await fs.unlink(lockPath);\n return true;\n }\n\n return false;\n } catch {\n // If we can't stat the lock (e.g., it was just removed), treat as broken\n return true;\n }\n}\n\nfunction getHostname(): string {\n try {\n return hostname();\n } catch {\n return 'unknown';\n }\n}\n\nfunction isEexist(err: unknown): boolean {\n return (err as NodeJS.ErrnoException)?.code === 'EEXIST';\n}\n\nfunction isEnoent(err: unknown): boolean {\n return (err as NodeJS.ErrnoException)?.code === 'ENOENT';\n}\n","/**\n * @peac/capture-node - Streaming Line Reader\n *\n * Custom streaming line parser that enforces maxLineBytes BEFORE\n * materializing the line as a JS string. Prevents memory blowup from\n * a single gigantic line -- the primary \"local file DoS\" vector.\n *\n * Used by both FsSpoolStore.read() and FsSpoolStore.fullScan().\n *\n * Design notes:\n * - Splits on \\n (0x0a). Trailing \\r is stripped before yielding (CRLF safe).\n * - Once a line exceeds maxLineBytes, buffered chunks are freed immediately\n * and accumulatedBytes is capped at maxLineBytes+1 to avoid huge counters\n * on pathological files.\n */\n\nimport { createReadStream } from 'node:fs';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface LineReaderOptions {\n /** Path to the file to read. */\n filePath: string;\n /** Maximum line length in bytes. Lines exceeding this trigger onLineTooLarge. */\n maxLineBytes: number;\n /** Read buffer size. Default: 64KB. */\n highWaterMark?: number;\n}\n\n/**\n * Result of reading a line.\n */\nexport type LineResult =\n | { kind: 'line'; line: string; byteOffset: number; byteLength: number }\n | { kind: 'line_too_large'; byteOffset: number; accumulatedBytes: number }\n | { kind: 'incomplete_tail'; line: string; byteOffset: number; byteLength: number };\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Strip a single trailing \\r from a buffer (CRLF -> LF normalization).\n * Returns the same buffer if no trailing \\r.\n */\nfunction stripTrailingCR(buf: Buffer): Buffer {\n if (buf.length > 0 && buf[buf.length - 1] === 0x0d) {\n return buf.subarray(0, buf.length - 1);\n }\n return buf;\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Stream lines from a file with pre-materialization size enforcement.\n *\n * Yields LineResult for each line. The caller decides how to handle each case:\n * - 'line': a complete, size-safe line (without trailing newline or \\r)\n * - 'line_too_large': a line that exceeded maxLineBytes (bytes were NOT materialized)\n * - 'incomplete_tail': the last line had no trailing newline (potential crash artifact)\n */\nexport async function* streamLines(options: LineReaderOptions): AsyncGenerator<LineResult> {\n const { filePath, maxLineBytes, highWaterMark = 64 * 1024 } = options;\n\n const stream = createReadStream(filePath, { highWaterMark });\n\n // Accumulate bytes for the current line\n let chunks: Buffer[] = [];\n let accumulatedBytes = 0;\n let lineStartOffset = 0;\n let fileOffset = 0;\n let lineTooLarge = false;\n\n try {\n for await (const rawChunk of stream) {\n const chunk = Buffer.isBuffer(rawChunk) ? rawChunk : Buffer.from(rawChunk);\n\n let chunkOffset = 0;\n\n while (chunkOffset < chunk.length) {\n const newlineIndex = chunk.indexOf(0x0a, chunkOffset); // '\\n'\n\n if (newlineIndex === -1) {\n // No newline in remaining chunk -- accumulate\n const remainder = chunk.subarray(chunkOffset);\n accumulatedBytes += remainder.length;\n\n if (accumulatedBytes > maxLineBytes) {\n if (!lineTooLarge) {\n // First time exceeding: free buffered chunks immediately\n chunks = [];\n lineTooLarge = true;\n }\n // Cap counter to avoid huge values on pathological files\n accumulatedBytes = maxLineBytes + 1;\n } else {\n chunks.push(Buffer.from(remainder));\n }\n\n fileOffset += remainder.length;\n chunkOffset = chunk.length;\n } else {\n // Found newline -- complete the line\n const segment = chunk.subarray(chunkOffset, newlineIndex);\n const segmentLength = segment.length;\n accumulatedBytes += segmentLength;\n\n if (lineTooLarge || accumulatedBytes > maxLineBytes) {\n // Line exceeded maxLineBytes -- yield error without materializing string\n yield {\n kind: 'line_too_large',\n byteOffset: lineStartOffset,\n accumulatedBytes: lineTooLarge ? maxLineBytes + 1 : accumulatedBytes,\n };\n } else {\n // Safe to materialize -- combine chunks into string\n chunks.push(Buffer.from(segment));\n let lineBuffer = chunks.length === 1 ? chunks[0]! : Buffer.concat(chunks);\n // Strip trailing \\r (CRLF normalization)\n lineBuffer = stripTrailingCR(lineBuffer);\n const line = lineBuffer.toString('utf-8');\n\n yield {\n kind: 'line',\n line,\n byteOffset: lineStartOffset,\n byteLength: accumulatedBytes,\n };\n }\n\n // Reset for next line\n // +1 for the newline character itself\n fileOffset += segmentLength + 1;\n lineStartOffset = fileOffset;\n chunks = [];\n accumulatedBytes = 0;\n lineTooLarge = false;\n chunkOffset = newlineIndex + 1;\n }\n }\n }\n\n // Handle remaining data (no trailing newline = incomplete tail)\n if (accumulatedBytes > 0) {\n if (lineTooLarge || accumulatedBytes > maxLineBytes) {\n yield {\n kind: 'line_too_large',\n byteOffset: lineStartOffset,\n accumulatedBytes: lineTooLarge ? maxLineBytes + 1 : accumulatedBytes,\n };\n } else {\n let lineBuffer = chunks.length === 1 ? chunks[0]! : Buffer.concat(chunks);\n // Strip trailing \\r (CRLF normalization)\n lineBuffer = stripTrailingCR(lineBuffer);\n const line = lineBuffer.toString('utf-8');\n\n yield {\n kind: 'incomplete_tail',\n line,\n byteOffset: lineStartOffset,\n byteLength: accumulatedBytes,\n };\n }\n }\n } finally {\n stream.destroy();\n }\n}\n\n/**\n * Truncate a file to a specific byte offset.\n * Used for crash recovery: truncate to last valid newline.\n */\nexport async function truncateFile(filePath: string, byteOffset: number): Promise<void> {\n const { truncate } = await import('node:fs/promises');\n await truncate(filePath, byteOffset);\n}\n","/**\n * @peac/capture-node - Filesystem Spool Store\n *\n * Append-only JSONL spool with tamper-evident chaining.\n * Production-grade: crash recovery, hard-cap limits, streaming reads,\n * single-writer lockfile, meta file for fast startup, max line guard.\n *\n * Durability model:\n * append() writes without fsync (throughput).\n * commit() fsyncs (durability).\n * Auto-commit timer (default 5s) prevents unflushed windows.\n *\n * Commit ordering (when used with dedupe):\n * Spool commit first, dedupe commit second (best-effort).\n * Spool is the authoritative evidence log; dedupe is an optimization index.\n * If dedupe.commit() fails after spool.commit(), worst case is re-emitting\n * some receipts after restart -- no evidence is lost.\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SpoolStore, SpoolEntry } from '@peac/capture-core';\nimport { GENESIS_DIGEST } from '@peac/capture-core';\nimport { SpoolFullError, SpoolCorruptError } from './errors.js';\nimport type { CorruptReason } from './errors.js';\nimport { acquireLock, type LockOptions, type LockHandle } from './lockfile.js';\nimport { streamLines, truncateFile } from './line-reader.js';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Meta file format version. Reject unknown versions on load. */\nconst META_VERSION = 1;\n\n/** Max line length in bytes during read(). Lines exceeding this = corrupt. */\nconst DEFAULT_MAX_LINE_BYTES = 4 * 1024 * 1024; // 4MB\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface FsSpoolStoreOptions {\n /** Path to spool.jsonl. */\n filePath: string;\n /** Maximum entries before spool is full. Default: 100_000. */\n maxEntries?: number;\n /** Maximum file size in bytes before spool is full. Default: 100MB. */\n maxFileBytes?: number;\n /** Maximum allowed line length in bytes during read(). Default: 4MB. */\n maxLineBytes?: number;\n /** Auto-commit interval in ms. Default: 5000 (5s). 0 = disabled. */\n autoCommitIntervalMs?: number;\n /** Lockfile options. */\n lockOptions?: LockOptions;\n /** Warning callback (crash recovery, stale lock, etc.). */\n onWarning?: (msg: string) => void;\n}\n\ninterface SpoolMeta {\n metaVersion: number;\n sequence: number;\n headDigest: string;\n entryCount: number;\n fileBytes: number;\n mtimeMs: number;\n}\n\n/**\n * Diagnostic snapshot for operator tooling (e.g. /peac-status).\n *\n * Queryable without parsing error strings. Use `getFsSpoolDiagnostics()`\n * or access `store.diagnostics()` on the concrete type.\n */\nexport interface SpoolDiagnostics {\n /** Operational mode: 'active' = capturing, 'read_only' = full/corrupt. */\n mode: 'active' | 'read_only';\n /** Whether the spool has reached its hard-cap limit. */\n spoolFull: boolean;\n /** Whether linkage corruption was detected on load. */\n spoolCorrupt: boolean;\n /** Why the spool was marked corrupt. Only set when spoolCorrupt is true. */\n corruptReason?: CorruptReason;\n /** Sequence number where corruption was detected. */\n corruptAtSequence?: number;\n /** Current entry count. */\n entryCount: number;\n /** Current file size in bytes. */\n fileBytes: number;\n /** Configured max entries. */\n maxEntries: number;\n /** Configured max file bytes. */\n maxFileBytes: number;\n /** Path to the spool file. */\n filePath: string;\n}\n\n// =============================================================================\n// Factory\n// =============================================================================\n\n/**\n * Create a filesystem-backed spool store.\n *\n * Acquires a single-writer lockfile, loads existing data (or recovers from\n * crash), and returns a SpoolStore ready for use.\n */\nexport async function createFsSpoolStore(options: FsSpoolStoreOptions): Promise<FsSpoolStore> {\n const store = new FsSpoolStore(options);\n await store.init();\n return store;\n}\n\n// =============================================================================\n// Diagnostics Helper\n// =============================================================================\n\n/**\n * Get spool diagnostics from a SpoolStore via type guard.\n *\n * Usage:\n * const diag = getFsSpoolDiagnostics(store);\n * if (diag) { // store is FsSpoolStore }\n */\nexport function getFsSpoolDiagnostics(store: SpoolStore): SpoolDiagnostics | undefined {\n if (\n store !== null &&\n typeof store === 'object' &&\n 'diagnostics' in store &&\n typeof (store as Record<string, unknown>).diagnostics === 'function'\n ) {\n return (store as FsSpoolStore).diagnostics();\n }\n return undefined;\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\nexport class FsSpoolStore implements SpoolStore {\n private readonly filePath: string;\n private readonly metaPath: string;\n private readonly maxEntries: number;\n private readonly maxFileBytes: number;\n private readonly maxLineBytes: number;\n private readonly autoCommitIntervalMs: number;\n private readonly lockOptions: LockOptions | undefined;\n private readonly onWarning: (msg: string) => void;\n\n // In-memory state (loaded on init, updated on append)\n private sequence: number = 0;\n private headDigest: string = GENESIS_DIGEST;\n private entryCount: number = 0;\n private fileBytes: number = 0;\n\n // File handle for appending\n private fd: fs.FileHandle | null = null;\n private lock: LockHandle | null = null;\n private closed: boolean = false;\n private corrupt: boolean = false;\n private corruptReason: CorruptReason | undefined;\n private corruptAtSequence: number | undefined;\n private firstCreate: boolean = false;\n\n // Auto-commit\n private dirty: boolean = false;\n private autoCommitTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: FsSpoolStoreOptions) {\n this.filePath = options.filePath;\n this.metaPath = options.filePath + '.meta.json';\n this.maxEntries = options.maxEntries ?? 100_000;\n this.maxFileBytes = options.maxFileBytes ?? 100 * 1024 * 1024;\n this.maxLineBytes = options.maxLineBytes ?? DEFAULT_MAX_LINE_BYTES;\n this.autoCommitIntervalMs = options.autoCommitIntervalMs ?? 5_000;\n this.lockOptions = options.lockOptions;\n this.onWarning = options.onWarning ?? (() => {});\n }\n\n /**\n * Initialize: acquire lock, load or recover state, open file handle.\n */\n async init(): Promise<void> {\n const dirPath = path.dirname(this.filePath);\n\n // Ensure parent directory exists\n await fs.mkdir(dirPath, { recursive: true });\n\n // Acquire single-writer lock\n this.lock = await acquireLock(this.filePath, this.lockOptions);\n\n try {\n // Check if this is a fresh spool (for directory fsync)\n let fileExists: boolean;\n try {\n await fs.access(this.filePath);\n fileExists = true;\n } catch {\n fileExists = false;\n }\n this.firstCreate = !fileExists;\n\n // Try meta file fast path\n const metaLoaded = fileExists && (await this.tryLoadMeta());\n\n if (!metaLoaded && fileExists) {\n // Full scan: read JSONL line by line, recover from crash\n await this.fullScan();\n }\n\n // Open file for appending\n this.fd = await fs.open(this.filePath, 'a');\n\n // Start auto-commit timer\n if (this.autoCommitIntervalMs > 0) {\n this.autoCommitTimer = setInterval(() => {\n if (this.dirty && !this.closed) {\n this.commit().catch((err) => {\n this.onWarning(`Auto-commit failed: ${String(err)}`);\n });\n }\n }, this.autoCommitIntervalMs);\n // Unref so the timer doesn't keep the process alive\n if (typeof this.autoCommitTimer === 'object' && 'unref' in this.autoCommitTimer) {\n this.autoCommitTimer.unref();\n }\n }\n } catch (err) {\n // If init fails after lock acquired, release lock\n await this.lock.release();\n this.lock = null;\n throw err;\n }\n }\n\n // ===========================================================================\n // SpoolStore Interface\n // ===========================================================================\n\n async append(entry: SpoolEntry): Promise<number> {\n this.assertWritable();\n\n // Hard-cap: entry count\n if (this.entryCount >= this.maxEntries) {\n throw new SpoolFullError(this.entryCount, this.maxEntries, 'entries');\n }\n\n // Serialize\n const line = JSON.stringify(entry) + '\\n';\n const lineBytes = Buffer.byteLength(line, 'utf-8');\n\n // Hard-cap: file size\n if (this.fileBytes + lineBytes > this.maxFileBytes) {\n throw new SpoolFullError(this.fileBytes, this.maxFileBytes, 'bytes');\n }\n\n // Validate chain linkage\n if (entry.prev_entry_digest !== this.headDigest) {\n throw new Error(\n `Invalid chain: expected prev_entry_digest ${this.headDigest}, got ${entry.prev_entry_digest}`\n );\n }\n\n // Validate sequence monotonicity\n if (entry.sequence !== this.sequence + 1) {\n throw new Error(`Invalid sequence: expected ${this.sequence + 1}, got ${entry.sequence}`);\n }\n\n // Write (no fsync -- batched with commit)\n await this.fd!.write(line, null, 'utf-8');\n\n // Update in-memory state\n this.headDigest = entry.entry_digest;\n this.sequence = entry.sequence;\n this.entryCount++;\n this.fileBytes += lineBytes;\n this.dirty = true;\n\n return entry.sequence;\n }\n\n async commit(): Promise<void> {\n this.assertNotClosed();\n\n if (!this.dirty || !this.fd) return;\n\n // fsync the spool file\n await this.fd.sync();\n this.dirty = false;\n\n // On first creation, fsync the parent directory for directory entry durability.\n // Best-effort: not all platforms support fsync on a directory fd.\n if (this.firstCreate) {\n this.firstCreate = false;\n await this.fsyncDir().catch((err) => {\n this.onWarning(`Directory fsync failed (non-critical): ${String(err)}`);\n });\n }\n\n // Write meta file (best-effort -- meta is an optimization, not critical)\n await this.writeMeta().catch((err) => {\n this.onWarning(`Meta file write failed: ${String(err)}`);\n });\n }\n\n async read(fromSequence: number, limit?: number): Promise<SpoolEntry[]> {\n this.assertNotClosed();\n\n const entries: SpoolEntry[] = [];\n const effectiveLimit = limit !== undefined && limit > 0 ? limit : Infinity;\n\n // Pre-materialization streaming read: maxLineBytes enforced BEFORE\n // the line is converted to a JS string. Prevents memory blowup from\n // a single giant line.\n for await (const result of streamLines({\n filePath: this.filePath,\n maxLineBytes: this.maxLineBytes,\n })) {\n if (result.kind === 'line_too_large') {\n this.onWarning(\n `Line at byte offset ${result.byteOffset} exceeds maxLineBytes ` +\n `(${result.accumulatedBytes}/${this.maxLineBytes}) -- marking corrupt`\n );\n this.setCorrupt('LINE_TOO_LARGE', this.sequence);\n break;\n }\n\n // Both 'line' and 'incomplete_tail' have the parsed string\n if (!result.line.trim()) continue;\n\n let entry: SpoolEntry;\n try {\n entry = JSON.parse(result.line) as SpoolEntry;\n } catch {\n // Skip malformed lines (crash recovery truncated them)\n continue;\n }\n\n if (entry.sequence >= fromSequence) {\n entries.push(entry);\n if (entries.length >= effectiveLimit) {\n break; // Early stop\n }\n }\n }\n\n return entries;\n }\n\n async getHeadDigest(): Promise<string> {\n this.assertNotClosed();\n return this.headDigest;\n }\n\n async getSequence(): Promise<number> {\n this.assertNotClosed();\n return this.sequence;\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n\n // Stop auto-commit timer\n if (this.autoCommitTimer !== null) {\n clearInterval(this.autoCommitTimer);\n this.autoCommitTimer = null;\n }\n\n // Final fsync + close fd\n if (this.fd) {\n if (this.dirty) {\n try {\n await this.fd.sync();\n this.dirty = false;\n await this.writeMeta().catch(() => {});\n } catch {\n // Best-effort on close\n }\n }\n await this.fd.close();\n this.fd = null;\n }\n\n // Release lockfile\n if (this.lock) {\n await this.lock.release();\n this.lock = null;\n }\n }\n\n // ===========================================================================\n // Diagnostics (P0-7: queryable without parsing error strings)\n // ===========================================================================\n\n /**\n * Get a diagnostic snapshot for operator tooling.\n *\n * Use `getFsSpoolDiagnostics(store)` if you have a generic SpoolStore\n * reference and need to probe for this method via type guard.\n */\n diagnostics(): SpoolDiagnostics {\n const full = this.entryCount >= this.maxEntries || this.fileBytes >= this.maxFileBytes;\n return {\n mode: full || this.corrupt ? 'read_only' : 'active',\n spoolFull: full,\n spoolCorrupt: this.corrupt,\n corruptReason: this.corruptReason,\n corruptAtSequence: this.corruptAtSequence,\n entryCount: this.entryCount,\n fileBytes: this.fileBytes,\n maxEntries: this.maxEntries,\n maxFileBytes: this.maxFileBytes,\n filePath: this.filePath,\n };\n }\n\n /** Whether the spool has reached its hard-cap limit. */\n get isFull(): boolean {\n return this.entryCount >= this.maxEntries || this.fileBytes >= this.maxFileBytes;\n }\n\n /** Whether linkage corruption was detected on load. */\n get isCorrupt(): boolean {\n return this.corrupt;\n }\n\n /** Current entry count. */\n get currentEntryCount(): number {\n return this.entryCount;\n }\n\n /** Current file size in bytes. */\n get currentFileBytes(): number {\n return this.fileBytes;\n }\n\n /** Configured max entries. */\n get maxEntryLimit(): number {\n return this.maxEntries;\n }\n\n /** Configured max file bytes. */\n get maxBytesLimit(): number {\n return this.maxFileBytes;\n }\n\n // ===========================================================================\n // Initialization Internals\n // ===========================================================================\n\n /**\n * Try to load state from meta file (fast path).\n * Returns true if meta was valid and loaded.\n */\n private async tryLoadMeta(): Promise<boolean> {\n try {\n let metaContent: string;\n try {\n metaContent = await fs.readFile(this.metaPath, 'utf-8');\n } catch {\n // New meta path not found -- try legacy path (spool.meta.json instead of spool.jsonl.meta.json).\n // One-release fallback: if old meta exists, read it, then write new meta on next commit.\n const legacyMetaPath = this.filePath.replace(/\\.jsonl$/, '.meta.json');\n if (legacyMetaPath !== this.metaPath) {\n try {\n metaContent = await fs.readFile(legacyMetaPath, 'utf-8');\n } catch {\n return false;\n }\n } else {\n return false;\n }\n }\n\n const fileStat = await fs.stat(this.filePath);\n const meta = JSON.parse(metaContent) as SpoolMeta;\n\n // Reject unknown meta format versions\n if (meta.metaVersion !== META_VERSION) {\n this.onWarning(\n `Meta file version mismatch (expected ${META_VERSION}, got ${meta.metaVersion}) -- falling back to full scan`\n );\n return false;\n }\n\n // Trust meta only if both fileBytes and mtimeMs match\n if (meta.fileBytes !== fileStat.size || meta.mtimeMs !== fileStat.mtimeMs) {\n this.onWarning(\n `Meta file mismatch (fileBytes: ${meta.fileBytes}/${fileStat.size}, ` +\n `mtimeMs: ${meta.mtimeMs}/${fileStat.mtimeMs}) -- falling back to full scan`\n );\n return false;\n }\n\n this.sequence = meta.sequence;\n this.headDigest = meta.headDigest;\n this.entryCount = meta.entryCount;\n this.fileBytes = meta.fileBytes;\n\n return true;\n } catch {\n // Invalid meta content -- fall back to full scan\n return false;\n }\n }\n\n /**\n * Full JSONL scan: stream line by line, verify linkage, recover from crash.\n *\n * Uses the custom streaming line parser (streamLines) which enforces\n * maxLineBytes BEFORE materializing the line as a JS string. This prevents\n * memory blowup from a single giant line -- the primary \"local file DoS\" vector.\n *\n * Crash recovery rules:\n * - Incomplete last line (no trailing newline + invalid JSON): truncate tail only.\n * - Invalid JSON mid-file (before the last line): mark spool_corrupt, do NOT auto-repair.\n * Auto-repair mid-file would mask real tampering.\n */\n private async fullScan(): Promise<void> {\n let prevDigest = GENESIS_DIGEST;\n let shouldTruncateAt: number | undefined;\n let lineNumber = 0;\n\n for await (const result of streamLines({\n filePath: this.filePath,\n maxLineBytes: this.maxLineBytes,\n })) {\n lineNumber++;\n\n if (result.kind === 'line_too_large') {\n this.onWarning(\n `Line ${lineNumber} exceeds maxLineBytes ` +\n `(${result.accumulatedBytes}/${this.maxLineBytes}) -- marking spool corrupt`\n );\n this.setCorrupt('LINE_TOO_LARGE', this.sequence);\n break;\n }\n\n const lineStr = result.line;\n if (!lineStr.trim()) continue;\n\n let entry: SpoolEntry;\n try {\n entry = JSON.parse(lineStr) as SpoolEntry;\n } catch {\n if (result.kind === 'incomplete_tail') {\n // Crash artifact at tail -- truncate to start of this line\n this.onWarning(\n `Incomplete last line detected (${result.byteLength} bytes) -- truncating`\n );\n shouldTruncateAt = result.byteOffset;\n } else {\n // Malformed JSON mid-file -- corrupt (do NOT auto-repair)\n this.onWarning(`Malformed JSON at line ${lineNumber} -- marking spool corrupt`);\n this.setCorrupt('MALFORMED_JSON', this.sequence);\n }\n break;\n }\n\n // Verify linkage\n if (entry.prev_entry_digest !== prevDigest) {\n this.onWarning(\n `Chain linkage broken at sequence ${entry.sequence}: ` +\n `expected ${prevDigest}, got ${entry.prev_entry_digest}`\n );\n this.setCorrupt('CHAIN_BROKEN', entry.sequence);\n break;\n }\n\n prevDigest = entry.entry_digest;\n this.sequence = entry.sequence;\n this.headDigest = entry.entry_digest;\n this.entryCount++;\n }\n\n // Truncate if needed (crash tail only, not mid-file corruption)\n if (shouldTruncateAt !== undefined && !this.corrupt) {\n await truncateFile(this.filePath, shouldTruncateAt);\n }\n\n // Compute file size from actual file\n try {\n const stat = await fs.stat(this.filePath);\n this.fileBytes = stat.size;\n } catch {\n this.fileBytes = 0;\n }\n }\n\n /**\n * Write meta file for fast startup.\n */\n private async writeMeta(): Promise<void> {\n const stat = await fs.stat(this.filePath);\n const meta: SpoolMeta = {\n metaVersion: META_VERSION,\n sequence: this.sequence,\n headDigest: this.headDigest,\n entryCount: this.entryCount,\n fileBytes: stat.size,\n mtimeMs: stat.mtimeMs,\n };\n // Atomic write: write to temp then rename\n const tmpPath = this.metaPath + '.tmp';\n await fs.writeFile(tmpPath, JSON.stringify(meta, null, 2) + '\\n', 'utf-8');\n await fs.rename(tmpPath, this.metaPath);\n }\n\n /**\n * fsync the parent directory for directory entry durability on first creation.\n * Best-effort: not all platforms support this (e.g. Windows).\n */\n private async fsyncDir(): Promise<void> {\n const dirPath = path.dirname(this.filePath);\n const dirFd = await fs.open(dirPath, 'r');\n try {\n await dirFd.sync();\n } finally {\n await dirFd.close();\n }\n }\n\n // ===========================================================================\n // Guards\n // ===========================================================================\n\n /**\n * Mark the spool as corrupt with a specific reason.\n */\n private setCorrupt(reason: CorruptReason, atSequence?: number): void {\n this.corrupt = true;\n this.corruptReason = reason;\n this.corruptAtSequence = atSequence;\n }\n\n private assertNotClosed(): void {\n if (this.closed) {\n throw new Error('FsSpoolStore is closed');\n }\n }\n\n private assertWritable(): void {\n this.assertNotClosed();\n if (this.corrupt) {\n throw new SpoolCorruptError(this.corruptReason ?? 'CHAIN_BROKEN', this.corruptAtSequence);\n }\n }\n}\n","/**\n * @peac/capture-node - Filesystem Dedupe Index\n *\n * Map-backed deduplication index with append-only file persistence.\n * Last-write-wins on reload (tolerates duplicate lines from crash replay).\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { DedupeIndex, DedupeEntry } from '@peac/capture-core';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface FsDedupeIndexOptions {\n /** Path to dedupe.idx file. */\n filePath: string;\n}\n\n/**\n * Operations written to the append-only dedupe file.\n */\ninterface DedupeOp {\n op: 'set' | 'emit' | 'delete' | 'clear';\n actionId?: string;\n entry?: DedupeEntry;\n}\n\n// =============================================================================\n// Factory\n// =============================================================================\n\n/**\n * Create a filesystem-backed dedupe index.\n */\nexport async function createFsDedupeIndex(options: FsDedupeIndexOptions): Promise<FsDedupeIndex> {\n const index = new FsDedupeIndex(options);\n await index.init();\n return index;\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\nexport class FsDedupeIndex implements DedupeIndex {\n private readonly filePath: string;\n private readonly entries: Map<string, DedupeEntry> = new Map();\n private fd: fs.FileHandle | null = null;\n private closed: boolean = false;\n private firstCreate: boolean = false;\n\n constructor(options: FsDedupeIndexOptions) {\n this.filePath = options.filePath;\n }\n\n /**\n * Initialize: load existing entries from file.\n */\n async init(): Promise<void> {\n // Ensure parent directory exists\n await fs.mkdir(path.dirname(this.filePath), { recursive: true });\n\n // Check if this is a fresh index (for directory fsync)\n try {\n await fs.access(this.filePath);\n this.firstCreate = false;\n } catch {\n this.firstCreate = true;\n }\n\n // Load existing data\n await this.loadFromFile();\n\n // Open for appending\n this.fd = await fs.open(this.filePath, 'a');\n }\n\n // ===========================================================================\n // DedupeIndex Interface\n // ===========================================================================\n\n async get(actionId: string): Promise<DedupeEntry | undefined> {\n this.assertNotClosed();\n return this.entries.get(actionId);\n }\n\n async set(actionId: string, entry: DedupeEntry): Promise<void> {\n this.assertNotClosed();\n this.entries.set(actionId, { ...entry });\n\n // Append op to file (no fsync -- batched with spool commit)\n await this.appendOp({ op: 'set', actionId, entry });\n }\n\n async has(actionId: string): Promise<boolean> {\n this.assertNotClosed();\n return this.entries.has(actionId);\n }\n\n async markEmitted(actionId: string): Promise<boolean> {\n this.assertNotClosed();\n const entry = this.entries.get(actionId);\n if (!entry) return false;\n\n entry.emitted = true;\n\n // Append emit marker to file\n await this.appendOp({ op: 'emit', actionId });\n\n return true;\n }\n\n async delete(actionId: string): Promise<boolean> {\n this.assertNotClosed();\n const existed = this.entries.delete(actionId);\n\n if (existed) {\n await this.appendOp({ op: 'delete', actionId });\n }\n\n return existed;\n }\n\n async size(): Promise<number> {\n this.assertNotClosed();\n return this.entries.size;\n }\n\n async clear(): Promise<void> {\n this.assertNotClosed();\n this.entries.clear();\n\n // Close current fd, truncate file, reopen\n if (this.fd) {\n await this.fd.close();\n }\n await fs.writeFile(this.filePath, '', 'utf-8');\n this.fd = await fs.open(this.filePath, 'a');\n }\n\n // ===========================================================================\n // Extra: commit() -- not on DedupeIndex interface\n //\n // Callers use type guard:\n // if ('commit' in dedupe && typeof dedupe.commit === 'function')\n // await dedupe.commit();\n // ===========================================================================\n\n /**\n * Flush pending writes to durable storage.\n *\n * Not part of the DedupeIndex interface (capture-core stays stable).\n * Callers use type guard to detect this method on the concrete type.\n */\n async commit(): Promise<void> {\n this.assertNotClosed();\n if (this.fd) {\n await this.fd.sync();\n }\n\n // On first creation, fsync the parent directory for directory entry durability.\n // Best-effort: not all platforms support fsync on a directory fd.\n if (this.firstCreate) {\n this.firstCreate = false;\n await this.fsyncDir().catch(() => {\n // Non-critical: directory fsync not supported on all platforms\n });\n }\n }\n\n // ===========================================================================\n // Close\n // ===========================================================================\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n\n if (this.fd) {\n try {\n await this.fd.sync();\n } catch {\n // Best-effort on close\n }\n await this.fd.close();\n this.fd = null;\n }\n }\n\n // ===========================================================================\n // Internals\n // ===========================================================================\n\n /**\n * Load entries from the dedupe file.\n * Last-write-wins for duplicate actionIds (handles crash replay).\n */\n private async loadFromFile(): Promise<void> {\n let content: string;\n try {\n content = await fs.readFile(this.filePath, 'utf-8');\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n return; // No file yet -- fresh index\n }\n throw err;\n }\n\n const lines = content.split('\\n');\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n let op: DedupeOp;\n try {\n op = JSON.parse(line) as DedupeOp;\n } catch {\n // Skip malformed lines (crash artifact)\n continue;\n }\n\n switch (op.op) {\n case 'set':\n if (op.actionId && op.entry) {\n this.entries.set(op.actionId, op.entry);\n }\n break;\n case 'emit':\n if (op.actionId) {\n const entry = this.entries.get(op.actionId);\n if (entry) {\n entry.emitted = true;\n }\n }\n break;\n case 'delete':\n if (op.actionId) {\n this.entries.delete(op.actionId);\n }\n break;\n case 'clear':\n this.entries.clear();\n break;\n }\n }\n }\n\n /**\n * Append an operation to the dedupe file (no fsync).\n */\n private async appendOp(op: DedupeOp): Promise<void> {\n if (!this.fd) return;\n const line = JSON.stringify(op) + '\\n';\n await this.fd.write(line, null, 'utf-8');\n }\n\n /**\n * fsync the parent directory for directory entry durability on first creation.\n * Best-effort: not all platforms support this (e.g. Windows).\n */\n private async fsyncDir(): Promise<void> {\n const dirPath = path.dirname(this.filePath);\n const dirFd = await fs.open(dirPath, 'r');\n try {\n await dirFd.sync();\n } finally {\n await dirFd.close();\n }\n }\n\n private assertNotClosed(): void {\n if (this.closed) {\n throw new Error('FsDedupeIndex is closed');\n }\n }\n}\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @peac/capture-node - Node.js Durable Storage
|
|
3
|
+
*
|
|
4
|
+
* Filesystem implementations of SpoolStore and DedupeIndex from @peac/capture-core.
|
|
5
|
+
* Layer 1.5: depends on capture-core (L1), used by adapters (L4) and apps (L5).
|
|
6
|
+
*/
|
|
7
|
+
export { createFsSpoolStore } from './fs-spool-store.js';
|
|
8
|
+
export { createFsDedupeIndex } from './fs-dedupe-index.js';
|
|
9
|
+
export { FsSpoolStore } from './fs-spool-store.js';
|
|
10
|
+
export { FsDedupeIndex } from './fs-dedupe-index.js';
|
|
11
|
+
export { getFsSpoolDiagnostics } from './fs-spool-store.js';
|
|
12
|
+
export type { FsSpoolStoreOptions, SpoolDiagnostics } from './fs-spool-store.js';
|
|
13
|
+
export type { FsDedupeIndexOptions } from './fs-dedupe-index.js';
|
|
14
|
+
export { SpoolFullError, SpoolCorruptError, LockfileError } from './errors.js';
|
|
15
|
+
export type { CorruptReason } from './errors.js';
|
|
16
|
+
export { acquireLock } from './lockfile.js';
|
|
17
|
+
export type { LockOptions, LockHandle } from './lockfile.js';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACjF,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGjE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/E,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|