keuss 1.6.10 → 1.6.13

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.
Files changed (202) hide show
  1. package/Pipeline/Queue.js +12 -2
  2. package/Queue.js +18 -8
  3. package/TODO +0 -1
  4. package/backends/bucket-mongo-safe.js +42 -44
  5. package/backends/bucket-mongo.js +6 -8
  6. package/examples/snippets/06-random-consumer-producer.js +5 -5
  7. package/package.json +6 -6
  8. package/test/backends_bucket-at-least-once.js +43 -35
  9. package/test/backends_deadletter.js +10 -1
  10. package/.nyc_output/ad035de4-a3d3-451b-b2ad-402e8ed517b8.json +0 -1
  11. package/.nyc_output/c8683d6c-e7e6-496b-ab0d-1ff730837d08.json +0 -1
  12. package/.nyc_output/processinfo/ad035de4-a3d3-451b-b2ad-402e8ed517b8.json +0 -1
  13. package/.nyc_output/processinfo/c8683d6c-e7e6-496b-ab0d-1ff730837d08.json +0 -1
  14. package/.nyc_output/processinfo/index.json +0 -1
  15. package/coverage/base.css +0 -224
  16. package/coverage/block-navigation.js +0 -79
  17. package/coverage/index.html +0 -162
  18. package/coverage/keuss/Pipeline/BaseLink.js.html +0 -636
  19. package/coverage/keuss/Pipeline/Builder.js.html +0 -615
  20. package/coverage/keuss/Pipeline/ChoiceLink.js.html +0 -294
  21. package/coverage/keuss/Pipeline/DirectLink.js.html +0 -231
  22. package/coverage/keuss/Pipeline/Pipeline.js.html +0 -258
  23. package/coverage/keuss/Pipeline/Queue.js.html +0 -939
  24. package/coverage/keuss/Pipeline/Sink.js.html +0 -147
  25. package/coverage/keuss/Pipeline/index.html +0 -175
  26. package/coverage/keuss/QFactory-MongoDB-defaults.js.html +0 -219
  27. package/coverage/keuss/QFactory.js.html +0 -459
  28. package/coverage/keuss/Queue.js.html +0 -2274
  29. package/coverage/keuss/Signal.js.html +0 -312
  30. package/coverage/keuss/Stats.js.html +0 -174
  31. package/coverage/keuss/backends/bucket-mongo-safe.js.html +0 -2952
  32. package/coverage/keuss/backends/bucket-mongo.js.html +0 -1167
  33. package/coverage/keuss/backends/index.html +0 -175
  34. package/coverage/keuss/backends/mongo.js.html +0 -897
  35. package/coverage/keuss/backends/pl-mongo.js.html +0 -723
  36. package/coverage/keuss/backends/ps-mongo.js.html +0 -1038
  37. package/coverage/keuss/backends/redis-list.js.html +0 -513
  38. package/coverage/keuss/backends/redis-oq.js.html +0 -543
  39. package/coverage/keuss/bench/all-mongo.js.html +0 -393
  40. package/coverage/keuss/bench/index.html +0 -149
  41. package/coverage/keuss/bench/multi-q.js.html +0 -324
  42. package/coverage/keuss/bench/redis-oq-consumer-producer.js.html +0 -225
  43. package/coverage/keuss/bench/redis-oq-consumer.js.html +0 -189
  44. package/coverage/keuss/bench/redis-oq-producer.js.html +0 -198
  45. package/coverage/keuss/docusaurus/.docusaurus/client-modules.js.html +0 -93
  46. package/coverage/keuss/docusaurus/.docusaurus/docusaurus.config.js.html +0 -402
  47. package/coverage/keuss/docusaurus/.docusaurus/index.html +0 -136
  48. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/01a85c17.4e57aa0a.js.html +0 -69
  49. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/09d5ad39.3009117f.js.html +0 -69
  50. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/1.12cf3eb8.js.html +0 -69
  51. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/12559443.a244228c.js.html +0 -69
  52. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/17896441.5efb3558.js.html +0 -69
  53. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/1be78505.f9c04817.js.html +0 -69
  54. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/2.4e2dc02c.js.html +0 -72
  55. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/3.d549a05d.js.html +0 -69
  56. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/36.db0e809a.js.html +0 -69
  57. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/37637b3c.28c0900b.js.html +0 -69
  58. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/3d8d21df.2228b429.js.html +0 -69
  59. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/45a5cd1f.951da354.js.html +0 -69
  60. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/52c38f7a.785707bc.js.html +0 -69
  61. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/57ffbe3d.04d3e53e.js.html +0 -69
  62. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/5f7c35e9.2fa77599.js.html +0 -69
  63. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/6299bd84.ec197a3e.js.html +0 -69
  64. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/6875c492.cdf3e939.js.html +0 -69
  65. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/6beec1d2.6873e708.js.html +0 -69
  66. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/7b786ad4.bbce08e6.js.html +0 -69
  67. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/8070e160.400a4e57.js.html +0 -69
  68. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/88c93c54.e868a433.js.html +0 -69
  69. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/8d3e6f9e.aadf6d32.js.html +0 -69
  70. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/9bc74468.516633c5.js.html +0 -69
  71. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/9beb87c2.71e3744d.js.html +0 -69
  72. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/a3732fac.b0f98dbf.js.html +0 -69
  73. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/a6aa9e1f.6ac55e6c.js.html +0 -69
  74. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/baf0d4a2.b50efd2d.js.html +0 -69
  75. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/c4f5d8e4.e9dfd999.js.html +0 -69
  76. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/ccc49370.1831890b.js.html +0 -69
  77. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/d4942345.7d23b349.js.html +0 -69
  78. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/e2244795.4ea3d168.js.html +0 -69
  79. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/e64fe266.308265e8.js.html +0 -69
  80. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/f78725cc.5f3e115d.js.html +0 -69
  81. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/fa8d8063.2312a332.js.html +0 -69
  82. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/index.html +0 -565
  83. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/main.66f1008c.js.html +0 -72
  84. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/runtime~main.7d73b048.js.html +0 -69
  85. package/coverage/keuss/docusaurus/.docusaurus/keuss-gh-pages/styles.b5ee3016.js.html +0 -69
  86. package/coverage/keuss/docusaurus/.docusaurus/registry.js.html +0 -165
  87. package/coverage/keuss/docusaurus/.docusaurus/routes.js.html +0 -447
  88. package/coverage/keuss/docusaurus/build/01a85c17.4e57aa0a.js.html +0 -69
  89. package/coverage/keuss/docusaurus/build/09d5ad39.3009117f.js.html +0 -69
  90. package/coverage/keuss/docusaurus/build/1.12cf3eb8.js.html +0 -69
  91. package/coverage/keuss/docusaurus/build/12559443.a244228c.js.html +0 -69
  92. package/coverage/keuss/docusaurus/build/17896441.5efb3558.js.html +0 -69
  93. package/coverage/keuss/docusaurus/build/1be78505.f9c04817.js.html +0 -69
  94. package/coverage/keuss/docusaurus/build/2.4e2dc02c.js.html +0 -72
  95. package/coverage/keuss/docusaurus/build/3.d549a05d.js.html +0 -69
  96. package/coverage/keuss/docusaurus/build/36.db0e809a.js.html +0 -69
  97. package/coverage/keuss/docusaurus/build/37637b3c.28c0900b.js.html +0 -69
  98. package/coverage/keuss/docusaurus/build/3d8d21df.2228b429.js.html +0 -69
  99. package/coverage/keuss/docusaurus/build/45a5cd1f.951da354.js.html +0 -69
  100. package/coverage/keuss/docusaurus/build/52c38f7a.785707bc.js.html +0 -69
  101. package/coverage/keuss/docusaurus/build/57ffbe3d.04d3e53e.js.html +0 -69
  102. package/coverage/keuss/docusaurus/build/5f7c35e9.2fa77599.js.html +0 -69
  103. package/coverage/keuss/docusaurus/build/6299bd84.ec197a3e.js.html +0 -69
  104. package/coverage/keuss/docusaurus/build/6875c492.cdf3e939.js.html +0 -69
  105. package/coverage/keuss/docusaurus/build/6beec1d2.6873e708.js.html +0 -69
  106. package/coverage/keuss/docusaurus/build/7b786ad4.bbce08e6.js.html +0 -69
  107. package/coverage/keuss/docusaurus/build/8070e160.400a4e57.js.html +0 -69
  108. package/coverage/keuss/docusaurus/build/88c93c54.e868a433.js.html +0 -69
  109. package/coverage/keuss/docusaurus/build/8d3e6f9e.aadf6d32.js.html +0 -69
  110. package/coverage/keuss/docusaurus/build/9bc74468.516633c5.js.html +0 -69
  111. package/coverage/keuss/docusaurus/build/9beb87c2.71e3744d.js.html +0 -69
  112. package/coverage/keuss/docusaurus/build/a3732fac.b0f98dbf.js.html +0 -69
  113. package/coverage/keuss/docusaurus/build/a6aa9e1f.6ac55e6c.js.html +0 -69
  114. package/coverage/keuss/docusaurus/build/baf0d4a2.b50efd2d.js.html +0 -69
  115. package/coverage/keuss/docusaurus/build/c4f5d8e4.e9dfd999.js.html +0 -69
  116. package/coverage/keuss/docusaurus/build/ccc49370.1831890b.js.html +0 -69
  117. package/coverage/keuss/docusaurus/build/d4942345.7d23b349.js.html +0 -69
  118. package/coverage/keuss/docusaurus/build/e2244795.4ea3d168.js.html +0 -69
  119. package/coverage/keuss/docusaurus/build/e64fe266.308265e8.js.html +0 -69
  120. package/coverage/keuss/docusaurus/build/f78725cc.5f3e115d.js.html +0 -69
  121. package/coverage/keuss/docusaurus/build/fa8d8063.2312a332.js.html +0 -69
  122. package/coverage/keuss/docusaurus/build/index.html +0 -565
  123. package/coverage/keuss/docusaurus/build/main.66f1008c.js.html +0 -72
  124. package/coverage/keuss/docusaurus/build/runtime~main.7d73b048.js.html +0 -69
  125. package/coverage/keuss/docusaurus/build/styles.b5ee3016.js.html +0 -69
  126. package/coverage/keuss/docusaurus/docusaurus.config.js.html +0 -360
  127. package/coverage/keuss/docusaurus/index.html +0 -110
  128. package/coverage/keuss/docusaurus/sidebars.js.html +0 -96
  129. package/coverage/keuss/docusaurus/src/pages/index.html +0 -97
  130. package/coverage/keuss/docusaurus/src/pages/index.js.html +0 -450
  131. package/coverage/keuss/examples/pipelines/builder/index.html +0 -97
  132. package/coverage/keuss/examples/pipelines/builder/index.js.html +0 -450
  133. package/coverage/keuss/examples/pipelines/simplest/index.html +0 -97
  134. package/coverage/keuss/examples/pipelines/simplest/index.js.html +0 -183
  135. package/coverage/keuss/examples/pipelines/simulation-fork/index.html +0 -97
  136. package/coverage/keuss/examples/pipelines/simulation-fork/index.js.html +0 -414
  137. package/coverage/keuss/examples/snippets/01-simplest-pop-push.js.html +0 -195
  138. package/coverage/keuss/examples/snippets/02-simplest-reserve-rollback-commit.js.html +0 -201
  139. package/coverage/keuss/examples/snippets/03-simplest-producer-consumer-loops.js.html +0 -300
  140. package/coverage/keuss/examples/snippets/04-bucket-mongo-safe-insert-reserve-commit.js.html +0 -303
  141. package/coverage/keuss/examples/snippets/05-insert-reserve-rollback-deadletter.js.html +0 -384
  142. package/coverage/keuss/examples/snippets/06-random-consumer-producer.js.html +0 -879
  143. package/coverage/keuss/examples/snippets/index.html +0 -188
  144. package/coverage/keuss/examples/snippets/redislabs-consumer-producer.js.html +0 -201
  145. package/coverage/keuss/examples/snippets/with-redis-stats-and-signaller-consumer-producer.js.html +0 -222
  146. package/coverage/keuss/examples/webhooks/app.js.html +0 -279
  147. package/coverage/keuss/examples/webhooks/consumer.js.html +0 -363
  148. package/coverage/keuss/examples/webhooks/index.html +0 -123
  149. package/coverage/keuss/examples/webhooks/index.js.html +0 -234
  150. package/coverage/keuss/index.html +0 -149
  151. package/coverage/keuss/playground/index.html +0 -136
  152. package/coverage/keuss/playground/pl-rollback.js.html +0 -234
  153. package/coverage/keuss/playground/pl1.js.html +0 -291
  154. package/coverage/keuss/playground/q1.js.html +0 -168
  155. package/coverage/keuss/playground/simple-pl.js.html +0 -195
  156. package/coverage/keuss/signal/index.html +0 -123
  157. package/coverage/keuss/signal/local.js.html +0 -306
  158. package/coverage/keuss/signal/mongo-capped.js.html +0 -378
  159. package/coverage/keuss/signal/redis-pubsub.js.html +0 -399
  160. package/coverage/keuss/stats/index.html +0 -123
  161. package/coverage/keuss/stats/mem.js.html +0 -519
  162. package/coverage/keuss/stats/mongo.js.html +0 -930
  163. package/coverage/keuss/stats/redis.js.html +0 -894
  164. package/coverage/keuss/utils/RedisConn.js.html +0 -150
  165. package/coverage/keuss/utils/RedisOrderedQueue.js.html +0 -864
  166. package/coverage/keuss/utils/index.html +0 -110
  167. package/coverage/prettify.css +0 -1
  168. package/coverage/prettify.js +0 -2
  169. package/coverage/sort-arrow-sprite.png +0 -0
  170. package/coverage/sorter.js +0 -170
  171. package/docusaurus/README.md +0 -33
  172. package/docusaurus/babel.config.js +0 -3
  173. package/docusaurus/blog/2020-08-04-welcome.md +0 -10
  174. package/docusaurus/docs/about.md +0 -14
  175. package/docusaurus/docs/api/factory.md +0 -102
  176. package/docusaurus/docs/api/queue.md +0 -247
  177. package/docusaurus/docs/api/signal.md +0 -38
  178. package/docusaurus/docs/api/stats.md +0 -37
  179. package/docusaurus/docs/changelog.md +0 -51
  180. package/docusaurus/docs/concepts.md +0 -116
  181. package/docusaurus/docs/examples.md +0 -10
  182. package/docusaurus/docs/quickstart.md +0 -195
  183. package/docusaurus/docs/style-guide.md +0 -202
  184. package/docusaurus/docs/usage/buckets.md +0 -43
  185. package/docusaurus/docs/usage/no-signaller.md +0 -16
  186. package/docusaurus/docs/usage/pipelines/about.md +0 -128
  187. package/docusaurus/docs/usage/pipelines/building.md +0 -158
  188. package/docusaurus/docs/usage/pipelines/examples.md +0 -10
  189. package/docusaurus/docs/usage/pipelines/processors.md +0 -187
  190. package/docusaurus/docs/usage/putting-all-together.md +0 -153
  191. package/docusaurus/docs/usage/redis-conns.md +0 -70
  192. package/docusaurus/docs/usage/shutdown.md +0 -11
  193. package/docusaurus/docusaurus.config.js +0 -96
  194. package/docusaurus/package.json +0 -33
  195. package/docusaurus/sidebars.js +0 -44
  196. package/docusaurus/src/css/custom.css +0 -25
  197. package/docusaurus/src/pages/index.js +0 -127
  198. package/docusaurus/src/pages/styles.module.css +0 -37
  199. package/docusaurus/static/.nojekyll +0 -0
  200. package/docusaurus/static/img/favicon.ico +0 -0
  201. package/docusaurus/static/img/logo.svg +0 -1
  202. package/docusaurus/yarn.lock +0 -8384
package/Pipeline/Queue.js CHANGED
@@ -167,6 +167,10 @@ class PipelinedMongoQueue extends Queue {
167
167
  this._embed_update_for_payload (upd, opts.update);
168
168
  }
169
169
 
170
+ if (opts.hdrs) {
171
+ _.each (opts.hdrs, (v, k) => upd.$set['hdrs.' + k] = v);
172
+ }
173
+
170
174
  this._col.updateOne (q, upd, {}, (err, result) => {
171
175
  if (err) return callback (err);
172
176
  callback (null, result && (result.modifiedCount == 1));
@@ -274,9 +278,15 @@ class PipelinedMongoQueue extends Queue {
274
278
 
275
279
 
276
280
  //////////////////////////////////////////////
277
- // redefnition
281
+ // redefinition from Queue
278
282
  _move_to_deadletter (obj, cb) {
279
- this.pl_step (obj._id, this._factory.deadletter_queue (), {}, (err, res) => {
283
+ const hdrs = {
284
+ 'x-dl-from-queue': this.name (),
285
+ 'x-dl-t': new Date().toISOString (),
286
+ 'x-dl-tries': obj.tries
287
+ };
288
+
289
+ this.pl_step (obj._id, this._factory.deadletter_queue (), {hdrs}, (err, res) => {
280
290
  if (err) return cb (err);
281
291
  this._stats.incr ('get');
282
292
  this._factory.deadletter_queue ()._stats.incr ('put');
package/Queue.js CHANGED
@@ -433,14 +433,14 @@ class Queue {
433
433
  let id = (obj._id ? obj._id : obj);
434
434
 
435
435
  if (
436
- (obj.tries) &&
437
- (this._factory.deadletter_queue ()) &&
438
- (this._factory.max_ko ()) &&
439
- (obj.tries > this._factory.max_ko ())
436
+ (obj.tries) && // only if we got tries
437
+ (this._factory.deadletter_queue ()) && // AND the factory has a deadletter queue
438
+ (this._factory.max_ko ()) && // AND thee's a max ko attempts
439
+ (obj.tries > this._factory.max_ko ()) && // AND we got enough tries
440
+ (this.name () != '__deadletter__') // and this queue is not deadletter already
440
441
  ) {
441
442
  debug ('%s: too many retries (%d), moving to deadletter', obj._id, obj.tries);
442
443
  this._move_to_deadletter (obj, cb);
443
- // TODO add from-what-queue to deadletter elements
444
444
  }
445
445
  else {
446
446
  this.rollback (id, next_t, (err, res) => {
@@ -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
 
@@ -710,15 +712,23 @@ class Queue {
710
712
  /////////////////////////////////////////////
711
713
  _move_to_deadletter (obj, cb) {
712
714
  // commit and move to deadletter
713
- // ALSO NOT IN deadletter queue (to void loop)
714
715
  // commit element in origin queue, push in deadletter afterwards
716
+ const opts = {
717
+ hdrs: _.clone (obj.hdrs || {})
718
+ };
719
+
720
+ // add some extra x-dl-* headers
721
+ opts.hdrs['x-dl-from-queue'] = this.name ();
722
+ opts.hdrs['x-dl-t'] = new Date().toISOString ();
723
+ opts.hdrs['x-dl-tries'] = obj.tries;
724
+
715
725
  this.commit (obj._id, err => {
716
726
  if (err) {
717
727
  debug ('while committing %s prior to moving to deadletter: %j', obj._id, err);
718
728
  return cb (err);
719
729
  }
720
730
 
721
- this._factory.deadletter_queue ().push (obj.payload, (err, res) => {
731
+ this._factory.deadletter_queue ().push (obj.payload, opts, (err, res) => {
722
732
  if (err) {
723
733
  debug ('while moving %s to deadletter: %j', obj._id, err);
724
734
  return cb (err, 'deadletter');
package/TODO CHANGED
@@ -9,7 +9,6 @@ prio 1
9
9
  + add some commonplace transforms (etl-like)
10
10
  + create a server for that, allow processor code defined externally
11
11
 
12
-
13
12
  prio 0
14
13
  -----------------------------------------------------------------
15
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) {
@@ -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
 
@@ -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.10",
3
+ "version": "1.6.13",
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": {
@@ -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
  });
@@ -111,6 +111,8 @@ function release_mq_factory (q, factory, cb) {
111
111
  pl: 'twetrwte'
112
112
  };
113
113
 
114
+ const hdrs = {aaa: 'qw', bbb: '666'};
115
+
114
116
  async.waterfall ([
115
117
  cb => get_mq_factory (MQ, factory_opts, cb),
116
118
  (factory, cb) => {
@@ -120,7 +122,7 @@ function release_mq_factory (q, factory, cb) {
120
122
 
121
123
  async.race ([
122
124
  cb => async.series([
123
- cb => q.push (pl, cb),
125
+ cb => q.push (pl, {hdrs}, cb),
124
126
  cb => pop (q, stage, cb),
125
127
  cb => reject (q, stage, (err) => {tries++;cb()}),
126
128
  cb => pop (q, stage, cb),
@@ -139,6 +141,13 @@ function release_mq_factory (q, factory, cb) {
139
141
  }),
140
142
  cb => factory.deadletter_queue().pop('c2', (err, res) => {
141
143
  res.payload.should.eql (pl);
144
+ res.hdrs.should.match ({
145
+ aaa: "qw",
146
+ bbb: "666",
147
+ 'x-dl-from-queue': "test_queue_deadletter",
148
+ 'x-dl-t': /.+/,
149
+ 'x-dl-tries': 4
150
+ });
142
151
  tries.should.equal (5);
143
152
  cb (err);
144
153
  })