denoでfetchを実装した
denoでfetchを実装した2019/2/3keroxp.icon fetchはいまブラウザでちゃんと使えるHTTPのモジュール
denoにもfetchは実装されているのだけど、実は結構WIPという感じ
WHATWG ReadableStreamに対応していない、その他fetch標準に準拠できていないところも多々
httpsをfetchするようにするためか、http通信の部分がまるごとRustレイヤに実装されているため、リソースを取得する目的としてしかhttpを開くことができない
というわけで1月後半ころからちょこちょこ実装していた
fetch仕様の日本語訳を横目で見ながら実装した
Githubが開発しているブラウザ向けfetch pollyfillも参考にした
…のだが、途中でfetchのresponseはReadableStreamでもある必要があるとわかった
ともかく勘所としては、fetchのレスポンスはストリーム形式で読み込める必要もあるというところ
そもそもkeroxp.iconは未だにfetchをブラウザアプリで使ったことがないのでこんなこと知る由もないのであった
fetch使ってる人もjson()しか使ってないのでは
streamsの仕様が、その役割に対して膨大な上あまり設計センスを感じない複雑な仕様だったせいで実装が大変だった
が、なんとか実装してfetchの実装にはいることができた
が、これもけっこう大変だった
何が一番大変だったかというと、Request/Responseボディのストリーム化である
実を言うとまだ終わってない
multipartのformdadtaが怪しい。ていうか読み出せない
fetchゆるふわ勢(俺)はご存じないかもしれないが、fetchのbodyの型は6種類もある
string
Blob
BufferSource = ArrayBufferView | ArrayBuffer
FormData
URLSearchParams
ReadableStream
httpでデータを送信することを考えればせやな…といったラインアップではある
が、どう考えても多すぎである
httpでデータを送信するのはデータをreadしてwriteするだけなのだからこういった抽象型にされるとバラすのが面倒
細かいところは省くけど、上記の6種類のbodyは、requestを送る前、responseをparseする前にすべてReadableStreamにラップされるように仕様で決められている
これが結構面倒というか、ReadableStreamの仕様があまり良くないせいできれいに書けなかった
ともあれそれなりにちゃんと使えるようになったようです
denoのdomTypes.ReadableStreamの型定義が微妙に間違っていて、自家製Steamsとバッティングしたのが悲しい