noflo 1.4.2 → 1.5.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 (89) hide show
  1. package/.ecrc +3 -0
  2. package/.eslintignore +2 -0
  3. package/{CHANGES.md → CHANGELOG.md} +520 -523
  4. package/README.md +1 -1
  5. package/bin/noflo-cache-preheat +17 -15
  6. package/components/Graph.d.ts +50 -15
  7. package/components/Graph.js +94 -68
  8. package/examples/http/HelloController.js +9 -6
  9. package/examples/spreadsheet/parse.fbp +3 -3
  10. package/lib/AsCallback.d.ts +22 -9
  11. package/lib/AsCallback.js +69 -18
  12. package/lib/AsComponent.d.ts +1 -1
  13. package/lib/AsComponent.js +5 -3
  14. package/lib/BaseNetwork.d.ts +16 -6
  15. package/lib/BaseNetwork.js +65 -31
  16. package/lib/BasePort.d.ts +39 -12
  17. package/lib/BasePort.js +34 -6
  18. package/lib/Component.d.ts +8 -8
  19. package/lib/Component.js +23 -20
  20. package/lib/ComponentLoader.d.ts +3 -4
  21. package/lib/ComponentLoader.js +9 -10
  22. package/lib/IP.d.ts +12 -8
  23. package/lib/IP.js +6 -4
  24. package/lib/InPort.d.ts +81 -10
  25. package/lib/InPort.js +83 -19
  26. package/lib/InternalSocket.d.ts +53 -7
  27. package/lib/InternalSocket.js +51 -14
  28. package/lib/LegacyNetwork.d.ts +12 -2
  29. package/lib/LegacyNetwork.js +5 -5
  30. package/lib/Network.d.ts +13 -2
  31. package/lib/Network.js +10 -10
  32. package/lib/NoFlo.d.ts +13 -13
  33. package/lib/NoFlo.js +29 -27
  34. package/lib/OutPort.d.ts +74 -32
  35. package/lib/OutPort.js +79 -23
  36. package/lib/Platform.d.ts +1 -1
  37. package/lib/Platform.js +9 -4
  38. package/lib/Ports.d.ts +14 -21
  39. package/lib/Ports.js +11 -13
  40. package/lib/ProcessInput.d.ts +5 -9
  41. package/lib/ProcessInput.js +8 -9
  42. package/lib/ProcessOutput.d.ts +2 -2
  43. package/lib/ProcessOutput.js +5 -5
  44. package/lib/loader/NodeJs.d.ts +0 -1
  45. package/lib/loader/NodeJs.js +104 -105
  46. package/lib/loader/register.d.ts +1 -1
  47. package/lib/loader/register.js +8 -4
  48. package/package.json +16 -11
  49. package/spec/.eslintrc +5 -2
  50. package/spec/AsCallback.js +9 -13
  51. package/spec/AsComponent.js +10 -4
  52. package/spec/AsPromise.js +38 -0
  53. package/spec/CommonJS.cjs +10 -0
  54. package/spec/ComponentLoader.js +2 -38
  55. package/spec/ESModule.mjs +11 -0
  56. package/spec/Network.js +32 -11
  57. package/spec/NetworkSync.js +892 -0
  58. package/spec/Scoping.js +27 -42
  59. package/spec/Subgraph.js +6 -11
  60. package/spec/fixtures/componentloader/components/Output.js +1 -1
  61. package/spec/fixtures/componentloader/components/Repeat.ts +1 -1
  62. package/spec/fixtures/componentloader/components/RepeatAsync.coffee +1 -1
  63. package/spec/fixtures/componentloader/node_modules/example/components/Forward.js +1 -1
  64. package/spec/fixtures/componentloader/node_modules/example/package.json +1 -1
  65. package/spec/fixtures/componentloader/package.json +1 -1
  66. package/spec/fixtures/componentloader/spec/Repeat.yaml +1 -1
  67. package/src/.eslintrc +9 -2
  68. package/src/components/Graph.js +105 -71
  69. package/src/lib/AsCallback.js +71 -16
  70. package/src/lib/AsComponent.js +4 -3
  71. package/src/lib/BaseNetwork.js +48 -15
  72. package/src/lib/BasePort.js +43 -9
  73. package/src/lib/Component.js +8 -8
  74. package/src/lib/ComponentLoader.js +3 -4
  75. package/src/lib/IP.js +7 -4
  76. package/src/lib/InPort.js +86 -21
  77. package/src/lib/InternalSocket.js +49 -9
  78. package/src/lib/LegacyNetwork.js +2 -2
  79. package/src/lib/Network.js +2 -2
  80. package/src/lib/NoFlo.js +15 -13
  81. package/src/lib/OutPort.js +83 -22
  82. package/src/lib/Platform.js +9 -4
  83. package/src/lib/Ports.js +9 -11
  84. package/src/lib/ProcessInput.js +7 -9
  85. package/src/lib/ProcessOutput.js +1 -1
  86. package/src/lib/loader/NodeJs.js +122 -116
  87. package/src/lib/loader/register.js +2 -2
  88. /package/{karma.config.js → karma.config.cjs} +0 -0
  89. /package/{webpack.config.js → webpack.config.cjs} +0 -0
package/spec/AsPromise.js CHANGED
@@ -317,6 +317,44 @@ describe('asPromise interface', () => {
317
317
  INPORT=Async.IN:IN
318
318
  OUTPORT=Stream.OUT:OUT
319
319
  Async(process/Async) OUT -> IN Stream(process/Streamify)\
320
+ `, (err, g) => {
321
+ if (err) {
322
+ done(err);
323
+ return;
324
+ }
325
+ graph = g;
326
+ wrapped = noflo.asPromise(graph, {
327
+ loader,
328
+ asyncDelivery: true,
329
+ });
330
+ done();
331
+ });
332
+ });
333
+ it('should execute network with input map and provide output map with streams as arrays', () => wrapped({
334
+ in: 'hello world',
335
+ })
336
+ .then((out) => {
337
+ chai.expect(out.out).to.eql([
338
+ ['h', 'e', 'l', 'l', 'o'],
339
+ ['w', 'o', 'r', 'l', 'd'],
340
+ ]);
341
+ }));
342
+ it('should execute network with simple input and and provide simple output with streams as arrays', () => wrapped('hello there')
343
+ .then((out) => {
344
+ chai.expect(out).to.eql([
345
+ ['h', 'e', 'l', 'l', 'o'],
346
+ ['t', 'h', 'e', 'r', 'e'],
347
+ ]);
348
+ }));
349
+ });
350
+ describe('with a graph instead of component name (synchronous)', () => {
351
+ let graph = null;
352
+ let wrapped = null;
353
+ before((done) => {
354
+ noflo.graph.loadFBP(`\
355
+ INPORT=Async.IN:IN
356
+ OUTPORT=Stream.OUT:OUT
357
+ Async(process/Async) OUT -> IN Stream(process/Streamify)\
320
358
  `, (err, g) => {
321
359
  if (err) {
322
360
  done(err);
@@ -0,0 +1,10 @@
1
+ const { describe, it } = require('node:test');
2
+ const assert = require('node:assert/strict');
3
+ const noflo = require('../lib/NoFlo.js');
4
+
5
+ describe('NoFlo loaded as CommonJS module', () => {
6
+ it('should be runnable', () => {
7
+ assert.equal(typeof noflo, 'object');
8
+ assert.equal(typeof noflo.Component, 'function');
9
+ });
10
+ });
@@ -378,7 +378,7 @@ describe('ComponentLoader with no external packages installed', () => {
378
378
  }
379
379
  chai.expect(component).to.be.an('object');
380
380
  chai.expect(component.code).to.be.a('string');
381
- chai.expect(component.code.indexOf('noflo.Component')).to.not.equal(-1);
381
+ chai.expect(component.code.indexOf('Component')).to.not.equal(-1);
382
382
  chai.expect(component.code.indexOf('exports.getComponent')).to.not.equal(-1);
383
383
  chai.expect(component.name).to.equal('Graph');
384
384
  chai.expect(component.library).to.equal('');
@@ -444,7 +444,7 @@ describe('ComponentLoader with no external packages installed', () => {
444
444
  }
445
445
  chai.expect(component).to.be.an('object');
446
446
  chai.expect(component.code).to.be.a('string');
447
- chai.expect(component.code.indexOf('noflo.Component')).to.not.equal(-1);
447
+ chai.expect(component.code.indexOf('Component')).to.not.equal(-1);
448
448
  chai.expect(component.code.indexOf('exports.getComponent')).to.not.equal(-1);
449
449
  chai.expect(component.name).to.equal('Graph');
450
450
  chai.expect(component.library).to.equal('');
@@ -806,42 +806,6 @@ exports.getComponent = function() {
806
806
  });
807
807
  });
808
808
  });
809
- describe('with deprecated process callback', () => {
810
- let nonWorkingSource = `\
811
- var noflo = require('noflo');
812
- exports.getComponent = function() {
813
- var c = new noflo.Component();
814
-
815
- c.inPorts.add('in', {
816
- process: function(packet, outPorts) {
817
- if (packet.event !== 'data') {
818
- return;
819
- }
820
- // Do something with the packet, then
821
- c.outPorts.out.send(packet.data);
822
- }
823
- });
824
-
825
- c.outPorts.add('out');
826
-
827
- return c;
828
- };`;
829
-
830
- it('should be able to set the source', (done) => {
831
- if (!noflo.isBrowser()) {
832
- nonWorkingSource = nonWorkingSource.replace("'noflo'", localNofloPath);
833
- }
834
- l.setSource('foo', 'NotWorkingProcess', nonWorkingSource, 'js', done);
835
- });
836
- it('should not be a loadable component', (done) => {
837
- l.load('foo/NotWorkingProcess', (err, inst) => {
838
- chai.expect(err).to.be.an('error');
839
- chai.expect(err.message).to.contain('process callback is deprecated');
840
- chai.expect(inst).to.be.an('undefined');
841
- done();
842
- });
843
- });
844
- });
845
809
  });
846
810
  });
847
811
  });
@@ -0,0 +1,11 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import * as noflo from '../src/lib/NoFlo.js';
4
+
5
+ describe('NoFlo loaded as ES module', () => {
6
+ it('should be runnable', () => {
7
+ assert.equal(typeof noflo, 'object');
8
+ assert.equal(typeof noflo.Component, 'function');
9
+ });
10
+ });
11
+
package/spec/Network.js CHANGED
@@ -41,17 +41,18 @@ describe('NoFlo Network', () => {
41
41
  describe('with an empty graph', () => {
42
42
  let g = null;
43
43
  let n = null;
44
- before((done) => {
44
+ before(() => {
45
45
  g = new noflo.Graph();
46
- noflo.createNetwork(g, {
46
+ return noflo.createNetwork(g, {
47
47
  subscribeGraph: false,
48
+ asyncDelivery: true,
48
49
  delay: true,
49
50
  baseDir,
50
51
  })
51
52
  .then((network) => {
52
53
  n = network;
53
- n.connect(done);
54
- }, done);
54
+ return n.connect();
55
+ });
55
56
  });
56
57
  it('should initially be marked as stopped', () => {
57
58
  chai.expect(n.isStarted()).to.equal(false);
@@ -91,16 +92,14 @@ describe('NoFlo Network', () => {
91
92
  chai.expect(n.uptime()).to.be.at.least(0);
92
93
  });
93
94
  describe('with new node', () => {
94
- it('should contain the node', (done) => {
95
- n.addNode({
95
+ it('should contain the node', () => n
96
+ .addNode({
96
97
  id: 'Graph',
97
98
  component: 'Graph',
98
99
  metadata: {
99
100
  foo: 'Bar',
100
101
  },
101
- },
102
- done);
103
- });
102
+ }));
104
103
  it('should have registered the node with the graph', () => {
105
104
  const node = g.getNode('Graph');
106
105
  chai.expect(node).to.be.an('object');
@@ -223,6 +222,7 @@ describe('NoFlo Network', () => {
223
222
  g.addInitial('Foo', 'Merge', 'in');
224
223
  return noflo.createNetwork(g, {
225
224
  subscribeGraph: false,
225
+ asyncDelivery: true,
226
226
  delay: true,
227
227
  baseDir,
228
228
  })
@@ -377,6 +377,7 @@ describe('NoFlo Network', () => {
377
377
  );
378
378
  return noflo.createNetwork(graph, {
379
379
  subscribeGraph: false,
380
+ asyncDelivery: true,
380
381
  delay: false,
381
382
  componentLoader: n.loader,
382
383
  });
@@ -428,6 +429,7 @@ describe('NoFlo Network', () => {
428
429
  };
429
430
  noflo.createNetwork(g, {
430
431
  subscribeGraph: false,
432
+ asyncDelivery: true,
431
433
  delay: true,
432
434
  baseDir,
433
435
  })
@@ -450,6 +452,7 @@ describe('NoFlo Network', () => {
450
452
  g.addInitial('from-edge', 'Merge', 'in');
451
453
  noflo.createNetwork(g, {
452
454
  subscribeGraph: false,
455
+ asyncDelivery: true,
453
456
  delay: true,
454
457
  baseDir,
455
458
  })
@@ -471,6 +474,7 @@ describe('NoFlo Network', () => {
471
474
  g.addInitial('from-IIP', 'Def', 'in');
472
475
  noflo.createNetwork(g, {
473
476
  subscribeGraph: false,
477
+ asyncDelivery: true,
474
478
  delay: true,
475
479
  baseDir,
476
480
  })
@@ -505,6 +509,7 @@ describe('NoFlo Network', () => {
505
509
  noflo.createNetwork(g, {
506
510
  delay: true,
507
511
  subscribeGraph: false,
512
+ asyncDelivery: true,
508
513
  baseDir,
509
514
  })
510
515
  .then((nw) => {
@@ -583,6 +588,11 @@ describe('NoFlo Network', () => {
583
588
  });
584
589
  describe('with a very large network', () => {
585
590
  it('should be able to connect without errors', function (done) {
591
+ if (noflo.isBrowser()) {
592
+ // Async mode is too much for Puppeteer here
593
+ this.skip();
594
+ return;
595
+ }
586
596
  let n;
587
597
  this.timeout(100000);
588
598
  const g = new noflo.Graph();
@@ -596,8 +606,7 @@ describe('NoFlo Network', () => {
596
606
  }
597
607
  g.addInitial(() => {
598
608
  called++;
599
- },
600
- 'Callback', 'callback');
609
+ }, 'Callback', 'callback');
601
610
  for (n = 0; n <= 10000; n++) {
602
611
  g.addInitial(n, `Repeat${n}`, 'in');
603
612
  }
@@ -605,6 +614,7 @@ describe('NoFlo Network', () => {
605
614
  noflo.createNetwork(g, {
606
615
  delay: true,
607
616
  subscribeGraph: false,
617
+ asyncDelivery: true,
608
618
  baseDir,
609
619
  })
610
620
  .then((nw) => {
@@ -637,6 +647,7 @@ describe('NoFlo Network', () => {
637
647
  return noflo.createNetwork(g, {
638
648
  delay: true,
639
649
  subscribeGraph: false,
650
+ asyncDelivery: true,
640
651
  componentLoader: loader,
641
652
  })
642
653
  .then((nw) => nw.connect()
@@ -656,6 +667,7 @@ describe('NoFlo Network', () => {
656
667
  return noflo.createNetwork(g, {
657
668
  delay: true,
658
669
  subscribeGraph: false,
670
+ asyncDelivery: true,
659
671
  componentLoader: loader,
660
672
  })
661
673
  .then((nw) => nw.connect()
@@ -675,6 +687,7 @@ describe('NoFlo Network', () => {
675
687
  return noflo.createNetwork(g, {
676
688
  delay: true,
677
689
  subscribeGraph: false,
690
+ asyncDelivery: true,
678
691
  componentLoader: loader,
679
692
  })
680
693
  .then((nw) => nw.connect()
@@ -695,6 +708,7 @@ describe('NoFlo Network', () => {
695
708
  return noflo.createNetwork(g, {
696
709
  delay: true,
697
710
  subscribeGraph: false,
711
+ asyncDelivery: true,
698
712
  componentLoader: loader,
699
713
  })
700
714
  .then((nw) => nw.connect()
@@ -715,6 +729,7 @@ describe('NoFlo Network', () => {
715
729
  return noflo.createNetwork(g, {
716
730
  delay: true,
717
731
  subscribeGraph: false,
732
+ asyncDelivery: true,
718
733
  componentLoader: loader,
719
734
  })
720
735
  .then((nw) => nw.connect()
@@ -732,6 +747,7 @@ describe('NoFlo Network', () => {
732
747
  return noflo.createNetwork(g, {
733
748
  delay: true,
734
749
  subscribeGraph: false,
750
+ asyncDelivery: true,
735
751
  componentLoader: loader,
736
752
  })
737
753
  .then((nw) => nw.connect())
@@ -759,6 +775,7 @@ describe('NoFlo Network', () => {
759
775
  return noflo.createNetwork(g, {
760
776
  delay: true,
761
777
  subscribeGraph: false,
778
+ asyncDelivery: true,
762
779
  componentLoader: loader,
763
780
  })
764
781
  .then((nw) => nw.connect())
@@ -788,6 +805,7 @@ describe('NoFlo Network', () => {
788
805
  return noflo.createNetwork(g, {
789
806
  delay: true,
790
807
  subscribeGraph: false,
808
+ asyncDelivery: true,
791
809
  })
792
810
  .then((nw) => {
793
811
  chai.expect(nw.baseDir).to.equal(baseDir);
@@ -802,6 +820,7 @@ describe('NoFlo Network', () => {
802
820
  return noflo.createNetwork(g, {
803
821
  delay: true,
804
822
  subscribeGraph: false,
823
+ asyncDelivery: true,
805
824
  })
806
825
  .then((nw) => {
807
826
  chai.expect(nw.baseDir).to.equal(process.cwd());
@@ -812,6 +831,7 @@ describe('NoFlo Network', () => {
812
831
  return noflo.createNetwork(g, {
813
832
  delay: true,
814
833
  subscribeGraph: false,
834
+ asyncDelivery: true,
815
835
  baseDir,
816
836
  })
817
837
  .then((nw) => {
@@ -827,6 +847,7 @@ describe('NoFlo Network', () => {
827
847
  g = new noflo.Graph();
828
848
  return noflo.createNetwork(g, {
829
849
  subscribeGraph: false,
850
+ asyncDelivery: true,
830
851
  delay: true,
831
852
  baseDir,
832
853
  })