UNPKG

dd-trace

Version:

Datadog APM tracing client for JavaScript

41 lines (31 loc) 1.46 kB
'use strict' const dc = require('dc-polyfill') const shimmer = require('../../datadog-shimmer') const { addHook } = require('./helpers/instrument') const requestChannel = dc.tracingChannel('datadog:apollo-server-core:request') addHook({ name: 'apollo-server-core', file: 'dist/runHttpQuery.js', versions: ['>3.0.0'] }, runHttpQueryModule => { const HttpQueryError = runHttpQueryModule.HttpQueryError shimmer.wrap(runHttpQueryModule, 'runHttpQuery', function wrapRunHttpQuery (originalRunHttpQuery) { return function runHttpQuery () { if (!requestChannel.start.hasSubscribers) { return originalRunHttpQuery.apply(this, arguments) } const abortController = new AbortController() const abortData = {} const runHttpQueryResult = requestChannel.tracePromise( originalRunHttpQuery, { abortController, abortData }, this, ...arguments) const abortPromise = new Promise((resolve, reject) => { abortController.signal.addEventListener('abort', (event) => { // runHttpQuery callbacks are writing the response on resolve/reject. // We should return blocking data in the apollo-server-core HttpQueryError object reject(new HttpQueryError(abortData.statusCode, abortData.message, true, abortData.headers)) }, { once: true }) }) return Promise.race([runHttpQueryResult, abortPromise]) } }) return runHttpQueryModule })