11import * as os from 'os' ;
22import * as puppeteer from 'puppeteer' ;
33import { Logger } from './logger' ;
4- import { registerExitCleanUp } from './exit' ;
54import uniqueFilename = require( 'unique-filename' ) ;
65
76export class Browser {
8- private instance ;
97
108 constructor ( private log : Logger ) {
119 }
1210
13- async start ( ) {
14- this . log . info ( "Starting chrome" ) ;
15- this . instance = await puppeteer . launch ( ) ;
16-
17- registerExitCleanUp ( ( ) => {
18- this . instance . close ( ) ;
19- } ) ;
20- }
21-
2211 validateOptions ( options ) {
2312 options . width = parseInt ( options . width ) || 1000 ;
2413 options . height = parseInt ( options . height ) || 500 ;
@@ -34,40 +23,57 @@ export class Browser {
3423 }
3524
3625 async render ( options ) {
37- const page = await this . instance . newPage ( ) ;
38-
39- this . validateOptions ( options ) ;
40-
41- await page . setViewport ( {
42- width : options . width ,
43- height : options . height ,
44- deviceScaleFactor : 1 ,
45- } ) ;
46-
47- await page . setCookie ( {
48- 'name' : 'renderKey' ,
49- 'value' : options . renderKey ,
50- 'domain' : options . domain ,
51- } ) ;
52-
53- await page . goto ( options . url ) ;
54-
55- // wait for all panels to render
56- await page . waitForFunction ( ( ) => {
57- var panelCount = document . querySelectorAll ( '.panel' ) . length ;
58- return ( < any > window ) . panelsRendered >= panelCount ;
59- } , {
60- timeout : options . timeout * 1000
61- } ) ;
62-
63- if ( ! options . filePath ) {
64- options . filePath = uniqueFilename ( os . tmpdir ( ) ) + '.png' ;
26+ let browser ;
27+ let page ;
28+ let env = Object . assign ( { } , process . env ) ;
29+
30+ try {
31+ this . validateOptions ( options ) ;
32+
33+ // set env timezone
34+ env . TZ = options . timezone || process . env . TZ ;
35+
36+ browser = await puppeteer . launch ( { env : env } ) ;
37+ page = await browser . newPage ( ) ;
38+
39+ await page . setViewport ( {
40+ width : options . width ,
41+ height : options . height ,
42+ deviceScaleFactor : 1 ,
43+ } ) ;
44+
45+ await page . setCookie ( {
46+ 'name' : 'renderKey' ,
47+ 'value' : options . renderKey ,
48+ 'domain' : options . domain ,
49+ } ) ;
50+
51+ await page . goto ( options . url ) ;
52+
53+ // wait for all panels to render
54+ await page . waitForFunction ( ( ) => {
55+ var panelCount = document . querySelectorAll ( '.panel' ) . length ;
56+ return ( < any > window ) . panelsRendered >= panelCount ;
57+ } , {
58+ timeout : options . timeout * 1000
59+ } ) ;
60+
61+ if ( ! options . filePath ) {
62+ options . filePath = uniqueFilename ( os . tmpdir ( ) ) + '.png' ;
63+ }
64+
65+ await page . screenshot ( { path : options . filePath } ) ;
66+
67+ return { filePath : options . filePath } ;
68+
69+ } finally {
70+ if ( page ) {
71+ await page . close ( ) ;
72+ }
73+ if ( browser ) {
74+ await browser . close ( ) ;
75+ }
6576 }
66-
67- await page . screenshot ( { path : options . filePath } ) ;
68- page . close ( ) ;
69-
70- return { filePath : options . filePath } ;
7177 }
7278}
7379
0 commit comments