mirror of
https://github.com/idrawjs/idraw
synced 2026-05-22 00:58:27 +00:00
59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
import http from 'http';
|
|
import path from 'path';
|
|
import puppeteer from 'puppeteer';
|
|
import serveHandler from 'serve-handler';
|
|
import compose from 'koa-compose';
|
|
import { delay } from './time';
|
|
|
|
const port = 3001;
|
|
const width = 600;
|
|
const height = 600;
|
|
|
|
async function createScreenshotBuffer(pagePath: string) {
|
|
const middlewares = [];
|
|
let buf;
|
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
// @ts-ignore
|
|
middlewares.push(async (ctx: any) => {
|
|
const { page, port } = ctx as { page: any; port: number };
|
|
await page.setViewport({ width: width, height: height });
|
|
const pageUrl = `http://127.0.0.1:${port}/${pagePath || ''}`;
|
|
await page.goto(pageUrl);
|
|
await delay(1000 * 2);
|
|
buf = await page.screenshot();
|
|
});
|
|
await createScreenshot(middlewares, {
|
|
baseDir: path.join(__dirname, '..', '..')
|
|
});
|
|
return buf;
|
|
}
|
|
|
|
async function createScreenshot(
|
|
middlewares: any[],
|
|
opts: any = {}
|
|
): Promise<void> {
|
|
return new Promise((resolve) => {
|
|
const server = http.createServer((req, res) =>
|
|
serveHandler(req, res, {
|
|
public: opts.baseDir
|
|
})
|
|
);
|
|
server.listen(port, async () => {
|
|
try {
|
|
const browser = await puppeteer.launch();
|
|
const page = await browser.newPage();
|
|
await compose(middlewares)({ page, port });
|
|
await browser.close();
|
|
server.close();
|
|
resolve();
|
|
} catch (err) {
|
|
server.close();
|
|
console.error(err);
|
|
process.exit(-1);
|
|
}
|
|
});
|
|
server.on('SIGINT', () => process.exit(1));
|
|
});
|
|
}
|
|
|
|
export { createScreenshotBuffer, createScreenshot, width, height };
|