Skip to content

Commit 9f5865a

Browse files
authored
Merge pull request #5 from isleofcode/release/0.2.0
Release/0.2.0
2 parents f6cd9a4 + e8cdc11 commit 9f5865a

File tree

8 files changed

+257
-6
lines changed

8 files changed

+257
-6
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
.eslintcache
22
.npm
33

4+
dist
45
node_modules
56

67
*.log

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "render-vendor",
3-
"version": "0.1.3",
3+
"version": "0.2.0",
44
"description": "The fastest way to render HTML documents to PDFs",
55
"engines": {
66
"node": ">=4.0.0"
@@ -49,6 +49,7 @@
4949
"listr": "^0.12.0",
5050
"lodash": "^4.17.4",
5151
"phantomjs-prebuilt": "^2.1.14",
52+
"puppeteer": "^0.12.0",
5253
"request": "^2.81.0",
5354
"rsvp": "^4.0.1"
5455
},

src/page.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,13 @@ export class Page {
102102
async render(options = {}, ...args) {
103103
assert.ok(!this.isDestroyed && !this.isDestroying && this.isLoaded);
104104

105-
if (isString(options)) {
105+
let pagePathParamKey = this.renderer.constructor.pagePathParamKey;
106+
107+
if (isString(pagePathParamKey) && isString(options)) {
106108
let filename = options;
107109

108110
options = isPresent(args[0]) ? args[0] : {};
109-
options.filename = filename;
111+
options[pagePathParamKey] = filename;
110112
}
111113

112114
if (isString(options.filename) && !isString(options.format)) {

src/renderer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ let defaultRenderer;
1616

1717
export class Renderer extends EventEmitter {
1818
static get rendererConstructor() {
19-
return this._rendererConstructor || require('./renderers/phantom').default;
19+
return this._rendererConstructor || require('./renderers/chrome').default;
2020
}
2121

2222
static set rendererConstructor(value) {

src/renderers/chrome/index.js

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
import _ from 'lodash';
2+
import path from 'path';
3+
import puppeteer from 'puppeteer';
4+
5+
import Renderer from '../../renderer';
6+
7+
const { isString } = _;
8+
9+
const DEFAULT_BOOT_OPTIONS = {}; // use puppeteer defaults, https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions
10+
11+
export class ChromeRenderer extends Renderer {
12+
static get DEFAULT_BOOT_OPTIONS() {
13+
return this._DEFAULT_BOOT_OPTIONS || DEFAULT_BOOT_OPTIONS;
14+
}
15+
16+
static set DEFAULT_BOOT_OPTIONS(value) {
17+
this._DEFAULT_BOOT_OPTIONS = value;
18+
}
19+
20+
static get pagePathParamKey() {
21+
return 'path';
22+
}
23+
24+
constructor(attrs = {}) {
25+
super(attrs);
26+
27+
this.bootOptions = this.bootOptions ||
28+
this.constructor.DEFAULT_BOOT_OPTIONS;
29+
}
30+
31+
get browser() {
32+
return this._browser;
33+
}
34+
35+
set browser(value) {
36+
this._browser = value;
37+
}
38+
39+
get bootOptions() {
40+
return this._bootOptions;
41+
}
42+
43+
set bootOptions(value) {
44+
this._bootOptions = value;
45+
}
46+
47+
async boot() {
48+
if (this.isBooted) {
49+
return;
50+
}
51+
52+
try {
53+
if (!this.isBooting) {
54+
let bootOptions = this.bootOptions;
55+
56+
this.isBooting = true;
57+
this.browser = bootOptions.hasOwnProperty('browserWSEndpoint') ?
58+
await puppeteer.connect(bootOptions) :
59+
await puppeteer.launch(bootOptions);
60+
61+
this.isBooted = true;
62+
}
63+
} catch (err) {
64+
this.isBooted = false;
65+
throw err;
66+
}
67+
}
68+
69+
async shutdown() {
70+
let browser = this.browser;
71+
72+
if (browser !== null && browser !== undefined) {
73+
browser.close();
74+
this.browser = undefined;
75+
}
76+
77+
this.isBooted = false;
78+
}
79+
80+
async ping() {
81+
return this.browser.pages();
82+
}
83+
84+
async loadPage(page, options) {
85+
let chromePage = page._chromePage;
86+
87+
if (chromePage === null || chromePage === undefined) {
88+
chromePage = await this.browser.newPage();
89+
page._chromePage = chromePage;
90+
}
91+
92+
page.isLoading = true;
93+
94+
try {
95+
let { url, html } = options;
96+
97+
if (html !== undefined && html !== null) {
98+
await chromePage.setContent(html);
99+
} else {
100+
if (url !== undefined && url !== null) {
101+
delete options.url;
102+
} else {
103+
url = page.id;
104+
}
105+
106+
await chromePage.goto(url, options);
107+
}
108+
109+
page.isLoaded = true;
110+
} catch (err) {
111+
page.isLoaded = false;
112+
throw err;
113+
}
114+
}
115+
116+
async renderPage(page, options = {}) {
117+
let { path: filepath, type } = options;
118+
let buffer;
119+
120+
if (!isString(type)) {
121+
type = isString(filepath) ? path.extname(filepath).slice(1) : 'html';
122+
type = type.length > 0 ? type : 'html';
123+
}
124+
125+
switch (type) {
126+
case 'html':
127+
buffer = await page._chromePage.content();
128+
break;
129+
case 'pdf':
130+
let { emulateMedia } = options;
131+
132+
if (emulateMedia !== null && emulateMedia !== undefined) {
133+
await page._chromePage.emulateMedia(emulateMedia);
134+
delete options.emulateMedia;
135+
}
136+
137+
buffer = await page._chromePage.pdf(options);
138+
break;
139+
default:
140+
buffer = await page._chromePage.screenshot(options);
141+
break;
142+
}
143+
144+
return isString(filepath) ? filepath : buffer;
145+
}
146+
147+
async unloadPage(page, ...args) {
148+
await page._chromePage.close();
149+
150+
return true;
151+
}
152+
}
153+
154+
export default ChromeRenderer;

src/renderers/phantom/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ export class PhantomRenderer extends Renderer {
4040
return denodeify(request);
4141
}
4242

43+
static get pagePathParamKey() {
44+
return 'filename';
45+
}
46+
4347
constructor(attrs = {}) {
4448
super(attrs);
4549

0 commit comments

Comments
 (0)