{"version":3,"sources":["jsdelivr-header.js","/npm/hapi-prerender@1.0.2/index.js"],"names":[],"mappings":"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","file":"/npm/hapi-prerender@1.0.2/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/hapi-prerender@1.0.2/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","//\n// hapi plugin for [prerender](https://github.com/prerender/prerender).\n// Loosely based on [prerender-node](https://github.com/prerender/prerender-node)\n//\n\nvar Url = require('url');\nvar Zlib = require('zlib');\nvar Request = require('request');\nvar Hoek = require('hoek');\n\n// Declare internals\nvar internals = {};\n\n// googlebot, yahoo, and bingbot are not in this list because\n// we support _escaped_fragment_ and want to ensure people aren't\n// penalized for cloaking.\ninternals.crawlerUserAgents = [\n  // 'googlebot',\n  // 'yahoo',\n  // 'bingbot',\n  'baiduspider',\n  'facebookexternalhit',\n  'twitterbot',\n  'rogerbot',\n  'linkedinbot',\n  'embedly',\n  'quora link preview',\n  'showyoubot',\n  'outbrain',\n  'pinterest',\n  'developers.google.com/+/web/snippet'\n];\n\ninternals.extensionsToIgnore = [\n  '.js',\n  '.css',\n  '.xml',\n  '.less',\n  '.png',\n  '.jpg',\n  '.jpeg',\n  '.gif',\n  '.pdf',\n  '.doc',\n  '.txt',\n  '.ico',\n  '.rss',\n  '.zip',\n  '.mp3',\n  '.rar',\n  '.exe',\n  '.wmv',\n  '.doc',\n  '.avi',\n  '.ppt',\n  '.mpg',\n  '.mpeg',\n  '.tif',\n  '.wav',\n  '.mov',\n  '.psd',\n  '.ai',\n  '.xls',\n  '.mp4',\n  '.m4a',\n  '.swf',\n  '.dat',\n  '.dmg',\n  '.iso',\n  '.flv',\n  '.m4v',\n  '.torrent'\n];\n\ninternals.shouldShowPrerenderedPage = function (req) {\n  var userAgent = req.headers['user-agent'];\n  var bufferAgent = req.headers['x-bufferbot'];\n  var isRequestingPrerenderedPage = false;\n\n  if (!userAgent) { return false; }\n  if (req.method.toLowerCase() !== 'get') { return false; }\n\n  //if it contains _escaped_fragment_, show prerendered page\n  if (typeof req.url.query._escaped_fragment_ !== 'undefined') {\n    isRequestingPrerenderedPage = true;\n  }\n\n  //if it is a bot...show prerendered page\n  var knownBot = internals.crawlerUserAgents.some(function (crawlerUserAgent) {\n    return userAgent.toLowerCase().indexOf(crawlerUserAgent.toLowerCase()) !== -1;\n  });\n  \n  if (knownBot) { isRequestingPrerenderedPage = true; }\n\n  //if it is BufferBot...show prerendered page\n  if (bufferAgent) { isRequestingPrerenderedPage = true; }\n\n  //if it is a bot and is requesting a resource...dont prerender\n  var resource = internals.extensionsToIgnore.some(function (extension) {\n    var regexp = new RegExp(extension + '$');\n    return regexp.test(req.url.pathname);\n  });\n\n  if (resource) { return false; }\n\n  return isRequestingPrerenderedPage;\n};\n\n\n//\n// Public API\n//\n\nexports.register = function (server, options, next) {\n\n  var settings = Hoek.applyToDefaults({\n    serviceUrl: process.env.PRERENDER_SERVICE_URL || 'http://service.prerender.io/',\n    token: process.env.PRERENDER_TOKEN,\n    protocol: false,\n    beforeRender: function (req, done) { done(); },\n    afterRender: function (req, resp) {}\n  }, options);\n\n  function buildApiUrl(req) {\n    var prerenderUrl = settings.serviceUrl;\n    var forwardSlash = prerenderUrl.indexOf('/', prerenderUrl.length - 1) !== -1 ? '' : '/';\n\n    // Here we need to look at the request's protocol, not sure if this is\n    // correct...\n    var protocol = req.server.info.protocol;\n\n    //if (req.get('CF-Visitor')) {\n    //  var match = req.get('CF-Visitor').match(/\"scheme\":\"(http|https)\"/);\n    //  if (match) protocol = match[1];\n    //}\n    //if (req.get('X-Forwarded-Proto')) {\n    //  protocol = req.get('X-Forwarded-Proto').split(',')[0];\n    //}\n\n    if (settings.protocol) {\n      protocol = settings.protocol;\n    }\n\n    var fullUrl = protocol + \"://\" + req.headers.host + Url.format(req.url);\n    return prerenderUrl + forwardSlash + fullUrl;\n  }\n\n  function plainResponse(resp, cb) {\n    var content = '';\n    resp.on('data', function (chunk) {\n      content += chunk;\n    });\n    resp.on('end', function () {\n      resp.body = content;\n      cb(null, resp);\n    });\n  }\n\n  function gzipResponse(resp, cb) {\n    var gunzip = Zlib.createGunzip();\n    var content = '';\n\n    gunzip.on('data', function (chunk) {\n      content += chunk;\n    });\n\n    gunzip.on('end', function () {\n      resp.body = content;\n      delete resp.headers['content-encoding'];\n      delete resp.headers['content-length'];\n      cb(null, resp);\n    });\n\n    resp.pipe(gunzip);\n  }\n\n  function getPrerenderedPageResponse(req, cb) {\n    var reqOptions = {\n      uri: Url.parse(buildApiUrl(req)),\n      followRedirect: false\n    };\n\n    if (settings.token) {\n      reqOptions.headers = {\n        'X-Prerender-Token': settings.token,\n        'User-Agent': req.headers['user-agent'],\n        'Accept-Encoding': 'gzip'\n      };\n    }\n\n    Request(reqOptions)\n      .on('error', function (err) {\n        cb(err);\n      })\n      .on('response', function (resp) {\n        var encoding = resp.headers['content-encoding'];\n        if (encoding && encoding === 'gzip') {\n          gzipResponse(resp, cb);\n        } else {\n          plainResponse(resp, cb);\n        }\n      });\n  }\n\n  server.ext('onRequest', function (req, reply) {\n    // Only handle requests with _escaped_fragment_ query param.\n    if (!internals.shouldShowPrerenderedPage(req)) { return reply.continue(); }\n\n    function sendResponse(resp) {\n      var r = reply(resp.body);\n      r.code(resp.statusCode);\n      Object.getOwnPropertyNames(resp.headers).forEach(function (k) {\n        r.header(k, resp.headers[k]);\n      });\n    }\n\n    settings.beforeRender(req, function (err, cached) {\n      if (!err && cached && typeof cached.body === 'string') {\n        return sendResponse(cached);\n      }\n    \n      getPrerenderedPageResponse(req, function (err, resp) {\n        if (err) {\n          console.error('Error getting prerendered page.');\n          console.error(err);\n          console.error('Falling back to unrendered (normal) reponse...');\n          return reply.continue();\n        }\n\n        var prerenderedResponse = {\n          statusCode: resp.statusCode,\n          headers: resp.headers,\n          body: resp.body\n        };\n\n        settings.afterRender(req, prerenderedResponse);\n        sendResponse(prerenderedResponse);\n      });\n    });\n  });\n\n  next();\n\n};\n\nexports.register.attributes = {\n  pkg: require('./package.json')\n};\n\n"]}