pixl-server-storage 3.0.13 → 3.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/engines/Redis.js +1 -3
- package/engines/RedisCluster.js +0 -2
- package/engines/S3.js +24 -18
- package/package.json +1 -1
- package/storage.js +6 -2
package/engines/Redis.js
CHANGED
|
@@ -39,10 +39,8 @@ module.exports = Class.create({
|
|
|
39
39
|
|
|
40
40
|
this.keyPrefix = (r_config.keyPrefix || '').replace(/^\//, '');
|
|
41
41
|
if (this.keyPrefix && !this.keyPrefix.match(/\/$/)) this.keyPrefix += '/';
|
|
42
|
-
delete r_config.keyPrefix;
|
|
43
42
|
|
|
44
43
|
this.keyTemplate = (r_config.keyTemplate || '').replace(/^\//, '').replace(/\/$/, '');
|
|
45
|
-
delete r_config.keyTemplate;
|
|
46
44
|
|
|
47
45
|
r_config.return_buffers = true;
|
|
48
46
|
r_config.retry_strategy = function(opts) {
|
|
@@ -50,7 +48,7 @@ module.exports = Class.create({
|
|
|
50
48
|
return Math.min(opts.attempt * 100, 3000);
|
|
51
49
|
};
|
|
52
50
|
|
|
53
|
-
this.redis = Redis.createClient(r_config);
|
|
51
|
+
this.redis = Redis.createClient( Tools.copyHashRemoveKeys(r_config, { keyPrefix:1, keyTemplate:1 }) );
|
|
54
52
|
|
|
55
53
|
this.redis.on('error', function(err) {
|
|
56
54
|
if (!self.storage.started) return callback(err);
|
package/engines/RedisCluster.js
CHANGED
|
@@ -44,10 +44,8 @@ module.exports = Class.create({
|
|
|
44
44
|
|
|
45
45
|
this.keyPrefix = (r_config.keyPrefix || '').replace(/^\//, '');
|
|
46
46
|
if (this.keyPrefix && !this.keyPrefix.match(/\/$/)) this.keyPrefix += '/';
|
|
47
|
-
delete r_config.keyPrefix;
|
|
48
47
|
|
|
49
48
|
this.keyTemplate = (r_config.keyTemplate || '').replace(/^\//, '').replace(/\/$/, '');
|
|
50
|
-
delete r_config.keyTemplate;
|
|
51
49
|
|
|
52
50
|
r_config.clusterOpts.clusterRetryStrategy = function(attempts) {
|
|
53
51
|
if (attempts > r_config.connectRetries) return false;
|
package/engines/S3.js
CHANGED
|
@@ -37,13 +37,9 @@ module.exports = Class.create({
|
|
|
37
37
|
|
|
38
38
|
this.keyPrefix = (s3_config.keyPrefix || '').replace(/^\//, '');
|
|
39
39
|
if (this.keyPrefix && !this.keyPrefix.match(/\/$/)) this.keyPrefix += '/';
|
|
40
|
-
delete s3_config.keyPrefix;
|
|
41
40
|
|
|
42
41
|
this.keyTemplate = (s3_config.keyTemplate || '').replace(/^\//, '').replace(/\/$/, '');
|
|
43
|
-
delete s3_config.keyTemplate;
|
|
44
|
-
|
|
45
42
|
this.fileExtensions = !!s3_config.fileExtensions;
|
|
46
|
-
delete s3_config.fileExtensions;
|
|
47
43
|
|
|
48
44
|
if (this.debugLevel(10)) {
|
|
49
45
|
// S3 has a logger API but it's extremely verbose -- restrict to level 10 only
|
|
@@ -70,7 +66,7 @@ module.exports = Class.create({
|
|
|
70
66
|
delete s3_config.cache;
|
|
71
67
|
|
|
72
68
|
AWS.config.update( aws_config );
|
|
73
|
-
this.s3 = new AWS.S3( s3_config );
|
|
69
|
+
this.s3 = new AWS.S3( Tools.copyHashRemoveKeys(s3_config, { keyPrefix:1, keyTemplate:1, fileExtensions:1, cache:1 }) );
|
|
74
70
|
},
|
|
75
71
|
|
|
76
72
|
prepKey: function(key) {
|
|
@@ -131,7 +127,7 @@ module.exports = Class.create({
|
|
|
131
127
|
if (done) return; else done = true;
|
|
132
128
|
|
|
133
129
|
if (err) {
|
|
134
|
-
self.logError('s3', "Failed to store object: " + key + ": " + err.message);
|
|
130
|
+
self.logError('s3', "Failed to store object: " + key + ": " + (err.message || err), err);
|
|
135
131
|
}
|
|
136
132
|
else self.logDebug(9, "Store complete: " + key);
|
|
137
133
|
|
|
@@ -162,7 +158,7 @@ module.exports = Class.create({
|
|
|
162
158
|
if (done) return; else done = true;
|
|
163
159
|
|
|
164
160
|
if (err) {
|
|
165
|
-
self.logError('s3', "Failed to store stream: " + key + ": " + err.message);
|
|
161
|
+
self.logError('s3', "Failed to store stream: " + key + ": " + (err.message || err), err);
|
|
166
162
|
}
|
|
167
163
|
else self.logDebug(9, "Stream store complete: " + key);
|
|
168
164
|
|
|
@@ -197,8 +193,15 @@ module.exports = Class.create({
|
|
|
197
193
|
if (done) return; else done = true;
|
|
198
194
|
|
|
199
195
|
if (err) {
|
|
200
|
-
if (err.code
|
|
201
|
-
|
|
196
|
+
if ((err.code == 'NoSuchKey') || (err.code == 'NotFound')) {
|
|
197
|
+
// key not found, special case, don't log an error
|
|
198
|
+
// always include "Not found" in error message
|
|
199
|
+
err = new Error("Failed to head key: " + key + ": Not found");
|
|
200
|
+
err.code = "NoSuchKey";
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
// some other error
|
|
204
|
+
self.logError('s3', "Failed to head key: " + key + ": " + (err.message || err), err);
|
|
202
205
|
}
|
|
203
206
|
callback( err, null );
|
|
204
207
|
return;
|
|
@@ -253,7 +256,7 @@ module.exports = Class.create({
|
|
|
253
256
|
}
|
|
254
257
|
else {
|
|
255
258
|
// some other error
|
|
256
|
-
self.logError('s3', "Failed to fetch key: " + key + ": " + err.message);
|
|
259
|
+
self.logError('s3', "Failed to fetch key: " + key + ": " + (err.message || err), err);
|
|
257
260
|
}
|
|
258
261
|
callback( err, null );
|
|
259
262
|
return;
|
|
@@ -281,7 +284,10 @@ module.exports = Class.create({
|
|
|
281
284
|
self.logDebug(9, "JSON fetch complete: " + key, self.debugLevel(10) ? body : null);
|
|
282
285
|
}
|
|
283
286
|
|
|
284
|
-
callback( null, body
|
|
287
|
+
callback( null, body, {
|
|
288
|
+
mod: Math.floor((new Date(data.LastModified)).getTime() / 1000),
|
|
289
|
+
len: data.ContentLength
|
|
290
|
+
} );
|
|
285
291
|
} );
|
|
286
292
|
},
|
|
287
293
|
|
|
@@ -298,7 +304,7 @@ module.exports = Class.create({
|
|
|
298
304
|
var proceed = false;
|
|
299
305
|
|
|
300
306
|
download.on('error', function(err) {
|
|
301
|
-
if (proceed) self.logError('s3', "Failed to download key: " + key + ": " + err.message);
|
|
307
|
+
if (proceed) self.logError('s3', "Failed to download key: " + key + ": " + (err.message || err), err);
|
|
302
308
|
});
|
|
303
309
|
download.once('end', function() {
|
|
304
310
|
self.logDebug(9, "S3 stream download complete: " + key);
|
|
@@ -313,8 +319,8 @@ module.exports = Class.create({
|
|
|
313
319
|
if (done) return; else done = true;
|
|
314
320
|
|
|
315
321
|
if (err) {
|
|
316
|
-
if (err.code != 'NoSuchKey') {
|
|
317
|
-
self.logError('s3', "Failed to head key: " + key + ": " + err.message);
|
|
322
|
+
if ((err.code != 'NoSuchKey') && (err.code != 'NotFound')) {
|
|
323
|
+
self.logError('s3', "Failed to head key: " + key + ": " + (err.message || err), err);
|
|
318
324
|
}
|
|
319
325
|
download.destroy();
|
|
320
326
|
callback( err, null );
|
|
@@ -349,7 +355,7 @@ module.exports = Class.create({
|
|
|
349
355
|
var proceed = false;
|
|
350
356
|
|
|
351
357
|
download.on('error', function(err) {
|
|
352
|
-
if (proceed) self.logError('s3', "Failed to download key: " + key + ": " + err.message);
|
|
358
|
+
if (proceed) self.logError('s3', "Failed to download key: " + key + ": " + (err.message || err), err);
|
|
353
359
|
});
|
|
354
360
|
download.once('end', function() {
|
|
355
361
|
self.logDebug(9, "S3 stream download complete: " + key);
|
|
@@ -364,8 +370,8 @@ module.exports = Class.create({
|
|
|
364
370
|
if (done) return; else done = true;
|
|
365
371
|
|
|
366
372
|
if (err) {
|
|
367
|
-
if (err.code != 'NoSuchKey') {
|
|
368
|
-
self.logError('s3', "Failed to head key: " + key + ": " + err.message);
|
|
373
|
+
if ((err.code != 'NoSuchKey') && (err.code != 'NotFound')) {
|
|
374
|
+
self.logError('s3', "Failed to head key: " + key + ": " + (err.message || err), err);
|
|
369
375
|
}
|
|
370
376
|
download.destroy();
|
|
371
377
|
callback( err, null );
|
|
@@ -408,7 +414,7 @@ module.exports = Class.create({
|
|
|
408
414
|
if (done) return; else done = true;
|
|
409
415
|
|
|
410
416
|
if (err) {
|
|
411
|
-
self.logError('s3', "Failed to delete object: " + key + ": " + err.message);
|
|
417
|
+
self.logError('s3', "Failed to delete object: " + key + ": " + (err.message || err), err);
|
|
412
418
|
}
|
|
413
419
|
else self.logDebug(9, "Delete complete: " + key);
|
|
414
420
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pixl-server-storage",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.17",
|
|
4
4
|
"description": "A key/value/list storage component for the pixl-server framework.",
|
|
5
5
|
"author": "Joseph Huckaby <jhuckaby@gmail.com>",
|
|
6
6
|
"homepage": "https://github.com/jhuckaby/pixl-server-storage",
|
package/storage.js
CHANGED
|
@@ -34,7 +34,8 @@ module.exports = Class.create({
|
|
|
34
34
|
},
|
|
35
35
|
max_recent_events: 0,
|
|
36
36
|
cache_key_match: '',
|
|
37
|
-
expiration_updates: false
|
|
37
|
+
expiration_updates: false,
|
|
38
|
+
lower_case_keys: true
|
|
38
39
|
},
|
|
39
40
|
|
|
40
41
|
locks: null,
|
|
@@ -130,6 +131,7 @@ module.exports = Class.create({
|
|
|
130
131
|
this.logEventTypes = this.config.get('log_event_types');
|
|
131
132
|
this.maxRecentEvents = this.config.get('max_recent_events');
|
|
132
133
|
this.expHash = this.config.get('expiration_updates');
|
|
134
|
+
this.lowerKeys = this.config.get('lower_case_keys');
|
|
133
135
|
|
|
134
136
|
this.cacheKeyRegex = null;
|
|
135
137
|
if (this.config.get('cache_key_match')) {
|
|
@@ -139,7 +141,9 @@ module.exports = Class.create({
|
|
|
139
141
|
|
|
140
142
|
normalizeKey: function(key) {
|
|
141
143
|
// downconvert unicode, lower-case, alphanum-dash-dot-slash only, strip leading and trailing slashes
|
|
142
|
-
|
|
144
|
+
key = '' + key;
|
|
145
|
+
if (this.lowerKeys) key = key.toLowerCase();
|
|
146
|
+
return unidecode(key).replace(/[^\w\-\.\/]+/g, '').replace(/\/+/g, '/').replace(/^\//, '').replace(/\/$/, '');
|
|
143
147
|
},
|
|
144
148
|
|
|
145
149
|
isBinaryKey: function(key) {
|