diff --git a/lib/skyfall/jetstream/account_message.rb b/lib/skyfall/jetstream/account_message.rb index 90891c5..0b98c5a 100644 --- a/lib/skyfall/jetstream/account_message.rb +++ b/lib/skyfall/jetstream/account_message.rb @@ -22,7 +22,7 @@ module Skyfall # @raise [DecodeError] if the message doesn't include required data # def initialize(json) - raise DecodeError.new("Missing event details (account)") if json['account'].nil? || json['account']['active'].nil? + raise DecodeError.new("Missing event details (account)") if !json['account'].is_a?(Hash) || json['account']['active'].nil? super end diff --git a/lib/skyfall/jetstream/commit_message.rb b/lib/skyfall/jetstream/commit_message.rb index d7e6e3c..42a9b3e 100644 --- a/lib/skyfall/jetstream/commit_message.rb +++ b/lib/skyfall/jetstream/commit_message.rb @@ -20,7 +20,7 @@ module Skyfall # @raise [DecodeError] if the message doesn't include required data # def initialize(json) - raise DecodeError.new("Missing event details (commit)") if json['commit'].nil? + raise DecodeError.new("Missing event details (commit)") unless json['commit'].is_a?(Hash) %w(collection rkey operation rev).each { |f| raise DecodeError.new("Missing event details (#{f})") if json['commit'][f].nil? } diff --git a/lib/skyfall/jetstream/identity_message.rb b/lib/skyfall/jetstream/identity_message.rb index 8417e5c..6768482 100644 --- a/lib/skyfall/jetstream/identity_message.rb +++ b/lib/skyfall/jetstream/identity_message.rb @@ -24,7 +24,7 @@ module Skyfall # @raise [DecodeError] if the message doesn't include required data # def initialize(json) - raise DecodeError.new("Missing event details (identity)") if json['identity'].nil? + raise DecodeError.new("Missing event details (identity)") unless json['identity'].is_a?(Hash) super end diff --git a/lib/skyfall/jetstream/message.rb b/lib/skyfall/jetstream/message.rb index 7b6b094..e601126 100644 --- a/lib/skyfall/jetstream/message.rb +++ b/lib/skyfall/jetstream/message.rb @@ -3,6 +3,7 @@ require_relative '../errors' require_relative '../jetstream' +require 'json' require 'time' module Skyfall @@ -76,6 +77,7 @@ module Skyfall # def self.new(data) json = JSON.parse(data) + raise DecodeError, "Expected a JSON object" unless json.is_a?(Hash) message_class = case json['kind'] when 'account' then Jetstream::AccountMessage @@ -92,6 +94,8 @@ module Skyfall message = message_class.allocate message.send(:initialize, json) message + rescue JSON::ParserError => e + raise DecodeError, "Invalid JSON message: #{e.message}" end #