node-osc
Version:
pyOSC inspired library for sending and receiving OSC messages
402 lines (329 loc) • 9.16 kB
JavaScript
import { once } from 'node:events';
import { test } from 'tap';
import { Server, Client, Message } from 'node-osc';
function round(num) {
return Math.round(num * 100) / 100;
}
test('message: basic usage', async (t) => {
const server = new Server(0, '127.0.0.1');
await once(server, 'listening');
const client = new Client('127.0.0.1', server.port);
t.plan(1);
t.teardown(async () => {
await server.close();
await client.close();
});
const m = new Message('/address');
m.append('testing');
m.append(123);
m.append([456, 789]);
server.on('message', (msg) => {
const expected = ['/address', 'testing', 123, 456, 789];
t.same(msg, expected, `We reveived the payload: ${msg}`);
});
client.send(m);
});
test('message: multiple args', async (t) => {
const server = new Server(0, '127.0.0.1');
await once(server, 'listening');
const client = new Client('127.0.0.1', server.port);
t.plan(1);
t.teardown(async () => {
await server.close();
await client.close();
});
const m = new Message('/address', 'testing', 123, true);
server.on('message', (msg) => {
const expected = ['/address', 'testing', 123, true];
t.same(msg, expected, `We reveived the payload: ${msg}`);
});
client.send(m);
});
test('message: object', async (t) => {
const server = new Server(0, '127.0.0.1');
await once(server, 'listening');
const client = new Client('127.0.0.1', server.port);
t.plan(1);
t.teardown(async () => {
await server.close();
await client.close();
});
const m = new Message('/address');
m.append({
type: 'string',
value: 'test'
});
m.append({
type: 'double',
value: 100
});
server.on('message', (msg) => {
const expected = ['/address', 'test', 100];
t.same(msg, expected, `We reveived the payload: ${msg}`);
});
client.send(m);
});
test('message: float', async (t) => {
const server = new Server(0, '127.0.0.1');
await once(server, 'listening');
const client = new Client('127.0.0.1', server.port);
t.plan(2);
t.teardown(async () => {
await server.close();
await client.close();
});
const m = new Message('/address');
m.append(3.14);
server.on('message', (msg) => {
const expected = [
'/address',
3.14
];
t.equal(msg[0], expected[0], `We reveived the payload: ${msg}`);
t.equal(round(msg[1]), expected[1], 'pie please');
});
client.send(m);
});
test('message: alias messages', async (t) => {
const server = new Server(0, '127.0.0.1');
await once(server, 'listening');
const client = new Client('127.0.0.1', server.port);
t.plan(5);
t.teardown(async () => {
await server.close();
await client.close();
});
const m = new Message('/address');
m.append({
type: 'i',
value: 123
});
m.append({
type: 'f',
value: 3.14
});
server.on('message', (msg) => {
const expected = [
'/address',
123,
3.14
];
t.equal(msg[0], expected[0], `We reveived the payload: ${msg}`);
t.equal(msg[1], expected[1], 'easy as abc');
t.ok(Number.isInteger(msg[1]), 'the first value is an int');
t.equal(round(msg[2]), expected[2], 'pie please');
t.ok(msg[2] % 1 !== 0, 'the second value is a float');
});
client.send(m);
});
test('message: boolean', async (t) => {
const server = new Server(0, '127.0.0.1');
await once(server, 'listening');
t.plan(1);
t.teardown(async () => {
await server.close();
await client.close();
});
const client = new Client('127.0.0.1', server.port);
const m = new Message('/address');
m.append(true);
server.on('message', (msg) => {
const expected = [
'/address',
true
];
t.same(msg, expected, `We reveived the payload: ${msg}`);
});
client.send(m);
});
test('message: blob', async (t) => {
const server = new Server(0, '127.0.0.1');
await once(server, 'listening');
const client = new Client('127.0.0.1', server.port);
t.plan(1);
t.teardown(async () => {
await server.close();
await client.close();
});
const m = new Message('/address');
const buf = Buffer.from('test');
m.append({
type: 'blob',
value: buf
});
server.on('message', (msg) => {
const expected = [
'/address',
buf
];
t.same(msg, expected, `We reveived the payload: ${msg}`);
});
client.send(m);
});
test('message: Buffer as blob', async (t) => {
const server = new Server(0, '127.0.0.1');
await once(server, 'listening');
const client = new Client('127.0.0.1', server.port);
t.plan(1);
t.teardown(async () => {
await server.close();
await client.close();
});
const m = new Message('/address');
const buf = Buffer.from('test buffer data');
// Directly append Buffer without wrapping in object
m.append(buf);
server.on('message', (msg) => {
const expected = [
'/address',
buf
];
t.same(msg, expected, `We received the buffer payload: ${msg}`);
});
client.send(m);
});
// test('message: timetag', (t) => {
// const oscServer = new osc.Server(3333, '127.0.0.1');
// const client = new osc.Client('127.0.0.1', 3333);
// const m = new osc.Message('/address');
//
// oscServer.on('message', (msg) => {
// const expected = [
// '/address'
// ];
// t.same(msg, expected, `We reveived the payload: ${msg}`);
// oscServer.close();
// t.end();
// });
//
// client.send(m, () => {
// client.close();
// });
// });
test('message: Buffer with multiple arguments', async (t) => {
const server = new Server(0, '127.0.0.1');
await once(server, 'listening');
const client = new Client('127.0.0.1', server.port);
t.plan(6);
t.teardown(async () => {
await server.close();
await client.close();
});
const m = new Message('/address');
const buf1 = Buffer.from('first');
const buf2 = Buffer.from('second');
m.append('string');
m.append(42);
m.append(buf1);
m.append(3.14);
m.append(buf2);
server.on('message', (msg) => {
t.equal(msg[0], '/address', 'Address matches');
t.equal(msg[1], 'string', 'String matches');
t.equal(msg[2], 42, 'Integer matches');
t.same(msg[3], buf1, 'First buffer matches');
t.equal(round(msg[4]), 3.14, 'Float matches');
t.same(msg[5], buf2, 'Second buffer matches')
});
client.send(m);
});
test('message: Buffer in constructor', async (t) => {
const server = new Server(0, '127.0.0.1');
await once(server, 'listening');
const client = new Client('127.0.0.1', server.port);
t.plan(1);
t.teardown(async () => {
await server.close();
await client.close();
});
const buf = Buffer.from('constructor buffer');
const m = new Message('/address', 'test', buf, 123);
server.on('message', (msg) => {
const expected = [
'/address',
'test',
buf,
123
];
t.same(msg, expected, `We received the constructor buffer payload: ${msg}`);
});
client.send(m);
});
test('message: Buffer in array', async (t) => {
const server = new Server(0, '127.0.0.1');
await once(server, 'listening');
const client = new Client('127.0.0.1', server.port);
t.plan(1);
t.teardown(async () => {
await server.close();
await client.close();
});
const m = new Message('/address');
const buf1 = Buffer.from('array1');
const buf2 = Buffer.from('array2');
m.append([buf1, 'string', buf2, 456]);
server.on('message', (msg) => {
const expected = [
'/address',
buf1,
'string',
buf2,
456
];
t.same(msg, expected, `We received the array with buffers: ${msg}`);
});
client.send(m);
});
test('message: empty Buffer', async (t) => {
const server = new Server(0, '127.0.0.1');
await once(server, 'listening');
const client = new Client('127.0.0.1', server.port);
t.plan(1);
t.teardown(async () => {
await server.close();
await client.close();
});
const m = new Message('/address');
const buf = Buffer.from('');
m.append(buf);
server.on('message', (msg) => {
const expected = [
'/address',
buf
];
t.same(msg, expected, `We received the empty buffer: ${msg}`);
});
client.send(m);
});
test('message: large Buffer', async (t) => {
const server = new Server(0, '127.0.0.1');
await once(server, 'listening');
const client = new Client('127.0.0.1', server.port);
t.plan(4);
t.teardown(async () => {
await server.close();
await client.close();
});
const m = new Message('/address');
const buf = Buffer.alloc(1024, 'x');
m.append(buf);
server.on('message', (msg) => {
t.equal(msg[0], '/address', 'Address matches');
t.ok(Buffer.isBuffer(msg[1]), 'Second element is a Buffer');
t.equal(msg[1].length, 1024, 'Buffer size matches');
t.same(msg[1], buf, 'Buffer content matches');
});
client.send(m);
});
test('message: error', (t) => {
const m = new Message('/address');
t.plan(2);
t.throws(() => {
m.append({
lol: 'it broken'
});
}, /don't know how to encode object/);
t.throws(() => {
m.append(undefined);
}, /don't know how to encode/);
});