UNPKG

@remote.it/core

Version:

Core remote.it JavasScript/TypeScript library

60 lines (47 loc) 1.42 kB
import debug from 'debug' import dgram from 'dgram' import { EventEmitter } from 'events' const d = debug('remoteit:UDPListener') export interface UDPListener { on(msg: 'ready', cb: () => void): this on(msg: 'message', cb: (message: string) => void): this on(msg: 'error', cb: (error: string) => void): this on(msg: 'closed', cb: () => void): this } export class UDPListener extends EventEmitter { private server: dgram.Socket constructor(public port: number) { super() this.server = dgram.createSocket('udp4') this.server.on('error', this.handleError) this.server.on('message', this.handleMessage) this.server.on('listening', this.handleListening) } listen() { this.server.bind(this.port) this.emit('ready') } close() { this.server.close() this.emit('closed') } get address() { return this.server.address() } private handleError = (err: Error) => { this.emit('error', err) d(`server error:\n${err.stack}`) this.close() } private handleMessage = ( msg: string | Buffer, rinfo: { address: string; port: number } ) => { d(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`) this.emit('message', msg.toString('utf8')) } private handleListening = () => { if (!this.address || typeof this.address === 'string') return d(`server listening ${this.address.address}:${this.address.port}`) } }