2016-08-03 11 views
0

私は、次のエラー処理を実現しようとしています:ターゲットストリームからエラーイベントが発生した場合、何らかの形でソースストリームを再利用できますか?

  1. たちはreadableストリームを持っていると言います。
  2. transformストリームにパイプします。
  3. 何とかtransformストリームはerrorを放出します。
  4. readableストリーム(およびそのすべてのデータ)を回復し、もう1つのtransformストリームにパイプし直したいとします。

ステップ4は困難ように表示されます。私は、ターゲットストリーム(transformストリーム)のunpipeイベントに耳を傾け、ソース・ストリーム(readableストリーム)への参照を取得することができますが、そのデータの少なくとも一部のチャンク失われている。

カスタムトランスフォームストリームを作成せずにこれを行うことはできますか?

現実世界の例では、deflateコンテンツのエンコーディング、where in some casesである、あなたはzlib.createInflateRaw()代わりのzlib.createInflate()を必要とするが、我々は1つが、応答本体のバッファを見る前に、正しい選択であるかを決定することはできません。

+0

最近ではほとんどのサイトでgzipがサポートされていませんか?あなたの要求に 'Accept-Encoding:gzip'を送るだけで、何の問題も心配する必要はありません。 – mscdex

+0

@mscdexあなたは正しいですが、httpライブラリのために古いものや狂ったものだけを無視することはできません。私はこれをやり終えました。 https://github.com/bitinn/node-fetch/blob/master/index.js#L209-L222 – bitinn

答えて

1

最初のバイトを読み取るためだけに途中にストリームを挿入する必要はありません。たとえば:

(function readChunk() { 
    var chunk = res.read(); 
    if (!chunk) 
    return res.once('readable', readChunk); 

    var inflate; 
    if ((chunk[0] & 0x0F) === 0x08) 
    inflate = zlib.createInflate(); 
    else 
    inflate = zlib.createInflateRaw(); 

    // Put chunk back into stream 
    res.unshift(chunk); 

    // Prepare the decompression 
    res.pipe(inflate); 

    output = new Response(inflate, response_options); 
    resolve(output); 
})(); 

また、var body = res.pipe(new stream.PassThrough());は不要で、あなただけのres、適切な場合に使用することができます。

関連する問題