UNPKG

ioredis-mock

Version:

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

127 lines (102 loc) 4.38 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.isInSubscriberMode = isInSubscriberMode; exports.isNotConnected = isNotConnected; exports.throwIfInSubscriberMode = throwIfInSubscriberMode; exports.throwIfNotConnected = throwIfNotConnected; exports.throwIfCommandIsNotAllowed = throwIfCommandIsNotAllowed; exports.processArguments = processArguments; exports.processReply = processReply; exports.safelyExecuteCommand = safelyExecuteCommand; exports.default = command; var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _standardAsCallback = require('standard-as-callback'); var _standardAsCallback2 = _interopRequireDefault(_standardAsCallback); var _promiseContainer = require('./promise-container'); var _promiseContainer2 = _interopRequireDefault(_promiseContainer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } function isInSubscriberMode(RedisMock) { if (RedisMock.channels === undefined) { return false; } return RedisMock.subscriberMode; } function isNotConnected(RedisMock) { if (RedisMock.connected === undefined) { return false; } return !RedisMock.connected; } function throwIfInSubscriberMode(commandName, RedisMock) { if (isInSubscriberMode(RedisMock)) { var allowedCommands = ['subscribe', 'psubscribe', 'unsubscribe', 'punsubscribe', 'ping', 'quit', 'disconnect']; if (allowedCommands.indexOf(commandName) > -1) { // command is allowed -> do not throw } else { throw new Error('Connection in subscriber mode, only subscriber commands may be used'); } } } function throwIfNotConnected(commandName, RedisMock) { if (isNotConnected(RedisMock)) { if (commandName !== 'connect') { throw new Error("Stream isn't writeable and enableOfflineQueue options is false"); } } } function throwIfCommandIsNotAllowed(commandName, RedisMock) { throwIfInSubscriberMode(commandName, RedisMock); throwIfNotConnected(commandName, RedisMock); } function processArguments(args, commandName, RedisMock) { // fast return, the defineCommand command requires NO transformation of args if (commandName === 'defineCommand') return args; var commandArgs = args ? _lodash2.default.flatten(args) : []; if (RedisMock.Command.transformers.argument[commandName]) { commandArgs = RedisMock.Command.transformers.argument[commandName](args); } commandArgs = commandArgs.map( // transform non-buffer arguments to strings to simulate real ioredis behavior function (arg) { return arg instanceof Buffer || arg === null || arg === undefined ? arg : arg.toString(); }); return commandArgs; } function processReply(result, commandName, RedisMock) { if (RedisMock.Command.transformers.reply[commandName]) { return RedisMock.Command.transformers.reply[commandName](result); } return result; } function safelyExecuteCommand(commandEmulator, commandName, RedisMock) { throwIfCommandIsNotAllowed(commandName, RedisMock); for (var _len = arguments.length, commandArgs = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { commandArgs[_key - 3] = arguments[_key]; } var result = commandEmulator.apply(undefined, commandArgs); return processReply(result, commandName, RedisMock); } function command(commandEmulator, commandName, RedisMock) { return function () { for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } var lastArgIndex = args.length - 1; var callback = args[lastArgIndex]; if (typeof callback !== 'function') { callback = undefined; } else { // eslint-disable-next-line no-param-reassign args.length = lastArgIndex; } var commandArgs = processArguments(args, commandName, RedisMock); var Promise = _promiseContainer2.default.get(); return (0, _standardAsCallback2.default)(new Promise(function (resolve) { return resolve(safelyExecuteCommand.apply(undefined, [commandEmulator, commandName, RedisMock].concat(_toConsumableArray(commandArgs)))); }), callback); }; }