@2bit/osc
Version:
osc client/server written by typescript
100 lines • 7.85 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const oscmin = require("osc-min");
const dgram_1 = __importDefault(require("dgram"));
const events_1 = require("events");
function make_args(args) {
const values = args.map(arg => arg.value);
values.raw = args;
return values;
}
class Server extends events_1.EventEmitter {
constructor(port, options = {}) {
var _a, _b;
super();
this.port = port;
this.options = {
host: (_a = options.host) !== null && _a !== void 0 ? _a : '0.0.0.0',
strict_mode: (_b = options.strict_mode) !== null && _b !== void 0 ? _b : true
};
this.socket = dgram_1.default.createSocket({
type: 'udp4',
});
this.addListeners();
this.socket.bind(port, this.options.host, () => {
this.emit('bind', false);
});
this.socket.on('error', (err) => {
super.emit('error', err);
const e = err;
if (e.code && e.code == 'EADDRINUSE') {
this.socket.removeAllListeners();
this.socket.close(() => {
console.warn(`WARNING: does port ${port} be binded by another program?
please check it.
this program will try to bind with "reuseAddr: true".
will receive data when port ${port} has become free.`);
this.bindWithReuseAddr();
});
}
});
}
bindWithReuseAddr() {
this.socket = dgram_1.default.createSocket({
type: 'udp4',
reuseAddr: true
});
this.addListeners();
this.socket.bind(this.port, this.options.host, () => {
this.emit('bind', true);
});
}
addListeners() {
this.socket.on('listening', () => {
this.emit('listening');
});
this.socket.on('error', (err) => {
this.emit('error', err);
});
this.socket.on('message', (buffer, rinfo) => {
try {
const message = oscmin.fromBuffer(buffer, this.options.strict_mode !== undefined ? this.options.strict_mode : true);
if (message.oscType == 'bundle') {
super.emit('bundle', message, rinfo);
this.emitBundle(message, rinfo);
}
else {
this.emitMessage(message, rinfo);
}
}
catch (err) {
this.emit('parse_error', err, buffer, rinfo);
}
});
}
emitMessage(message, rinfo) {
this.emit('message', message.address, make_args(message.args), rinfo);
this.emit(message.address, make_args(message.args), rinfo);
if (this.listenerCount(message.address) == 0) {
this.emit('leaked', message.address, make_args(message.args), rinfo);
}
}
emitBundle(bundle, rinfo) {
for (const m of bundle.elements) {
if (m.oscType == 'bundle') {
this.emitBundle(m, rinfo);
}
else {
this.emitMessage(m, rinfo);
}
}
}
on(event, listener) {
return super.on(event, listener);
}
}
exports.default = Server;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLGtDQUFtQztBQUVuQyxrREFBMEI7QUFDMUIsbUNBQXNDO0FBY3RDLFNBQVMsU0FBUyxDQUFDLElBQTBCO0lBQ3pDLE1BQU0sTUFBTSxHQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7SUFDbEIsT0FBTyxNQUF1QixDQUFDO0FBQ25DLENBQUM7QUFhRCxNQUFxQixNQUduQixTQUFRLHFCQUFZO0lBR2xCLFlBQTRCLElBQVksRUFDNUIsVUFBbUMsRUFBRTs7UUFFN0MsS0FBSyxFQUFFLENBQUM7UUFIZ0IsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUlwQyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ1gsSUFBSSxFQUFFLE1BQUEsT0FBTyxDQUFDLElBQUksbUNBQUksU0FBUztZQUMvQixXQUFXLEVBQUUsTUFBQSxPQUFPLENBQUMsV0FBVyxtQ0FBSSxJQUFJO1NBQzNDLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxHQUFHLGVBQUssQ0FBQyxZQUFZLENBQUM7WUFDN0IsSUFBSSxFQUFFLE1BQU07U0FDZixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtZQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQVUsRUFBRSxFQUFF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