From 301a7d32b40128d388aa42b487de367c1cdbc1cd Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Tue, 28 May 2019 14:41:57 +0100 Subject: [PATCH] Enable GraphQL batch requests --- app/assets/javascripts/lib/graphql.js | 20 ++++++++++++++------ app/controllers/graphql_controller.rb | 3 ++- package.json | 2 ++ yarn.lock | 20 +++++++++++++++++++- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/lib/graphql.js b/app/assets/javascripts/lib/graphql.js index 47e91dedd5a..5857f9e22ae 100644 --- a/app/assets/javascripts/lib/graphql.js +++ b/app/assets/javascripts/lib/graphql.js @@ -1,6 +1,8 @@ import { ApolloClient } from 'apollo-client'; import { InMemoryCache } from 'apollo-cache-inmemory'; import { createUploadLink } from 'apollo-upload-client'; +import { ApolloLink } from 'apollo-link'; +import { BatchHttpLink } from 'apollo-link-batch-http'; import csrf from '~/lib/utils/csrf'; export default (resolvers = {}, config = {}) => { @@ -11,13 +13,19 @@ export default (resolvers = {}, config = {}) => { uri = `${config.baseUrl}${uri}`.replace(/\/{3,}/g, '/'); } + const httpOptions = { + uri, + headers: { + [csrf.headerKey]: csrf.token, + }, + }; + return new ApolloClient({ - link: createUploadLink({ - uri, - headers: { - [csrf.headerKey]: csrf.token, - }, - }), + link: ApolloLink.split( + operation => operation.getContext().hasUpload, + createUploadLink(httpOptions), + new BatchHttpLink(httpOptions), + ), cache: new InMemoryCache(config.cacheConfig), resolvers, }); diff --git a/app/controllers/graphql_controller.rb b/app/controllers/graphql_controller.rb index e8f38899647..1ce0afac83b 100644 --- a/app/controllers/graphql_controller.rb +++ b/app/controllers/graphql_controller.rb @@ -53,7 +53,8 @@ class GraphqlController < ApplicationController { query: single_query_info[:query], variables: build_variables(single_query_info[:variables]), - operation_name: single_query_info[:operationName] + operation_name: single_query_info[:operationName], + context: context } end end diff --git a/package.json b/package.json index a4ec2dce0df..f2f784ef4d7 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,8 @@ "@gitlab/ui": "^3.10.0", "apollo-cache-inmemory": "^1.5.1", "apollo-client": "^2.5.1", + "apollo-link": "^1.2.11", + "apollo-link-batch-http": "^1.2.11", "apollo-upload-client": "^10.0.0", "at.js": "^1.5.4", "autosize": "^4.0.0", diff --git a/yarn.lock b/yarn.lock index 7c119e2c9dd..70dc7b8d15f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1398,6 +1398,24 @@ apollo-client@^2.5.1: tslib "^1.9.3" zen-observable "^0.8.0" +apollo-link-batch-http@^1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/apollo-link-batch-http/-/apollo-link-batch-http-1.2.11.tgz#ae42dbcc02820658e1e267d05bf2aae7ac208088" + integrity sha512-f+KEdbP51I3AeEaBDW2lKS3eaPK/1IXaTM9F2moj02s1hgC/TzeUORRuUeOExW8ggXveW1Jzp6aYMJ2SQkZJyA== + dependencies: + apollo-link "^1.2.11" + apollo-link-batch "^1.1.12" + apollo-link-http-common "^0.2.13" + tslib "^1.9.3" + +apollo-link-batch@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/apollo-link-batch/-/apollo-link-batch-1.1.12.tgz#64eb231082f182b0395ef7ab903600627f6c7fe8" + integrity sha512-6NqLiB9tEGxRiyhtnX/7CPHkmFG0IXfEP7pC5kirhjV+4KxqBaWvJnJGKpGp7Owgdph7KJlV+9+niOKEkcwreg== + dependencies: + apollo-link "^1.2.11" + tslib "^1.9.3" + apollo-link-dedup@^1.0.0: version "1.0.10" resolved "https://registry.yarnpkg.com/apollo-link-dedup/-/apollo-link-dedup-1.0.10.tgz#7b94589fe7f969777efd18a129043c78430800ae" @@ -1405,7 +1423,7 @@ apollo-link-dedup@^1.0.0: dependencies: apollo-link "^1.2.3" -apollo-link-http-common@^0.2.8: +apollo-link-http-common@^0.2.13, apollo-link-http-common@^0.2.8: version "0.2.13" resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.13.tgz#c688f6baaffdc7b269b2db7ae89dae7c58b5b350" integrity sha512-Uyg1ECQpTTA691Fwx5e6Rc/6CPSu4TB4pQRTGIpwZ4l5JDOQ+812Wvi/e3IInmzOZpwx5YrrOfXrtN8BrsDXoA==