UNPKG

safeer-pdf-generator

Version:

Framework-agnostic PDF generation library with chunking, merging, S3 upload, and email delivery

48 lines 1.98 kB
import { promises as fs } from 'fs'; import * as path from 'path'; import { LocalFsError } from '../../core/errors.js'; import { sanitizeFilename } from '../../utils/guards.js'; import { noOpLogger } from '../../config/defaults.js'; /** * Writes generated PDFs to the local filesystem. * Composes with `s3`, `email`, and `webhook` integrations. */ export class LocalFsWriter { constructor(config, logger = noOpLogger) { this.config = config; this.logger = logger; } async write(buffer, defaultFilename) { const filename = sanitizeFilename(this.config.filename || defaultFilename); const targetDir = path.resolve(this.config.path); const targetPath = path.join(targetDir, filename); const createDir = this.config.createDir !== false; const overwrite = this.config.overwrite !== false; if (createDir) { try { await fs.mkdir(targetDir, { recursive: true }); } catch (error) { throw new LocalFsError(`Failed to create directory: ${targetDir}`, targetDir, error); } } if (!overwrite) { const exists = await fs.access(targetPath).then(() => true, () => false); if (exists) { throw new LocalFsError(`File already exists and overwrite=false: ${targetPath}`, targetPath); } } try { await fs.writeFile(targetPath, buffer); this.logger.info(`Wrote PDF to ${targetPath} (${(buffer.length / 1024 / 1024).toFixed(2)}MB)`); return { path: targetPath, sizeBytes: buffer.length }; } catch (error) { throw new LocalFsError(`Failed to write file: ${error instanceof Error ? error.message : 'Unknown error'}`, targetPath, error); } } } export function createLocalFsWriter(config, logger) { return new LocalFsWriter(config, logger); } //# sourceMappingURL=LocalFsWriter.js.map