WebTorrent: длительная задержка однорангового обнаружения
Я пытаюсь настроить простое P2P-приложение для обмена видео с помощью WebTorrent. Я уже настроил simple-peer
экземпляры, использующие Socket.IO. Я планировал добавить их через torrent.addPeer()
удалить невероятно длительную задержку (возможно, из-за плохой конфигурации трекера), которую использует мой трекер-сервер для установления соединения между двумя узлами.
Этот подход иногда работает в течение первых нескольких секунд видео с торрента, но затем личер получает событие закрытия и больше не получает и не воспроизводит видео.
Тестовую страницу можно найти по адресу: https://twoseven.xyz:8405/
Я также приложил соответствующий код для сервера и клиента ниже.
сервер
function initializeWebTorrentTracker (config, server) {
const TrackerServer = require('bittorrent-tracker').Server
const WebSocketServer = require('uws').Server
var trackerServer = new TrackerServer({
http: false,
udp: false,
ws: false
})
var wss = new WebSocketServer({
server: server,
path: config.ws_path
})
wss.on('connection', function (ws) {
console.log(`webtorrent-ws: Got client connection`)
trackerServer.onWebSocketConnection(ws)
})
const onHttpRequest = trackerServer.onHttpRequest.bind(trackerServer)
app.get('/tracker/announce', (req, res) => {
onHttpRequest(req, res, {action: 'announce'})
})
app.get('/tracker/scrape', (req, res) => {
onHttpRequest(req, res, {action: 'scrape'})
})
}
initializeWebTorrentTracker(config, http)
initializeWebTorrentTracker(config, https)
клиент
var ANNOUNCE_URLS = [
`${window.location.origin}/tracker/announce`,
`wss://${window.location.host}/tracker/socket`
]
// This function is called when a file is drag-and-dropped onto the page
function handleLocalFiles (files, dz) {
var wtClient = window.seeder
wtClient.seed(files[0], {
urlList: ANNOUNCE_URLS,
announceList: [ANNOUNCE_URLS],
private: true
}, function (torrent) {
addPeersToTorrent(torrent)
loadTorrentOntoElement(torrent, '#video')
socket.emit('torrent', {
seeder: socket.id,
infoHash: torrent.infoHash,
magnetURI: torrent.magnetURI,
torrentFile: torrent.torrentFile
})
})
}
// Handle the socket 'torrent' event
function setupSocketIo() {
socket.on('torrent', function (info) {
console.log(`Received torrent info..Starting leecher`)
var wtClient = window.leecher
var torrentUrl = window.location.origin + info.torrentUrl
wtClient.add(torrentUrl, {
announce: ANNOUNCE_URLS
}, function (torrent) {
addPeersToTorrent(torrent)
if (info.seeder !== socket.id) {
// If I'm the seeder, I just load it locally
loadTorrentOntoElement(torrent, '#video')
}
console.log('Added torrent')
})
})
}
// Manually add peers to a torrent
function addPeersToTorrent (torrent) {
var peers = simplePeer.peers
for (var peerId of Object.keys(peers)) {
var peer = peers[peerId]
if (!torrent.addPeer(peer)) {
console.log(`Failed to add peer-${peer.id}`)
} else {
console.log(`Successfully added peer-${peer.id}`)
}
}
}