if (!window.mySocket) { window.mySocket = new WebSocket(`ws://${window.location.host}/user`); window.mySocket.onopen = function(event) { console.log('WebSocket is open now.'); }; window.mySocket.onmessage = async function(event) { try { const data = JSON.parse(event.data); if (data.action === "UploadNewFile") { if (data.response.Done === false) { const file = window.fileIdMap[data.responseID]; addNewUploadElement(file); const fileChunks = await splitFile(file, file.chunkSize); await uploadChunks(file.name, file.size, fileChunks, data.response.Chunk, data.response.ID); } else { alert("File already uploaded."); } } } catch (error) { console.error('Error parsing message data:', error); } }; window.mySocket.onerror = function(event) { console.error('WebSocket error observed:', event); }; window.mySocket.onclose = function(event) { console.log('WebSocket is closed now.'); }; } function generateUniqueId() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } async function handleFile(file){ const chunkSize = 2 * 1024 * 1024; const chunks = Math.ceil(file.size / chunkSize); const fileId = generateUniqueId(); const data = JSON.stringify({ "action": "UploadNewFile", "name": file.name, "size": file.size, "chunk": chunks, "requestID": fileId, }); file.chunkSize = chunkSize; window.fileIdMap = window.fileIdMap || {}; window.fileIdMap[fileId] = file; window.mySocket.send(data) } function addNewUploadElement(file){ const newDiv = document.createElement('div'); newDiv.innerHTML = `
`; document.getElementById('container').appendChild(newDiv); } function convertFileSize(sizeInBytes) { if (sizeInBytes < 1024) { return sizeInBytes + ' B'; } else if (sizeInBytes < 1024 * 1024) { return (sizeInBytes / 1024).toFixed(2) + ' KB'; } else if (sizeInBytes < 1024 * 1024 * 1024) { return (sizeInBytes / (1024 * 1024)).toFixed(2) + ' MB'; } else { return (sizeInBytes / (1024 * 1024 * 1024)).toFixed(2) + ' GB'; } } async function splitFile(file, chunkSize) { const fileSize = file.size; const chunks = Math.ceil(fileSize / chunkSize); const fileChunks = []; for (let i = 0; i < chunks; i++) { const start = i * chunkSize; const end = Math.min(fileSize, start + chunkSize); const chunk = file.slice(start, end); fileChunks.push(chunk); } return fileChunks; } async function uploadChunks(name, size, chunks, chunkArray, FileID) { let byteUploaded = 0 let progress1 = document.getElementById(`progress-${name}-1`); let progress2 = document.getElementById(`progress-${name}-2`); let progress3 = document.getElementById(`progress-${name}-3`); let progress4 = document.getElementById(`progress-${name}-4`); for (let index = 0; index < chunks.length; index++) { const percentComplete = Math.round((index + 1) / chunks.length * 100); const chunk = chunks[index]; if (!(chunkArray["chunk_"+index])) { const formData = new FormData(); formData.append('name', name); formData.append('chunk', chunk); formData.append('index', index); formData.append('done', false); progress1.setAttribute("aria-valuenow", percentComplete); progress2.style.width = `${percentComplete}%`; const startTime = performance.now(); await fetch(`/upload/${FileID}`, { method: 'POST', body: formData }); const endTime = performance.now(); const totalTime = (endTime - startTime) / 1000; const uploadSpeed = chunk.size / totalTime / 1024 / 1024; byteUploaded += chunk.size progress3.innerText = `${uploadSpeed.toFixed(2)} MB/s`; progress4.innerText = `Uploading ${percentComplete}% - ${convertFileSize(byteUploaded)} of ${ convertFileSize(size)}`; } else { progress1.setAttribute("aria-valuenow", percentComplete); progress2.style.width = `${percentComplete}%`; progress3.innerText = `Fixing Missing Byte`; progress4.innerText = `Uploading Missing Byte ${percentComplete}% - ${convertFileSize(byteUploaded)} of ${ convertFileSize(size)}`; byteUploaded += chunk.size } } console.log(chunks) console.log(chunkArray) progress3.innerText = `Done`; progress4.innerText = `File Uploaded 100% - ${convertFileSize(byteUploaded)} of ${ convertFileSize(size)}`; }