UNPKG

@graphql-tools/url-loader

Version:

A set of utils for faster development of GraphQL tools

61 lines (60 loc) 2.41 kB
import { observableToAsyncIterable } from '@graphql-tools/utils'; import { TextDecoder } from '@whatwg-node/fetch'; const textDecoder = new TextDecoder(); export function handleReadableStream(readableStream) { return observableToAsyncIterable({ subscribe: observer => { const reader = readableStream.getReader(); let completed = false; function pump() { return reader .read() .then(({ done, value }) => { if (completed) { return; } if (value) { const chunk = typeof value === 'string' ? value : textDecoder.decode(value, { stream: true }); for (const part of chunk.split('\n\n')) { if (part) { const eventStr = part.split('event: ')[1]; const dataStr = part.split('data: ')[1]; if (eventStr === 'complete') { observer.complete(); } if (dataStr) { const data = JSON.parse(dataStr); observer.next(data.payload || data); } } } } if (done) { observer.complete(); } else { pump(); } }) .catch(e => { // canceling a request in browsers throws an error, // ignore it to avoid uncaught promise exceptions if (!completed) throw e; }); } pump(); return { unsubscribe: () => { completed = true; reader.cancel().catch(e => { // canceling a request in browsers throws an error, // ignore it to avoid uncaught promise exceptions if (!completed) throw e; }); }, }; }, }); }