| 
          const express = require('express') | 
        
        
           | 
          const request = require('request') | 
        
        
           | 
          const puppeteer = require('puppeteer') | 
        
        
           | 
          const schedule = require('node-schedule') | 
        
        
           | 
          const rimraf = require('rimraf') | 
        
        
           | 
          const crypto = require('crypto') | 
        
        
           | 
          const path = require('path') | 
        
        
           | 
          const fs = require('fs') | 
        
        
           | 
          const app = express() | 
        
        
           | 
          
 | 
        
        
           | 
          // Proxy request | 
        
        
           | 
          const r = request.defaults({'proxy':'http://127.0.0.1:8123'}) | 
        
        
           | 
          
 | 
        
        
           | 
          // Global settings | 
        
        
           | 
          app.set('maintenence', false) | 
        
        
           | 
          
 | 
        
        
           | 
          // Static files | 
        
        
           | 
          app.use(express.static('public')) | 
        
        
           | 
          
 | 
        
        
           | 
          //Routes | 
        
        
           | 
          app.get('/', function (req, res) { | 
        
        
           | 
            res.sendFile(path.join(__dirname + '/public/index.html')) | 
        
        
           | 
          }) | 
        
        
           | 
          
 | 
        
        
           | 
          app.get('/proxy', (req, res) => { | 
        
        
           | 
            const url = req.query.url | 
        
        
           | 
          
 | 
        
        
           | 
            if (!url) return res.status(404).send('Missing URL!') | 
        
        
           | 
            r(url, (err, response, body) => { | 
        
        
           | 
              if (!err && response.statusCode === 200) { | 
        
        
           | 
                return res.send(body) | 
        
        
           | 
              } | 
        
        
           | 
              res.status(404).send() | 
        
        
           | 
            }) | 
        
        
           | 
          }) | 
        
        
           | 
          
 | 
        
        
           | 
          app.get('/capture', async (req, res) => { | 
        
        
           | 
            const url = req.query.url | 
        
        
           | 
          
 | 
        
        
           | 
            if (!url) return res.status(404).send('Missing URL param!') | 
        
        
           | 
          
 | 
        
        
           | 
            if (app.enabled('maintenence')) return res.status(500).send('Try again in few seconds. Sorry!') | 
        
        
           | 
          
 | 
        
        
           | 
            const name = crypto.createHash('md5').update(url).digest('hex') | 
        
        
           | 
            const generatedPath = `/captures/${name}.png` | 
        
        
           | 
          
 | 
        
        
           | 
            if (fs.existsSync(`./${generatedPath}`)) { | 
        
        
           | 
              console.log(`Cached version served for ${url} as ${generatedPath}`) | 
        
        
           | 
              return res.sendFile(generatedPath, { root: __dirname }) | 
        
        
           | 
            } | 
        
        
           | 
          
 | 
        
        
           | 
            console.log(`Generating capture for ${url} as ${generatedPath}`) | 
        
        
           | 
            const browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox', '--proxy-server=127.0.0.1:8123'] }) | 
        
        
           | 
            const page = await browser.newPage() | 
        
        
           | 
            await page.goto(url) | 
        
        
           | 
            await page.setViewport({ | 
        
        
           | 
              width: 1280, | 
        
        
           | 
              height: 1000, | 
        
        
           | 
              deviceScaleFactor: 1 | 
        
        
           | 
            }); | 
        
        
           | 
            await page.screenshot({ path: `.${generatedPath}`, fullPage: true }) | 
        
        
           | 
            await browser.close() | 
        
        
           | 
            res.sendFile(generatedPath, { root: __dirname }) | 
        
        
           | 
          }) | 
        
        
           | 
          
 | 
        
        
           | 
          // Cron Cache control (“At minute 0 past every hour”) | 
        
        
           | 
          schedule.scheduleJob(`* */1 * * *`, function () { | 
        
        
           | 
            console.log('Cache clean up time!') | 
        
        
           | 
            app.set('maintenence', true) | 
        
        
           | 
            rimraf('./captures/*', () => { | 
        
        
           | 
              console.log('Cache clean finished!') | 
        
        
           | 
              app.set('maintenence', false) | 
        
        
           | 
            }) | 
        
        
           | 
          }) | 
        
        
           | 
          
 | 
        
        
           | 
          app.listen(process.env.PORT || 3000) |