UNPKG

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

Version:
71 lines (67 loc) 2.75 kB
'use strict'; const core = require('@envelop/core'); const utils = require('@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: utils.getHeadersObj(options.headers), }, response: { timestamp: responseTimestamp, status: response.status, statusText: response.statusText, headers: utils.getHeadersObj(response.headers), }, responseTime, }; httpDetailsList.push(httpDetails); }; } return undefined; }, onExecute({ args: { contextValue } }) { return { onExecuteDone({ result, setResult }) { if (!core.isAsyncIterable(result)) { const httpDetailsList = httpDetailsByContext.get(contextValue); if (httpDetailsList != null) { setResult({ ...result, extensions: { ...result.extensions, httpDetails: httpDetailsList, }, }); } } }, }; }, }; } module.exports = useIncludeHttpDetailsInExtensions;