diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 0000000..c85bb20 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,60 @@ +body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + margin: 0; + padding: 20px; + } + h1 { + color: #333; + } + .container { + max-width: 800px; + margin: 0 auto; + background: #fff; + padding: 20px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + } + .section { + margin-bottom: 20px; + } + input[type="file"], + input[type="text"], + input[type="url"] { + width: calc(100% - 22px); + padding: 10px; + margin: 10px 0; + border: 1px solid #ccc; + border-radius: 4px; + } + button { + padding: 10px 20px; + background-color: #28a745; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + } + button:hover { + background-color: #218838; + } + .progress { + width: 100%; + background-color: #f3f3f3; + border-radius: 4px; + margin: 10px 0; + } + .progress-bar { + width: 0; + height: 20px; + background-color: #28a745; + border-radius: 4px; + text-align: center; + color: white; + line-height: 20px; + } + .result { + margin: 10px 0; + padding: 10px; + background-color: #e9ecef; + border-radius: 4px; + } \ No newline at end of file diff --git a/public/js/index.js b/public/js/index.js new file mode 100644 index 0000000..b943eb7 --- /dev/null +++ b/public/js/index.js @@ -0,0 +1,80 @@ +const client = new WebTorrent(); + +function uploadFile() { + const fileInput = document.getElementById("fileInput"); + const file = fileInput.files[0]; + const uploadProgressBar = document.getElementById("uploadProgressBar"); + + if (!file) { + alert("Please select a file to upload."); + return; + } + + const opts = { + announce: [trackerUrl], + }; + + client.seed(file, opts, (torrent) => { + fetch(`/generate-mnemonic/${torrent.infoHash}`) + .then((response) => response.json()) + .then((data) => { + const uploadResult = document.getElementById("uploadResult"); + uploadResult.innerHTML = `Started sharing file. Share this mnemonic: ${data.mnemonic} +
Note that the file will be available for download as long as this page is open. + `; + }); + + torrent.on("upload", () => { + const progress = Math.round((torrent.uploaded / torrent.length) * 100); + uploadProgressBar.style.width = `${progress}%`; + uploadProgressBar.textContent = `${progress}%`; + }); + }); +} + +function downloadFile() { + const mnemonicInput = document.getElementById("mnemonicInput").value; + const downloadProgressBar = document.getElementById("downloadProgressBar"); + + if (!mnemonicInput) { + alert("Please enter a mnemonic."); + return; + } + + fetch(`/get-infohash/${mnemonicInput}`) + .then((response) => response.json()) + .then((data) => { + const torrentId = data.infoHash; + + const opts = { + announce: [trackerUrl], + }; + + client.add(torrentId, opts, (torrent) => { + torrent.files[0].getBlob((err, blob) => { + if (err) { + const downloadResult = document.getElementById("downloadResult"); + downloadResult.innerHTML = `Error: ${err.message}`; + return; + } + + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = torrent.files[0].name; + a.click(); + + const downloadResult = document.getElementById("downloadResult"); + downloadResult.innerHTML = `File downloaded: ${torrent.files[0].name}`; + }); + + torrent.on("download", () => { + const progress = Math.round( + (torrent.downloaded / torrent.length) * 100 + ); + downloadProgressBar.style.width = `${progress}%`; + downloadProgressBar.textContent = `${progress}%`; + }); + }); + }); +} diff --git a/views/index.ejs b/views/index.ejs index f7531c0..6b10dcf 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -2,68 +2,7 @@ Transfer.coffee - + @@ -88,94 +27,6 @@
- +