UNPKG

1.17 kBPlain TextView Raw
1import { Socket, createSocket } from 'dgram';
2import { multicastGroup } from './util';
3import { Packet, Options } from './packet';
4
5interface Props {
6 universe: number;
7 port?: number;
8 reuseAddr?: boolean;
9}
10
11export class Sender {
12 private socket: Socket;
13
14 private readonly port: Props['port'];
15
16 public readonly universe: Props['universe'];
17
18 private readonly multicastDest: string;
19
20 private sequence = 0;
21
22 constructor({ universe, port = 5568, reuseAddr = false }: Props) {
23 this.port = port;
24 this.universe = universe;
25 this.multicastDest = multicastGroup(universe);
26
27 this.socket = createSocket({ type: 'udp4', reuseAddr });
28 }
29
30 public send(packet: Omit<Options, 'sequence' | 'universe'>): Promise<void> {
31 return new Promise((resolve, reject) => {
32 const { buffer } = new Packet({
33 ...packet,
34 universe: this.universe,
35 sequence: this.sequence,
36 });
37 this.sequence = (this.sequence + 1) % 256;
38 this.socket.send(buffer, this.port, this.multicastDest, (err) =>
39 err ? reject(err) : resolve(),
40 );
41 });
42 }
43
44 public close(): this {
45 this.socket.close();
46 return this;
47 }
48}