import '../../initPathAlias'; import { ApplicantSessionSummary, SessionManifestData } from '@/examtools/actions/applicant'; import { generateManifestPdf } from '@/lib/examForms/ManifestForm'; import { ExamData, Form605Data } from '@/lib/examForms/SharedTypes'; import { remoteMethod, remoteStream } from '@/lib/nats/types'; import { createDocument } from '@/lib/pdf/pdflib'; import { VECList } from '@shared/licenseInfo'; import * as form605 from '@/lib/examForms/form605generator'; import * as csce from '@/lib/examForms/formCSCEgenerator'; import * as examResults from "@/lib/results/generatePdfLib"; import stream from 'stream'; import { WorkerService } from '@/lib/nats/WorkerService'; export interface PDFRenderManifestDoc { type: 'manifest'; data: SessionManifestData; } export interface PDFRenderCSCEDoc { type: 'csce'; vec: VECList; applicant: ApplicantSessionSummary; session: ExamData; isDraft: boolean; } export interface PDFRender605Doc { type: '605'; vec: VECList; data: Form605Data; } export interface PDFRenderExamResultsDoc { type: 'examResults'; results: examResults.ResultDocument[]; passCopies: number; failCopies: number; } export type PDFRenderDoc = PDFRenderManifestDoc | PDFRenderCSCEDoc | PDFRender605Doc | PDFRenderExamResultsDoc; // NATS-capable email service class PDFService { @remoteStream({}) makePDF(pages: PDFRenderDoc[]): stream.Readable { const outStream = new stream.Readable({ read() {}, // There is no way to pause the stream, so we just ignore this // readableObjectMode: true, // writableObjectMode: true, // objectMode: true, }); (async () => { const pdfDoc = await createDocument(); for (const page of pages) { switch (page.type) { case 'manifest': await generateManifestPdf(page.data, pdfDoc); break; case 'csce': await csce.renderToPdf(page.vec, page.applicant, page.session, page.isDraft, pdfDoc); break; case '605': await form605.renderToPdf([page.data], page.vec, pdfDoc); break; case 'examResults': await examResults.generateResultsPdf(pdfDoc, page.results, page.passCopies, page.failCopies); break; default: throw new Error(`Unknown PDFRenderDoc type ${(page).type}`); } } const savedBytes = await pdfDoc.save(); outStream.push(savedBytes); outStream.push(null); })().catch((err) => { outStream.emit('error', err); }); return outStream; } } const service = new PDFService(); WorkerService.createOnWorkerThread(service); export default service;