From 4d73ca37994b86538f61fe19afd1bd3775fee48d Mon Sep 17 00:00:00 2001 From: dalitso banda Date: Thu, 4 Oct 2018 23:37:17 -0400 Subject: [PATCH 1/6] add candidate message --- lib/server/parse-websocket.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/server/parse-websocket.js b/lib/server/parse-websocket.js index ec4e606d..4f7a749d 100644 --- a/lib/server/parse-websocket.js +++ b/lib/server/parse-websocket.js @@ -5,6 +5,15 @@ var common = require('../common') function parseWebSocketRequest (socket, opts, params) { if (!opts) opts = {} params = JSON.parse(params) // may throw + console.log(typeof params.info_hash) + if(typeof params.info_hash === 'object'){ + var info_hash = params.info_hash; + params.info_hash =String.fromCharCode.apply(null, info_hash) + + } + console.log(params.java, params) + + params.type = 'ws' params.socket = socket @@ -21,7 +30,7 @@ function parseWebSocketRequest (socket, opts, params) { } params.peer_id = common.binaryToHex(params.peer_id) - if (params.answer) { + if (params.answer || params.candidate) { if (typeof params.to_peer_id !== 'string' || params.to_peer_id.length !== 20) { throw new Error('invalid `to_peer_id` (required with `answer`)') } From 41b66884dade5fdae60ec3878d850e9a3ed1dcdf Mon Sep 17 00:00:00 2001 From: dalitso banda Date: Mon, 4 Mar 2019 23:47:31 +0000 Subject: [PATCH 2/6] fake merge --- lib/server/parse-websocket.js | 3 - server.js | 120 ++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 3 deletions(-) diff --git a/lib/server/parse-websocket.js b/lib/server/parse-websocket.js index 4f7a749d..e9ea0822 100644 --- a/lib/server/parse-websocket.js +++ b/lib/server/parse-websocket.js @@ -5,13 +5,10 @@ var common = require('../common') function parseWebSocketRequest (socket, opts, params) { if (!opts) opts = {} params = JSON.parse(params) // may throw - console.log(typeof params.info_hash) if(typeof params.info_hash === 'object'){ var info_hash = params.info_hash; params.info_hash =String.fromCharCode.apply(null, info_hash) - } - console.log(params.java, params) diff --git a/server.js b/server.js index 10eb8393..51da9a7f 100644 --- a/server.js +++ b/server.js @@ -436,6 +436,7 @@ class Server extends EventEmitter { onWebSocketConnection (socket, opts = {}) { opts.trustProxy = opts.trustProxy || this._trustProxy +<<<<<<< HEAD socket.peerId = null // as hex socket.infoHashes = [] // swarms that this socket is participating in socket.onSend = err => { @@ -446,6 +447,59 @@ class Server extends EventEmitter { this._onWebSocketRequest(socket, opts, params) } socket.on('message', socket.onMessageBound) +======= +function utf8to16(str) { + var out, i, len, c; + var char2, char3; + + out = ""; + len = str.length; + i = 0; + while(i < len) { + c = str.charCodeAt(i++); + switch(c >> 4) + { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + // 0xxxxxxx + out += str.charAt(i-1); + break; + case 12: case 13: + // 110x xxxx 10xx xxxx + char2 = str.charCodeAt(i++); + out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); + break; + case 14: + // 1110 xxxx 10xx xxxx 10xx xxxx + char2 = str.charCodeAt(i++); + char3 = str.charCodeAt(i++); + out += String.fromCharCode(((c & 0x0F) << 12) | + ((char2 & 0x3F) << 6) | + ((char3 & 0x3F) << 0)); + break; + } + } + + return out; +} + +Server.prototype._onWebSocketRequest = function (socket, opts, params) { + var self = this + console.log("params: ", JSON.stringify(params)) + try { + if (JSON.parse(params).torrent){ + debug("got torrent: ") + peers.forEach(function (peer, i) { + peer.socket.send(JSON.stringify(params), peer.socket.onSend) + }) + return + } + + params = parseWebSocketRequest(socket, opts, params) + } catch (err) { + socket.send(JSON.stringify({ + 'failure reason': err.message + }), socket.onSend) +>>>>>>> 001f51e... changes socket.onErrorBound = err => { this._onWebSocketError(socket, err) @@ -458,10 +512,17 @@ class Server extends EventEmitter { socket.on('close', socket.onCloseBound) } +<<<<<<< HEAD _onWebSocketRequest (socket, opts, params) { try { params = parseWebSocketRequest(socket, opts, params) } catch (err) { +======= + self._onRequest(params, function (err, response) { + //console.log("params:", params) + if (self.destroyed || socket.destroyed) return + if (err) { +>>>>>>> 001f51e... changes socket.send(JSON.stringify({ 'failure reason': err.message }), socket.onSend) @@ -474,6 +535,7 @@ class Server extends EventEmitter { if (!socket.peerId) socket.peerId = params.peer_id // as hex +<<<<<<< HEAD this._onRequest(params, (err, response) => { if (this.destroyed || socket.destroyed) return if (err) { @@ -482,6 +544,13 @@ class Server extends EventEmitter { 'failure reason': err.message, info_hash: common.hexToBinary(params.info_hash) }), socket.onSend) +======= + var peers + if (response.action === 'announce') { + peers = response.peers + delete response.peers + console.log("params hash: " + params.info_hash) +>>>>>>> 001f51e... changes this.emit('warning', err) return @@ -494,11 +563,62 @@ class Server extends EventEmitter { peers = response.peers delete response.peers +<<<<<<< HEAD if (!socket.infoHashes.includes(params.info_hash)) { socket.infoHashes.push(params.info_hash) } response.info_hash = common.hexToBinary(params.info_hash) +======= + + if (Array.isArray(params.offers)) { + debug('got %s offers from %s', params.offers.length, params.peer_id) + debug('got %s peers from swarm %s', peers.length, params.info_hash) + peers.forEach(function (peer, i) { + peer.socket.send(JSON.stringify({ + action: 'announce', + offer: params.offers[i].offer, + offer_id: params.offers[i].offer_id, + peer_id: common.hexToBinary(params.peer_id), + info_hash: common.hexToBinary(params.info_hash) + }), peer.socket.onSend) + debug('sent offer to %s from %s', peer.peerId, params.peer_id) + }) + } + + + //add trickler support + if (params.candidate && params.peer_id){ + debug("got candidate from %s to %s", params.peer_id, params.to_peer_id) + debug("peers length %s",peers.length) + debug('got %s peers from swarm %s', peers.length, params.info_hash) + self.getSwarm(params.info_hash, function (err, swarm) { + if (self.destroyed) return + if (err) return self.emit('warning', err) + if (!swarm) { + return self.emit('warning', new Error('no swarm with that `info_hash`')) + } + // Mark the destination peer as recently used in cache + var toPeer = swarm.peers.get(params.to_peer_id) + if (!toPeer) { + return self.emit('warning', new Error('no peer with that `to_peer_id`')) + } + + toPeer.socket.send(JSON.stringify({ + action: 'announce', + candidate: params.candidate, + offer_id: params.offer_id, + peer_id: common.hexToBinary(params.peer_id), + info_hash: common.hexToBinary(params.info_hash) + }), toPeer.socket.onSend) + debug('sent candidate to %s from %s', toPeer.peerId, params.peer_id) + + done() + }) + + }else if (params.answer) { + debug('got answer %s from %s', JSON.stringify(params.answer), params.peer_id) +>>>>>>> 001f51e... changes // WebSocket tracker should have a shorter interval – default: 2 minutes response.interval = Math.ceil(this.intervalMs / 1000 / 5) From 60434e639c10bad969ea560c997177cab3b74393 Mon Sep 17 00:00:00 2001 From: dalitso banda Date: Mon, 4 Mar 2019 19:36:29 -0500 Subject: [PATCH 3/6] testok --- lib/server/parse-websocket.js | 8 +- server.js | 227 +++++++++++----------------------- 2 files changed, 74 insertions(+), 161 deletions(-) diff --git a/lib/server/parse-websocket.js b/lib/server/parse-websocket.js index e9ea0822..8958ece3 100644 --- a/lib/server/parse-websocket.js +++ b/lib/server/parse-websocket.js @@ -5,13 +5,11 @@ var common = require('../common') function parseWebSocketRequest (socket, opts, params) { if (!opts) opts = {} params = JSON.parse(params) // may throw - if(typeof params.info_hash === 'object'){ - var info_hash = params.info_hash; - params.info_hash =String.fromCharCode.apply(null, info_hash) + if (typeof params.info_hash === 'object') { + var infoHash = params.info_hash + params.info_hash = String.fromCharCode.apply(null, infoHash) } - - params.type = 'ws' params.socket = socket if (params.action === 'announce') { diff --git a/server.js b/server.js index 51da9a7f..91cef05e 100644 --- a/server.js +++ b/server.js @@ -436,7 +436,6 @@ class Server extends EventEmitter { onWebSocketConnection (socket, opts = {}) { opts.trustProxy = opts.trustProxy || this._trustProxy -<<<<<<< HEAD socket.peerId = null // as hex socket.infoHashes = [] // swarms that this socket is participating in socket.onSend = err => { @@ -447,59 +446,6 @@ class Server extends EventEmitter { this._onWebSocketRequest(socket, opts, params) } socket.on('message', socket.onMessageBound) -======= -function utf8to16(str) { - var out, i, len, c; - var char2, char3; - - out = ""; - len = str.length; - i = 0; - while(i < len) { - c = str.charCodeAt(i++); - switch(c >> 4) - { - case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: - // 0xxxxxxx - out += str.charAt(i-1); - break; - case 12: case 13: - // 110x xxxx 10xx xxxx - char2 = str.charCodeAt(i++); - out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); - break; - case 14: - // 1110 xxxx 10xx xxxx 10xx xxxx - char2 = str.charCodeAt(i++); - char3 = str.charCodeAt(i++); - out += String.fromCharCode(((c & 0x0F) << 12) | - ((char2 & 0x3F) << 6) | - ((char3 & 0x3F) << 0)); - break; - } - } - - return out; -} - -Server.prototype._onWebSocketRequest = function (socket, opts, params) { - var self = this - console.log("params: ", JSON.stringify(params)) - try { - if (JSON.parse(params).torrent){ - debug("got torrent: ") - peers.forEach(function (peer, i) { - peer.socket.send(JSON.stringify(params), peer.socket.onSend) - }) - return - } - - params = parseWebSocketRequest(socket, opts, params) - } catch (err) { - socket.send(JSON.stringify({ - 'failure reason': err.message - }), socket.onSend) ->>>>>>> 001f51e... changes socket.onErrorBound = err => { this._onWebSocketError(socket, err) @@ -512,17 +458,10 @@ Server.prototype._onWebSocketRequest = function (socket, opts, params) { socket.on('close', socket.onCloseBound) } -<<<<<<< HEAD _onWebSocketRequest (socket, opts, params) { try { params = parseWebSocketRequest(socket, opts, params) } catch (err) { -======= - self._onRequest(params, function (err, response) { - //console.log("params:", params) - if (self.destroyed || socket.destroyed) return - if (err) { ->>>>>>> 001f51e... changes socket.send(JSON.stringify({ 'failure reason': err.message }), socket.onSend) @@ -535,7 +474,6 @@ Server.prototype._onWebSocketRequest = function (socket, opts, params) { if (!socket.peerId) socket.peerId = params.peer_id // as hex -<<<<<<< HEAD this._onRequest(params, (err, response) => { if (this.destroyed || socket.destroyed) return if (err) { @@ -544,13 +482,6 @@ Server.prototype._onWebSocketRequest = function (socket, opts, params) { 'failure reason': err.message, info_hash: common.hexToBinary(params.info_hash) }), socket.onSend) -======= - var peers - if (response.action === 'announce') { - peers = response.peers - delete response.peers - console.log("params hash: " + params.info_hash) ->>>>>>> 001f51e... changes this.emit('warning', err) return @@ -563,123 +494,107 @@ Server.prototype._onWebSocketRequest = function (socket, opts, params) { peers = response.peers delete response.peers -<<<<<<< HEAD if (!socket.infoHashes.includes(params.info_hash)) { socket.infoHashes.push(params.info_hash) } response.info_hash = common.hexToBinary(params.info_hash) -======= - - if (Array.isArray(params.offers)) { - debug('got %s offers from %s', params.offers.length, params.peer_id) - debug('got %s peers from swarm %s', peers.length, params.info_hash) - peers.forEach(function (peer, i) { - peer.socket.send(JSON.stringify({ - action: 'announce', - offer: params.offers[i].offer, - offer_id: params.offers[i].offer_id, - peer_id: common.hexToBinary(params.peer_id), - info_hash: common.hexToBinary(params.info_hash) - }), peer.socket.onSend) - debug('sent offer to %s from %s', peer.peerId, params.peer_id) - }) - } - - - //add trickler support - if (params.candidate && params.peer_id){ - debug("got candidate from %s to %s", params.peer_id, params.to_peer_id) - debug("peers length %s",peers.length) - debug('got %s peers from swarm %s', peers.length, params.info_hash) - self.getSwarm(params.info_hash, function (err, swarm) { - if (self.destroyed) return - if (err) return self.emit('warning', err) - if (!swarm) { - return self.emit('warning', new Error('no swarm with that `info_hash`')) - } - // Mark the destination peer as recently used in cache - var toPeer = swarm.peers.get(params.to_peer_id) - if (!toPeer) { - return self.emit('warning', new Error('no peer with that `to_peer_id`')) - } - - toPeer.socket.send(JSON.stringify({ - action: 'announce', - candidate: params.candidate, - offer_id: params.offer_id, - peer_id: common.hexToBinary(params.peer_id), - info_hash: common.hexToBinary(params.info_hash) - }), toPeer.socket.onSend) - debug('sent candidate to %s from %s', toPeer.peerId, params.peer_id) - - done() - }) - - }else if (params.answer) { - debug('got answer %s from %s', JSON.stringify(params.answer), params.peer_id) ->>>>>>> 001f51e... changes // WebSocket tracker should have a shorter interval – default: 2 minutes response.interval = Math.ceil(this.intervalMs / 1000 / 5) } - // Skip sending update back for 'answer' announce messages – not needed - if (!params.answer) { - socket.send(JSON.stringify(response), socket.onSend) - debug('sent response %s to %s', JSON.stringify(response), params.peer_id) - } - - if (Array.isArray(params.offers)) { - debug('got %s offers from %s', params.offers.length, params.peer_id) + // add trickler support + if (params.candidate && params.peer_id) { + debug('got candidate from %s to %s', params.peer_id, params.to_peer_id) + debug('peers length %s', peers.length) debug('got %s peers from swarm %s', peers.length, params.info_hash) - peers.forEach((peer, i) => { - peer.socket.send(JSON.stringify({ - action: 'announce', - offer: params.offers[i].offer, - offer_id: params.offers[i].offer_id, - peer_id: common.hexToBinary(params.peer_id), - info_hash: common.hexToBinary(params.info_hash) - }), peer.socket.onSend) - debug('sent offer to %s from %s', peer.peerId, params.peer_id) - }) - } - - const done = () => { - // emit event once the announce is fully "processed" - if (params.action === common.ACTIONS.ANNOUNCE) { - this.emit(common.EVENT_NAMES[params.event], params.peer_id, params) - } - } - - if (params.answer) { - debug('got answer %s from %s', JSON.stringify(params.answer), params.peer_id) - - this.getSwarm(params.info_hash, (err, swarm) => { + this.getSwarm(params.info_hash, function (err, swarm) { if (this.destroyed) return if (err) return this.emit('warning', err) if (!swarm) { return this.emit('warning', new Error('no swarm with that `info_hash`')) } // Mark the destination peer as recently used in cache - const toPeer = swarm.peers.get(params.to_peer_id) + var toPeer = swarm.peers.get(params.to_peer_id) if (!toPeer) { return this.emit('warning', new Error('no peer with that `to_peer_id`')) } toPeer.socket.send(JSON.stringify({ action: 'announce', - answer: params.answer, + candidate: params.candidate, offer_id: params.offer_id, peer_id: common.hexToBinary(params.peer_id), info_hash: common.hexToBinary(params.info_hash) }), toPeer.socket.onSend) - debug('sent answer to %s from %s', toPeer.peerId, params.peer_id) - + debug('sent candidate to %s from %s', toPeer.peerId, params.peer_id) + const done = () => { + // emit event once the announce is fully "processed" + if (params.action === common.ACTIONS.ANNOUNCE) { + this.emit(common.EVENT_NAMES[params.event], params.peer_id, params) + } + } done() }) } else { - done() + // Skip sending update back for 'answer' announce messages – not needed + if (!params.answer) { + socket.send(JSON.stringify(response), socket.onSend) + debug('sent response %s to %s', JSON.stringify(response), params.peer_id) + } + + if (Array.isArray(params.offers)) { + debug('got %s offers from %s', params.offers.length, params.peer_id) + debug('got %s peers from swarm %s', peers.length, params.info_hash) + peers.forEach((peer, i) => { + peer.socket.send(JSON.stringify({ + action: 'announce', + offer: params.offers[i].offer, + offer_id: params.offers[i].offer_id, + peer_id: common.hexToBinary(params.peer_id), + info_hash: common.hexToBinary(params.info_hash) + }), peer.socket.onSend) + debug('sent offer to %s from %s', peer.peerId, params.peer_id) + }) + } + + const done = () => { + // emit event once the announce is fully "processed" + if (params.action === common.ACTIONS.ANNOUNCE) { + this.emit(common.EVENT_NAMES[params.event], params.peer_id, params) + } + } + + if (params.answer) { + debug('got answer %s from %s', JSON.stringify(params.answer), params.peer_id) + + this.getSwarm(params.info_hash, (err, swarm) => { + if (this.destroyed) return + if (err) return this.emit('warning', err) + if (!swarm) { + return this.emit('warning', new Error('no swarm with that `info_hash`')) + } + // Mark the destination peer as recently used in cache + const toPeer = swarm.peers.get(params.to_peer_id) + if (!toPeer) { + return this.emit('warning', new Error('no peer with that `to_peer_id`')) + } + + toPeer.socket.send(JSON.stringify({ + action: 'announce', + answer: params.answer, + offer_id: params.offer_id, + peer_id: common.hexToBinary(params.peer_id), + info_hash: common.hexToBinary(params.info_hash) + }), toPeer.socket.onSend) + debug('sent answer to %s from %s', toPeer.peerId, params.peer_id) + + done() + }) + } else { + done() + } } }) } From ea7aebb93617168aade2ee026d13a41ad4d5505b Mon Sep 17 00:00:00 2001 From: dalitso banda Date: Wed, 6 Mar 2019 15:50:50 -0500 Subject: [PATCH 4/6] ui test --- test/ui.html | 10 ++++++++++ test/ui.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 test/ui.html create mode 100644 test/ui.js diff --git a/test/ui.html b/test/ui.html new file mode 100644 index 00000000..00004255 --- /dev/null +++ b/test/ui.html @@ -0,0 +1,10 @@ + + + + + + + + RUNNING + + \ No newline at end of file diff --git a/test/ui.js b/test/ui.js new file mode 100644 index 00000000..3925ff71 --- /dev/null +++ b/test/ui.js @@ -0,0 +1,33 @@ +function start1(argument) { + // body... + ws1 = new WebSocket("ws://localhost:8000") + + var t1 = {"info_hash":"dddddddddddddddddddd", + "action": "announce", + "left" : 1000, + "uploaded": 0, + "downloaded": 500, + "peer_id": "eeeeeeeeeeeeeeeeeeee" + } + + var t2 = {"info_hash":"ddddddddddddddddddde", + "action": "announce", + "left" : 1000, + "uploaded": 0, + "downloaded": 500, + "peer_id": "eeeeeeeeeeeeeeeeeeee" + } + + var t3 = {"info_hash":"dddddddddddddddddddf", + "action": "announce", + "left" : 1000, + "uploaded": 0, + "downloaded": 500, + "peer_id": "eeeeeeeeeeeeeeeeeeee" + } + + setInterval( ()=>{ws1.send(JSON.stringify(t1))},5000) + setInterval( ()=>{ws1.send(JSON.stringify(t2))},5000) + setInterval( ()=>{ws1.send(JSON.stringify(t3))},5000) + console.log("started peer1") +} From f44dfb07b825d8bdc7ba1671f62b55d00d4d6e27 Mon Sep 17 00:00:00 2001 From: dalitso banda Date: Sun, 21 Jul 2019 22:28:20 +0000 Subject: [PATCH 5/6] save --- lib/server/swarm.js | 4 ++-- server.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/server/swarm.js b/lib/server/swarm.js index 2c6f49a8..243c95b9 100644 --- a/lib/server/swarm.js +++ b/lib/server/swarm.js @@ -14,8 +14,8 @@ function Swarm (infoHash, server) { self.incomplete = 0 self.peers = new LRU({ - max: server.peersCacheLength || 1000, - maxAge: server.peersCacheTtl || 20 * 60 * 1000 // 20 minutes + max: 1000, + maxAge: 20 * 60 * 1000 // 20 minutes }) // When a peer is evicted from the LRU store, send a synthetic 'stopped' event diff --git a/server.js b/server.js index 91cef05e..d84e6277 100644 --- a/server.js +++ b/server.js @@ -509,7 +509,7 @@ class Server extends EventEmitter { debug('got candidate from %s to %s', params.peer_id, params.to_peer_id) debug('peers length %s', peers.length) debug('got %s peers from swarm %s', peers.length, params.info_hash) - this.getSwarm(params.info_hash, function (err, swarm) { + this.getSwarm(params.info_hash, (err, swarm) => { if (this.destroyed) return if (err) return this.emit('warning', err) if (!swarm) { From 1adde2cb90053c2042a0bc3cf02612381ac48b8d Mon Sep 17 00:00:00 2001 From: dalitso banda Date: Mon, 15 Mar 2021 02:33:10 +0000 Subject: [PATCH 6/6] start script --- start_tracker.sh | 1 + 1 file changed, 1 insertion(+) create mode 100644 start_tracker.sh diff --git a/start_tracker.sh b/start_tracker.sh new file mode 100644 index 00000000..9e845b96 --- /dev/null +++ b/start_tracker.sh @@ -0,0 +1 @@ +DEBUG=* ./bin/cmd.js -p 8081 --ws --interval 15000