UNPKG

4.38 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.isInSubscriberMode = isInSubscriberMode;
7exports.isNotConnected = isNotConnected;
8exports.throwIfInSubscriberMode = throwIfInSubscriberMode;
9exports.throwIfNotConnected = throwIfNotConnected;
10exports.throwIfCommandIsNotAllowed = throwIfCommandIsNotAllowed;
11exports.processArguments = processArguments;
12exports.processReply = processReply;
13exports.safelyExecuteCommand = safelyExecuteCommand;
14exports.default = command;
15
16var _lodash = require('lodash');
17
18var _lodash2 = _interopRequireDefault(_lodash);
19
20var _standardAsCallback = require('standard-as-callback');
21
22var _standardAsCallback2 = _interopRequireDefault(_standardAsCallback);
23
24var _promiseContainer = require('./promise-container');
25
26var _promiseContainer2 = _interopRequireDefault(_promiseContainer);
27
28function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
30function _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); } }
31
32function isInSubscriberMode(RedisMock) {
33 if (RedisMock.channels === undefined) {
34 return false;
35 }
36 return RedisMock.subscriberMode;
37}
38
39function isNotConnected(RedisMock) {
40 if (RedisMock.connected === undefined) {
41 return false;
42 }
43 return !RedisMock.connected;
44}
45
46function throwIfInSubscriberMode(commandName, RedisMock) {
47 if (isInSubscriberMode(RedisMock)) {
48 var allowedCommands = ['subscribe', 'psubscribe', 'unsubscribe', 'punsubscribe', 'ping', 'quit', 'disconnect'];
49 if (allowedCommands.indexOf(commandName) > -1) {
50 // command is allowed -> do not throw
51 } else {
52 throw new Error('Connection in subscriber mode, only subscriber commands may be used');
53 }
54 }
55}
56
57function throwIfNotConnected(commandName, RedisMock) {
58 if (isNotConnected(RedisMock)) {
59 if (commandName !== 'connect') {
60 throw new Error("Stream isn't writeable and enableOfflineQueue options is false");
61 }
62 }
63}
64
65function throwIfCommandIsNotAllowed(commandName, RedisMock) {
66 throwIfInSubscriberMode(commandName, RedisMock);
67 throwIfNotConnected(commandName, RedisMock);
68}
69
70function processArguments(args, commandName, RedisMock) {
71 // fast return, the defineCommand command requires NO transformation of args
72 if (commandName === 'defineCommand') return args;
73
74 var commandArgs = args ? _lodash2.default.flatten(args) : [];
75 if (RedisMock.Command.transformers.argument[commandName]) {
76 commandArgs = RedisMock.Command.transformers.argument[commandName](args);
77 }
78 commandArgs = commandArgs.map(
79 // transform non-buffer arguments to strings to simulate real ioredis behavior
80 function (arg) {
81 return arg instanceof Buffer || arg === null || arg === undefined ? arg : arg.toString();
82 });
83 return commandArgs;
84}
85
86function processReply(result, commandName, RedisMock) {
87 if (RedisMock.Command.transformers.reply[commandName]) {
88 return RedisMock.Command.transformers.reply[commandName](result);
89 }
90 return result;
91}
92
93function safelyExecuteCommand(commandEmulator, commandName, RedisMock) {
94 throwIfCommandIsNotAllowed(commandName, RedisMock);
95
96 for (var _len = arguments.length, commandArgs = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
97 commandArgs[_key - 3] = arguments[_key];
98 }
99
100 var result = commandEmulator.apply(undefined, commandArgs);
101 return processReply(result, commandName, RedisMock);
102}
103
104function command(commandEmulator, commandName, RedisMock) {
105 return function () {
106 for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
107 args[_key2] = arguments[_key2];
108 }
109
110 var lastArgIndex = args.length - 1;
111 var callback = args[lastArgIndex];
112 if (typeof callback !== 'function') {
113 callback = undefined;
114 } else {
115 // eslint-disable-next-line no-param-reassign
116 args.length = lastArgIndex;
117 }
118
119 var commandArgs = processArguments(args, commandName, RedisMock);
120
121 var Promise = _promiseContainer2.default.get();
122
123 return (0, _standardAsCallback2.default)(new Promise(function (resolve) {
124 return resolve(safelyExecuteCommand.apply(undefined, [commandEmulator, commandName, RedisMock].concat(_toConsumableArray(commandArgs))));
125 }), callback);
126 };
127}
\No newline at end of file