module GraphQL::Subscriptions::Serialize

Serialization helpers for passing subscription data around. @api private

Constants

GLOBALID_KEY
SYMBOL_KEY
SYMBOL_KEYS_KEY

Private Class Methods

dump_value(obj) click to toggle source

@param obj [Object] Some subscription-related data to dump @return [Object] The object that converted Global::Identification

# File lib/graphql/subscriptions/serialize.rb, line 82
def dump_value(obj)
  if obj.is_a?(Array)
    obj.map{|item| dump_value(item)}
  elsif obj.is_a?(Hash)
    symbol_keys = nil
    dumped_h = {}
    obj.each do |k, v|
      dumped_h[k.to_s] = dump_value(v)
      if k.is_a?(Symbol)
        symbol_keys ||= Set.new
        symbol_keys << k.to_s
      end
    end
    if symbol_keys
      dumped_h[SYMBOL_KEYS_KEY] = symbol_keys.to_a
    end
    dumped_h
  elsif obj.is_a?(Symbol)
    { SYMBOL_KEY => obj.to_s }
  elsif obj.respond_to?(:to_gid_param)
    {GLOBALID_KEY => obj.to_gid_param}
  else
    obj
  end
end
load_value(value) click to toggle source

@param value [Object] A parsed JSON object @return [Object] An object that load Global::Identification recursive

# File lib/graphql/subscriptions/serialize.rb, line 53
def load_value(value)
  if value.is_a?(Array)
    value.map{|item| load_value(item)}
  elsif value.is_a?(Hash)
    if value.size == 1 && value.key?(GLOBALID_KEY)
      GlobalID::Locator.locate(value[GLOBALID_KEY])
    elsif value.size == 1 && value.key?(SYMBOL_KEY)
      value[SYMBOL_KEY].to_sym
    else
      loaded_h = {}
      sym_keys = value.fetch(SYMBOL_KEYS_KEY, [])
      value.each do |k, v|
        if k == SYMBOL_KEYS_KEY
          next
        end
        if sym_keys.include?(k)
          k = k.to_sym
        end
        loaded_h[k] = load_value(v)
      end
      loaded_h
    end
  else
    value
  end
end

Public Instance Methods

dump(obj) click to toggle source

@param obj [Object] Some subscription-related data to dump @return [String] The stringified object

# File lib/graphql/subscriptions/serialize.rb, line 23
def dump(obj)
  JSON.generate(dump_value(obj), quirks_mode: true)
end
dump_recursive(obj) click to toggle source

This is for turning objects into subscription scopes. It's a one-way transformation, can't reload this :'( @param obj [Object] @return [String]

# File lib/graphql/subscriptions/serialize.rb, line 31
def dump_recursive(obj)
  case
  when obj.is_a?(Array)
    obj.map { |i| dump_recursive(i) }.join(':')
  when obj.is_a?(Hash)
    obj.map { |k, v| "#{dump_recursive(k)}:#{dump_recursive(v)}" }.join(":")
  when obj.is_a?(GraphQL::Schema::InputObject)
    dump_recursive(obj.to_h)
  when obj.respond_to?(:to_gid_param)
    obj.to_gid_param
  when obj.respond_to?(:to_param)
    obj.to_param
  else
    obj.to_s
  end
end
load(str) click to toggle source

@param str [String] A serialized object from {.dump} @return [Object] An object equivalent to the one passed to {.dump}

# File lib/graphql/subscriptions/serialize.rb, line 16
def load(str)
  parsed_obj = JSON.parse(str)
  load_value(parsed_obj)
end