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 +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +3 -0
- data/elasticgraph-graphql_lambda.gemspec +20 -0
- data/lib/elastic_graph/graphql_lambda/graphql_endpoint.rb +186 -0
- data/lib/elastic_graph/graphql_lambda/lambda_function.rb +38 -0
- data/lib/elastic_graph/graphql_lambda.rb +19 -0
- metadata +306 -0
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,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: []
|