-
Notifications
You must be signed in to change notification settings - Fork 0
/
Server.js
71 lines (58 loc) · 2.29 KB
/
Server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
var Packet = require('./Packet');
var NetworkNode = require('./NetworkNode');
var GLOBAL_INQUEUE = document.getElementById('inqueue');
function increaseINQEUE() {
GLOBAL_INQUEUE.innerText = parseInt(GLOBAL_INQUEUE.innerText) + 1;
}
function decreaseINQEUE() {
GLOBAL_INQUEUE.innerText = parseInt(GLOBAL_INQUEUE.innerText) - 1;
}
class Server extends NetworkNode {
constructor(processTime = 500) {
super(null);
this.label = "Server";
this.interfaces = {};
this.processTime = processTime;
this.logicalInterfaces = {};
}
join(node, id) {
super.join(node, id);
this.logicalInterfaces[id] = {
queue: [],
timer: null,
out: this.interfaces[id],
}
}
receive(data, input) {
if(data.data != "###") {
console.log(`Received '${data.data}' from ${data.from.label}`);
var ifc = this.logicalInterfaces[data.from.label];
ifc.queue.push(data); // dodanie pakietu do kolejki na porcie wychodzącym
increaseINQEUE();
if(ifc.timer == null) {
// ustawienie demona który będzie wypluwał pakiety które otrzymał na danym interfejsie
// do odpowiednich interfejsów wychodzacych
ifc.timer = setInterval(() => {
// Ta pętla wywołuje się co "this.processTime" milisekund
// Sprawdzam czy łącze jest puste
if(ifc.out.data == null) {
var packet = ifc.queue.shift();
decreaseINQEUE();
var recipient = packet.to;
// wyslij pakiet na logicznym porcie
// ktory prowadzi do komputera koncowego
this.send(recipient.label, packet);
if(ifc.queue.length < 1) {
// jesli nie ma juz pakietow do wyslania, zabij demona
clearInterval(ifc.timer);
ifc.timer = null;
}
}
}, this.processTime);
}
} else {
console.error("Server detected collision");
}
}
}
module.exports = Server;