> The thing is, data is copied when sent to Worker. Since communication with Worker is async, it could happen that we send all chunks before one gets processed so we double up the memory.

Yes, you should wait between chunks. See [async](https://github.com/caolan/async) library, could be of help here. Like `eachSeries`.

> That means data is not copied, but it's not visible in main thread anymore.

I do not understand why it would not be visible anymore? So you try to pass a chunk with `createObjectURL`, if if is supported. If it is not, you pass chunk directly. Or really directly (if supported), or serialized in some way.