UNPKG

@graphql-mesh/plugin-http-details-extensions

Version:
69 lines (66 loc) 2.74 kB
import { isAsyncIterable } from '@envelop/core'; import { getHeadersObj } from '@graphql-mesh/utils'; function useIncludeHttpDetailsInExtensions(opts) { if ('if' in opts && !opts.if) { return {}; } const httpDetailsByContext = new WeakMap(); function getHttpDetailsByContext(context) { let httpDetails = httpDetailsByContext.get(context); if (!httpDetails) { httpDetails = []; httpDetailsByContext.set(context, httpDetails); } return httpDetails; } return { onFetch({ url, context, info, options }) { if (context != null) { const requestTimestamp = Date.now(); return ({ response }) => { const responseTimestamp = Date.now(); const responseTime = responseTimestamp - requestTimestamp; const httpDetailsList = getHttpDetailsByContext(context); const httpDetails = { sourceName: info === null || info === void 0 ? void 0 : info.sourceName, path: info === null || info === void 0 ? void 0 : info.path, request: { timestamp: requestTimestamp, url, method: options.method || 'GET', headers: getHeadersObj(options.headers), }, response: { timestamp: responseTimestamp, status: response.status, statusText: response.statusText, headers: getHeadersObj(response.headers), }, responseTime, }; httpDetailsList.push(httpDetails); }; } return undefined; }, onExecute({ args: { contextValue } }) { return { onExecuteDone({ result, setResult }) { if (!isAsyncIterable(result)) { const httpDetailsList = httpDetailsByContext.get(contextValue); if (httpDetailsList != null) { setResult({ ...result, extensions: { ...result.extensions, httpDetails: httpDetailsList, }, }); } } }, }; }, }; } export default useIncludeHttpDetailsInExtensions;