A web framework for Crystal

Crazy Simple

require "raze"

get "/hello" do "hello, world" end


Simply Fast

From a MacBook Pro using wrk
Express JS

A Modular, Middleware-Centric Design

Composable "stacks" of middlewares allow for greater modularity. Raze enables and encourages putting more logic inside reusable middlewares rather than putting everything in the route block. Heck, you might not even need a block at all.

# these security middlewares will run before all
# other routes that start with "/api"
get "/api*", [DDoS_Blocker.new, UserAuthenticator.new]

plan_purchase_middlewares = { PlanValidator.new, PlanPurchaser.new, ConfirmationEmailer.new("plan"), } get "/api/purchase/plan/:plan_id", *plan_purchase_middlewares do |ctx| "purchased plan: #{ctx.params["plan_id"]}" end

item_purchase_middlewares = { ItemValidator.new, ItemPurchaser.new, ConfirmationEmailer.new("item"), } get "/api/purchase/item/:item_id", *item_purchase_middlewares do |ctx| "purchased item: #{ctx.params["item_id"]}" end

Notice how the ConfirmationEmailer constructor

expects an arg, which allows us to reuse the same

middleware for purchasing plans or items

NOTE: The middlewares in the above example are fake, custom middlewares and are not built into Raze

Websocket Channels

Create a websocket channel and broadcast messages to everybody in the channel (a group of sockets).

# allow clients to join a room
ws "/room/:room_id" do |ws, ctx|
  room_id = ctx.params["room_id"]
  user_id = generate_user_id_here

get channel by some identifier (creates channel if not exists)

channel = Raze.ws_channel(room_id)

Add socket connection to channel

channel.add ws

broadcast to channel that this user joined

channel.broadcast( {"user_id" => user_id, "msg" => "user joined"}.to_json )

ws.on_message do |msg|

# broadcast a json message to each websocket in the channel
  {"user_id" => user_id, "msg" => msg}.to_json


ws.on_close do

# remove socket from channel
channel.remove ws
# broadcast to any remaining users that this user has left
  {"user_id" => user_id, "msg" => "user disconnected"}.to_json

end end



Gamma Fi