Implementing a cookie-based download manager in JavaScript

In today’s digital world, being able to manage downloads efficiently is crucial. Whether you are working on a web application or a website, implementing a download manager can greatly enhance the user experience. In this blog post, we will explore how to create a cookie-based download manager using JavaScript.

Technology Used

A cookie-based download manager is a technique that utilizes cookies to store information about the current download progress. This approach allows users to resume interrupted downloads and ensures a seamless experience.

Step 1: Create a Download Manager Object

class DownloadManager {
  constructor() {
    this.files = [];
  }

  addFile(fileUrl) {
    const file = {
      url: fileUrl,
      downloaded: 0,
      totalSize: 0,
    };
    this.files.push(file);
  }

  getFileIndex(fileUrl) {
    return this.files.findIndex((file) => file.url === fileUrl);
  }

  updateDownloadedBytes(fileUrl, downloaded) {
    const fileIndex = this.getFileIndex(fileUrl);
    if (fileIndex > -1) {
      this.files[fileIndex].downloaded = downloaded;
    }
  }

  updateTotalSize(fileUrl, totalSize) {
    const fileIndex = this.getFileIndex(fileUrl);
    if (fileIndex > -1) {
      this.files[fileIndex].totalSize = totalSize;
    }
  }

  getDownloadedBytes(fileUrl) {
    const fileIndex = this.getFileIndex(fileUrl);
    if (fileIndex > -1) {
      return this.files[fileIndex].downloaded;
    }
    return 0;
  }

  getTotalSize(fileUrl) {
    const fileIndex = this.getFileIndex(fileUrl);
    if (fileIndex > -1) {
      return this.files[fileIndex].totalSize;
    }
    return 0;
  }
}

Step 2: Handle Download Progress

Now that we have a basic download manager, we can start working on handling the download progress. We can use the JavaScript XMLHttpRequest object to initiate and monitor downloads.

const downloadManager = new DownloadManager();

function startDownload(fileUrl) {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', fileUrl);
  const downloadedBytes = downloadManager.getDownloadedBytes(fileUrl);

  if (downloadedBytes > 0) {
    xhr.setRequestHeader('Range', `bytes=${downloadedBytes}-`);
  }

  xhr.onprogress = (event) => {
    downloadManager.updateDownloadedBytes(fileUrl, event.loaded + downloadedBytes);
    downloadManager.updateTotalSize(fileUrl, event.total);
  };

  xhr.onload = () => {
    if (xhr.status === 200 || xhr.status === 206) {
      // File download completed
      console.log('Download complete');
    } else {
      // Handle error
      console.error('Download failed');
    }
  };

  xhr.send();
}

Step 3: Resume Interrupted Downloads

To handle interrupted downloads, we can utilize cookies to store the progress information. We will store the downloaded bytes and total size for each file.

function saveDownloadProgress(fileUrl) {
  const downloadedBytes = downloadManager.getDownloadedBytes(fileUrl);
  const totalSize = downloadManager.getTotalSize(fileUrl);

  document.cookie = `${fileUrl}=${downloadedBytes}:${totalSize}`;
}

function resumeDownloads() {
  // Parse cookies and resume downloads for each file
  const cookies = document.cookie.split(';');
  cookies.forEach((cookie) => {
    const [fileUrl, progress] = cookie.split('=');
    const [downloadedBytes, totalSize] = progress.split(':');

    downloadManager.updateDownloadedBytes(fileUrl, parseInt(downloadedBytes, 10));
    downloadManager.updateTotalSize(fileUrl, parseInt(totalSize, 10));
  });
}

resumeDownloads();

Conclusion

By implementing a cookie-based download manager in JavaScript, you can provide users with the ability to resume interrupted downloads and enhance their overall experience. This technique allows for a smoother download process and increases usability.

Don’t forget to use the hashtags: #JavaScript #DownloadManager at the end of your post for greater visibility and reach.

Happy coding!