function updateNode (selectedNode) { if (selectedNode == "remote") { node.default = "remote"; node.remote.address = document.querySelector("#remote_address").value node.remote.port = document.querySelector("#remote_apiPort").value node.remote.gateway = document.querySelector("#remote").querySelector("#remote_gatewayPort").value node.remote.protocol = document.querySelector("#remoteProtocol").querySelector("li.active").innerText.toLowerCase() } if (selectedNode == "local") { node.default = "local"; node.local.address = document.querySelector("#local_address").value node.local.port = document.querySelector("#local_apiPort").value node.local.gateway = document.querySelector("#local").querySelector("#local_gatewayPort").value node.local.protocol = document.querySelector("#localProtocol").querySelector("li.active").innerText.toLowerCase() } nodeConnect(selectedNode); } function nodeConnect (selectedNode) { if (selectedNode == "remote") { document.querySelector('button#buttonRemote').setAttribute('disabled', '') document.querySelector('button#buttonRemote').querySelector(".buttonContent div").innerText = "Connecting" document.querySelector('button#buttonRemote').querySelector(".buttonContent div").classList.add("connecting") document.querySelector('button#buttonLocal').querySelector(".buttonContent div").innerHTML = 'Connect ' document.querySelector('button#buttonRemote').querySelector(".buttonContent .min-loading").classList.remove('min-loading-hidden') //loading event } if (selectedNode == "local") { document.querySelector('button#buttonLocal').setAttribute('disabled', '') document.querySelector('button#buttonLocal').querySelector(".buttonContent div").innerText = "Connecting" document.querySelector('button#buttonLocal').querySelector(".buttonContent div").classList.add("connecting") document.querySelector('button#buttonRemote').querySelector(".buttonContent div").innerHTML = 'Connect ' document.querySelector('button#buttonLocal').querySelector(".buttonContent .min-loading").classList.remove('min-loading-hidden') //loading event } var status = "wait" ipfsRequest ("GatewayCheck.log", buffer.Buffer.from('ABC', 'utf-8')).then((data) => { if (data[0].hash == "QmNz1UBzpdd4HfZ3qir3aPiRdX5a93XwTuDNyXRc6PKhWW" ) { online(selectedNode); status = "online" } else { offline(selectedNode); status = "offline" } document.querySelector('button#buttonRemote').removeAttribute("disabled"); document.querySelector('button#buttonLocal').removeAttribute("disabled"); document.querySelector('button#buttonRemote').querySelector('.buttonContent .min-loading').classList.add('min-loading-hidden') //loading event document.querySelector('button#buttonLocal').querySelector('.buttonContent .min-loading').classList.add('min-loading-hidden') //loading event return status }, function (reason) { document.querySelector('button#buttonRemote').removeAttribute("disabled"); document.querySelector('button#buttonLocal').removeAttribute("disabled"); document.querySelector('button#buttonRemote').querySelector('.buttonContent .min-loading').classList.add('min-loading-hidden') //loading event document.querySelector('button#buttonLocal').querySelector('.buttonContent .min-loading').classList.add('min-loading-hidden') //loading event offline(selectedNode) return "offline" }) } function online (selectedNode) { connected = 1 if (selectedNode == "remote") { document.querySelector('button#buttonRemote').querySelector(".buttonContent div").classList.remove("connecting") document.querySelector('button#buttonRemote').querySelector(".buttonContent div").innerHTML = 'Node Online ' document.querySelector('button#buttonRemote').querySelector('.buttonContent .min-loading').classList.add('min-loading-hidden') } if (selectedNode == "local") { document.querySelector('button#buttonLocal').querySelector(".buttonContent div").classList.remove("connecting") document.querySelector('button#buttonLocal').querySelector(".buttonContent div").innerHTML = 'Node Online ' document.querySelector('button#buttonLocal').querySelector('.buttonContent .min-loading').classList.add('min-loading-hidden') } } function offline (selectedNode) { connected = 0 if (selectedNode == "remote") { document.querySelector('button#buttonRemote').querySelector(".buttonContent div").innerHTML = 'Node Offline! ' } if (selectedNode == "local") { document.querySelector('button#buttonLocal').querySelector(".buttonContent div").innerHTML = 'Node Offline! ' } } function upload() { if (!connected) { alert ("Unable to connect to Butter Box's IPFS Node.") return } if (filesOk.length < 1) { alert("

At least one selected file is invalid - do not select any folders.

Please reselect and try again.

"); return } document.querySelector('.min-loading.blue').classList.remove('loading-hidden') //loading event document.querySelector('button#buttonUpload').setAttribute('disabled', '') document.querySelector('button#buttonRemote').setAttribute('disabled', '') document.querySelector('button#buttonLocal').setAttribute('disabled', '') filesOk.forEach(function(file){ let reader = new FileReader(); reader.readAsArrayBuffer(file); reader.onloadend = function() { ipfsRequest (file.name, buffer.Buffer(reader.result)).then((data) => { response.push(data[0]) document.querySelector("#response").innerText = JSON.stringify(response, null, 2) updateList(fileChecksum(file), data[0].hash) uploadCount++ if (uploadCount == filesOk.length) { document.querySelector('.min-loading.blue').classList.add('loading-hidden'); //stop loading event document.querySelector('button#buttonRemote').removeAttribute('disabled', '') document.querySelector('button#buttonLocal').removeAttribute('disabled', '') document.querySelector('button#buttonUpload').onclick=function(){resetFiles()} document.querySelector('button#buttonUpload').innerHTML = 'Clean Up' document.querySelector('button#buttonUpload').removeAttribute("disabled"); } }) } }) } function ipfsRequest (file_name, data) { var ipfs = window.IpfsHttpClient(node[node.default].address, node[node.default].port, {protocol: node[node.default].protocol}) //router to the IPFS network without any local node var file_send = [ { path: file_name, content: data } ] return new Promise((resolve, reject) => { ipfs.add(file_send, function (err, json) { if (err) { alert(err); reject (0) } else { resolve (json) } }) }) } function removeItem(checksum) { var item = files_checksum.indexOf(checksum) filesOk.splice(item, 1) files_checksum.splice(item, 1) document.getElementById(checksum).remove(); } function handleDragOver(evt) { evt.stopPropagation(); // Do not allow the dragover event to bubble. evt.preventDefault(); // Prevent default dragover event behavior. } // handleDragOver function handleFileSelect(evt) { evt.stopPropagation(); // Do not allow the drop event to bubble. evt.preventDefault(); // Prevent default drop event behavior. if (evt.dataTransfer != null){ var files = evt.dataTransfer.files; // Grab the list of files dragged to the drop box. } else { var files = evt.target.files; // FileList object from input } if (!files) { alert("

At least one selected file is invalid - do not select any folders.

Please reselect and try again.

"); return; } for (var i = 0; i < files.length; i++) { if (!files[i]) { alert("Unable to access " + file.name); continue; // Immediately move to the next file object. } if (files[i].size == 0) { alert("Skipping " + files[i].name.toUpperCase() + " because it is empty."); continue; } if (files_checksum.includes(fileChecksum(files[i]))) { alert("This files is already listed"); continue } else { files_checksum[filesOk.length] = fileChecksum(files[i]) document.querySelector("#list").querySelector("ul").innerHTML += '
  • ' + files[i].name + ' ×' + '
    (' + (files[i].type || 'n/a' ) +') - ' + files[i].size + ' bytes, last modified: ' + new Date(files[i].lastModified).toLocaleDateString() +'
  • '; filesOk[filesOk.length] = files[i]; //push valid files for filesOk array } } //reset filesList input document.getElementById("files").value = '' if(!/safari/i.test(navigator.userAgent)){ document.getElementById("files").type = '' document.getElementById("files").type = 'file' } } function updateList (checksum, ipfsHash) { var i = files_checksum.indexOf(checksum) // equal filesOk[i] if (node[node.default].gateway == 80 || node[node.default].protocol == "https"){ var gatewayPort = '' } else { var gatewayPort = node[node.default].gateway } document.getElementById(checksum).innerHTML = '' + filesOk[i].name + ' ' + '
    (' + (filesOk[i].type || 'n/a' ) +') - ' + filesOk[i].size + ' bytes, last modified: ' + new Date(filesOk[i].lastModified).toLocaleDateString() +'' } function fileChecksum(file) { var MD5 = function(d){result = M(V(Y(X(d),8*d.length)));return result.toLowerCase()};function M(d){for(var _,m="0123456789ABCDEF",f="",r=0;r>>4&15)+m.charAt(15&_);return f}function X(d){for(var _=Array(d.length>>2),m=0;m<_.length;m++)_[m]=0;for(m=0;m<8*d.length;m+=8)_[m>>5]|=(255&d.charCodeAt(m/8))<>5]>>>m%32&255);return _}function Y(d,_){d[_>>5]|=128<<_%32,d[14+(_+64>>>9<<4)]=_;for(var m=1732584193,f=-271733879,r=-1732584194,i=271733878,n=0;n>16)+(_>>16)+(m>>16)<<16|65535&m}function bit_rol(d,_){return d<<_|d>>>32-_} var checksum = MD5(file.name + file.size + file.lastModified) return checksum } function resetFiles() { filesOk = [] files_checksum = [] response = [] uploadCount = 0 document.querySelector("#list").querySelector("ul").innerHTML = "" document.querySelector("pre#response").innerHTML = 'Response IPFS API:' document.querySelector('button#buttonUpload').onclick = function(){upload()} document.querySelector('button#buttonUpload').innerHTML = 'Upload' } var filesOk = [] var response = [] var message = [] var files_checksum = [] var selectedNode = "" var uploadCount = 0 var connected = 0 if (!window.FileReader) { message = '

    The ' + 'File APIs ' + 'are not fully supported by this browser.

    ' + '

    Upgrade your browser to the latest version.

    '; document.querySelector('body').innerHTML = message; } else { // Set up the file drag and drop listeners: document.getElementById('fileDropBox').addEventListener('dragover', handleDragOver, false); document.getElementById('fileDropBox').addEventListener('drop', handleFileSelect, false); document.getElementById('files').addEventListener('change', handleFileSelect, false); } updateNode(node.default)