UNPKG

2.89 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.Receiver = void 0;
4const dgram_1 = require("dgram");
5const events_1 = require("events");
6const assert_1 = require("assert");
7const packet_1 = require("./packet");
8const util_1 = require("./util");
9class 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 // somehow we received a packet for a universe we're not listening to
21 // silently drop this packet
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); // emit errors from socket.addMembership
46 }
47 }
48 });
49 }
50 addUniverse(universe) {
51 // already listening to this one; do nothing
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 // not listening to this one; do nothing
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}
71exports.Receiver = Receiver;