* adding partially implemented json support to gateway to resume work on other comp (yes, master branch abuse)

This commit is contained in:
Seth Call 2012-09-02 21:45:18 -05:00
parent b65ccd6060
commit 5b44da8ef2
3 changed files with 64 additions and 3 deletions

View File

@ -3,11 +3,11 @@ require "jam_ruby"
require "jam_websockets/version"
require "jam_websockets/session_error"
require "jam_websockets/client_context"
require "jam_websockets/message"
require "jam_websockets/router"
require "jam_websockets/server"
include JamRuby
module JamWebsockets
# Your code goes here...
end

View File

@ -0,0 +1,45 @@
require 'json'
require 'protocol_buffers'
require 'protocol_buffers/compiler'
class ProtocolBuffers::Message
def to_json(*args)
hash = {'json_class' => self.class.name}
# simpler version, includes all fields in the output, using the default
# values if unset. also includes empty repeated fields as empty arrays.
# fields.each do |tag, field|
# hash[field.name] = value_for_tag(field.tag)
# end
# prettier output, only includes non-empty repeated fields and set fields
fields.each do |tag, field|
if field.repeated?
value = value_for_tag(field.tag)
hash[field.name] = value unless value.empty?
else
hash[field.name] = value_for_tag(field.tag) if value_for_tag?(field.tag)
end
end
hash.to_json(*args)
end
def self.json_create(hash)
hash.delete('json_class')
# initialize takes a hash of { attribute_name => value } so you can just
# pass the hash into the constructor. but we're supposed to be showing off
# reflection, here. plus, that raises an exception if there is an unknown
# key in the hash.
# new(hash)
message = new
fields.each do |tag, field|
if value = hash[field.name.to_s]
message.set_value_for_tag(field.tag, value)
end
end
message
end
end

View File

@ -2,6 +2,7 @@ require 'pry'
require 'set'
require 'hot_bunnies'
require 'thread'
require 'json'
import java.util.concurrent.Executors
@ -227,8 +228,14 @@ module JamWebsockets
@pending_clients.add(client)
end
is_json = false
client.onopen {
#binding.pry
@log.debug "client connected #{client}"
p client.request["query"]
is_json = !!client.request["query"]["json"]
}
client.onclose {
@ -254,9 +261,18 @@ module JamWebsockets
# TODO: set a max message size before we put it through PB?
# TODO: rate limit?
begin
pb_msg = Jampb::ClientMessage.parse(msg.to_s)
self.route(pb_msg, client)
if is_json
#{"type":100, "target":"server", "Login" : {"username":"hi"}}
parse = JSON.parse(msg)
p parse
pb_msg = Jampb::ClientMessage.json_create(parse)
p pb_msg
else
pb_msg = Jampb::ClientMessage.parse(msg.to_s)
self.route(pb_msg, client)
end
rescue SessionError => e
@log.info "ending client session deliberately due to malformed client behavior. reason=#{e}"
begin