From 19b3424971e5196a183dce5d111766bd796daba7 Mon Sep 17 00:00:00 2001 From: Rik Berkelder Date: Sat, 23 Jan 2021 21:22:11 +0100 Subject: [PATCH] split into separate client and server for sending/listening --- .gitlab-ci.yml | 2 +- package.json | 2 +- src/index.ts | 1 + src/oscClient.ts | 67 +++++------------------------------------------- src/oscServer.ts | 52 +++++++++++++++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 62 deletions(-) create mode 100644 src/oscServer.ts diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1d91519..0fd2474 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -37,7 +37,7 @@ pages: paths: - public -publish: +npm_publish: stage: deploy allow_failure: true only: diff --git a/package.json b/package.json index 2b572e6..f0068e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-osc", - "version": "0.1.2", + "version": "0.2.0", "description": "Fully TypeScript-native OSC Client based on osc-min", "main": "./lib/index.js", "types": "./lib/index.d.ts", diff --git a/src/index.ts b/src/index.ts index 9b54bcd..14d58ea 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,3 @@ export * from './oscClient'; +export * from './oscServer'; export { OSCType, OSCArgumentType } from 'osc-min'; diff --git a/src/oscClient.ts b/src/oscClient.ts index 1551983..b548a74 100644 --- a/src/oscClient.ts +++ b/src/oscClient.ts @@ -2,79 +2,26 @@ import * as dgram from 'dgram'; import { OSCArgument, OSCType, toBuffer, fromBuffer, OSCArgumentType } from 'osc-min'; import { EventEmitter } from 'events'; -export interface OSCClientOptions { - /** host to output OSC data to */ - outHost: string; - /** port to output OSC data to */ - outPort: number; - /** Local port for incoming OSC messages */ - inPort?: number; -} - -export interface ReceivedOSCMessage { - address: string; - type: T; - value: OSCArgumentType; -} - -// declare types for events -export declare interface OSCClient { - /** - Emitted whenever an OSC message is received on inPort - @event - */ - on(event: 'message', listener: (message: ReceivedOSCMessage) => void): this; - - /** - Emitted when OSC client is listening on inPort - @event - */ - on(event: 'listening', listener: () => void): this; -} - /** * OSC Client base class, handles sending and receiving OSC messages ``` - const osc = new OSCClient({ - outHost: "192.168.0.68", - outPort: 8000, - inPort: 8000 - }) + const osc = new OSCClient("192.168.0.44", 8000) ``` */ export class OSCClient extends EventEmitter { private socket: dgram.Socket; - private options: OSCClientOptions; - constructor(options: OSCClientOptions) { + private host: string; + private port: number; + constructor(host: string, port: number) { super(); + this.host = host; + this.port = port; this.socket = dgram.createSocket({ type: 'udp4', reuseAddr: true }); - this.options = options; - - if (options.inPort) { - this.socket.bind(options.inPort); - } - - this.socket.on('listening', () => { - this.emit('listening'); - }); - - this.socket.on('message', (msg) => { - const decoded = fromBuffer(msg); - if (decoded.oscType === 'message') { - decoded.args.forEach((arg) => { - this.emit('message', { - address: decoded.address, - type: arg.type, - value: arg.value, - }); - }); - } - }); } private sendPacket(packet: Buffer): void { - this.socket.send(packet, 0, packet.length, this.options.outPort, this.options.outHost); + this.socket.send(packet, 0, packet.length, this.port, this.host); } /** diff --git a/src/oscServer.ts b/src/oscServer.ts new file mode 100644 index 0000000..09be21f --- /dev/null +++ b/src/oscServer.ts @@ -0,0 +1,52 @@ +import EventEmitter = require("events"); +import * as dgram from 'dgram'; +import { OSCType, OSCArgumentType, fromBuffer } from "osc-min"; + +export interface ReceivedOSCMessage { + address: string; + type: T; + value: OSCArgumentType; +} + +// declare types for events +export declare interface OSCServer { + /** + Emitted whenever an OSC message is received on inPort + @event + */ + on(event: 'message', listener: (message: ReceivedOSCMessage) => void): this; + + /** + Emitted when OSC client is listening on inPort + @event + */ + on(event: 'listening', listener: () => void): this; +} + +export class OSCServer extends EventEmitter { + private socket: dgram.Socket; + + constructor(address: string, port: number){ + super(); + + this.socket = dgram.createSocket({ type: 'udp4', reuseAddr: true }); + this.socket.bind(port, address); + + this.socket.on('listening', () => { + this.emit('listening'); + }); + + this.socket.on('message', (msg) => { + const decoded = fromBuffer(msg); + if (decoded.oscType === 'message') { + decoded.args.forEach((arg) => { + this.emit('message', { + address: decoded.address, + type: arg.type, + value: arg.value, + }); + }); + } + }); + } +}