require File.expand_path('../frame', __FILE__) module AMQP module Server def post_init @buf = '' @channels = {} @started = false end def receive_data data @buf << data unless @started if @buf.size >= 8 if @buf.slice!(0,8) == "AMQP\001\001\b\000" send Protocol::Connection::Start.new( 8, 0, { :information => 'Licensed under the Ruby license. See http://github.com/tmm1/amqp', :copyright => 'Copyright (c) 2008-2009 Aman Gupta', :platform => 'Ruby/EventMachine', :version => '0.6.1', :product => 'SquirrelMQ' }, 'PLAIN AMQPLAIN', 'en_US' ) else close_connection return end @started = true else return end end while frame = Frame.parse(@buf) process_frame frame end end def process_frame frame channel = frame.channel case method = frame.payload when Protocol::Connection::StartOk @user = method.response[:LOGIN] @pass = method.response[:PASSWORD] send Protocol::Connection::Tune.new(0, 131072, 0) when Protocol::Connection::TuneOk # mnnk when Protocol::Connection::Open @vhost = method.virtual_host send Protocol::Connection::OpenOk.new('localhost') when Protocol::Channel::Open @channels[channel] = [] send Protocol::Channel::OpenOk.new, :channel => channel when Protocol::Access::Request send Protocol::Access::RequestOk.new(101) end end def send data, opts = {} channel = opts[:channel] ||= 0 data = data.to_frame(channel) unless data.is_a? Frame data.channel = channel log 'send', data send_data data.to_s end def self.start host = 'localhost', port = 5672 EM.start_server host, port, self end private def log *args require 'pp' pp args puts end end end if __FILE__ == $0 require 'rubygems' require 'eventmachine' EM.run{ AMQP::Server.start } end