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 |
|
21 |
|
22 | if (!this.universes.includes(packet.universe))
|
23 | return;
|
24 | if (this.lastSequence[packet.universe] &&
|
25 | Math.abs(this.lastSequence[packet.universe] - packet.sequence) > 20) {
|
26 | throw new Error(`Packet significantly out of order in universe ${packet.universe} (${this.lastSequence[packet.universe]} -> ${packet.sequence})`);
|
27 | }
|
28 | this.lastSequence[packet.universe] =
|
29 | packet.sequence === 255 ? -1 : packet.sequence;
|
30 | this.emit('packet', packet);
|
31 | }
|
32 | catch (err) {
|
33 | const event = err instanceof assert_1.AssertionError
|
34 | ? 'PacketCorruption'
|
35 | : 'PacketOutOfOrder';
|
36 | this.emit(event, err);
|
37 | }
|
38 | });
|
39 | this.socket.bind(this.port, () => {
|
40 | for (const uni of this.universes) {
|
41 | try {
|
42 | this.socket.addMembership(util_1.multicastGroup(uni), this.iface);
|
43 | }
|
44 | catch (err) {
|
45 | this.emit('error', err);
|
46 | }
|
47 | }
|
48 | });
|
49 | }
|
50 | addUniverse(universe) {
|
51 |
|
52 | if (this.universes.includes(universe))
|
53 | return this;
|
54 | this.socket.addMembership(util_1.multicastGroup(universe), this.iface);
|
55 | this.universes.push(universe);
|
56 | return this;
|
57 | }
|
58 | removeUniverse(universe) {
|
59 |
|
60 | if (!this.universes.includes(universe))
|
61 | return this;
|
62 | this.socket.dropMembership(util_1.multicastGroup(universe), this.iface);
|
63 | this.universes = this.universes.filter((n) => n !== universe);
|
64 | return this;
|
65 | }
|
66 | close(callback) {
|
67 | this.socket.close(callback);
|
68 | return this;
|
69 | }
|
70 | }
|
71 | exports.Receiver = Receiver;
|