UNPKG

8.81 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4 return new (P || (P = Promise))(function (resolve, reject) {
5 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8 step((generator = generator.apply(thisArg, _arguments || [])).next());
9 });
10};
11Object.defineProperty(exports, "__esModule", { value: true });
12exports.ApolloServer = exports.FileUploadRequest = void 0;
13const apollo_server_core_1 = require("apollo-server-core");
14const graphql_playground_html_1 = require("@apollographql/graphql-playground-html");
15const lambdaApollo_1 = require("./lambdaApollo");
16const apollo_server_env_1 = require("apollo-server-env");
17const stream_1 = require("stream");
18class FileUploadRequest extends stream_1.Readable {
19}
20exports.FileUploadRequest = FileUploadRequest;
21class ApolloServer extends apollo_server_core_1.ApolloServerBase {
22 serverlessFramework() {
23 return true;
24 }
25 supportsUploads() {
26 return true;
27 }
28 createGraphQLServerOptions(event, context) {
29 return super.graphQLServerOptions({ event, context });
30 }
31 createHandler({ cors, onHealthCheck } = { cors: undefined, onHealthCheck: undefined }) {
32 const promiseWillStart = this.willStart();
33 const corsHeaders = new apollo_server_env_1.Headers();
34 if (cors) {
35 if (cors.methods) {
36 if (typeof cors.methods === 'string') {
37 corsHeaders.set('access-control-allow-methods', cors.methods);
38 }
39 else if (Array.isArray(cors.methods)) {
40 corsHeaders.set('access-control-allow-methods', cors.methods.join(','));
41 }
42 }
43 if (cors.allowedHeaders) {
44 if (typeof cors.allowedHeaders === 'string') {
45 corsHeaders.set('access-control-allow-headers', cors.allowedHeaders);
46 }
47 else if (Array.isArray(cors.allowedHeaders)) {
48 corsHeaders.set('access-control-allow-headers', cors.allowedHeaders.join(','));
49 }
50 }
51 if (cors.exposedHeaders) {
52 if (typeof cors.exposedHeaders === 'string') {
53 corsHeaders.set('access-control-expose-headers', cors.exposedHeaders);
54 }
55 else if (Array.isArray(cors.exposedHeaders)) {
56 corsHeaders.set('access-control-expose-headers', cors.exposedHeaders.join(','));
57 }
58 }
59 if (cors.credentials) {
60 corsHeaders.set('access-control-allow-credentials', 'true');
61 }
62 if (typeof cors.maxAge === 'number') {
63 corsHeaders.set('access-control-max-age', cors.maxAge.toString());
64 }
65 }
66 return (event, context, callback) => {
67 const eventHeaders = new apollo_server_env_1.Headers(event.headers);
68 const requestCorsHeaders = new apollo_server_env_1.Headers(corsHeaders);
69 if (cors && cors.origin) {
70 const requestOrigin = eventHeaders.get('origin');
71 if (typeof cors.origin === 'string') {
72 requestCorsHeaders.set('access-control-allow-origin', cors.origin);
73 }
74 else if (requestOrigin &&
75 (typeof cors.origin === 'boolean' ||
76 (Array.isArray(cors.origin) &&
77 requestOrigin &&
78 cors.origin.includes(requestOrigin)))) {
79 requestCorsHeaders.set('access-control-allow-origin', requestOrigin);
80 }
81 const requestAccessControlRequestHeaders = eventHeaders.get('access-control-request-headers');
82 if (!cors.allowedHeaders && requestAccessControlRequestHeaders) {
83 requestCorsHeaders.set('access-control-allow-headers', requestAccessControlRequestHeaders);
84 }
85 }
86 const requestCorsHeadersObject = Array.from(requestCorsHeaders).reduce((headersObject, [key, value]) => {
87 headersObject[key] = value;
88 return headersObject;
89 }, {});
90 if (event.httpMethod === 'OPTIONS') {
91 context.callbackWaitsForEmptyEventLoop = false;
92 return callback(null, {
93 body: '',
94 statusCode: 204,
95 headers: Object.assign({}, requestCorsHeadersObject),
96 });
97 }
98 if (event.path === '/.well-known/apollo/server-health') {
99 const successfulResponse = {
100 body: JSON.stringify({ status: 'pass' }),
101 statusCode: 200,
102 headers: Object.assign({ 'Content-Type': 'application/json' }, requestCorsHeadersObject),
103 };
104 if (onHealthCheck) {
105 onHealthCheck(event)
106 .then(() => {
107 return callback(null, successfulResponse);
108 })
109 .catch(() => {
110 return callback(null, {
111 body: JSON.stringify({ status: 'fail' }),
112 statusCode: 503,
113 headers: Object.assign({ 'Content-Type': 'application/json' }, requestCorsHeadersObject),
114 });
115 });
116 }
117 else {
118 return callback(null, successfulResponse);
119 }
120 }
121 if (this.playgroundOptions && event.httpMethod === 'GET') {
122 const acceptHeader = event.headers['Accept'] || event.headers['accept'];
123 if (acceptHeader && acceptHeader.includes('text/html')) {
124 const path = event.path ||
125 (event.requestContext && event.requestContext.path) ||
126 '/';
127 const playgroundRenderPageOptions = Object.assign({ endpoint: path }, this.playgroundOptions);
128 return callback(null, {
129 body: graphql_playground_html_1.renderPlaygroundPage(playgroundRenderPageOptions),
130 statusCode: 200,
131 headers: Object.assign({ 'Content-Type': 'text/html' }, requestCorsHeadersObject),
132 });
133 }
134 }
135 const response = new stream_1.Writable();
136 const callbackFilter = (error, result) => {
137 response.end();
138 callback(error, result && Object.assign(Object.assign({}, result), { headers: Object.assign(Object.assign({}, result.headers), requestCorsHeadersObject) }));
139 };
140 const fileUploadHandler = (next) => {
141 const contentType = (event.headers['content-type'] || event.headers['Content-Type'] || '').toLowerCase();
142 if (contentType.startsWith('multipart/form-data')
143 && typeof apollo_server_core_1.processFileUploads === 'function') {
144 const request = new FileUploadRequest();
145 request.push(Buffer.from(event.body, event.isBase64Encoded ? 'base64' : 'ascii'));
146 request.push(null);
147 request.headers = event.headers;
148 apollo_server_core_1.processFileUploads(request, response, this.uploadsConfig || {})
149 .then(body => {
150 event.body = body;
151 return next();
152 })
153 .catch(error => {
154 throw apollo_server_core_1.formatApolloErrors([error], {
155 formatter: this.requestOptions.formatError,
156 debug: this.requestOptions.debug,
157 });
158 });
159 }
160 else {
161 return next();
162 }
163 };
164 fileUploadHandler(() => lambdaApollo_1.graphqlLambda(() => __awaiter(this, void 0, void 0, function* () {
165 yield promiseWillStart;
166 return this.createGraphQLServerOptions(event, context);
167 }))(event, context, callbackFilter));
168 };
169 }
170}
171exports.ApolloServer = ApolloServer;
172//# sourceMappingURL=ApolloServer.js.map
\No newline at end of file