module Meeseeker

Constants

AGENT_ID
BLOCKS_PER_DAY
BLOCK_INTERVAL
DEFAULT_HIVE_FAILOVER_URLS
DEFAULT_HIVE_URL
DEFAULT_STEEM_FAILOVER_URLS
DEFAULT_STEEM_URL
HIVE_CHAIN_ID
HIVE_CHAIN_KEY_PREFIX
HIVE_ENGINE_CHAIN_KEY_PREFIX
HIVE_LEGACY_CHAIN_ID
LAST_BLOCK_NUM_KEY_SUFFIX
LAST_STEEM_ENGINE_BLOCK_NUM_KEY_SUFFIX
SHUFFLE_URL
STEEM_CHAIN_ID
STEEM_CHAIN_KEY_PREFIX
STEEM_ENGINE_CHAIN_KEY_PREFIX
VERSION
VIRTUAL_TRX_ID

Attributes

expire_keys[RW]
hive_engine_node_url[RW]
include_block_header[RW]
include_virtual[RW]
max_keys[RW]
node_url[RW]
publish_op_custom_id[RW]
redis[RW]
steem_engine_node_url[RW]
stream_mode[RW]

Public Class Methods

api_class(chain = default_chain_key_prefix) click to toggle source
# File lib/meeseeker.rb, line 117
def self.api_class(chain = default_chain_key_prefix)
  case chain.to_s
  when STEEM_CHAIN_KEY_PREFIX then Steem::Api
  when HIVE_CHAIN_KEY_PREFIX then Hive::Api
  else
    raise "Unknown chain: #{chain}"
  end
end
block_api_class(chain = default_chain_key_prefix) click to toggle source
# File lib/meeseeker.rb, line 135
def self.block_api_class(chain = default_chain_key_prefix)
  case chain.to_s
  when STEEM_CHAIN_KEY_PREFIX then Steem::BlockApi
  when HIVE_CHAIN_KEY_PREFIX then Hive::BlockApi
  else
    raise "Unknown chain: #{chain}"
  end
end
chain_key_prefix() click to toggle source
# File lib/meeseeker.rb, line 53
def self.chain_key_prefix
  @chain_key_prefix ||= {}
  url = default_url(HIVE_CHAIN_KEY_PREFIX)
  
  return @chain_key_prefix[url] if !!@chain_key_prefix[url]
  
  # Just use the Hive API for either chain, until we know which one we're
  # using.
  api = Hive::DatabaseApi.new(url: url)
  
  api.get_config do |config|
    @chain_key_prefix[node_url] = if !!config.HIVE_CHAIN_ID && config.HIVE_CHAIN_ID == HIVE_CHAIN_ID
      HIVE_CHAIN_KEY_PREFIX
    elsif !!config.HIVE_CHAIN_ID && config.HIVE_CHAIN_ID == HIVE_LEGACY_CHAIN_ID
      HIVE_CHAIN_KEY_PREFIX
    elsif !!config.STEEM_CHAIN_ID && config.STEEM_CHAIN_ID == STEEM_CHAIN_ID
      STEEM_CHAIN_KEY_PREFIX
    else
      config.keys.find{|k| k.end_with? '_CHAIN_ID'}.split('_').first.downcase.tap do |guess|
        warn "Guessing chain_key_prefix = '#{guess}' for unknown chain on: #{node_url}"
      end
    end
  end
end
condenser_api_class(chain = default_chain_key_prefix) click to toggle source
# File lib/meeseeker.rb, line 126
def self.condenser_api_class(chain = default_chain_key_prefix)
  case chain.to_s
  when STEEM_CHAIN_KEY_PREFIX then Steem::CondenserApi
  when HIVE_CHAIN_KEY_PREFIX then Hive::CondenserApi
  else
    raise "Unknown chain: #{chain}"
  end
end
database_api_class(chain = default_chain_key_prefix) click to toggle source
# File lib/meeseeker.rb, line 144
def self.database_api_class(chain = default_chain_key_prefix)
  case chain.to_s
  when STEEM_CHAIN_KEY_PREFIX then Steem::DatabaseApi
  when HIVE_CHAIN_KEY_PREFIX then Hive::DatabaseApi
  else
    raise "Unknown chain: #{chain}"
  end
end
default_url(chain = default_chain_key_prefix) click to toggle source
# File lib/meeseeker.rb, line 78
def self.default_url(chain = default_chain_key_prefix)
  ENV.fetch('MEESEEKER_NODE_URL') do
    case chain.to_s
    when STEEM_CHAIN_KEY_PREFIX then DEFAULT_STEEM_URL
    when HIVE_CHAIN_KEY_PREFIX then DEFAULT_HIVE_URL
    else
      raise "Unknown chain: #{chain}"
    end
  end
end
shuffle_node_url(chain = ENV.fetch('MEESEEKER_CHAIN_KEY_PREFIX', HIVE_CHAIN_KEY_PREFIX)) click to toggle source
# File lib/meeseeker.rb, line 108
def self.shuffle_node_url(chain = ENV.fetch('MEESEEKER_CHAIN_KEY_PREFIX', HIVE_CHAIN_KEY_PREFIX))
  chain = chain.to_s
  node_url = ENV.fetch('MEESEEKER_NODE_URL', default_url(ENV.fetch('MEESEEKER_CHAIN_KEY_PREFIX', chain)))
  return node_url unless node_url == SHUFFLE_URL
  
  @problem_node_urls = [] if rand(1..1000) == 13
  shuffle_node_url!(chain)
end
shuffle_node_url!(chain = ENV.fetch('MEESEEKER_CHAIN_KEY_PREFIX', HIVE_CHAIN_KEY_PREFIX)) click to toggle source
# File lib/meeseeker.rb, line 162
def self.shuffle_node_url!(chain = ENV.fetch('MEESEEKER_CHAIN_KEY_PREFIX', HIVE_CHAIN_KEY_PREFIX))
  chain = chain.to_s
  failover_urls = case chain
    when STEEM_CHAIN_KEY_PREFIX then DEFAULT_STEEM_FAILOVER_URLS - @problem_node_urls
    when HIVE_CHAIN_KEY_PREFIX then DEFAULT_HIVE_FAILOVER_URLS - @problem_node_urls
    else; []
  end
  url = failover_urls.sample
  api = api_class(chain).new(url: url)
  
  api.get_accounts(['fullnodeupdate']) do |accounts|
    fullnodeupdate = accounts.first
    metadata = (JSON[fullnodeupdate.json_metadata] rescue nil) || {}
    
    nodes = metadata.fetch('report', []).map do |report|
      next if chain == HIVE_CHAIN_KEY_PREFIX && !report[HIVE_CHAIN_KEY_PREFIX]
      next if chain != HIVE_CHAIN_KEY_PREFIX && !!report[HIVE_CHAIN_KEY_PREFIX]
      
      report['node']
    end.compact.uniq
    
    nodes -= @problem_node_urls
    
    if nodes.any?
      nodes.sample
    else
      @node_url = failover_urls.sample
    end
  end
rescue => e
  puts "#{url}: #{e}"
  
  @problem_node_urls << url
  failover_urls -= @problem_node_urls
  failover_urls.sample
end
stream_class(chain = default_chain_key_prefix) click to toggle source
# File lib/meeseeker.rb, line 153
def self.stream_class(chain = default_chain_key_prefix)
  case chain.to_s
  when STEEM_CHAIN_KEY_PREFIX then Steem::Stream
  when HIVE_CHAIN_KEY_PREFIX then Hive::Stream
  else
    raise "Unknown chain: #{chain}"
  end
end

Public Instance Methods

default_chain_key_prefix() click to toggle source
# File lib/meeseeker.rb, line 49
def default_chain_key_prefix
  ENV.fetch('MEESEEKER_CHAIN_KEY_PREFIX', chain_key_prefix)
end