1 | import { Socket, createSocket } from 'dgram';
|
2 | import { multicastGroup } from './util';
|
3 | import { Packet, Options } from './packet';
|
4 |
|
5 | interface Props {
|
6 | universe: number;
|
7 | port?: number;
|
8 | reuseAddr?: boolean;
|
9 | }
|
10 |
|
11 | export 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 | }
|