Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # PURE RUBY NODEJS SERVER!
- # server.js
- var ruby = require('ruby');
- require('ruby-protect');
- require('ruby-http');
- ruby.protect_node(function() {
- require('./hello_ruby');
- });
- # ruby-protect.js
- var ruby = require('ruby');
- var $ = ruby.__proto__;
- $.protect_node = function(code) {
- return function() {
- var args = arguments;
- return ruby.protect(function() {
- return code.apply(this, args);
- }, function(e) {
- console.log("Exception in Ruby code: " + this.funcall(e, 'to_s'));
- });
- };
- }
- # ruby-http.js
- var ruby = require('ruby');
- var http = require('http');
- require('ruby-protect');
- var NodeJS = ruby.define_module('NodeJS');
- var Server = ruby.define_class_under(NodeJS, 'Server');
- var Request = ruby.define_class_under(NodeJS, 'Request');
- var Response = ruby.define_class_under(NodeJS, 'Response');
- ruby.define_method(Server, 'initialize', 0, function(self) {
- var ruby = this, block = this.block_proc();
- self.internal = http.createServer(this.protect_node(function(req, resp) {
- var ruby_req = ruby.funcall(Request, 'new'),
- ruby_resp = ruby.funcall(Response, 'new');
- ruby.funcall(ruby_req, 'p');
- ruby_req.internal = req;
- ruby_resp.internal = resp;
- ruby.funcall(block, 'call', ruby_req, ruby_resp);
- }));
- return self;
- });
- ruby.define_method(Server, 'listen', -1, function(self, args) {
- this.check_args(args, 1, 1);
- var hostname = args[1];
- if(hostname) hostname = this.to_str(args[1]).value;
- self.internal.listen(this.to_int(args[0]), hostname);
- return self;
- });
- ruby.define_method(Server, 'close', 0, function(self) {
- self.internal.close();
- return self;
- });
- ruby.define_method(Response, 'writeHead', 2, function(self, status, headers) {
- status = this.to_int(status);
- headers = this.check_convert_type(headers, this.c.Hash, 'to_hash');
- var node_headers = {};
- var iterator = function(self, name, value) {
- name = this.to_str(name).value;
- value = this.to_str(value).value;
- node_headers[name] = value;
- return ruby.builtin.Qnil;
- };
- this.funcall2(headers, 'each', [], this.lambda(iterator, 2));
- self.internal.writeHead(status, node_headers);
- return self;
- });
- ruby.define_method(Response, 'write', 1, function(self, data) {
- self.internal.write(this.to_str(data).value);
- return self;
- });
- ruby.define_method(Response, 'end', 0, function(self) {
- self.internal.end();
- return self;
- });
- module.exports = {
- NodeJS: {
- Response: Response,
- },
- };
- # hello_ruby.rb
- server = NodeJS::Server.new do |req, resp|
- resp.writeHead 200, { 'Content-Type' => 'text/plain', 'X-Header' => 'test' }
- resp.write "Hello from ruby"
- resp.end
- end
- server.listen(1337, '127.0.0.1')
- puts "Listening at localhost:1337..."
- # Compilation
- coldruby-static -Enodejs -Rnode_modules/ruby.js
- coldruby-static -Enodejs -shello_ruby.js hello_ruby.rb
- node server.js
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement