UNPKG

2.65 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 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); // emit errors from socket.addMembership
42 }
43 }
44 });
45 }
46 addUniverse(universe) {
47 // already listening to this one; do nothing
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 // not listening to this one; do nothing
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}
67exports.Receiver = Receiver;