Skip to content
This repository has been archived by the owner on Jan 24, 2025. It is now read-only.

Commit

Permalink
Render html as png #43
Browse files Browse the repository at this point in the history
  • Loading branch information
bekker committed Oct 22, 2018
1 parent 348d390 commit bf68988
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 1 deletion.
12 changes: 11 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
},
"dependencies": {
"@types/async": "~2.0.49",
"@types/async-lock": "^1.1.0",
"@types/bcrypt": "~2.0.0",
"@types/express": "^4.0.34",
"@types/express-promise-router": "^2.0.0",
Expand All @@ -29,6 +30,7 @@
"@types/sinon": "^5.0.1",
"assert-rejects": "^0.1.1",
"async": "~2.0.1",
"async-lock": "^1.1.3",
"bcrypt": "~2.0.1",
"body-parser": "~1.18.3",
"cookie-parser": "~1.4.3",
Expand Down
14 changes: 14 additions & 0 deletions src/api/routes/TimetableRouter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ var router = ExpressPromiseRouter();

import TimetableService = require('@app/core/timetable/TimetableService');
import TimetableLectureService = require('@app/core/timetable/TimetableLectureService');
import TimetableImageRenderService = require('@app/core/timetable/TimetableImageRenderService');
import User from '@app/core/user/model/User';
import * as log4js from 'log4js';
import DuplicateTimetableTitleError from '@app/core/timetable/error/DuplicateTimetableTitleError';
Expand Down Expand Up @@ -51,6 +52,19 @@ restGet(router, '/:id')(async function(context, req) {
return result;
});

router.get('/:id/image', async function(req, res, next) {
let context: RequestContext = req['context'];
let user:User = context.user;

let table = await TimetableService.getByMongooseId(user._id, req.params.id);
if (!table) {
throw new ApiError(404, ErrorCode.TIMETABLE_NOT_FOUND, "timetable not found");
}
let imageBuffer = await TimetableImageRenderService.renderTimetableAsPng(table, 1920, 1080);
res.contentType('image/png');
res.send(imageBuffer);
});

restGet(router, '/:year/:semester')(async function(context, req) {
let user:User = context.user;
let result = await TimetableService.getBySemester(user._id, req.params.year, req.params.semester);
Expand Down
30 changes: 30 additions & 0 deletions src/core/nightmare/NightmareService.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import Nightmare = require('nightmare');
import AsyncLock = require('async-lock');

let nm = Nightmare({
show: false,
executionTimeout: 1000,
waitTimeout: 1000
});

let nmLock = new AsyncLock({maxPending : 100, timeout: 5000});
const NM_LOCK_KEY = "NightmareServiceLock";

function execute<T>(f: (Nightmare) => Promise<T>): Promise<T> {
return nmLock.acquire(NM_LOCK_KEY, function() {
return f(nm);
});
}

export function renderHtmlAsPng(html: string, width: number, height: number): Promise<Buffer> {
return execute(async function(nm) {
nm.viewport(width, height);
nm.goto("about:blank");
await nm.wait(function (html: string){
document.body.innerHTML = html;
return true;
}, html);
let buffer: Buffer = await nm.screenshot();
return buffer;
});
}
11 changes: 11 additions & 0 deletions src/core/timetable/TimetableImageRenderService.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import log4js = require('log4js');

import NightmareService = require('@app/core/nightmare/NightmareService');
import Timetable from './model/Timetable';

let logger = log4js.getLogger();

export function renderTimetableAsPng(timetable: Timetable, width: number, height: number): Promise<Buffer> {
let html = "<p>Timetable title: " + timetable.title + "</p>";
return NightmareService.renderHtmlAsPng(html, width, height);
}

0 comments on commit bf68988

Please sign in to comment.