UNPKG

@tmeasday/aer-limited

Version:

Do not use if you don't know what this does.

166 lines 6.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const graphql_1 = require("graphql"); const apollo_engine_reporting_protobuf_1 = require("apollo-engine-reporting-protobuf"); const signature_1 = require("./signature"); class EngineReportingExtension { constructor(options, addTrace) { this.trace = new apollo_engine_reporting_protobuf_1.Trace(); this.nodes = new Map(); this.options = Object.assign({ maskErrorDetails: false }, options); this.addTrace = addTrace; const root = new apollo_engine_reporting_protobuf_1.Trace.Node(); this.trace.root = root; this.nodes.set(responsePathAsString(undefined), root); } requestDidStart(o) { this.trace.startTime = dateToTimestamp(new Date()); this.startHrTime = process.hrtime(); this.queryString = o.queryString; this.documentAST = o.parsedQuery; this.trace.http = new apollo_engine_reporting_protobuf_1.Trace.HTTP({ method: apollo_engine_reporting_protobuf_1.Trace.HTTP.Method[o.request.method] || apollo_engine_reporting_protobuf_1.Trace.HTTP.Method.UNKNOWN, host: null, path: null, }); if (this.options.privateHeaders !== true) { for (const [key, value] of o.request.headers) { if (this.options.privateHeaders && typeof this.options.privateHeaders === 'object' && this.options.privateHeaders.includes(key.toLowerCase())) { break; } switch (key) { case 'authorization': case 'cookie': case 'set-cookie': break; default: this.trace.http.requestHeaders[key] = new apollo_engine_reporting_protobuf_1.Trace.HTTP.Values({ value: [value], }); } } if (o.persistedQueryHit) { this.trace.persistedQueryHit = true; } if (o.persistedQueryRegister) { this.trace.persistedQueryRegister = true; } } if (this.options.privateVariables !== true && o.variables) { this.trace.details = new apollo_engine_reporting_protobuf_1.Trace.Details(); Object.keys(o.variables).forEach(name => { if (this.options.privateVariables && typeof this.options.privateVariables === 'object' && this.options.privateVariables.includes(name)) { this.trace.details.variablesJson[name] = ''; } else { this.trace.details.variablesJson[name] = JSON.stringify(o.variables[name]); } }); } return () => { this.trace.durationNs = durationHrTimeToNanos(process.hrtime(this.startHrTime)); this.trace.endTime = dateToTimestamp(new Date()); const operationName = this.operationName || ''; let signature; if (this.documentAST) { const calculateSignature = this.options.calculateSignature || signature_1.defaultSignature; signature = calculateSignature(this.documentAST, operationName); } else if (this.queryString) { signature = this.queryString; } else { throw new Error('No queryString or parsedQuery?'); } this.addTrace(signature, operationName, this.trace); }; } executionDidStart(o) { if (o.executionArgs.operationName) { this.operationName = o.executionArgs.operationName; } this.documentAST = o.executionArgs.document; } willResolveField(_source, _args, _context, info) { if (this.operationName === undefined) { this.operationName = (info.operation.name && info.operation.name.value) || ''; } const path = info.path; const node = this.newNode(path); node.type = info.returnType.toString(); node.parentType = info.parentType.toString(); node.startTime = durationHrTimeToNanos(process.hrtime(this.startHrTime)); return () => { node.endTime = durationHrTimeToNanos(process.hrtime(this.startHrTime)); }; } willSendResponse(o) { const { errors } = o.graphqlResponse; if (errors) { errors.forEach((error) => { let node = this.nodes.get(''); if (error.path) { const specificNode = this.nodes.get(error.path.join('.')); if (specificNode) { node = specificNode; } } const errorInfo = this.options.maskErrorDetails ? { message: '<masked>' } : { message: error.message, location: (error.locations || []).map(({ line, column }) => new apollo_engine_reporting_protobuf_1.Trace.Location({ line, column })), json: JSON.stringify(error), }; node.error.push(new apollo_engine_reporting_protobuf_1.Trace.Error(errorInfo)); }); } } newNode(path) { const node = new apollo_engine_reporting_protobuf_1.Trace.Node(); const id = path.key; if (typeof id === 'number') { node.index = id; } else { node.fieldName = id; } this.nodes.set(responsePathAsString(path), node); const parentNode = this.ensureParentNode(path); parentNode.child.push(node); return node; } ensureParentNode(path) { const parentPath = responsePathAsString(path.prev); const parentNode = this.nodes.get(parentPath); if (parentNode) { return parentNode; } return this.newNode(path.prev); } } exports.EngineReportingExtension = EngineReportingExtension; function responsePathAsString(p) { if (p === undefined) { return ''; } return graphql_1.responsePathAsArray(p).join('.'); } function dateToTimestamp(date) { const totalMillis = +date; const millis = totalMillis % 1000; return new apollo_engine_reporting_protobuf_1.google.protobuf.Timestamp({ seconds: (totalMillis - millis) / 1000, nanos: millis * 1e6, }); } function durationHrTimeToNanos(hrtime) { return hrtime[0] * 1e9 + hrtime[1]; } //# sourceMappingURL=extension.js.map