@sndwrks/osc-cli 1.2.0 → 1.3.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.
package/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ Copyright © 2026 sndwrks Inc
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  # osc-cli
4
4
 
5
+ ![NPM Version](https://img.shields.io/npm/v/%40sndwrks%2Fosc-cli?style=flat-square&color=rgb(239%2C%20145%2C%2081))
6
+ ![GitHub License](https://img.shields.io/github/license/sndwrks/osc-cli?style=flat&color=rgb(14%2C%2022%2C%2025))
7
+ ![Node LTS](https://img.shields.io/node/v-lts/%40sndwrks%2Fosc-cli)
8
+
9
+
10
+
5
11
  **DISCLAIMER: this was written by AI, and promptly rewritten, but it will be maintained by humans (probably).**
6
12
 
7
13
  A simple command-line application for sending and receiving OSC (Open Sound Control) messages via TCP and UDP including load testing.
@@ -15,6 +21,8 @@ A simple command-line application for sending and receiving OSC (Open Sound Cont
15
21
  - Send OSC messages via TCP
16
22
  - Load Testing with UDP
17
23
  - Load Testing with TCP
24
+ - Integration Testing with UDP (send to app, validate response)
25
+ - Integration Testing with TCP (send to app, validate response)
18
26
 
19
27
  ## Installation
20
28
 
@@ -203,6 +211,86 @@ osc-cli osc-load-test-tcp \
203
211
  --custom-address /my/custom/address
204
212
  ```
205
213
 
214
+ ### Integration Testing
215
+
216
+ Integration testing commands send messages to a remote application and validate the responses. The remote application should echo back OSC messages to the local listener port.
217
+
218
+ #### Args
219
+
220
+ | Flag | Option | Type | Required | Description | Example | Default |
221
+ |------|--------|------|----------|-------------|---------|---------|
222
+ | `-i` | `--remote-ip-address <ip>` | string | Yes | Remote IP to send messages to | 10.10.209.5 | |
223
+ | `-p` | `--remote-port <port>` | number | Yes | Remote port to send messages to | 8000 | |
224
+ | | `--mode <mode>` | string | Yes | Test mode: "single" or "load" | single | |
225
+ | | `--local-ip-address <ip>` | string | No | Local IP to listen for responses | | 0.0.0.0 |
226
+ | | `--local-port <port>` | number | No | Local port to listen for responses | | 57120 (UDP) / 57121 (TCP) |
227
+ | `-a` | `--address <address>` | string | No | OSC address to send | /test | /test |
228
+ | | `--args <args...>` | string[] | No | Arguments to send | hello 123 | |
229
+ | | `--expected-address <address>` | string | No | Expected response address | /response | sent address |
230
+ | | `--expected-args <args...>` | string[] | No | Expected response args | ok 1 | sent args |
231
+ | | `--timeout <ms>` | number | No | Response timeout | | 5000 |
232
+ | | `--messages-per-batch <n>` | number | No | Messages per batch (load mode) | | |
233
+ | | `--total-batches <n>` | number | No | Total batches (load mode) | | |
234
+ | | `--batch-interval <seconds>` | number | No | Interval between batches (load mode) | | |
235
+ | | `--message-rate <n>` | number | No | Messages per second (load mode) | | |
236
+
237
+ **UDP Integration Test (single message):**
238
+ ```bash
239
+ # Send a message and validate the response matches
240
+ osc-cli test-osc-udp \
241
+ --mode single \
242
+ -i 127.0.0.1 \
243
+ -p 8000 \
244
+ -a /test \
245
+ --args hello 123
246
+
247
+ # With custom expected response
248
+ osc-cli test-osc-udp \
249
+ --mode single \
250
+ -i 127.0.0.1 \
251
+ -p 8000 \
252
+ -a /ping \
253
+ --expected-address /pong \
254
+ --expected-args ok
255
+ ```
256
+
257
+ **UDP Integration Test (load test):**
258
+ ```bash
259
+ # Load test with throughput validation
260
+ osc-cli test-osc-udp \
261
+ --mode load \
262
+ -i 127.0.0.1 \
263
+ -p 8000 \
264
+ --messages-per-batch 100 \
265
+ --total-batches 10 \
266
+ --batch-interval 1
267
+ ```
268
+
269
+ **TCP Integration Test (single message):**
270
+ ```bash
271
+ osc-cli test-osc-tcp \
272
+ --mode single \
273
+ -i 127.0.0.1 \
274
+ -p 8001 \
275
+ -a /test \
276
+ --args hello 123
277
+ ```
278
+
279
+ **TCP Integration Test (load test):**
280
+ ```bash
281
+ osc-cli test-osc-tcp \
282
+ --mode load \
283
+ -i 127.0.0.1 \
284
+ -p 8001 \
285
+ --messages-per-batch 50 \
286
+ --total-batches 5 \
287
+ --batch-interval 2 \
288
+ --message-rate 100
289
+ ```
290
+
291
+ **Exit codes:**
292
+ - `0` - Test passed (single: response matched; load: no dropped messages)
293
+ - `1` - Test failed (timeout, mismatch, or dropped messages)
206
294
 
207
295
  ## Development
208
296
 
package/dist/cli.js CHANGED
@@ -7,6 +7,8 @@ import { sendTcpMessage } from './osc-senders/sendTcpMessage.js';
7
7
  import { sendUdpMessage } from './osc-senders/sendUdpMessage.js';
8
8
  import { createOscUdpLoadTest } from './osc-load-test/oscLoadTestUdp.js';
9
9
  import { createOscTcpLoadTest } from './osc-load-test/oscLoadTestTcp.js';
10
+ import { createOscUdpTest } from './osc-test/testOscUdp.js';
11
+ import { createOscTcpTest } from './osc-test/testOscTcp.js';
10
12
  configureLogger({
11
13
  logToConsole: {
12
14
  enabled: true,
@@ -125,5 +127,113 @@ program
125
127
  });
126
128
  await oscLoadTestTest.start();
127
129
  });
130
+ program
131
+ .command('test-osc-udp')
132
+ .name('test-osc-udp')
133
+ .description('Integration test via UDP. Sends messages to a remote application and validates responses.')
134
+ .requiredOption('--mode <mode>', 'Test mode: "single" (single message) or "load" (throughput test)')
135
+ .requiredOption('-i, --remote-ip-address <ip>', 'Remote IP address to send messages to')
136
+ .requiredOption('-p, --remote-port <port>', 'Remote port to send messages to')
137
+ .option('--local-ip-address <ip>', 'Local IP to listen for responses. Default: 0.0.0.0')
138
+ .option('--local-port <port>', 'Local port to listen for responses. Default: 57120')
139
+ .option('-a, --address <address>', 'OSC address to send. Default: /test')
140
+ .option('--args <args...>', 'Arguments to send')
141
+ .option('--expected-address <address>', 'Expected response address (defaults to sent address)')
142
+ .option('--expected-args <args...>', 'Expected response args (defaults to sent args)')
143
+ .option('--timeout <ms>', 'Timeout in milliseconds. Default: 5000')
144
+ .option('--messages-per-batch <n>', 'Messages per batch (load mode)')
145
+ .option('--total-batches <n>', 'Total number of batches (load mode)')
146
+ .option('--batch-interval <seconds>', 'Interval between batches in seconds (load mode)')
147
+ .option('--message-rate <n>', 'Messages per second rate limit (load mode)')
148
+ .action(async ({ mode, remoteIpAddress, remotePort, localIpAddress, localPort, address, args, expectedAddress, expectedArgs, timeout, messagesPerBatch, totalBatches, batchInterval, messageRate, }) => {
149
+ const test = createOscUdpTest({
150
+ logger,
151
+ mode,
152
+ remoteIpAddress,
153
+ remotePort: parseInt(remotePort, 10),
154
+ localIpAddress,
155
+ localPort: localPort ? parseInt(localPort, 10) : undefined,
156
+ address,
157
+ args,
158
+ expectedAddress,
159
+ expectedArgs,
160
+ timeout: timeout ? parseInt(timeout, 10) : undefined,
161
+ messagesPerBatch: messagesPerBatch ? parseInt(messagesPerBatch, 10) : undefined,
162
+ totalBatches: totalBatches ? parseInt(totalBatches, 10) : undefined,
163
+ batchInterval: batchInterval ? parseFloat(batchInterval) : undefined,
164
+ messageRate: messageRate ? parseInt(messageRate, 10) : undefined,
165
+ });
166
+ const result = await test.run();
167
+ logger.info('=== Test Results ===');
168
+ logger.info('Status: %s', result.success ? 'PASSED' : 'FAILED');
169
+ logger.info('Messages sent: %d', result.messagesSent);
170
+ logger.info('Messages received: %d', result.messagesReceived);
171
+ logger.info('Dropped messages: %d', result.droppedMessages);
172
+ if (result.throughput !== undefined) {
173
+ logger.info('Throughput: %s msg/sec', result.throughput.toFixed(2));
174
+ }
175
+ if (result.duration !== undefined) {
176
+ logger.info('Duration: %d ms', result.duration);
177
+ }
178
+ if (result.errors.length > 0) {
179
+ logger.error('Errors:');
180
+ result.errors.forEach((e) => logger.error(' - %s', e));
181
+ }
182
+ process.exit(result.success ? 0 : 1);
183
+ });
184
+ program
185
+ .command('test-osc-tcp')
186
+ .name('test-osc-tcp')
187
+ .description('Integration test via TCP. Sends messages to a remote application and validates responses.')
188
+ .requiredOption('--mode <mode>', 'Test mode: "single" (single message) or "load" (throughput test)')
189
+ .requiredOption('-i, --remote-ip-address <ip>', 'Remote IP address to send messages to')
190
+ .requiredOption('-p, --remote-port <port>', 'Remote port to send messages to')
191
+ .option('--local-ip-address <ip>', 'Local IP to listen for responses. Default: 0.0.0.0')
192
+ .option('--local-port <port>', 'Local port to listen for responses. Default: 57121')
193
+ .option('-a, --address <address>', 'OSC address to send. Default: /test')
194
+ .option('--args <args...>', 'Arguments to send')
195
+ .option('--expected-address <address>', 'Expected response address (defaults to sent address)')
196
+ .option('--expected-args <args...>', 'Expected response args (defaults to sent args)')
197
+ .option('--timeout <ms>', 'Timeout in milliseconds. Default: 5000')
198
+ .option('--messages-per-batch <n>', 'Messages per batch (load mode)')
199
+ .option('--total-batches <n>', 'Total number of batches (load mode)')
200
+ .option('--batch-interval <seconds>', 'Interval between batches in seconds (load mode)')
201
+ .option('--message-rate <n>', 'Messages per second rate limit (load mode)')
202
+ .action(async ({ mode, remoteIpAddress, remotePort, localIpAddress, localPort, address, args, expectedAddress, expectedArgs, timeout, messagesPerBatch, totalBatches, batchInterval, messageRate, }) => {
203
+ const test = createOscTcpTest({
204
+ logger,
205
+ mode,
206
+ remoteIpAddress,
207
+ remotePort: parseInt(remotePort, 10),
208
+ localIpAddress,
209
+ localPort: localPort ? parseInt(localPort, 10) : undefined,
210
+ address,
211
+ args,
212
+ expectedAddress,
213
+ expectedArgs,
214
+ timeout: timeout ? parseInt(timeout, 10) : undefined,
215
+ messagesPerBatch: messagesPerBatch ? parseInt(messagesPerBatch, 10) : undefined,
216
+ totalBatches: totalBatches ? parseInt(totalBatches, 10) : undefined,
217
+ batchInterval: batchInterval ? parseFloat(batchInterval) : undefined,
218
+ messageRate: messageRate ? parseInt(messageRate, 10) : undefined,
219
+ });
220
+ const result = await test.run();
221
+ logger.info('=== Test Results ===');
222
+ logger.info('Status: %s', result.success ? 'PASSED' : 'FAILED');
223
+ logger.info('Messages sent: %d', result.messagesSent);
224
+ logger.info('Messages received: %d', result.messagesReceived);
225
+ logger.info('Dropped messages: %d', result.droppedMessages);
226
+ if (result.throughput !== undefined) {
227
+ logger.info('Throughput: %s msg/sec', result.throughput.toFixed(2));
228
+ }
229
+ if (result.duration !== undefined) {
230
+ logger.info('Duration: %d ms', result.duration);
231
+ }
232
+ if (result.errors.length > 0) {
233
+ logger.error('Errors:');
234
+ result.errors.forEach((e) => logger.error(' - %s', e));
235
+ }
236
+ process.exit(result.success ? 0 : 1);
237
+ });
128
238
  program.parse();
129
239
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ // eslint-disable-next-line import/prefer-default-export
2
+ export function validateMessage(expectedAddress, expectedArgs, receivedAddress, receivedArgs) {
3
+ const errors = [];
4
+ if (expectedAddress !== receivedAddress) {
5
+ errors.push(`Address mismatch: expected "${expectedAddress}", got "${receivedAddress}"`);
6
+ }
7
+ if (expectedArgs.length !== receivedArgs.length) {
8
+ errors.push(`Args count mismatch: expected ${expectedArgs.length}, got ${receivedArgs.length}`);
9
+ }
10
+ const minLength = Math.min(expectedArgs.length, receivedArgs.length);
11
+ for (let i = 0; i < minLength; i += 1) {
12
+ if (expectedArgs[i].type !== receivedArgs[i].type) {
13
+ errors.push(`Arg[${i}] type mismatch: expected "${expectedArgs[i].type}", got "${receivedArgs[i].type}"`);
14
+ }
15
+ if (expectedArgs[i].value !== receivedArgs[i].value) {
16
+ errors.push(`Arg[${i}] value mismatch: expected "${expectedArgs[i].value}", got "${receivedArgs[i].value}"`);
17
+ }
18
+ }
19
+ return {
20
+ valid: errors.length === 0,
21
+ errors,
22
+ };
23
+ }
24
+ //# sourceMappingURL=messageValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageValidator.js","sourceRoot":"","sources":["../../src/osc-test/messageValidator.ts"],"names":[],"mappings":"AAOA,wDAAwD;AACxD,MAAM,UAAU,eAAe,CAC7B,eAAuB,EACvB,YAAsB,EACtB,eAAuB,EACvB,YAAsB;IAEtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,eAAe,KAAK,eAAe,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,+BAA+B,eAAe,WAAW,eAAe,GAAG,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,iCAAiC,YAAY,CAAC,MAAM,SAAS,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IACrE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,8BAA8B,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QAC5G,CAAC;QACD,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,+BAA+B,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,182 @@
1
+ import osc from 'osc';
2
+ import * as net from 'node:net';
3
+ import { argsToTypedArgs } from '../osc-senders/utilities.js';
4
+ import { validateMessage } from './messageValidator.js';
5
+ // eslint-disable-next-line import/prefer-default-export
6
+ export function createOscTcpTest({ logger, mode, remoteIpAddress, remotePort, localIpAddress = '0.0.0.0', localPort = 57121, address = '/test', args, expectedAddress, expectedArgs, timeout = 5000, messagesPerBatch, totalBatches, batchInterval, messageRate, }) {
7
+ let tcpServer = null;
8
+ let client = null;
9
+ const receivedMessages = [];
10
+ let startTime = Date.now();
11
+ function startServer() {
12
+ return new Promise((resolve) => {
13
+ tcpServer = net.createServer((socket) => {
14
+ const tcpPort = new osc.TCPSocketPort({
15
+ socket,
16
+ metadata: true,
17
+ });
18
+ tcpPort.on('message', (oscMsg) => {
19
+ receivedMessages.push({
20
+ address: oscMsg.address,
21
+ args: oscMsg.args,
22
+ timestamp: Date.now(),
23
+ });
24
+ logger.info('Received: %s %o', oscMsg.address, oscMsg.args);
25
+ });
26
+ tcpPort.on('error', (err) => {
27
+ logger.error('TCP Port error:', err);
28
+ });
29
+ });
30
+ tcpServer.on('error', (e) => {
31
+ logger.error('TCP Server error:', e);
32
+ });
33
+ tcpServer.listen(localPort, localIpAddress, () => {
34
+ logger.info(`Listening for responses on ${localIpAddress}:${localPort}`);
35
+ resolve();
36
+ });
37
+ });
38
+ }
39
+ function startClient() {
40
+ return new Promise((resolve) => {
41
+ client = new osc.TCPSocketPort({
42
+ address: localIpAddress,
43
+ port: 0,
44
+ });
45
+ client.on('ready', () => {
46
+ logger.info(`Client connected to ${remoteIpAddress}:${remotePort}`);
47
+ resolve();
48
+ });
49
+ client.on('error', (err) => {
50
+ logger.error('Client error:', err);
51
+ });
52
+ client.open(remoteIpAddress, remotePort);
53
+ });
54
+ }
55
+ function cleanup() {
56
+ if (client)
57
+ client.close();
58
+ if (tcpServer)
59
+ tcpServer.close();
60
+ }
61
+ async function runSingleTest() {
62
+ const typedArgs = args ? argsToTypedArgs(args) : [];
63
+ if (client) {
64
+ client.send({
65
+ address,
66
+ args: typedArgs,
67
+ });
68
+ logger.info('Sent: %s %o', address, typedArgs);
69
+ }
70
+ await new Promise((resolve) => {
71
+ const checkInterval = setInterval(() => {
72
+ if (receivedMessages.length > 0) {
73
+ clearInterval(checkInterval);
74
+ resolve();
75
+ }
76
+ }, 10);
77
+ setTimeout(() => {
78
+ clearInterval(checkInterval);
79
+ resolve();
80
+ }, timeout);
81
+ });
82
+ if (receivedMessages.length === 0) {
83
+ return {
84
+ success: false,
85
+ messagesSent: 1,
86
+ messagesReceived: 0,
87
+ droppedMessages: 1,
88
+ errors: ['No response received within timeout'],
89
+ };
90
+ }
91
+ const received = receivedMessages[0];
92
+ const expAddr = expectedAddress || address;
93
+ const expArgs = expectedArgs ? argsToTypedArgs(expectedArgs) : typedArgs;
94
+ const validation = validateMessage(expAddr, expArgs, received.address, received.args);
95
+ return {
96
+ success: validation.valid,
97
+ messagesSent: 1,
98
+ messagesReceived: 1,
99
+ droppedMessages: 0,
100
+ duration: Date.now() - startTime,
101
+ errors: validation.errors,
102
+ };
103
+ }
104
+ async function runLoadTest() {
105
+ if (!messagesPerBatch || !totalBatches || !batchInterval) {
106
+ return {
107
+ success: false,
108
+ messagesSent: 0,
109
+ messagesReceived: 0,
110
+ droppedMessages: 0,
111
+ errors: ['Load test requires messagesPerBatch, totalBatches, and batchInterval'],
112
+ };
113
+ }
114
+ let messagesSent = 0;
115
+ for (let batch = 0; batch < totalBatches; batch += 1) {
116
+ logger.info(`Sending batch ${batch + 1}/${totalBatches}`);
117
+ for (let msg = 0; msg < messagesPerBatch; msg += 1) {
118
+ if (client) {
119
+ client.send({
120
+ address,
121
+ args: [{
122
+ type: 's',
123
+ value: `Batch: ${batch} Message: ${msg + 1}`,
124
+ }],
125
+ });
126
+ messagesSent += 1;
127
+ if (messageRate && msg < messagesPerBatch - 1) {
128
+ // eslint-disable-next-line no-await-in-loop
129
+ await new Promise((r) => { setTimeout(r, 1000 / messageRate); });
130
+ }
131
+ }
132
+ }
133
+ if (batch < totalBatches - 1) {
134
+ // eslint-disable-next-line no-await-in-loop
135
+ await new Promise((r) => { setTimeout(r, batchInterval * 1000); });
136
+ }
137
+ }
138
+ logger.info('Waiting for responses...');
139
+ await new Promise((r) => { setTimeout(r, Math.min(timeout, 2000)); });
140
+ const duration = Date.now() - startTime;
141
+ const droppedMessages = messagesSent - receivedMessages.length;
142
+ const throughput = (receivedMessages.length / duration) * 1000;
143
+ const errors = [];
144
+ if (droppedMessages > 0) {
145
+ const dropRate = ((droppedMessages / messagesSent) * 100).toFixed(2);
146
+ errors.push(`Dropped ${droppedMessages}/${messagesSent} messages (${dropRate}%)`);
147
+ }
148
+ return {
149
+ success: droppedMessages === 0,
150
+ messagesSent,
151
+ messagesReceived: receivedMessages.length,
152
+ droppedMessages,
153
+ throughput,
154
+ duration,
155
+ errors,
156
+ };
157
+ }
158
+ async function run() {
159
+ try {
160
+ await startServer();
161
+ await startClient();
162
+ startTime = Date.now();
163
+ const result = mode === 'single'
164
+ ? await runSingleTest()
165
+ : await runLoadTest();
166
+ cleanup();
167
+ return result;
168
+ }
169
+ catch (err) {
170
+ cleanup();
171
+ return {
172
+ success: false,
173
+ messagesSent: 0,
174
+ messagesReceived: 0,
175
+ droppedMessages: 0,
176
+ errors: [err instanceof Error ? err.message : String(err)],
177
+ };
178
+ }
179
+ }
180
+ return { run };
181
+ }
182
+ //# sourceMappingURL=testOscTcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testOscTcp.js","sourceRoot":"","sources":["../../src/osc-test/testOscTcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,182 @@
1
+ import osc from 'osc';
2
+ import { argsToTypedArgs } from '../osc-senders/utilities.js';
3
+ import { validateMessage } from './messageValidator.js';
4
+ // eslint-disable-next-line import/prefer-default-export
5
+ export function createOscUdpTest({ logger, mode, remoteIpAddress, remotePort, localIpAddress = '0.0.0.0', localPort = 57120, address = '/test', args, expectedAddress, expectedArgs, timeout = 5000, messagesPerBatch, totalBatches, batchInterval, messageRate, }) {
6
+ let server = null;
7
+ let client = null;
8
+ const receivedMessages = [];
9
+ let startTime = Date.now();
10
+ function startServer() {
11
+ return new Promise((resolve, reject) => {
12
+ server = new osc.UDPPort({
13
+ localAddress: localIpAddress,
14
+ localPort,
15
+ metadata: true,
16
+ });
17
+ server.on('ready', () => {
18
+ logger.info(`Listening for responses on ${localIpAddress}:${localPort}`);
19
+ resolve();
20
+ });
21
+ server.on('message', (oscMsg) => {
22
+ receivedMessages.push({
23
+ address: oscMsg.address,
24
+ args: oscMsg.args,
25
+ timestamp: Date.now(),
26
+ });
27
+ logger.info('Received: %s %o', oscMsg.address, oscMsg.args);
28
+ });
29
+ server.on('error', (err) => {
30
+ logger.error('Server error:', err);
31
+ reject(err);
32
+ });
33
+ server.open();
34
+ });
35
+ }
36
+ function startClient() {
37
+ return new Promise((resolve) => {
38
+ client = new osc.UDPPort({
39
+ localAddress: localIpAddress,
40
+ localPort: 0,
41
+ remoteAddress: remoteIpAddress,
42
+ remotePort,
43
+ metadata: true,
44
+ });
45
+ client.on('ready', () => {
46
+ logger.info(`Client ready, will send to ${remoteIpAddress}:${remotePort}`);
47
+ resolve();
48
+ });
49
+ client.on('error', (err) => {
50
+ logger.error('Client error:', err);
51
+ });
52
+ client.open();
53
+ });
54
+ }
55
+ function cleanup() {
56
+ if (client)
57
+ client.close();
58
+ if (server)
59
+ server.close();
60
+ }
61
+ async function runSingleTest() {
62
+ const typedArgs = args ? argsToTypedArgs(args) : [];
63
+ if (client) {
64
+ client.send({
65
+ address,
66
+ args: typedArgs,
67
+ });
68
+ logger.info('Sent: %s %o', address, typedArgs);
69
+ }
70
+ await new Promise((resolve) => {
71
+ const checkInterval = setInterval(() => {
72
+ if (receivedMessages.length > 0) {
73
+ clearInterval(checkInterval);
74
+ resolve();
75
+ }
76
+ }, 10);
77
+ setTimeout(() => {
78
+ clearInterval(checkInterval);
79
+ resolve();
80
+ }, timeout);
81
+ });
82
+ if (receivedMessages.length === 0) {
83
+ return {
84
+ success: false,
85
+ messagesSent: 1,
86
+ messagesReceived: 0,
87
+ droppedMessages: 1,
88
+ errors: ['No response received within timeout'],
89
+ };
90
+ }
91
+ const received = receivedMessages[0];
92
+ const expAddr = expectedAddress || address;
93
+ const expArgs = expectedArgs ? argsToTypedArgs(expectedArgs) : typedArgs;
94
+ const validation = validateMessage(expAddr, expArgs, received.address, received.args);
95
+ return {
96
+ success: validation.valid,
97
+ messagesSent: 1,
98
+ messagesReceived: 1,
99
+ droppedMessages: 0,
100
+ duration: Date.now() - startTime,
101
+ errors: validation.errors,
102
+ };
103
+ }
104
+ async function runLoadTest() {
105
+ if (!messagesPerBatch || !totalBatches || !batchInterval) {
106
+ return {
107
+ success: false,
108
+ messagesSent: 0,
109
+ messagesReceived: 0,
110
+ droppedMessages: 0,
111
+ errors: ['Load test requires messagesPerBatch, totalBatches, and batchInterval'],
112
+ };
113
+ }
114
+ let messagesSent = 0;
115
+ for (let batch = 0; batch < totalBatches; batch += 1) {
116
+ logger.info(`Sending batch ${batch + 1}/${totalBatches}`);
117
+ for (let msg = 0; msg < messagesPerBatch; msg += 1) {
118
+ if (client) {
119
+ client.send({
120
+ address,
121
+ args: [{
122
+ type: 's',
123
+ value: `Batch: ${batch} Message: ${msg + 1}`,
124
+ }],
125
+ });
126
+ messagesSent += 1;
127
+ if (messageRate && msg < messagesPerBatch - 1) {
128
+ // eslint-disable-next-line no-await-in-loop
129
+ await new Promise((r) => { setTimeout(r, 1000 / messageRate); });
130
+ }
131
+ }
132
+ }
133
+ if (batch < totalBatches - 1) {
134
+ // eslint-disable-next-line no-await-in-loop
135
+ await new Promise((r) => { setTimeout(r, batchInterval * 1000); });
136
+ }
137
+ }
138
+ logger.info('Waiting for responses...');
139
+ await new Promise((r) => { setTimeout(r, Math.min(timeout, 2000)); });
140
+ const duration = Date.now() - startTime;
141
+ const droppedMessages = messagesSent - receivedMessages.length;
142
+ const throughput = (receivedMessages.length / duration) * 1000;
143
+ const errors = [];
144
+ if (droppedMessages > 0) {
145
+ const dropRate = ((droppedMessages / messagesSent) * 100).toFixed(2);
146
+ errors.push(`Dropped ${droppedMessages}/${messagesSent} messages (${dropRate}%)`);
147
+ }
148
+ return {
149
+ success: droppedMessages === 0,
150
+ messagesSent,
151
+ messagesReceived: receivedMessages.length,
152
+ droppedMessages,
153
+ throughput,
154
+ duration,
155
+ errors,
156
+ };
157
+ }
158
+ async function run() {
159
+ try {
160
+ await startServer();
161
+ await startClient();
162
+ startTime = Date.now();
163
+ const result = mode === 'single'
164
+ ? await runSingleTest()
165
+ : await runLoadTest();
166
+ cleanup();
167
+ return result;
168
+ }
169
+ catch (err) {
170
+ cleanup();
171
+ return {
172
+ success: false,
173
+ messagesSent: 0,
174
+ messagesReceived: 0,
175
+ droppedMessages: 0,
176
+ errors: [err instanceof Error ? err.message : String(err)],
177
+ };
178
+ }
179
+ }
180
+ return { run };
181
+ }
182
+ //# sourceMappingURL=testOscUdp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testOscUdp.js","sourceRoot":"","sources":["../../src/osc-test/testOscUdp.ts"],"names":[],"mappings":"AAAA,OAAO,GAAmB,MAAM,KAAK,CAAC;AAGtC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAqBxD,wDAAwD;AACxD,MAAM,UAAU,gBAAgB,CAAE,EAChC,MAAM,EACN,IAAI,EACJ,eAAe,EACf,UAAU,EACV,cAAc,GAAG,SAAS,EAC1B,SAAS,GAAG,KAAK,EACjB,OAAO,GAAG,OAAO,EACjB,IAAI,EACJ,eAAe,EACf,YAAY,EACZ,OAAO,GAAG,IAAI,EACd,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,WAAW,GACU;IACrB,IAAI,MAAM,GAAuB,IAAI,CAAC;IACtC,IAAI,MAAM,GAAuB,IAAI,CAAC;IACtC,MAAM,gBAAgB,GAAsB,EAAE,CAAC;IAC/C,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE3B,SAAS,WAAW;QAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;gBACvB,YAAY,EAAE,cAAc;gBAC5B,SAAS;gBACT,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtB,MAAM,CAAC,IAAI,CAAC,8BAA8B,cAAc,IAAI,SAAS,EAAE,CAAC,CAAC;gBACzE,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,MAAkB,EAAE,EAAE;gBAC1C,gBAAgB,CAAC,IAAI,CAAC;oBACpB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;gBAChC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;gBACnC,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,WAAW;QAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;gBACvB,YAAY,EAAE,cAAc;gBAC5B,SAAS,EAAE,CAAC;gBACZ,aAAa,EAAE,eAAe;gBAC9B,UAAU;gBACV,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtB,MAAM,CAAC,IAAI,CAAC,8BAA8B,eAAe,IAAI,UAAU,EAAE,CAAC,CAAC;gBAC3E,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;gBAChC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,OAAO;QACd,IAAI,MAAM;YAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,MAAM;YAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,UAAU,aAAa;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC;gBACV,OAAO;gBACP,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;gBACrC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,aAAa,CAAC,aAAa,CAAC,CAAC;oBAC7B,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,EAAE,EAAE,CAAC,CAAC;YAEP,UAAU,CAAC,GAAG,EAAE;gBACd,aAAa,CAAC,aAAa,CAAC,CAAC;gBAC7B,OAAO,EAAE,CAAC;YACZ,CAAC,EAAE,OAAO,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,CAAC;gBACf,gBAAgB,EAAE,CAAC;gBACnB,eAAe,EAAE,CAAC;gBAClB,MAAM,EAAE,CAAC,qCAAqC,CAAC;aAChD,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,eAAe,IAAI,OAAO,CAAC;QAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEtF,OAAO;YACL,OAAO,EAAE,UAAU,CAAC,KAAK;YACzB,YAAY,EAAE,CAAC;YACf,gBAAgB,EAAE,CAAC;YACnB,eAAe,EAAE,CAAC;YAClB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAChC,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC;IACJ,CAAC;IAED,KAAK,UAAU,WAAW;QACxB,IAAI,CAAC,gBAAgB,IAAI,CAAC,YAAY,IAAI,CAAC,aAAa,EAAE,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,CAAC;gBACf,gBAAgB,EAAE,CAAC;gBACnB,eAAe,EAAE,CAAC;gBAClB,MAAM,EAAE,CAAC,sEAAsE,CAAC;aACjF,CAAC;QACJ,CAAC;QAED,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,iBAAiB,KAAK,GAAG,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;YAE1D,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,gBAAgB,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;gBACnD,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,IAAI,CAAC;wBACV,OAAO;wBACP,IAAI,EAAE,CAAC;gCACL,IAAI,EAAE,GAAG;gCACT,KAAK,EAAE,UAAU,KAAK,aAAa,GAAG,GAAG,CAAC,EAAE;6BAC7C,CAAC;qBACH,CAAC,CAAC;oBACH,YAAY,IAAI,CAAC,CAAC;oBAElB,IAAI,WAAW,IAAI,GAAG,GAAG,gBAAgB,GAAG,CAAC,EAAE,CAAC;wBAC9C,4CAA4C;wBAC5C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACnE,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,KAAK,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC;gBAC7B,4CAA4C;gBAC5C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,MAAM,eAAe,GAAG,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC;QAC/D,MAAM,UAAU,GAAG,CAAC,gBAAgB,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC;QAE/D,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,CAAC,CAAC,eAAe,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC,WAAW,eAAe,IAAI,YAAY,cAAc,QAAQ,IAAI,CAAC,CAAC;QACpF,CAAC;QAED,OAAO;YACL,OAAO,EAAE,eAAe,KAAK,CAAC;YAC9B,YAAY;YACZ,gBAAgB,EAAE,gBAAgB,CAAC,MAAM;YACzC,eAAe;YACf,UAAU;YACV,QAAQ;YACR,MAAM;SACP,CAAC;IACJ,CAAC;IAED,KAAK,UAAU,GAAG;QAChB,IAAI,CAAC;YACH,MAAM,WAAW,EAAE,CAAC;YACpB,MAAM,WAAW,EAAE,CAAC;YACpB,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,MAAM,MAAM,GAAG,IAAI,KAAK,QAAQ;gBAC9B,CAAC,CAAC,MAAM,aAAa,EAAE;gBACvB,CAAC,CAAC,MAAM,WAAW,EAAE,CAAC;YAExB,OAAO,EAAE,CAAC;YACV,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,CAAC;gBACf,gBAAgB,EAAE,CAAC;gBACnB,eAAe,EAAE,CAAC;gBAClB,MAAM,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;aAC3D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/osc-test/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sndwrks/osc-cli",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Simple OSC command-line tool",
5
5
  "keywords": [
6
6
  "osc",
@@ -34,7 +34,10 @@
34
34
  "start": "node dist/cli.js",
35
35
  "dev": "tsc && node dist/cli.js",
36
36
  "prepublishOnly": "npm run build",
37
- "prepack": "npm run build"
37
+ "prepack": "npm run build",
38
+ "test": "vitest run",
39
+ "test:watch": "vitest",
40
+ "lint": "eslint 'src/**/*.ts' --ignore-pattern 'src/types/'"
38
41
  },
39
42
  "dependencies": {
40
43
  "@sndwrks/lumberjack": "^0.8.0",
@@ -45,9 +48,14 @@
45
48
  "@types/node": "^20.0.0",
46
49
  "@typescript-eslint/eslint-plugin": "^8.50.1",
47
50
  "@typescript-eslint/parser": "^8.34.1",
51
+ "@vitest/coverage-v8": "^4.0.17",
48
52
  "eslint": "^8.57.1",
49
53
  "eslint-config-airbnb-base": "^15.0.0",
50
54
  "eslint-import-resolver-typescript": "^4.4.3",
51
- "typescript": "^5.0.0"
55
+ "typescript": "^5.0.0",
56
+ "vitest": "^4.0.17"
57
+ },
58
+ "engines": {
59
+ "node": ">=20.0.0"
52
60
  }
53
61
  }