// tslint:disable:no-any import { PromiseDelegate } from '@regax/common' import { StickyServer, ApplicationOpts, Application } from '../api' import { DEFAULT_UDP_TYPE } from './udpConnector' import Master from '../component/master' import { Socket } from 'dgram' const dgram = require('dgram') export const STICKY_SERVER = 'regax:sticky-server' export class UDPStickyServer implements StickyServer { protected server: Socket constructor( protected port: number, protected app: Application, ) { } start(): Promise<void> { const p = new PromiseDelegate<void>() const opts = this.app.getConfig<ApplicationOpts['udpConnector'] & {}>('udpConnector') || {} const server = this.server = dgram.createSocket(opts.udpType || DEFAULT_UDP_TYPE) server.on('listening', () => { this.app.get<Master>('master') .getStickyWorkers('udp') .forEach(worker => { worker.send(STICKY_SERVER, server) }) p.resolve() }) server.bind(this.port) return p.promise } async stop(): Promise<void> { this.server.close() } }