web-service/apps/render/src/services/render.service.ts

54 lines
1.4 KiB
TypeScript

import { Injectable, Logger } from '@nestjs/common';
import { readFileSync } from 'fs';
import { join } from 'path';
import puppeteer from 'puppeteer';
@Injectable()
export class RenderService {
private logger = new Logger(RenderService.name);
async render() {
const file = readFileSync(join(__dirname, 'renderer.js'), 'utf-8');
const browser = await puppeteer.launch({
headless: true,
args: [
'--use-gl=swiftshader',
'--no-sandbox',
'--enable-surface-synchronization',
],
});
const page = await browser.newPage();
await page.setViewport({ width: 800, height: 800 });
page
.on('console', (message) =>
this.logger.log(`${message.type().toUpperCase()} ${message.text()}`),
)
.on('pageerror', ({ message }) => this.logger.log(message))
.on('response', (response) =>
this.logger.log(`${response.status()} ${response.url()}`),
)
.on('requestfailed', (request) =>
this.logger.log(`${request.failure().errorText} ${request.url()}`),
);
await page.setContent(
`<html><body><script type="application/javascript">${file}</script></body></html>`,
{
waitUntil: ['load', 'networkidle0'],
},
);
const picture = await page.screenshot({
encoding: 'base64',
omitBackground: true,
});
await browser.close();
return picture;
}
}