UNPKG

@triply/tus-js-client

Version:

A pure JavaScript client for the tus resumable upload protocol

138 lines (117 loc) 3.78 kB
/* global tus */ /* eslint no-console: 0 */ var upload = null var uploadIsRunning = false var toggleBtn = document.querySelector('#toggle-btn') var input = document.querySelector('input[type=file]') var progress = document.querySelector('.progress') var progressBar = progress.querySelector('.bar') var alertBox = document.querySelector('#support-alert') var uploadList = document.querySelector('#upload-list') var chunkInput = document.querySelector('#chunksize') var parallelInput = document.querySelector('#paralleluploads') var endpointInput = document.querySelector('#endpoint') if (!tus.isSupported) { alertBox.classList.remove('hidden') } if (!toggleBtn) { throw new Error('Toggle button not found on this page. Aborting upload-demo. ') } toggleBtn.addEventListener('click', (e) => { e.preventDefault() if (upload) { if (uploadIsRunning) { upload.abort() toggleBtn.textContent = 'resume upload' uploadIsRunning = false } else { upload.start() toggleBtn.textContent = 'pause upload' uploadIsRunning = true } } else if (input.files.length > 0) { startUpload() } else { input.click() } }) input.addEventListener('change', startUpload) function startUpload () { var file = input.files[0] // Only continue if a file has actually been selected. // IE will trigger a change event even if we reset the input element // using reset() and we do not want to blow up later. if (!file) { return } var endpoint = endpointInput.value var chunkSize = parseInt(chunkInput.value, 10) if (isNaN(chunkSize)) { chunkSize = Infinity } var parallelUploads = parseInt(parallelInput.value, 10) if (isNaN(parallelUploads)) { parallelUploads = 1 } toggleBtn.textContent = 'pause upload' var options = { endpoint, chunkSize, retryDelays: [0, 1000, 3000, 5000], parallelUploads, metadata : { filename: file.name, filetype: file.type, }, onError (error) { if (error.originalRequest) { if (window.confirm(`Failed because: ${error}\nDo you want to retry?`)) { upload.start() uploadIsRunning = true return } } else { window.alert(`Failed because: ${error}`) } reset() }, onProgress (bytesUploaded, bytesTotal) { var percentage = (bytesUploaded / bytesTotal * 100).toFixed(2) progressBar.style.width = `${percentage}%` console.log(bytesUploaded, bytesTotal, `${percentage}%`) }, onSuccess () { var anchor = document.createElement('a') anchor.textContent = `Download ${upload.file.name} (${upload.file.size} bytes)` anchor.href = upload.url anchor.className = 'btn btn-success' uploadList.appendChild(anchor) reset() }, } upload = new tus.Upload(file, options) upload.findPreviousUploads().then((previousUploads) => { askToResumeUpload(previousUploads, upload) upload.start() uploadIsRunning = true }) } function reset () { input.value = '' toggleBtn.textContent = 'start upload' upload = null uploadIsRunning = false } function askToResumeUpload (previousUploads, upload) { if (previousUploads.length === 0) return let text = 'You tried to upload this file previously at these times:\n\n' previousUploads.forEach((previousUpload, index) => { text += `[${index}] ${previousUpload.creationTime}\n` }) text += '\nEnter the corresponding number to resume an upload or press Cancel to start a new upload' const answer = prompt(text) const index = parseInt(answer, 10) if (!isNaN(index) && previousUploads[index]) { upload.resumeFromPreviousUpload(previousUploads[index]) } }