// 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);