@remote.it/core
Version:
Core remote.it JavasScript/TypeScript library
60 lines (47 loc) • 1.42 kB
text/typescript
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}`)
}
}