1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.Receiver = void 0;
|
4 | const dgram_1 = require("dgram");
|
5 | const events_1 = require("events");
|
6 | const assert_1 = require("assert");
|
7 | const packet_1 = require("./packet");
|
8 | const util_1 = require("./util");
|
9 | class Receiver extends events_1.EventEmitter {
|
10 | constructor({ universes = [1], port = 5568, iface = undefined, reuseAddr = false, }) {
|
11 | super();
|
12 | this.universes = universes;
|
13 | this.port = port;
|
14 | this.iface = iface;
|
15 | this.socket = dgram_1.createSocket({ type: 'udp4', reuseAddr });
|
16 | this.lastSequence = {};
|
17 | this.socket.on('message', (msg, rinfo) => {
|
18 | try {
|
19 | const packet = new packet_1.Packet(msg, rinfo.address);
|
20 | if (this.lastSequence[packet.universe] &&
|
21 | Math.abs(this.lastSequence[packet.universe] - packet.sequence) > 20) {
|
22 | throw new Error(`Packet significantly out of order in universe ${packet.universe} (${this.lastSequence[packet.universe]} -> ${packet.sequence})`);
|
23 | }
|
24 | this.lastSequence[packet.universe] =
|
25 | packet.sequence === 255 ? -1 : packet.sequence;
|
26 | this.emit('packet', packet);
|
27 | }
|
28 | catch (err) {
|
29 | const event = err instanceof assert_1.AssertionError
|
30 | ? 'PacketCorruption'
|
31 | : 'PacketOutOfOrder';
|
32 | this.emit(event, err);
|
33 | }
|
34 | });
|
35 | this.socket.bind(this.port, () => {
|
36 | for (const uni of this.universes) {
|
37 | try {
|
38 | this.socket.addMembership(util_1.multicastGroup(uni), this.iface);
|
39 | }
|
40 | catch (err) {
|
41 | this.emit('error', err);
|
42 | }
|
43 | }
|
44 | });
|
45 | }
|
46 | addUniverse(universe) {
|
47 |
|
48 | if (this.universes.includes(universe))
|
49 | return this;
|
50 | this.socket.addMembership(util_1.multicastGroup(universe), this.iface);
|
51 | this.universes.push(universe);
|
52 | return this;
|
53 | }
|
54 | removeUniverse(universe) {
|
55 |
|
56 | if (!this.universes.includes(universe))
|
57 | return this;
|
58 | this.socket.dropMembership(util_1.multicastGroup(universe), this.iface);
|
59 | this.universes = this.universes.filter((n) => n !== universe);
|
60 | return this;
|
61 | }
|
62 | close() {
|
63 | this.socket.close();
|
64 | return this;
|
65 | }
|
66 | }
|
67 | exports.Receiver = Receiver;
|