UNPKG

5 kBJavaScriptView Raw
1var patternToRegex = require('./helpers').patternToRegex;
2
3/**
4 * Del
5 */
6exports.del = function (mockInstance, keys, callback) {
7
8 if (!(keys instanceof Array)) {
9 keys = [keys];
10 }
11
12 var keysDeleted = 0;
13
14 for (var i = 0; i < keys.length; i++) {
15
16 if (keys[i] in mockInstance.storage) {
17
18 delete mockInstance.storage[keys[i]];
19 keysDeleted++;
20
21 }
22 }
23
24 mockInstance._callCallback(callback, null, keysDeleted);
25}
26
27/**
28 * Exists
29 */
30exports.exists = function (mockInstance, keys, callback) {
31 if (!(keys instanceof Array)) {
32 keys = [keys];
33 }
34
35 var result = 0
36 for (var i = 0; i < keys.length; i++) {
37 if( keys[i] in mockInstance.storage) {
38 result++
39 }
40 }
41
42 mockInstance._callCallback(callback, null, result);
43}
44
45exports.type = function(mockInstance, key, callback) {
46 var type = "none";
47
48 if (key in mockInstance.storage) {
49 type = mockInstance.storage[key].type;
50 }
51
52 mockInstance._callCallback(callback, null, type);
53};
54
55/**
56 * Expire
57 */
58 var expire = function (mockInstance, key, seconds, callback) {
59
60 var result = 0;
61
62 var obj = mockInstance.storage[key];
63
64 if (obj) {
65 var now = new Date().getTime();
66 var milli = Math.min(seconds*1000, Math.pow(2, 31) - 1);
67
68 if (mockInstance.storage[key]._expire) {
69 clearTimeout(mockInstance.storage[key]._expire);
70 }
71
72 mockInstance.storage[key].expires = new Date(now + milli);
73 var _expire = setTimeout(function() {
74 delete mockInstance.storage[key];
75 }, milli);
76 if (_expire.unref) {
77 _expire.unref();
78 }
79 mockInstance.storage[key]._expire = _expire;
80
81 result = 1;
82 }
83
84 mockInstance._callCallback(callback, null, result);
85}
86
87exports.expire = expire;
88
89exports.pexpire = function (mockInstance, key, ms, callback) {
90 var computedSeconds = ms > 0 ? ms/1000 : ms;
91 return expire(mockInstance, key, computedSeconds, function(err, seconds) {
92 mockInstance._callCallback(callback, err, seconds);
93 });
94};
95
96/**
97 * TTL
98 * http://redis.io/commands/ttl
99 */
100var ttl = function (mockInstance, key, callback) {
101 var result = 0;
102
103 var obj = mockInstance.storage[key];
104
105 if (obj) {
106 var now = new Date().getTime();
107 var expires = mockInstance.storage[key].expires instanceof Date ? mockInstance.storage[key].expires.getTime() : -1;
108 var seconds = (expires - now) / 1000;
109
110 if (seconds > 0) {
111 result = seconds;
112 } else {
113 result = -1;
114 }
115
116 } else {
117 result = -2;
118 }
119
120 mockInstance._callCallback(callback, null, result);
121};
122
123exports.ttl = ttl;
124
125exports.pttl = function (mockInstance, key, callback) {
126 return ttl(mockInstance, key, function(err, ttl) {
127 var computedTtl = ttl > 0 ? ttl * 1000 : ttl;
128 mockInstance._callCallback(callback, err, computedTtl);
129 });
130};
131
132
133/**
134 * PERSIST
135 * http://redis.io/commands/persist
136 */
137exports.persist = function (mockInstance, key, callback) {
138 var result = 0;
139
140 var obj = mockInstance.storage[key];
141
142 if (obj && obj.expires && obj.expires >= 0) {
143 clearTimeout(obj._expire);
144 delete obj.expires
145 result = 1;
146 }
147
148 mockInstance._callCallback(callback, null, result);
149};
150
151/**
152 * Keys
153 */
154exports.keys = function (mockInstance, pattern, callback) {
155 var regex = patternToRegex(pattern);
156 var keys = [];
157
158 for (var key in mockInstance.storage) {
159 if (regex.test(key)) {
160 keys.push(key);
161 }
162 }
163
164 mockInstance._callCallback(callback, null, keys);
165}
166
167exports.scan = function (mockInstance, index, pattern, count, callback) {
168 var regex = patternToRegex(pattern);
169 var keys = [];
170 var idx = 1;
171 var resIdx = 0;
172 count = count || 10;
173
174 for (var key in mockInstance.storage) {
175 if (idx >= index && regex.test(key)) {
176 keys.push(key);
177 count--;
178 if(count === 0) {
179 resIdx = idx+1;
180 break;
181 }
182 }
183 idx++;
184 }
185
186 mockInstance._callCallback(callback, null, [resIdx.toString(), keys]);
187}
188
189/**
190 * Rename
191 * http://redis.io/commands/rename
192 */
193exports.rename = function (mockInstance, key, newKey, callback) {
194 var err = null
195
196 if (key in mockInstance.storage) {
197 mockInstance.storage[newKey] = mockInstance.storage[key]
198 delete mockInstance.storage[key];
199 } else {
200 err = new Error("ERR no such key")
201 }
202
203 mockInstance._callCallback(callback, err, "OK");
204
205}
206
207/**
208 * Renamenx
209 * http://redis.io/commands/renamenx
210 */
211exports.renamenx = function (mockInstance, key, newKey, callback) {
212 var err = null;
213 var result;
214
215 if (key in mockInstance.storage) {
216 if (newKey in mockInstance.storage) {
217 result = 0;
218 } else {
219 mockInstance.storage[newKey] = mockInstance.storage[key];
220 delete mockInstance.storage[key];
221 result = 1;
222 }
223 } else {
224 err = new Error("ERR no such key");
225 }
226
227 mockInstance._callCallback(callback, err, result);
228}
229
230/**
231 * Dbsize
232 * http://redis.io/commands/dbsize
233 */
234exports.dbsize = function(mockInstance, callback) {
235 var size = Object.keys(mockInstance.storage).length || 0
236 mockInstance._callCallback(callback, null, size)
237}