-
Notifications
You must be signed in to change notification settings - Fork 42
Expand file tree
/
Copy pathindex.js
More file actions
90 lines (71 loc) · 1.99 KB
/
index.js
File metadata and controls
90 lines (71 loc) · 1.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
'use strict';
function fastbootExpressMiddleware(distPath, options) {
let opts = options;
if (arguments.length === 1) {
if (typeof distPath === 'string') {
opts = { distPath: distPath };
} else {
opts = distPath;
}
}
opts = opts || {};
let log = opts.log !== false ? _log : function() {};
let fastboot = opts.fastboot;
if (!fastboot) {
let FastBoot = require('fastboot');
fastboot = new FastBoot({
distPath: opts.distPath,
resilient: opts.resilient
});
}
return function(req, res, next) {
let path = req.url;
fastboot.visit(path, { request: req, response: res })
.then(success, failure);
function success(result) {
result.html()
.then(html => {
let headers = result.headers;
let statusMessage = result.error ? 'NOT OK ' : 'OK ';
for (var pair of headers.entries()) {
res.set(pair[0], pair[1]);
}
if (result.error) {
log("RESILIENT MODE CAUGHT:", result.error.stack);
next(result.error);
}
if (opts.postProcess) {
req.html = html;
return next();
}
log(result.statusCode, statusMessage + path);
res.status(result.statusCode);
res.send(html);
})
.catch(error => {
res.status(500);
next(error);
});
}
function failure(error) {
if (error.name === "UnrecognizedURLError") {
next();
} else {
res.status(500);
next(error);
}
}
};
}
let chalk;
function _log(statusCode, message, startTime) {
chalk = chalk || require('chalk');
let color = statusCode === 200 ? 'green' : 'red';
let now = new Date();
if (startTime) {
let diff = Date.now() - startTime;
message = message + chalk.blue(" " + diff + "ms");
}
console.log(chalk.blue(now.toISOString()) + " " + chalk[color](statusCode) + " " + message);
}
module.exports = fastbootExpressMiddleware;