initial commit
This commit is contained in:
commit
d601f329e8
8
Dockerfile
Normal file
8
Dockerfile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
FROM node:16-buster-slim
|
||||||
|
#RUN apt update && apt install -y git python && apt clean
|
||||||
|
RUN npm i bittorrent-tracker -g
|
||||||
|
COPY --chown=node:node . /home/node/wtshare
|
||||||
|
USER node
|
||||||
|
WORKDIR /home/node/wtshare
|
||||||
|
RUN npm i
|
||||||
|
ENTRYPOINT ["/bin/bash", "/home/node/wtshare/entrypoint.sh"]
|
25
README.md
Normal file
25
README.md
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# wtshare - WebTorrent Share
|
||||||
|
|
||||||
|
This project can be used with JS only, but if you like you can use `docker` and `docker-compose` to deploy
|
||||||
|
|
||||||
|
### Configuration and Recommendations
|
||||||
|
|
||||||
|
```
|
||||||
|
If you want to use this project consider using it behind a proxy, you need to set some variables in the file `main.js` file to work properly
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose build --no-cache
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### License
|
||||||
|
|
||||||
|
MIT
|
18
docker-compose.yml
Normal file
18
docker-compose.yml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
version: '2'
|
||||||
|
|
||||||
|
services:
|
||||||
|
wtshare:
|
||||||
|
build: ./
|
||||||
|
image: wtshare
|
||||||
|
container_name: wtshare
|
||||||
|
hostname: wtshare
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 3000:3000
|
||||||
|
- 8888:8888
|
||||||
|
- 8888:8888/udp
|
||||||
|
networks:
|
||||||
|
wtsharenet:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
wtsharenet:
|
3
entrypoint.sh
Normal file
3
entrypoint.sh
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
bittorrent-tracker -p 8888 --http --ws --udp --http-hostname 0.0.0.0 --udp-hostname 0.0.0.0 &
|
||||||
|
npm start
|
9
index.js
Normal file
9
index.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
const finalhandler = require('finalhandler'),
|
||||||
|
http = require('http'),
|
||||||
|
serveStatic = require('serve-static'),
|
||||||
|
serve = serveStatic('public/', { 'index': ['index.html'] }),
|
||||||
|
server = http.createServer(onRequest = (req, res) => {
|
||||||
|
serve(req, res, finalhandler(req, res))
|
||||||
|
}).listen(3000, () => {
|
||||||
|
console.log(`Listening on: ${server.address().address}:${server.address().port}`)
|
||||||
|
})
|
22
package.json
Normal file
22
package.json
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"name": "wtshare",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "WebTorrent Share",
|
||||||
|
"main": "index.js",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"start": "node index.js",
|
||||||
|
"install": "cp node_modules/webtorrent/webtorrent.min.js node_modules/jquery/dist/jquery.min.js node_modules/file-saver/dist/FileSaver.min.js public/js/ && cp node_modules/font-awesome/css/font-awesome.min.css public/css/ && cp -r node_modules/font-awesome/fonts public/"
|
||||||
|
},
|
||||||
|
"author": "ale",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"browserify": "*",
|
||||||
|
"file-saver": "*",
|
||||||
|
"finalhandler": "*",
|
||||||
|
"font-awesome": "*",
|
||||||
|
"jquery": "*",
|
||||||
|
"serve-static": "*",
|
||||||
|
"webtorrent": "*"
|
||||||
|
}
|
||||||
|
}
|
15
public/css/main.css
Normal file
15
public/css/main.css
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
body {
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.holder {
|
||||||
|
border: dotted #404040 3px;
|
||||||
|
border-radius: 25px;
|
||||||
|
min-height: 150px;
|
||||||
|
padding: 2rem;
|
||||||
|
margin: 2rem;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.white-border {
|
||||||
|
border: solid black 3px;
|
||||||
|
}
|
29
public/index.html
Normal file
29
public/index.html
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>WebTorrent</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="css/main.css">
|
||||||
|
<link rel="stylesheet" type="text/css" href="css/font-awesome.min.css">
|
||||||
|
<script type="text/javascript" src="js/jquery.min.js"></script>
|
||||||
|
<script type="text/javascript" src="js/FileSaver.min.js"></script>
|
||||||
|
<script type="text/javascript" src="js/webtorrent.min.js"></script>
|
||||||
|
<script type="text/javascript" src="js/main.js"></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h2>WebTorrent</h2>
|
||||||
|
<h3 id="status">Not Supported</h3>
|
||||||
|
<div id="holder" class="holder white-border">Drag&Drop files here to share</div>
|
||||||
|
<div id="title"></div>
|
||||||
|
<div><span id="progress">0</span>% of <span id="size">0</span>Mb</div>
|
||||||
|
<h4><span id="peers">0</span> <span class="fa fa-users"></span><br /><br /><span id="downloading">0</span>Kbps - <span
|
||||||
|
id="downloaded">0</span>Mb <span class="fa fa-arrow-down"></span><br /><br /><span id="uploading">0</span>Kbps -
|
||||||
|
<span id="uploaded">0</span>Mb <span class="fa fa-arrow-up"></span>
|
||||||
|
</h4>
|
||||||
|
<p><button class="btn btn-primary" onclick="downloadTorrent(window.torrent);"><span class="fa fa-download"></span> .torrent</button></p>
|
||||||
|
<div><a id="hash" target="_blank"></a></div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
136
public/js/main.js
Normal file
136
public/js/main.js
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
var downloadTorrent = function (torrent) {
|
||||||
|
saveAs(torrent.torrentFileBlobURL, torrent.name + '.torrent')
|
||||||
|
}
|
||||||
|
$(document).ready(function () {
|
||||||
|
var trackers = [
|
||||||
|
'ws://0.0.0.0:8888'
|
||||||
|
'http://0.0.0.0:8888/announce'
|
||||||
|
],
|
||||||
|
iceServers = [
|
||||||
|
{ urls: ['turn:???.com', 'stun:???.com'], username: '???', credential: '???' }
|
||||||
|
],
|
||||||
|
holder = $('.holder'),
|
||||||
|
input = $('.input'),
|
||||||
|
file = $('.file')
|
||||||
|
function torrentEvents(torrent, seeding) {
|
||||||
|
torrent.on('metadata', function () {
|
||||||
|
$('#title').text(torrent.name)
|
||||||
|
$('#hash').text('/#' + torrent.infoHash)
|
||||||
|
$('#hash').attr('href', '/#' + torrent.infoHash)
|
||||||
|
$('#size').text(Math.round((torrent.length / 1024 / 1024) * 100) / 100)
|
||||||
|
})
|
||||||
|
torrent.on('ready', function () {
|
||||||
|
$('#holder').empty()
|
||||||
|
window.torrent = torrent
|
||||||
|
})
|
||||||
|
torrent.on('download', function (bytes) {
|
||||||
|
$('#status').text('Downloading')
|
||||||
|
updateTorrent(torrent)
|
||||||
|
$('#progress').text(Math.round(torrent.progress * 10000) / 100 || '0')
|
||||||
|
})
|
||||||
|
torrent.on('wire', function (wire) {
|
||||||
|
$('#peers').text(torrent.numPeers || '0')
|
||||||
|
})
|
||||||
|
torrent.on('done', function () {
|
||||||
|
$('#status').text('Downloaded')
|
||||||
|
torrent.files.forEach(function (file) {
|
||||||
|
file.appendTo('#holder', { autoplay: true, mute: true }, function (err, elem) {
|
||||||
|
if (err) {
|
||||||
|
$('#status').text(err)
|
||||||
|
} else {
|
||||||
|
$('#status').text('Content loaded')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
updateTorrent(torrent)
|
||||||
|
$('#downloading').text('0')
|
||||||
|
$('#uploading').text('0')
|
||||||
|
if (!seeding) {
|
||||||
|
torrent.files.forEach(function (data) {
|
||||||
|
data.getBlobURL(function (err, url) {
|
||||||
|
saveAs(url, data.name)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
torrent.on('upload', function (data) {
|
||||||
|
$('#status').text('Uploading')
|
||||||
|
updateTorrent(torrent)
|
||||||
|
})
|
||||||
|
torrent.on('noPeers', function () {
|
||||||
|
$('#status').text('No Peers')
|
||||||
|
updateTorrent(torrent)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
function seed(files) {
|
||||||
|
var client = new WebTorrent({
|
||||||
|
tracker: WebTorrent.WEBRTC_SUPPORT ? {
|
||||||
|
rtcConfig: {
|
||||||
|
iceServers: iceServers
|
||||||
|
}
|
||||||
|
} : false
|
||||||
|
}),
|
||||||
|
torrent = client.seed(files, {
|
||||||
|
announce: trackers
|
||||||
|
})
|
||||||
|
torrentEvents(torrent, true)
|
||||||
|
}
|
||||||
|
function updateTorrent(torrent) {
|
||||||
|
$('#downloading').text(Math.round(torrent.downloadSpeed / 10) / 100 || '0')
|
||||||
|
$('#downloaded').text(Math.round((torrent.downloaded / 1024 / 1024) * 100) / 100)
|
||||||
|
$('#uploading').text(Math.round(torrent.uploadSpeed / 10) / 100 || '0')
|
||||||
|
$('#uploaded').text(Math.round((torrent.uploaded / 1024 / 1024) * 100) / 100)
|
||||||
|
$('#peers').text(torrent.numPeers || 0)
|
||||||
|
}
|
||||||
|
holder.on('drop', function (event) {
|
||||||
|
event.preventDefault()
|
||||||
|
event.stopPropagation()
|
||||||
|
holder.removeClass('white-border')
|
||||||
|
if (event.originalEvent.dataTransfer.files) {
|
||||||
|
var files = event.originalEvent.dataTransfer.files
|
||||||
|
if (files.length > 1) {
|
||||||
|
var names = []
|
||||||
|
for (var i = 0; i < files.length; i++) {
|
||||||
|
names.push(files[i].name)
|
||||||
|
}
|
||||||
|
$('#title').text(names.join(', '))
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$('#title').text(files[0].name)
|
||||||
|
}
|
||||||
|
seed(files)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
.on('dragover', function (event) {
|
||||||
|
event.preventDefault()
|
||||||
|
event.stopPropagation()
|
||||||
|
holder.addClass('white-border')
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
.on('dragleave', function (event) {
|
||||||
|
event.preventDefault()
|
||||||
|
event.stopPropagation()
|
||||||
|
holder.removeClass('white-border')
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
if (!window.FileReader || !WebTorrent.WEBRTC_SUPPORT) {
|
||||||
|
$('#status').text('WebTorrent NOT Ready')
|
||||||
|
} else {
|
||||||
|
$('#status').text('WebTorrent Ready')
|
||||||
|
$('#holder').text('Drag&Drop files here to share')
|
||||||
|
if (window.location.hash.substr(1)) {
|
||||||
|
var client = new WebTorrent({
|
||||||
|
tracker: WebTorrent.WEBRTC_SUPPORT ? {
|
||||||
|
rtcConfig: {
|
||||||
|
iceServers: iceServers
|
||||||
|
}
|
||||||
|
} : false
|
||||||
|
}),
|
||||||
|
torrent = client.add(window.location.hash.substr(1), {
|
||||||
|
announce: trackers
|
||||||
|
})
|
||||||
|
torrentEvents(torrent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
Loading…
Reference in New Issue
Block a user