BLEST Ruby
The Ruby reference implementation of BLEST (Batch-able, Lightweight, Encrypted State Transfer), an improved communication protocol for web APIs which leverages JSON, supports request batching and selective returns, and provides a modern alternative to REST.
To learn more about BLEST, please refer to the white paper: https://jhunt.dev/BLEST%20White%20Paper.pdf
For a front-end implementation in React, please visit https://github.com/jhuntdev/blest-react
Features
- Built on JSON - Reduce parsing time and overhead
- Request Batching - Save bandwidth and reduce load times
- Compact Payloads - Save more bandwidth
- Selective Returns - Save even more bandwidth
- Single Endpoint - Reduce complexity and improve data privacy
- Fully Encrypted - Improve data privacy
Installation
Install BLEST Ruby from Rubygems.
gem install blest
Usage
Use the create_request_handler function to create a request handler suitable for use in an existing Python application. Use the create_http_server function to create a standalone HTTP server for your request handler.
create_request_handler
require 'webrick'
require 'json'
require 'blest'
# Create some middleware (optional)
auth_middleware = ->(params, context) {
if params[:name].present?
context[:user] = {
name: params[:name]
}
nil
else
raise RuntimeError, "Unauthorized"
end
}
# Create a route controller
greet_controller = ->(params, context) {
{
greeting: "Hi, #{context[:user][:name]}!"
}
}
# Create a router
router = {
greet: [auth_middleware, greet_controller]
}
# Create a request handler
handler = create_request_handler(router)
class HttpRequestHandler < WEBrick::HTTPServlet::AbstractServlet
def do_OPTIONS(request, response)
response.status = 200
response['Access-Control-Allow-Origin'] = '*'
response['Access-Control-Allow-Methods'] = 'POST, OPTIONS'
response['Access-Control-Allow-Headers'] = 'Content-Type'
end
def do_POST(request, response)
response['Content-Type'] = 'application/json'
response['Access-Control-Allow-Origin'] = '*'
# Parse JSON body
begin
payload = JSON.parse(request.body)
# Define the request context
context = {
headers: request.headers
}
# Use the request handler
result, error = handler.(payload, context)
# Do something with the result or error
if error
response_body = error.to_json
response.status = 500
response.body = response_body
elsif result
response_body = result.to_json
response.status = 200
response.body = response_body
else
response.status = 204
end
rescue JSON::ParserError
response.status = 400
response.body = { message: 'Invalid JSON' }.to_json
end
end
end
# Create WEBrick server
server = WEBrick::HTTPServer.new(Port: 8000)
# Mount custom request handler
server.mount('/', HttpRequestHandler)
trap('INT') { server.shutdown }
# Start the server
server.start
create_http_server
require 'blest'
# Create some middleware (optional)
auth_middleware = ->(params, context) {
if params[:name].present?
context[:user] = {
name: params[:name]
}
nil
else
raise RuntimeError, "Unauthorized"
end
}
# Create a route controller
greet_controller = ->(params, context) {
{
greeting: "Hi, #{context[:user][:name]}!"
}
}
# Create a router
router = {
greet: [auth_middleware, greet_controller]
}
# Create a request handler
handler = create_request_handler(router)
# Create the server
server = create_http_server(handler, { port: 8080 })
# Run the server
server.()
License
This project is licensed under the MIT License.