@neurodevs/node-lsl 11.4.2 → 12.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 (167) hide show
  1. package/.vscode/tasks.json +19 -1
  2. package/README.md +8 -9
  3. package/build/__tests__/{AbstractLslTest.d.ts → AbstractPackageTest.d.ts} +7 -6
  4. package/build/__tests__/AbstractPackageTest.js +53 -0
  5. package/build/__tests__/AbstractPackageTest.js.map +1 -0
  6. package/build/__tests__/{modules → impl}/LiblslAdapter.test.d.ts +6 -3
  7. package/build/__tests__/{modules → impl}/LiblslAdapter.test.js +193 -151
  8. package/build/__tests__/impl/LiblslAdapter.test.js.map +1 -0
  9. package/build/__tests__/{modules/EventMarkerOutlet.test.d.ts → impl/LslEventMarkerOutlet.test.d.ts} +5 -4
  10. package/build/__tests__/{modules/EventMarkerOutlet.test.js → impl/LslEventMarkerOutlet.test.js} +54 -52
  11. package/build/__tests__/impl/LslEventMarkerOutlet.test.js.map +1 -0
  12. package/build/__tests__/{modules → impl}/LslStreamInfo.test.d.ts +3 -3
  13. package/build/__tests__/{modules → impl}/LslStreamInfo.test.js +53 -59
  14. package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -0
  15. package/build/__tests__/impl/LslStreamInlet.test.d.ts +11 -0
  16. package/build/__tests__/{modules → impl}/LslStreamInlet.test.js +28 -26
  17. package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -0
  18. package/build/__tests__/{modules → impl}/LslStreamOutlet.test.d.ts +3 -3
  19. package/build/__tests__/{modules → impl}/LslStreamOutlet.test.js +56 -60
  20. package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -0
  21. package/build/__tests__/impl/LslWebSocketBridge.test.d.ts +7 -0
  22. package/build/__tests__/impl/LslWebSocketBridge.test.js +26 -0
  23. package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -0
  24. package/build/assertions.d.ts +1 -1
  25. package/build/assertions.js +13 -20
  26. package/build/assertions.js.map +1 -1
  27. package/build/consts.js +2 -5
  28. package/build/consts.js.map +1 -1
  29. package/build/{modules → impl}/LiblslAdapter.d.ts +5 -4
  30. package/build/{modules → impl}/LiblslAdapter.js +60 -51
  31. package/build/impl/LiblslAdapter.js.map +1 -0
  32. package/build/impl/LslEventMarkerOutlet.d.ts +23 -0
  33. package/build/{modules/EventMarkerOutlet.js → impl/LslEventMarkerOutlet.js} +12 -14
  34. package/build/impl/LslEventMarkerOutlet.js.map +1 -0
  35. package/build/{modules → impl}/LslStreamInfo.d.ts +1 -1
  36. package/build/{modules → impl}/LslStreamInfo.js +19 -16
  37. package/build/impl/LslStreamInfo.js.map +1 -0
  38. package/build/impl/LslStreamInlet.d.ts +34 -0
  39. package/build/{modules → impl}/LslStreamInlet.js +19 -16
  40. package/build/impl/LslStreamInlet.js.map +1 -0
  41. package/build/{modules → impl}/LslStreamOutlet.d.ts +10 -10
  42. package/build/{modules → impl}/LslStreamOutlet.js +22 -23
  43. package/build/impl/LslStreamOutlet.js.map +1 -0
  44. package/build/impl/LslWebSocketBridge.d.ts +8 -0
  45. package/build/impl/LslWebSocketBridge.js +8 -0
  46. package/build/impl/LslWebSocketBridge.js.map +1 -0
  47. package/build/index.d.ts +34 -30
  48. package/build/index.js +39 -69
  49. package/build/index.js.map +1 -1
  50. package/build/scripts/{demoMarkerOutlet.js → runLslEventMarkerOutlet.js} +3 -8
  51. package/build/scripts/runLslEventMarkerOutlet.js.map +1 -0
  52. package/build/scripts/{demoStreamOutlet.js → runLslStreamOutlet.js} +3 -8
  53. package/build/scripts/runLslStreamOutlet.js.map +1 -0
  54. package/build/testDoubles/{MarkerOutlet/FakeMarkerOutlet.d.ts → EventMarkerOutlet/FakeEventMarkerOutlet.d.ts} +3 -3
  55. package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js +26 -0
  56. package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js.map +1 -0
  57. package/build/testDoubles/{MarkerOutlet/MockMarkerOutlet.d.ts → EventMarkerOutlet/MockEventMarkerOutlet.d.ts} +3 -3
  58. package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js +46 -0
  59. package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js.map +1 -0
  60. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.d.ts +9 -0
  61. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js +19 -0
  62. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js.map +1 -0
  63. package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.d.ts +10 -0
  64. package/build/testDoubles/{MarkerOutlet/ThrowingMarkerOutlet.js → EventMarkerOutlet/ThrowingEventMarkerOutlet.js} +3 -6
  65. package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js.map +1 -0
  66. package/build/testDoubles/Liblsl/FakeLiblsl.d.ts +4 -1
  67. package/build/testDoubles/Liblsl/FakeLiblsl.js +23 -15
  68. package/build/testDoubles/Liblsl/FakeLiblsl.js.map +1 -1
  69. package/build/testDoubles/StreamInfo/FakeStreamInfo.d.ts +2 -2
  70. package/build/testDoubles/StreamInfo/FakeStreamInfo.js +3 -6
  71. package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +1 -1
  72. package/build/testDoubles/StreamInfo/SpyStreamInfo.d.ts +2 -2
  73. package/build/testDoubles/StreamInfo/SpyStreamInfo.js +2 -8
  74. package/build/testDoubles/StreamInfo/SpyStreamInfo.js.map +1 -1
  75. package/build/testDoubles/StreamInlet/FakeStreamInlet.d.ts +12 -0
  76. package/build/testDoubles/StreamInlet/FakeStreamInlet.js +18 -0
  77. package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +1 -0
  78. package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +8 -0
  79. package/build/testDoubles/StreamInlet/SpyStreamInlet.js +16 -0
  80. package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +1 -0
  81. package/build/testDoubles/{LslOutlet/FakeLslOutlet.d.ts → StreamOutlet/FakeStreamOutlet.d.ts} +10 -11
  82. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js +57 -0
  83. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +1 -0
  84. package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.d.ts +6 -0
  85. package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.js +10 -0
  86. package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.js.map +1 -0
  87. package/build/testDoubles/consts.js +4 -7
  88. package/build/testDoubles/consts.js.map +1 -1
  89. package/build/testDoubles/generateRandomOutletOptions.d.ts +2 -2
  90. package/build/testDoubles/generateRandomOutletOptions.js +14 -17
  91. package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
  92. package/build/types.d.ts +9 -4
  93. package/build/types.js +1 -2
  94. package/build/validations.js +4 -10
  95. package/build/validations.js.map +1 -1
  96. package/package.json +22 -12
  97. package/src/__tests__/AbstractPackageTest.ts +65 -0
  98. package/src/__tests__/{modules → impl}/LiblslAdapter.test.ts +71 -44
  99. package/src/__tests__/{modules/EventMarkerOutlet.test.ts → impl/LslEventMarkerOutlet.test.ts} +40 -28
  100. package/src/__tests__/{modules → impl}/LslStreamInfo.test.ts +10 -8
  101. package/src/__tests__/{modules → impl}/LslStreamInlet.test.ts +27 -14
  102. package/src/__tests__/{modules → impl}/LslStreamOutlet.test.ts +24 -17
  103. package/src/__tests__/impl/LslWebSocketBridge.test.ts +25 -0
  104. package/src/assertions.ts +3 -3
  105. package/src/{modules → impl}/LiblslAdapter.ts +33 -21
  106. package/src/{modules/EventMarkerOutlet.ts → impl/LslEventMarkerOutlet.ts} +17 -12
  107. package/src/{modules → impl}/LslStreamInfo.ts +5 -4
  108. package/src/{modules → impl}/LslStreamInlet.ts +27 -16
  109. package/src/{modules → impl}/LslStreamOutlet.ts +19 -16
  110. package/src/impl/LslWebSocketBridge.ts +13 -0
  111. package/src/index.ts +43 -35
  112. package/src/scripts/{demoMarkerOutlet.ts → runLslEventMarkerOutlet.ts} +2 -2
  113. package/src/scripts/{demoStreamOutlet.ts → runLslStreamOutlet.ts} +1 -1
  114. package/src/testDoubles/{MarkerOutlet/FakeMarkerOutlet.ts → EventMarkerOutlet/FakeEventMarkerOutlet.ts} +7 -7
  115. package/src/testDoubles/{MarkerOutlet/MockMarkerOutlet.ts → EventMarkerOutlet/MockEventMarkerOutlet.ts} +5 -4
  116. package/src/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.ts +24 -0
  117. package/src/testDoubles/{MarkerOutlet/ThrowingMarkerOutlet.ts → EventMarkerOutlet/ThrowingEventMarkerOutlet.ts} +3 -3
  118. package/src/testDoubles/Liblsl/FakeLiblsl.ts +9 -1
  119. package/src/testDoubles/StreamInfo/FakeStreamInfo.ts +2 -2
  120. package/src/testDoubles/StreamInfo/SpyStreamInfo.ts +1 -1
  121. package/src/testDoubles/StreamInlet/FakeStreamInlet.ts +27 -0
  122. package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +22 -0
  123. package/src/testDoubles/{LslOutlet/FakeLslOutlet.ts → StreamOutlet/FakeStreamOutlet.ts} +22 -19
  124. package/src/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.ts +15 -0
  125. package/src/testDoubles/generateRandomOutletOptions.ts +5 -4
  126. package/src/types.ts +11 -4
  127. package/tsconfig.json +17 -28
  128. package/build/__tests__/AbstractLslTest.js +0 -87
  129. package/build/__tests__/AbstractLslTest.js.map +0 -1
  130. package/build/__tests__/modules/EventMarkerOutlet.test.js.map +0 -1
  131. package/build/__tests__/modules/LiblslAdapter.test.js.map +0 -1
  132. package/build/__tests__/modules/LslStreamInfo.test.js.map +0 -1
  133. package/build/__tests__/modules/LslStreamInlet.test.d.ts +0 -10
  134. package/build/__tests__/modules/LslStreamInlet.test.js.map +0 -1
  135. package/build/__tests__/modules/LslStreamOutlet.test.js.map +0 -1
  136. package/build/modules/EventMarkerOutlet.d.ts +0 -23
  137. package/build/modules/EventMarkerOutlet.js.map +0 -1
  138. package/build/modules/LiblslAdapter.js.map +0 -1
  139. package/build/modules/LslStreamInfo.js.map +0 -1
  140. package/build/modules/LslStreamInlet.d.ts +0 -31
  141. package/build/modules/LslStreamInlet.js.map +0 -1
  142. package/build/modules/LslStreamOutlet.js.map +0 -1
  143. package/build/scripts/demoMarkerOutlet.js.map +0 -1
  144. package/build/scripts/demoStreamOutlet.js.map +0 -1
  145. package/build/testDoubles/LslInlet/FakeLslInlet.d.ts +0 -11
  146. package/build/testDoubles/LslInlet/FakeLslInlet.js +0 -16
  147. package/build/testDoubles/LslInlet/FakeLslInlet.js.map +0 -1
  148. package/build/testDoubles/LslInlet/SpyLslInlet.d.ts +0 -7
  149. package/build/testDoubles/LslInlet/SpyLslInlet.js +0 -20
  150. package/build/testDoubles/LslInlet/SpyLslInlet.js.map +0 -1
  151. package/build/testDoubles/LslOutlet/FakeLslOutlet.js +0 -59
  152. package/build/testDoubles/LslOutlet/FakeLslOutlet.js.map +0 -1
  153. package/build/testDoubles/MarkerOutlet/FakeMarkerOutlet.js +0 -29
  154. package/build/testDoubles/MarkerOutlet/FakeMarkerOutlet.js.map +0 -1
  155. package/build/testDoubles/MarkerOutlet/MockMarkerOutlet.js +0 -49
  156. package/build/testDoubles/MarkerOutlet/MockMarkerOutlet.js.map +0 -1
  157. package/build/testDoubles/MarkerOutlet/SpyMarkerOutlet.d.ts +0 -9
  158. package/build/testDoubles/MarkerOutlet/SpyMarkerOutlet.js +0 -24
  159. package/build/testDoubles/MarkerOutlet/SpyMarkerOutlet.js.map +0 -1
  160. package/build/testDoubles/MarkerOutlet/ThrowingMarkerOutlet.d.ts +0 -10
  161. package/build/testDoubles/MarkerOutlet/ThrowingMarkerOutlet.js.map +0 -1
  162. package/src/__tests__/AbstractLslTest.ts +0 -59
  163. package/src/testDoubles/LslInlet/FakeLslInlet.ts +0 -22
  164. package/src/testDoubles/LslInlet/SpyLslInlet.ts +0 -16
  165. package/src/testDoubles/MarkerOutlet/SpyMarkerOutlet.ts +0 -24
  166. /package/build/scripts/{demoMarkerOutlet.d.ts → runLslEventMarkerOutlet.d.ts} +0 -0
  167. /package/build/scripts/{demoStreamOutlet.d.ts → runLslStreamOutlet.d.ts} +0 -0
package/build/types.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { FuncObj, FieldType } from 'ffi-rs';
2
- import { CHANNEL_FORMATS } from './consts';
3
- import { LslInlet } from './modules/LslStreamInlet';
4
- import { LslOutlet } from './modules/LslStreamOutlet';
5
- export type StreamFixuture = LslOutlet | LslInlet;
2
+ import { CHANNEL_FORMATS } from './consts.js';
3
+ import { StreamInlet } from './impl/LslStreamInlet.js';
4
+ import { StreamOutlet } from './impl/LslStreamOutlet.js';
5
+ export type StreamFixuture = StreamOutlet | StreamInlet;
6
6
  export type ChannelFormat = (typeof CHANNEL_FORMATS)[number];
7
7
  export interface DurationMarker {
8
8
  name: string;
@@ -16,6 +16,7 @@ export interface Liblsl {
16
16
  pushSampleStringTimestamp(options: PushSampleStringTimestampOptions): void;
17
17
  destroyOutlet(options: DestroyOutletOptions): void;
18
18
  createInlet(options: CreateInletOptions): BoundInlet;
19
+ flushInlet(options: FlushInletOptions): void;
19
20
  destroyInlet(options: DestroyInletOptions): void;
20
21
  localClock(): number;
21
22
  }
@@ -62,6 +63,9 @@ export interface CreateInletOptions {
62
63
  chunkSize: number;
63
64
  maxBuffered: number;
64
65
  }
66
+ export interface FlushInletOptions {
67
+ inlet: BoundInlet;
68
+ }
65
69
  export interface DestroyInletOptions {
66
70
  }
67
71
  export interface LiblslBindings {
@@ -71,6 +75,7 @@ export interface LiblslBindings {
71
75
  lsl_push_sample_strt(args: [BoundOutlet, LslSample, number]): void;
72
76
  lsl_destroy_outlet(args: [BoundOutlet]): void;
73
77
  lsl_create_inlet(args: any): BoundInlet;
78
+ lsl_flush_inlet(args: [BoundInlet]): void;
74
79
  lsl_destroy_inlet(args: any): void;
75
80
  lsl_local_clock(args: []): number;
76
81
  lsl_get_desc(args: [BoundStreamInfo]): BoundDescription;
package/build/types.js CHANGED
@@ -1,3 +1,2 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
3
2
  //# sourceMappingURL=types.js.map
@@ -1,20 +1,14 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isStringInArray = isStringInArray;
4
- exports.isGreaterThanOrEqualToZero = isGreaterThanOrEqualToZero;
5
- exports.isPositiveInteger = isPositiveInteger;
6
- exports.isPositiveIntegerOrZero = isPositiveIntegerOrZero;
7
- function isStringInArray(value, array) {
1
+ export function isStringInArray(value, array) {
8
2
  return array.indexOf(value) !== -1;
9
3
  }
10
- function isGreaterThanOrEqualToZero(value) {
4
+ export function isGreaterThanOrEqualToZero(value) {
11
5
  return value >= 0;
12
6
  }
13
- function isPositiveInteger(value) {
7
+ export function isPositiveInteger(value) {
14
8
  //@ts-ignore
15
9
  return Number.isInteger(value) && value > 0;
16
10
  }
17
- function isPositiveIntegerOrZero(value) {
11
+ export function isPositiveIntegerOrZero(value) {
18
12
  //@ts-ignore
19
13
  return Number.isInteger(value) && value >= 0;
20
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validations.js","sourceRoot":"","sources":["../src/validations.ts"],"names":[],"mappings":";;AAAA,0CAEC;AAED,gEAEC;AAED,8CAGC;AAED,0DAGC;AAhBD,SAAgB,eAAe,CAAC,KAAa,EAAE,KAAwB;IACnE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;AACtC,CAAC;AAED,SAAgB,0BAA0B,CAAC,KAAa;IACpD,OAAO,KAAK,IAAI,CAAC,CAAA;AACrB,CAAC;AAED,SAAgB,iBAAiB,CAAC,KAAa;IAC3C,YAAY;IACZ,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;AAC/C,CAAC;AAED,SAAgB,uBAAuB,CAAC,KAAa;IACjD,YAAY;IACZ,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;AAChD,CAAC"}
1
+ {"version":3,"file":"validations.js","sourceRoot":"","sources":["../src/validations.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAAwB;IACnE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAa;IACpD,OAAO,KAAK,IAAI,CAAC,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC3C,YAAY;IACZ,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACjD,YAAY;IACZ,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;AAChD,CAAC"}
package/package.json CHANGED
@@ -1,12 +1,24 @@
1
1
  {
2
2
  "name": "@neurodevs/node-lsl",
3
- "version": "11.4.2",
3
+ "version": "12.0.1",
4
4
  "description": "Lab Streaming Layer (LSL) bindings for Node",
5
- "main": "build/index.js",
5
+ "type": "module",
6
+ "keywords": [
7
+ "nodejs",
8
+ "typescript",
9
+ "tdd"
10
+ ],
11
+ "license": "MIT",
12
+ "author": "Eric Yates <hello@ericthecurious.com>",
13
+ "homepage": "https://github.com/neurodevs/node-lsl",
6
14
  "repository": {
7
15
  "type": "git",
8
16
  "url": "git+https://github.com/neurodevs/node-lsl.git"
9
17
  },
18
+ "bugs": {
19
+ "url": "https://github.com/neurodevs/node-lsl/issues"
20
+ },
21
+ "main": "build/index.js",
10
22
  "scripts": {
11
23
  "build.ci": "yarn run build.tsc && yarn run build.resolve-paths && yarn run lint",
12
24
  "build.dev": "yarn run build.tsc --sourceMap ; yarn run resolve-paths.lint",
@@ -38,10 +50,8 @@
38
50
  "ref-napi": "^3.0.3"
39
51
  },
40
52
  "devDependencies": {
41
- "@sprucelabs/jest-json-reporter": "^8.0.542",
42
- "@sprucelabs/resolve-path-aliases": "^2.0.516",
43
- "@sprucelabs/test": "^9.0.59",
44
- "@sprucelabs/test-utils": "^5.1.502",
53
+ "@neurodevs/generate-id": "^1.0.8",
54
+ "@neurodevs/node-tdd": "^0.1.2",
45
55
  "@types/ffi-napi": "^4.0.10",
46
56
  "@types/node": "^22.9.0",
47
57
  "chokidar-cli": "^3.0.0",
@@ -55,12 +65,6 @@
55
65
  "tsc-watch": "^6.2.1",
56
66
  "typescript": "^5.6.3"
57
67
  },
58
- "skill": {
59
- "namespace": "node-lsl",
60
- "upgradeIgnoreList": [
61
- "@sprucelabs/spruce-test-fixtures"
62
- ]
63
- },
64
68
  "jest": {
65
69
  "testRunner": "jest-circus/runner",
66
70
  "maxWorkers": 4,
@@ -78,5 +82,11 @@
78
82
  "moduleNameMapper": {
79
83
  "^#spruce/(.*)$": "<rootDir>/build/.spruce/$1"
80
84
  }
85
+ },
86
+ "skill": {
87
+ "namespace": "node-lsl",
88
+ "upgradeIgnoreList": [
89
+ "@sprucelabs/spruce-test-fixtures"
90
+ ]
81
91
  }
82
92
  }
@@ -0,0 +1,65 @@
1
+ import generateId from '@neurodevs/generate-id'
2
+ import AbstractModuleTest from '@neurodevs/node-tdd'
3
+
4
+ import LiblslAdapter from '../impl/LiblslAdapter.js'
5
+ import LslEventMarkerOutlet from '../impl/LslEventMarkerOutlet.js'
6
+ import LslStreamInfo from '../impl/LslStreamInfo.js'
7
+ import LslStreamInlet from '../impl/LslStreamInlet.js'
8
+
9
+ import LslStreamOutlet from '../impl/LslStreamOutlet.js'
10
+ import SpyEventMarkerOutlet from '../testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js'
11
+ import FakeLiblsl from '../testDoubles/Liblsl/FakeLiblsl.js'
12
+ import FakeStreamInfo from '../testDoubles/StreamInfo/FakeStreamInfo.js'
13
+ import SpyStreamInfo from '../testDoubles/StreamInfo/SpyStreamInfo.js'
14
+ import { SpyStreamInlet } from '../testDoubles/StreamInlet/SpyStreamInlet.js'
15
+ import FakeStreamOutlet from '../testDoubles/StreamOutlet/FakeStreamOutlet.js'
16
+
17
+ export default class AbstractPackageTest extends AbstractModuleTest {
18
+ protected static fakeLiblsl: FakeLiblsl
19
+
20
+ protected static async beforeEach() {
21
+ await super.beforeEach()
22
+
23
+ this.setFakeLiblsl()
24
+ }
25
+
26
+ protected static setFakeLiblsl() {
27
+ this.fakeLiblsl = new FakeLiblsl()
28
+ LiblslAdapter.setInstance(this.fakeLiblsl)
29
+ }
30
+
31
+ protected static setSpyStreamInfo() {
32
+ LslStreamInfo.Class = SpyStreamInfo
33
+ }
34
+
35
+ protected static setFakeStreamInfo() {
36
+ LslStreamInfo.Class = FakeStreamInfo
37
+ FakeStreamInfo.resetTestDouble()
38
+ }
39
+
40
+ protected static setSpyStreamInlet() {
41
+ LslStreamInlet.Class = SpyStreamInlet
42
+ }
43
+
44
+ protected static setFakeStreamOutlet() {
45
+ LslStreamOutlet.Class = FakeStreamOutlet
46
+ FakeStreamOutlet.resetTestDouble()
47
+ }
48
+
49
+ protected static setSpyEventMarkerOutlet() {
50
+ LslEventMarkerOutlet.Class = SpyEventMarkerOutlet
51
+ }
52
+
53
+ protected static generateId() {
54
+ return generateId()
55
+ }
56
+
57
+ protected static readonly name_ = generateId()
58
+ protected static readonly type = generateId()
59
+ protected static readonly sourceId = generateId()
60
+ protected static readonly units = generateId()
61
+ protected static readonly channelNames = [generateId(), generateId()]
62
+ protected static readonly chunkSize = Math.floor(Math.random() * 100)
63
+ protected static readonly maxBuffered = Math.floor(Math.random() * 100)
64
+ protected static readonly sampleRate = Math.floor(Math.random() * 100)
65
+ }
@@ -1,8 +1,10 @@
1
1
  import { randomInt } from 'crypto'
2
- import { test, assert, generateId } from '@sprucelabs/test-utils'
2
+ import generateId from '@neurodevs/generate-id'
3
+ import { test, assert } from '@neurodevs/node-tdd'
3
4
  import { DataType, OpenParams } from 'ffi-rs'
4
- import LiblslAdapter from '../../modules/LiblslAdapter'
5
- import FakeLiblsl from '../../testDoubles/Liblsl/FakeLiblsl'
5
+
6
+ import LiblslAdapter from '../../impl/LiblslAdapter.js'
7
+ import FakeLiblsl from '../../testDoubles/Liblsl/FakeLiblsl.js'
6
8
  import {
7
9
  BoundChild,
8
10
  BoundDescription,
@@ -13,17 +15,17 @@ import {
13
15
  Liblsl,
14
16
  LiblslBindings,
15
17
  LslChannel,
16
- } from '../../types'
17
- import AbstractLslTest from '../AbstractLslTest'
18
+ } from '../../types.js'
19
+ import AbstractPackageTest from '../AbstractPackageTest.js'
18
20
 
19
- export default class LiblslAdapterTest extends AbstractLslTest {
20
- private static lsl: Liblsl
21
+ export default class LiblslAdapterTest extends AbstractPackageTest {
22
+ private static instance: Liblsl
21
23
  private static libraryPath?: string
22
24
  private static libraryOptions?: Record<string, any>
23
25
  private static fakeBindings: LiblslBindings
24
26
  private static fakeStreamInfo: BoundStreamInfo
25
27
  private static fakeOutlet: BoundOutlet
26
- private static fakeInlet: BoundInlet
28
+ private static fakeInlet: BoundInlet = {}
27
29
  private static fakeDesc: BoundDescription
28
30
  private static fakeChildNamedChannels: BoundChild
29
31
  private static createStreamInfoParams?: any[]
@@ -31,6 +33,7 @@ export default class LiblslAdapterTest extends AbstractLslTest {
31
33
  private static createOutletParams?: any[]
32
34
  private static destroyOutletParams?: any[]
33
35
  private static createInletParams?: any[]
36
+ private static flushInletParams?: any[]
34
37
  private static destroyInletParams?: any[]
35
38
  private static localClockParams?: any[]
36
39
  private static pushSampleFloatTimestampParams?: any[]
@@ -85,7 +88,12 @@ export default class LiblslAdapterTest extends AbstractLslTest {
85
88
  }
86
89
 
87
90
  LiblslAdapter.resetInstance()
88
- this.lsl = LiblslAdapter.getInstance()
91
+ this.instance = LiblslAdapter.getInstance()
92
+ }
93
+
94
+ @test()
95
+ protected static async createsInstance() {
96
+ assert.isTruthy(this.instance, 'Failed to create instance!')
89
97
  }
90
98
 
91
99
  @test()
@@ -95,8 +103,6 @@ export default class LiblslAdapterTest extends AbstractLslTest {
95
103
 
96
104
  const err = assert.doesThrow(() => LiblslAdapter.getInstance())
97
105
 
98
- debugger
99
-
100
106
  assert.isTrue(
101
107
  err.message.includes(this.generateFailedMessage()),
102
108
  'Did not receive the expected error!'
@@ -150,26 +156,6 @@ export default class LiblslAdapterTest extends AbstractLslTest {
150
156
  retType: DataType.External,
151
157
  paramsType: [DataType.External, DataType.I32, DataType.I32],
152
158
  },
153
- lsl_destroy_outlet: {
154
- library: 'lsl',
155
- retType: DataType.Void,
156
- paramsType: [DataType.External],
157
- },
158
- lsl_create_inlet: {
159
- library: 'lsl',
160
- retType: DataType.External,
161
- paramsType: [DataType.External, DataType.I32, DataType.I32],
162
- },
163
- lsl_destroy_inlet: {
164
- library: 'lsl',
165
- retType: DataType.Void,
166
- paramsType: [DataType.External],
167
- },
168
- lsl_local_clock: {
169
- library: 'lsl',
170
- retType: DataType.Double,
171
- paramsType: [],
172
- },
173
159
  lsl_push_sample_ft: {
174
160
  library: 'lsl',
175
161
  retType: DataType.Void,
@@ -188,6 +174,26 @@ export default class LiblslAdapterTest extends AbstractLslTest {
188
174
  DataType.Double,
189
175
  ],
190
176
  },
177
+ lsl_destroy_outlet: {
178
+ library: 'lsl',
179
+ retType: DataType.Void,
180
+ paramsType: [DataType.External],
181
+ },
182
+ lsl_create_inlet: {
183
+ library: 'lsl',
184
+ retType: DataType.External,
185
+ paramsType: [DataType.External, DataType.I32, DataType.I32],
186
+ },
187
+ lsl_flush_inlet: {
188
+ library: 'lsl',
189
+ retType: DataType.I32,
190
+ paramsType: [DataType.External],
191
+ },
192
+ lsl_destroy_inlet: {
193
+ library: 'lsl',
194
+ retType: DataType.Void,
195
+ paramsType: [DataType.External],
196
+ },
191
197
  lsl_get_desc: {
192
198
  library: 'lsl',
193
199
  retType: DataType.External,
@@ -207,13 +213,18 @@ export default class LiblslAdapterTest extends AbstractLslTest {
207
213
  DataType.String,
208
214
  ],
209
215
  },
216
+ lsl_local_clock: {
217
+ library: 'lsl',
218
+ retType: DataType.Double,
219
+ paramsType: [],
220
+ },
210
221
  })
211
222
  }
212
223
 
213
224
  @test()
214
225
  protected static async canCreateStreamInfoWithRequiredParams() {
215
226
  const options = this.generateRandomCreateStreamInfoOptions()
216
- const actual = this.lsl.createStreamInfo(options)
227
+ const actual = this.instance.createStreamInfo(options)
217
228
 
218
229
  assert.isEqual(actual, this.fakeStreamInfo)
219
230
  assert.isEqualDeep(this.createStreamInfoParams, Object.values(options))
@@ -235,7 +246,7 @@ export default class LiblslAdapterTest extends AbstractLslTest {
235
246
  sample: expected,
236
247
  timestamp,
237
248
  }
238
- this.lsl.pushSampleFloatTimestamp(options)
249
+ this.instance.pushSampleFloatTimestamp(options)
239
250
 
240
251
  assert.isEqualDeep(this.pushSampleFloatTimestampParams, [
241
252
  this.fakeOutlet,
@@ -253,7 +264,7 @@ export default class LiblslAdapterTest extends AbstractLslTest {
253
264
  sample: expected,
254
265
  timestamp,
255
266
  }
256
- this.lsl.pushSampleStringTimestamp(options)
267
+ this.instance.pushSampleStringTimestamp(options)
257
268
  assert.isEqual(
258
269
  this.pushSampleStringTimestampParams?.[0],
259
270
  this.fakeOutlet
@@ -267,7 +278,7 @@ export default class LiblslAdapterTest extends AbstractLslTest {
267
278
  const info = this.createRandomStreamInfo()
268
279
  const channel: LslChannel = this.generateRandomChannelValues()
269
280
 
270
- this.lsl.appendChannelsToStreamInfo({
281
+ this.instance.appendChannelsToStreamInfo({
271
282
  info,
272
283
  channels: [channel],
273
284
  })
@@ -304,7 +315,7 @@ export default class LiblslAdapterTest extends AbstractLslTest {
304
315
  const channel1 = this.generateRandomChannelValues()
305
316
  const channel2 = this.generateRandomChannelValues()
306
317
 
307
- this.lsl.appendChannelsToStreamInfo({
318
+ this.instance.appendChannelsToStreamInfo({
308
319
  info,
309
320
  channels: [channel1, channel2],
310
321
  })
@@ -324,23 +335,23 @@ export default class LiblslAdapterTest extends AbstractLslTest {
324
335
  protected static async canDestroyOutlet() {
325
336
  const outlet = this.createRandomOutlet()
326
337
  const options = { outlet }
327
- this.lsl.destroyOutlet(options)
338
+ this.instance.destroyOutlet(options)
328
339
 
329
340
  assert.isEqualDeep(this.destroyOutletParams, Object.values(options))
330
341
  }
331
342
 
332
343
  @test()
333
344
  protected static async callingLocalClockTwiceReturnsDifferentTimestamps() {
334
- const t1 = this.lsl.localClock()
345
+ const t1 = this.instance.localClock()
335
346
  await this.wait(10)
336
- const t2 = this.lsl.localClock()
347
+ const t2 = this.instance.localClock()
337
348
  assert.isNotEqual(t1, t2)
338
349
  }
339
350
 
340
351
  @test()
341
352
  protected static async localClockBindingReceivesEmptyArray() {
342
353
  delete this.localClockParams
343
- this.lsl.localClock()
354
+ this.instance.localClock()
344
355
  assert.isEqualDeep(this.localClockParams, [])
345
356
  }
346
357
 
@@ -349,7 +360,7 @@ export default class LiblslAdapterTest extends AbstractLslTest {
349
360
  delete process.env.LIBLSL_PATH
350
361
 
351
362
  LiblslAdapter.resetInstance()
352
- this.lsl = LiblslAdapter.getInstance()
363
+ this.instance = LiblslAdapter.getInstance()
353
364
 
354
365
  assert.isEqual(
355
366
  this.ffiRsOpenOptions?.path,
@@ -364,21 +375,33 @@ export default class LiblslAdapterTest extends AbstractLslTest {
364
375
  assert.isEqual(inlet, this.fakeInlet)
365
376
  }
366
377
 
378
+ @test()
379
+ protected static async flushInletCallsBinding() {
380
+ const { inlet } = this.createRandomInlet()
381
+ this.instance.flushInlet({ inlet })
382
+
383
+ assert.isEqualDeep(
384
+ this.flushInletParams,
385
+ [inlet],
386
+ 'Should have called flushInlet with expected params!'
387
+ )
388
+ }
389
+
367
390
  private static createRandomStreamInfo() {
368
- return this.lsl.createStreamInfo(
391
+ return this.instance.createStreamInfo(
369
392
  this.generateRandomCreateStreamInfoOptions()
370
393
  )
371
394
  }
372
395
 
373
396
  private static createRandomOutlet() {
374
397
  const options = this.createRandomOptions()
375
- const outlet = this.lsl.createOutlet(options)
398
+ const outlet = this.instance.createOutlet(options)
376
399
  return { options, outlet }
377
400
  }
378
401
 
379
402
  private static createRandomInlet() {
380
403
  const options = this.createRandomOptions()
381
- const inlet = this.lsl.createInlet(options)
404
+ const inlet = this.instance.createInlet(options)
382
405
  return { options, inlet }
383
406
  }
384
407
 
@@ -438,6 +461,10 @@ export default class LiblslAdapterTest extends AbstractLslTest {
438
461
  this.createInletParams = params
439
462
  return this.fakeInlet
440
463
  },
464
+ lsl_flush_inlet: (params: any[]) => {
465
+ this.flushInletParams = params
466
+ return 0
467
+ },
441
468
  lsl_destroy_inlet: (params: any[]) => {
442
469
  this.destroyInletParams = params
443
470
  },
@@ -1,28 +1,35 @@
1
1
  import { randomInt } from 'crypto'
2
- import { assert, generateId, test } from '@sprucelabs/test-utils'
3
- import EventMarkerOutlet from '../../modules/EventMarkerOutlet'
4
- import { LslOutletOptions } from '../../modules/LslStreamOutlet'
5
- import generateRandomOutletOptions from '../../testDoubles/generateRandomOutletOptions'
6
- import FakeLslOutlet from '../../testDoubles/LslOutlet/FakeLslOutlet'
7
- import SpyMarkerOutlet from '../../testDoubles/MarkerOutlet/SpyMarkerOutlet'
8
- import AbstractLslTest from '../AbstractLslTest'
2
+ import generateId from '@neurodevs/generate-id'
3
+ import { assert, test } from '@neurodevs/node-tdd'
9
4
 
10
- export default class EventMarkerOutletTest extends AbstractLslTest {
11
- private static instance: SpyMarkerOutlet
5
+ import LslEventMarkerOutlet from '../../impl/LslEventMarkerOutlet.js'
6
+ import { StreamOutletOptions } from '../../impl/LslStreamOutlet.js'
7
+ import SpyEventMarkerOutlet from '../../testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js'
8
+ import generateRandomOutletOptions from '../../testDoubles/generateRandomOutletOptions.js'
9
+ import FakeStreamOutlet from '../../testDoubles/StreamOutlet/FakeStreamOutlet.js'
10
+ import AbstractPackageTest from '../AbstractPackageTest.js'
11
+
12
+ export default class EventMarkerOutletTest extends AbstractPackageTest {
13
+ private static instance: SpyEventMarkerOutlet
12
14
 
13
15
  protected static async beforeEach() {
14
16
  await super.beforeEach()
15
17
 
16
18
  this.setFakeLiblsl()
17
- this.setFakeLslOutlet()
18
- this.setSpyMarkerOutlet()
19
+ this.setFakeStreamOutlet()
20
+ this.setSpyEventMarkerOutlet()
19
21
 
20
- this.instance = await this.EventMarkerOutlet()
22
+ this.instance = await this.LslEventMarkerOutlet()
23
+ }
24
+
25
+ @test()
26
+ protected static async createsInstance() {
27
+ assert.isTruthy(this.instance, 'Failed to create instance!')
21
28
  }
22
29
 
23
30
  @test()
24
31
  protected static async loadsWithEventMarkerSpecificOptions() {
25
- assert.isEqualDeep(FakeLslOutlet.callsToConstructor[0].options, {
32
+ assert.isEqualDeep(FakeStreamOutlet.callsToConstructor[0].options, {
26
33
  name: 'Event markers',
27
34
  type: 'Markers',
28
35
  channelNames: ['Markers'],
@@ -39,9 +46,12 @@ export default class EventMarkerOutletTest extends AbstractLslTest {
39
46
  @test()
40
47
  protected static async canOverrideDefaultOptions() {
41
48
  const options = generateRandomOutletOptions()
42
- await this.EventMarkerOutlet(options)
49
+ await this.LslEventMarkerOutlet(options)
43
50
 
44
- assert.isEqualDeep(FakeLslOutlet.callsToConstructor[1].options, options)
51
+ assert.isEqualDeep(
52
+ FakeStreamOutlet.callsToConstructor[1].options,
53
+ options
54
+ )
45
55
  }
46
56
 
47
57
  @test()
@@ -52,7 +62,7 @@ export default class EventMarkerOutletTest extends AbstractLslTest {
52
62
  const marker = markers[0]
53
63
 
54
64
  assert.isEqual(
55
- FakeLslOutlet.callsToPushSample[0][0],
65
+ FakeStreamOutlet.callsToPushSample[0][0],
56
66
  marker.name,
57
67
  'Pushed the wrong marker!'
58
68
  )
@@ -64,7 +74,7 @@ export default class EventMarkerOutletTest extends AbstractLslTest {
64
74
  protected static async pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
65
75
  const markers = await this.pushTotalMarkers(2)
66
76
 
67
- assert.isEqual(FakeLslOutlet.callsToPushSample.length, 2)
77
+ assert.isEqual(FakeStreamOutlet.callsToPushSample.length, 2)
68
78
 
69
79
  assert.isEqual(
70
80
  this.instance.totalWaitTimeMs,
@@ -78,7 +88,7 @@ export default class EventMarkerOutletTest extends AbstractLslTest {
78
88
  protected static async canStopEventMarkersMidPush(bailIdx: number) {
79
89
  let hitCount = 0
80
90
 
81
- const outlet = this.instance.getLslOutlet()
91
+ const outlet = this.instance.getStreamOutlet()
82
92
 
83
93
  outlet.pushSample = () => {
84
94
  hitCount += 1
@@ -98,7 +108,7 @@ export default class EventMarkerOutletTest extends AbstractLslTest {
98
108
 
99
109
  let hitCount = 0
100
110
 
101
- const outlet = this.instance.getLslOutlet()
111
+ const outlet = this.instance.getStreamOutlet()
102
112
 
103
113
  outlet.pushSample = () => {
104
114
  hitCount++
@@ -127,7 +137,7 @@ export default class EventMarkerOutletTest extends AbstractLslTest {
127
137
  void this.pushTotalMarkers(2, 100)
128
138
  this.instance.stop()
129
139
 
130
- this.lslOutlet.pushSample = () =>
140
+ this.streamOutlet.pushSample = () =>
131
141
  assert.fail('Should not have been called')
132
142
  }
133
143
 
@@ -136,16 +146,16 @@ export default class EventMarkerOutletTest extends AbstractLslTest {
136
146
  const markerName = generateId()
137
147
  this.instance.pushMarker(markerName)
138
148
 
139
- assert.isEqual(FakeLslOutlet.callsToPushSample[0][0], markerName)
149
+ assert.isEqual(FakeStreamOutlet.callsToPushSample[0][0], markerName)
140
150
  }
141
151
 
142
- private static get lslOutlet() {
143
- return this.instance.getLslOutlet()
152
+ private static get streamOutlet() {
153
+ return this.instance.getStreamOutlet()
144
154
  }
145
155
 
146
156
  private static async setupOutlet() {
147
- EventMarkerOutlet.Class = EventMarkerOutlet as any
148
- this.instance = await this.EventMarkerOutlet()
157
+ LslEventMarkerOutlet.Class = LslEventMarkerOutlet as any
158
+ this.instance = await this.LslEventMarkerOutlet()
149
159
  }
150
160
 
151
161
  private static async pushTotalMarkers(total: number, durationMs?: number) {
@@ -165,9 +175,11 @@ export default class EventMarkerOutletTest extends AbstractLslTest {
165
175
  }
166
176
  }
167
177
 
168
- private static async EventMarkerOutlet(
169
- options?: Partial<LslOutletOptions>
178
+ private static async LslEventMarkerOutlet(
179
+ options?: Partial<StreamOutletOptions>
170
180
  ) {
171
- return (await EventMarkerOutlet.Create(options)) as SpyMarkerOutlet
181
+ return (await LslEventMarkerOutlet.Create(
182
+ options
183
+ )) as SpyEventMarkerOutlet
172
184
  }
173
185
  }
@@ -1,10 +1,12 @@
1
- import { test, assert, generateId } from '@sprucelabs/test-utils'
2
- import { CHANNEL_FORMATS } from '../../consts'
3
- import LslStreamInfo, { StreamInfoOptions } from '../../modules/LslStreamInfo'
4
- import SpyStreamInfo from '../../testDoubles/StreamInfo/SpyStreamInfo'
5
- import AbstractLslTest from '../AbstractLslTest'
1
+ import generateId from '@neurodevs/generate-id'
2
+ import { test, assert } from '@neurodevs/node-tdd'
6
3
 
7
- export default class LslStreamInfoTest extends AbstractLslTest {
4
+ import { CHANNEL_FORMATS } from '../../consts.js'
5
+ import LslStreamInfo, { StreamInfoOptions } from '../../impl/LslStreamInfo.js'
6
+ import SpyStreamInfo from '../../testDoubles/StreamInfo/SpyStreamInfo.js'
7
+ import AbstractPackageTest from '../AbstractPackageTest.js'
8
+
9
+ export default class LslStreamInfoTest extends AbstractPackageTest {
8
10
  private static instance: SpyStreamInfo
9
11
 
10
12
  protected static async beforeEach() {
@@ -16,8 +18,8 @@ export default class LslStreamInfoTest extends AbstractLslTest {
16
18
  }
17
19
 
18
20
  @test()
19
- protected static async canCreateLslStreamInfo() {
20
- assert.isTruthy(this.instance, 'Instance should be created!')
21
+ protected static async createsInstance() {
22
+ assert.isTruthy(this.instance, 'Failed to create instance!')
21
23
  }
22
24
 
23
25
  @test()