';
}
document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts;
}
function multiSort(array, sortObject = {}) {
const sortKeys = Object.keys(sortObject);
// Return array if no sort object is supplied.
if (!sortKeys.length) {
return array;
}
// Change the values of the sortObject keys to -1, 0, or 1.
for (let key in sortObject) {
sortObject[key] = sortObject[key] === 'desc' || sortObject[key] === -1 ? -1 :
(sortObject[key] === 'skip' || sortObject[key] === 0 ? 0 : 1);
}
const keySort = (a, b, direction) => {
direction = direction !== null ? direction : 1;
if (a === b) { // If the values are the same, do not switch positions.
return 0;
}
// If b > a, multiply by -1 to get the reverse direction.
return a > b ? direction : -1 * direction;
};
return array.sort((a, b) => {
let sorted = 0;
let index = 0;
// Loop until sorted (-1 or 1) or until the sort keys have been processed.
while (sorted === 0 && index < sortKeys.length) {
const key = sortKeys[index];
if (key) {
const direction = sortObject[key];
sorted = keySort(a[key], b[key], direction);
index++;
}
}
return sorted;
});
}
}
//SHOW MODAL WITH HOSTING CONTRACT DETAILS
showHostingContractDetails(counter) {
EthoUploads.resetContractExtensionChange();
GlobalHostingContractDetailArray = GlobalHostingContractArray[counter];
$("#contractDetailModal").iziModal();
$("#contractDetailModal").iziModal("open");
document.getElementById("contract-detail-name").innerHTML = GlobalHostingContractDetailArray['name'];
var hashOutputString = "";
var hostingContractEntry = "";
for (var i = 1; GlobalHostingContractDetailArray['hash'].length > i; i++) {
addNewTableEntry(GlobalHostingContractDetailArray['hash'][i], GlobalHostingContractDetailArray['path'][i], i);
}
document.getElementById("contract-detail-startblock").innerHTML = GlobalHostingContractDetailArray['startblock'];
document.getElementById("contract-detail-endblock").innerHTML = GlobalHostingContractDetailArray['endblock'];
document.getElementById("contract-detail-status").innerHTML = GlobalHostingContractDetailArray['status'];
document.getElementById("contract-detail-size").innerHTML = (GlobalHostingContractDetailArray['storage'] / 1048576);
function addNewTableEntry(ethoFSHostingContractHash, ethoFSHostingContractPath, count) {
var table = document.getElementById("contract-detail-table");
var row = table.insertRow(count + 10);
var cell1 = row.insertCell(0);
cell1.innerHTML = '' + ethoFSHostingContractHash + '';
}
}
resetContractDetailTableRows() {
var x = document.getElementById("contract-detail-table").rows.length;
for (var y = (x - 1); y > 10; y--) {
document.getElementById("contract-detail-table").deleteRow(y);
}
}
//LOCK CONTRACT TABLE DOWN - NO USER ACCOUNT
outputNoAddressContractTable() {
hostingContracts = '
No Hosting Contracts Found
';
document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts;
}
//LOCK CONTRACT TABLE DOWN - NO USER ACCOUNT
outputNoAddressContractTableWithButton() {
hostingContracts = '
No Hosting Contracts Found
';
document.getElementById("hostingcontractstablebody").innerHTML = hostingContracts;
}
resetContractExtensionChange() {
GlobalExtensionDuration = 0;
document.getElementById("contract-extension-cost").innerHTML = 0;
document.getElementById("extend-contract").selectedIndex = "0";
}
//CONTRACT EXTENSION VALUE CHANGE
contractExtensionChange(selectObj) {
var index = selectObj.selectedIndex;
var extensionDuration = selectObj.options[index].value;
console.log("Extenstion Duration: " + extensionDuration);
GlobalExtensionDuration = extensionDuration;
document.getElementById("contract-extension-button").style.visibility = "visible";
var extensionCost = ((GlobalHostingContractDetailArray['storage'] / 1048576) * GlobalHostingCost) * (extensionDuration / 46522);
document.getElementById("contract-extension-cost").innerHTML = EthoUploads.round(extensionCost, 2);
}
//CONTRACT EXTENSION CONFIRM
contractExtensionConfirmation() {
if (GlobalExtensionDuration > 0) {
var extensionDuration = GlobalExtensionDuration;
var ethoFSController = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress);
var extensionCost = EthoUploads.calculateCost(GlobalHostingContractDetailArray['storage'], extensionDuration, GlobalHostingCostWei);
const transactionObject = {
from: GlobalUserAddress,
value: extensionCost
};
if (privateKeyLogin == true) {
const tx = {
to: GlobalControllerContractAddress,
from: GlobalUserAddress,
value: extensionCost,
gas: 4000000,
data: ethoFSController.methods.ExtendContract(GlobalHostingContractDetailArray['address'], extensionDuration).encodeABI()
};
var privateKey = '0x' + GlobalPrivateKey;
console.log("Private Key: " + privateKey);
web3.eth.accounts.signTransaction(tx, privateKey)
.then(function (signedTransactionData) {
console.log("Signed TX Data: " + signedTransactionData.rawTransaction);
web3.eth.sendSignedTransaction(signedTransactionData.rawTransaction, function (error, result) {
if (!error) {
if (result) {
$("#contractDetailModal").iziModal("close");
$("#minedBlockTrackerModal").iziModal();
$("#minedBlockTrackerModal").iziModal("open");
EthoUploads.waitForReceipt(result, function (receipt) {
console.log("Transaction Has Been Mined: " + receipt);
$("#minedBlockTrackerModal").iziModal("close");
EthoUploads.updateContractTable();
});
} else {
console.log("There was a problem adding new contract");
}
} else {
console.error(error);
}
});
});
} else {
ethoFSController.methods.ExtendContract(GlobalHostingContractDetailArray['address'], extensionDuration).send(transactionObject, function (error, result) {
if (!error) {
if (result) {
$('#contractDetailModal').iziModal('close');
$("#minedBlockTrackerModal").iziModal();
$('#minedBlockTrackerModal').iziodal('open');
EthoUploads.waitForReceipt(result, function (receipt) {
console.log("Transaction Has Been Mined: " + receipt);
$('#minedBlockTrackerModal').iziModal('close');
EthoUploads.updateContractTable();
});
}
} else {
console.log(error);
}
});
}
}
}
subscribeToHealthChannel() {
window.node.pubsub.subscribe(info.id + "_alpha11", EthoUploads.healthMessageHandler)
.catch(() => EthoUploads.onError('An error occurred when subscribing to the health check workspace.'))
}
healthMessageHandler(message) {
healthMessage = message.data.toString();
EthoUploads.UpdateHealthCheckInfo(healthMessage);
}
UpdateHealthCheckInfo(healthMessage) {
var mainMessage = healthMessage.split(";")[1];
var splitMessage = mainMessage.split(",");
var usedStorageTotal = 0;
var availableStorageTotal = 0;
var activeHistory = 0;
var nodeCounter = 0;
splitMessage.forEach(function (nodeMessage, index) {
var nodeSplitMessage = nodeMessage.split(":");
activeHistory = Number(nodeSplitMessage[5]);
if (activeHistory >= 5) {
nodeCounter++;
usedStorageTotal += Number(nodeSplitMessage[8]);
availableStorageTotal += Number(nodeSplitMessage[7]);
}
if (index == (splitMessage.length - 1)) {
updateStorageArrays(usedStorageTotal, availableStorageTotal, nodeCounter);
}
});
function updateStorageArrays(usedStorageTotal, availableStorageTotal, nodecount) {
if (availableStorageArray.length >= 50) {
if (availableStorageTotal > 0.75 * averageAvailableStorageTotal && availableStorageTotal < 1.25 * averageAvailableStorageTotal) {
availableStorageArray.push(availableStorageTotal);
availableStorageArray.shift();
}
} else {
availableStorageArray.push(availableStorageTotal);
}
if (nodeCountArray.length >= 50) {
nodeCountArray.push(nodecount);
nodeCountArray.shift();
} else {
nodeCountArray.push(nodecount);
}
calculateStorageAverages(usedStorageArray, availableStorageArray, nodeCountArray);
}
function calculateStorageAverages(usedStorageArray, availableStorageArray, nodeCountArray) {
var sumAvailableStorage = 0;
availableStorageArray.forEach(function (value, index) {
sumAvailableStorage += value;
if (index == (availableStorageArray.length - 1)) {
averageAvailableStorageTotal = (sumAvailableStorage / availableStorageArray.length);
document.getElementById("nodestorage").textContent = (EthoUploads.round(2 + ((averageAvailableStorageTotal) / 1000000), 1)) + "TB";
}
});
var sumNodeCount = 0;
nodeCountArray.forEach(function (value, index) {
sumNodeCount += value;
if (index == (nodeCountArray.length - 1)) {
var averageNodeCount = (sumNodeCount / nodeCountArray.length) + 19;
document.getElementById("nodecount").textContent = (EthoUploads.round(averageNodeCount, 0));
}
});
}
}
messageHandler(message) {
messageString = message.data.toString();
}
receiveExitMsg(msg) {
console.log("Content Upload Successful")
}
exitMessageHandler(message) {
const cancelMessageString = message.data.toString()
}
subscribeToMessaging() {
for (var i = 4; i < PeersForChannel.length; i++) {
window.node.pubsub.subscribe(PeersForChannel[i] + "PinningChannel_alpha11", messageHandler)
.catch(() => EthoUploads.onError('An error occurred when subscribing to the workspace.'))
}
}
unsubscribeToMessaging() {
for (var i = 4; i < PeersForChannel.length; i++) {
window.node.pubsub.unsubscribe(PeersForChannel[i] + "PinningChannel_alpha11", exitMessageHandler)
.catch(() => EthoUploads.onError('An error occurred when unsubscribing to the workspace.'))
}
}
publishImmediatePin(hash) {
const data = Buffer.from(hash)
for (var i = 0; i < PeersForChannel.length; i++) {
var channel = PeersForChannel[i] + "ImmediatePinningChannel_alpha11";
window.node.pubsub.publish(channel, data)
.catch(() => EthoUploads.onError('An error occurred when publishing the message.'))
}
}
resetProgress() {
$progressBar = document.querySelector('#progress-bar')
$progressBar.style.transform = 'translateX(-100%)'
}
appendFile(name, hash, size, data) {
$fileHistory = document.querySelector('#file-history tbody')
const file = new window.Blob([data], {
type: 'application/octet-binary'
})
const url = window.URL.createObjectURL(file)
const row = document.createElement('tr')
const nameCell = document.createElement('td')
nameCell.innerHTML = name
const hashCell = document.createElement('td')
hashCell.innerHTML = hash
const sizeCell = document.createElement('td')
sizeCell.innerText = size
const downloadCell = document.createElement('td')
const link = document.createElement('a')
link.setAttribute('href', url)
link.setAttribute('download', name)
link.innerHTML = ''
downloadCell.appendChild(link)
row.appendChild(nameCell)
row.appendChild(hashCell)
row.appendChild(sizeCell)
row.appendChild(downloadCell)
$fileHistory.insertBefore(row, $fileHistory.firstChild)
}
resetFileTable() {
while ($fileHistory.hasChildNodes()) {
$fileHistory.removeChild($fileHistory.firstChild);
}
}
onDragEnter(event) {
$dragContainer = document.querySelector('#drag-container')
$dragContainer.classList.add('dragging')
}
onDragLeave() {
$dragContainer = document.querySelector('#drag-container')
$dragContainer.classList.remove('dragging')
}
startUploadProcess() {
console.log("Starting Upload Process..");
var streamFinishCount = 0;
for (var i = 0; i < MainFileArray.length; i++) {
const streamFiles = (files) => {
const stream = node.addReadableStream()
stream.on('data', function (data) {
GlobalHashArray.push(`${data.hash}`);
GlobalSizeArray.push(`${data.size}`);
GlobalPathArray.push(`${data.path}`);
GlobalUploadHash = `${data.hash}`;
GlobalUploadPath = `${data.path}`;
console.log("Path: " + data.path + " Hash: " + data.hash);
var comparePath = data.path.replace(/\\/g, '/');
console.log("Compare Path: " + comparePath);
var splitString = comparePath.split("/")
if (splitString.length == 1 || splitString[0] == "") {
streamFinishCount++;
GlobalMainHashArray.push(`${data.hash}`);
GlobalMainPathArray.push(`${data.path}`);
if (streamFinishCount == MainFileArray.length) {
console.log("Finish Path: " + data.path + " Hash: " + data.hash);
createMainHash();
}
}
});
files.forEach(file => stream.write(file))
stream.end()
}
var filesForStream = MainFileArray[i];
streamFiles(filesForStream);
}
function streamFilesExternally(filesArray, MainHashArray) {
var confirmationServers = ["https://ipfsapi.ethofs.com/ipfs/", "https://ipfsapi1.ethofs.com/ipfs/", "https://ipfsapi2.ethofs.com/ipfs/", "https://ipfsapi5.ethofs.com/ipfs/", "https://ipfsapi6.ethofs.com/ipfs/", "https://ipfsapi7.ethofs.com/ipfs/"];
let hashVerificationArray = [...GlobalHashArray, ...GlobalMainHashArray];
hashVerificationArray.push(GlobalMainContentHash);
var hashConfirmationCount = 0;
var uploadCompleteFlag = false;
for (var i = 0; i < MainHashArray.length; i++) {
console.log("Sending Immediate Pin Request: " + MainHashArray[i]);
EthoUploads.publishImmediatePin(MainHashArray[i]);
}
setTimeout(function () {
hashVerificationArray.forEach(function (hash) {
verifyDataUpload(hash);
});
}, 5000);
const verifyDataUpload = async hash => {
var confirmationServer = confirmationServers[Math.floor(Math.random() * confirmationServers.length)];
var url = confirmationServer + hash;
try {
const response = await fetch(url);
console.log("Data Confirmation Status: " + response.status + " Hash: " + hash);
if (response.status == 200) {
hashConfirmationCount++;
var confirmationPercentage = Math.ceil((hashConfirmationCount / hashVerificationArray.length) * 100);
EthoUploads.updateUploadProgress(confirmationPercentage);
console.log("Data Upload Confirmation Received: " + hashConfirmationCount + "/" + hashVerificationArray.length);
$uploadMessage.innerText = "Upload Confirmation Received: " + hashConfirmationCount + "/" + hashVerificationArray.length;
if (confirmationPercentage >= 99) {
$uploadMessage.innerText = "Upload Complete";
document.getElementById("upload-status-message").textContent = "Complete";
if (!uploadCompleteFlag) {
uploadCompleteFlag = true;
EthoUploads.updateContractTable();
EthoUploads.finishUploadModal();
}
return;
}
} else {
var confirmationPercentage = Math.ceil((hashConfirmationCount / hashVerificationArray.length) * 100);
if (confirmationPercentage < 99) {
setTimeout(function () {
verifyDataUpload(hash)
}, 2000);
} else {
return;
}
}
} catch (error) {
console.log(error);
console.log("Data Confirmation Error: " + error.status);
var confirmationPercentage = Math.ceil((hashConfirmationCount / hashVerificationArray.length) * 100);
if (confirmationPercentage < 99) {
setTimeout(function () {
verifyDataUpload(hash)
}, 2000);
} else {
return;
}
}
};
}
function createMainHash() {
var contentHashString = GlobalChannelString;
for (i = 0; i < GlobalMainHashArray.length; i++) {
contentHashString += ":" + GlobalMainHashArray[i];
}
window.node.add(Buffer.from(contentHashString), (err, res) => {
if (err || !res) {
return console.error('ipfs add error', err, res)
}
res.forEach((file) => {
if (file && file.hash) {
GlobalMainContentHash = file.hash;
AddNewPin(GlobalUploadHash, GlobalUploadSize, document.getElementById('newcontractname').value, GlobalContractDuration);
}
});
});
}
function AddNewPin(pinToAdd, pinSize, HostingContractName, HostingContractDuration) {
var contentHashString = GlobalChannelString;
var contentPathString = GlobalChannelString;
for (i = 0; i < GlobalMainHashArray.length; i++) {
contentHashString += ":" + GlobalMainHashArray[i];
contentPathString += ":" + GlobalMainPathArray[i];
}
var MainHashArray = GlobalMainHashArray;
GlobalUploadName = HostingContractName;
var contractCost = EthoUploads.calculateCost(pinSize, HostingContractDuration, GlobalHostingCostWei);
var pinAdding = new web3.eth.Contract(GlobalControllerABI, GlobalControllerContractAddress);
const transactionObject = {
from: GlobalUserAddress,
value: contractCost
};
console.log("Contract Address: " + GlobalControllerContractAddress + " Value: " + contractCost);
if (privateKeyLogin == true) {
const tx = {
to: GlobalControllerContractAddress,
from: GlobalUserAddress,
value: contractCost,
gas: 4000000,
data: pinAdding.methods.AddNewContract(GlobalMainContentHash, HostingContractName, HostingContractDuration, pinSize, pinSize, contentHashString, contentPathString).encodeABI()
};
var privateKey = '0x' + GlobalPrivateKey;
console.log("Private Key: " + privateKey);
web3.eth.accounts.signTransaction(tx, privateKey)
.then(function (signedTransactionData) {
console.log("Signed TX Data: " + signedTransactionData.rawTransaction);
web3.eth.sendSignedTransaction(signedTransactionData.rawTransaction, function (error, result) {
if (!error) {
if (result) {
console.log("Result: " + result);
$("#minedBlockTrackerModal").iziModal();
$('#minedBlockTrackerModal').iziModal('open');
$miningMessage = document.querySelector('.mining-message')
$('#preparingUploadModal').iziModal('close');
EthoUploads.waitForReceipt(result, function (receipt) {
console.log("Transaction Has Been Mined: " + receipt);
$('#minedBlockTrackerModal').iziModal('close');
$('#nodeModal').iziModal('close');
var filesForStream = MainFileArray;
streamFilesExternally(filesForStream, MainHashArray);
EthoUploads.checkForUploadedContentAvailability(HostingContractName);
});
} else {
console.log("There was a problem adding new contract");
}
} else {
console.error(error);
}
});
});
} else {
pinAdding.methods.AddNewContract(GlobalMainContentHash, HostingContractName, HostingContractDuration, pinSize, pinSize, contentHashString, contentPathString).send(transactionObject, function (error, result) {
if (!error) {
if (result) {
$('#minedBlockTrackerModal').iziModal();
$('#minedBlockTrackerModal').iziModal('open');
$miningMessage = document.querySelector('.mining-message')
$('#preparingUploadModal').iziModal('close');
EthoUploads.waitForReceipt(result, function (receipt) {
console.log("Transaction Has Been Mined: " + receipt);
$('#minedBlockTrackerModal').iziModal('close');
$('#nodeModal').iziModal('close');
var filesForStream = MainFileArray;
streamFilesExternally(filesForStream, MainHashArray);
EthoUploads.checkForUploadedContentAvailability(HostingContractName);
});
} else {
console.log("There was a problem adding new contract");
}
} else {
console.error(error);
}
});
}
}
}
updateUploadProgress(width) {
var elem = document.getElementById("myBar");
width = EthoUploads.round(width, 2);
if (width >= 100) {
width = 100;
elem.style.width = width + '%';
elem.innerHTML = width * 1 + '%';
}
elem.style.width = width + '%';
elem.innerHTML = width * 1 + '%';
}
resetUploadProcess() {
EthoUploads.resetFileTable();
EthoUploads.updateUploadProgress(0);
$uploadMessage.innerText = "Preparing Upload";
document.getElementById("upload-status-message").textContent = "";
MainFileArray = new Array();
GlobalUploadSize = 0;
GlobalUploadSizeMB = 0;
}
updateAnalyzeProgress(width) {
var elem = document.getElementById("myAnalyzeBar");
width = EthoUploads.round(width, 2);
if (width >= 100) {
width = 100;
elem.style.width = width + '%';
elem.innerHTML = width * 1 + '%';
}
elem.style.width = width + '%';
elem.innerHTML = width * 1 + '%';
}
onFileUpload(event) {
event.preventDefault()
document.getElementById("upload-hash").textContent = "ANALYZING UPLOAD DATA";
document.getElementById("upload-confirm-button").style.visibility = "hidden";
MainFileArray.push([]);
let dirSelected = event.target.files;
let dirName = dirSelected[0].name;
let dirPath = dirSelected[0].path;
var streamCompareCount = 0;
var totalUploadItems = 0;
readDirectoryContents(dirPath);
function readDirectoryContents(directory) {
console.log("Directory Path: " + directory);
fs.readdir(directory, function (err, filesUploaded) {
if (!err) {
for (let i = 0; filesUploaded.length > i; i++) {
handleItem(filesUploaded[i], directory);
}
} else {
console.log("File Upload Error: " + err);
}
});
}
function handleItem(filename, relativePath) {
var filepath = relativePath.concat(pathSymbol, filename);
fs.stat(filepath, function (err, stats) {
if (!err) {
if (stats.isDirectory()) {
readDirectoryContents(filepath)
} else {
streamCompareCount++;
totalUploadItems++;
console.log("File Path: " + filepath);
fs.readFile(filepath, function (err, file) {
var updatedPath = filepath.replace(dirPath, dirName);
var filetowrite = {
path: updatedPath,
content: file
};
var filename = updatedPath;
MainFileArray[MainFileArray.length - 1].push(filetowrite);
GlobalUploadSize += Number(stats.size);
GlobalUploadSizeMB += Number(stats.size) / 1000000;
fileSize += Number(stats.size) / 1000000;
var totalUploadSizeMB = GlobalUploadSizeMB;
EthoUploads.appendFile(updatedPath, filename, stats.size, null);
console.log("Path: " + filepath + " Size: " + stats.size + " Total Size: " + GlobalUploadSize);
document.getElementById("upload-size").textContent = totalUploadSizeMB;
EthoUploads.contractDurationChange(document.getElementById('contract-duration'));
EthoUploads.updateAnalyzeProgress(((totalUploadItems - streamCompareCount) / totalUploadItems));
if (streamCompareCount == 0) {
document.getElementById("upload-hash").textContent = "READY FOR UPLOAD";
document.getElementById("upload-confirm-button").style.visibility = "visible";
}
});
}
} else {
console.log("File Stats Error: " + err);
}
});
}
}
onDrop(event) {
MainFileArray.push([]);
document.getElementById("upload-hash").textContent = "ANALYZING UPLOAD DATA";
document.getElementById("upload-confirm-button").style.visibility = "hidden";
fileSize = 0;
EthoUploads.resetProgress();
EthoUploads.onDragLeave()
event.preventDefault()
if (GlobalUploadHash != "" && GlobalUploadPath != "") {
GlobalMainHashArray.push(GlobalUploadHash);
GlobalMainPathArray.push(GlobalUploadPath);
}
const dt = event.dataTransfer
const filesDropped = dt.files
const itemsDropped = dt.items
function readFileContents(file) {
return new Promise((resolve) => {
const reader = new window.FileReader()
reader.onload = (event) => resolve(event.target.result)
reader.readAsArrayBuffer(file)
})
}
var totalItemCount = 0;
var streamCompareCount = 0;
function initialHandleItems(items) {
const files = [];
totalItemCount = items.length;
streamCompareCount = items.length;
for (var item of items) {
var awaitHandleEntry = handleEntry(item.webkitGetAsEntry());
}
function handleEntry(entry) {
if (entry.isFile) {
getFile(entry);
function getFile(entry) {
document.getElementById("upload-hash").textContent = "ANALYZING UPLOAD DATA";
document.getElementById("upload-confirm-button").style.visibility = "hidden";
entry.file(function (file) {
readFileContents(file)
.then((buffer) => {
var filePath = entry.fullPath;
var filetowrite = {
path: entry.fullPath,
content: Buffer.from(buffer)
};
MainFileArray[MainFileArray.length - 1].push(filetowrite);
GlobalUploadSize += Number(file.size);
fileSize += Number(file.size);
var totalUploadSizeMB = GlobalUploadSize / 1000000;
EthoUploads.appendFile(entry.fullPath, entry.name, file.size, null);
document.getElementById("upload-size").textContent = totalUploadSizeMB;
EthoUploads.contractDurationChange(document.getElementById('contract-duration'));
streamCompareCount--;
EthoUploads.updateAnalyzeProgress(((totalItemCount - streamCompareCount) / totalItemCount));
if (streamCompareCount == 0) {
document.getElementById("upload-hash").textContent = "READY FOR UPLOAD";
document.getElementById("upload-confirm-button").style.visibility = "visible";
}
});
});
}
} else if (entry.isDirectory) {
let directoryReader = entry.createReader();
directoryReader.readEntries(function (entries) {
streamCompareCount += entries.length - 1;
totalItemCount += entries.length - 1;
entries.forEach(function (newEntry) {
handleEntry(newEntry);
});
});
}
}
}
initialHandleItems(event.dataTransfer.items);
}
connectToPeer(event) {
const multiaddr = $multiaddrInput.value
if (!multiaddr) {
return EthoUploads.onError('No multiaddr was inserted.')
}
window.node.swarm.connect(multiaddr)
.then(() => {
EthoUploads.onSuccess(`Successfully connected to peer.`)
$multiaddrInput.value = ''
})
.catch(() => EthoUploads.onError('An error occurred when connecting to the peer.'))
}
updatePeerProgress(width, peercount) {
var backgroundcolor = "";
var elem = document.getElementById("myPeerBar");
width = EthoUploads.round(width, 2);
if (width >= 100) {
width = 100;
}
if (width >= 80) {
backgroundcolor = '"#3CB371"';
} else if (width >= 40 && width < 80) {
backgroundcolor = '"#FFFF00"';
} else {
backgroundcolor = '"#FF0000"';
}
elem.style.width = width + '%';
}
refreshPeerList() {
var updatedPeerCount = 0;
window.node.swarm.peers()
.then((peers) => {
const peersAsHtml = peers.reverse()
.map((peer) => {
if (peer.addr) {
const addr = peer.addr.toString()
if (addr.indexOf('ipfs') >= 0) {
return addr
} else {
return addr + peer.peer.id.toB58String()
}
}
})
.map((addr) => {
var splitString = addr.split("/");
addr = splitString[splitString.length - 1];
updatedPeerCount++;
if (!PeersForChannel.includes(addr)) {
PeersForChannel.push(addr);
}
return `
${addr}
`
}).join('')
}).then(() => {
EthoUploads.updatePeerProgress(((updatedPeerCount / 7) * 100), updatedPeerCount)
})
.catch((error) => EthoUploads.onError(error))
}
onSuccess(msg) {
$logs.classList.add('success')
$logs.innerHTML = msg
}
onError(err) {
let msg = 'An error occured, check the dev console'
if (err.stack !== undefined) {
msg = err.stack
} else if (typeof err === 'string') {
msg = err
}
$logs.classList.remove('success')
$logs.innerHTML = msg
}
updateView(state, ipfs) {
if (states[state] !== undefined) {
states[state]()
} else {
throw new Error('Could not find state "' + state + '"')
}
}
startApplication() {
window.startNode()
EthoUploads.extendedStartApplication()
}
extendedStartApplication() {
$ethomessage.innerText = GlobalUserAddress;
}
stopApplication() {
EthoUploads.resetUploadProcess();
EthoUploads.resetFileTable();
}
renderUploads() {
EthoMainGUI.renderTemplate("uploads.html", {});
$(document).trigger("render_uploads");
}
}
// create new uploads variable
EthoUploads = new Uploads();
$(document).on("render_uploads", function () {
$('#privatekeytable').hide();
$('#walletpasswordtable').hide();
if (isFullySynced) {
(function ($, _M) {
M.toast({
html: 'Node is fully synced and operational.',
displayLength: 10000
});
}(jQuery, M));
} else {
(function ($, _M) {
M.toast({
html: 'Node is still syncing. Please do not attempt to use the wallet or ethoFS upload system.',
displayLength: 10000
});
}(jQuery, M));
}
// Misc
$ethomessage = document.querySelector('.etho-message')
$nodeId = document.querySelector('.node-id')
$logs = document.querySelector('#logs')
$fetchButton = document.querySelector('#fetch-btn')
$allDisabledButtons = document.querySelectorAll('button:disabled')
$allDisabledInputs = document.querySelectorAll('input:disabled')
$allDisabledElements = document.querySelectorAll('.disabled')
EthoUploads.beforeLoginState();
$(document).on("dragenter", "#drag-container", function (event) {
EthoUploads.onDragEnter(event);
});
$(document).on("dragover", "#drag-container", function (event) {
EthoUploads.onDragEnter(event);
});
$(document).on("drop", "#drag-container", function (event) {
EthoUploads.onDrop(event);
});
$(document).on("dragleave", "#drag-container", function (event) {
EthoUploads.onDragLeave(event);
});
$(document).on("change", "#fileUploadButton", function (event) {
EthoUploads.onFileUpload(event);
});
$(document).on("click", "#main-login-button", function (event) {
GlobalPrivateKey = switchFlag;
EthoUploads.checkLogin();
$('#ethofsLoginModal').iziModal({
onOpened: function () {
console.log("Login Setup Opened ..");
var addressBook = EthoDatatabse.getWallets();
console.log("Getting Address List...");
$('#sendFromAddress').empty();
$('#sendFromAddress').append(new Option('Login With Private Key', 'privatekey'))
$('#privatekeytable').show();
var option = $(this).find("option:selected").text();
$("#sendFromAddressName").html(option.trim());
for (var key in addressBook.names) {
if (addressBook.names.hasOwnProperty(key)) {
$('#sendFromAddress').append(new Option(addressBook.names[key], key))
}
}
$("#sendFromAddress").on("change", function () {
var optionText = $(this).find("option:selected").text();
var optionTextValue = $(this).find("option:selected").val();
$("#sendFromAddressName").html(optionText.trim());
console.log("Address Name: " + optionText)
console.log("Address: " + optionText)
if (optionTextValue == 'privatekey') {
privateKeyLogin = true;
$("#sendFromAddressValue").hide();
$('#walletpasswordtable').hide();
$('#privatekeytable').show();
} else {
privateKeyLogin = false;
$("#sendFromAddressValue").show();
$('#privatekeytable').hide();
$('#walletpasswordtable').show();
$("#sendFromAddressValue").html(optionTextValue.trim());
loginAddress = optionTextValue.trim();
}
});
},
onOpening: function (modal) {
console.log("Opening Login Setup..");
$("#sendFromAddressValue").hide();
$('#walletpasswordtable').hide();
$('#privatekeytable').hide();
(function ($, _M) {
M.toast({
html: 'warning If your wallet has a default name e.g: Account 1, you will not be able to select it.',
displayLength: 10000,
classes: 'warning'
});
}(jQuery, M));
}
});
$('#ethofsLoginModal').iziModal('open');
});
$(document).on("click", "#ethofs-login-button", function (event) {
if (privateKeyLogin == true) {
GlobalPrivateKey = document.getElementById('privatekey').value;
console.log("Global Private Key: " + GlobalPrivateKey);
EthoUploads.ethofsLogin(GlobalPrivateKey);
} else {
loginPassword = document.getElementById('walletpassword').value;
loginAddress = $("#sendFromAddress").find("option:selected").val().trim();
var accountsPath = getKeyStoreLocation();
var keyObject = keythereum.importFromFile(loginAddress, accountsPath);
var privateKey = keythereum.recover(loginPassword, keyObject);
var key = privateKey.toString('hex');
GlobalPrivateKey = key;
console.log("Global Private Key: " + GlobalPrivateKey);
EthoUploads.ethofsLogin(GlobalPrivateKey);
}
});
$(document).on("click", "#main-upload-button", function (event) {
$('#defaultModal').iziModal();
$('#defaultModal').iziModal('open');
EthoUploads.resetUploadProcess();
});
$(document).on("click", "#defaultModal-close", function (event) {
$('#defaultModal').iziModal('close');
EthoUploads.resetUploadSystem();
EthoUploads.resetUploadModal();
});
$(document).on("click", "#defaultModal-next", function (event) {
$('#defaultModal2').iziModal();
$('#defaultModal2').iziModal('open');
$('#defaultModal').iziModal('close');
EthoUploads.resetUploadProcess();
});
$(document).on("click", "#defaultModal2-close", function (event) {
$('#defaultModal2').iziModal('close');
EthoUploads.resetUploadSystem();
EthoUploads.resetUploadModal();
});
$(document).on("click", "#ethofs-registration-button", function (event) {
EthoUploads.AddNewUser(document.getElementById('username').value);
});
$(document).on("click", "#confirm-files-button", function (event) {
$('#defaultModal3').iziModal();
$('#defaultModal3').iziModal('open');
document.getElementById("contract-cost").innerHTML = EthoUploads.round(GlobalContractCost, 2);
$('#defaultModal2').iziModal('close');
document.getElementById("upload-hash").textContent = "READY FOR UPLOAD";
document.getElementById("upload-confirm-button").style.visibility = "visible";
EthoUploads.resetUploadModal();
});
$(document).on("click", "#defaultModal3-close", function (event) {
$('#defaultModal3').iziModal('close');
EthoUploads.resetUploadSystem();
EthoUploads.resetUploadModal();
});
$(document).on("click", "#upload-confirm-button", function (event) {
$('#preparingUploadModal').iziModal();
$('#preparingUploadModal').iziModal('open');
$('#defaultModal3').iziModal('close');
EthoUploads.startUploadProcess();
});
$(document).on("click", "#tracker-close-button", function (event) {
EthoUploads.updateContractTable();
});
$(document).on("click", "#upload-check-button", function (event) {
EthoUploads.finishUploadModal();
});
$(document).on("click", "#contract-extension-button", function (event) {
EthoUploads.contractExtensionConfirmation();
});
$(document).on("click", "#reset-table-button", function (event) {
$("#contractDetailModal").iziModal("close");
EthoUploads.resetContractDetailTableRows();
});
$(document).on("change", "#contract-duration", function (event) {
EthoUploads.contractDurationChange(document.getElementById('contract-duration'));
});
$(document).on("change", "#extend-contract", function (event) {
EthoUploads.contractExtensionChange(document.getElementById('extend-contract'));
});
fetch('https://api.coinmarketcap.com/v2/ticker/3452/').then(response => {
return response.json();
}).then(data => {
var ethoPriceUSD = data.data.quotes.USD.price;
document.getElementById("ethoprice").textContent = EthoUploads.round(ethoPriceUSD, 4);
}).catch(err => {});
});
function getKeyStoreLocation() {
switch (os.type()) {
case "Darwin":
return path.join(os.homedir(), "Library", "Ether1");
break;
default:
return path.join(process.env.APPDATA, "Ether1");
}
}