index.js 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.ApolloServerPluginInlineTrace = void 0;
  4. const usage_reporting_protobuf_1 = require("@apollo/usage-reporting-protobuf");
  5. const traceTreeBuilder_js_1 = require("../traceTreeBuilder.js");
  6. const internalPlugin_js_1 = require("../../internalPlugin.js");
  7. const schemaIsSubgraph_js_1 = require("../schemaIsSubgraph.js");
  8. function ApolloServerPluginInlineTrace(options = Object.create(null)) {
  9. let enabled = options.__onlyIfSchemaIsSubgraph ? null : true;
  10. return (0, internalPlugin_js_1.internalPlugin)({
  11. __internal_plugin_id__: 'InlineTrace',
  12. __is_disabled_plugin__: false,
  13. async serverWillStart({ schema, logger }) {
  14. if (enabled === null) {
  15. enabled = (0, schemaIsSubgraph_js_1.schemaIsSubgraph)(schema);
  16. if (enabled) {
  17. logger.info('Enabling inline tracing for this subgraph. To disable, use ' +
  18. 'ApolloServerPluginInlineTraceDisabled.');
  19. }
  20. }
  21. },
  22. async requestDidStart({ request: { http }, metrics }) {
  23. if (!enabled) {
  24. return;
  25. }
  26. const treeBuilder = new traceTreeBuilder_js_1.TraceTreeBuilder({
  27. maskedBy: 'ApolloServerPluginInlineTrace',
  28. sendErrors: options.includeErrors,
  29. });
  30. if (http?.headers.get('apollo-federation-include-trace') !== 'ftv1') {
  31. return;
  32. }
  33. if (metrics.captureTraces === false) {
  34. return;
  35. }
  36. metrics.captureTraces = true;
  37. treeBuilder.startTiming();
  38. return {
  39. async executionDidStart() {
  40. return {
  41. willResolveField({ info }) {
  42. return treeBuilder.willResolveField(info);
  43. },
  44. };
  45. },
  46. async didEncounterErrors({ errors }) {
  47. treeBuilder.didEncounterErrors(errors);
  48. },
  49. async willSendResponse({ response }) {
  50. treeBuilder.stopTiming();
  51. if (response.body.kind === 'incremental') {
  52. return;
  53. }
  54. if (metrics.queryPlanTrace) {
  55. treeBuilder.trace.queryPlan = metrics.queryPlanTrace;
  56. }
  57. const encodedUint8Array = usage_reporting_protobuf_1.Trace.encode(treeBuilder.trace).finish();
  58. const encodedBuffer = Buffer.from(encodedUint8Array, encodedUint8Array.byteOffset, encodedUint8Array.byteLength);
  59. const extensions = response.body.singleResult.extensions ||
  60. (response.body.singleResult.extensions = Object.create(null));
  61. if (typeof extensions.ftv1 !== 'undefined') {
  62. throw new Error('The `ftv1` extension was already present.');
  63. }
  64. extensions.ftv1 = encodedBuffer.toString('base64');
  65. },
  66. };
  67. },
  68. });
  69. }
  70. exports.ApolloServerPluginInlineTrace = ApolloServerPluginInlineTrace;
  71. //# sourceMappingURL=index.js.map