Skip to content

Commit 8824a1c

Browse files
Merge pull request #1 from BetterStackHQ/grpc
Basic GRPC Support
2 parents 0b18305 + ebc728c commit 8824a1c

17 files changed

+1458
-183
lines changed

Cargo.lock

Lines changed: 141 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gemfile

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ gem "rake", "~> 13.0"
1010
gem "rake-compiler"
1111
gem "rb_sys", "~> 0.9.63"
1212

13-
gem "minitest", "~> 5.16"
13+
gem "minitest", "~> 5.0"
1414

15-
gem "httpx", "~> 1.4"
15+
gem "httpx", "~> 1.2"
16+
17+
# gRPC dependencies
18+
gem "grpc", "~> 1.62"
19+
gem "grpc-tools", "~> 1.62"
20+
gem "google-protobuf", "~> 3.25"

Gemfile.lock

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,17 @@ PATH
66
GEM
77
remote: https://rubygems.org/
88
specs:
9+
google-protobuf (3.25.6)
10+
google-protobuf (3.25.6-arm64-darwin)
11+
googleapis-common-protos-types (1.18.0)
12+
google-protobuf (>= 3.18, < 5.a)
13+
grpc (1.70.1)
14+
google-protobuf (>= 3.25, < 5.0)
15+
googleapis-common-protos-types (~> 1.0)
16+
grpc (1.70.1-arm64-darwin)
17+
google-protobuf (>= 3.25, < 5.0)
18+
googleapis-common-protos-types (~> 1.0)
19+
grpc-tools (1.70.1)
920
http-2 (1.0.2)
1021
httpx (1.4.0)
1122
http-2 (>= 1.0.0)
@@ -22,9 +33,12 @@ PLATFORMS
2233
ruby
2334

2435
DEPENDENCIES
25-
httpx (~> 1.4)
36+
google-protobuf (~> 3.25)
37+
grpc (~> 1.62)
38+
grpc-tools (~> 1.62)
39+
httpx (~> 1.2)
2640
hyper_ruby!
27-
minitest (~> 5.16)
41+
minitest (~> 5.0)
2842
rake (~> 13.0)
2943
rake-compiler
3044
rb_sys (~> 0.9.63)

Rakefile

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,25 @@
11
# frozen_string_literal: true
22

33
require "bundler/gem_tasks"
4-
require "minitest/test_task"
4+
require "rake/testtask"
55

6-
Minitest::TestTask.create
6+
Rake::TestTask.new(:test) do |t|
7+
t.libs << "test"
8+
t.libs << "lib"
9+
t.pattern = "test/**/test_*.rb"
10+
t.warning = false
11+
t.verbose = true
12+
end
13+
14+
# Remove the existing default task
15+
Rake::Task[:default].clear if Rake::Task.task_defined?(:default)
16+
17+
namespace :proto do
18+
desc "Generate Ruby code from proto files"
19+
task :generate do
20+
system("grpc_tools_ruby_protoc -I test --ruby_out=test --grpc_out=test test/echo.proto") or fail "Failed to generate proto files"
21+
end
22+
end
723

824
require "rb_sys/extensiontask"
925

@@ -15,4 +31,5 @@ RbSys::ExtensionTask.new("hyper_ruby", GEMSPEC) do |ext|
1531
ext.lib_dir = "lib/hyper_ruby"
1632
end
1733

18-
task default: %i[compile test]
34+
# Define the default task to run both compile and test
35+
task :default => [:compile, :test]

bin/run-server.rb

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#!/usr/bin/env ruby
2+
# frozen_string_literal: true
3+
4+
$LOAD_PATH.unshift File.expand_path("../lib", __dir__)
5+
6+
puts "Loading hyper_ruby"
7+
8+
require "hyper_ruby"
9+
require "json"
10+
11+
# Create and configure the server
12+
server = HyperRuby::Server.new
13+
config = {
14+
bind_address: ENV.fetch("BIND_ADDRESS", "127.0.0.1:3000"),
15+
tokio_threads: ENV.fetch("TOKIO_THREADS", "1").to_i,
16+
debug: ENV.fetch("DEBUG", "false") == "true",
17+
recv_timeout: ENV.fetch("RECV_TIMEOUT", "30000").to_i
18+
}
19+
server.configure(config)
20+
21+
puts "Starting server with config: #{config}"
22+
23+
# Start the server
24+
server.start
25+
26+
puts "Server started"
27+
28+
# Create a worker thread to handle requests
29+
worker = Thread.new do
30+
server.run_worker do |request|
31+
buffer = String.new(capacity: 1024)
32+
request.fill_body(buffer)
33+
34+
# Create a response that echoes back request details
35+
response_data = {
36+
method: request.http_method,
37+
path: request.path,
38+
headers: request.headers,
39+
body: buffer
40+
}
41+
42+
HyperRuby::Response.new(
43+
200,
44+
{ "Content-Type" => "application/json" },
45+
JSON.pretty_generate(response_data)
46+
)
47+
end
48+
end
49+
50+
puts "Server running at #{config[:bind_address]}"
51+
puts "Press Ctrl+C to stop"
52+
53+
# Wait for Ctrl+C
54+
begin
55+
sleep
56+
rescue Interrupt
57+
puts "\nShutting down..."
58+
server.stop
59+
worker.join
60+
end

ext/hyper_ruby/Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ tokio-stream = { version = "0.1", features = ["net"] }
1717
crossbeam-channel = "0.5.14"
1818
rb-sys = "0.9.110"
1919
hyper = { version = "1.0", features = ["http1", "http2", "server"] }
20-
hyper-util = { version = "0.1", features = ["tokio", "server", "http1", "http2"] }
20+
hyper-util = { version = "0.1", features = ["tokio", "server", "server-auto", "http1", "http2"] }
2121
http-body-util = "0.1.2"
2222
jemallocator = { version = "0.5.4", features = ["disable_initial_exec_tls"] }
2323
futures = "0.3.31"
24+
h2 = "0.4"
25+
async-stream = "0.3.5"
26+
env_logger = "0.11"
27+
log = "0.4"

0 commit comments

Comments
 (0)