@neurodevs/node-lsl 12.0.6 → 13.0.1

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 (122) hide show
  1. package/README.md +2 -5
  2. package/build/__tests__/AbstractPackageTest.d.ts +9 -3
  3. package/build/__tests__/AbstractPackageTest.js +37 -3
  4. package/build/__tests__/AbstractPackageTest.js.map +1 -1
  5. package/build/__tests__/impl/LiblslAdapter.test.d.ts +6 -0
  6. package/build/__tests__/impl/LiblslAdapter.test.js +133 -12
  7. package/build/__tests__/impl/LiblslAdapter.test.js.map +1 -1
  8. package/build/__tests__/impl/LslEventMarkerOutlet.test.js +5 -5
  9. package/build/__tests__/impl/LslEventMarkerOutlet.test.js.map +1 -1
  10. package/build/__tests__/impl/LslStreamInfo.test.js +3 -3
  11. package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
  12. package/build/__tests__/impl/LslStreamInlet.test.d.ts +30 -2
  13. package/build/__tests__/impl/LslStreamInlet.test.js +181 -18
  14. package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
  15. package/build/__tests__/impl/LslStreamOutlet.test.d.ts +16 -7
  16. package/build/__tests__/impl/LslStreamOutlet.test.js +84 -23
  17. package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
  18. package/build/__tests__/impl/LslWebSocketBridge.test.d.ts +15 -0
  19. package/build/__tests__/impl/LslWebSocketBridge.test.js +112 -2
  20. package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
  21. package/build/assertions.d.ts +3 -3
  22. package/build/assertions.js +6 -6
  23. package/build/assertions.js.map +1 -1
  24. package/build/handleError.d.ts +8 -0
  25. package/build/handleError.js +25 -0
  26. package/build/handleError.js.map +1 -0
  27. package/build/impl/LiblslAdapter.d.ts +128 -13
  28. package/build/impl/LiblslAdapter.js +149 -71
  29. package/build/impl/LiblslAdapter.js.map +1 -1
  30. package/build/impl/LslEventMarkerOutlet.d.ts +4 -1
  31. package/build/impl/LslEventMarkerOutlet.js +3 -3
  32. package/build/impl/LslEventMarkerOutlet.js.map +1 -1
  33. package/build/impl/LslStreamInfo.d.ts +3 -3
  34. package/build/impl/LslStreamInfo.js +5 -5
  35. package/build/impl/LslStreamInfo.js.map +1 -1
  36. package/build/impl/LslStreamInlet.d.ts +52 -14
  37. package/build/impl/LslStreamInlet.js +157 -20
  38. package/build/impl/LslStreamInlet.js.map +1 -1
  39. package/build/impl/LslStreamOutlet.d.ts +13 -13
  40. package/build/impl/LslStreamOutlet.js +22 -21
  41. package/build/impl/LslStreamOutlet.js.map +1 -1
  42. package/build/impl/LslWebSocketBridge.d.ts +35 -3
  43. package/build/impl/LslWebSocketBridge.js +66 -3
  44. package/build/impl/LslWebSocketBridge.js.map +1 -1
  45. package/build/index.d.ts +4 -1
  46. package/build/index.js +5 -1
  47. package/build/index.js.map +1 -1
  48. package/build/scripts/runLslStreamOutlet.js +2 -3
  49. package/build/scripts/runLslStreamOutlet.js.map +1 -1
  50. package/build/scripts/runOutletToInlet.d.ts +1 -0
  51. package/build/scripts/runOutletToInlet.js +45 -0
  52. package/build/scripts/runOutletToInlet.js.map +1 -0
  53. package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.d.ts +1 -2
  54. package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js.map +1 -1
  55. package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.d.ts +2 -2
  56. package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js.map +1 -1
  57. package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.d.ts +1 -2
  58. package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js.map +1 -1
  59. package/build/testDoubles/Liblsl/FakeLiblsl.d.ts +15 -3
  60. package/build/testDoubles/Liblsl/FakeLiblsl.js +42 -0
  61. package/build/testDoubles/Liblsl/FakeLiblsl.js.map +1 -1
  62. package/build/testDoubles/StreamInfo/FakeStreamInfo.d.ts +1 -1
  63. package/build/testDoubles/StreamInfo/SpyStreamInfo.d.ts +1 -1
  64. package/build/testDoubles/StreamInlet/FakeStreamInlet.d.ts +12 -3
  65. package/build/testDoubles/StreamInlet/FakeStreamInlet.js +25 -5
  66. package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +1 -1
  67. package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +3 -3
  68. package/build/testDoubles/StreamInlet/SpyStreamInlet.js +2 -2
  69. package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +1 -1
  70. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.d.ts +4 -4
  71. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js +6 -6
  72. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +1 -1
  73. package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.d.ts +6 -0
  74. package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.js +15 -0
  75. package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.js.map +1 -1
  76. package/build/testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.d.ts +4 -0
  77. package/build/testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.js +7 -0
  78. package/build/testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.js.map +1 -0
  79. package/build/testDoubles/WebSockets/FakeWebSocket.d.ts +10 -0
  80. package/build/testDoubles/WebSockets/FakeWebSocket.js +14 -0
  81. package/build/testDoubles/WebSockets/FakeWebSocket.js.map +1 -0
  82. package/build/testDoubles/WebSockets/FakeWebSocketServer.d.ts +13 -0
  83. package/build/testDoubles/WebSockets/FakeWebSocketServer.js +22 -0
  84. package/build/testDoubles/WebSockets/FakeWebSocketServer.js.map +1 -0
  85. package/build/testDoubles/generateRandomOutletOptions.js +3 -3
  86. package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
  87. package/package.json +5 -3
  88. package/src/__tests__/AbstractPackageTest.ts +52 -4
  89. package/src/__tests__/impl/LiblslAdapter.test.ts +181 -16
  90. package/src/__tests__/impl/LslEventMarkerOutlet.test.ts +5 -5
  91. package/src/__tests__/impl/LslStreamInfo.test.ts +3 -3
  92. package/src/__tests__/impl/LslStreamInlet.test.ts +253 -20
  93. package/src/__tests__/impl/LslStreamOutlet.test.ts +111 -24
  94. package/src/__tests__/impl/LslWebSocketBridge.test.ts +163 -5
  95. package/src/assertions.ts +7 -7
  96. package/src/handleError.ts +24 -0
  97. package/src/impl/LiblslAdapter.ts +322 -97
  98. package/src/impl/LslEventMarkerOutlet.ts +8 -4
  99. package/src/impl/LslStreamInfo.ts +9 -9
  100. package/src/impl/LslStreamInlet.ts +233 -25
  101. package/src/impl/LslStreamOutlet.ts +43 -33
  102. package/src/impl/LslWebSocketBridge.ts +115 -5
  103. package/src/index.ts +8 -2
  104. package/src/scripts/runLslStreamOutlet.ts +2 -3
  105. package/src/scripts/runOutletToInlet.ts +53 -0
  106. package/src/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.ts +4 -2
  107. package/src/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.ts +5 -2
  108. package/src/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.ts +4 -2
  109. package/src/testDoubles/Liblsl/FakeLiblsl.ts +61 -1
  110. package/src/testDoubles/StreamInfo/FakeStreamInfo.ts +1 -1
  111. package/src/testDoubles/StreamInlet/FakeStreamInlet.ts +36 -5
  112. package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +7 -2
  113. package/src/testDoubles/StreamOutlet/FakeStreamOutlet.ts +7 -7
  114. package/src/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.ts +18 -0
  115. package/src/testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.ts +9 -0
  116. package/src/testDoubles/WebSockets/FakeWebSocket.ts +17 -0
  117. package/src/testDoubles/WebSockets/FakeWebSocketServer.ts +32 -0
  118. package/src/testDoubles/generateRandomOutletOptions.ts +3 -3
  119. package/build/types.d.ts +0 -95
  120. package/build/types.js +0 -2
  121. package/build/types.js.map +0 -1
  122. package/src/types.ts +0 -111
@@ -1 +1 @@
1
- {"version":3,"file":"FakeStreamOutlet.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamOutlet/FakeStreamOutlet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAS/C,MAAM,CAAC,OAAO,OAAO,gBAAgB;IAC1B,MAAM,CAAC,kBAAkB,GAG1B,EAAE,CAAA;IAED,MAAM,CAAC,iBAAiB,GAAgB,EAAE,CAAA;IAC1C,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAE5B,OAAO,CAAsB;IAEpC,YAAmB,IAAiB,EAAE,OAA6B;QAC/D,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QAC3D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,CAAC;IAEM,OAAO;QACV,gBAAgB,CAAC,iBAAiB,EAAE,CAAA;IACxC,CAAC;IAEM,UAAU,CAAC,MAAiB;QAC/B,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnD,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,CAAA;IAC7C,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,CAAA;IAC7C,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,CAAA;IACjD,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;IACnC,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI,SAAS,CAAA;IACnD,CAAC;IAED,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,OAAO,EAAE,UAAU,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IACzD,CAAC;IAED,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC;IAED,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAC1D,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,UAAU,EAAE,CAAA;IACrD,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,CAAA;IAC7C,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,gBAAgB,CAAC,kBAAkB,GAAG,EAAE,CAAA;QACxC,gBAAgB,CAAC,iBAAiB,GAAG,EAAE,CAAA;QACvC,gBAAgB,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAC1C,CAAC"}
1
+ {"version":3,"file":"FakeStreamOutlet.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamOutlet/FakeStreamOutlet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAS/C,MAAM,CAAC,OAAO,OAAO,gBAAgB;IAC1B,MAAM,CAAC,kBAAkB,GAG1B,EAAE,CAAA;IAED,MAAM,CAAC,iBAAiB,GAAgB,EAAE,CAAA;IAC1C,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAE5B,OAAO,CAAsB;IAEpC,YAAmB,IAAiB,EAAE,OAA6B;QAC/D,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QAC3D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,CAAC;IAEM,OAAO;QACV,gBAAgB,CAAC,iBAAiB,EAAE,CAAA;IACxC,CAAC;IAEM,UAAU,CAAC,MAAiB;QAC/B,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnD,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,CAAA;IAC7C,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,CAAA;IAC7C,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,CAAA;IACjD,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;IACnC,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI,SAAS,CAAA;IACnD,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAC3D,CAAC;IAED,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAC5D,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,UAAU,EAAE,CAAA;IACrD,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,CAAA;IAC9C,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,gBAAgB,CAAC,kBAAkB,GAAG,EAAE,CAAA;QACxC,gBAAgB,CAAC,iBAAiB,GAAG,EAAE,CAAA;QACvC,gBAAgB,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAC1C,CAAC"}
@@ -1,6 +1,12 @@
1
1
  import { StreamTransportBridge } from '../../impl/LslWebSocketBridge.js';
2
2
  export default class FakeStreamTransportBridge implements StreamTransportBridge {
3
3
  static numCallsToConstructor: number;
4
+ static numCallsToActivate: number;
5
+ static numCallsToDeactivate: number;
6
+ static numCallsToDestroy: number;
4
7
  constructor();
8
+ activate(): void;
9
+ deactivate(): void;
10
+ destroy(): void;
5
11
  static resetTestDouble(): void;
6
12
  }
@@ -1,10 +1,25 @@
1
1
  export default class FakeStreamTransportBridge {
2
2
  static numCallsToConstructor = 0;
3
+ static numCallsToActivate = 0;
4
+ static numCallsToDeactivate = 0;
5
+ static numCallsToDestroy = 0;
3
6
  constructor() {
4
7
  FakeStreamTransportBridge.numCallsToConstructor++;
5
8
  }
9
+ activate() {
10
+ FakeStreamTransportBridge.numCallsToActivate++;
11
+ }
12
+ deactivate() {
13
+ FakeStreamTransportBridge.numCallsToDeactivate++;
14
+ }
15
+ destroy() {
16
+ FakeStreamTransportBridge.numCallsToDestroy++;
17
+ }
6
18
  static resetTestDouble() {
7
19
  FakeStreamTransportBridge.numCallsToConstructor = 0;
20
+ FakeStreamTransportBridge.numCallsToActivate = 0;
21
+ FakeStreamTransportBridge.numCallsToDeactivate = 0;
22
+ FakeStreamTransportBridge.numCallsToDestroy = 0;
8
23
  }
9
24
  }
10
25
  //# sourceMappingURL=FakeStreamTransportBridge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FakeStreamTransportBridge.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,yBAAyB;IAGnC,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAA;IAEvC;QACI,yBAAyB,CAAC,qBAAqB,EAAE,CAAA;IACrD,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,yBAAyB,CAAC,qBAAqB,GAAG,CAAC,CAAA;IACvD,CAAC"}
1
+ {"version":3,"file":"FakeStreamTransportBridge.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,yBAAyB;IAGnC,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAA;IAChC,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAA;IAC7B,MAAM,CAAC,oBAAoB,GAAG,CAAC,CAAA;IAC/B,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAEnC;QACI,yBAAyB,CAAC,qBAAqB,EAAE,CAAA;IACrD,CAAC;IAEM,QAAQ;QACX,yBAAyB,CAAC,kBAAkB,EAAE,CAAA;IAClD,CAAC;IAEM,UAAU;QACb,yBAAyB,CAAC,oBAAoB,EAAE,CAAA;IACpD,CAAC;IAEM,OAAO;QACV,yBAAyB,CAAC,iBAAiB,EAAE,CAAA;IACjD,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,yBAAyB,CAAC,qBAAqB,GAAG,CAAC,CAAA;QACnD,yBAAyB,CAAC,kBAAkB,GAAG,CAAC,CAAA;QAChD,yBAAyB,CAAC,oBAAoB,GAAG,CAAC,CAAA;QAClD,yBAAyB,CAAC,iBAAiB,GAAG,CAAC,CAAA;IACnD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import LslWebSocketBridge, { StreamTransportBridgeConstructorOptions } from '../../impl/LslWebSocketBridge.js';
2
+ export default class SpyLslWebSocketBridge extends LslWebSocketBridge {
3
+ constructor(options: StreamTransportBridgeConstructorOptions);
4
+ }
@@ -0,0 +1,7 @@
1
+ import LslWebSocketBridge from '../../impl/LslWebSocketBridge.js';
2
+ export default class SpyLslWebSocketBridge extends LslWebSocketBridge {
3
+ constructor(options) {
4
+ super(options);
5
+ }
6
+ }
7
+ //# sourceMappingURL=SpyLslWebSocketBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpyLslWebSocketBridge.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.ts"],"names":[],"mappings":"AAAA,OAAO,kBAEN,MAAM,kCAAkC,CAAA;AAEzC,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,kBAAkB;IACjE,YAAmB,OAAgD;QAC/D,KAAK,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;CACJ"}
@@ -0,0 +1,10 @@
1
+ export default class FakeWebSocket {
2
+ static callsToSend: {
3
+ id: string;
4
+ data: unknown;
5
+ }[];
6
+ readyState: number;
7
+ id: string;
8
+ send(data: unknown): void;
9
+ static resetTestDouble(): void;
10
+ }
@@ -0,0 +1,14 @@
1
+ import generateId from '@neurodevs/generate-id';
2
+ import WebSocket from 'ws';
3
+ export default class FakeWebSocket {
4
+ static callsToSend = [];
5
+ readyState = WebSocket.OPEN;
6
+ id = generateId();
7
+ send(data) {
8
+ FakeWebSocket.callsToSend.push({ id: this.id, data });
9
+ }
10
+ static resetTestDouble() {
11
+ FakeWebSocket.callsToSend = [];
12
+ }
13
+ }
14
+ //# sourceMappingURL=FakeWebSocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FakeWebSocket.js","sourceRoot":"","sources":["../../../src/testDoubles/WebSockets/FakeWebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAC/C,OAAO,SAAS,MAAM,IAAI,CAAA;AAE1B,MAAM,CAAC,OAAO,OAAO,aAAa;IACvB,MAAM,CAAC,WAAW,GAAoC,EAAE,CAAA;IAExD,UAAU,GAAW,SAAS,CAAC,IAAI,CAAA;IACnC,EAAE,GAAG,UAAU,EAAE,CAAA;IAEjB,IAAI,CAAC,IAAa;QACrB,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IACzD,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,aAAa,CAAC,WAAW,GAAG,EAAE,CAAA;IAClC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import FakeWebSocket from './FakeWebSocket.js';
2
+ export default class FakeWebSocketServer {
3
+ static callsToConstructor: FakeWSSConstructorOptions[];
4
+ static numCallsToClose: number;
5
+ static clients: Set<FakeWebSocket>;
6
+ clients: Set<FakeWebSocket>;
7
+ constructor(options: FakeWSSConstructorOptions);
8
+ close(): void;
9
+ static resetTestDouble(): void;
10
+ }
11
+ export interface FakeWSSConstructorOptions {
12
+ port: number;
13
+ }
@@ -0,0 +1,22 @@
1
+ import FakeWebSocket from './FakeWebSocket.js';
2
+ export default class FakeWebSocketServer {
3
+ static callsToConstructor = [];
4
+ static numCallsToClose = 0;
5
+ static clients = new Set([
6
+ new FakeWebSocket(),
7
+ new FakeWebSocket(),
8
+ ]);
9
+ clients = FakeWebSocketServer.clients;
10
+ constructor(options) {
11
+ FakeWebSocketServer.callsToConstructor.push(options);
12
+ }
13
+ close() {
14
+ FakeWebSocketServer.numCallsToClose += 1;
15
+ }
16
+ static resetTestDouble() {
17
+ FakeWebSocketServer.callsToConstructor = [];
18
+ FakeWebSocketServer.numCallsToClose = 0;
19
+ FakeWebSocket.resetTestDouble();
20
+ }
21
+ }
22
+ //# sourceMappingURL=FakeWebSocketServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FakeWebSocketServer.js","sourceRoot":"","sources":["../../../src/testDoubles/WebSockets/FakeWebSocketServer.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAE9C,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAC7B,MAAM,CAAC,kBAAkB,GAAgC,EAAE,CAAA;IAC3D,MAAM,CAAC,eAAe,GAAG,CAAC,CAAA;IAE1B,MAAM,CAAC,OAAO,GAAG,IAAI,GAAG,CAAgB;QAC3C,IAAI,aAAa,EAAE;QACnB,IAAI,aAAa,EAAE;KACtB,CAAC,CAAA;IAEK,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAA;IAE5C,YAAmB,OAAkC;QACjD,mBAAmB,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxD,CAAC;IAEM,KAAK;QACR,mBAAmB,CAAC,eAAe,IAAI,CAAC,CAAA;IAC5C,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,mBAAmB,CAAC,kBAAkB,GAAG,EAAE,CAAA;QAC3C,mBAAmB,CAAC,eAAe,GAAG,CAAC,CAAA;QAEvC,aAAa,CAAC,eAAe,EAAE,CAAA;IACnC,CAAC"}
@@ -7,13 +7,13 @@ export default function generateRandomOutletOptions() {
7
7
  name: generateId(),
8
8
  type: generateId(),
9
9
  channelNames: new Array(randomInt(1, 10)).fill(generateId()),
10
- sampleRate: Math.random() * 10,
10
+ sampleRateHz: Math.random() * 10,
11
11
  channelFormat: TEST_SUPPORTED_CHANNEL_FORMATS[randomChannelIdx],
12
12
  sourceId: generateId(),
13
13
  manufacturer: generateId(),
14
- unit: generateId(),
14
+ units: generateId(),
15
15
  chunkSize: randomInt(0, 10),
16
- maxBuffered: randomInt(0, 10),
16
+ maxBufferedMs: randomInt(0, 10),
17
17
  };
18
18
  }
19
19
  //# sourceMappingURL=generateRandomOutletOptions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateRandomOutletOptions.js","sourceRoot":"","sources":["../../src/testDoubles/generateRandomOutletOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAG/C,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,CAAC,OAAO,UAAU,2BAA2B;IAC/C,MAAM,gBAAgB,GAAG,SAAS,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAA;IAEzE,OAAO;QACH,IAAI,EAAE,UAAU,EAAE;QAClB,IAAI,EAAE,UAAU,EAAE;QAClB,YAAY,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5D,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QAC9B,aAAa,EAAE,8BAA8B,CAAC,gBAAgB,CAAC;QAC/D,QAAQ,EAAE,UAAU,EAAE;QACtB,YAAY,EAAE,UAAU,EAAE;QAC1B,IAAI,EAAE,UAAU,EAAE;QAClB,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3B,WAAW,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;KACT,CAAA;AAC5B,CAAC"}
1
+ {"version":3,"file":"generateRandomOutletOptions.js","sourceRoot":"","sources":["../../src/testDoubles/generateRandomOutletOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAG/C,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,CAAC,OAAO,UAAU,2BAA2B;IAC/C,MAAM,gBAAgB,GAAG,SAAS,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAA;IAEzE,OAAO;QACH,IAAI,EAAE,UAAU,EAAE;QAClB,IAAI,EAAE,UAAU,EAAE;QAClB,YAAY,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5D,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QAChC,aAAa,EAAE,8BAA8B,CAAC,gBAAgB,CAAC;QAC/D,QAAQ,EAAE,UAAU,EAAE;QACtB,YAAY,EAAE,UAAU,EAAE;QAC1B,KAAK,EAAE,UAAU,EAAE;QACnB,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3B,aAAa,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;KACX,CAAA;AAC5B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neurodevs/node-lsl",
3
- "version": "12.0.6",
3
+ "version": "13.0.1",
4
4
  "description": "Lab Streaming Layer (LSL) bindings for Node",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -45,15 +45,17 @@
45
45
  },
46
46
  "dependencies": {
47
47
  "@neurodevs/generate-id": "^1.0.9",
48
- "ffi-rs": "^1.0.98",
48
+ "ffi-rs": "^1.3.0",
49
49
  "node-gyp": "^10.2.0",
50
50
  "ref-array-napi": "^1.2.2",
51
- "ref-napi": "^3.0.3"
51
+ "ref-napi": "^3.0.3",
52
+ "ws": "^8.18.3"
52
53
  },
53
54
  "devDependencies": {
54
55
  "@neurodevs/node-tdd": "^0.2.2",
55
56
  "@types/ffi-napi": "^4.0.10",
56
57
  "@types/node": "^22.9.0",
58
+ "@types/ws": "^8.18.1",
57
59
  "chokidar-cli": "^3.0.0",
58
60
  "concurrently": "^9.1.0",
59
61
  "eslint": "^9.15.0",
@@ -1,16 +1,24 @@
1
1
  import AbstractModuleTest from '@neurodevs/node-tdd'
2
2
 
3
+ import { Server } from 'ws'
3
4
  import LiblslAdapter from '../impl/LiblslAdapter.js'
4
5
  import LslEventMarkerOutlet from '../impl/LslEventMarkerOutlet.js'
5
6
  import LslStreamInfo from '../impl/LslStreamInfo.js'
6
- import LslStreamInlet from '../impl/LslStreamInlet.js'
7
+ import LslStreamInlet, {
8
+ OnDataCallback,
9
+ StreamInletOptions,
10
+ } from '../impl/LslStreamInlet.js'
7
11
  import LslStreamOutlet from '../impl/LslStreamOutlet.js'
12
+ import LslWebSocketBridge from '../impl/LslWebSocketBridge.js'
8
13
  import SpyEventMarkerOutlet from '../testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js'
9
14
  import FakeLiblsl from '../testDoubles/Liblsl/FakeLiblsl.js'
10
15
  import FakeStreamInfo from '../testDoubles/StreamInfo/FakeStreamInfo.js'
11
16
  import SpyStreamInfo from '../testDoubles/StreamInfo/SpyStreamInfo.js'
17
+ import FakeStreamInlet from '../testDoubles/StreamInlet/FakeStreamInlet.js'
12
18
  import { SpyStreamInlet } from '../testDoubles/StreamInlet/SpyStreamInlet.js'
13
19
  import FakeStreamOutlet from '../testDoubles/StreamOutlet/FakeStreamOutlet.js'
20
+ import SpyLslWebSocketBridge from '../testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.js'
21
+ import FakeWebSocketServer from '../testDoubles/WebSockets/FakeWebSocketServer.js'
14
22
 
15
23
  export default class AbstractPackageTest extends AbstractModuleTest {
16
24
  protected static fakeLiblsl: FakeLiblsl
@@ -24,6 +32,8 @@ export default class AbstractPackageTest extends AbstractModuleTest {
24
32
  protected static setFakeLiblsl() {
25
33
  this.fakeLiblsl = new FakeLiblsl()
26
34
  LiblslAdapter.setInstance(this.fakeLiblsl)
35
+
36
+ FakeLiblsl.fakeErrorCode = 0
27
37
  }
28
38
 
29
39
  protected static setSpyStreamInfo() {
@@ -39,6 +49,11 @@ export default class AbstractPackageTest extends AbstractModuleTest {
39
49
  LslStreamInlet.Class = SpyStreamInlet
40
50
  }
41
51
 
52
+ protected static setFakeStreamInlet() {
53
+ LslStreamInlet.Class = FakeStreamInlet
54
+ FakeStreamInlet.resetTestDouble()
55
+ }
56
+
42
57
  protected static setFakeStreamOutlet() {
43
58
  LslStreamOutlet.Class = FakeStreamOutlet
44
59
  FakeStreamOutlet.resetTestDouble()
@@ -48,6 +63,15 @@ export default class AbstractPackageTest extends AbstractModuleTest {
48
63
  LslEventMarkerOutlet.Class = SpyEventMarkerOutlet
49
64
  }
50
65
 
66
+ protected static setSpyLslWebSocketBridge() {
67
+ LslWebSocketBridge.Class = SpyLslWebSocketBridge
68
+ }
69
+
70
+ protected static setFakeWebSocketServer() {
71
+ LslWebSocketBridge.WSS = FakeWebSocketServer as unknown as typeof Server
72
+ FakeWebSocketServer.resetTestDouble()
73
+ }
74
+
51
75
  protected static readonly name_ = this.generateId()
52
76
  protected static readonly type = this.generateId()
53
77
  protected static readonly sourceId = this.generateId()
@@ -56,9 +80,33 @@ export default class AbstractPackageTest extends AbstractModuleTest {
56
80
  protected static readonly channelNames = [
57
81
  this.generateId(),
58
82
  this.generateId(),
83
+ this.generateId(),
59
84
  ]
60
85
 
61
- protected static readonly chunkSize = Math.floor(Math.random() * 100)
62
- protected static readonly maxBuffered = Math.floor(Math.random() * 100)
63
- protected static readonly sampleRate = Math.floor(Math.random() * 100)
86
+ protected static get channelCount() {
87
+ return this.channelNames.length
88
+ }
89
+
90
+ protected static readonly chunkSize = 2
91
+ protected static readonly sampleRateHz = Math.floor(Math.random() * 100)
92
+ protected static readonly maxBufferedMs = Math.floor(Math.random() * 1000)
93
+
94
+ protected static LslStreamInlet(
95
+ options: Partial<StreamInletOptions>,
96
+ onData: OnDataCallback
97
+ ) {
98
+ const defaultOptions = {
99
+ sampleRateHz: 0,
100
+ channelNames: this.channelNames,
101
+ channelFormat: 'float32',
102
+ chunkSize: this.chunkSize,
103
+ maxBufferedMs: this.maxBufferedMs,
104
+ name: this.name_,
105
+ type: this.type,
106
+ sourceId: this.sourceId,
107
+ ...options,
108
+ } as StreamInletOptions
109
+
110
+ return LslStreamInlet.Create(defaultOptions, onData)
111
+ }
64
112
  }
@@ -1,20 +1,26 @@
1
1
  import { randomInt } from 'crypto'
2
2
  import { test, assert } from '@neurodevs/node-tdd'
3
- import { DataType, OpenParams } from 'ffi-rs'
3
+ import {
4
+ createPointer,
5
+ DataType,
6
+ FieldType,
7
+ FuncObj,
8
+ OpenParams,
9
+ unwrapPointer,
10
+ } from 'ffi-rs'
4
11
 
5
- import LiblslAdapter from '../../impl/LiblslAdapter.js'
6
- import FakeLiblsl from '../../testDoubles/Liblsl/FakeLiblsl.js'
7
12
  import {
8
13
  BoundChild,
9
14
  BoundDescription,
10
15
  BoundInlet,
11
16
  BoundOutlet,
12
17
  BoundStreamInfo,
13
- FfiRsDefineOptions,
14
18
  Liblsl,
15
19
  LiblslBindings,
16
20
  LslChannel,
17
- } from '../../types.js'
21
+ } from 'impl/LiblslAdapter.js'
22
+ import LiblslAdapter from '../../impl/LiblslAdapter.js'
23
+ import FakeLiblsl from '../../testDoubles/Liblsl/FakeLiblsl.js'
18
24
  import AbstractPackageTest from '../AbstractPackageTest.js'
19
25
 
20
26
  export default class LiblslAdapterTest extends AbstractPackageTest {
@@ -44,6 +50,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
44
50
  private static appendChildHitCount: number
45
51
  private static ffiRsOpenOptions?: OpenParams
46
52
  private static ffiRsDefineOptions: FfiRsDefineOptions
53
+ private static ffiRsLoadOptions?: Record<string, any>
47
54
 
48
55
  protected static async beforeEach() {
49
56
  await super.beforeEach()
@@ -74,11 +81,11 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
74
81
  this.appendChildHitCount = 0
75
82
 
76
83
  delete this.ffiRsOpenOptions
77
- LiblslAdapter.ffiRsOpen = (options) => {
84
+ LiblslAdapter.open = (options) => {
78
85
  this.ffiRsOpenOptions = options
79
86
  }
80
87
 
81
- LiblslAdapter.ffiRsDefine = (options) => {
88
+ LiblslAdapter.define = (options) => {
82
89
  this.ffiRsDefineOptions = options as FfiRsDefineOptions
83
90
  if (this.shouldThrowWhenCreatingBindings) {
84
91
  throw new Error('Failed to create bindings!')
@@ -86,6 +93,11 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
86
93
  return this.fakeBindings as any
87
94
  }
88
95
 
96
+ LiblslAdapter.load = (options) => {
97
+ this.ffiRsLoadOptions = options
98
+ return {} as any
99
+ }
100
+
89
101
  LiblslAdapter.resetInstance()
90
102
  this.instance = LiblslAdapter.getInstance()
91
103
  }
@@ -157,7 +169,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
157
169
  },
158
170
  lsl_push_sample_ft: {
159
171
  library: 'lsl',
160
- retType: DataType.Void,
172
+ retType: DataType.I32,
161
173
  paramsType: [
162
174
  DataType.External,
163
175
  DataType.FloatArray,
@@ -166,7 +178,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
166
178
  },
167
179
  lsl_push_sample_strt: {
168
180
  library: 'lsl',
169
- retType: DataType.Void,
181
+ retType: DataType.I32,
170
182
  paramsType: [
171
183
  DataType.External,
172
184
  DataType.StringArray,
@@ -232,7 +244,13 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
232
244
  @test()
233
245
  protected static async canCreateOutletWithRequiredParams() {
234
246
  const { options, outlet } = this.createRandomOutlet()
235
- assert.isEqualDeep(this.createOutletParams, Object.values(options))
247
+
248
+ const expected = {
249
+ ...options,
250
+ maxBufferedMs: options.maxBufferedMs / 1000,
251
+ }
252
+
253
+ assert.isEqualDeep(this.createOutletParams, Object.values(expected))
236
254
  assert.isEqual(outlet, this.fakeOutlet)
237
255
  }
238
256
 
@@ -304,7 +322,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
304
322
  assert.isEqual(this.appendChildValueParams[2][1], 'type')
305
323
 
306
324
  assert.isEqual(this.appendChildValueParams[0][2], channel.label)
307
- assert.isEqual(this.appendChildValueParams[1][2], channel.unit)
325
+ assert.isEqual(this.appendChildValueParams[1][2], channel.units)
308
326
  assert.isEqual(this.appendChildValueParams[2][2], channel.type)
309
327
  }
310
328
 
@@ -326,7 +344,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
326
344
  assert.isEqual(this.appendChildParams?.[2][1], 'channel')
327
345
 
328
346
  assert.isEqual(this.appendChildValueParams[3][2], channel2.label)
329
- assert.isEqual(this.appendChildValueParams[4][2], channel2.unit)
347
+ assert.isEqual(this.appendChildValueParams[4][2], channel2.units)
330
348
  assert.isEqual(this.appendChildValueParams[5][2], channel2.type)
331
349
  }
332
350
 
@@ -370,10 +388,141 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
370
388
  @test()
371
389
  protected static async canCreateInletWithRequiredParams() {
372
390
  const { options, inlet } = this.createRandomInlet()
373
- assert.isEqualDeep(this.createInletParams, Object.values(options))
391
+
392
+ const expected = {
393
+ ...options,
394
+ maxBufferedMs: options.maxBufferedMs / 1000,
395
+ }
396
+
397
+ assert.isEqualDeep(this.createInletParams, Object.values(expected))
374
398
  assert.isEqual(inlet, this.fakeInlet)
375
399
  }
376
400
 
401
+ @test()
402
+ protected static async pullSampleCallsBinding() {
403
+ const { inlet } = this.createRandomInlet()
404
+
405
+ const dataBuffer = Buffer.alloc(4 * this.channelCount)
406
+ const dataBufferElements = this.channelCount
407
+ const timeout = 0.0
408
+
409
+ const dataBufferPtr = unwrapPointer(
410
+ createPointer({
411
+ paramsType: [DataType.U8Array],
412
+ paramsValue: [dataBuffer],
413
+ })
414
+ )[0]
415
+
416
+ const errcodePtr = unwrapPointer(
417
+ createPointer({
418
+ paramsType: [DataType.U8Array],
419
+ paramsValue: [new Int32Array(1)],
420
+ })
421
+ )[0]
422
+
423
+ this.instance.pullSample({
424
+ inlet,
425
+ dataBufferPtr,
426
+ dataBufferElements,
427
+ timeout,
428
+ errcodePtr,
429
+ })
430
+
431
+ assert.isEqualDeep(
432
+ this.ffiRsLoadOptions,
433
+ {
434
+ library: 'lsl',
435
+ funcName: 'lsl_pull_sample_f',
436
+ retType: DataType.Double,
437
+ paramsType: [
438
+ DataType.External,
439
+ DataType.External,
440
+ DataType.I32,
441
+ DataType.Double,
442
+ DataType.External,
443
+ ],
444
+ paramsValue: [
445
+ inlet,
446
+ dataBufferPtr,
447
+ dataBufferElements,
448
+ timeout,
449
+ errcodePtr,
450
+ ],
451
+ },
452
+ 'Did not call pullSample with expected options!'
453
+ )
454
+ }
455
+
456
+ @test()
457
+ protected static async pullChunkCallsBinding() {
458
+ const { inlet } = this.createRandomInlet()
459
+
460
+ const dataBuffer = Buffer.alloc(4 * this.chunkSize * this.channelCount)
461
+ const timestampBuffer = Buffer.alloc(8 * this.chunkSize)
462
+ const dataBufferElements = this.chunkSize * this.channelCount
463
+ const timestampBufferElements = this.chunkSize
464
+ const timeout = 0.0
465
+
466
+ const dataBufferPtr = unwrapPointer(
467
+ createPointer({
468
+ paramsType: [DataType.U8Array],
469
+ paramsValue: [dataBuffer],
470
+ })
471
+ )[0]
472
+
473
+ const timestampBufferPtr = unwrapPointer(
474
+ createPointer({
475
+ paramsType: [DataType.U8Array],
476
+ paramsValue: [timestampBuffer],
477
+ })
478
+ )[0]
479
+
480
+ const errcodePtr = unwrapPointer(
481
+ createPointer({
482
+ paramsType: [DataType.U8Array],
483
+ paramsValue: [new Int32Array(1)],
484
+ })
485
+ )[0]
486
+
487
+ this.instance.pullChunk({
488
+ inlet,
489
+ dataBufferPtr,
490
+ timestampBufferPtr,
491
+ dataBufferElements,
492
+ timestampBufferElements,
493
+ timeout,
494
+ errcodePtr,
495
+ })
496
+
497
+ assert.isEqualDeep(
498
+ this.ffiRsLoadOptions,
499
+ {
500
+ library: 'lsl',
501
+ funcName: 'lsl_pull_chunk_f',
502
+ retType: DataType.Double,
503
+ paramsType: [
504
+ DataType.External,
505
+ DataType.External,
506
+ DataType.External,
507
+ DataType.I32,
508
+ DataType.I32,
509
+ DataType.Double,
510
+ DataType.External,
511
+ ],
512
+ paramsValue: [
513
+ inlet,
514
+ dataBufferPtr,
515
+ timestampBufferPtr,
516
+ dataBufferElements,
517
+ timestampBufferElements,
518
+ timeout,
519
+ errcodePtr,
520
+ ],
521
+ },
522
+ 'Did not call pullChunk with expected options!'
523
+ )
524
+ }
525
+
377
526
  @test()
378
527
  protected static async flushInletCallsBinding() {
379
528
  const { inlet } = this.createRandomInlet()
@@ -386,6 +535,18 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
386
535
  )
387
536
  }
388
537
 
538
+ @test()
539
+ protected static async destroyInletCallsBinding() {
540
+ const { inlet } = this.createRandomInlet()
541
+ this.instance.destroyInlet({ inlet })
542
+
543
+ assert.isEqualDeep(
544
+ this.destroyInletParams,
545
+ [inlet],
546
+ 'Should have called destroyInlet with expected params!'
547
+ )
548
+ }
549
+
389
550
  private static createRandomStreamInfo() {
390
551
  return this.instance.createStreamInfo(
391
552
  this.generateRandomCreateStreamInfoOptions()
@@ -409,7 +570,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
409
570
  const options = {
410
571
  info,
411
572
  chunkSize: randomInt(10),
412
- maxBuffered: randomInt(10),
573
+ maxBufferedMs: randomInt(10),
413
574
  }
414
575
  return options
415
576
  }
@@ -418,7 +579,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
418
579
  return {
419
580
  label: this.generateId(),
420
581
  type: this.generateId(),
421
- unit: this.generateId(),
582
+ units: this.generateId(),
422
583
  }
423
584
  }
424
585
 
@@ -427,7 +588,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
427
588
  name: this.generateId(),
428
589
  type: this.generateId(),
429
590
  channelCount: randomInt(1, 10),
430
- sampleRate: randomInt(100),
591
+ sampleRateHz: randomInt(100),
431
592
  channelFormat: randomInt(7),
432
593
  sourceId: this.generateId(),
433
594
  }
@@ -449,9 +610,11 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
449
610
  },
450
611
  lsl_push_sample_ft: (params: any[]) => {
451
612
  this.pushSampleFloatTimestampParams = params
613
+ return 0
452
614
  },
453
615
  lsl_push_sample_strt: (params: any[]) => {
454
616
  this.pushSampleStringTimestampParams = params
617
+ return 0
455
618
  },
456
619
  lsl_destroy_outlet: (params: any[]) => {
457
620
  this.destroyOutletParams = params
@@ -489,3 +652,5 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
489
652
  }
490
653
  }
491
654
  }
655
+
656
+ export type FfiRsDefineOptions = FuncObj<FieldType, boolean | undefined>
@@ -31,14 +31,14 @@ export default class EventMarkerOutletTest extends AbstractPackageTest {
31
31
  assert.isEqualDeep(FakeStreamOutlet.callsToConstructor[0].options, {
32
32
  name: 'Event markers',
33
33
  type: 'Markers',
34
+ sourceId: 'event-markers',
34
35
  channelNames: ['Markers'],
35
- sampleRate: 0,
36
36
  channelFormat: 'string',
37
- sourceId: 'event-markers',
38
- manufacturer: 'N/A',
39
- unit: 'N/A',
37
+ sampleRateHz: 0,
40
38
  chunkSize: 0,
41
- maxBuffered: 0,
39
+ maxBufferedMs: 0,
40
+ manufacturer: 'N/A',
41
+ units: 'N/A',
42
42
  })
43
43
  }
44
44
 
@@ -146,7 +146,7 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
146
146
  sourceId: this.generateId(),
147
147
  channelCount: this.channelNames.length,
148
148
  channelFormat: CHANNEL_FORMATS[randomChannelIdx],
149
- sampleRate: 100 * Math.random(),
149
+ sampleRateHz: 100 * Math.random(),
150
150
  }
151
151
 
152
152
  this.LslStreamInfo(options)
@@ -173,7 +173,7 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
173
173
  info: this.instance.getStreamInfo(),
174
174
  channels: this.channelNames.map((label: string) => ({
175
175
  label,
176
- unit: this.units,
176
+ units: this.units,
177
177
  type: this.type,
178
178
  })),
179
179
  },
@@ -187,7 +187,7 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
187
187
  sourceId: this.generateId(),
188
188
  channelNames: this.channelNames,
189
189
  channelFormat: 'float32',
190
- sampleRate: 100 * Math.random(),
190
+ sampleRateHz: 100 * Math.random(),
191
191
  } as StreamInfoOptions
192
192
 
193
193
  private static LslStreamInfo(options?: Partial<StreamInfoOptions>) {