Rename all crate directories, package names, binary names, proto package/module paths, ALPN strings, env var prefixes, config filenames, mDNS service names, and plugin ABI symbols from quicproquo/qpq to quicprochat/qpc.
QuicProQuo Ruby SDK
Ruby FFI gem wrapping libquicproquo_ffi for the quicproquo E2E encrypted messenger.
Prerequisites
- Ruby 3.1+
libquicproquo_ffibuilt for the target platform
Installation
gem install quicproquo
Or add to your Gemfile:
gem "quicproquo"
Building the Native Library
cargo build --release -p quicproquo-ffi
Set QPQ_LIB_PATH if the library is not in the default search path.
Usage
require "quicproquo"
# Block form (auto-disconnect)
QuicProQuo::Client.open("127.0.0.1:5001", ca_cert: "ca.pem") do |client|
client.login("alice", "secret")
client.send("bob", "hello from Ruby!")
messages = client.receive(timeout_ms: 5000)
messages.each { |msg| puts msg }
end
# Manual lifecycle
client = QuicProQuo::Client.new("127.0.0.1:5001", ca_cert: "ca.pem")
client.login("alice", "secret")
client.send("bob", "hello")
client.disconnect
API
| Method | Description |
|---|---|
Client.new(server, ca_cert:, server_name:) |
Connect to server |
Client.open(server, **opts) { |c| ... } |
Connect with auto-disconnect |
client.login(username, password) |
OPAQUE authentication |
client.send(recipient, message) |
Send message by username |
client.receive(timeout_ms: 5000) |
Receive pending messages |
client.disconnect |
Disconnect |
client.connected? |
Connection status |
Error Handling
begin
client.login("alice", "wrong")
rescue QuicProQuo::AuthError => e
puts "Auth failed: #{e.message}"
rescue QuicProQuo::TimeoutError => e
puts "Timeout: #{e.message}"
rescue QuicProQuo::Error => e
puts "Error: #{e.message}"
end
Structure
lib/quicproquo/client.rb-- High-level clientlib/quicproquo/ffi_bindings.rb-- FFI function declarationslib/quicproquo/errors.rb-- Exception classesexamples/demo.rb-- Usage example