feat(smartpdf): add automatic port allocation and multi-instance support

This commit is contained in:
Juergen Kunz
2025-08-01 16:09:17 +00:00
parent f535eacd97
commit a4c3415838
7 changed files with 2102 additions and 2176 deletions

97
test/test.port.ts Normal file
View File

@@ -0,0 +1,97 @@
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as smartpdf from '../ts/index.js';
tap.test('should create multiple SmartPdf instances with automatic port allocation', async () => {
const instance1 = new smartpdf.SmartPdf();
const instance2 = new smartpdf.SmartPdf();
const instance3 = new smartpdf.SmartPdf();
// Start all instances
await instance1.start();
await instance2.start();
await instance3.start();
// Verify all instances have different ports
expect(instance1.serverPort).toBeGreaterThanOrEqual(20000);
expect(instance1.serverPort).toBeLessThanOrEqual(30000);
expect(instance2.serverPort).toBeGreaterThanOrEqual(20000);
expect(instance2.serverPort).toBeLessThanOrEqual(30000);
expect(instance3.serverPort).toBeGreaterThanOrEqual(20000);
expect(instance3.serverPort).toBeLessThanOrEqual(30000);
// Ensure all ports are different
expect(instance1.serverPort).not.toEqual(instance2.serverPort);
expect(instance1.serverPort).not.toEqual(instance3.serverPort);
expect(instance2.serverPort).not.toEqual(instance3.serverPort);
console.log(`Instance 1 port: ${instance1.serverPort}`);
console.log(`Instance 2 port: ${instance2.serverPort}`);
console.log(`Instance 3 port: ${instance3.serverPort}`);
// Test that all instances work correctly
const pdf1 = await instance1.getA4PdfResultForHtmlString('<h1>Instance 1</h1>');
const pdf2 = await instance2.getA4PdfResultForHtmlString('<h1>Instance 2</h1>');
const pdf3 = await instance3.getA4PdfResultForHtmlString('<h1>Instance 3</h1>');
expect(pdf1.buffer).toBeInstanceOf(Buffer);
expect(pdf2.buffer).toBeInstanceOf(Buffer);
expect(pdf3.buffer).toBeInstanceOf(Buffer);
// Clean up
await instance1.stop();
await instance2.stop();
await instance3.stop();
});
tap.test('should create SmartPdf instance with custom port range', async () => {
const customInstance = new smartpdf.SmartPdf({
portRangeStart: 25000,
portRangeEnd: 26000
});
await customInstance.start();
expect(customInstance.serverPort).toBeGreaterThanOrEqual(25000);
expect(customInstance.serverPort).toBeLessThanOrEqual(26000);
console.log(`Custom range instance port: ${customInstance.serverPort}`);
await customInstance.stop();
});
tap.test('should create SmartPdf instance with specific port', async () => {
const specificPortInstance = new smartpdf.SmartPdf({
port: 28888
});
await specificPortInstance.start();
expect(specificPortInstance.serverPort).toEqual(28888);
console.log(`Specific port instance: ${specificPortInstance.serverPort}`);
await specificPortInstance.stop();
});
tap.test('should throw error when specific port is already in use', async () => {
const instance1 = new smartpdf.SmartPdf({ port: 29999 });
await instance1.start();
const instance2 = new smartpdf.SmartPdf({ port: 29999 });
let errorThrown = false;
try {
await instance2.start();
} catch (error) {
errorThrown = true;
expect(error.message).toInclude('already in use');
}
expect(errorThrown).toBeTrue();
await instance1.stop();
});
export default tap.start();

View File

@@ -1,4 +1,4 @@
import { expect, tap } from '@push.rocks/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as smartpdf from '../ts/index.js';
import * as fs from 'fs';
import * as path from 'path';