- Notifications
You must be signed in to change notification settings - Fork2.8k
⚡️ Streaming torrent client for the web
License
webtorrent/webtorrent
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
WebTorrent is a streaming torrent client fornode.js and thebrowser. YEP,THAT'S RIGHT. THE BROWSER. It's written completely in JavaScript – the language of the web– so the same code works in both runtimes.
In node.js, this module is a simple torrent client, using TCP and UDP to talk toother torrent clients.
In the browser, WebTorrent usesWebRTC (data channels) for peer-to-peer transport.It can be usedwithout browser plugins, extensions, or installations. It's JustJavaScript™. Note: WebTorrent doesnot support UDP/TCP peers in browser.
Simply include thewebtorrent.min.js
scripton your page to start fetching files over WebRTC using the BitTorrent protocol, orimport WebTorrent from 'webtorrent'
withbrowserify orwebpack. Seedemo apps andcode examples below.
To make BitTorrent work over WebRTC (which is the only P2P transport that works on theweb) we made some protocol changes. Therefore, a browser-based WebTorrent client or"webpeer" can only connect to other clients that support WebTorrent/WebRTC.
To seed files to web peers, use a client that supports WebTorrent, e.g.WebTorrent Desktop, a desktop client with afamiliar UI that can connect to web peers,webtorrent-hybrid, a command line program,orInstant.io, a website. Established torrent clients likeVuze havealready added WebTorrent support sothey can connect to both normaland web peers. We hope other clients will follow.
- Torrent client for node.js & the browser (same npm package!)
- Insanely fast
- Downloadmultiple torrents simultaneously, efficiently
- Pure Javascript (no native dependencies)
- Exposes files asstreams
- Fetches pieces from the network on-demand so seeking is supported (even before torrent is finished)
- Seamlessly switches between sequential and rarest-first piece selection strategy
- Supports advanced torrent client features
- magnet uri support viaut_metadata
- peer discovery viadht,tracker,lsd, andut_pex
- protocol extension apifor adding new extensions
- Comprehensive test suite (runs completely offline, so it's reliable and fast)
- Check all thesupported BEPs here
- WebRTC data channels for lightweight peer-to-peer communication withno plugins
- No silos. WebTorrent is a P2P network for theentire web. WebTorrent clientsrunning on one domain can connect to clients on any other domain.
- Stream video torrents into a
<video>
tag (webm, mkv, mp4, ogv, mov, etc (AV1, H264, HEVC*, VP8, VP9, AAC, FLAC, MP3, OPUS, Vorbis, etc)
) - Supports Chrome, Firefox, Opera and Safari.
To install WebTorrent for use in node or the browser withimport WebTorrent from 'webtorrent'
, run:
npm install webtorrent
To install awebtorrent
command line program, run:
npm install webtorrent-cli -g
To install a WebTorrent desktop application for Mac, Windows, or Linux, seeWebTorrent Desktop.
- Join us inGitter or on freenode at
#webtorrent
to helpwith development or to hang out with some mad science hackers :) - Create a new issue to report bugs
- Fix an issue. WebTorrentis anOPEN Open Source Project!
Read the full API Documentation.
WebTorrent is the first BitTorrent client that works in the browser, using open webstandards (no plugins, just HTML5 and WebRTC)! It's easy to get started!
importWebTorrentfrom'webtorrent'constclient=newWebTorrent()constmagnetURI='...'client.add(magnetURI,torrent=>{// Got torrent metadata!console.log('Client is downloading:',torrent.infoHash)for(constfileoftorrent.files){document.body.append(file.name)}})
importdragDropfrom'drag-drop'importWebTorrentfrom'webtorrent'constclient=newWebTorrent()// When user drops files on the browser, create a new torrent and start seeding it!dragDrop('body',files=>{client.seed(files,torrent=>{console.log('Client is seeding:',torrent.infoHash)})})
There are more examples indocs/get-started.md.
WebTorrent works great withbrowserify, an npm package that letsyou usenode-style require() to organize your browser code and load modules installed bynpm (as seen in the previous examples).
WebTorrent also works withwebpack, another modulebundler. However, webpack requires extra configuration which you can find inthe webpack bundle config used by webtorrent.
Or, you can just use the pre-built version viaimport WebTorrent from 'webtorrent/dist/webtorrent.min.js'
and skip the webpack configuration.
WebTorrent is also available as a standalone script(webtorrent.min.js
) which exposesWebTorrent
on thewindow
object, so it can be used with just a script tag:
<scripttype='module'>importWebTorrentfrom'webtorrent.min.js'</script>
The WebTorrent script is also hosted on fast, reliable CDN infrastructure (Cloudflare andMaxCDN) for easy inclusion on your site:
<scripttype='module'>importWebTorrentfrom'https://esm.sh/webtorrent'</script>
If you want to use WebTorrent in aChrome App, you can include thefollowing script:
<scripttype='module'>importWebTorrentfrom'webtorrent.chromeapp.js'</script>
Be sure to enable thechrome.sockets.udp
andchrome.sockets.tcp
permissions!
WebTorrent also works in node.js, using thesame npm package! It's mad science!
NOTE: To connect to "web peers" (browsers) in addition to normal BitTorrent peers, usewebtorrent-hybrid which includes WebRTCsupport for node.
WebTorrent is also available as acommand line app. Here's how to use it:
$ npm install webtorrent-cli -g$ webtorrent --help
To download a torrent:
$ webtorrent magnet_uri
To stream a torrent to a device likeAirPlay orChromecast, just pass a flag:
$ webtorrent magnet_uri --airplay
There are many supported streaming options:
--airplay Apple TV--chromecast Chromecast--mplayer MPlayer--mpv MPV--omx [jack] omx [default: hdmi]--vlc VLC--xbmc XBMC--stdout standard out [implies --quiet]
In addition to magnet uris, WebTorrent supportsmany ways to specify a torrent.
- Sep 2017 - Nordic JS -Get Rich Quick With P2P Crypto Currency
- May 2017 - Char.la -WebTorrent and Peerify (Spanish)
- Nov 2016 - NodeConf Argentina -Real world Electron: Building Cross-platform desktop apps with JavaScript
- May 2016 - SIGNAL Conference -BitTorrent in the Browser
- May 2015 - Data Terra Nemo -WebTorrent: Mother of all demos
- May 2015 - Data Terra Nemo -WebRTC Everywhere
- Nov 2014 - JSConf Asia -How WebTorrent Works
- Sep 2014 - NodeConf EU -WebRTC Mad Science (first working WebTorrent demo)
- Apr 2014 - CraftConf -Bringing BitTorrent to the Web
- May 2014 - JS.LA -How I Built a BitTorrent Client in the Browser (progress update; node client working)
- Oct 2013 - RealtimeConf -WebRTC Black Magic (first mention of idea for WebTorrent)
Most of the active development is happening inside of small npm packages which are used by WebTorrent.
"When applications are done well, they are just the really application-specific, brackish residue that can't be so easily abstracted away. All the nice, reusable components sublimate away onto github and npm where everybody can collaborate to advance the commons." — substack from"how I write modules"
These are the main modules that make up WebTorrent:
module | tests | version | description |
---|---|---|---|
webtorrent | torrent client (this module) | ||
bittorrent-dht | distributed hash table client | ||
bittorrent-peerid | identify client name/version | ||
bittorrent-protocol | bittorrent protocol stream | ||
bittorrent-tracker | bittorrent tracker server/client | ||
bittorrent-lsd | bittorrent local service discovery | ||
create-torrent | create .torrent files | ||
magnet-uri | parse magnet uris | ||
parse-torrent | parse torrent identifiers | ||
torrent-discovery | find peers via dht, tracker, and lsd | ||
ut_metadata | metadata for magnet uris (protocol extension) | ||
ut_pex | peer discovery (protocol extension) |
Innode, enable debug logs by setting theDEBUG
environment variable to the name of themodule you want to debug (e.g.bittorrent-protocol
, or*
to printall logs).
DEBUG=* webtorrent
In thebrowser, enable debug logs by running this in the developer console:
localStorage.setItem('debug','*')
Disable by running this:
localStorage.removeItem('debug')
MIT. Copyright (c)Feross Aboukhadijeh andWebTorrent, LLC.
About
⚡️ Streaming torrent client for the web