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}`)
    }
  }
}

0 ответов

Другие вопросы по тегам