RedisCacheAdapter.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = exports.RedisCacheAdapter = void 0;
  6. var _redis = require("redis");
  7. var _logger = _interopRequireDefault(require("../../logger"));
  8. var _KeyPromiseQueue = require("../../KeyPromiseQueue");
  9. function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
  10. const DEFAULT_REDIS_TTL = 30 * 1000; // 30 seconds in milliseconds
  11. const FLUSH_DB_KEY = '__flush_db__';
  12. function debug(...args) {
  13. const message = ['RedisCacheAdapter: ' + arguments[0]].concat(args.slice(1, args.length));
  14. _logger.default.debug.apply(_logger.default, message);
  15. }
  16. const isValidTTL = ttl => typeof ttl === 'number' && ttl > 0;
  17. class RedisCacheAdapter {
  18. constructor(redisCtx, ttl = DEFAULT_REDIS_TTL) {
  19. this.ttl = isValidTTL(ttl) ? ttl : DEFAULT_REDIS_TTL;
  20. this.client = (0, _redis.createClient)(redisCtx);
  21. this.queue = new _KeyPromiseQueue.KeyPromiseQueue();
  22. this.client.on('error', err => {
  23. _logger.default.error('RedisCacheAdapter client error', {
  24. error: err
  25. });
  26. });
  27. this.client.on('connect', () => {});
  28. this.client.on('reconnecting', () => {});
  29. this.client.on('ready', () => {});
  30. }
  31. async connect() {
  32. if (this.client.isOpen) {
  33. return;
  34. }
  35. return this.client.connect();
  36. }
  37. async handleShutdown() {
  38. if (!this.client) {
  39. return;
  40. }
  41. try {
  42. await this.client.quit();
  43. } catch (err) {
  44. _logger.default.error('RedisCacheAdapter error on shutdown', {
  45. error: err
  46. });
  47. }
  48. }
  49. async get(key) {
  50. debug('get', {
  51. key
  52. });
  53. try {
  54. await this.queue.enqueue(key);
  55. const res = await this.client.get(key);
  56. if (!res) {
  57. return null;
  58. }
  59. return JSON.parse(res);
  60. } catch (err) {
  61. _logger.default.error('RedisCacheAdapter error on get', {
  62. error: err
  63. });
  64. }
  65. }
  66. async put(key, value, ttl = this.ttl) {
  67. value = JSON.stringify(value);
  68. debug('put', {
  69. key,
  70. value,
  71. ttl
  72. });
  73. await this.queue.enqueue(key);
  74. if (ttl === 0) {
  75. // ttl of zero is a logical no-op, but redis cannot set expire time of zero
  76. return;
  77. }
  78. if (ttl === Infinity) {
  79. return this.client.set(key, value);
  80. }
  81. if (!isValidTTL(ttl)) {
  82. ttl = this.ttl;
  83. }
  84. return this.client.set(key, value, {
  85. PX: ttl
  86. });
  87. }
  88. async del(key) {
  89. debug('del', {
  90. key
  91. });
  92. await this.queue.enqueue(key);
  93. return this.client.del(key);
  94. }
  95. async clear() {
  96. debug('clear');
  97. await this.queue.enqueue(FLUSH_DB_KEY);
  98. return this.client.sendCommand(['FLUSHDB']);
  99. }
  100. // Used for testing
  101. getAllKeys() {
  102. return this.client.keys('*');
  103. }
  104. }
  105. exports.RedisCacheAdapter = RedisCacheAdapter;
  106. var _default = exports.default = RedisCacheAdapter;
  107. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVkaXMiLCJyZXF1aXJlIiwiX2xvZ2dlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfS2V5UHJvbWlzZVF1ZXVlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiREVGQVVMVF9SRURJU19UVEwiLCJGTFVTSF9EQl9LRVkiLCJkZWJ1ZyIsImFyZ3MiLCJtZXNzYWdlIiwiYXJndW1lbnRzIiwiY29uY2F0Iiwic2xpY2UiLCJsZW5ndGgiLCJsb2dnZXIiLCJhcHBseSIsImlzVmFsaWRUVEwiLCJ0dGwiLCJSZWRpc0NhY2hlQWRhcHRlciIsImNvbnN0cnVjdG9yIiwicmVkaXNDdHgiLCJjbGllbnQiLCJjcmVhdGVDbGllbnQiLCJxdWV1ZSIsIktleVByb21pc2VRdWV1ZSIsIm9uIiwiZXJyIiwiZXJyb3IiLCJjb25uZWN0IiwiaXNPcGVuIiwiaGFuZGxlU2h1dGRvd24iLCJxdWl0IiwiZ2V0Iiwia2V5IiwiZW5xdWV1ZSIsInJlcyIsIkpTT04iLCJwYXJzZSIsInB1dCIsInZhbHVlIiwic3RyaW5naWZ5IiwiSW5maW5pdHkiLCJzZXQiLCJQWCIsImRlbCIsImNsZWFyIiwic2VuZENvbW1hbmQiLCJnZXRBbGxLZXlzIiwia2V5cyIsImV4cG9ydHMiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9DYWNoZS9SZWRpc0NhY2hlQWRhcHRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVDbGllbnQgfSBmcm9tICdyZWRpcyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBLZXlQcm9taXNlUXVldWUgfSBmcm9tICcuLi8uLi9LZXlQcm9taXNlUXVldWUnO1xuXG5jb25zdCBERUZBVUxUX1JFRElTX1RUTCA9IDMwICogMTAwMDsgLy8gMzAgc2Vjb25kcyBpbiBtaWxsaXNlY29uZHNcbmNvbnN0IEZMVVNIX0RCX0tFWSA9ICdfX2ZsdXNoX2RiX18nO1xuXG5mdW5jdGlvbiBkZWJ1ZyguLi5hcmdzOiBhbnkpIHtcbiAgY29uc3QgbWVzc2FnZSA9IFsnUmVkaXNDYWNoZUFkYXB0ZXI6ICcgKyBhcmd1bWVudHNbMF1dLmNvbmNhdChhcmdzLnNsaWNlKDEsIGFyZ3MubGVuZ3RoKSk7XG4gIGxvZ2dlci5kZWJ1Zy5hcHBseShsb2dnZXIsIG1lc3NhZ2UpO1xufVxuXG5jb25zdCBpc1ZhbGlkVFRMID0gdHRsID0+IHR5cGVvZiB0dGwgPT09ICdudW1iZXInICYmIHR0bCA+IDA7XG5cbmV4cG9ydCBjbGFzcyBSZWRpc0NhY2hlQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKHJlZGlzQ3R4LCB0dGwgPSBERUZBVUxUX1JFRElTX1RUTCkge1xuICAgIHRoaXMudHRsID0gaXNWYWxpZFRUTCh0dGwpID8gdHRsIDogREVGQVVMVF9SRURJU19UVEw7XG4gICAgdGhpcy5jbGllbnQgPSBjcmVhdGVDbGllbnQocmVkaXNDdHgpO1xuICAgIHRoaXMucXVldWUgPSBuZXcgS2V5UHJvbWlzZVF1ZXVlKCk7XG4gICAgdGhpcy5jbGllbnQub24oJ2Vycm9yJywgZXJyID0+IHsgbG9nZ2VyLmVycm9yKCdSZWRpc0NhY2hlQWRhcHRlciBjbGllbnQgZXJyb3InLCB7IGVycm9yOiBlcnIgfSkgfSk7XG4gICAgdGhpcy5jbGllbnQub24oJ2Nvbm5lY3QnLCAoKSA9PiB7fSk7XG4gICAgdGhpcy5jbGllbnQub24oJ3JlY29ubmVjdGluZycsICgpID0+IHt9KTtcbiAgICB0aGlzLmNsaWVudC5vbigncmVhZHknLCAoKSA9PiB7fSk7XG4gIH1cblxuICBhc3luYyBjb25uZWN0KCkge1xuICAgIGlmICh0aGlzLmNsaWVudC5pc09wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmNvbm5lY3QoKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVNodXRkb3duKCkge1xuICAgIGlmICghdGhpcy5jbGllbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnF1aXQoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignUmVkaXNDYWNoZUFkYXB0ZXIgZXJyb3Igb24gc2h1dGRvd24nLCB7IGVycm9yOiBlcnIgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0KGtleSkge1xuICAgIGRlYnVnKCdnZXQnLCB7IGtleSB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5lbnF1ZXVlKGtleSk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXQoa2V5KTtcbiAgICAgIGlmICghcmVzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignUmVkaXNDYWNoZUFkYXB0ZXIgZXJyb3Igb24gZ2V0JywgeyBlcnJvcjogZXJyIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHB1dChrZXksIHZhbHVlLCB0dGwgPSB0aGlzLnR0bCkge1xuICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIGRlYnVnKCdwdXQnLCB7IGtleSwgdmFsdWUsIHR0bCB9KTtcbiAgICBhd2FpdCB0aGlzLnF1ZXVlLmVucXVldWUoa2V5KTtcbiAgICBpZiAodHRsID09PSAwKSB7XG4gICAgICAvLyB0dGwgb2YgemVybyBpcyBhIGxvZ2ljYWwgbm8tb3AsIGJ1dCByZWRpcyBjYW5ub3Qgc2V0IGV4cGlyZSB0aW1lIG9mIHplcm9cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHRsID09PSBJbmZpbml0eSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNldChrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzVmFsaWRUVEwodHRsKSkge1xuICAgICAgdHRsID0gdGhpcy50dGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXQoa2V5LCB2YWx1ZSwgeyBQWDogdHRsIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVsKGtleSkge1xuICAgIGRlYnVnKCdkZWwnLCB7IGtleSB9KTtcbiAgICBhd2FpdCB0aGlzLnF1ZXVlLmVucXVldWUoa2V5KTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsKGtleSk7XG4gIH1cblxuICBhc3luYyBjbGVhcigpIHtcbiAgICBkZWJ1ZygnY2xlYXInKTtcbiAgICBhd2FpdCB0aGlzLnF1ZXVlLmVucXVldWUoRkxVU0hfREJfS0VZKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZENvbW1hbmQoWydGTFVTSERCJ10pO1xuICB9XG5cbiAgLy8gVXNlZCBmb3IgdGVzdGluZ1xuICBnZXRBbGxLZXlzKCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5rZXlzKCcqJyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVkaXNDYWNoZUFkYXB0ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGdCQUFBLEdBQUFILE9BQUE7QUFBd0QsU0FBQUUsdUJBQUFFLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFFeEQsTUFBTUcsaUJBQWlCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3JDLE1BQU1DLFlBQVksR0FBRyxjQUFjO0FBRW5DLFNBQVNDLEtBQUtBLENBQUMsR0FBR0MsSUFBUyxFQUFFO0VBQzNCLE1BQU1DLE9BQU8sR0FBRyxDQUFDLHFCQUFxQixHQUFHQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsTUFBTSxDQUFDSCxJQUFJLENBQUNJLEtBQUssQ0FBQyxDQUFDLEVBQUVKLElBQUksQ0FBQ0ss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