@showbridge/lib
Version:
Main library for showbridge protocol router
75 lines (74 loc) • 2.44 kB
JavaScript
import { createSocket } from 'dgram';
import { fromBuffer } from 'osc-min';
import { OSCMessage, UDPMessage } from '../messages/index.js';
import { disabled, logger } from '../utils/index.js';
import Protocol from './protocol.js';
class UDPProtocol extends Protocol {
constructor() {
super(...arguments);
this.oscBundleTag = Buffer.from('#bundle');
}
reload(params) {
if (this.server !== undefined) {
this.server.close();
delete this.server;
}
this.server = createSocket('udp4');
this.server.bind({
address: params.address ? params.address : '0.0.0.0',
port: params.port,
}, () => {
this.stopped = false;
logger.debug(`udp: server setup on port ${this.server.address().address}:${this.server.address().port}`);
this.server.on('message', (msg, rinfo) => {
const sender = {
protocol: 'udp',
address: rinfo.address,
port: rinfo.port,
};
let message;
// NOTE(jwetzell): starts with a '/' or #bundle
if (msg[0] === 0x2f || msg.includes(this.oscBundleTag)) {
try {
message = new OSCMessage(fromBuffer(msg, true), sender);
}
catch (error) {
message = new UDPMessage(msg, sender);
}
}
else {
message = new UDPMessage(msg, sender);
}
this.emit('messageIn', message);
});
this.emit('started');
});
this.server.on('close', () => {
this.stopped = true;
this.emit('stopped');
});
}
send(msg, port, host) {
if (this.server === undefined) {
logger.error('udp: server no longer exists');
return;
}
this.server.send(msg, port, host);
}
stop() {
if (this.server) {
this.server.close();
}
else {
this.emit('stopped');
}
}
get status() {
return {
enabled: !disabled.protocols.has('udp'),
listening: !this.stopped,
address: this.server ? this.server.address() : {},
};
}
}
export default UDPProtocol;