UNPKG

ioredis-mock

Version:

This library emulates ioredis by performing all operations in-memory.

71 lines (55 loc) 1.79 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.zadd = zadd; var _es6Map = require('es6-map'); var _es6Map2 = _interopRequireDefault(_es6Map); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function zadd(key) { // consume options var options = []; for (var _len = arguments.length, vals = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { vals[_key - 1] = arguments[_key]; } while (['NX', 'XX', 'CH', 'INCR'].includes(vals[0])) { options.push(vals.shift()); } // make sure we have the correct number of args var elems = vals.length; if (elems % 2 !== 0 || elems < 1) throw new Error('ERR syntax error'); // set option vals var nx = options.includes('NX'); var xx = options.includes('XX'); var ch = options.includes('CH'); var incr = options.includes('INCR'); // validate options if (nx && xx) throw new Error('XX and NX options at the same time are not compatible'); if (incr && elems > 2) throw new Error('INCR option supports a single increment-element pair'); if (!this.data.has(key)) { if (xx) return 0; this.data.set(key, new _es6Map2.default()); } var map = this.data.get(key); var added = 0; var updated = 0; for (var i = 0; i < elems; i += 2) { var score = Number(vals[i]); var value = vals[i + 1]; if (map.has(value)) { if (!nx) { if (incr) { score += Number(map.get(value).score); } map.set(value, { score: score, value: value }); updated++; } // noop when nx } else if (!xx) { map.set(value, { score: score, value: value }); added++; } } this.data.set(key, map); return ch ? added + updated : added; }