54 lines
1.4 KiB
TypeScript
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;
|
|
}
|
|
}
|