一. 介绍

WebTorrent是一个纯JS写的一个基于浏览器的torent客户端
在nood.js中,WebTorrent是一个简单的torrent客户端,使用TCP和UDP来和其他的torrent客户端数据交互.

 

在浏览器中,WebTorrent 使用WebRTC(data channels)来为点对点提供数据传输,它可以在没有浏览器插件,扩展或者安装程序的情况下使用,纯JavaScript.

 

很简单的将脚本 webtorrent.min.js 添加到网站页面中,就可以从使用BitTorrent 协议的WebRTC中将文件取过来,或者 使用基于  browserify(nodojs模块)的  require(‘webtorrent’)
查看  demo apps 和  code examples.

 

如果想要BitTorrent在WebRTC中工作(只是在web中使用p2p传输),我们做了一些协议上的改变,所以,一个基于浏览器的WebTorrent客户端可以只是连接其他支持WebTorrent(或者WebRTC)的客户端.

 

node.js的 WebTorrent模块很快将要可以连接其他使用WebRTC的节点,使它成为第一个”hybrid”客户端,我们希望建立 torrent 客户端( uTorrent, Transmission, Vuze, etc.)也会很快添加对WebTorrent(和WebRTC)的支持,所以,它们也都可以很方便的和其他web中的节点连接.

 

Network

 

警告:这是一个还在pre-alpha(类似于技术预览版,会有很多bug)阶段的软件,请在 WebTorrent关注最新动态

 

二. 软件特点
  • node.js版的Torrent客户端 & 浏览器版的(同样的npm模块)
  • 运行很快速
  • 同时,高效的下载成倍的torrent
  • 纯 JavaScript (没有原生依赖包)
  • 用streams的形式发布文件
    • 按需从网络中寻找文件块(甚至在torrent完成之前)
    • 在连续的文件块和缺少的文件块中迅速切换
  • 支持高级torrent客户端特点
  • 全面的测试套件(支持离线运行,所以非常可靠,非常快)

三. 浏览器特点

  • 在没有插件的情况下,WebRTC data channels 提供了轻便的节点之间的数据传输
  • 没有其他仓库,WebTorrent是一个可以运行在所有web中的P2P软件,它可以在一个域名中运行的同时,也可以连接其他域名中的客户端.
  • 可以在一个<video>标签(webm (vp8,vp9) 或者 mp4 (h264))中Stream视频torrents.
  • 支持Chrome,Firefox和Opera浏览器

四. 支持节点

  • 可以将视频stream到Airplay,Chromecast,VLC player, 或者其他更多的设备,播放器中

五. 安装

安装WebTorrent以供在节点,或者浏览器中使用WebTorrent,用 require(‘webtorrent’),运行:
 npm install webtorrent
安装一个webtorrent命令行程序,运行: 
 npm install webtorrent -g
六. 帮助
  • 在Gitter或者freenode中#webtorrent加入我们以帮助开发者或者一些很牛疯子,科学家,黑客.
  • Create a new issue来提交bugs
  • Fix an issue.注:WebTorrent是一个OPEN Open Source Project!
  • 比特币捐赠 如果你相信这个设想或者希望支持这个项目. 使用Coinbase,或者发送到1B6aystcqu8fd6ejzpmMFMPRqH9b86iiwh (proof)

七. 项目中的WebTorrent

八. 使用

WebTorrent是第一个运行在浏览器中的BitTorrent客户端,使用开放web标准(没有插件,只是HTML5和WebRTC)!很容易就可以开始!
 
browser
可以很简单的下载文件:
var WebTorrent = require('webtorrent')

var client = new WebTorrent()
var magnetUri = '...'

client.add(magnetUri, function (torrent) {
  // Got torrent metadata!
  console.log('Torrent info hash:', torrent.infoHash)

  torrent.files.forEach(function (file) {
    // Get a url for each file
    file.getBlobURL(function (err, url) {
      if (err) throw err

      // Add a link to the page
      var a = document.createElement('a')
      a.download = file.name
      a.href = url
      a.textContent = 'Download ' + file.name
      document.body.appendChild(a)
    })
  })
})
也可以很简单的发送文件:
var dragDrop = require('drag-drop/buffer')
var WebTorrent = require('webtorrent')

var client = new WebTorrent()

// When user drops files on the browser, create a new torrent and start seeding it!
dragDrop('body', function (files) {
  client.seed(files, function onTorrent (torrent) {
    // Client is seeding the file!
    console.log('Torrent info hash:', torrent.infoHash)
  })
})
Streaming HTML5视频? 也很简单!
var WebTorrent = require('webtorrent')

var client = new WebTorrent()
var magnetUri = '...'

client.add(magnetUri, function (torrent) {
  // Got torrent metadata!
  console.log('Torrent info hash:', torrent.infoHash)

  // Let's say the first file is a webm (vp8) or mp4 (h264) video...
  var file = torrent.files[0]

  // Create a video element
  var video = document.createElement('video')
  video.controls = true
  document.body.appendChild(video)

  // Stream the video into the video tag
  file.createReadStream().pipe(video)
})
这里有更多的例子 examples
Browserify
WebTorrent可以很好的和  browserify 一起工作,一个npm模块可以让你使用 node-style require() 来更好的组织你的浏览器代码,并且可以很好的加载用npm安装的模块.
WebTorrent 也可以从一个独立的脚本中获得( webtorrent.min.js)来发布webtorrent到window项目,所以它可以只用一个script标签来使用:
<script src="webtorrent.min.js"></script>
WebTorrent脚本也可以很快的引用,将这个可靠的CDN地址包含在你的网站中:
<script src="https://cdn.jsdelivr.net/webtorrent/latest/webtorrent.min.js"></script>
node.js
WebTorrent也可以运行在node.js中,使用相同的npm模块!
命令行app
$ npm install webtorrent -g
$ webtorrent --help
下载一个torrent:
$ webtorrent magnet_uri
stream 一个torrent 到一个设备,像AirPlay或者chromecast
$ webtorrent magnet_uri --airplay
这里是一些支持的streaming选项:
--airplay               Apple TV
--chromecast            Chromecast
--mplayer               MPlayer
--mpv                   MPV
--omx [jack]            omx [default: hdmi]
--vlc                   VLC
--xbmc                  XBMC
--stdout                standard out [implies --quiet]
API
这个API完全可以相同的运行在节点和浏览器中,

client = new WebTorrent([opts])

创建一个新的WebTorrent
如果 opts 具体说明了,那么默认的选项(在下面)将会被覆盖
{
  dht: Boolean|Object,   // Enable DHT (default=true), or options object for DHT
  maxPeers: Number,      // Max number of peers to connect to per torrent (default=100)
  nodeId: String|Buffer, // DHT protocol node ID (default=randomly generated)
  peerId: String|Buffer, // Wire protocol peer ID (default=randomly generated)
  rtcConfig: Object,     // RTCPeerConnection configuration object (default=STUN only)
  storage: Function,     // custom storage engine, or `false` to use in-memory engine
  tracker: Boolean,      // Whether or not to enable trackers (default=true)
  wrtc: {}               // custom webrtc implementation (in node, specify the [wrtc](https://www.npmjs.com/package/wrtc) package)
}

client.add(torrentId, [opts], [function ontorrent (torrent) {}])

开始下载一个新的torrent,使用  

client.download

 .

torrentId 可以是其中一个:
  • 磁力链接(utf8 字符串)
  • torrent 文件(缓冲)
  • info hash(十六进制字符串或者缓存)
  • 从torrent中分析(从parse-torrent)
  • torrent文件的http/https url地址(字符串)
  • torrent文件的系统路径(字符串)

如果 opts 具体说明了,那么默认的选项(在下面)将会被覆盖

{
  tmp: String,           // Custom folder where files will be downloaded (default=`/tmp/`)
  verify: Boolean        // Verify previously stored data before starting (default=false)
}

client.seed(input, [opts], [function onseed (torrent) {}])

开始seeding一个新的torrent.
input 可以是任何一个:
  • 文件系统中的文件或目录的路径(字符串)
  • W3C File 对象(从一个<input>标签拖拽)
  • W3C FileList 对象 ( 
    File

     对象的基本数组)

  • Node Buffer 对象 (在browser中工作)

或者 一个  

string

  

File

 数组,或者是一个 

Buffer

 对象.

如果  opts   具体说明了,那么它应该包含在选项类型后面:
  • create-torrent 的选项(允许配置创建后的.torrent文件)
  • client.add 的选项(同上)

如果  onseed  具体说明了,它将会在客户端开始seeding的文件的时候called

client.on('torrent', function (torrent) {})

当一个torrent准备好被使用时,(元数据可用并且存储已经准备好了),查看torrent更多的信息使用方法 torrent

client.remove(torrentId, [function callback (err) {}])

从客户端中移除一个torrent.重置所有peers的连接,并且删除所有存储的文件数据.如果   callback 被声明了,那么它将会在文件数据被移除时called

client.destroy([function callback (err) {}])

重置客户端,包含所有torrents和连接到peers.如果  callback  被声明了,那么它将会在客户端优雅关闭后called

client.torrents[...]

客户端中所有torrents的数组

client.get(torrentId)

给出 torrentId  后返回torrent.简单方法.更方便的在  client.torrents  数组中搜寻.如果没有发现torrent,则返回  null

client.ratio

和所有客户端中的torrent进行对比

torrent api

torrent.infoHash

获取torrent的info hash

torrent.magnetURI

获取torrent的磁力链接

torrent.files[...]

torrent中所有文件的数组.

torrent.swarm

所附的 bittorrent-swarm 实例

torrent.remove()

client.remove(torrent)

.  的别名

torrent.addPeer(addr)

在 bittorrent-swarm 之下添加的一个peer实例
如果peer已经被添加了,返回  true  如果peer已经被加载黑名单列表锁定了,则返回 false

torrent.select(start, end, [priority], [notify])

在给出 priority 后, 选择一个地址的种类,开始用 start  结束用 end  ,  notify  是一个选择用新的数据更新后的可选择的回调事件

torrent.deselect(start, end, priority)

torrent.critical(start, end)

标记范围内的要尽快下载, 开始用 start   结束用 end

torrent.createServer([opts])

创建一个http服务器来服务这个torrent中的内容,动态获取所需torrent来满足http请求,支持范围的请求
返回 http.Server  的情况(calling  http.createServer  获取)如果 opts  被声明了,它会跳过 http.createServer  函数.
访问服务器的根  /  将显示连接到单个文件的列表.
var client = new WebTorrent()
var magnetUri = '...'

client.add(magnetUri, function (torrent) {
  // create HTTP server for this torrent
  var server = torrent.createServer()
  server.listen(port) // start the server listening to a port

  // visit http://localhost:<port>/ to see a list of files

  // access individual files at http://localhost:<port>/<index> where index is the index
  // in the torrent.files array

  // later, cleanup...
  server.close()
  client.destroy()
})

file api

file.name

文件名字,torrent的具体说明

file.path

文件路径,torrent的具体说明 例:  some-folder/some-filename.txt

file.length

文件长度(字节)

file.select()

选中的文件将被下载

file.deselect()

取消选中,意味着直到有人为它创建stream之前都不会被下载

stream = file.createReadStream([opts])

为文件创建一个 readable stream.
你可以跳过 opts  ,然后stream 一个文件的碎片
{
  start: startByte,
  end: endByte
}
start  end,都被包括

file.getBuffer(function callback (err, buffer) {})

获取文件的内容作为缓存
文件在网络中被下载的优先级为高,并且文件在准备好后,会调用 callback  .  callback  必须要声明,
并且将作为 Error  或者 null   被缓存
file.getBuffer(function (err, buffer) {
  if (err) throw err
  console.log(buffer) // <Buffer 00 98 00 01 01 00 00 00 50 ae 07 04 01 00 00 00 0a 00 00 00 00 00 00 00 78 ae 07 04 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...>
})

file.getBlobURL(function callback (err, url) {})

获取到一个网址,可在浏览器中引用该文件
文件在网络中被下载的优先级为高,并且文件在准备好后,会调用 callback  .  callback  必须要声明,并且将作为 Error或 null 和Blob URL(字符串)
file.getBlobURL(function (err, url) {
  if (err) throw err
  var a = document.createElement('a')
  a.download = file.name
  a.href = url
  a.textContent = 'Download ' + file.name
  document.body.appendChild(a)
})
所有的都模块都包含在npm WebTorrent中
注:本来翻译自GitHub的一个开源项目,可能有些地方不是很准确