UNPKG

hubot-cashbrain

Version:

Modifies the base brain to add a second set of keys to the datastore that expire and refresh themselves

79 lines (66 loc) 2.15 kB
# Description: # Modifies the base brain to add a second set of keys to the datastore # All cash keys start with $. # added api: # $get # # Dependencies: # "fibers/future": "" # # Commands: # None # # Author: # jhgaylor Log = require 'log' Future = require 'fibers/future' class CashBrain toString: -> "<< CashBrain >>" $logger: new Log process.env.HUBOT_LOG_LEVEL or 'info' $refreshCallbacks: { } $refreshLifespans: { } # return the inner function $refresh: (key, cb) => @$logger.debug "$refresh called" # TODO: once this method is 'synchronous', it works! refreshCb = @$refreshCallbacks[key] @$logger.debug "preparing to wait on refreshCb" new_value = refreshCb().wait() @$logger.debug "done waiting on refreshCb" lifespan = @$refreshLifespans[key] @$logger.debug "fired callback with new value" cb and cb(new_value) @$logger.debug "setting cache with new value" @$set(key, new_value, lifespan) $register: (key, refreshCb, life_in_seconds) -> @$logger.debug "$register called" # register a callback to fire when the cache invalidates if refreshCb @$refreshCallbacks[key] = Future.wrap(refreshCb) unless life_in_seconds life_in_seconds = 3600 # 1 hour @$refreshLifespans[key] = life_in_seconds $get: (key, cb, refreshCb, life_in_seconds) -> @$logger.debug "$get called" if refreshCb @$register key, refreshCb, life_in_seconds @$logger.debug "get called on #{key}" cached_data = @get("$#{key}") if cached_data and new Date() < cached_data.expiration @$logger.info "cache hit for key: #{key}" cb cached_data.data else @$logger.info "cache miss for key: #{key}" @$refresh.future()(key, cb) $set: (key, value, life_in_seconds) -> @$logger.debug "@set called" future_date = new Date() @$logger.debug "future date set" future_date.setSeconds(future_date.getSeconds()+life_in_seconds) @$logger.debug "future date modified" @set "$#{key}", expiration: future_date, data: value @$logger.debug "@set returned" module.exports = CashBrain