未解決:StreamSaver.jsはどうやってReadableStreamをpostMessage()してる?
"なぞ"の箇所
ざっくり見た感じ、Service WorkerやMessageChannelを使ってReadableStreamをpostMessage()しているコードだった。
そこで、実際にpostMessaage()でReadableStreamを送るコードを書いて試した。だがクローンできませんというエラーが出る。それなら、どうやって送っているのだろうか?
code:出るエラー
(index):45 Uncaught DOMException: Failed to execute 'postMessage' on 'ServiceWorker': ReadableStream object could not be cloned.
navigator.serviceWorker.controller.postMessage()以外にも、MessageChannelのpostMessage()も使ってみたが同じ結果。
転送可能なデータ型
postMessaage()で転送可能なデータ型はどうやら決まっていて(なんとなくシリアライズ出来ないと送れなさそう気配はしていた)、ReadableStreamをそれに該当してないだろう。気になることは、const {readable} = new TransformStream()をしている点。new ReadableStream(...)ではなくてこれを使うと転送できるのだろうか?
Firefox Sendのアプローチ
StreamSaver.jsは任意のReadableStreamをダウンロードできる。それに対してFirefox SendはファイルのIDなどのメタデータをService Workerに教えて、Service Worker側でfetch()などを使ってデータを取得後、復号などの処理をしてそれをrespondWith()で登録して、ブラウザ側でダウンロードをしていく感じのコードだった。