idraw/scripts/util/screen.js
2021-05-23 20:16:15 +08:00

60 lines
1.5 KiB
JavaScript

const path = require('path');
const http = require('http');
const fs = require('fs');
const puppeteer = require('puppeteer');
const serveHandler = require('serve-handler');
const compose = require('koa-compose');
const { delay } = require('./time');
const port = 3001;
const width = 600;
const height = 600;
module.exports = {
createScreenshotBuffer,
createScreenshot,
width,
height,
}
async function createScreenshotBuffer(pagePath) {
const middlewares = [];
let buf;
middlewares.push(async (ctx = {}, next) => {
const { page, port } = ctx;
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, opts = {}) {
return new Promise((resolve, reject) => {
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) );
})
}