import redis from 'redis';
import logger from '../../logger';

function debug() {
  logger.debug.apply(logger, ['RedisCacheAdapter', ...arguments]);
}

export class RedisCacheAdapter {

  constructor(ctx) {
    this.client = redis.createClient(ctx);
    this.p = Promise.resolve();
  }

  get(key) {
    debug('get', key);
    this.p = this.p.then(() => {
      return new Promise((resolve, _) => {
        this.client.get(key, function(err, res) {
          debug('-> get', key, res);
          if(!res) {
            return resolve(null);
          }
          resolve(JSON.parse(res));
        });
      });
    });
    return this.p;
  }

  put(key, value, ttl) {
    value = JSON.stringify(value);
    debug('put', key, value, ttl);
    this.p = this.p.then(() => {
      return new Promise((resolve, _) => {
        this.client.set(key, value, function(err, res) {
          resolve();
        });
      });
    });
    return this.p;
  }

  del(key) {
    debug('del', key);
    this.p = this.p.then(() => {
      return new Promise((resolve, _) => {
        this.client.del(key, function(err, res) {
          resolve();
        });
      });
    });
    return this.p;
  }

  clear() {
    debug('clear');
    this.p = this.p.then(() => {
      return new Promise((resolve, _) => {
        this.client.flushall(function(err, res) {
          resolve();
        });
      });
    });
    return this.p;
  }
}

export default RedisCacheAdapter;

@@ -56,16 +56,68 @@
 gger';%0A%0A
+const DEFAULT_REDIS_TTL = 30 * 1000; // 30 seconds%0A%0A
 function
@@ -851,32 +851,53 @@
 esolve, _) =%3E %7B%0A
+        if (ttl) %7B%0A  
         this.cli
@@ -904,16 +904,24 @@
 ent.
+p
 set
+ex
 (key,
+ ttl,
  val
@@ -947,32 +947,34 @@
 es) %7B%0A          
+ 
+ 
 resolve();%0A     
@@ -968,36 +968,161 @@
 olve();%0A        
+  
 %7D);%0A
+        %7D else %7B%0A          this.client.set(key, value, function(err, res) %7B%0A            resolve();%0A          %7D);%0A        %7D%0A
       %7D);%0A    %7D)

Expire values in RedisCacheAdapter (#2988)