node package manager
Painless code sharing. npm Orgs help your team discover, share, and reuse code. Create a free org »


Opal for Node.js

Build Status

Use Ruby on Node.js for REAL-WORLD rofl-SCALING

> Use Node.js FOR SPEED > > — [@RoflscaleTips](
> [@hipsterhacker]( I approve of your choices of roflscale technologies, particularly Node. Your roflmillions of users will appreciate it. > > — [@RoflscaleTips](
> mongodb should be ported to nodejs for improved scalability > > — [@RoflscaleTips](


Run with opal-node app.rb or run the repl: opal-node-irb


Install with NPM: npm install -g opal or via RVM: rvm install opal

Example (rack)

# app.rb 
require 'http/server'
HTTP::Server.start 3000 do
  [200, {'Content-Type' => 'text/plain'}, ["Hello World!\n"]]

This is the original Node.js example:

// the original nodejs example 
http = require('http')
var port = process.env.port || 1337;
http.createServer(function(req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello World\n');

Here's the (naïve) rack-like implementation of http/server.rb

# http/server.rb 
module HTTP
  `_http = require('http')`
  class Server < `_http.Server`
    alias_native :listen, :listen
    def self.start port&block
      server = new `function(request, response) {
        request.on('end', function(chunk) {
          var rackResponse = #{`request`, `response`) };
          response.writeHead(rackResponse[0], #{ `rackResponse[1]`.to_native });
          response.end( rackResponse[2].join(' ') );

Example 2 (express.js wrapper)

A simple Express.js wrapper example can be found in examples/express-wrapper.rb do
  get '/' do |req, res|
    res.send 200, 'hulla!'
end.listen 3000


Start a coffee watcher to keep opal.js in sync with

coffee -cwo lib/ lib/*.coffee

Running in development

NODE_PATH="$NODE_PATH:../lib/" node ./bin/opal-node
NODE_PATH="$NODE_PATH:../lib/" node ./bin/opal-node-irb


To keep the specs running while developing just install and use spectator that will compile to opal.js before every run of the spec.

$ gem install spectator
$ gem install notify # to get notification
$ spectator
--- Waiting for changes...


This project rocks and uses MIT-LICENSE.