keuss 1.7.4 → 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 +12 -8
  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
@@ -1,376 +0,0 @@
1
-
2
- var async = require ('async');
3
- var should = require ('should');
4
-
5
- var LocalSignal = require ('../signal/local');
6
- var MemStats = require ('../stats/mem');
7
-
8
- var PDL = require ('../Pipeline/DirectLink');
9
-
10
- const MongoClient = require ('mongodb').MongoClient;
11
-
12
- var factory = null;
13
-
14
- [
15
- {label: 'Pipelined MongoDB', mq: require ('../backends/pl-mongo')}
16
- ].forEach (function (MQ_item) {
17
- describe ('Pipeline/DirectLink operations over ' + MQ_item.label, function () {
18
- var MQ = MQ_item.mq;
19
-
20
- before (done => {
21
- var opts = {
22
- url: 'mongodb://localhost/__test_pipeline_directlink__',
23
- opts: { useUnifiedTopology: true },
24
- signaller: { provider: LocalSignal},
25
- stats: {provider: MemStats}
26
- };
27
-
28
- MQ (opts, (err, fct) => {
29
- if (err) return done (err);
30
- factory = fct;
31
- done();
32
- });
33
- });
34
-
35
- after (done => async.series ([
36
- cb => setTimeout (cb, 1000),
37
- cb => factory.close (cb),
38
- cb => MongoClient.connect ('mongodb://localhost/__test_pipeline_directlink__', (err, cl) => {
39
- if (err) return done (err);
40
- cl.db().dropDatabase (() => cl.close (cb))
41
- })
42
- ], done));
43
-
44
- it ('3-elem pipeline flows begin to end, no payload changes', done => {
45
- var q_opts = {};
46
- var q1 = factory.queue ('test_1_pl_1', q_opts);
47
- var q2 = factory.queue ('test_1_pl_2', q_opts);
48
- var q3 = factory.queue ('test_1_pl_3', q_opts);
49
-
50
- // tie them up, q1 -> q2 -> q3
51
- var pll1 = new PDL (q1, q2);
52
- var pll2 = new PDL (q2, q3);
53
-
54
- pll1.start ((elem, done0) => {
55
- done0();
56
- });
57
-
58
- pll2.start ((elem, done0) => {
59
- done0();
60
- });
61
-
62
- var pop_opts = {};
63
-
64
- q3.pop ('c', pop_opts, (err, res) => {
65
- if (err) return done (err);
66
-
67
- pll1.stop();
68
- pll2.stop();
69
-
70
- res.payload.should.eql ({ a: 5, b: 'see it run...'});
71
- res.tries.should.equal (0);
72
- res._q.should.equal ('test_1_pl_3');
73
-
74
- setTimeout (done, 250);
75
- });
76
-
77
- q1.push ({a:5, b:'see it run...'}, {}, () => {});
78
- });
79
-
80
- it ('3-elem pipeline flows begin to end, full payload overwrite', done => {
81
- var q_opts = {};
82
- var q1 = factory.queue ('test_1_pl_1', q_opts);
83
- var q2 = factory.queue ('test_1_pl_2', q_opts);
84
- var q3 = factory.queue ('test_1_pl_3', q_opts);
85
-
86
- // tie them up, q1 -> q2 -> q3
87
- var pll1 = new PDL (q1, q2);
88
- var pll2 = new PDL (q2, q3);
89
-
90
- pll1.start ((elem, done0) => {
91
- var pl = elem.payload;
92
- pl.pll1 = 'done';
93
- done0(null, {payload: pl});
94
- });
95
-
96
- pll2.start ((elem, done0) => {
97
- var pl = elem.payload;
98
- pl.pll2 = 'done';
99
- done0(null, {payload: pl});
100
- });
101
-
102
- var pop_opts = {};
103
-
104
- q3.pop ('c', pop_opts, (err, res) => {
105
- if (err) return done (err);
106
-
107
- pll1.stop();
108
- pll2.stop();
109
-
110
- res.payload.should.eql ({ a: 5, b: 'see it run...', pll1: 'done', pll2: 'done' });
111
- res.tries.should.equal (0);
112
- res._q.should.equal ('test_1_pl_3');
113
-
114
- setTimeout (done, 250);
115
- });
116
-
117
- q1.push ({a:5, b:'see it run...'}, {}, () => {});
118
- });
119
-
120
-
121
- it ('3-elem pipeline flows begin to end, payload update', done => {
122
- var q_opts = {};
123
- var q1 = factory.queue ('test_1_pl_1', q_opts);
124
- var q2 = factory.queue ('test_1_pl_2', q_opts);
125
- var q3 = factory.queue ('test_1_pl_3', q_opts);
126
-
127
- // tie them up, q1 -> q2 -> q3
128
- var pll1 = new PDL (q1, q2);
129
- var pll2 = new PDL (q2, q3);
130
-
131
- pll1.start ((elem, done0) => {
132
- done0(null, {update: {$set: {pll1: 'done'}}});
133
- });
134
-
135
- pll2.start ((elem, done0) => {
136
- done0(null, {update: {$set: {pll2: 'done'}}});
137
- });
138
-
139
- var pop_opts = {};
140
-
141
- q3.pop ('c', pop_opts, (err, res) => {
142
- if (err) return done (err);
143
-
144
- pll1.stop();
145
- pll2.stop();
146
-
147
- res.payload.should.eql ({ a: 5, b: 'see it run...', pll1: 'done', pll2: 'done' });
148
- res.tries.should.equal (0);
149
- res._q.should.equal ('test_1_pl_3');
150
-
151
- setTimeout (done, 250);
152
- });
153
-
154
- q1.push ({a:5, b:'see it run...'}, {}, () => {});
155
- });
156
-
157
-
158
- it ('3-elem pipeline flows begin to end with retries and various elements', done => {
159
- var q_opts = {};
160
- var q1 = factory.queue ('test_2_pl_1', q_opts);
161
- var q2 = factory.queue ('test_2_pl_2', q_opts);
162
- var q3 = factory.queue ('test_2_pl_3', q_opts);
163
-
164
- // intermediate state
165
- var stage1_retries = 0;
166
- var stage2_retries = 0;
167
-
168
- // tie them up, q1 -> q2 -> q3
169
- var pll1 = new PDL (q1, q2);
170
- var pll2 = new PDL (q2, q3);
171
-
172
- pll1.start ((elem, done0) => {
173
- const pl = elem.payload;
174
- if ((pl.a == 3) && (elem.tries < 3)) {
175
- stage1_retries++;
176
- done0 ({e: 'error, retry'});
177
- }
178
- else
179
- done0(null, {update: {$inc: {pll1: 1}}});
180
- });
181
-
182
- pll2.start ((elem, done0) => {
183
- const pl = elem.payload;
184
- if ((pl.a == 1) && (elem.tries < 3)) {
185
- stage2_retries++;
186
- done0 ({e: 'error, retry'});
187
- }
188
- else
189
- done0(null, {update: {$inc: {pll2: 1}}});
190
- });
191
-
192
- var pop_opts = {};
193
-
194
- async.timesLimit (5, 1, (n, next) => {
195
- q3.pop ('c', pop_opts, (err, res) => next (err, res));
196
- }, (err, res) => {
197
- stage1_retries.should.equal (3);
198
- stage2_retries.should.equal (3);
199
-
200
- res[0].payload.should.eql ({ a: 0, b: 'see it run...', pll1: 1, pll2: 1 });
201
- res[0].tries.should.equal (0);
202
- res[0]._q.should.equal ('test_2_pl_3');
203
-
204
- res[1].payload.should.eql ({ a: 2, b: 'see it run...', pll1: 1, pll2: 1 });
205
- res[1].tries.should.equal (0);
206
- res[1]._q.should.equal ('test_2_pl_3');
207
-
208
- res[2].payload.should.eql ({ a: 4, b: 'see it run...', pll1: 1, pll2: 1 });
209
- res[2].tries.should.equal (0);
210
- res[2]._q.should.equal ('test_2_pl_3');
211
-
212
- res[3].payload.should.eql ({ a: 1, b: 'see it run...', pll1: 1, pll2: 1 });
213
- res[3].tries.should.equal (0);
214
- res[3]._q.should.equal ('test_2_pl_3');
215
-
216
- res[4].payload.should.eql ({ a: 3, b: 'see it run...', pll1: 1, pll2: 1 });
217
- res[4].tries.should.equal (0);
218
- res[4]._q.should.equal ('test_2_pl_3');
219
-
220
- pll1.stop();
221
- pll2.stop ();
222
-
223
- setTimeout (done, 250);
224
- });
225
-
226
- async.timesLimit (5, 1, (n, next) =>
227
- q1.push ({a:n, b:'see it run...', pll1: 0, pll2: 0}, {}, () => setTimeout (next, 200))
228
- );
229
- });
230
-
231
- it ('3-elem pipeline flows begin to end, sink at the end using res==false', done => {
232
- var q_opts = {};
233
- var q1 = factory.queue ('test_1_pl_1', q_opts);
234
- var q2 = factory.queue ('test_1_pl_2', q_opts);
235
- var q3 = factory.queue ('test_1_pl_3', q_opts);
236
-
237
- // tie them up, q1 -> q2 -> q3
238
- var pll1 = new PDL (q1, q2);
239
- var pll2 = new PDL (q2, q3);
240
-
241
- pll1.start ((elem, done0) => {
242
- elem.should.match ({
243
- payload: { a: 5, b: 'see it run...' },
244
- tries: 0,
245
- _q: 'test_1_pl_1'
246
- });
247
-
248
- done0();
249
- });
250
-
251
- pll2.start ((elem, done0) => {
252
- elem.should.match ({
253
- payload: { a: 5, b: 'see it run...' },
254
- tries: 0,
255
- _q: 'test_1_pl_2'
256
- });
257
-
258
- done0(null, false);
259
-
260
- setTimeout (() => {
261
- pll1.stop();
262
- pll2.stop();
263
-
264
- async.series ([
265
- cb => q1.totalSize(cb),
266
- cb => q2.totalSize(cb),
267
- cb => q3.totalSize(cb)
268
- ], (err, res) => {
269
- if (err) return done (err);
270
- res.should.eql ([0,0,0]);
271
- setTimeout (done, 250);
272
- });
273
- }, 500);
274
- });
275
-
276
- q1.push ({a:5, b:'see it run...'}, {}, () => {});
277
- });
278
-
279
- it ('3-elem pipeline flows begin to end, sink at the end using res.drop == true', done => {
280
- var q_opts = {};
281
- var q1 = factory.queue ('test_1_pl_1', q_opts);
282
- var q2 = factory.queue ('test_1_pl_2', q_opts);
283
- var q3 = factory.queue ('test_1_pl_3', q_opts);
284
-
285
- // tie them up, q1 -> q2 -> q3
286
- var pll1 = new PDL (q1, q2);
287
- var pll2 = new PDL (q2, q3);
288
-
289
- pll1.start ((elem, done0) => {
290
- elem.should.match ({
291
- payload: { a: 5, b: 'see it run...' },
292
- tries: 0,
293
- _q: 'test_1_pl_1'
294
- });
295
-
296
- done0();
297
- });
298
-
299
- pll2.start ((elem, done0) => {
300
- elem.should.match ({
301
- payload: { a: 5, b: 'see it run...' },
302
- tries: 0,
303
- _q: 'test_1_pl_2'
304
- });
305
-
306
- done0(null, {drop: true});
307
-
308
- setTimeout (() => {
309
- pll1.stop();
310
- pll2.stop();
311
-
312
- async.series ([
313
- cb => q1.totalSize(cb),
314
- cb => q2.totalSize(cb),
315
- cb => q3.totalSize(cb)
316
- ], (err, res) => {
317
- if (err) return done (err);
318
- res.should.eql ([0,0,0]);
319
- setTimeout (done, 250);
320
- });
321
- }, 500);
322
- });
323
-
324
- q1.push ({a:5, b:'see it run...'}, {}, () => {});
325
- });
326
-
327
- it ('3-elem pipeline flows begin to end, sink at the end using err.drop == true', done => {
328
- var q_opts = {};
329
- var q1 = factory.queue ('test_1_pl_1', q_opts);
330
- var q2 = factory.queue ('test_1_pl_2', q_opts);
331
- var q3 = factory.queue ('test_1_pl_3', q_opts);
332
-
333
- // tie them up, q1 -> q2 -> q3
334
- var pll1 = new PDL (q1, q2);
335
- var pll2 = new PDL (q2, q3);
336
-
337
- pll1.start ((elem, done0) => {
338
- elem.should.match ({
339
- payload: { a: 5, b: 'see it run...' },
340
- tries: 0,
341
- _q: 'test_1_pl_1'
342
- });
343
-
344
- done0();
345
- });
346
-
347
- pll2.start ((elem, done0) => {
348
- elem.should.match ({
349
- payload: { a: 5, b: 'see it run...' },
350
- tries: 0,
351
- _q: 'test_1_pl_2'
352
- });
353
-
354
- done0({drop: true});
355
-
356
- setTimeout (() => {
357
- pll1.stop();
358
- pll2.stop();
359
-
360
- async.series ([
361
- cb => q1.totalSize(cb),
362
- cb => q2.totalSize(cb),
363
- cb => q3.totalSize(cb)
364
- ], (err, res) => {
365
- if (err) return done (err);
366
- res.should.eql ([0,0,0]);
367
- setTimeout (done, 250);
368
- });
369
- }, 500);
370
- });
371
-
372
- q1.push ({a:5, b:'see it run...'}, {}, () => {});
373
- });
374
-
375
- });
376
- });
@@ -1,175 +0,0 @@
1
-
2
- var async = require ('async');
3
- var should = require ('should');
4
-
5
- var LocalSignal = require ('../signal/local');
6
- var MemStats = require ('../stats/mem');
7
-
8
- var PDL = require ('../Pipeline/DirectLink');
9
- var PS = require ('../Pipeline/Sink');
10
-
11
- const MongoClient = require ('mongodb').MongoClient;
12
-
13
- var factory = null;
14
-
15
- [
16
- {label: 'Pipelined MongoDB', mq: require ('../backends/pl-mongo')}
17
- ].forEach (function (MQ_item) {
18
- describe ('Pipeline/Sink operations over ' + MQ_item.label, function () {
19
- var MQ = MQ_item.mq;
20
-
21
- before (done => {
22
- var opts = {
23
- url: 'mongodb://localhost/__test_pipeline_sink__',
24
- opts: { useUnifiedTopology: true },
25
- signaller: { provider: LocalSignal},
26
- stats: {provider: MemStats}
27
- };
28
-
29
- MQ (opts, (err, fct) => {
30
- if (err) return done (err);
31
- factory = fct;
32
- done();
33
- });
34
- });
35
-
36
- after (done => async.series ([
37
- cb => setTimeout (cb, 1000),
38
- cb => factory.close (cb),
39
- cb => MongoClient.connect ('mongodb://localhost/__test_pipeline_sink__', (err, cl) => {
40
- if (err) return done (err);
41
- cl.db().dropDatabase (() => cl.close (cb))
42
- })
43
- ], done));
44
-
45
-
46
- it ('3-elem pipeline flows begin to end, sink at the end', done => {
47
- var q_opts = {};
48
- var q1 = factory.queue ('test_1_pl_1', q_opts);
49
- var q2 = factory.queue ('test_1_pl_2', q_opts);
50
- var q3 = factory.queue ('test_1_pl_3', q_opts);
51
-
52
- // tie them up, q1 -> q2 -> q3 -> sink
53
- var pll1 = new PDL (q1, q2);
54
- var pll2 = new PDL (q2, q3);
55
- var snk1 = new PS (q3);
56
-
57
- pll1.start ((elem, done0) => {
58
- elem.should.match ({
59
- payload: { a: 5, b: 'see it run...' },
60
- tries: 0,
61
- _q: 'test_1_pl_1'
62
- });
63
-
64
- done0();
65
- });
66
-
67
- pll2.start ((elem, done0) => {
68
- elem.should.match ({
69
- payload: { a: 5, b: 'see it run...' },
70
- tries: 0,
71
- _q: 'test_1_pl_2'
72
- });
73
-
74
- done0();
75
- });
76
-
77
- snk1.start ((elem, done0) => {
78
- elem.should.match ({
79
- payload: { a: 5, b: 'see it run...' },
80
- tries: 0,
81
- _q: 'test_1_pl_3'
82
- });
83
-
84
- done0();
85
-
86
- setTimeout (() => {
87
- pll1.stop();
88
- pll2.stop();
89
- snk1.stop();
90
-
91
- async.series ([
92
- cb => q1.totalSize(cb),
93
- cb => q2.totalSize(cb),
94
- cb => q3.totalSize(cb)
95
- ], (err, res) => {
96
- if (err) return done (err);
97
- res.should.eql ([0,0,0]);
98
- done ();
99
- });
100
- }, 500);
101
- });
102
-
103
- q1.push ({a:5, b:'see it run...'}, {}, () => {});
104
- });
105
-
106
-
107
- it ('3-elem pipeline flows begin to end, sink at the end, with sink retries', done => {
108
- var q_opts = {};
109
- var q1 = factory.queue ('test_1_pl_1', q_opts);
110
- var q2 = factory.queue ('test_1_pl_2', q_opts);
111
- var q3 = factory.queue ('test_1_pl_3', q_opts);
112
-
113
- // tie them up, q1 -> q2 -> q3 -> sink
114
- var pll1 = new PDL (q1, q2);
115
- var pll2 = new PDL (q2, q3);
116
- var snk1 = new PS (q3);
117
-
118
- var try_count = 0;
119
-
120
- pll1.start ((elem, done0) => {
121
- elem.should.match ({
122
- payload: { a: 5, b: 'see it run...' },
123
- tries: 0,
124
- _q: 'test_1_pl_1'
125
- });
126
-
127
- done0();
128
- });
129
-
130
- pll2.start ((elem, done0) => {
131
- elem.should.match ({
132
- payload: { a: 5, b: 'see it run...' },
133
- tries: 0,
134
- _q: 'test_1_pl_2'
135
- });
136
-
137
- done0();
138
- });
139
-
140
- snk1.start ((elem, done0) => {
141
- if (try_count < 2) {
142
- try_count++;
143
- return done0 ({e: 'error, retry'});
144
- }
145
-
146
- elem.should.match ({
147
- payload: { a: 5, b: 'see it run...' },
148
- tries: 2,
149
- _q: 'test_1_pl_3'
150
- });
151
-
152
- done0();
153
-
154
- setTimeout (() => {
155
- pll1.stop();
156
- pll2.stop();
157
- snk1.stop();
158
-
159
- async.series ([
160
- cb => q1.totalSize(cb),
161
- cb => q2.totalSize(cb),
162
- cb => q3.totalSize(cb)
163
- ], (err, res) => {
164
- if (err) return done (err);
165
- res.should.eql ([0,0,0]);
166
- done ();
167
- });
168
- }, 500);
169
- });
170
-
171
- q1.push ({a:5, b:'see it run...'}, {}, () => {});
172
- });
173
-
174
- });
175
- });