lib/ably/models/message_encoders/base.rb in ably-0.8.15 vs lib/ably/models/message_encoders/base.rb in ably-1.0.0

- old
+ new

@@ -5,101 +5,122 @@ # # For example, if a message body is detected as JSON, it is encoded as a String and the encoding attribute # of the message is defined as 'json'. # Encrypted messages are encoded & decoded by the Cipher encoder. # -module Ably::Models::MessageEncoders - extend Ably::Modules::Conversions +module Ably + module Models + module MessageEncoders + extend Ably::Modules::Conversions - # Base interface for an Ably Encoder - # - class Base - attr_reader :client + # Base interface for an Ably Encoder + # + class Base + attr_reader :client, :options - def initialize(client) - @client = client - end + def initialize(client, options = {}) + @client = client + @options = options + end - # #encode is called once before a message is sent to Ably - # - # It is the responsibility of the #encode method to detect the intended encoding and modify the :data & :encoding properties of the message object. - # - # @param [Hash] message the message as a Hash object received directly from Ably. - # The message contains properties :name, :data, :encoding, :timestamp, and optionally :id and :client_id. - # This #encode method should modify the message Hash if any encoding action is to be taken - # @param [Hash] channel_options the options used to initialize the channel that this message was received on - # - # @return [void] - def encode(message, channel_options) - raise "Not yet implemented" - end + # #encode is called once before a message is sent to Ably + # + # It is the responsibility of the #encode method to detect the intended encoding and modify the :data & :encoding properties of the message object. + # + # @param [Hash] message the message as a Hash object received directly from Ably. + # The message contains properties :name, :data, :encoding, :timestamp, and optionally :id and :client_id. + # This #encode method should modify the message Hash if any encoding action is to be taken + # @param [Hash] channel_options the options used to initialize the channel that this message was received on + # + # @return [void] + def encode(message, channel_options) + raise "Not yet implemented" + end - # #decode is called once for every encoding step - # i.e. if message encoding arrives with 'utf-8/cipher+aes-128-cbc/base64' - # the decoder will call #decode once for each encoding part such as 'base64', then 'cipher+aes-128-cbc', and finally 'utf-8' - # - # It is the responsibility of the #decode method to detect the current encoding part and modify the :data & :encoding properties of the message object. - # - # @param [Hash] message the message as a Hash object received directly from Ably. - # The message contains properties :name, :data, :encoding, :timestamp, and optionally :id and :client_id. - # This #encode method should modify the message Hash if any decoding action is to be taken - # @param [Hash] channel_options the options used to initialize the channel that this message was received on - # - # @return [void] - def decode(message, channel_options) - raise "Not yet implemented" - end + # #decode is called once for every encoding step + # i.e. if message encoding arrives with 'utf-8/cipher+aes-128-cbc/base64' + # the decoder will call #decode once for each encoding part such as 'base64', then 'cipher+aes-128-cbc', and finally 'utf-8' + # + # It is the responsibility of the #decode method to detect the current encoding part and modify the :data & :encoding properties of the message object. + # + # @param [Hash] message the message as a Hash object received directly from Ably. + # The message contains properties :name, :data, :encoding, :timestamp, and optionally :id and :client_id. + # This #encode method should modify the message Hash if any decoding action is to be taken + # @param [Hash] channel_options the options used to initialize the channel that this message was received on + # + # @return [void] + def decode(message, channel_options) + raise "Not yet implemented" + end - # Add encoding to the message Hash. - # Ensures that encoding delimeter is used where required i.e utf-8/cipher+aes-128-cbc/base64 - # - # @param [Hash] message the message as a Hash object received directly from Ably. - # @param [String] encoding encoding to add to the current encoding - # - # @return [void] - def add_encoding_to_message(encoding, message) - message[:encoding] = [message[:encoding], encoding].compact.join('/') - end + # Add encoding to the message Hash. + # Ensures that encoding delimeter is used where required i.e utf-8/cipher+aes-128-cbc/base64 + # + # @param [Hash] message the message as a Hash object received directly from Ably. + # @param [String] encoding encoding to add to the current encoding + # + # @return [void] + def add_encoding_to_message(encoding, message) + message[:encoding] = [message[:encoding], encoding].compact.join('/') + end - # Returns the right most encoding form a meessage encoding, and nil if none exists - # i.e. current_encoding_part('utf-8/cipher+aes-128-cbc/base64') => 'base64' - # - # @return [String,nil] - def current_encoding_part(message) - if message[:encoding] - message[:encoding].split('/')[-1] + # Returns the right most encoding form a meessage encoding, and nil if none exists + # i.e. current_encoding_part('utf-8/cipher+aes-128-cbc/base64') => 'base64' + # + # @return [String,nil] + def current_encoding_part(message) + if message[:encoding] + message[:encoding].split('/')[-1] + end + end + + # Strip the current encoding part within the message Hash. + # + # For example, calling this method on an :encoding value of 'utf-8/cipher+aes-128-cbc/base64' would update the attribute + # :encoding to 'utf-8/cipher+aes-128-cbc' + # + # @param [Hash] message the message as a Hash object received directly from Ably. + # + # @return [void] + def strip_current_encoding_part(message) + raise "Cannot strip encoding when there is no encoding for this message" unless message[:encoding] + message[:encoding] = message[:encoding].split('/')[0...-1].join('/') + message[:encoding] = nil if message[:encoding].empty? + end + + # True of the message data payload is empty + # + # @param [Hash] message the message as a Hash object received directly from Ably. + # + # @return [Boolean] + def is_empty?(message) + message[:data].nil? || message[:data] == '' + end end - end - # Strip the current encoding part within the message Hash. - # - # For example, calling this method on an :encoding value of 'utf-8/cipher+aes-128-cbc/base64' would update the attribute - # :encoding to 'utf-8/cipher+aes-128-cbc' - # - # @param [Hash] message the message as a Hash object received directly from Ably. - # - # @return [void] - def strip_current_encoding_part(message) - raise "Cannot strip encoding when there is no encoding for this message" unless message[:encoding] - message[:encoding] = message[:encoding].split('/')[0...-1].join('/') - message[:encoding] = nil if message[:encoding].empty? - end + # @api private + def self.register_default_encoders(client, options = {}) + binary_protocol = !!options[:binary_protocol] + client.register_encoder Ably::Models::MessageEncoders::Utf8 + client.register_encoder Ably::Models::MessageEncoders::Json + client.register_encoder Ably::Models::MessageEncoders::Cipher + client.register_encoder Ably::Models::MessageEncoders::Base64, binary_protocol: binary_protocol + end - # True of the message data payload is empty - # - # @param [Hash] message the message as a Hash object received directly from Ably. - # - # @return [Boolean] - def is_empty?(message) - message[:data].nil? || message[:data] == '' - end - end + # @api private + def self.encoder_from(encoder, options) + encoder_klass = if encoder.kind_of?(String) + encoder.split('::').inject(Kernel) do |base, klass_name| + base.public_send(:const_get, klass_name) + end + else + encoder + end - def self.register_default_encoders(client) - client.register_encoder Ably::Models::MessageEncoders::Utf8 - client.register_encoder Ably::Models::MessageEncoders::Json - client.register_encoder Ably::Models::MessageEncoders::Cipher - client.register_encoder Ably::Models::MessageEncoders::Base64 + raise "Encoder must inherit from `Ably::Models::MessageEncoders::Base`" unless encoder_klass.ancestors.include?(Ably::Models::MessageEncoders::Base) + encoder_klass.new(self, options) + end + end end end require 'ably/models/message_encoders/base64' require 'ably/models/message_encoders/cipher'