Advertisement
whitequark

pure ruby nodejs server

May 7th, 2011
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. # PURE RUBY NODEJS SERVER!
  2.  
  3. # server.js
  4.  
  5. var ruby = require('ruby');
  6. require('ruby-protect');
  7. require('ruby-http');
  8.  
  9. ruby.protect_node(function() {
  10. require('./hello_ruby');
  11. });
  12.  
  13. # ruby-protect.js
  14.  
  15. var ruby = require('ruby');
  16.  
  17. var $ = ruby.__proto__;
  18.  
  19. $.protect_node = function(code) {
  20. return function() {
  21. var args = arguments;
  22. return ruby.protect(function() {
  23. return code.apply(this, args);
  24. }, function(e) {
  25. console.log("Exception in Ruby code: " + this.funcall(e, 'to_s'));
  26. });
  27. };
  28. }
  29.  
  30. # ruby-http.js
  31.  
  32. var ruby = require('ruby');
  33. var http = require('http');
  34. require('ruby-protect');
  35.  
  36. var NodeJS = ruby.define_module('NodeJS');
  37.  
  38. var Server = ruby.define_class_under(NodeJS, 'Server');
  39. var Request = ruby.define_class_under(NodeJS, 'Request');
  40. var Response = ruby.define_class_under(NodeJS, 'Response');
  41.  
  42. ruby.define_method(Server, 'initialize', 0, function(self) {
  43. var ruby = this, block = this.block_proc();
  44.  
  45. self.internal = http.createServer(this.protect_node(function(req, resp) {
  46. var ruby_req = ruby.funcall(Request, 'new'),
  47. ruby_resp = ruby.funcall(Response, 'new');
  48. ruby.funcall(ruby_req, 'p');
  49. ruby_req.internal = req;
  50. ruby_resp.internal = resp;
  51.  
  52. ruby.funcall(block, 'call', ruby_req, ruby_resp);
  53. }));
  54.  
  55. return self;
  56. });
  57.  
  58. ruby.define_method(Server, 'listen', -1, function(self, args) {
  59. this.check_args(args, 1, 1);
  60. var hostname = args[1];
  61. if(hostname) hostname = this.to_str(args[1]).value;
  62.  
  63. self.internal.listen(this.to_int(args[0]), hostname);
  64.  
  65. return self;
  66. });
  67.  
  68. ruby.define_method(Server, 'close', 0, function(self) {
  69. self.internal.close();
  70.  
  71. return self;
  72. });
  73.  
  74. ruby.define_method(Response, 'writeHead', 2, function(self, status, headers) {
  75. status = this.to_int(status);
  76. headers = this.check_convert_type(headers, this.c.Hash, 'to_hash');
  77.  
  78. var node_headers = {};
  79. var iterator = function(self, name, value) {
  80. name = this.to_str(name).value;
  81. value = this.to_str(value).value;
  82.  
  83. node_headers[name] = value;
  84.  
  85. return ruby.builtin.Qnil;
  86. };
  87. this.funcall2(headers, 'each', [], this.lambda(iterator, 2));
  88.  
  89. self.internal.writeHead(status, node_headers);
  90.  
  91. return self;
  92. });
  93.  
  94. ruby.define_method(Response, 'write', 1, function(self, data) {
  95. self.internal.write(this.to_str(data).value);
  96.  
  97. return self;
  98. });
  99.  
  100. ruby.define_method(Response, 'end', 0, function(self) {
  101. self.internal.end();
  102.  
  103. return self;
  104. });
  105.  
  106. module.exports = {
  107. NodeJS: {
  108. Response: Response,
  109. },
  110. };
  111.  
  112. # hello_ruby.rb
  113.  
  114. server = NodeJS::Server.new do |req, resp|
  115. resp.writeHead 200, { 'Content-Type' => 'text/plain', 'X-Header' => 'test' }
  116. resp.write "Hello from ruby"
  117. resp.end
  118. end
  119.  
  120. server.listen(1337, '127.0.0.1')
  121.  
  122. puts "Listening at localhost:1337..."
  123.  
  124. # Compilation
  125.  
  126. coldruby-static -Enodejs -Rnode_modules/ruby.js
  127. coldruby-static -Enodejs -shello_ruby.js hello_ruby.rb
  128. node server.js
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement