jimmywarting / StreamSaver.js

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

lazy loaded `TransformStream` polyfill is not supported #247

Open JounQin opened 3 years ago

JounQin commented 3 years ago

As title.

import * as streamSaver from 'streamsaver'
// for proper tree shaking
import { TransformStream } from 'web-streams-polyfill/ponyfill'

export const download = async () => {
  if (!window.TransformStream) {
    window.TransformStream = TransformStream
  }

  // `streamSaver` related codes
}

And streamSaver.TransformStream is not configurable nor writable, so it can not be changed dynamically like streamSaver.WritableStream.

jimmywarting commented 3 years ago

StreamSavers don't work with TransformStreams unless they are natively supported and if ReadableStream are transferable with postMessage.

  test(() => {
    // Transferable stream was first enabled in chrome v73 behind a flag
    const { readable } = new TransformStream()
    const mc = new MessageChannel()
    mc.port1.postMessage(readable, [readable])
    mc.port1.close()
    mc.port2.close()
    supportsTransferable = true
    // Freeze TransformStream object (can only work with native)
    Object.defineProperty(streamSaver, 'TransformStream', {
      configurable: false,
      writable: false,
      value: TransformStream
    })
  })

so even if you assign TransformStream to the global scope before importing StreamSaver then it has no use for it anyway.

JounQin commented 3 years ago

@jimmywarting

image

The documentation seems incorrect.

jimmywarting commented 3 years ago

StreamSaver operates on two modes:

jimmywarting commented 3 years ago

Ups :P

Setting TransformStream should have no affect :P should remove it from ReadMe ^^

JounQin commented 3 years ago

Assigning WritableStream seems should be:

streamSaver.WritableStream = ponyfill.WritableStream
jimmywarting commented 3 years ago

Yep, that should stay

jimmywarting commented 3 years ago

Maybe

streamSaver.WritableStream = streamSaver.WritableStream || ponyfill.WritableStream
JounQin commented 3 years ago

Working on a PR.