//import 'isomorphic-fetch'; import { ApolloCache } from "apollo-cache"; import { GraphQlDecoderDictionaryStore } from "./GraphQlDecoderDictionaryStore"; import { createDeltaRequest, deltaflateDecode, ImDecoder } from "../../deltaflate-decode/src"; export function createFetch( cache: ApolloCache, imDecoders: Array>, eTagger: (TSerialized) => string, fetcher: GlobalFetch["fetch"] ): GlobalFetch["fetch"] { const dictionaryStore = new GraphQlDecoderDictionaryStore(cache); return async (input: RequestInfo, init?: RequestInit): Promise => { const request = new Request(input, init); const { request: deltaRequest, eTagsToDictionaries } = await createDeltaRequest( dictionaryStore, imDecoders, eTagger, request ); const response = await fetcher(deltaRequest); const decodedResponse = await deltaflateDecode( dictionaryStore, eTagsToDictionaries, imDecoders, response.clone() ); const query = await request.json(); await dictionaryStore.write(decodedResponse); const responseBody = cache.readQuery({ query }); return new Response(JSON.stringify(responseBody), { status: decodedResponse.status, statusText: decodedResponse.statusText, headers: decodedResponse.headers }); }; }