/
original_page.js
98 lines (88 loc) · 3.4 KB
/
original_page.js
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
91
92
93
94
95
96
97
98
// Generated by CoffeeScript 2.6.1
(function() {
var busboy, fs, fsPromises, log, mkdirp, mkdirpPromise, original_page, path;
path = require('path');
busboy = require('connect-busboy');
fs = require('fs');
mkdirp = require('mkdirp');
log = require('./log.js');
fsPromises = fs.promises;
mkdirpPromise = require('util').promisify(mkdirp);
original_page = (app) => {
var DB_PATH, DEV, splitFeedId;
DEV = process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'docker' || process.env.NODE_ENV === 'debug';
DB_PATH = '/srv/originals';
app.use(busboy());
app.get(/^\/original_page\/(\d+)\/?/, function(req, res) {
var etag, feedId, feedIdDir, filePath, lastModified;
if (req.query.test) {
return res.end("OK");
}
feedId = parseInt(req.params[0], 10);
etag = req.header('If-None-Match');
lastModified = req.header('If-Modified-Since');
feedIdDir = splitFeedId(feedId);
filePath = `${DB_PATH}/${feedIdDir}.zhtml`;
// Convert to async flow with try/catch using CoffeeScript's then/catch for Promises
return fsPromises.stat(filePath).then(function(stats) {
var fileEtag;
fileEtag = Date.parse(stats.mtime).toString();
if (etag === fileEtag || lastModified === stats.mtime.toISOString()) {
log.debug(`Not modified: ${feedId} (${filePath})`);
return res.sendStatus(304);
} else {
return fsPromises.readFile(filePath).then(function(content) {
log.debug(`Sending: ${feedId} (${filePath}) ${stats.size} bytes`);
res.header('Etag', fileEtag);
return res.send(content);
});
}
}).catch(function(err) {
if (err.code === 'ENOENT') {
log.debug(`Original page not found: ${feedId} (${filePath})`);
return res.sendStatus(404);
} else {
log.debug(`Error reading original page: ${feedId} (${filePath}) ${err}`);
return res.sendStatus(500);
}
});
});
app.post(/^\/original_page\/(\d+)\/?/, function(req, res) {
var feedId, feedIdDir, filePath, filePathDir;
feedId = parseInt(req.params[0], 10);
feedIdDir = splitFeedId(feedId);
filePath = `${DB_PATH}/${feedIdDir}.zhtml`;
filePathDir = path.dirname(filePath);
// Ensure directory exists before proceeding
return mkdirpPromise(filePathDir).then(function() {
var fstream;
fstream = fs.createWriteStream(filePath);
req.pipe(req.busboy);
return req.busboy.on('file', function(fieldname, file, filename) {
file.pipe(fstream);
return fstream.on('close', function() {
return fsPromises.stat(filePath).then(function(stats) {
log.debug(`Saving: ${feedId} (${filePath}) ${stats.size} bytes`);
return res.send("OK");
});
});
});
}).catch(function(err) {
log.debug(err);
return res.sendStatus(500);
});
});
splitFeedId = function(feedId) {
var rgx;
feedId += '';
// x2 = if feedId.length > 1 then '.' + feedId[1] else ''
rgx = /(\d+)(\d{3})/;
while (rgx.test(feedId)) {
feedId = feedId.replace(rgx, '$1' + '/' + '$2');
}
return feedId;
};
return log.debug(`Starting Original Page server ${DEV ? "on DEV" : "in production"}`);
};
exports.original_page = original_page;
}).call(this);