diff --git a/lib/jam_websockets.rb b/lib/jam_websockets.rb index b09be5a42..a2e24ee9e 100644 --- a/lib/jam_websockets.rb +++ b/lib/jam_websockets.rb @@ -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 diff --git a/lib/jam_websockets/message.rb b/lib/jam_websockets/message.rb new file mode 100644 index 000000000..edfb31482 --- /dev/null +++ b/lib/jam_websockets/message.rb @@ -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 diff --git a/lib/jam_websockets/router.rb b/lib/jam_websockets/router.rb index 3eefb729e..4f2512231 100644 --- a/lib/jam_websockets/router.rb +++ b/lib/jam_websockets/router.rb @@ -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