@sndwrks/osc-cli 1.0.3 → 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.
@@ -0,0 +1,19 @@
1
+ // eslint-disable-next-line import/prefer-default-export
2
+ export function argsToTypedArgs(args) {
3
+ return args.map((arg) => {
4
+ let type = 's';
5
+ let value = arg;
6
+ const num = parseFloat(arg);
7
+ if (!Number.isNaN(num)) {
8
+ value = num;
9
+ if (arg.includes('.')) {
10
+ type = 'f';
11
+ }
12
+ else {
13
+ type = 'i';
14
+ }
15
+ }
16
+ return { type, value };
17
+ });
18
+ }
19
+ //# sourceMappingURL=utilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilities.js","sourceRoot":"","sources":["../../src/osc-senders/utilities.ts"],"names":[],"mappings":"AAEA,wDAAwD;AACxD,MAAM,UAAU,eAAe,CAAE,IAAc;IAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,IAAI,IAAI,GAAG,GAAG,CAAC;QACf,IAAI,KAAK,GAAoB,GAAG,CAAC;QACjC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,GAAG,GAAG,CAAC;YACZ,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,IAAI,GAAG,GAAG,CAAC;YACb,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,GAAG,CAAC;YACb,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,24 @@
1
+ import osc from 'osc';
2
+ import * as net from 'node:net';
3
+ // eslint-disable-next-line import/prefer-default-export
4
+ export function startTcpServer(logger, ipAddress = '0.0.0.0', port = 51001) {
5
+ const tcpServer = net.createServer((socket) => {
6
+ const tcpPort = new osc.TCPSocketPort({
7
+ socket,
8
+ metadata: true,
9
+ });
10
+ tcpPort.on('message', (oscMsg) => {
11
+ logger.info('--tcp osc-- Address: %o Arguments: %o', oscMsg.address, oscMsg.args);
12
+ });
13
+ tcpPort.on('error', (err) => {
14
+ logger.error('TCP Error:', err);
15
+ });
16
+ });
17
+ tcpServer.on('error', (e) => {
18
+ logger.error(e);
19
+ });
20
+ tcpServer.listen(port, ipAddress, () => {
21
+ logger.info(`Listening for OSC over TCP on IP Address: ${ipAddress} Port: ${port}`);
22
+ });
23
+ }
24
+ //# sourceMappingURL=tcpServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcpServer.js","sourceRoot":"","sources":["../../src/osc-servers/tcpServer.ts"],"names":[],"mappings":"AAAA,OAAO,GAAmB,MAAM,KAAK,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAIhC,wDAAwD;AACxD,MAAM,UAAU,cAAc,CAAE,MAAc,EAAE,YAAoB,SAAS,EAAE,OAAe,KAAK;IACjG,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC;YACpC,MAAM;YACN,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,MAAkB,EAAE,EAAE;YAC3C,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YACjC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,IAAI,CAAC,6CAA6C,SAAS,UAAU,IAAI,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,21 @@
1
+ import osc from 'osc';
2
+ // eslint-disable-next-line import/prefer-default-export
3
+ export function startUdpServer(logger, ipAddress = '0.0.0.0', port = 51000) {
4
+ const udpPort = new osc.UDPPort({
5
+ localAddress: ipAddress,
6
+ localPort: port,
7
+ metadata: true,
8
+ });
9
+ udpPort.on('ready', () => {
10
+ logger.info(`Listening for OSC over UDP on IP Address: ${ipAddress} Port: ${port}`);
11
+ });
12
+ udpPort.on('message', (oscMsg) => {
13
+ logger.info('--udp osc-- Address: %o Arguments: %o', oscMsg.address, oscMsg.args);
14
+ });
15
+ udpPort.on('error', (err) => {
16
+ logger.error('UDP Error:', err);
17
+ });
18
+ udpPort.open();
19
+ return udpPort;
20
+ }
21
+ //# sourceMappingURL=udpServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"udpServer.js","sourceRoot":"","sources":["../../src/osc-servers/udpServer.ts"],"names":[],"mappings":"AAAA,OAAO,GAAmB,MAAM,KAAK,CAAC;AAGtC,wDAAwD;AACxD,MAAM,UAAU,cAAc,CAAE,MAAc,EAAE,YAAoB,SAAS,EAAE,OAAe,KAAK;IACjG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;QAC9B,YAAY,EAAE,SAAS;QACvB,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACvB,MAAM,CAAC,IAAI,CAAC,6CAA6C,SAAS,UAAU,IAAI,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,MAAkB,EAAE,EAAE;QAC3C,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;QACjC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -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":"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"}
@@ -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.0.3",
3
+ "version": "1.3.0",
4
4
  "description": "Simple OSC command-line tool",
5
5
  "keywords": [
6
6
  "osc",
@@ -34,19 +34,28 @@
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",
44
+ "commander": "^14.0.2",
41
45
  "osc": "^2.4.5"
42
46
  },
43
47
  "devDependencies": {
44
48
  "@types/node": "^20.0.0",
45
- "typescript": "^5.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
- "eslint-import-resolver-typescript": "^4.4.3"
54
+ "eslint-import-resolver-typescript": "^4.4.3",
55
+ "typescript": "^5.0.0",
56
+ "vitest": "^4.0.17"
57
+ },
58
+ "engines": {
59
+ "node": ">=20.0.0"
51
60
  }
52
61
  }