keuss 1.7.3 → 2.0.0

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 (65) hide show
  1. package/Pipeline/Queue.js +0 -1
  2. package/QFactory.js +11 -6
  3. package/Queue.js +1 -4
  4. package/README.md +2 -1
  5. package/TODO +0 -9
  6. package/backends/bucket-mongo-safe.js +11 -11
  7. package/backends/intraorder.js +13 -11
  8. package/backends/mongo.js +12 -9
  9. package/backends/pl-mongo.js +8 -5
  10. package/backends/postgres.js +380 -0
  11. package/backends/ps-mongo.js +11 -8
  12. package/backends/redis-list.js +8 -8
  13. package/backends/redis-oq.js +8 -3
  14. package/backends/stream-mongo.js +10 -15
  15. package/package.json +14 -10
  16. package/stats/mem.js +0 -1
  17. package/.github/workflows/codeql-analysis.yml +0 -72
  18. package/bench/all-mongo.js +0 -108
  19. package/bench/multi-q.js +0 -85
  20. package/bench/redis-oq-consumer-producer.js +0 -52
  21. package/bench/redis-oq-consumer.js +0 -40
  22. package/bench/redis-oq-producer.js +0 -43
  23. package/docker-compose/docker-compose.yaml +0 -18
  24. package/docker-compose.yaml +0 -18
  25. package/examples/pipelines/builder/index.js +0 -99
  26. package/examples/pipelines/fromRecipe/index.js +0 -127
  27. package/examples/pipelines/simplest/index.js +0 -38
  28. package/examples/pipelines/simulation-fork/index.js +0 -115
  29. package/examples/snippets/01-simplest-pop-push.js +0 -49
  30. package/examples/snippets/02-simplest-reserve-rollback-commit.js +0 -44
  31. package/examples/snippets/03-simplest-producer-consumer-loops.js +0 -77
  32. package/examples/snippets/04-bucket-mongo-safe-insert-reserve-commit.js +0 -78
  33. package/examples/snippets/05-insert-reserve-rollback-deadletter.js +0 -105
  34. package/examples/snippets/06-random-consumer-producer.js +0 -270
  35. package/examples/snippets/07-stream-simple.js +0 -53
  36. package/examples/snippets/redislabs-consumer-producer.js +0 -44
  37. package/examples/snippets/with-redis-stats-and-signaller-consumer-producer.js +0 -52
  38. package/examples/webhooks/README.md +0 -36
  39. package/examples/webhooks/app.js +0 -70
  40. package/examples/webhooks/consumer.js +0 -98
  41. package/examples/webhooks/index.js +0 -55
  42. package/examples/webhooks/package-lock.json +0 -500
  43. package/examples/webhooks/package.json +0 -23
  44. package/examples/webhooks/wh-payload.json +0 -38
  45. package/playground/irc.js +0 -53
  46. package/playground/pl-rollback.js +0 -55
  47. package/playground/pl1.js +0 -74
  48. package/playground/q1.js +0 -34
  49. package/playground/simple-pl.js +0 -42
  50. package/playground/stream-loops.js +0 -114
  51. package/test/backends_bucket-at-least-once.js +0 -302
  52. package/test/backends_deadletter.js +0 -227
  53. package/test/backends_payload.js +0 -542
  54. package/test/backends_push-pop.js +0 -170
  55. package/test/backends_remove.js +0 -320
  56. package/test/backends_reserve-commit-rollback.js +0 -1033
  57. package/test/intraorder.js +0 -325
  58. package/test/pause.js +0 -220
  59. package/test/pipeline-Builder.js +0 -285
  60. package/test/pipeline-ChoiceLink.js +0 -241
  61. package/test/pipeline-DirectLink.js +0 -376
  62. package/test/pipeline-Sink.js +0 -175
  63. package/test/signal.js +0 -196
  64. package/test/stats.js +0 -296
  65. package/test/stream-mongo.js +0 -166
package/test/signal.js DELETED
@@ -1,196 +0,0 @@
1
- const should = require ('should');
2
- const async = require ('async');
3
- const _ = require ('lodash');
4
-
5
- const Local = require ('../signal/local');
6
- const Redis = require ('../signal/redis-pubsub');
7
- const Mongo = require ('../signal/mongo-capped');
8
-
9
- // const whyIsNodeRunning = require('why-is-node-running');
10
-
11
- const MongoClient = require ('mongodb').MongoClient;
12
-
13
- // setTimeout (() => whyIsNodeRunning(), 9000)
14
-
15
- _.forEach ({
16
- Local,
17
- Redis,
18
- Mongo
19
- }, (CL, CLName) => {
20
- describe (`${CLName} signaller`, () => {
21
-
22
- before (done => {
23
- done();
24
- });
25
-
26
- after (done => async.series ([
27
- cb => setTimeout (cb, 1000),
28
- cb => MongoClient.connect ('mongodb://localhost/keuss_signal', (err, cl) => {
29
- if (err) return done (err);
30
- cl.db().dropDatabase (() => cl.close (cb))
31
- })
32
- ], done));
33
-
34
-
35
- it ('creates ok', done => {
36
- CL ({}, (err, factory) => {
37
- if (err) return done(err);
38
- const q = {ns() {return 'the-ns'}, name () {return 'the-queue'}};
39
- const signal = factory.signal (q, {});
40
- setTimeout (() => factory.close(done), 500);
41
- });
42
- });
43
-
44
-
45
- it ('signals insertion ok', done => {
46
- CL ({}, (err, factory) => {
47
- if (err) return done(err);
48
- const q = {
49
- ns() {return 'the-ns'},
50
- name () {return 'the-queue'},
51
- signalInsertion (d) {
52
- d.getTime().should.equal (1234567890);
53
- factory.close(done);
54
- }
55
- };
56
-
57
- const signal = factory.signal (q, {});
58
- setTimeout (() => signal.emitInsertion (new Date(1234567890)), 500);
59
- });
60
- });
61
-
62
- it ('signals pause ok', done => {
63
- CL ({}, (err, factory) => {
64
- if (err) return done(err);
65
- const q = {
66
- ns() {return 'the-ns'},
67
- name () {return 'the-queue'},
68
- signalPaused(d) {
69
- d.should.equal (true);
70
- factory.close(done);
71
- }
72
- };
73
-
74
- const signal = factory.signal (q, {});
75
- setTimeout (() => signal.emitPaused (true), 500);
76
- });
77
- });
78
-
79
-
80
- describe (`extra/generic pubsub`, () => {
81
- it ('subscribes and receives info ok on 3 subscribers', done => {
82
- CL ({}, (err, factory) => {
83
- if (err) return done(err);
84
- const q = {ns() {return 'the-ns'}, name () {return 'the-queue'}};
85
- const signal1 = factory.signal (q, {});
86
- const signal2 = factory.signal (q, {});
87
- const signal3 = factory.signal (q, {});
88
-
89
- const evs = [];
90
-
91
- function manage (ev) {
92
- evs.push (ev);
93
- if (evs.length == 3) {
94
- evs.should.eql ([
95
- { a: 1, b: 'ertwetr' },
96
- { a: 1, b: 'ertwetr' },
97
- { a: 1, b: 'ertwetr' }
98
- ]);
99
-
100
- factory.close(done);
101
- }
102
- }
103
-
104
- signal1.subscribe_extra ('the-topic', manage);
105
- signal2.subscribe_extra ('the-topic', manage);
106
- signal3.subscribe_extra ('the-topic', manage);
107
-
108
- setTimeout (() => signal2.emit_extra ('the-topic', {a:1, b:'ertwetr'}), 100);
109
- });
110
- });
111
-
112
-
113
- it ('functions across several queues on the same signaller', done => {
114
- CL ({}, (err, factory) => {
115
- if (err) return done(err);
116
- const signal1 = factory.signal ({ns() {return 'the-ns'}, name () {return 'the-queue-1'}}, {});
117
- const signal2 = factory.signal ({ns() {return 'the-ns'}, name () {return 'the-queue-2'}}, {});
118
- const signal3 = factory.signal ({ns() {return 'the-ns'}, name () {return 'the-queue-3'}}, {});
119
-
120
- const evs = [];
121
-
122
- function manage (ev) {
123
- evs.push (ev);
124
- if (evs.length == 3) {
125
- evs.should.eql ([
126
- { a: 1, b: 'ertwetr' },
127
- { a: 1, b: 'ertwetr' },
128
- { a: 1, b: 'ertwetr' }
129
- ]);
130
-
131
- factory.close(done);
132
- }
133
- }
134
-
135
- signal1.subscribe_extra ('the-topic', manage);
136
- signal2.subscribe_extra ('the-topic', manage);
137
- signal3.subscribe_extra ('the-topic', manage);
138
-
139
- setTimeout (() => signal2.emit_extra ('the-topic', {a:1, b:'ertwetr'}), 100);
140
- });
141
- });
142
-
143
- it ('isolates namespaces', done => {
144
- CL ({}, (err, factory) => {
145
- if (err) return done(err);
146
- const signal1 = factory.signal ({ns() {return 'the-ns-1'}, name () {return 'the-queue'}}, {});
147
- const signal2 = factory.signal ({ns() {return 'the-ns-2'}, name () {return 'the-queue'}}, {});
148
-
149
- const evs = [];
150
-
151
- async.series ([
152
- cb => {signal1.subscribe_extra ('the-topic', ev => evs.push ({src: 1, ev})); cb ();},
153
- cb => {signal2.subscribe_extra ('the-topic', ev => evs.push ({src: 2, ev})); cb ();},
154
- cb => setTimeout (() => {signal1.emit_extra ('the-topic', {a:1, b:'qwertyuiop'}); cb ()}, 100),
155
- cb => setTimeout (() => {signal2.emit_extra ('the-topic', {a:2, b:'asdfghjkl'}); cb ()}, 100),
156
- cb => setTimeout (cb, 100),
157
- ], err => {
158
- if (err) return done(err);
159
- evs.should.eql ([
160
- { src: 1, ev: { a: 1, b: 'qwertyuiop' } },
161
- { src: 2, ev: { a: 2, b: 'asdfghjkl' } }
162
- ]);
163
- factory.close(done);
164
- });
165
- });
166
- });
167
-
168
- it ('unsubscribes ok and ceases to receive info', done => {
169
- CL ({}, (err, factory) => {
170
- if (err) return done(err);
171
- const signal1 = factory.signal ({ns() {return 'the-ns'}, name () {return 'the-queue'}}, {});
172
-
173
- const evs = [];
174
-
175
- function manage (ev) { evs.push (ev); }
176
-
177
- let subscr = null;
178
- async.series ([
179
- cb => {subscr = signal1.subscribe_extra ('the-topic', manage); cb ();},
180
- cb => setTimeout (() => {signal1.emit_extra ('the-topic', {a:1, b:'ertwetr'}); cb ()}, 100),
181
- cb => setTimeout (cb, 100),
182
- cb => {signal1.unsubscribe_extra (subscr); cb (); },
183
- cb => setTimeout (() => {signal1.emit_extra ('the-topic', {a:2, b:'asdfghjk'}); cb ()}, 100),
184
- ], err => {
185
- if (err) return done(err);
186
- evs.should.eql ([ { a: 1, b: 'ertwetr' } ]);
187
- factory.close(done);
188
- });
189
- });
190
- });
191
-
192
- });
193
-
194
-
195
- });
196
- });
package/test/stats.js DELETED
@@ -1,296 +0,0 @@
1
-
2
- //var log = require('why-is-node-running')
3
-
4
- var should = require ('should');
5
- var async = require ('async');
6
- var _ = require ('lodash');
7
-
8
- var Mem = require ('../stats/mem');
9
- var Redis = require ('../stats/redis');
10
- var Mongo = require ('../stats/mongo');
11
-
12
- const MongoClient = require ('mongodb').MongoClient;
13
-
14
- var ns = 'some-class';
15
- var name = 'test-stats';
16
-
17
-
18
- _.forEach ({
19
- Mem: Mem,
20
- Redis: Redis,
21
- Mongo: Mongo
22
- }, (CL, CLName) => {
23
-
24
- describe (CLName + ' stats provider', function () {
25
-
26
- before (done => {
27
- done();
28
- });
29
-
30
- after (done => async.series ([
31
- cb => setTimeout (cb, 1000),
32
- cb => MongoClient.connect ('mongodb://localhost/keuss_stats', (err, cl) => {
33
- if (err) return done (err);
34
- cl.db().dropDatabase (() => cl.close (cb))
35
- })
36
- ], done));
37
-
38
- it ('creates ok', done => {
39
- CL ((err, ftry) => {
40
- if (err) return done(err);
41
- var mem = ftry.stats (ns, name);
42
-
43
- async.series([
44
- cb => mem.clear (cb),
45
- ], () => {
46
- mem.values (function (err, vals) {
47
- vals.should.eql ({});
48
- ftry.close(done);
49
- });
50
- });
51
- });
52
- });
53
-
54
- it ('initializes ok', done => {
55
- CL ((err, ftry) => {
56
- if (err) return done(err);
57
- var mem = ftry.stats (ns, name);
58
-
59
- async.series([
60
- cb => mem.clear (cb),
61
- cb => mem.incr ('v1', 1, cb),
62
- cb => mem.incr ('v2', 1, cb),
63
- cb => mem.incr ('v3', 1, cb)
64
- ], (err, results) => {
65
- async.series ([
66
- cb => setTimeout (cb, 200),
67
- cb => mem.values (cb),
68
- cb => mem.paused (cb)
69
- ], (err, res) => {
70
- if (err) return done (err);
71
- mem.ns().should.equal (ns);
72
- mem.name().should.equal (name);
73
- res[1].should.eql ({v1: 1, v2: 1, v3: 1});
74
- res[2].should.eql (false);
75
- mem.clear (() => ftry.close(done));
76
- });
77
- });
78
- });
79
- });
80
-
81
- it ('increments (default by 1) ok', done => {
82
- CL ((err, ftry) => {
83
- if (err) return done(err);
84
- var mem = ftry.stats (ns, name);
85
-
86
- async.series([
87
- cb => mem.clear (cb),
88
- cb => mem.incr ('v1', 0, cb),
89
- cb => mem.incr ('v1', undefined, cb),
90
- cb => mem.incr ('v1', undefined, cb)
91
- ], (err, results) => {
92
- setTimeout (() => mem.values ((err, vals) => {
93
- vals.should.eql ({v1: 2});
94
- mem.clear (() => ftry.close(done));
95
- }), 200);
96
- });
97
- });
98
- });
99
-
100
- it ('increments (explicit deltas) ok', done => {
101
- CL ((err, ftry) => {
102
- if (err) return done(err);
103
- var mem = ftry.stats (ns, name);
104
-
105
- async.series([
106
- cb => mem.clear (cb),
107
- cb => mem.incr ('v1', 0, cb),
108
- cb => mem.incr ('v1', undefined, cb),
109
- cb => mem.incr ('v1', 3, cb)
110
- ], (err, results) => {
111
- setTimeout ( () => mem.values ((err, vals) => {
112
- vals.should.eql ({v1: 4});
113
- ftry.close(done);
114
- }), 200);
115
- });
116
- });
117
- });
118
-
119
- it ('decrements (default by 1) ok', done => {
120
- CL ((err, ftry) => {
121
- if (err) return done(err);
122
- var mem = ftry.stats (ns, name);
123
-
124
- async.series([
125
- cb => mem.clear (cb),
126
- cb => mem.incr ('v1', 1, cb),
127
- cb => mem.incr ('v1', undefined, cb),
128
- cb => mem.decr ('v1', undefined, cb)
129
- ], (err, results) => {
130
- setTimeout (() => mem.values ((err, vals) => {
131
- vals.should.eql ({v1: 1});
132
- ftry.close(done);
133
- }), 200);
134
- });
135
- });
136
- });
137
-
138
- it ('decrements (explicit deltas) ok', done => {
139
- CL ((err, ftry) => {
140
- if (err) return done(err);
141
- var mem = ftry.stats (ns, name);
142
-
143
- async.series([
144
- cb => mem.clear (cb),
145
- cb => mem.incr ('v1', 0, cb),
146
- cb => mem.incr ('v1', 6, cb),
147
- cb => mem.decr ('v1', 4, cb),
148
- cb => setTimeout (() => mem.values ((err, vals) => {
149
- vals.should.eql ({v1: 2});
150
- cb();
151
- }), 200),
152
- cb => mem.decr ('v1', 4, cb),
153
- cb => setTimeout (() => mem.values ((err, vals) => {
154
- vals.should.eql ({v1: -2});
155
- cb();
156
- }), 200)
157
- ], (err, results) => {
158
- ftry.close();
159
- done (err);
160
- });
161
- });
162
- });
163
-
164
-
165
- it ('manages pause/resume ok', done => {
166
- CL ((err, ftry) => {
167
- if (err) return done(err);
168
- var mem = ftry.stats (ns, name);
169
-
170
- async.series([
171
- cb => mem.clear (cb),
172
- cb => mem.paused (cb),
173
- cb => mem.paused (true, cb),
174
- cb => mem.paused (cb),
175
- cb => mem.paused (false, cb),
176
- cb => mem.paused (cb),
177
- cb => mem.paused (false, cb),
178
- cb => mem.paused (cb),
179
- cb => setTimeout (cb, 200)
180
- ], (err, results) => {
181
- results.should.eql ([ undefined,
182
- false,
183
- undefined,
184
- true,
185
- undefined,
186
- false,
187
- undefined,
188
- false,
189
- undefined ]);
190
- ftry.close();
191
- done (err);
192
- });
193
- });
194
- });
195
-
196
- it ('manages concise & full listing ok', done => {
197
- CL ((err, ftry) => {
198
- if (err) return done(err);
199
- var mem1 = ftry.stats (ns, name);
200
- var mem2 = ftry.stats (ns, name + '-2');
201
- var opts1 = {s:0, a: 'yy'};
202
- var opts2 = {s:7, at: 'yy--j'};
203
-
204
- async.series([
205
- cb => mem1.clear (cb),
206
- cb => mem2.clear (cb),
207
- cb => mem1.opts (opts1, cb),
208
- cb => mem2.opts (opts2, cb),
209
- cb => mem1.incr ('v1', 8, cb),
210
- cb => mem1.incr ('v2', 6, cb),
211
- cb => mem2.incr ('v1', 4, cb),
212
- cb => mem2.incr ('v3', 45, cb),
213
- cb => setTimeout (() => ftry.queues (ns, (err, res) => {
214
- if (err) return cb (err);
215
- res.sort().should.eql ([ 'test-stats', 'test-stats-2' ]);
216
- cb ();
217
- }), 200),
218
- cb => setTimeout (() => ftry.queues (ns, {full: true}, (err, res) => {
219
- if (err) return cb (err);
220
- res.should.eql ({
221
- 'test-stats': { name: 'test-stats', ns: 'some-class', opts: opts1, counters: {v1: 8, v2: 6 }, paused: false },
222
- 'test-stats-2': { name: 'test-stats-2', ns: 'some-class', opts: opts2, counters: {v1: 4, v3: 45}, paused: false }
223
- });
224
-
225
- cb ();
226
- }), 200)
227
- ], (err, results) => {
228
- ftry.close();
229
- done (err);
230
- });
231
- });
232
- });
233
-
234
- it ('clears ok', done => {
235
- CL ((err, ftry) => {
236
- if (err) return done(err);
237
- var mem = ftry.stats (ns, name);
238
-
239
- async.series([
240
- cb => mem.clear (cb),
241
- cb => mem.incr ('v1', 0, cb),
242
- cb => mem.incr ('v1', 6, cb),
243
- cb => mem.incr ('v2', 6, cb),
244
- cb => mem.decr ('v2', 4, cb),
245
- cb => setTimeout (() => mem.values ((err, vals) => {
246
- vals.should.eql ({v1: 6, v2: 2});
247
- cb();
248
- }), 200),
249
- cb => mem.clear (cb),
250
- cb => setTimeout (() => mem.values ((err, vals) => {
251
- vals.should.eql ({});
252
- cb();
253
- }), 200)
254
- ], (err, results) => {
255
- ftry.close();
256
- done (err);
257
- });
258
- });
259
- });
260
-
261
-
262
- it ('managed hierarchy (dotted keys) ok', done => {
263
- CL ((err, ftry) => {
264
- if (err) return done(err);
265
- var mem = ftry.stats (ns, name);
266
-
267
- async.series([
268
- cb => mem.clear (cb),
269
- cb => mem.incr ('l1.l2.c', -1, cb),
270
- cb => mem.incr ('l1.l2.b', 1, cb),
271
- cb => mem.incr ('l1.l3.a', 7, cb),
272
- cb => mem.incr ('v1', 3, cb),
273
- ], (err, results) => {
274
- setTimeout ( () => mem.values ((err, vals) => {
275
- vals.should.eql ({
276
- l1: {
277
- l2: {
278
- b: 1,
279
- c: -1
280
- },
281
- l3: {
282
- a: 7
283
- }
284
- },
285
- v1: 3
286
- });
287
-
288
- ftry.close(done);
289
- }), 200);
290
- });
291
- });
292
- });
293
-
294
-
295
- });
296
- });
@@ -1,166 +0,0 @@
1
- var async = require ('async');
2
- var should = require ('should');
3
- var _ = require ('lodash');
4
-
5
- var LocalSignal = require ('../signal/local');
6
- var MemStats = require ('../stats/mem');
7
-
8
- const MongoClient = require ('mongodb').MongoClient;
9
-
10
-
11
- function stats (q, cb) {
12
- async.series ({
13
- stats: cb => q.stats(cb),
14
- tsize: cb => q.totalSize(cb)
15
- }, (err, res) => {
16
- // console.log ('stats:', res);
17
- cb (err, res);
18
- });
19
- }
20
-
21
- function get_mq_factory (MQ, opts, cb) {
22
- const common_opts = {
23
- url: 'mongodb://localhost/keuss_test_backends_stream_mongo',
24
- signaller: { provider: LocalSignal},
25
- stats: {provider: MemStats},
26
- };
27
-
28
- // initialize factory
29
- MQ (_.merge ({}, common_opts, opts), cb);
30
- }
31
-
32
- function release_mq_factory (factory, cb) {
33
- // console.log ('releasing mq factory');
34
-
35
- setTimeout (() => {
36
- factory.close (cb);
37
- }, 1000);
38
- }
39
-
40
-
41
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
42
- [
43
- {label: 'Stream MongoDB', mq: require ('../backends/stream-mongo')},
44
- ].forEach (MQ_item => {
45
- describe('stream operations with ' + MQ_item.label + ' queue backend', () => {
46
- const MQ = MQ_item.mq;
47
-
48
- beforeEach (done => {
49
- done();
50
- });
51
-
52
- afterEach (done => async.series ([
53
- cb => setTimeout (cb, 1000),
54
- cb => MongoClient.connect ('mongodb://localhost/keuss_test_backends_stream_mongo', (err, cl) => {
55
- if (err) return done (err);
56
- cl.db().dropDatabase (() => cl.close (cb))
57
- })
58
- ], done));
59
-
60
-
61
- it('pushes one message, reads it on 3 clients', done => {
62
- const pl = {elem: 1, pl: 'twetrwte'};
63
- const hdrs = {aaa: 'qw', bbb: '666'};
64
-
65
- async.waterfall ([
66
- cb => get_mq_factory (MQ, {}, cb),
67
- (factory, cb) => {
68
- const q0 = factory.queue('test_queue_1', {groups: '000, 001, 002, 003'});
69
- const q1 = factory.queue('test_queue_1', {group: '000'});
70
- const q2 = factory.queue('test_queue_1', {group: '001'});
71
- const q3 = factory.queue('test_queue_1', {group: '002'});
72
-
73
- async.parallel ([
74
- cb => setTimeout (() => q0.push (pl, {hdrs}, cb), 1111),
75
- cb => q1.pop ('c1', cb),
76
- cb => q2.pop ('c2', cb),
77
- cb => q3.pop ('c3', cb),
78
- ], (err, res) => {
79
- if (err) return done (err);
80
- res[1].should.eql (res[2]);
81
- res[2].should.eql (res[3]);
82
- res[1].payload.should.eql (pl);
83
- res[1].hdrs.should.eql (hdrs);
84
- cb (err, factory);
85
- });
86
- },
87
- (factory, cb) => release_mq_factory (factory, cb)
88
- ], done);
89
- });
90
-
91
-
92
- it('pushes one message, unaware cients do not get it', done => {
93
- const pl = {elem: 1, pl: 'twetrwte'};
94
- const hdrs = {aaa: 'qw', bbb: '666'};
95
-
96
- async.waterfall ([
97
- cb => get_mq_factory (MQ, {}, cb),
98
- (factory, cb) => {
99
- const q0 = factory.queue('test_queue_1', {groups: '000, 001, 002, 003'});
100
- const q1 = factory.queue('test_queue_1', {group: '000'});
101
- const q2 = factory.queue('test_queue_1', {group: '001'});
102
- const q3 = factory.queue('test_queue_1', {group: '004'});
103
- const q4 = factory.queue('test_queue_1', {group: '005'});
104
-
105
- async.parallel ([
106
- cb => setTimeout (() => q0.push (pl, {hdrs}, cb), 1111),
107
- cb => q1.pop ('c1', cb),
108
- cb => q2.pop ('c2', cb),
109
- cb => q3.pop ('c3', {timeout: 2000}, err => cb (null, err)),
110
- cb => q4.pop ('c4', {timeout: 2000}, err => cb (null, err)),
111
- ], (err, res) => {
112
- if (err) return done (err);
113
- res[1].should.eql (res[2]);
114
- res[1].payload.should.eql (pl);
115
- res[1].hdrs.should.eql (hdrs);
116
- res[3].timeout.should.be.true;
117
- res[4].timeout.should.be.true;
118
- cb (err, factory);
119
- });
120
- },
121
- (factory, cb) => release_mq_factory (factory, cb)
122
- ], done);
123
- });
124
-
125
- it('pushes one message, only on of several clients on same group get it', done => {
126
- const pl = {elem: 1, pl: 'twetrwte'};
127
- const hdrs = {aaa: 'qw', bbb: '666'};
128
-
129
- async.waterfall ([
130
- cb => get_mq_factory (MQ, {}, cb),
131
- (factory, cb) => {
132
- const q0 = factory.queue('test_queue_1', {groups: '000, 001, 002, 003'});
133
- const q1 = factory.queue('test_queue_1', {group: '000'});
134
- const q2 = factory.queue('test_queue_1', {group: '000'});
135
- const q3 = factory.queue('test_queue_1', {group: '001'});
136
- const q4 = factory.queue('test_queue_1', {group: '001'});
137
-
138
- async.parallel ([
139
- cb => setTimeout (() => q0.push (pl, {hdrs}, cb), 1111),
140
- cb => q1.pop ('c1', {timeout: 2000}, (err, res) => cb (null, res || err)),
141
- cb => q2.pop ('c2', {timeout: 2000}, (err, res) => cb (null, res || err)),
142
- cb => q3.pop ('c3', {timeout: 2000}, (err, res) => cb (null, res || err)),
143
- cb => q4.pop ('c4', {timeout: 2000}, (err, res) => cb (null, res || err)),
144
- ], (err, res) => {
145
- if (err) return done (err);
146
-
147
- function __calc__ (ra) {
148
- const res = {ok:0, ko:0};
149
- ra.forEach (r => {
150
- if (r.timeout === true) res.ko++;
151
- else if (r.payload.elem == 1) res.ok++;
152
- });
153
- return res;
154
- }
155
-
156
- __calc__ ([res[1], res[2]]).should.eql ({ok:1, ko:1});
157
- __calc__ ([res[3], res[4]]).should.eql ({ok:1, ko:1});
158
- cb (err, factory);
159
- });
160
- },
161
- (factory, cb) => release_mq_factory (factory, cb)
162
- ], done);
163
- });
164
-
165
- });
166
- });