graphql-hive 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/benchmark.yml +59 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +1 -0
- data/Gemfile.lock +1 -1
- data/README.md +4 -2
- data/examples/simple-api/Gemfile.lock +1 -1
- data/k6/graphql-api/Gemfile +8 -0
- data/k6/graphql-api/Gemfile.lock +48 -0
- data/k6/graphql-api/app.rb +22 -0
- data/k6/graphql-api/config.ru +2 -0
- data/k6/graphql-api/schema.rb +35 -0
- data/k6/k6.js +99 -0
- data/k6/package.json +11 -0
- data/k6/usage-api.js +22 -0
- data/k6/yarn.lock +405 -0
- data/lib/graphql-hive/client.rb +3 -3
- data/lib/graphql-hive/usage_reporter.rb +18 -19
- data/lib/graphql-hive/version.rb +1 -1
- data/lib/graphql-hive.rb +6 -3
- metadata +12 -3
- data/LICENSE.txt +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 734441600a775933bd1250151b0234b7b8293d4ee49e087a86f80684fe116e74
|
4
|
+
data.tar.gz: fe27f880db8cd0d75856fd8586363b6913f445feac2b7f7041a245eb03f49270
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 967bd101bad2140070d198d8b98ae92e4cb7a2716d4709c30b33862683ea35b7b3970c6c32f8727b57619698e7af43c039e79747d5f46a931ef345c2b44d54a7
|
7
|
+
data.tar.gz: 9013380ae8c596b015571cc05cf0430658d984ee548c9fb21cc3d423d2a3b7459c298816dc765c053f33a49e41318916d665fd77aa4c5eae0a76fc5d7c81f1f6
|
@@ -0,0 +1,59 @@
|
|
1
|
+
name: Benchmark
|
2
|
+
on:
|
3
|
+
pull_request:
|
4
|
+
branches:
|
5
|
+
- master
|
6
|
+
|
7
|
+
jobs:
|
8
|
+
benchmarks:
|
9
|
+
runs-on: ubuntu-latest
|
10
|
+
steps:
|
11
|
+
- name: Checkout Repository
|
12
|
+
uses: actions/checkout@v3
|
13
|
+
|
14
|
+
- name: Use Node
|
15
|
+
uses: actions/setup-node@master
|
16
|
+
with:
|
17
|
+
node-version: 14
|
18
|
+
cache: 'yarn'
|
19
|
+
cache-dependency-path: 'k6/yarn.lock'
|
20
|
+
|
21
|
+
- name: Use Ruby
|
22
|
+
uses: ruby/setup-ruby@359bebbc29cbe6c87da6bc9ea3bc930432750108
|
23
|
+
with:
|
24
|
+
working-directory: ./k6/graphql-api
|
25
|
+
ruby-version: 2.6
|
26
|
+
bundler-cache: true
|
27
|
+
|
28
|
+
- name: Start GraphQL API with hive enabled
|
29
|
+
working-directory: ./k6/graphql-api
|
30
|
+
run: |
|
31
|
+
bundle
|
32
|
+
bundle exec puma -t 0:1 -p 9292 & sleep 5
|
33
|
+
env:
|
34
|
+
HIVE_ENABLED: 'true'
|
35
|
+
|
36
|
+
- name: Start GraphQL API with hive disabled
|
37
|
+
working-directory: ./k6/graphql-api
|
38
|
+
run: |
|
39
|
+
bundle
|
40
|
+
bundle exec puma -t 0:1 -p 9291 & sleep 5
|
41
|
+
env:
|
42
|
+
HIVE_ENABLED: 'false'
|
43
|
+
|
44
|
+
- name: Start Fake Usage API
|
45
|
+
working-directory: ./k6/
|
46
|
+
run: |
|
47
|
+
yarn
|
48
|
+
node usage-api.js & sleep 5s
|
49
|
+
|
50
|
+
- name: Setup K6
|
51
|
+
run: |
|
52
|
+
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
|
53
|
+
echo "deb https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
|
54
|
+
sudo apt-get update
|
55
|
+
sudo apt-get install k6=0.37.0
|
56
|
+
|
57
|
+
- name: Start and Report Benchmark
|
58
|
+
working-directory: ./k6/
|
59
|
+
run: k6 -e GITHUB_PR=${{ github.event.number }} -e GITHUB_SHA=${{ github.sha }} -e GITHUB_TOKEN=${{secrets.GH_PA_TOKEN}} run k6.js
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -139,8 +139,10 @@ end
|
|
139
139
|
|
140
140
|
**A note on `buffer_size` and performances**
|
141
141
|
|
142
|
-
The `graphql-hive` usage reporter, responsible for sending the operations data to Hive, is running in a separate `Thread` to avoid any
|
142
|
+
The `graphql-hive` usage reporter, responsible for sending the operations data to Hive, is running in a separate `Thread` to avoid any significant impact on your GraphQL API performances.
|
143
|
+
|
144
|
+
The performance overhead (with the default `buffer_size` option) is around 1% and [is constantly evaluated for new PR](https://github.com/charlypoly/graphql-ruby-hive/actions/workflows/benchmark.yml).
|
143
145
|
|
144
146
|
If your GraphQL API has a high RPM, we encourage you to increase the `buffer_size` value.
|
145
147
|
|
146
|
-
However, please note that a higher `buffer_size` value will introduce some peak of increase
|
148
|
+
However, please note that a higher `buffer_size` value will introduce some peak of increase in memory consumption.
|
@@ -0,0 +1,48 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../..
|
3
|
+
specs:
|
4
|
+
graphql-hive (0.1.3)
|
5
|
+
graphql (~> 2.0.9)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
graphql (2.0.9)
|
11
|
+
multi_json (1.15.0)
|
12
|
+
mustermann (1.1.1)
|
13
|
+
ruby2_keywords (~> 0.0.1)
|
14
|
+
nio4r (2.5.8)
|
15
|
+
puma (5.6.4)
|
16
|
+
nio4r (~> 2.0)
|
17
|
+
rack (2.2.3.1)
|
18
|
+
rack-contrib (2.3.0)
|
19
|
+
rack (~> 2.0)
|
20
|
+
rack-protection (2.2.0)
|
21
|
+
rack
|
22
|
+
ruby2_keywords (0.0.5)
|
23
|
+
sinatra (2.2.0)
|
24
|
+
mustermann (~> 1.0)
|
25
|
+
rack (~> 2.2)
|
26
|
+
rack-protection (= 2.2.0)
|
27
|
+
tilt (~> 2.0)
|
28
|
+
sinatra-contrib (2.2.0)
|
29
|
+
multi_json
|
30
|
+
mustermann (~> 1.0)
|
31
|
+
rack-protection (= 2.2.0)
|
32
|
+
sinatra (= 2.2.0)
|
33
|
+
tilt (~> 2.0)
|
34
|
+
tilt (2.0.10)
|
35
|
+
|
36
|
+
PLATFORMS
|
37
|
+
ruby
|
38
|
+
|
39
|
+
DEPENDENCIES
|
40
|
+
graphql
|
41
|
+
graphql-hive!
|
42
|
+
puma
|
43
|
+
rack-contrib
|
44
|
+
sinatra
|
45
|
+
sinatra-contrib
|
46
|
+
|
47
|
+
BUNDLED WITH
|
48
|
+
1.17.3
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'sinatra'
|
2
|
+
require 'sinatra/json'
|
3
|
+
require 'rack/contrib'
|
4
|
+
|
5
|
+
require_relative 'schema'
|
6
|
+
|
7
|
+
class DemoApp < Sinatra::Base
|
8
|
+
use Rack::JSONBodyParser
|
9
|
+
|
10
|
+
post '/graphql' do
|
11
|
+
result = Schema.execute(
|
12
|
+
params['query'],
|
13
|
+
variables: params[:variables],
|
14
|
+
operation_name: params[:operationName],
|
15
|
+
context: {
|
16
|
+
client_name: 'GraphQL Client',
|
17
|
+
client_version: '1.0'
|
18
|
+
}
|
19
|
+
)
|
20
|
+
json result
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'graphql'
|
2
|
+
require 'graphql-hive'
|
3
|
+
|
4
|
+
module Types
|
5
|
+
class PostType < GraphQL::Schema::Object
|
6
|
+
description 'A blog post'
|
7
|
+
field :id, ID, null: false
|
8
|
+
field :title, String, null: false
|
9
|
+
# fields should be queried in camel-case (this will be `truncatedPreview`)
|
10
|
+
field :truncated_preview, String, null: false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class QueryType < GraphQL::Schema::Object
|
15
|
+
description 'The query root of this schema'
|
16
|
+
|
17
|
+
# First describe the field signature:
|
18
|
+
field :post, Types::PostType, 'Find a post by ID' do
|
19
|
+
argument :id, [ID]
|
20
|
+
end
|
21
|
+
|
22
|
+
# Then provide an implementation:
|
23
|
+
def post(id:)
|
24
|
+
{ id: 1, title: 'GraphQL Hive with `graphql-ruby`',
|
25
|
+
truncated_preview: 'Monitor operations, inspect your queries and publish your GraphQL schema with GraphQL Hive' }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class Schema < GraphQL::Schema
|
30
|
+
query QueryType
|
31
|
+
|
32
|
+
use(GraphQL::Hive,
|
33
|
+
{ enabled: ENV['HIVE_ENABLED'] === 'true', endpoint: 'localhost', debug: true, port: 8888, token: 'stress-token',
|
34
|
+
report_schema: false })
|
35
|
+
end
|
data/k6/k6.js
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
import { check } from "k6";
|
2
|
+
import http from "k6/http";
|
3
|
+
import { textSummary } from "https://jslib.k6.io/k6-summary/0.0.1/index.js";
|
4
|
+
import { githubComment } from "https://raw.githubusercontent.com/dotansimha/k6-github-pr-comment/master/lib.js";
|
5
|
+
|
6
|
+
export const options = {
|
7
|
+
discardResponseBodies: true,
|
8
|
+
scenarios: {
|
9
|
+
hiveEnabled: {
|
10
|
+
executor: "shared-iterations",
|
11
|
+
vus: 120,
|
12
|
+
iterations: 500,
|
13
|
+
maxDuration: "30s",
|
14
|
+
env: { GQL_API_PORT: "9292", HIVE_ENABLED: "true" },
|
15
|
+
},
|
16
|
+
hiveDisabled: {
|
17
|
+
executor: "shared-iterations",
|
18
|
+
vus: 120,
|
19
|
+
iterations: 500,
|
20
|
+
maxDuration: "30s",
|
21
|
+
startTime: "30s",
|
22
|
+
env: { GQL_API_PORT: "9291", HIVE_ENABLED: "false" },
|
23
|
+
},
|
24
|
+
},
|
25
|
+
thresholds: {
|
26
|
+
"http_req_duration{hive:enabled}": ["avg<4500"],
|
27
|
+
"http_req_duration{hive:disabled}": ["avg<4500"],
|
28
|
+
},
|
29
|
+
};
|
30
|
+
|
31
|
+
const QUERY = /* GraphQL */ `
|
32
|
+
query GetPost {
|
33
|
+
post(id: 1) {
|
34
|
+
title
|
35
|
+
myId: id
|
36
|
+
}
|
37
|
+
}
|
38
|
+
`;
|
39
|
+
|
40
|
+
export default function () {
|
41
|
+
const payload = JSON.stringify({
|
42
|
+
query: QUERY,
|
43
|
+
operationName: "GetPost",
|
44
|
+
});
|
45
|
+
const params = {
|
46
|
+
headers: {
|
47
|
+
"Content-Type": "application/json",
|
48
|
+
},
|
49
|
+
tags: { hive: __ENV.HIVE_ENABLED === "true" ? "enabled" : "disabled" },
|
50
|
+
};
|
51
|
+
|
52
|
+
return http.post(
|
53
|
+
`http://localhost:${__ENV.GQL_API_PORT}/graphql`,
|
54
|
+
payload,
|
55
|
+
params
|
56
|
+
);
|
57
|
+
}
|
58
|
+
|
59
|
+
export function handleSummary(data) {
|
60
|
+
let overheadPercentage = null;
|
61
|
+
if (
|
62
|
+
data.metrics["http_req_duration{hive:enabled}"] &&
|
63
|
+
data.metrics["http_req_duration{hive:disabled}"]
|
64
|
+
) {
|
65
|
+
const withHive =
|
66
|
+
data.metrics["http_req_duration{hive:enabled}"].values["avg"];
|
67
|
+
const withoutHive =
|
68
|
+
data.metrics["http_req_duration{hive:disabled}"].values["avg"];
|
69
|
+
overheadPercentage = 100 - (withHive * 100.0) / withoutHive;
|
70
|
+
}
|
71
|
+
if (__ENV.GITHUB_TOKEN) {
|
72
|
+
githubComment(data, {
|
73
|
+
token: __ENV.GITHUB_TOKEN,
|
74
|
+
commit: __ENV.GITHUB_SHA,
|
75
|
+
pr: __ENV.GITHUB_PR,
|
76
|
+
org: "charlypoly",
|
77
|
+
repo: "graphql-ruby-hive",
|
78
|
+
renderTitle: () => {
|
79
|
+
return overheadPercentage < 5
|
80
|
+
? "✅ Benchmark Results"
|
81
|
+
: "❌ Benchmark Failed";
|
82
|
+
},
|
83
|
+
renderMessage: () => {
|
84
|
+
const result = [];
|
85
|
+
if (overheadPercentage > 5) {
|
86
|
+
result.push(
|
87
|
+
"**Performance regression detected**: it seems like your Pull Request adds some extra latency to GraphQL Hive operations processing"
|
88
|
+
);
|
89
|
+
} else {
|
90
|
+
result.push("Overhead <= 1%");
|
91
|
+
}
|
92
|
+
return result.join("\n");
|
93
|
+
},
|
94
|
+
});
|
95
|
+
}
|
96
|
+
return {
|
97
|
+
stdout: textSummary(data, { indent: " ", enableColors: true }),
|
98
|
+
};
|
99
|
+
}
|
data/k6/package.json
ADDED
data/k6/usage-api.js
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
const express = require("express");
|
2
|
+
const app = express();
|
3
|
+
const port = 8888;
|
4
|
+
|
5
|
+
app.use(express.json());
|
6
|
+
|
7
|
+
let count = 0;
|
8
|
+
|
9
|
+
app.get("/count", (req, res) => {
|
10
|
+
res.status(200).send({ count });
|
11
|
+
});
|
12
|
+
|
13
|
+
app.post("/usage", (req, res) => {
|
14
|
+
if (req.body && req.body.operations) {
|
15
|
+
count += Object.keys(req.body.operations).length;
|
16
|
+
}
|
17
|
+
res.status(200).send({ status: "ok " });
|
18
|
+
});
|
19
|
+
|
20
|
+
app.listen(port, () => {
|
21
|
+
console.log(`Usage API listening on port ${port}`);
|
22
|
+
});
|
data/k6/yarn.lock
ADDED
@@ -0,0 +1,405 @@
|
|
1
|
+
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
2
|
+
# yarn lockfile v1
|
3
|
+
|
4
|
+
|
5
|
+
accepts@~1.3.8:
|
6
|
+
version "1.3.8"
|
7
|
+
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
|
8
|
+
integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
|
9
|
+
dependencies:
|
10
|
+
mime-types "~2.1.34"
|
11
|
+
negotiator "0.6.3"
|
12
|
+
|
13
|
+
array-flatten@1.1.1:
|
14
|
+
version "1.1.1"
|
15
|
+
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
|
16
|
+
integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
|
17
|
+
|
18
|
+
body-parser@1.20.0:
|
19
|
+
version "1.20.0"
|
20
|
+
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5"
|
21
|
+
integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==
|
22
|
+
dependencies:
|
23
|
+
bytes "3.1.2"
|
24
|
+
content-type "~1.0.4"
|
25
|
+
debug "2.6.9"
|
26
|
+
depd "2.0.0"
|
27
|
+
destroy "1.2.0"
|
28
|
+
http-errors "2.0.0"
|
29
|
+
iconv-lite "0.4.24"
|
30
|
+
on-finished "2.4.1"
|
31
|
+
qs "6.10.3"
|
32
|
+
raw-body "2.5.1"
|
33
|
+
type-is "~1.6.18"
|
34
|
+
unpipe "1.0.0"
|
35
|
+
|
36
|
+
bytes@3.1.2:
|
37
|
+
version "3.1.2"
|
38
|
+
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
|
39
|
+
integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
|
40
|
+
|
41
|
+
call-bind@^1.0.0:
|
42
|
+
version "1.0.2"
|
43
|
+
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
|
44
|
+
integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
|
45
|
+
dependencies:
|
46
|
+
function-bind "^1.1.1"
|
47
|
+
get-intrinsic "^1.0.2"
|
48
|
+
|
49
|
+
content-disposition@0.5.4:
|
50
|
+
version "0.5.4"
|
51
|
+
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
|
52
|
+
integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
|
53
|
+
dependencies:
|
54
|
+
safe-buffer "5.2.1"
|
55
|
+
|
56
|
+
content-type@~1.0.4:
|
57
|
+
version "1.0.4"
|
58
|
+
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
|
59
|
+
integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
|
60
|
+
|
61
|
+
cookie-signature@1.0.6:
|
62
|
+
version "1.0.6"
|
63
|
+
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
|
64
|
+
integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
|
65
|
+
|
66
|
+
cookie@0.5.0:
|
67
|
+
version "0.5.0"
|
68
|
+
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
69
|
+
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
70
|
+
|
71
|
+
debug@2.6.9:
|
72
|
+
version "2.6.9"
|
73
|
+
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
|
74
|
+
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
|
75
|
+
dependencies:
|
76
|
+
ms "2.0.0"
|
77
|
+
|
78
|
+
depd@2.0.0:
|
79
|
+
version "2.0.0"
|
80
|
+
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
|
81
|
+
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
|
82
|
+
|
83
|
+
destroy@1.2.0:
|
84
|
+
version "1.2.0"
|
85
|
+
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
|
86
|
+
integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
|
87
|
+
|
88
|
+
ee-first@1.1.1:
|
89
|
+
version "1.1.1"
|
90
|
+
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
|
91
|
+
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
|
92
|
+
|
93
|
+
encodeurl@~1.0.2:
|
94
|
+
version "1.0.2"
|
95
|
+
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
|
96
|
+
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
|
97
|
+
|
98
|
+
escape-html@~1.0.3:
|
99
|
+
version "1.0.3"
|
100
|
+
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
|
101
|
+
integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
|
102
|
+
|
103
|
+
etag@~1.8.1:
|
104
|
+
version "1.8.1"
|
105
|
+
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
|
106
|
+
integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
|
107
|
+
|
108
|
+
express@^4.18.1:
|
109
|
+
version "4.18.1"
|
110
|
+
resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf"
|
111
|
+
integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==
|
112
|
+
dependencies:
|
113
|
+
accepts "~1.3.8"
|
114
|
+
array-flatten "1.1.1"
|
115
|
+
body-parser "1.20.0"
|
116
|
+
content-disposition "0.5.4"
|
117
|
+
content-type "~1.0.4"
|
118
|
+
cookie "0.5.0"
|
119
|
+
cookie-signature "1.0.6"
|
120
|
+
debug "2.6.9"
|
121
|
+
depd "2.0.0"
|
122
|
+
encodeurl "~1.0.2"
|
123
|
+
escape-html "~1.0.3"
|
124
|
+
etag "~1.8.1"
|
125
|
+
finalhandler "1.2.0"
|
126
|
+
fresh "0.5.2"
|
127
|
+
http-errors "2.0.0"
|
128
|
+
merge-descriptors "1.0.1"
|
129
|
+
methods "~1.1.2"
|
130
|
+
on-finished "2.4.1"
|
131
|
+
parseurl "~1.3.3"
|
132
|
+
path-to-regexp "0.1.7"
|
133
|
+
proxy-addr "~2.0.7"
|
134
|
+
qs "6.10.3"
|
135
|
+
range-parser "~1.2.1"
|
136
|
+
safe-buffer "5.2.1"
|
137
|
+
send "0.18.0"
|
138
|
+
serve-static "1.15.0"
|
139
|
+
setprototypeof "1.2.0"
|
140
|
+
statuses "2.0.1"
|
141
|
+
type-is "~1.6.18"
|
142
|
+
utils-merge "1.0.1"
|
143
|
+
vary "~1.1.2"
|
144
|
+
|
145
|
+
finalhandler@1.2.0:
|
146
|
+
version "1.2.0"
|
147
|
+
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
|
148
|
+
integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
|
149
|
+
dependencies:
|
150
|
+
debug "2.6.9"
|
151
|
+
encodeurl "~1.0.2"
|
152
|
+
escape-html "~1.0.3"
|
153
|
+
on-finished "2.4.1"
|
154
|
+
parseurl "~1.3.3"
|
155
|
+
statuses "2.0.1"
|
156
|
+
unpipe "~1.0.0"
|
157
|
+
|
158
|
+
forwarded@0.2.0:
|
159
|
+
version "0.2.0"
|
160
|
+
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
|
161
|
+
integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
|
162
|
+
|
163
|
+
fresh@0.5.2:
|
164
|
+
version "0.5.2"
|
165
|
+
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
|
166
|
+
integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
|
167
|
+
|
168
|
+
function-bind@^1.1.1:
|
169
|
+
version "1.1.1"
|
170
|
+
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
|
171
|
+
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
|
172
|
+
|
173
|
+
get-intrinsic@^1.0.2:
|
174
|
+
version "1.1.2"
|
175
|
+
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598"
|
176
|
+
integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==
|
177
|
+
dependencies:
|
178
|
+
function-bind "^1.1.1"
|
179
|
+
has "^1.0.3"
|
180
|
+
has-symbols "^1.0.3"
|
181
|
+
|
182
|
+
has-symbols@^1.0.3:
|
183
|
+
version "1.0.3"
|
184
|
+
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
|
185
|
+
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
|
186
|
+
|
187
|
+
has@^1.0.3:
|
188
|
+
version "1.0.3"
|
189
|
+
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
|
190
|
+
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
|
191
|
+
dependencies:
|
192
|
+
function-bind "^1.1.1"
|
193
|
+
|
194
|
+
http-errors@2.0.0:
|
195
|
+
version "2.0.0"
|
196
|
+
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
|
197
|
+
integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
|
198
|
+
dependencies:
|
199
|
+
depd "2.0.0"
|
200
|
+
inherits "2.0.4"
|
201
|
+
setprototypeof "1.2.0"
|
202
|
+
statuses "2.0.1"
|
203
|
+
toidentifier "1.0.1"
|
204
|
+
|
205
|
+
iconv-lite@0.4.24:
|
206
|
+
version "0.4.24"
|
207
|
+
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
|
208
|
+
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
|
209
|
+
dependencies:
|
210
|
+
safer-buffer ">= 2.1.2 < 3"
|
211
|
+
|
212
|
+
inherits@2.0.4:
|
213
|
+
version "2.0.4"
|
214
|
+
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
215
|
+
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
216
|
+
|
217
|
+
ipaddr.js@1.9.1:
|
218
|
+
version "1.9.1"
|
219
|
+
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
|
220
|
+
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
|
221
|
+
|
222
|
+
media-typer@0.3.0:
|
223
|
+
version "0.3.0"
|
224
|
+
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
|
225
|
+
integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
|
226
|
+
|
227
|
+
merge-descriptors@1.0.1:
|
228
|
+
version "1.0.1"
|
229
|
+
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
|
230
|
+
integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==
|
231
|
+
|
232
|
+
methods@~1.1.2:
|
233
|
+
version "1.1.2"
|
234
|
+
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
|
235
|
+
integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
|
236
|
+
|
237
|
+
mime-db@1.52.0:
|
238
|
+
version "1.52.0"
|
239
|
+
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
|
240
|
+
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
|
241
|
+
|
242
|
+
mime-types@~2.1.24, mime-types@~2.1.34:
|
243
|
+
version "2.1.35"
|
244
|
+
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
|
245
|
+
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
|
246
|
+
dependencies:
|
247
|
+
mime-db "1.52.0"
|
248
|
+
|
249
|
+
mime@1.6.0:
|
250
|
+
version "1.6.0"
|
251
|
+
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
|
252
|
+
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
|
253
|
+
|
254
|
+
ms@2.0.0:
|
255
|
+
version "2.0.0"
|
256
|
+
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
257
|
+
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
|
258
|
+
|
259
|
+
ms@2.1.3:
|
260
|
+
version "2.1.3"
|
261
|
+
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
|
262
|
+
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
|
263
|
+
|
264
|
+
negotiator@0.6.3:
|
265
|
+
version "0.6.3"
|
266
|
+
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
|
267
|
+
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
|
268
|
+
|
269
|
+
object-inspect@^1.9.0:
|
270
|
+
version "1.12.2"
|
271
|
+
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
|
272
|
+
integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
|
273
|
+
|
274
|
+
on-finished@2.4.1:
|
275
|
+
version "2.4.1"
|
276
|
+
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
|
277
|
+
integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
|
278
|
+
dependencies:
|
279
|
+
ee-first "1.1.1"
|
280
|
+
|
281
|
+
parseurl@~1.3.3:
|
282
|
+
version "1.3.3"
|
283
|
+
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
|
284
|
+
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
|
285
|
+
|
286
|
+
path-to-regexp@0.1.7:
|
287
|
+
version "0.1.7"
|
288
|
+
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
|
289
|
+
integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==
|
290
|
+
|
291
|
+
proxy-addr@~2.0.7:
|
292
|
+
version "2.0.7"
|
293
|
+
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
|
294
|
+
integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
|
295
|
+
dependencies:
|
296
|
+
forwarded "0.2.0"
|
297
|
+
ipaddr.js "1.9.1"
|
298
|
+
|
299
|
+
qs@6.10.3:
|
300
|
+
version "6.10.3"
|
301
|
+
resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
|
302
|
+
integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
|
303
|
+
dependencies:
|
304
|
+
side-channel "^1.0.4"
|
305
|
+
|
306
|
+
range-parser@~1.2.1:
|
307
|
+
version "1.2.1"
|
308
|
+
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
|
309
|
+
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
|
310
|
+
|
311
|
+
raw-body@2.5.1:
|
312
|
+
version "2.5.1"
|
313
|
+
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857"
|
314
|
+
integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
|
315
|
+
dependencies:
|
316
|
+
bytes "3.1.2"
|
317
|
+
http-errors "2.0.0"
|
318
|
+
iconv-lite "0.4.24"
|
319
|
+
unpipe "1.0.0"
|
320
|
+
|
321
|
+
safe-buffer@5.2.1:
|
322
|
+
version "5.2.1"
|
323
|
+
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
324
|
+
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
|
325
|
+
|
326
|
+
"safer-buffer@>= 2.1.2 < 3":
|
327
|
+
version "2.1.2"
|
328
|
+
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
|
329
|
+
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
330
|
+
|
331
|
+
send@0.18.0:
|
332
|
+
version "0.18.0"
|
333
|
+
resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
|
334
|
+
integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
|
335
|
+
dependencies:
|
336
|
+
debug "2.6.9"
|
337
|
+
depd "2.0.0"
|
338
|
+
destroy "1.2.0"
|
339
|
+
encodeurl "~1.0.2"
|
340
|
+
escape-html "~1.0.3"
|
341
|
+
etag "~1.8.1"
|
342
|
+
fresh "0.5.2"
|
343
|
+
http-errors "2.0.0"
|
344
|
+
mime "1.6.0"
|
345
|
+
ms "2.1.3"
|
346
|
+
on-finished "2.4.1"
|
347
|
+
range-parser "~1.2.1"
|
348
|
+
statuses "2.0.1"
|
349
|
+
|
350
|
+
serve-static@1.15.0:
|
351
|
+
version "1.15.0"
|
352
|
+
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
|
353
|
+
integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
|
354
|
+
dependencies:
|
355
|
+
encodeurl "~1.0.2"
|
356
|
+
escape-html "~1.0.3"
|
357
|
+
parseurl "~1.3.3"
|
358
|
+
send "0.18.0"
|
359
|
+
|
360
|
+
setprototypeof@1.2.0:
|
361
|
+
version "1.2.0"
|
362
|
+
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
|
363
|
+
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
|
364
|
+
|
365
|
+
side-channel@^1.0.4:
|
366
|
+
version "1.0.4"
|
367
|
+
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
|
368
|
+
integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
|
369
|
+
dependencies:
|
370
|
+
call-bind "^1.0.0"
|
371
|
+
get-intrinsic "^1.0.2"
|
372
|
+
object-inspect "^1.9.0"
|
373
|
+
|
374
|
+
statuses@2.0.1:
|
375
|
+
version "2.0.1"
|
376
|
+
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
|
377
|
+
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
|
378
|
+
|
379
|
+
toidentifier@1.0.1:
|
380
|
+
version "1.0.1"
|
381
|
+
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
|
382
|
+
integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
|
383
|
+
|
384
|
+
type-is@~1.6.18:
|
385
|
+
version "1.6.18"
|
386
|
+
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
|
387
|
+
integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
|
388
|
+
dependencies:
|
389
|
+
media-typer "0.3.0"
|
390
|
+
mime-types "~2.1.24"
|
391
|
+
|
392
|
+
unpipe@1.0.0, unpipe@~1.0.0:
|
393
|
+
version "1.0.0"
|
394
|
+
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
|
395
|
+
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
|
396
|
+
|
397
|
+
utils-merge@1.0.1:
|
398
|
+
version "1.0.1"
|
399
|
+
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
|
400
|
+
integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
|
401
|
+
|
402
|
+
vary@~1.1.2:
|
403
|
+
version "1.1.2"
|
404
|
+
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
|
405
|
+
integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
|
data/lib/graphql-hive/client.rb
CHANGED
@@ -21,7 +21,7 @@ module GraphQL
|
|
21
21
|
)
|
22
22
|
|
23
23
|
http = ::Net::HTTP.new(uri.host, uri.port)
|
24
|
-
http.use_ssl =
|
24
|
+
http.use_ssl = @options[:port].to_s == '443'
|
25
25
|
http.read_timeout = 2
|
26
26
|
request = Net::HTTP::Post.new(uri.request_uri)
|
27
27
|
request['content-type'] = 'application/json'
|
@@ -32,8 +32,8 @@ module GraphQL
|
|
32
32
|
request.body = JSON.generate(body)
|
33
33
|
response = http.request(request)
|
34
34
|
|
35
|
-
@options[:logger].debug(response.inspect)
|
36
|
-
@options[:logger].debug(response.body.inspect)
|
35
|
+
@options[:logger].debug(response.inspect)
|
36
|
+
@options[:logger].debug(response.body.inspect)
|
37
37
|
rescue StandardError => e
|
38
38
|
@options[:logger].fatal("Failed to send data: #{e}")
|
39
39
|
end
|
@@ -14,7 +14,6 @@ module GraphQL
|
|
14
14
|
@thread = nil
|
15
15
|
@operations_buffer = nil
|
16
16
|
@client = nil
|
17
|
-
@logger = nil
|
18
17
|
|
19
18
|
def self.instance
|
20
19
|
@@instance
|
@@ -24,35 +23,35 @@ module GraphQL
|
|
24
23
|
@@instance = self
|
25
24
|
|
26
25
|
@options = options
|
27
|
-
@buffer_size = options[:buffer_size]
|
28
|
-
@logger = options[:logger]
|
29
26
|
@client = client
|
30
|
-
@operations_buffer = []
|
31
27
|
|
28
|
+
@options_mutex = Mutex.new
|
32
29
|
@queue = Queue.new
|
33
|
-
|
34
30
|
@thread = Thread.new do
|
35
|
-
|
36
|
-
|
37
|
-
|
31
|
+
buffer = []
|
32
|
+
while (operation = @queue.pop(false))
|
33
|
+
@options[:logger].debug("add operation to buffer: #{operation}")
|
34
|
+
buffer << operation
|
35
|
+
@options_mutex.synchronize do
|
36
|
+
if buffer.size >= @options[:buffer_size]
|
37
|
+
@options[:logger].debug('buffer is full, sending!')
|
38
|
+
process_operations(buffer)
|
39
|
+
buffer = []
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
unless buffer.size.zero?
|
44
|
+
@options[:logger].debug('shuting down with buffer, sending!')
|
45
|
+
process_operations(buffer)
|
38
46
|
end
|
39
47
|
end
|
40
48
|
end
|
41
49
|
|
42
50
|
def add_operation(operation)
|
43
|
-
@
|
44
|
-
|
45
|
-
@operations_buffer << operation
|
46
|
-
|
47
|
-
return unless @operations_buffer.size >= @buffer_size
|
48
|
-
|
49
|
-
@logger.debug('buffer is full, sending!') if @options[:debug]
|
50
|
-
@queue.push @operations_buffer
|
51
|
-
@operations_buffer = []
|
51
|
+
@queue.push(operation)
|
52
52
|
end
|
53
53
|
|
54
54
|
def on_exit
|
55
|
-
@queue.push @operations_buffer unless @operations_buffer.empty?
|
56
55
|
@queue.close
|
57
56
|
@thread.join
|
58
57
|
end
|
@@ -70,7 +69,7 @@ module GraphQL
|
|
70
69
|
add_operation_to_report(report, operation)
|
71
70
|
end
|
72
71
|
|
73
|
-
@logger.debug("sending report: #{report}")
|
72
|
+
@options[:logger].debug("sending report: #{report}")
|
74
73
|
|
75
74
|
@client.send('/usage', report, :usage)
|
76
75
|
end
|
data/lib/graphql-hive/version.rb
CHANGED
data/lib/graphql-hive.rb
CHANGED
@@ -51,6 +51,8 @@ module GraphQL
|
|
51
51
|
|
52
52
|
DEFAULT_OPTIONS = {
|
53
53
|
enabled: true,
|
54
|
+
debug: false,
|
55
|
+
port: '443',
|
54
56
|
collect_usage: true,
|
55
57
|
read_operations: true,
|
56
58
|
report_schema: true,
|
@@ -71,7 +73,7 @@ module GraphQL
|
|
71
73
|
|
72
74
|
def initialize(options = {})
|
73
75
|
opts = DEFAULT_OPTIONS.merge(options)
|
74
|
-
|
76
|
+
initialize_options!(opts)
|
75
77
|
super(opts)
|
76
78
|
|
77
79
|
@@instance = self
|
@@ -144,13 +146,14 @@ module GraphQL
|
|
144
146
|
|
145
147
|
private
|
146
148
|
|
147
|
-
def
|
149
|
+
def initialize_options!(options)
|
148
150
|
if options[:logger].nil?
|
149
|
-
options[:logger] = Logger.new($
|
151
|
+
options[:logger] = Logger.new($stderr)
|
150
152
|
original_formatter = Logger::Formatter.new
|
151
153
|
options[:logger].formatter = proc { |severity, datetime, progname, msg|
|
152
154
|
original_formatter.call(severity, datetime, progname, "[hive] #{msg.dump}")
|
153
155
|
}
|
156
|
+
options[:logger].level = options[:debug] ? Logger::DEBUG : Logger::INFO
|
154
157
|
end
|
155
158
|
if !options.include?(:token) && (!options.include?(:enabled) || options.enabled)
|
156
159
|
options[:logger].warn('`token` options is missing')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql-hive
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Charly POLY
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-06-
|
11
|
+
date: 2022-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: graphql
|
@@ -88,6 +88,7 @@ executables: []
|
|
88
88
|
extensions: []
|
89
89
|
extra_rdoc_files: []
|
90
90
|
files:
|
91
|
+
- ".github/workflows/benchmark.yml"
|
91
92
|
- ".github/workflows/ci.yml"
|
92
93
|
- ".gitignore"
|
93
94
|
- ".rspec"
|
@@ -95,7 +96,6 @@ files:
|
|
95
96
|
- Gemfile
|
96
97
|
- Gemfile.lock
|
97
98
|
- LICENSE
|
98
|
-
- LICENSE.txt
|
99
99
|
- README.md
|
100
100
|
- Rakefile
|
101
101
|
- cover.png
|
@@ -105,6 +105,15 @@ files:
|
|
105
105
|
- examples/simple-api/config.ru
|
106
106
|
- examples/simple-api/schema.rb
|
107
107
|
- graphql-hive.gemspec
|
108
|
+
- k6/graphql-api/Gemfile
|
109
|
+
- k6/graphql-api/Gemfile.lock
|
110
|
+
- k6/graphql-api/app.rb
|
111
|
+
- k6/graphql-api/config.ru
|
112
|
+
- k6/graphql-api/schema.rb
|
113
|
+
- k6/k6.js
|
114
|
+
- k6/package.json
|
115
|
+
- k6/usage-api.js
|
116
|
+
- k6/yarn.lock
|
108
117
|
- lib/graphql-hive.rb
|
109
118
|
- lib/graphql-hive/analyzer.rb
|
110
119
|
- lib/graphql-hive/client.rb
|
data/LICENSE.txt
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
The MIT License (MIT)
|
2
|
-
|
3
|
-
Copyright (c) 2022 Charly POLY
|
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.
|