Add support for Apollo Cache Control

This commit is contained in:
Martijn Walraven 2017-10-23 19:01:02 -07:00
parent e8493167c9
commit 818ddfa3bd
5 changed files with 36 additions and 24 deletions

View file

@ -5,6 +5,7 @@
"main": "dist/index.js",
"scripts": {
"compile": "tsc",
"watch": "tsc -w",
"prepublish": "npm run compile"
},
"repository": {
@ -27,7 +28,8 @@
"@types/fibers": "0.0.29",
"@types/graphql": "0.11.5",
"fibers": "1.0.15",
"meteor-promise": "0.8.6"
"meteor-promise": "0.8.6",
"typescript": "^2.5.3"
},
"peerDependencies": {
"graphql": "^0.9.0 || ^0.10.0 || ^0.11.0"
@ -37,6 +39,8 @@
"definition": "dist/index.d.ts"
},
"dependencies": {
"apollo-tracing": "^0.0.x"
"graphql-extensions": "^0.0.x",
"apollo-tracing": "^0.1.0",
"apollo-cache-control": "^0.0.x"
}
}

View file

@ -1,5 +1,6 @@
import { GraphQLSchema, ValidationContext, GraphQLFieldResolver } from 'graphql';
import { LogFunction } from './runQuery';
import { GraphQLExtension } from 'graphql-extensions';
/*
* GraphQLServerOptions
@ -28,6 +29,7 @@ export interface GraphQLServerOptions {
fieldResolver?: GraphQLFieldResolver<any, any>;
debug?: boolean;
tracing?: boolean;
cacheControl?: boolean;
}
export default GraphQLServerOptions;

View file

@ -119,6 +119,7 @@ export async function runHttpQuery(handlerArguments: Array<any>, request: HttpQu
fieldResolver: optionsObject.fieldResolver,
debug: optionsObject.debug,
tracing: optionsObject.tracing,
cacheControl: optionsObject.cacheControl,
};
if (optionsObject.formatParams) {

View file

@ -13,11 +13,9 @@ import {
ValidationContext,
} from 'graphql';
import {
TraceCollector,
instrumentSchemaForTracing,
formatTraceData,
} from 'apollo-tracing';
import { enableGraphQLExtensions, GraphQLExtension, GraphQLExtensionStack } from 'graphql-extensions';
import { TracingExtension } from 'apollo-tracing';
import { CacheControlExtension } from 'apollo-cache-control';
export interface GraphQLResponse {
data?: object;
@ -61,6 +59,7 @@ export interface QueryOptions {
formatResponse?: Function;
debug?: boolean;
tracing?: boolean;
cacheControl?: boolean;
}
const resolvedPromise = Promise.resolve();
@ -80,13 +79,20 @@ function doRunQuery(options: QueryOptions): Promise<GraphQLResponse> {
logFunction({action: LogAction.request, step: LogStep.start});
const context = options.context || {};
let traceCollector: TraceCollector;
let extensions = [];
if (options.tracing) {
traceCollector = new TraceCollector();
context._traceCollector = traceCollector;
traceCollector.requestDidStart();
instrumentSchemaForTracing(options.schema);
extensions.push(TracingExtension);
}
if (options.cacheControl) {
extensions.push(CacheControlExtension);
}
const extensionStack = extensions.length > 0 && new GraphQLExtensionStack(extensions);
if (extensionStack) {
context._extensionStack = extensionStack;
enableGraphQLExtensions(options.schema);
extensionStack.requestDidStart();
}
function format(errors: Array<Error>): Array<Error> {
@ -140,8 +146,8 @@ function doRunQuery(options: QueryOptions): Promise<GraphQLResponse> {
return Promise.resolve({ errors: format(validationErrors) });
}
if (traceCollector) {
traceCollector.executionDidStart();
if (extensionStack) {
extensionStack.executionDidStart();
}
try {
@ -169,11 +175,10 @@ function doRunQuery(options: QueryOptions): Promise<GraphQLResponse> {
}
}
if (traceCollector) {
traceCollector.requestDidEnd();
response.extensions = {
'tracing': formatTraceData(traceCollector),
};
if (extensionStack) {
extensionStack.executionDidEnd();
extensionStack.requestDidEnd();
response.extensions = extensionStack.format();
}
if (options.formatResponse) {

View file

@ -2,11 +2,11 @@
"extends": "../../tsconfig",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./dist",
"typeRoots": [
"node_modules/@types"
]
"outDir": "./dist"
},
"include" : [
"src/**/*"
],
"exclude": [
"node_modules",
"dist"