keuss 1.6.15 → 1.7.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.
@@ -80,6 +80,7 @@ function release_mq_factory (q, factory, cb) {
80
80
  {label: 'Simple MongoDB', mq: require ('../backends/mongo')},
81
81
  {label: 'Pipelined MongoDB', mq: require ('../backends/pl-mongo')},
82
82
  {label: 'Tape MongoDB', mq: require ('../backends/ps-mongo')},
83
+ {label: 'Stream MongoDB', mq: require ('../backends/stream-mongo')},
83
84
  {label: 'Redis OrderedQueue', mq: require ('../backends/redis-oq')},
84
85
  {label: 'MongoDB SafeBucket', mq: require ('../backends/bucket-mongo-safe')}
85
86
  ].forEach(function (MQ_item) {
@@ -159,8 +160,8 @@ function release_mq_factory (q, factory, cb) {
159
160
  cb => stats (q, cb),
160
161
  cb => stats (factory.deadletter_queue(), cb),
161
162
  ], (err, res) => {
162
- res[1].tsize.should.equal (0);
163
- res[2].tsize.should.equal (0);
163
+ res[1].tsize.should.equal (0);
164
+ res[2].tsize.should.equal (0);
164
165
 
165
166
  cb (err, q, factory);
166
167
  });
@@ -209,8 +210,8 @@ function release_mq_factory (q, factory, cb) {
209
210
  cb => stats (q, cb),
210
211
  cb => stats (factory.deadletter_queue(), cb),
211
212
  ], (err, res) => {
212
- res[1].tsize.should.equal (0);
213
- res[2].tsize.should.equal (0);
213
+ res[1].tsize.should.equal (0);
214
+ res[2].tsize.should.equal (0);
214
215
 
215
216
  cb (err, q, factory);
216
217
  });
@@ -13,7 +13,7 @@ var factory = null;
13
13
  {label: 'Simple MongoDB', mq: require ('../backends/mongo')},
14
14
  {label: 'Pipelined MongoDB', mq: require ('../backends/pl-mongo')},
15
15
  {label: 'Tape MongoDB', mq: require ('../backends/ps-mongo')},
16
- {label: 'Simple MongoDB Buckets', mq: require ('../backends/bucket-mongo')},
16
+ {label: 'Stream MongoDB', mq: require ('../backends/stream-mongo')},
17
17
  {label: 'Safe MongoDB Buckets', mq: require ('../backends/bucket-mongo-safe')},
18
18
  {label: 'Redis List', mq: require ('../backends/redis-list')},
19
19
  {label: 'Redis OrderedQueue', mq: require ('../backends/redis-oq')},
@@ -264,6 +264,7 @@ var factory = null;
264
264
  {label: 'Simple MongoDB', mq: require ('../backends/mongo')},
265
265
  {label: 'Pipelined MongoDB', mq: require ('../backends/pl-mongo')},
266
266
  {label: 'Tape MongoDB', mq: require ('../backends/ps-mongo')},
267
+ {label: 'Stream MongoDB', mq: require ('../backends/stream-mongo')},
267
268
  {label: 'Safe MongoDB Buckets', mq: require ('../backends/bucket-mongo-safe')},
268
269
  {label: 'Redis OrderedQueue', mq: require ('../backends/redis-oq')},
269
270
  ].forEach(function (MQ_item) {
@@ -13,6 +13,7 @@ var factory = null;
13
13
  {label: 'Simple MongoDB', mq: require ('../backends/mongo')},
14
14
  {label: 'Pipelined MongoDB', mq: require ('../backends/pl-mongo')},
15
15
  {label: 'Tape MongoDB', mq: require ('../backends/ps-mongo')},
16
+ {label: 'Stream MongoDB', mq: require ('../backends/stream-mongo')},
16
17
  // {label: 'Safe MongoDB Buckets', mq: require ('../backends/bucket-mongo-safe')},
17
18
  {label: 'Redis OrderedQueue', mq: require ('../backends/redis-oq')}
18
19
  ].forEach(function (MQ_item) {
@@ -79,7 +80,7 @@ var factory = null;
79
80
  })
80
81
  },
81
82
  cb => q.stats((err, res) => {
82
- res.should.eql({
83
+ res.should.match({
83
84
  get: 0,
84
85
  put: 2,
85
86
  reserve: 0,
@@ -99,7 +100,7 @@ var factory = null;
99
100
  cb();
100
101
  }),
101
102
  cb => q.stats((err, res) => {
102
- res.should.eql({
103
+ res.should.match({
103
104
  get: 1,
104
105
  put: 2,
105
106
  reserve: 0,
@@ -118,7 +119,7 @@ var factory = null;
118
119
  },
119
120
  cb => setTimeout (cb, 1000),
120
121
  cb => q.stats((err, res) => {
121
- res.should.eql({
122
+ res.should.match({
122
123
  get: 2,
123
124
  put: 2,
124
125
  reserve: 0,
@@ -170,7 +171,7 @@ var factory = null;
170
171
  },
171
172
  function (cb) {
172
173
  q.stats(function (err, res) {
173
- res.should.eql({
174
+ res.should.match({
174
175
  get: 0,
175
176
  put: 2,
176
177
  reserve: 0,
@@ -204,7 +205,7 @@ var factory = null;
204
205
  },
205
206
  function (cb) {
206
207
  q.stats(function (err, res) {
207
- res.should.eql({
208
+ res.should.match({
208
209
  get: 1,
209
210
  put: 2,
210
211
  reserve: 0,
@@ -238,7 +239,7 @@ var factory = null;
238
239
  },
239
240
  function (cb) {
240
241
  q.stats(function (err, res) {
241
- res.should.eql({
242
+ res.should.match({
242
243
  get: 2,
243
244
  put: 2,
244
245
  reserve: 0,
@@ -293,7 +294,7 @@ var factory = null;
293
294
  },
294
295
  function (cb) {
295
296
  q.stats(function (err, res) {
296
- res.should.eql({
297
+ res.should.match({
297
298
  get: 0,
298
299
  put: 2,
299
300
  reserve: 0,
@@ -320,7 +321,7 @@ var factory = null;
320
321
  },
321
322
  function (cb) {
322
323
  q.stats(function (err, res) {
323
- res.should.eql({
324
+ res.should.match({
324
325
  get: 0,
325
326
  put: 2,
326
327
  reserve: 0,
@@ -347,7 +348,7 @@ var factory = null;
347
348
  },
348
349
  function (cb) {
349
350
  q.stats(function (err, res) {
350
- res.should.eql({
351
+ res.should.match({
351
352
  get: 0,
352
353
  put: 2,
353
354
  reserve: 0,
@@ -388,7 +389,7 @@ var factory = null;
388
389
  },
389
390
  function (cb) {
390
391
  q.stats(function (err, res) {
391
- res.should.eql({
392
+ res.should.match({
392
393
  get: 2,
393
394
  put: 2,
394
395
  reserve: 0,
@@ -469,7 +470,7 @@ var factory = null;
469
470
  },
470
471
  function (cb) {
471
472
  q.stats(function (err, res) {
472
- res.should.eql({
473
+ res.should.match({
473
474
  get: 2,
474
475
  put: 2,
475
476
  reserve: 0,
@@ -526,7 +527,7 @@ var factory = null;
526
527
  },
527
528
  function (cb) {
528
529
  q.stats(function (err, res) {
529
- res.should.eql({
530
+ res.should.match({
530
531
  get: 0,
531
532
  put: 3,
532
533
  reserve: 0,
@@ -584,7 +585,7 @@ var factory = null;
584
585
  },
585
586
  function (cb) {
586
587
  q.stats(function (err, res) {
587
- res.should.eql({
588
+ res.should.match({
588
589
  get: 3,
589
590
  put: 3,
590
591
  reserve: 0,
@@ -858,7 +859,7 @@ var factory = null;
858
859
  },
859
860
  cb => setTimeout (cb, 1000),
860
861
  cb => q.stats((err, res) => {
861
- res.should.eql({
862
+ res.should.match({
862
863
  get: 0,
863
864
  put: 1,
864
865
  reserve: 1,
@@ -996,7 +997,7 @@ var factory = null;
996
997
  cb => q.ok (state.reserved_obj, cb),
997
998
  cb => setTimeout (cb, 1000),
998
999
  cb => q.stats((err, res) => {
999
- res.should.eql({
1000
+ res.should.match({
1000
1001
  get: 0,
1001
1002
  put: 1,
1002
1003
  reserve: 3,
package/test/pause.js CHANGED
@@ -11,8 +11,8 @@ var factory = null;
11
11
  {label: 'redis OrderedQueue', backend: require ('../backends/redis-oq')},
12
12
  {label: 'pipeline MongoDB', backend: require ('../backends/pl-mongo')},
13
13
  {label: 'persistent MongoDB', backend: require ('../backends/ps-mongo')},
14
+ {label: 'Stream MongoDB', backend: require ('../backends/stream-mongo')},
14
15
  {label: 'plain MongoDB', backend: require ('../backends/mongo')},
15
- {label: 'MongoDB Bucket', backend: require ('../backends/bucket-mongo')},
16
16
  {label: 'Safe MongoDB Bucket', backend: require ('../backends/bucket-mongo-safe')},
17
17
  ].forEach (backend_item => {
18
18
  [
@@ -102,7 +102,7 @@ var factory = null;
102
102
 
103
103
  ], (err, res) => {
104
104
  if (err) return done (err);
105
- res[4].should.eql ({ put: 6, get: 6 });
105
+ res[4].should.match ({ put: 6, get: 6 });
106
106
  res[5].should.equal (0);
107
107
  q.nConsumers().should.equal (0);
108
108
 
@@ -131,7 +131,7 @@ var factory = null;
131
131
  cb => q._stats.clear (cb),
132
132
  ], (err, res) => {
133
133
  if (err) return done (err);
134
- res[4].should.eql ({ put: 1, get: 1 });
134
+ res[4].should.match ({ put: 1, get: 1 });
135
135
  res[5].should.equal (0);
136
136
  q.nConsumers().should.equal (0);
137
137
 
@@ -165,7 +165,7 @@ var factory = null;
165
165
  cb => q._stats.clear (cb)
166
166
  ], (err, res) => {
167
167
  if (err) return done (err);
168
- res[4].should.eql ({ put: 1 });
168
+ res[4].should.match ({ put: 1 });
169
169
  res[5].should.equal (1);
170
170
  res[2][0].timeout.should.eql (true);
171
171
  res[7].payload.should.eql ({q:0, a: 'ryetyeryre 0'});
@@ -201,7 +201,7 @@ var factory = null;
201
201
  cb => q._stats.clear (cb)
202
202
  ], (err, res) => {
203
203
  if (err) return done (err);
204
- res[6].should.eql ({ put: 1 });
204
+ res[6].should.match ({ put: 1 });
205
205
  res[7].should.equal (1);
206
206
  res[4].timeout.should.eql (true);
207
207
  res[9].payload.should.eql ({q:0, a: 'ryetyeryre 0'});
package/test/signal.js CHANGED
@@ -40,6 +40,41 @@ _.forEach ({
40
40
  setTimeout (() => factory.close(done), 500);
41
41
  });
42
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
+ });
43
78
 
44
79
 
45
80
  describe (`extra/generic pubsub`, () => {
package/test/stats.js CHANGED
@@ -39,9 +39,14 @@ _.forEach ({
39
39
  CL ((err, ftry) => {
40
40
  if (err) return done(err);
41
41
  var mem = ftry.stats (ns, name);
42
- mem.values (function (err, vals) {
43
- vals.should.eql ({});
44
- ftry.close(done);
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
+ });
45
50
  });
46
51
  });
47
52
  });
@@ -52,6 +57,7 @@ _.forEach ({
52
57
  var mem = ftry.stats (ns, name);
53
58
 
54
59
  async.series([
60
+ cb => mem.clear (cb),
55
61
  cb => mem.incr ('v1', 1, cb),
56
62
  cb => mem.incr ('v2', 1, cb),
57
63
  cb => mem.incr ('v3', 1, cb)
@@ -251,5 +257,40 @@ _.forEach ({
251
257
  });
252
258
  });
253
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
+
254
295
  });
255
296
  });
@@ -0,0 +1,166 @@
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
+ });