elasticgraph-graphql_lambda 0.18.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 563b00d9217a50b152de726a2f97a8d7d2950c3e0a418a86d64c114b91a9000b
4
+ data.tar.gz: 70e8e66b63f3d9058f6a402c9415a01f7f847add8ce82a1266fc52ea06f74345
5
+ SHA512:
6
+ metadata.gz: 8958eee8cf4b2383b2ca925194a99ccd9303c01f8454d70b65e06df1a5c8d19480ee15695eaa26bf914e061a95bf9b8b4c606a17cc032244607737f412298866
7
+ data.tar.gz: daefbb1c401e4f7e36b52429efcc0f636d4429a12ffbab43c9270d1c16c27ae82ceb0493d341b91ba1a912f411acb8da90555babb9dd37da936345d3be2b94a3
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2024 Block, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # ElasticGraph::GraphQLLambda
2
+
3
+ This gem wraps `elasticgraph-graphql` in order to run it from an AWS Lambda.
@@ -0,0 +1,20 @@
1
+ # Copyright 2024 Block, Inc.
2
+ #
3
+ # Use of this source code is governed by an MIT-style
4
+ # license that can be found in the LICENSE file or at
5
+ # https://opensource.org/licenses/MIT.
6
+ #
7
+ # frozen_string_literal: true
8
+
9
+ require_relative "../gemspec_helper"
10
+
11
+ ElasticGraphGemspecHelper.define_elasticgraph_gem(gemspec_file: __FILE__, category: :lambda) do |spec, eg_version|
12
+ spec.summary = "ElasticGraph gem that wraps elasticgraph-graphql in an AWS Lambda."
13
+
14
+ spec.add_dependency "elasticgraph-graphql", eg_version
15
+ spec.add_dependency "elasticgraph-lambda_support", eg_version
16
+
17
+ spec.add_development_dependency "elasticgraph-elasticsearch", eg_version
18
+ spec.add_development_dependency "elasticgraph-query_registry", eg_version
19
+ spec.add_development_dependency "httpx", ">= 1.2.6", "< 2.0"
20
+ end
@@ -0,0 +1,186 @@
1
+ # Copyright 2024 Block, Inc.
2
+ #
3
+ # Use of this source code is governed by an MIT-style
4
+ # license that can be found in the LICENSE file or at
5
+ # https://opensource.org/licenses/MIT.
6
+ #
7
+ # frozen_string_literal: true
8
+
9
+ require "elastic_graph/constants"
10
+ require "elastic_graph/graphql"
11
+ require "uri"
12
+
13
+ module ElasticGraph
14
+ module GraphQLLambda
15
+ class GraphQLEndpoint
16
+ # Used to add a timeout buffer so that the lambda timeout should generally not be reached,
17
+ # instead preferring our `timeout_in_ms` behavior to the harsher timeout imposed by lambda itself.
18
+ # We prefer this in order to have consistent timeout behavior, regardless of what timeout is
19
+ # reached. For example, we have designed our timeout logic to disconnect from the datastore
20
+ # (which causes it to kill the running query) but we do not know if the lambda-based timeout
21
+ # would also cause that. This buffer gives our lambda enough time to respond before the hard
22
+ # lambda timeout so that it should (hopefully) never get reached.
23
+ #
24
+ # Note we generally run with a 30 second overall lambda timeout so a single second of buffer
25
+ # still gives plenty of time to satisfy the query.
26
+ LAMBDA_TIMEOUT_BUFFER_MS = 1_000
27
+
28
+ # As per https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html, AWS Lambdas
29
+ # are limited to returning up to 6 MB responses.
30
+ #
31
+ # Note: 6 MB is technically 6291456 bytes, but the AWS log message when you exceed the limit mentions
32
+ # a limit of 6291556 (100 bytes larger!). Here we use the smaller threshold since it's the documented value.
33
+ LAMBDA_MAX_RESPONSE_PAYLOAD_BYTES = (_ = 2**20) * 6
34
+
35
+ def initialize(graphql)
36
+ @graphql_http_endpoint = graphql.graphql_http_endpoint
37
+ @logger = graphql.logger
38
+ @monotonic_clock = graphql.monotonic_clock
39
+ end
40
+
41
+ def handle_request(event:, context:)
42
+ start_time_in_ms = @monotonic_clock.now_in_ms # should be the first line so our duration logging is accurate
43
+ request = request_from(event)
44
+
45
+ response = @graphql_http_endpoint.process(
46
+ request,
47
+ max_timeout_in_ms: context.get_remaining_time_in_millis - LAMBDA_TIMEOUT_BUFFER_MS,
48
+ start_time_in_ms: start_time_in_ms
49
+ )
50
+
51
+ convert_response(response)
52
+ end
53
+
54
+ private
55
+
56
+ def request_from(event)
57
+ # The `GRAPHQL_LAMBDA_AWS_ARN_HEADER` header can be used to determine who the client is, which
58
+ # has security implications. Therefore, we need to make sure it can't be spoofed. Here we remove
59
+ # any header which, when normalized, is equivalent to that header.
60
+ headers = event.fetch("headers").reject do |key, _|
61
+ GraphQL::HTTPRequest.normalize_header_name(key) == GRAPHQL_LAMBDA_AWS_ARN_HEADER
62
+ end
63
+
64
+ header_overrides = {
65
+ GRAPHQL_LAMBDA_AWS_ARN_HEADER => event.dig("requestContext", "identity", "userArn")
66
+ }.compact
67
+
68
+ GraphQL::HTTPRequest.new(
69
+ url: url_from(event),
70
+ http_method: http_method_from(event),
71
+ headers: headers.merge(header_overrides),
72
+ body: event.fetch("body")
73
+ )
74
+ end
75
+
76
+ def convert_response(response)
77
+ if response.body.bytesize >= LAMBDA_MAX_RESPONSE_PAYLOAD_BYTES
78
+ response = content_too_large_response(response)
79
+ end
80
+
81
+ {statusCode: response.status_code, body: response.body, headers: response.headers}
82
+ end
83
+
84
+ def url_from(event)
85
+ uri = URI.join("/")
86
+
87
+ # stage_name will be part of the path when a client tries to send a request to an API Gateway endpoint
88
+ # but will be omitted from the path in the actual event. For example a call to <domain-name>/stage-name/graphql
89
+ # will be passed in the event as `requestContext.stage` = "stage-name" and `path` = "/graphql". Here we are
90
+ # using stage_name to be placed back in as a prefix for the path.
91
+ # Note: stage is not expected to ever be nil or empty when invoked through API Gateway. Here we handle that case
92
+ # to be tolerant of it but we don't expect it to ever happen.
93
+ #
94
+ # The event format can be seen here: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format
95
+ # As you should be able to see, the stage name isn't included in the path. In this doc
96
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-call-api.html you should be able to see that stage_name is included in the
97
+ # base url for invoking a REST API.
98
+ stage_name = event.dig("requestContext", "stage") || ""
99
+ stage_name = "/" + stage_name unless stage_name == ""
100
+
101
+ # It'll be `path` if it's an HTTP API with a v1.0 payload:
102
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#1.0
103
+ #
104
+ # And for a REST API, it'll also be `path`:
105
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format
106
+ uri.path = stage_name + event.fetch("path") do
107
+ # It'll be `rawPath` if it's an HTTP API with a v2.0 payload:
108
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#2.0
109
+ event.fetch("rawPath")
110
+ end
111
+
112
+ # If it's an HTTP API with a v2.0 payload, it'll have `rawQueryString`, which we want to use if available:
113
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#2.0
114
+ uri.query = event.fetch("rawQueryString") do
115
+ # If it's an HTTP API with a v1.0 payload, it'll have `queryStringParameters` as a hash:
116
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#1.0
117
+ #
118
+ # And for a REST API, it'll also have `queryStringParameters`:
119
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format
120
+ event.fetch("queryStringParameters")&.then { |params| ::URI.encode_www_form(params) }
121
+ end
122
+
123
+ uri.to_s
124
+ end
125
+
126
+ def http_method_from(event)
127
+ # It'll be `httpMethod` if it's an HTTP API with a v1.0 payload:
128
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#1.0
129
+ #
130
+ # And for a REST API, it'll also be `httpMethod`:
131
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format
132
+ event.fetch("httpMethod") do
133
+ # Unfortunately, for an HTTP API with a v2.0 payload, the method is only available from `requestContext.http.method`:
134
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#2.0
135
+ event.fetch("requestContext").fetch("http").fetch("method")
136
+ end.downcase.to_sym
137
+ end
138
+
139
+ # Responsible for building a response when the existing response is too large to
140
+ # return due to AWS Lambda response size limits.
141
+ #
142
+ # Note: an HTTP 413 status code[^1] would usually be appropriate, but we're not
143
+ # totally sure how API gateway will treat that (e.g. will it pass the response
144
+ # body through to the client?) and the GraphQL-over-HTTP spec recommends[^2] that
145
+ # we return a 200 in this case:
146
+ #
147
+ # > This section only applies when the response body is to use the
148
+ # > `application/json` media type.
149
+ # >
150
+ # > The server SHOULD use the `200` status code for every response to a well-formed
151
+ # > _GraphQL-over-HTTP request_, independent of any _GraphQL request error_ or
152
+ # > _GraphQL field error_ raised.
153
+ # >
154
+ # > Note: A status code in the `4xx` or `5xx` ranges or status code `203` (and maybe
155
+ # > others) could originate from intermediary servers; since the client cannot
156
+ # > determine if an `application/json` response with arbitrary status code is a
157
+ # > well-formed _GraphQL response_ (because it cannot trust the source) the server
158
+ # > must use `200` status code to guarantee to the client that the response has not
159
+ # > been generated or modified by an intermediary.
160
+ # >
161
+ # > ...
162
+ # > The server SHOULD NOT use a `4xx` or `5xx` status code for a response to a
163
+ # > well-formed _GraphQL-over-HTTP request_.
164
+ # >
165
+ # > Note: For compatibility with legacy servers, this specification allows the use
166
+ # > of `4xx` or `5xx` status codes for a failed well-formed _GraphQL-over-HTTP
167
+ # > request_ where the response uses the `application/json` media type, but it is
168
+ # > strongly discouraged. To use `4xx` and `5xx` status codes in these situations,
169
+ # > please use the `application/graphql-response+json` media type.
170
+ #
171
+ # At the time of this writing, ElasticGraph uses the `application/json` media type.
172
+ # We may want to migrate to `application/graphql-response+json` at some later point,
173
+ # at which time we can consider using 413 instead.
174
+ #
175
+ # [^1]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/413
176
+ # [^2]: https://github.com/graphql/graphql-over-http/blob/4db4e501f0537a14fd324c455294056676e38e8c/spec/GraphQLOverHTTP.md#applicationjson
177
+ def content_too_large_response(response)
178
+ GraphQL::HTTPResponse.json(200, {
179
+ "errors" => [{
180
+ "message" => "The query results were #{response.body.bytesize} bytes, which exceeds the max AWS Lambda response size (#{LAMBDA_MAX_RESPONSE_PAYLOAD_BYTES} bytes). Please update the query to request less data and try again."
181
+ }]
182
+ })
183
+ end
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,38 @@
1
+ # Copyright 2024 Block, Inc.
2
+ #
3
+ # Use of this source code is governed by an MIT-style
4
+ # license that can be found in the LICENSE file or at
5
+ # https://opensource.org/licenses/MIT.
6
+ #
7
+ # frozen_string_literal: true
8
+
9
+ require "elastic_graph/lambda_support/lambda_function"
10
+
11
+ module ElasticGraph
12
+ module GraphQLLambda
13
+ class LambdaFunction
14
+ prepend LambdaSupport::LambdaFunction
15
+
16
+ def initialize
17
+ require "elastic_graph/graphql_lambda"
18
+ require "elastic_graph/graphql_lambda/graphql_endpoint"
19
+
20
+ graphql = ElasticGraph::GraphQLLambda.graphql_from_env
21
+
22
+ # ElasticGraph loads things lazily by default. We want to eagerly load
23
+ # the graphql gem, the GraphQL schema, etc. rather than waiting for the
24
+ # first request, since we want consistent response times.
25
+ graphql.load_dependencies_eagerly
26
+
27
+ @graphql_endpoint = ElasticGraph::GraphQLLambda::GraphQLEndpoint.new(graphql)
28
+ end
29
+
30
+ def handle_request(event:, context:)
31
+ @graphql_endpoint.handle_request(event: event, context: context)
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ # This is the constant used by the AWS Lambda function.
38
+ ExecuteGraphQLQuery = ElasticGraph::GraphQLLambda::LambdaFunction.new
@@ -0,0 +1,19 @@
1
+ # Copyright 2024 Block, Inc.
2
+ #
3
+ # Use of this source code is governed by an MIT-style
4
+ # license that can be found in the LICENSE file or at
5
+ # https://opensource.org/licenses/MIT.
6
+ #
7
+ # frozen_string_literal: true
8
+
9
+ require "elastic_graph/graphql"
10
+ require "elastic_graph/lambda_support"
11
+
12
+ module ElasticGraph
13
+ module GraphQLLambda
14
+ # Builds an `ElasticGraph::GraphQL` instance from our lambda ENV vars.
15
+ def self.graphql_from_env
16
+ LambdaSupport.build_from_env(GraphQL)
17
+ end
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,306 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: elasticgraph-graphql_lambda
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.18.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Myron Marston
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-08-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rubocop-factory_bot
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.26'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.26'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubocop-rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.6'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop-rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: standard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.39.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.39.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: steep
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.7'
83
+ - !ruby/object:Gem::Dependency
84
+ name: coderay
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.1'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: flatware-rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 2.3.2
104
+ - - "<"
105
+ - !ruby/object:Gem::Version
106
+ version: '3.0'
107
+ type: :development
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: 2.3.2
114
+ - - "<"
115
+ - !ruby/object:Gem::Version
116
+ version: '3.0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rspec
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '3.13'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '3.13'
131
+ - !ruby/object:Gem::Dependency
132
+ name: super_diff
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 0.12.1
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: 0.12.1
145
+ - !ruby/object:Gem::Dependency
146
+ name: simplecov
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '0.22'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.22'
159
+ - !ruby/object:Gem::Dependency
160
+ name: simplecov-console
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: 0.9.1
166
+ - - "<"
167
+ - !ruby/object:Gem::Version
168
+ version: '1.0'
169
+ type: :development
170
+ prerelease: false
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: 0.9.1
176
+ - - "<"
177
+ - !ruby/object:Gem::Version
178
+ version: '1.0'
179
+ - !ruby/object:Gem::Dependency
180
+ name: aws_lambda_ric
181
+ requirement: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: 2.0.0
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: 2.0.0
193
+ - !ruby/object:Gem::Dependency
194
+ name: elasticgraph-graphql
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - '='
198
+ - !ruby/object:Gem::Version
199
+ version: 0.18.0.0
200
+ type: :runtime
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - '='
205
+ - !ruby/object:Gem::Version
206
+ version: 0.18.0.0
207
+ - !ruby/object:Gem::Dependency
208
+ name: elasticgraph-lambda_support
209
+ requirement: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - '='
212
+ - !ruby/object:Gem::Version
213
+ version: 0.18.0.0
214
+ type: :runtime
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - '='
219
+ - !ruby/object:Gem::Version
220
+ version: 0.18.0.0
221
+ - !ruby/object:Gem::Dependency
222
+ name: elasticgraph-elasticsearch
223
+ requirement: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - '='
226
+ - !ruby/object:Gem::Version
227
+ version: 0.18.0.0
228
+ type: :development
229
+ prerelease: false
230
+ version_requirements: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - '='
233
+ - !ruby/object:Gem::Version
234
+ version: 0.18.0.0
235
+ - !ruby/object:Gem::Dependency
236
+ name: elasticgraph-query_registry
237
+ requirement: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - '='
240
+ - !ruby/object:Gem::Version
241
+ version: 0.18.0.0
242
+ type: :development
243
+ prerelease: false
244
+ version_requirements: !ruby/object:Gem::Requirement
245
+ requirements:
246
+ - - '='
247
+ - !ruby/object:Gem::Version
248
+ version: 0.18.0.0
249
+ - !ruby/object:Gem::Dependency
250
+ name: httpx
251
+ requirement: !ruby/object:Gem::Requirement
252
+ requirements:
253
+ - - ">="
254
+ - !ruby/object:Gem::Version
255
+ version: 1.2.6
256
+ - - "<"
257
+ - !ruby/object:Gem::Version
258
+ version: '2.0'
259
+ type: :development
260
+ prerelease: false
261
+ version_requirements: !ruby/object:Gem::Requirement
262
+ requirements:
263
+ - - ">="
264
+ - !ruby/object:Gem::Version
265
+ version: 1.2.6
266
+ - - "<"
267
+ - !ruby/object:Gem::Version
268
+ version: '2.0'
269
+ description:
270
+ email:
271
+ - myron@squareup.com
272
+ executables: []
273
+ extensions: []
274
+ extra_rdoc_files: []
275
+ files:
276
+ - LICENSE.txt
277
+ - README.md
278
+ - elasticgraph-graphql_lambda.gemspec
279
+ - lib/elastic_graph/graphql_lambda.rb
280
+ - lib/elastic_graph/graphql_lambda/graphql_endpoint.rb
281
+ - lib/elastic_graph/graphql_lambda/lambda_function.rb
282
+ homepage:
283
+ licenses:
284
+ - MIT
285
+ metadata:
286
+ gem_category: lambda
287
+ post_install_message:
288
+ rdoc_options: []
289
+ require_paths:
290
+ - lib
291
+ required_ruby_version: !ruby/object:Gem::Requirement
292
+ requirements:
293
+ - - "~>"
294
+ - !ruby/object:Gem::Version
295
+ version: '3.2'
296
+ required_rubygems_version: !ruby/object:Gem::Requirement
297
+ requirements:
298
+ - - ">="
299
+ - !ruby/object:Gem::Version
300
+ version: '0'
301
+ requirements: []
302
+ rubygems_version: 3.5.9
303
+ signing_key:
304
+ specification_version: 4
305
+ summary: ElasticGraph gem that wraps elasticgraph-graphql in an AWS Lambda.
306
+ test_files: []