safeer-pdf-generator
Version:
Framework-agnostic PDF generation library with chunking, merging, S3 upload, and email delivery
62 lines (50 loc) • 2.46 kB
JavaScript
// BYOB Browser Reuse + Lifecycle Event Emitters (v1.1.0)
// Demonstrates passing an external browser and listening for lifecycle events
import puppeteer from 'puppeteer';
import { generatePdf, PdfEventEmitter, consoleLogger } from 'safeer-pdf-generator';
async function main() {
// ── 1. Launch a shared browser (BYOB) ──
// Use a single browser for multiple PDF generations to save memory & startup time
const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox'],
});
console.log('🌐 Shared browser launched (PID:', browser.process()?.pid, ')');
// ── 2. Create an event emitter ──
const events = new PdfEventEmitter();
events.onEvent('generation:started', ({ title, rowCount, timestamp }) => {
console.log(`🚀 Started: "${title}" (${rowCount} rows) at ${timestamp}`);
});
events.onEvent('generation:complete', ({ result }) => {
console.log(`✅ Complete: ${result.pageCount} pages, ${(result.sizeBytes / 1024).toFixed(1)} KB, ${result.durationMs}ms`);
});
events.onEvent('error', ({ error, phase }) => {
console.error(`❌ Error during ${phase}: ${error.message}`);
});
// ── 3. Generate multiple PDFs sharing the same browser ──
const reports = [
{ title: 'Sales Q1', data: [{ name: 'Alice', amount: 5000 }, { name: 'Bob', amount: 3000 }] },
{ title: 'Sales Q2', data: [{ name: 'Alice', amount: 7000 }, { name: 'Bob', amount: 4500 }] },
{ title: 'Sales Q3', data: [{ name: 'Alice', amount: 6200 }, { name: 'Bob', amount: 5100 }] },
];
const columns = [
{ key: 'name', title: 'Name', dataIndex: 'name' },
{ key: 'amount', title: 'Amount', dataIndex: 'amount' },
];
for (const report of reports) {
await generatePdf({
title: report.title,
data: report.data,
columns,
events, // Lifecycle events
puppeteer: { browserInstance: browser }, // BYOB — reuse this browser
logging: consoleLogger,
});
}
// ── 4. Close the browser yourself ──
// The library did NOT close it — you manage the lifecycle
console.log('🌐 Browser still connected:', browser.connected); // true
await browser.close();
console.log('🌐 Browser closed by us');
}
main().catch(console.error);