safeer-pdf-generator
Version:
Framework-agnostic PDF generation library with chunking, merging, S3 upload, and email delivery
48 lines • 1.98 kB
JavaScript
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