mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
const { LRUCache } = require('lru-cache')
 | 
						|
const Logger = require('../Logger')
 | 
						|
const Database = require('../Database')
 | 
						|
 | 
						|
class ApiCacheManager {
 | 
						|
  constructor(options = { max: 1000, maxSize: 10 * 1000 * 1000, sizeCalculation: item => item.length }) {
 | 
						|
    this.options = options
 | 
						|
  }
 | 
						|
 | 
						|
  init(database = Database) {
 | 
						|
    this.cache = new LRUCache(this.options)
 | 
						|
    let hooks = ['afterCreate', 'afterUpdate', 'afterDestroy', 'afterBulkCreate', 'afterBulkUpdate', 'afterBulkDestroy']
 | 
						|
    hooks.forEach(hook => database.sequelize.addHook(hook, (model) => this.clear(model, hook)))
 | 
						|
  }
 | 
						|
 | 
						|
  clear(model, hook) {
 | 
						|
    Logger.debug(`[ApiCacheManager] ${model.constructor.name}.${hook}: Clearing cache`)
 | 
						|
    this.cache.clear()
 | 
						|
  }
 | 
						|
 | 
						|
  get middleware() {
 | 
						|
    return (req, res, next) => {
 | 
						|
      const key = { user: req.user.username, url: req.url }
 | 
						|
      const stringifiedKey = JSON.stringify(key)
 | 
						|
      Logger.debug(`[ApiCacheManager] count: ${this.cache.size} size: ${this.cache.calculatedSize}`)
 | 
						|
      Logger.debug(`[ApiCacheManager] Cache key: ${stringifiedKey}`)
 | 
						|
      const cached = this.cache.get(stringifiedKey)
 | 
						|
      if (cached) {
 | 
						|
        Logger.debug(`[ApiCacheManager] Cache hit: ${stringifiedKey}`)
 | 
						|
        res.send(cached)
 | 
						|
        return
 | 
						|
      }
 | 
						|
      res.sendResponse = res.send
 | 
						|
      res.send = (body) => {
 | 
						|
        Logger.debug(`[ApiCacheManager] Cache miss: ${stringifiedKey}`)
 | 
						|
        if (key.url.search(/^\/libraries\/.*?\/personalized/) !== -1) {
 | 
						|
          Logger.debug(`[ApiCacheManager] Caching personalized with 30 minues TTL`)
 | 
						|
          this.cache.set(stringifiedKey, body, { ttl: 30 * 60 * 1000 })
 | 
						|
        } else {
 | 
						|
          this.cache.set(stringifiedKey, body)
 | 
						|
        }
 | 
						|
        res.sendResponse(body)
 | 
						|
      }
 | 
						|
      next()
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
module.exports = ApiCacheManager |