Skip to content

Instantly share code, notes, and snippets.

@connor-davis
Last active May 9, 2021 09:44
Show Gist options
  • Save connor-davis/b8dc93e5fcfe5c5a750f25154c2c8a0e to your computer and use it in GitHub Desktop.
Save connor-davis/b8dc93e5fcfe5c5a750f25154c2c8a0e to your computer and use it in GitHub Desktop.
Hyperbeam file streamer
let HyperBeam = require("hyperbeam");
let ndjson = require("ndjson");
let fs = require("fs");
let path = require("path");
let uuid = require("uuid");
let progress = require("progress-stream");
let readline = require("readline");
let beam = new HyperBeam("dropzone-file-tunnel");
let incoming = ndjson.parse();
let outgoing = ndjson.stringify();
let transferQueue = {};
let interface = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
outgoing.pipe(beam).pipe(incoming);
incoming.on("data", (data) => {});
fs.watch(path.join(process.cwd(), "send"), (event, filename) => {
if (event === "rename")
setTimeout(() => {
transferFile(path.join(process.cwd(), "send", filename), filename);
}, 1000);
});
function formatSizeUnits(bytes) {
if (bytes >= 1073741824) {
bytes = (bytes / 1073741824).toFixed(2) + " GB";
} else if (bytes >= 1048576) {
bytes = (bytes / 1048576).toFixed(2) + " MB";
} else if (bytes >= 1024) {
bytes = (bytes / 1024).toFixed(2) + " KB";
} else if (bytes > 1) {
bytes = bytes + " bytes";
} else if (bytes == 1) {
bytes = bytes + " byte";
} else {
bytes = "0 bytes";
}
return bytes;
}
let transferFile = (filePath, fileName) => {
let fileIdentity = uuid.v4();
let item = {
filePath,
fileName,
fileIdentity,
fileSent: false,
};
transferQueue[fileName] = item;
// receiveBeam(fileName);
sendBeam(fileName);
};
let receiveBeam = (identity) => {};
let sendBeam = (identity) => {
let packetBeam = new HyperBeam(identity);
let packetIncoming = ndjson.parse();
let packetOutgoing = ndjson.stringify();
packetOutgoing.pipe(packetBeam).pipe(packetIncoming);
let { filePath, fileName, fileIdentity, fileSent } = transferQueue[identity];
packetOutgoing.write({
type: "start",
fileIdentity,
fileName,
});
let { size } = fs.statSync(filePath);
let progressStream = progress({
length: size,
time: 1000,
});
progressStream.on("progress", (progress) => {
let min = Math.floor(progress.eta / 60);
let sec = progress.eta - min * 60;
console.log(
"Transferring " +
fileName +
" - " +
Math.round(progress.percentage) +
"% at " +
formatSizeUnits(progress.speed) +
"/s - " +
" etc - " +
min +
"min : " +
sec +
" sec"
);
packetOutgoing.write({
type: "progress",
fileIdentity,
percentage: progress.percentage,
eta: `${min} min ${sec} sec`,
speed: `${formatSizeUnits(progress.speed)}/s`,
});
if (progress.percentage === 100) {
packetOutgoing.write({
type: "finish",
fileIdentity,
});
}
});
fs.createReadStream(filePath).pipe(progressStream).pipe(packetOutgoing);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment