1 | "use strict";
|
2 | var __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 | };
|
11 | Object.defineProperty(exports, "__esModule", { value: true });
|
12 | exports.ApolloServer = exports.FileUploadRequest = void 0;
|
13 | const apollo_server_core_1 = require("apollo-server-core");
|
14 | const graphql_playground_html_1 = require("@apollographql/graphql-playground-html");
|
15 | const lambdaApollo_1 = require("./lambdaApollo");
|
16 | const apollo_server_env_1 = require("apollo-server-env");
|
17 | const stream_1 = require("stream");
|
18 | class FileUploadRequest extends stream_1.Readable {
|
19 | }
|
20 | exports.FileUploadRequest = FileUploadRequest;
|
21 | class 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 | }
|
171 | exports.ApolloServer = ApolloServer;
|
172 |
|
\ | No newline at end of file |