@graphql-mesh/plugin-http-details-extensions
Version:
71 lines (67 loc) • 2.75 kB
JavaScript
;
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;