jimmywarting / StreamSaver.js

StreamSaver writes stream to the filesystem directly asynchronous
https://jimmywarting.github.io/StreamSaver.js/example.html
MIT License
3.98k stars 413 forks source link

Download not working in incognito mode #193

Closed ArtyomBobrovnik closed 3 years ago

ArtyomBobrovnik commented 3 years ago

Use streamSaver like in blob/file example:

import * as streamsPolyfill from 'web-streams-polyfill/ponyfill';
import streamSaver from 'streamsaver';

if (!streamSaver.WritableStream) {
  streamSaver.WritableStream = streamsPolyfill.WritableStream; // Add polyfill for WritableStream
}

export default class DownloadService {
  public async download(readableStream: ReadableStream<Uint8Array> | null, realFileName: string) {
    if (!readableStream) {
      return;
    }

    const fileWritableStream = streamSaver.createWriteStream(realFileName);

    if (window.WritableStream && readableStream.pipeTo) {
      return readableStream.pipeTo(fileWritableStream);
    }

    return new Promise((resolve) => DownloadService.writeStream(readableStream, fileWritableStream, resolve));
  }

  public async getReadableStream(link: string, headersProps?: HeadersInit) {
    // headers generation here

    return await fetch(link, {
      method: 'GET',
      headers,
    });
  }

  private static writeStream(readableStream: ReadableStream, writableStream: WritableStream, onSuccess: () => void) {
    const reader = readableStream.getReader();
    const writer = writableStream.getWriter();

    const writeChunkRecursively = () => {
      reader.read().then((readResult) => {
        readResult.done ? writer.close().then(onSuccess) : writer.write(readResult.value).then(writeChunkRecursively);
      });
    };

    writeChunkRecursively();
  }
}

This code works fine, but in incognito mode (Chrome) streamSaver reject promise with Uncaught (in promise) DOMException: Failed to get a ServiceWorkerRegistration: The user denied permission to use Service Worker. https://jimmywarting.github.io/StreamSaver.js/mitm.html?version=2.0.0 (see screenshot) and file doesn't download.

image

Reproduced on http and on https too.

"streamsaver": "2.0.5" "web-streams-polyfill": "3.0.0"

jimmywarting commented 3 years ago

It's b/c of blocking 3th party cookie settings in browser.

ArtyomBobrovnik commented 3 years ago

Thank you, self hoisting of mitm.html and sw.js fix it