{"version":3,"sources":["jsdelivr-header.js","/npm/koa-redis-cache@3.0.3/index.js"],"names":[],"mappings":"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","file":"/npm/koa-redis-cache@3.0.3/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/koa-redis-cache@3.0.3/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'use strict'\n\nconst { pathToRegexp } = require('path-to-regexp')\nconst wrapper = require('co-redis')\nconst readall = require('readall')\nconst crypto = require('crypto')\nconst Redis = require('redis')\n\nmodule.exports = function(options = {}) {\n  let redisAvailable = false\n\n  const {\n    prefix = 'koa-redis-cache:',\n    expire = 30 * 60, // 30 min\n    routes = ['(.*)'],\n    exclude = [],\n    passParam = '',\n    maxLength = Infinity,\n    onerror = function() {}\n  } = options\n\n  const {\n    host:redisHost = 'localhost',\n    port:redisPort = 6379,\n    url:redisUrl = `redis://${redisHost}:${redisPort}/`,\n    options:redisOptions = {}\n  } = options.redis || {}\n\n  /**\n   * redisClient\n   */\n  const redisClient = wrapper(Redis.createClient(redisUrl, redisOptions))\n  redisClient.on('error', (error)=> {\n    redisAvailable = false\n    onerror(error)\n  })\n  redisClient.on('end', () => {\n    redisAvailable = false\n  })\n  redisClient.on('connect', () => {\n    redisAvailable = true\n  })\n\n  return async function cache(ctx, next) {\n    const { url, path } = ctx.request\n    const resolvedPrefix = typeof prefix === 'function' ? prefix.call(ctx, ctx) : prefix;\n    const key = resolvedPrefix + md5(url)\n    const tkey = key + ':type'\n    let match = false\n    let routeExpire = false\n\n    for (let i = 0; i < routes.length; i++) {\n      let route = routes[i]\n\n      if (typeof routes[i] === 'object') {\n        route = routes[i].path\n        routeExpire = routes[i].expire\n      }\n\n      if (paired(route, path)) {\n        match = true\n        break\n      }\n    }\n\n    for (let j = 0; j < exclude.length; j++) {\n      if (paired(exclude[j], path)) {\n        match = false\n        break\n      }\n    }\n\n    if (!redisAvailable || !match || (passParam && ctx.request.query[passParam]) || (ctx.request.method !== 'GET')) {\n      return await next()\n    }\n\n    let ok = false\n    try {\n      ok = await getCache(ctx, key, tkey)\n    } catch (e) {\n      ok = false\n    }\n    if (ok) {\n      return\n    }\n\n    await next()\n\n    try {\n      let trueExpire = routeExpire || expire\n      await setCache(ctx, key, tkey, trueExpire)\n    } catch (e) {}\n    routeExpire = false\n  }\n\n  /**\n   * getCache\n   */\n  async function getCache(ctx, key, tkey) {\n    let value = await redisClient.get(key)\n    let type\n    let ok = false\n\n    if (value) {\n      ctx.response.status = 200\n      type = (await redisClient.get(tkey)) || 'text/html'\n      // can happen if user specified return_buffers: true in redis options\n      if (Buffer.isBuffer(type)) type = type.toString()\n      ctx.response.set('X-Koa-Redis-Cache', 'true')\n      ctx.response.type = type\n      ctx.response.body = value\n      ok = true\n    }\n\n    return ok\n  }\n\n  /**\n   * setCache\n   */\n  async function setCache(ctx, key, tkey, expire) {\n    let body = ctx.response.body\n\n    if ((ctx.request.method !== 'GET') || (ctx.response.status !== 200) || !body) {\n      return\n    }\n\n    if (typeof body === 'string') {\n      // string\n      if (Buffer.byteLength(body) > maxLength) return\n      await redisClient.setex(key, expire, body)\n    } else if (Buffer.isBuffer(body)) {\n      // buffer\n      if (body.length > maxLength) return\n      await redisClient.setex(key, expire, body)\n    } else if (typeof body === 'object' && ctx.response.type === 'application/json') {\n      // json\n      body = JSON.stringify(body)\n      if (Buffer.byteLength(body) > maxLength) return\n      await redisClient.setex(key, expire, body)\n    } else if (typeof body.pipe === 'function') {\n      // stream\n      body = await read(body)\n      ctx.response.body = body\n      if (Buffer.byteLength(body) > maxLength) return\n      await redisClient.setex(key, expire, body)\n    } else {\n      return\n    }\n\n    await cacheType(ctx, tkey, expire)\n  }\n\n  /**\n   * cacheType\n   */\n  async function cacheType(ctx, tkey, expire) {\n    let type = ctx.response.type\n    if (type) {\n      await redisClient.setex(tkey, expire, type)\n    }\n  }\n}\n\nfunction paired(route, path) {\n  let options = {\n    sensitive: true,\n    strict: true,\n  }\n\n  return pathToRegexp(route, [], options).exec(path)\n}\n\nfunction read(stream) {\n  return new Promise((resolve, reject) => {\n    readall(stream, (err, data) => {\n      if (err) {\n        reject(err)\n      } else {\n        resolve(data)\n      }\n    })\n  })\n}\n\nfunction md5(str) {\n  return crypto.createHash('md5').update(str).digest('hex')\n}\n"]}