Coffescript was so cool…
JavaScript Other
Switch branches/tags

Opal for Node.js


This project is currently slightly outdated, the current preferred way to use Opal with Node.js is to compile the app and use node to run the compilation result.

A nodejs file is now available directly in the stdlib and Node.js is also the default runner for the CLI (see opal --help for a list of alternative runners). An example of this can be found in the mspec_node rake task.

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.