{"version":3,"sources":["jsdelivr-header.js","/npm/gpdc-dynamodb@1.0.6/index.js"],"names":[],"mappings":"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","file":"/npm/gpdc-dynamodb@1.0.6/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/gpdc-dynamodb@1.0.6/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","'use strict';\r\n\r\nconst md5 = require('md5');\r\nconst logger = require('simple-level-log/logger');\r\n\r\n\r\nmodule.exports.CacheManager = class CacheManager {\r\n  constructor(\r\n    documentClient,\r\n    dynamoDBTableName,\r\n    downLoadCounter = true,\r\n    redundancyCounter = true,\r\n    defaultTTLInSeconds = 60 * 15) {\r\n    this.documentClient = documentClient;\r\n    this.defaultTTLInSeconds = defaultTTLInSeconds;\r\n    this.tableName = dynamoDBTableName;\r\n    this.downLoadCounter = downLoadCounter;\r\n    this.redundancyCounter = redundancyCounter;\r\n  }\r\n\r\n  /**\r\n   * \r\n   * @param {*} key \r\n   * @param {*} recencyInSeconds \r\n   */\r\n  async get(key, recencyInSeconds = null) {\r\n    if (null != recencyInSeconds && 0 >= recencyInSeconds) {\r\n      return null;\r\n    }\r\n\r\n    const keyMD5 = md5(key);\r\n    const timeNowInMilliseconds = Date.now();\r\n    const timeNowInSeconds = Math.floor(timeNowInMilliseconds / 1000);\r\n    const recentTimeInMilliseconds = null == recencyInSeconds ? 0 : timeNowInMilliseconds - (recencyInSeconds * 1000);\r\n\r\n    let dbItem = null;\r\n    let params = null;\r\n\r\n    try {\r\n      params = {\r\n        ProjectionExpression: 'cacheValue, ExpiryTime',\r\n        TableName: this.tableName,\r\n        KeyConditionExpression: 'KeyMD5 = :keyMD5',\r\n        ExpressionAttributeValues: {\r\n          ':keyMD5': keyMD5,\r\n          ':timeNowInSeconds': timeNowInSeconds,\r\n          ':recentTimeInMilliseconds': recentTimeInMilliseconds,\r\n        },\r\n        FilterExpression: 'ExpiryTime > :timeNowInSeconds and timeUpdated > :recentTimeInMilliseconds',\r\n        Limit: 1\r\n      };\r\n\r\n      const dbRecord = await this.documentClient.query(params).promise();\r\n      if (null == dbRecord || null == dbRecord.Items || 0 === dbRecord.Items.length) {\r\n        return null;\r\n      }\r\n\r\n      // eslint-disable-next-line prefer-destructuring\r\n      dbItem = dbRecord.Items[0];\r\n    } catch (e) {\r\n      logger.warn(`Error occurred while returning cacheValue of: (KeyMD5=${keyMD5}, cacheKey=${key}):`);\r\n      logger.error(e);\r\n      return null;\r\n    }\r\n\r\n    if (true === this.downLoadCounter) {\r\n      //--- Increment download counter.\r\n      try {\r\n        params = {\r\n          TableName: this.tableName,\r\n          Key: {\r\n            KeyMD5: keyMD5,\r\n          },\r\n          UpdateExpression: 'set downloads = downloads + :one',\r\n          ExpressionAttributeValues: {\r\n            ':one': 1,\r\n          },\r\n          ReturnValues: 'UPDATED_NEW',\r\n        };\r\n\r\n        const data = await this.documentClient.update(params).promise();\r\n      } catch (e) {\r\n        logger.error(e);\r\n      }\r\n    }\r\n\r\n    return { value: JSON.parse(dbItem.cacheValue), ExpiryTime: dbItem.ExpiryTime };\r\n  }\r\n\r\n\r\n  /**\r\n   * \r\n   * @param {*} key \r\n   * @param {*} value \r\n   * @param {*} ttlInSeconds \r\n   */\r\n  async put(key, value, ttlInSeconds) {\r\n    if (null == ttlInSeconds || 0 >= ttlInSeconds) {\r\n      ttlInSeconds = this.defaultTTLInSeconds;\r\n      logger.warn(`Updagraded ttlInSeconds value to ${this.defaultTTLInSeconds} seconds.`);\r\n    }\r\n\r\n    if (null == value) {\r\n      logger.warn(`${key} is not cached as value associated it is null.`);\r\n      return null;\r\n    }\r\n\r\n    const valueToCache = logger.stringify(value);\r\n    const keyMD5 = md5(key);\r\n    const valueMD5 = md5(valueToCache);\r\n    let timeNowInMilliseconds = Date.now();\r\n    let timeNowInSeconds = Math.floor(timeNowInMilliseconds / 1000);\r\n\r\n    let params = null;\r\n\r\n    try {\r\n      params = {\r\n        ProjectionExpression: 'ValueMD5, ttlInSeconds, ExpiryTime',\r\n        TableName: this.tableName,\r\n        KeyConditionExpression: 'KeyMD5 = :keyMD5',\r\n        ExpressionAttributeValues: {\r\n          ':keyMD5': keyMD5,\r\n          ':timeNowInSeconds': timeNowInSeconds,\r\n          ':valueMD5': valueMD5,\r\n        },\r\n        FilterExpression: 'ExpiryTime > :timeNowInSeconds and ValueMD5 = :valueMD5',\r\n        Limit: 1\r\n      };\r\n\r\n      const dbRecord = await this.documentClient.query(params).promise();\r\n      if (null != dbRecord && null != dbRecord.Items && 0 !== dbRecord.Items.length) {\r\n        const dbItem = dbRecord.Items[0];\r\n\r\n        if (true !== this.redundancyCounter) {\r\n          return { keyMD5, ExpiryTime: dbItem.ExpiryTime };\r\n        }\r\n\r\n        // Increment redundancy, timeUpdated and ExpiryTime\r\n        params = {\r\n          TableName: this.tableName,\r\n          Key: {\r\n            KeyMD5: keyMD5,\r\n          },\r\n          UpdateExpression: 'set redundancy = redundancy + :one, timeUpdated = :timeNowInSeconds, ExpiryTime = :ExpiryTime',\r\n          ExpressionAttributeValues: {\r\n            ':one': 1,\r\n            ':timeNowInSeconds': timeNowInSeconds,\r\n            ':ExpiryTime': timeNowInSeconds + dbItem.ttlInSeconds,\r\n          },\r\n          ReturnValues: 'UPDATED_NEW',\r\n        };\r\n\r\n        const data = await this.documentClient.update(params).promise();\r\n        return { keyMD5, ExpiryTime: data.Attributes.ExpiryTime };\r\n      }\r\n    } catch (e) {\r\n      logger.error(e);\r\n      return null;\r\n    }\r\n\r\n    try {\r\n      let timeNowInMilliseconds = Date.now();\r\n      let timeNowInSeconds = Math.floor(timeNowInMilliseconds / 1000);\r\n      params = {\r\n        TableName: this.tableName,\r\n        Item: {\r\n          KeyMD5: keyMD5,\r\n          ValueMD5: valueMD5,\r\n          cacheKey: key,\r\n          cacheValue: valueToCache,\r\n          ttlInSeconds,\r\n          ExpiryTime: timeNowInSeconds + ttlInSeconds,\r\n          timeCreated: timeNowInMilliseconds,\r\n          timeUpdated: timeNowInMilliseconds,\r\n          downloads: 0,\r\n          redundancy: 0,\r\n        },\r\n      };\r\n      await this.documentClient.put(params).promise();\r\n      return { keyMD5, ExpiryTime: params.Item.ExpiryTime };\r\n    } catch (e) {\r\n      logger.error(e);\r\n    }\r\n    return null;\r\n  }\r\n\r\n\r\n  /**\r\n   * \r\n   * @param {*} key \r\n   */\r\n  async delete(key) {\r\n\r\n    const keyMD5 = md5(key);\r\n\r\n    try {\r\n      const params = {\r\n        TableName: this.tableName,\r\n        Key: {\r\n          KeyMD5: keyMD5,\r\n        }\r\n      };\r\n      const dbRecord = await this.documentClient.delete(params).promise();\r\n      return true;\r\n    } catch (e) {\r\n      logger.error(e);\r\n    }\r\n\r\n    return false;\r\n  }\r\n};\r\n"]}