keuss 1.6.11 → 1.6.14

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/Queue.js CHANGED
@@ -537,13 +537,15 @@ class Queue {
537
537
  //////////////////////////////////
538
538
  async.parallel ({
539
539
  type: cb => cb (null, this.type()),
540
+ capabilities: cb => cb (null, this.capabilities ()),
541
+ factory: cb => cb (null, this._factory.to_descriptor_obj ()),
540
542
  stats: cb => this.stats (cb),
541
543
  paused: cb => this.paused (cb),
542
544
  next_mature_t: cb => this.next_t (cb),
543
545
  size: cb => this.size (cb),
544
546
  totalSize: cb => this.totalSize (cb),
545
547
  schedSize: cb => this.schedSize (cb),
546
- resvSize: cb => this.resvSize (cb)
548
+ resvSize: cb => this.resvSize (cb)
547
549
  }, cb);
548
550
  }
549
551
 
package/TODO CHANGED
@@ -1,6 +1,5 @@
1
1
  bugs
2
2
  -------------------------------------------------------------
3
- * deadlettering on all backend but mongo-pipeline does not preserve hdrs
4
3
 
5
4
  prio 1
6
5
  -------------------------------------------------------------
@@ -10,7 +9,6 @@ prio 1
10
9
  + add some commonplace transforms (etl-like)
11
10
  + create a server for that, allow processor code defined externally
12
11
 
13
-
14
12
  prio 0
15
13
  -----------------------------------------------------------------
16
14
  * bridges?
@@ -133,11 +133,13 @@ class Bucket {
133
133
  q: q
134
134
  });
135
135
 
136
- if ((res && res.result && res.result.n) != 1) return cb({
137
- err: 'Bucket flush: exactly one must be deleted',
138
- e: err,
139
- q: q
140
- });
136
+ if ((res && res.deletedCount) != 1) {
137
+ return cb({
138
+ err: 'Bucket flush: exactly one must be deleted',
139
+ e: err,
140
+ q: q
141
+ });
142
+ }
141
143
 
142
144
  debug ('Bucket: deleted whole bucket %o', q);
143
145
  cb (null, null);
@@ -216,7 +218,7 @@ class Bucket {
216
218
  q: q
217
219
  });
218
220
 
219
- if ((res && res.result && res.result.nModified) != 1) return cb({
221
+ if (res && (res.modifiedCount != 1)) return cb({
220
222
  err: 'Bucket flush: exactly one must be updated',
221
223
  e: err,
222
224
  q: q,
@@ -650,17 +652,15 @@ class BucketMongoSafeQueue extends Queue {
650
652
  //////////////////////////////////
651
653
  // queue size including non-mature elements
652
654
  totalSize (callback) {
653
- this._col.aggregate ([
655
+ const cursor = this._col.aggregate ([
654
656
  {$group:{_id:'t', v: {$sum: '$n'}}}
655
- ], (err, cursor) => {
656
- if (err) return callback (err);
657
+ ]);
657
658
 
658
- cursor.toArray ((err, res) => {
659
- debug ('calculating totalSize: aggregation pipeline returns %o', res);
660
- if (err) return callback (err);
661
- if (res.length == 0) return callback (null, 0);
662
- callback (null, res[0].v);
663
- });
659
+ cursor.toArray ((err, res) => {
660
+ debug ('calculating totalSize: aggregation pipeline returns %o', res);
661
+ if (err) return callback (err);
662
+ if (res.length == 0) return callback (null, 0);
663
+ callback (null, res[0].v);
664
664
  });
665
665
  }
666
666
 
@@ -668,18 +668,16 @@ class BucketMongoSafeQueue extends Queue {
668
668
  //////////////////////////////////
669
669
  // queue size NOT including non-mature elements
670
670
  size (callback) {
671
- this._col.aggregate ([
671
+ const cursor = this._col.aggregate ([
672
672
  {$match: {mature: {$lte: Queue.now ()}}},
673
673
  {$group:{_id:'t', v: {$sum: '$n'}}}
674
- ], (err, cursor) => {
675
- if (err) return callback (err);
674
+ ]);
676
675
 
677
- cursor.toArray ((err, res) => {
678
- debug ('calculating size: aggregation pipeline returns %o', res);
679
- if (err) return callback (err);
680
- if (res.length == 0) return callback (null, 0);
681
- callback (null, res[0].v);
682
- });
676
+ cursor.toArray ((err, res) => {
677
+ debug ('calculating size: aggregation pipeline returns %o', res);
678
+ if (err) return callback (err);
679
+ if (res.length == 0) return callback (null, 0);
680
+ callback (null, res[0].v);
683
681
  });
684
682
  }
685
683
 
@@ -687,42 +685,39 @@ class BucketMongoSafeQueue extends Queue {
687
685
  //////////////////////////////////
688
686
  // queue size of non-mature elements only
689
687
  schedSize (callback) {
690
- this._col.aggregate ([
688
+ const cursor = this._col.aggregate ([
691
689
  {$match: {
692
690
  mature: {$gt: Queue.now ()},
693
691
  reserved: {$exists: false}
694
692
  }},
695
693
  {$group:{_id:'t', v: {$sum: '$n'}}}
696
- ], (err, cursor) => {
697
- if (err) return callback (err);
694
+ ]);
698
695
 
699
- cursor.toArray ((err, res) => {
700
- debug ('calculating schedSize: aggregation pipeline returns %o', res);
701
- if (err) return callback (err);
702
- if (res.length == 0) return callback (null, 0);
703
- callback (null, res[0].v);
704
- });
696
+ cursor.toArray ((err, res) => {
697
+ debug ('calculating schedSize: aggregation pipeline returns %o', res);
698
+ if (err) return callback (err);
699
+ if (res.length == 0) return callback (null, 0);
700
+ callback (null, res[0].v);
705
701
  });
706
702
  }
707
703
 
704
+
708
705
  //////////////////////////////////
709
706
  // queue size of non-mature elements only
710
707
  resvSize (callback) {
711
- this._col.aggregate ([
708
+ const cursor = this._col.aggregate ([
712
709
  {$match: {
713
710
  mature: {$gt: Queue.now ()},
714
711
  reserved: {$exists: true}
715
712
  }},
716
713
  {$group:{_id:'t', v: {$sum: '$n'}}}
717
- ], (err, cursor) => {
718
- if (err) return callback (err);
714
+ ]);
719
715
 
720
- cursor.toArray ((err, res) => {
721
- debug ('calculating resvSize: aggregation pipeline returns %o', res);
722
- if (err) return callback (err);
723
- if (res.length == 0) return callback (null, 0);
724
- callback (null, res[0].v);
725
- });
716
+ cursor.toArray ((err, res) => {
717
+ debug ('calculating resvSize: aggregation pipeline returns %o', res);
718
+ if (err) return callback (err);
719
+ if (res.length == 0) return callback (null, 0);
720
+ callback (null, res[0].v);
726
721
  });
727
722
  }
728
723
 
@@ -730,7 +725,11 @@ class BucketMongoSafeQueue extends Queue {
730
725
  /////////////////////////////////////////
731
726
  // get element from queue
732
727
  next_t (callback) {
733
- this._col.find ({}).limit(1).sort ({mature:1}).project ({mature:1}).next ((err, result) => {
728
+ this._col.findOne ({}, {
729
+ sort: {mature:1},
730
+ projection: {mature: 1}
731
+ },
732
+ (err, result) => {
734
733
  if (err) return callback (err);
735
734
  debug ('obtaining next_t: got %o', result && result.mature);
736
735
  callback (null, result && result.mature);
@@ -738,7 +737,6 @@ class BucketMongoSafeQueue extends Queue {
738
737
  }
739
738
 
740
739
 
741
-
742
740
  //////////////////////////////////////////////
743
741
  // remove by id
744
742
  remove (id, callback) {
@@ -940,9 +938,10 @@ class Factory extends QFactory_MongoDB_defaults {
940
938
 
941
939
  capabilities () {
942
940
  return {
943
- sched: false,
941
+ sched: true,
944
942
  reserve: true,
945
943
  pipeline: false,
944
+ tape: false,
946
945
  remove: true
947
946
  };
948
947
  }
@@ -205,16 +205,14 @@ class BucketMongoQueue extends Queue {
205
205
  // queue size including non-mature elements
206
206
  totalSize (callback) {
207
207
  //////////////////////////////////
208
- this._col.aggregate ([
208
+ const cursor = this._col.aggregate ([
209
209
  {$group:{_id:'t', v: {$sum: '$n'}}}
210
- ], (err, cursor) => {
211
- if (err) return callback (err);
210
+ ]);
212
211
 
213
- cursor.toArray ((err, res) => {
214
- if (err) return callback (err);
215
- if (res.length == 0) return callback (null, 0);
216
- callback (null, res[0].v);
217
- });
212
+ cursor.toArray ((err, res) => {
213
+ if (err) return callback (err);
214
+ if (res.length == 0) return callback (null, 0);
215
+ callback (null, res[0].v);
218
216
  });
219
217
  }
220
218
 
@@ -342,7 +340,9 @@ class Factory extends QFactory_MongoDB_defaults {
342
340
  return {
343
341
  sched: false,
344
342
  reserve: false,
345
- pipeline: false
343
+ pipeline: false,
344
+ tape: false,
345
+ remove: true
346
346
  };
347
347
  }
348
348
  }
package/backends/mongo.js CHANGED
@@ -252,6 +252,7 @@ class Factory extends QFactory_MongoDB_defaults {
252
252
  sched: true,
253
253
  reserve: true,
254
254
  pipeline: false,
255
+ tape: false,
255
256
  remove: true
256
257
  };
257
258
  }
@@ -161,6 +161,7 @@ class Factory extends QFactory_MongoDB_defaults {
161
161
  sched: true,
162
162
  reserve: true,
163
163
  pipeline: true,
164
+ tape: false,
164
165
  remove: true
165
166
  };
166
167
  }
@@ -127,7 +127,9 @@ class Factory extends QFactory {
127
127
  return {
128
128
  sched: false,
129
129
  reserve: false,
130
- pipeline: false
130
+ pipeline: false,
131
+ tape: false,
132
+ remove: true
131
133
  };
132
134
  }
133
135
  }
@@ -150,6 +150,7 @@ class Factory extends QFactory {
150
150
  sched: true,
151
151
  reserve: true,
152
152
  pipeline: false,
153
+ tape: false,
153
154
  remove: true
154
155
  };
155
156
  }
@@ -26,10 +26,10 @@ var factory_opts = {
26
26
  };
27
27
 
28
28
  // test dimensions: elems to produce and consume, number of consumers, number of producers
29
- const num_elems = 10000000;
29
+ const num_elems = 1000000;
30
30
  const num_producers = 3;
31
31
  const num_consumers = 7;
32
- const commit_likelihood = 95;
32
+ const commit_likelihood = 75;
33
33
 
34
34
  // stats holder
35
35
  var selfs = {
@@ -223,12 +223,12 @@ MQ (factory_opts, function (err, factory) {
223
223
  var q = factory.queue ('test_queue_456', q_opts);
224
224
 
225
225
  var timer = setInterval (() => {
226
- console.log ('**** state: %j', _.map (shareds, (v, k) => {return {cnt: v.push_count || v.pop_count, max: v.push_max || v.pop_max }}));
226
+ console.log ('**** state: %o', _.map (shareds, (v, k) => {return {cnt: v.push_count || v.pop_count, max: v.push_max || v.pop_max }}));
227
227
 
228
228
  console.log ('das pop %d, ko %d, ok %d', das_pop, das_ko, das_ok);
229
229
 
230
230
  q.status ((err ,res) => {
231
- console.log ('**** status: %j', res);
231
+ console.log ('**** status: %o', res);
232
232
  });
233
233
  }, 2000);
234
234
 
@@ -263,7 +263,7 @@ MQ (factory_opts, function (err, factory) {
263
263
  clearInterval (timer);
264
264
 
265
265
  q.status ((err ,res) => {
266
- console.log ('**** status: %j', res);
266
+ console.log ('**** status: %o', res);
267
267
  q.drain (() => factory.close ());
268
268
  });
269
269
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keuss",
3
- "version": "1.6.11",
3
+ "version": "1.6.14",
4
4
  "keywords": [
5
5
  "queue",
6
6
  "persistent",
@@ -26,19 +26,19 @@
26
26
  },
27
27
  "license": "GPL-3.0",
28
28
  "dependencies": {
29
- "@nodebb/mubsub": "~1.7.1",
29
+ "@nodebb/mubsub": "~1.8.0",
30
30
  "async": "~3.2.3",
31
31
  "async-lock": "~1.3.1",
32
- "debug": "~4.3.3",
33
- "ioredis": "~4.28.5",
32
+ "debug": "~4.3.4",
33
+ "ioredis": "~5.0.4",
34
34
  "lodash": "~4.17.21",
35
35
  "mitt": "~3.0.0",
36
- "mongodb": "~3.6.12",
36
+ "mongodb": "~4.5.0",
37
37
  "uuid": "~8.3.2"
38
38
  },
39
39
  "devDependencies": {
40
40
  "chance": "~1.1.8",
41
- "mocha": "~9.2.1",
41
+ "mocha": "~9.2.2",
42
42
  "should": "~13.2.3"
43
43
  },
44
44
  "scripts": {
@@ -87,7 +87,7 @@ class RPSSignalFactory {
87
87
  }
88
88
 
89
89
  static Type () {return 'signal:redis-pubsub'}
90
- type () {return Type ()}
90
+ type () {return RPSSignalFactory.Type ()}
91
91
 
92
92
  signal (channel, opts) {
93
93
  debug ('creating redis-pubsub signaller with opts %o', opts);
@@ -52,6 +52,7 @@ describe ('bucket-at-least-once with ' + MQ_item.label + ' queue backend', funct
52
52
  function (cb) {q.totalSize (cb)},
53
53
  function (cb) {q.next_t (cb)},
54
54
  ], function(err, results) {
55
+ if (err) return done (err);
55
56
  results.should.eql ([{get: 0, put: 0, reserve: 0, commit: 0, rollback: 0, deadletter: 0}, 0, 0, null])
56
57
  done();
57
58
  });
@@ -67,15 +68,15 @@ describe ('bucket-at-least-once with ' + MQ_item.label + ' queue backend', funct
67
68
  function (cb) {setTimeout (cb, 1111)},
68
69
  function (cb) {q.size (function (err, size) {
69
70
  size.should.equal (2);
70
- cb();
71
+ cb(err);
71
72
  })},
72
73
  function (cb) {q.stats (function (err, res) {
73
74
  res.should.eql ({get: 0, put: 2, reserve: 0, commit: 0, rollback: 0, deadletter: 0});
74
- cb();
75
+ cb(err);
75
76
  })},
76
77
  function (cb) {q.next_t (function (err, res) {
77
78
  res.getTime().should.be.approximately(new Date().getTime(), 2000);
78
- cb();
79
+ cb(err);
79
80
  })},
80
81
  function (cb) {q.pop ('c1', function (err, ret) {
81
82
  ret.payload.should.eql ({elem:1, pl:'twetrwte'});
@@ -83,11 +84,11 @@ describe ('bucket-at-least-once with ' + MQ_item.label + ' queue backend', funct
83
84
  })},
84
85
  function (cb) {q.size (function (err, size) {
85
86
  size.should.equal (0);
86
- cb();
87
+ cb(err);
87
88
  })},
88
89
  function (cb) {q.stats (function (err, res) {
89
90
  res.should.eql ({get: 1, put: 2, reserve: 0, commit: 0, rollback: 0, deadletter: 0});
90
- cb();
91
+ cb(err);
91
92
  })},
92
93
  function (cb) {q.pop ('c2', function (err, ret) {
93
94
  ret.payload.should.eql ({elem:2, pl:'twetrwte'});
@@ -95,13 +96,14 @@ describe ('bucket-at-least-once with ' + MQ_item.label + ' queue backend', funct
95
96
  })},
96
97
  function (cb) {q.size (function (err, size) {
97
98
  size.should.equal (0);
98
- cb();
99
+ cb(err);
99
100
  })},
100
101
  function (cb) {q.stats (function (err, res) {
101
102
  res.should.eql ({get: 2, put: 2, reserve: 0, commit: 0, rollback: 0, deadletter: 0});
102
- cb();
103
+ cb(err);
103
104
  })},
104
105
  ], function(err, results) {
106
+ if (err) return done (err);
105
107
  q.drain();
106
108
  done();
107
109
  });
@@ -136,13 +138,14 @@ describe ('bucket-at-least-once with ' + MQ_item.label + ' queue backend', funct
136
138
  })},
137
139
  function (cb) {q.size (function (err, size) {
138
140
  size.should.equal (0);
139
- cb();
141
+ cb(err);
140
142
  })},
141
143
  function (cb) {q.stats (function (err, res) {
142
144
  res.should.eql ({get: 2, put: 2, reserve: 0, commit: 0, rollback: 0, deadletter: 0});
143
- cb();
145
+ cb(err);
144
146
  })},
145
147
  ], function(err, results) {
148
+ if (err) return done (err);
146
149
  q.drain();
147
150
  done();
148
151
  });
@@ -159,18 +162,18 @@ describe ('bucket-at-least-once with ' + MQ_item.label + ' queue backend', funct
159
162
  (cb) => q.push ({elem:4, pl:'twetrwte'}, cb),
160
163
  (cb) => setTimeout (cb, 666),
161
164
 
162
- (cb) => q.size ((err, size) => {size.should.equal (4); cb(); }),
163
- (cb) => q.stats ((err, res) => {res.should.eql ({get: 0, put: 4, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(); }),
165
+ (cb) => q.size ((err, size) => {size.should.equal (4); cb(err); }),
166
+ (cb) => q.stats ((err, res) => {res.should.eql ({get: 0, put: 4, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(err); }),
164
167
 
165
168
  (cb) => q.push ({elem:5, pl:'twetrwte'}, cb),
166
169
  (cb) => q.push ({elem:6, pl:'twetrwte'}, cb),
167
170
  (cb) => q.push ({elem:7, pl:'twetrwte'}, cb),
168
171
  (cb) => setTimeout (cb, 666),
169
172
 
170
- (cb) => q.size ((err, size) => {size.should.equal (7); cb(); }),
171
- (cb) => q.stats ((err, res) => {res.should.eql ({get: 0, put: 7, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(); }),
173
+ (cb) => q.size ((err, size) => {size.should.equal (7); cb(err); }),
174
+ (cb) => q.stats ((err, res) => {res.should.eql ({get: 0, put: 7, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(err); }),
172
175
 
173
- (cb) => q.next_t ((err, res) => {res.getTime().should.be.approximately(new Date().getTime(), 2000); cb(); }),
176
+ (cb) => q.next_t ((err, res) => {res.getTime().should.be.approximately(new Date().getTime(), 2000); cb(err); }),
174
177
 
175
178
  (cb) => {q.pop ('c1', (err, ret) => {ret.payload.should.eql ({elem:1, pl:'twetrwte'}); cb (err); })},
176
179
  (cb) => {q.pop ('c1', (err, ret) => {ret.payload.should.eql ({elem:2, pl:'twetrwte'}); cb (err); })},
@@ -180,9 +183,10 @@ describe ('bucket-at-least-once with ' + MQ_item.label + ' queue backend', funct
180
183
  (cb) => {q.pop ('c1', (err, ret) => {ret.payload.should.eql ({elem:6, pl:'twetrwte'}); cb (err); })},
181
184
  (cb) => {q.pop ('c1', (err, ret) => {ret.payload.should.eql ({elem:7, pl:'twetrwte'}); cb (err); })},
182
185
 
183
- (cb) => q.size ((err, size) => {size.should.equal (0); cb(); }),
184
- (cb) => q.stats ((err, res) => {res.should.eql ({get: 7, put: 7, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(); }),
186
+ (cb) => q.size ((err, size) => {size.should.equal (0); cb(err); }),
187
+ (cb) => q.stats ((err, res) => {res.should.eql ({get: 7, put: 7, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(err); }),
185
188
  ], function(err, results) {
189
+ if (err) return done (err);
186
190
  q.drain();
187
191
  done();
188
192
  });
@@ -199,19 +203,19 @@ describe ('bucket-at-least-once with ' + MQ_item.label + ' queue backend', funct
199
203
  (cb) => q.push ({elem:4, pl:'twetrwte'}, {delay: 4}, cb),
200
204
  (cb) => setTimeout (cb, 700),
201
205
 
202
- (cb) => q.next_t ((err, res) => {res.getTime().should.be.approximately(new Date().getTime() + 3300, 100); cb(); }),
206
+ (cb) => q.next_t ((err, res) => {res.getTime().should.be.approximately(new Date().getTime() + 3300, 100); cb(err); }),
203
207
 
204
208
  (cb) => q.push ({elem:5, pl:'twetrwte'}, {delay: 2}, cb),
205
209
  (cb) => q.push ({elem:6, pl:'twetrwte'}, {delay: 1}, cb),
206
210
  (cb) => q.push ({elem:7, pl:'twetrwte'}, {delay: 2}, cb),
207
211
  (cb) => setTimeout (cb, 700),
208
212
 
209
- (cb) => q.next_t ((err, res) => {res.getTime().should.be.approximately(new Date().getTime() + 1300, 100); cb(); }),
213
+ (cb) => q.next_t ((err, res) => {res.getTime().should.be.approximately(new Date().getTime() + 1300, 100); cb(err); }),
210
214
 
211
- (cb) => q.size ((err, size) => {size.should.equal (0); cb(); }),
212
- (cb) => q.totalSize ((err, size) => {size.should.equal (7); cb(); }),
213
- (cb) => q.schedSize ((err, size) => {size.should.equal (7); cb(); }),
214
- (cb) => q.stats ((err, res) => {res.should.eql ({get: 0, put: 7, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(); }),
215
+ (cb) => q.size ((err, size) => {size.should.equal (0); cb(err); }),
216
+ (cb) => q.totalSize ((err, size) => {size.should.equal (7); cb(err); }),
217
+ (cb) => q.schedSize ((err, size) => {size.should.equal (7); cb(err); }),
218
+ (cb) => q.stats ((err, res) => {res.should.eql ({get: 0, put: 7, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(err); }),
215
219
 
216
220
  (cb) => {q.pop ('c1', (err, ret) => {ret.payload.should.eql ({elem:5, pl:'twetrwte'}); cb (err); })},
217
221
  (cb) => {q.pop ('c1', (err, ret) => {ret.payload.should.eql ({elem:6, pl:'twetrwte'}); cb (err); })},
@@ -221,9 +225,10 @@ describe ('bucket-at-least-once with ' + MQ_item.label + ' queue backend', funct
221
225
  (cb) => {q.pop ('c1', (err, ret) => {ret.payload.should.eql ({elem:3, pl:'twetrwte'}); cb (err); })},
222
226
  (cb) => {q.pop ('c1', (err, ret) => {ret.payload.should.eql ({elem:4, pl:'twetrwte'}); cb (err); })},
223
227
 
224
- (cb) => q.size ((err, size) => {size.should.equal (0); cb(); }),
225
- (cb) => q.stats ((err, res) => {res.should.eql ({get: 7, put: 7, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(); }),
228
+ (cb) => q.size ((err, size) => {size.should.equal (0); cb(err); }),
229
+ (cb) => q.stats ((err, res) => {res.should.eql ({get: 7, put: 7, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(err); }),
226
230
  ], function(err, results) {
231
+ if (err) return done (err);
227
232
  q.drain();
228
233
  done();
229
234
  });
@@ -238,19 +243,20 @@ describe ('bucket-at-least-once with ' + MQ_item.label + ' queue backend', funct
238
243
  (cb) => q.push ({elem:2, pl:'twetrwte'}, cb),
239
244
  (cb) => setTimeout (cb, 700),
240
245
 
241
- (cb) => q.size ((err, size) => {size.should.equal (2); cb(); }),
242
- (cb) => q.stats ((err, res) => {res.should.eql ({get: 0, put: 2, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(); }),
246
+ (cb) => q.size ((err, size) => {size.should.equal (2); cb(err); }),
247
+ (cb) => q.stats ((err, res) => {res.should.eql ({get: 0, put: 2, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(err); }),
243
248
 
244
249
  (cb) => q.push ({elem:3, pl:'twetrwte'}, cb),
245
250
  (cb) => setTimeout (cb, 700),
246
251
 
247
- (cb) => q.size ((err, size) => {size.should.equal (3); cb(); }),
248
- (cb) => q.stats ((err, res) => {res.should.eql ({get: 0, put: 3, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(); }),
252
+ (cb) => q.size ((err, size) => {size.should.equal (3); cb(err); }),
253
+ (cb) => q.stats ((err, res) => {res.should.eql ({get: 0, put: 3, reserve: 0, commit: 0, rollback: 0, deadletter: 0}); cb(err); }),
249
254
 
250
- (cb) => q.next_t ((err, res) => {res.getTime().should.be.approximately(new Date().getTime() - 1400, 100); cb(); }),
255
+ (cb) => q.next_t ((err, res) => {res.getTime().should.be.approximately(new Date().getTime() - 1400, 100); cb(err); }),
251
256
 
252
257
  (cb) => {
253
258
  q.pop ('c1', {reserve: true}, (err, ret) => {
259
+ if (err) return cb (err);
254
260
  ret.payload.should.eql ({elem:1, pl:'twetrwte'});
255
261
  q.ko (ret._id, (new Date().getTime() + 5000 ), (err, res) => {
256
262
  should (res).equal (true);
@@ -263,6 +269,7 @@ describe ('bucket-at-least-once with ' + MQ_item.label + ' queue backend', funct
263
269
 
264
270
  (cb) => {
265
271
  q.pop ('c1', {reserve: true}, (err, ret) => {
272
+ if (err) return cb (err);
266
273
  ret.payload.should.eql ({elem:3, pl:'twetrwte'});
267
274
  q.ko (ret._id, (new Date().getTime() + 3000 ), (err, res) => {
268
275
  should (res).equal (true);
@@ -273,18 +280,19 @@ describe ('bucket-at-least-once with ' + MQ_item.label + ' queue backend', funct
273
280
 
274
281
  (cb) => setTimeout (cb, 700),
275
282
 
276
- (cb) => q.next_t ((err, res) => {res.getTime().should.be.approximately(new Date().getTime() + 2500, 500); cb(); }),
283
+ (cb) => q.next_t ((err, res) => {res.getTime().should.be.approximately(new Date().getTime() + 2500, 500); cb(err); }),
277
284
 
278
- (cb) => q.size ((err, size) => {size.should.equal (0); cb(); }),
279
- (cb) => q.totalSize ((err, size) => {size.should.equal (2); cb(); }),
280
- (cb) => q.schedSize ((err, size) => {size.should.equal (2); cb(); }),
285
+ (cb) => q.size ((err, size) => {size.should.equal (0); cb(err); }),
286
+ (cb) => q.totalSize ((err, size) => {size.should.equal (2); cb(err); }),
287
+ (cb) => q.schedSize ((err, size) => {size.should.equal (2); cb(err); }),
281
288
 
282
289
  (cb) => {q.pop ('c1', (err, ret) => {ret.payload.should.eql ({elem:3, pl:'twetrwte'}); cb (err); })},
283
290
  (cb) => {q.pop ('c1', (err, ret) => {ret.payload.should.eql ({elem:1, pl:'twetrwte'}); cb (err); })},
284
291
 
285
- (cb) => q.size ((err, size) => {size.should.equal (0); cb(); }),
286
- (cb) => q.stats ((err, res) => {res.should.eql ({get: 3, put: 3, reserve: 2, commit: 0, rollback: 2, deadletter: 0}); cb(); }),
292
+ (cb) => q.size ((err, size) => {size.should.equal (0); cb(err); }),
293
+ (cb) => q.stats ((err, res) => {res.should.eql ({get: 3, put: 3, reserve: 2, commit: 0, rollback: 2, deadletter: 0}); cb(err); }),
287
294
  ], function(err, results) {
295
+ if (err) return done (err);
288
296
  q.drain();
289
297
  done();
290
298
  });