Home Reference Source Test

packages/causality-utils/src/fetchStreamMixins.web.js

import fetchStream from 'fetch-readablestream';

/**
 * provide streamData method for web environment
 * @class
 * @param { Class } FetchClass
 * @returns { Class } FetchClass - class with extended methods
 */
import { default as streamUtils } from './stream';
const WebStreamMixins = (FetchClass)=> class extends FetchClass{ 
    /**
     * Stream content given the url
     * @param { String } url - url for content
     * @returns { Readable } content
     */
    async streamData(url){
        let response = await fetchStream(url);
        if(response.status >= 400){
            console.error(response.status);
            reject("Bad response from server");
        }
        const streamReader = response.body.getReader();
        let reader = streamUtils.makeReadable();
        const recusiveRead = ()=>{
            return new Promise((resolve, reject)=>{
                streamReader.read().then(({ value, done })=>{
                    if (done) {
                        reader.push(null);
                        resolve(false);
                    }
                    else{
                        reader.push(Buffer.from(value));
                        resolve(true);
                    }
                });
            });
        };
        const ReadNext = (recusiveRead)=>{
            recusiveRead().then(hasNext=>{
                if(hasNext){
                    ReadNext(recusiveRead);
                }
            });
        };
        ReadNext(recusiveRead);
        return reader;
    }
};

export default WebStreamMixins;