Skip to content

Commit dedc981

Browse files
committed
Configured Sonar static code analyzer
1 parent 381ce05 commit dedc981

7 files changed

Lines changed: 133 additions & 109 deletions

File tree

lib/fast-tracker.ts

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ export class FastTracker implements Tracker {
6262
}
6363

6464
private processAnnounce(json: any, peer: InternalPeerContext, completed: boolean = false) {
65-
const infoHash: string = json.info_hash;
66-
const peerId: string = json.peer_id;
65+
const infoHash = json.info_hash;
66+
const peerId = json.peer_id;
6767

6868
let swarmContext: SwarmContext | undefined;
6969

@@ -82,28 +82,7 @@ export class FastTracker implements Tracker {
8282
}
8383

8484
if (swarmContext === undefined) {
85-
let swarm = this.swarms.get(infoHash);
86-
87-
if (swarm === undefined) {
88-
if (typeof infoHash !== "string") {
89-
throw new TrackerError("announce: info_hash field is missing or wrong");
90-
}
91-
92-
ldebug(() => ["announce: swarm created:", Buffer.from(infoHash).toString("hex")]);
93-
swarm = new Swarm(infoHash);
94-
this.swarms.set(infoHash, swarm);
95-
}
96-
97-
ldebug(() => ["announce: peer", Buffer.from(peerId).toString("hex"), "added to swarm", Buffer.from(infoHash).toString("hex")]);
98-
99-
const previousPeer = swarm.peers.get(peerId);
100-
if (previousPeer !== undefined) {
101-
removePeerFromSwarm(previousPeer, infoHash);
102-
}
103-
104-
swarm.addPeer(peer);
105-
swarmContext = { completed: false, swarm: swarm };
106-
peer.swarms!.push(swarmContext);
85+
swarmContext = this.addPeerToSwarm(peer, infoHash);
10786
}
10887

10988
const swarm = swarmContext.swarm;
@@ -122,49 +101,70 @@ export class FastTracker implements Tracker {
122101
incomplete: swarm.peers.size - swarm.completedCount
123102
});
124103

125-
const offers: any[] | undefined = json.offers;
126-
if (offers == undefined) {
104+
this.sendOffersToPeers(json, swarmPeers, peer, infoHash);
105+
}
106+
107+
private addPeerToSwarm(peer: InternalPeerContext, infoHash: any) {
108+
let swarm = this.swarms.get(infoHash);
109+
110+
if (swarm === undefined) {
111+
if (typeof infoHash !== "string") {
112+
throw new TrackerError("announce: info_hash field is missing or wrong");
113+
}
114+
115+
ldebug(() => ["announce: swarm created:", Buffer.from(infoHash).toString("hex")]);
116+
swarm = new Swarm(infoHash);
117+
this.swarms.set(infoHash, swarm);
118+
}
119+
120+
ldebug(() => ["announce: peer", Buffer.from(peer.id!).toString("hex"), "added to swarm", Buffer.from(infoHash).toString("hex")]);
121+
122+
const previousPeer = swarm.peers.get(peer.id!);
123+
if (previousPeer !== undefined) {
124+
removePeerFromSwarm(previousPeer, infoHash);
125+
}
126+
127+
swarm.addPeer(peer);
128+
const swarmContext = { completed: false, swarm: swarm };
129+
peer.swarms!.push(swarmContext);
130+
131+
return swarmContext;
132+
}
133+
134+
private sendOffersToPeers(json: any, peers: ReadonlyArray<InternalPeerContext>, peer: InternalPeerContext, infoHash: string) {
135+
if (peers.length <= 1) {
127136
return;
128-
} else if (!(offers instanceof Array)) {
129-
throw new TrackerError("announce: offers field is not an array");
130137
}
131138

132-
if (swarmPeers.length <= 1) {
139+
const offers: any = json.offers;
140+
if (offers == undefined) {
133141
return;
142+
} else if (!(offers instanceof Array)) {
143+
throw new TrackerError("announce: offers field is not an array");
134144
}
135145

136146
const numwant = json.numwant;
137147
if (!Number.isInteger(numwant)) {
138148
return;
139149
}
140150

141-
const countPeersToSend = swarmPeers.length - 1;
151+
const countPeersToSend = peers.length - 1;
142152
const countOffersToSend = Math.min(countPeersToSend, offers.length, this.settings.maxOffers, numwant);
143153

144-
if (countOffersToSend == countPeersToSend) {
145-
// we have offers for all the peers from the swarm - send offers to all
146-
const offersIterator = offers.values();
147-
for (const toPeer of swarmPeers) {
148-
if (toPeer !== peer) {
149-
sendOffer(offersIterator.next().value, peerId, toPeer, infoHash);
150-
}
151-
}
152-
} else {
153-
let peerIndex = Math.floor(Math.random() * swarmPeers.length);
154-
// send offers to random peers
155-
for (let i = 0; i < countOffersToSend; i++) {
156-
const toPeer = swarmPeers[peerIndex];
154+
let peerIndex = (countOffersToSend == countPeersToSend) ? 0 : Math.floor(Math.random() * peers.length);
157155

158-
if (toPeer === peer) {
159-
i--; // do one more iteration
160-
} else {
161-
sendOffer(offers[i], peerId, toPeer, infoHash);
162-
}
156+
for (let i = 0; i < countOffersToSend; i++) {
157+
const toPeer = peers[peerIndex];
163158

164-
peerIndex++;
165-
if (peerIndex == swarmPeers.length) {
166-
peerIndex = 0;
167-
}
159+
if (toPeer === peer) {
160+
i--; // do one more iteration
161+
} else {
162+
sendOffer(offers[i], peer.id!, toPeer, infoHash);
163+
}
164+
165+
peerIndex++;
166+
if (peerIndex == peers.length) {
167+
peerIndex = 0;
168168
}
169169
}
170170

lib/run-uws-tracker.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,10 @@ async function main() {
7373
}
7474
}
7575

76-
try {
77-
main();
78-
} catch (e) {
79-
console.error(e);
80-
}
76+
(async () => {
77+
try {
78+
await main();
79+
} catch (e) {
80+
console.error(e);
81+
}
82+
})();

lib/uws-tracker.ts

Lines changed: 55 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { ldebug } from "./lambda-debug";
2323

2424
const debugWebSockets = Debug("wt-tracker:uws-tracker");
2525
const ldebugMessages = ldebug(Debug("wt-tracker:uws-tracker-messages"));
26+
const decoder = new StringDecoder();
2627

2728
export class UWebSocketsTracker {
2829
private app_: TemplatedApp;
@@ -62,8 +63,6 @@ export class UWebSocketsTracker {
6263
}
6364

6465
private buildApplication() {
65-
const decoder = new StringDecoder();
66-
6766
this.app_
6867
.ws(this.settings.websockets.path, {
6968
compression: this.settings.websockets.compression,
@@ -73,59 +72,65 @@ export class UWebSocketsTracker {
7372
this.webSocketsCount++;
7473
debugWebSockets("connected via URL", request.getUrl());
7574
},
76-
message: (ws: WebSocket, message: ArrayBuffer, isBinary: boolean) => {
77-
debugWebSockets("message of size", message.byteLength);
78-
79-
let json: any;
80-
try {
81-
json = JSON.parse(decoder.end(new Uint8Array(message) as any));
82-
} catch (e) {
83-
debugWebSockets("failed to parse JSON message", e);
84-
ws.close();
85-
return;
86-
}
87-
88-
let peer: PeerContext | undefined = (ws as any).peer;
89-
90-
ldebugMessages(() => ["in", (peer && peer.id) ? Buffer.from(peer.id).toString("hex") : "unknown peer", json]);
91-
92-
if (peer === undefined) {
93-
peer = {
94-
sendMessage: (json: any) => {
95-
ws.send(JSON.stringify(json), false, false);
96-
ldebugMessages(() => ["out", peer!.id ? Buffer.from(peer!.id).toString("hex") : "unknown peer", json]);
97-
}
98-
};
99-
(ws as any).peer = peer;
100-
}
101-
102-
try {
103-
this.tracker.processMessage(json, peer);
104-
} catch (e) {
105-
if (e instanceof TrackerError) {
106-
debugWebSockets("failed to process message from the peer:", e);
107-
} else {
108-
throw e;
109-
}
110-
ws.close();
111-
return;
112-
}
113-
},
11475
drain: (ws: WebSocket) => {
115-
debugWebSockets("backpressure", ws.getBufferedAmount());
76+
debugWebSockets("drain", ws.getBufferedAmount());
11677
},
117-
close: (ws: WebSocket, code: number, message: ArrayBuffer) => {
118-
this.webSocketsCount--;
119-
const peer: PeerContext | undefined = (ws as any).peer;
78+
message: this.onMessage,
79+
close: this.onClose
80+
});
81+
}
12082

121-
if (peer !== undefined) {
122-
delete (ws as any).peer;
123-
this.tracker.disconnectPeer(peer);
83+
private onMessage = (ws: WebSocket, message: ArrayBuffer, isBinary: boolean) => {
84+
debugWebSockets("message of size", message.byteLength);
85+
86+
let json: any;
87+
try {
88+
json = JSON.parse(decoder.end(new Uint8Array(message) as any));
89+
} catch (e) {
90+
debugWebSockets("failed to parse JSON message", e);
91+
ws.close();
92+
return;
93+
}
94+
95+
let peer: PeerContext | undefined = (ws as any).peer;
96+
97+
ldebugMessages(() => ["in",
98+
(peer && peer.id) ? Buffer.from(peer.id).toString("hex") : "unknown peer", json]);
99+
100+
if (peer === undefined) {
101+
peer = {
102+
sendMessage: (json: any) => {
103+
ws.send(JSON.stringify(json), false, false);
104+
ldebugMessages(() => ["out",
105+
peer!.id ? Buffer.from(peer!.id).toString("hex") : "unknown peer", json]);
124106
}
125-
126-
debugWebSockets("closed with code", code);
107+
};
108+
(ws as any).peer = peer;
109+
}
110+
111+
try {
112+
this.tracker.processMessage(json, peer);
113+
} catch (e) {
114+
if (e instanceof TrackerError) {
115+
debugWebSockets("failed to process message from the peer:", e);
116+
} else {
117+
throw e;
127118
}
128-
});
119+
ws.close();
120+
return;
121+
}
122+
}
123+
124+
private onClose = () => (ws: WebSocket, code: number, message: ArrayBuffer) => {
125+
this.webSocketsCount--;
126+
const peer: PeerContext | undefined = (ws as any).peer;
127+
128+
if (peer !== undefined) {
129+
delete (ws as any).peer;
130+
this.tracker.disconnectPeer(peer);
131+
}
132+
133+
debugWebSockets("closed with code", code);
129134
}
130135

131136
public async run() {

package-lock.json

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"nyc": "^13.3.0",
5555
"rimraf": "^2.6.3",
5656
"tslint": "^5.13.1",
57+
"tslint-sonarts": "^1.9.0",
5758
"typescript": "^3.3.3333"
5859
}
5960
}

test/simulation.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ describe("simulation", () => {
112112

113113
if ((peer as any).swarms[0].swarm.peers.get(peerData.peerId) === peer) {
114114
activePeersCount++;
115-
torrents.add(peerData.infoHash!);
115+
torrents.add(peerData.infoHash);
116116
}
117117
} else {
118118
expect(((peer as any).swarms === undefined) || ((peer as any).swarms.length === 0), "the peer should not be in a swarm");

tslint.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,6 @@
5454
"jsdoc-format": true,
5555
"eofline": true
5656
},
57-
"defaultSeverity": "warning"
57+
"defaultSeverity": "warning",
58+
"extends": ["tslint-sonarts"]
5859
}

0 commit comments

Comments
 (0)