class GoogleWebTranslate::ServerList

Constants

MAX_TTL

Public Class Methods

next_server(rate_limit = nil) click to toggle source
# File lib/google_web_translate/server_list.rb, line 14
def next_server(rate_limit = nil)
  @mutex ||= Mutex.new
  @mutex.synchronize do
    @counter ||= 0
    @counter += 1

    list = servers.sort_by { |i| i.counter || 0 }
    server = list[0]
    server.counter = @counter
    sleep(rate_limit_delay(server, rate_limit))
    server.last_used_at = Time.now
    server
  end
end
servers() click to toggle source
# File lib/google_web_translate/server_list.rb, line 9
def servers
  update_servers if @servers.nil?
  @servers.dup
end

Private Class Methods

data_dir() click to toggle source
# File lib/google_web_translate/server_list.rb, line 67
def data_dir
  File.join(__dir__, '..', '..', 'data')
end
hostnames() click to toggle source
# File lib/google_web_translate/server_list.rb, line 79
def hostnames
  names = []
  lines = File.read(url_list_path).split(/[\r\n]+/)
  lines.each do |host|
    next unless host && !host.empty?
    names << "translate.#{host}"
  end
  names
end
initial_data() click to toggle source
# File lib/google_web_translate/server_list.rb, line 98
def initial_data
  hostnames.collect do |host|
    server = Server.new
    server.host = host
    server
  end
end
rate_limit_delay(server, rate_limit) click to toggle source
# File lib/google_web_translate/server_list.rb, line 33
def rate_limit_delay(server, rate_limit)
  return 0 unless rate_limit && server.last_used_at
  delay = rate_limit - (Time.now - server.last_used_at)
  delay < 0 || ENV['TEST'] ? 0 : delay
end
read_server_data() click to toggle source
# File lib/google_web_translate/server_list.rb, line 106
def read_server_data
  return initial_data unless File.exist?(server_data_path)
  data = JSON.parse(File.read(server_data_path))
  server_list = []
  data.each do |entry|
    attributes = SERVER_ATTRIBUTES.collect { |i| entry[i.to_s] }
    server = Server.new(*attributes)
    next unless server.host && !server.host.empty?
    server.counter = 0
    server_list << server
  end
  server_list
end
resolve_ip(host) click to toggle source
# File lib/google_web_translate/server_list.rb, line 130
def resolve_ip(host)
  resolver.getaddress(host).to_s
end
resolver() click to toggle source
# File lib/google_web_translate/server_list.rb, line 124
def resolver
  resolver = Resolv::DNS.new
  resolver.timeouts = 5
  resolver
end
save_server_data(servers) click to toggle source
# File lib/google_web_translate/server_list.rb, line 120
def save_server_data(servers)
  File.write(server_data_path, servers.to_json)
end
server_data_path() click to toggle source
# File lib/google_web_translate/server_list.rb, line 71
def server_data_path
  File.join(data_dir, 'server_data.txt')
end
unique_servers(list) click to toggle source
# File lib/google_web_translate/server_list.rb, line 89
def unique_servers(list)
  server_by_ip = {}
  list.each do |server|
    next unless server.available
    server_by_ip[server.ip] = server
  end
  server_by_ip.values
end
update_server(server) click to toggle source
# File lib/google_web_translate/server_list.rb, line 54
def update_server(server)
  now = Time.now.to_i
  if server.resolved_at.nil? ||
     now - server.resolved_at > MAX_TTL #|| !server.available
    server.resolved_at = now
    server.ip = resolve_ip(server.host)
  end
  server.available = true
rescue Resolv::ResolvError
  # puts "server #{server.host} is unavailable: #{e}"
  server.available = false
end
update_servers() click to toggle source
# File lib/google_web_translate/server_list.rb, line 39
def update_servers
  server_list = read_server_data
  pool = Concurrent::CachedThreadPool.new
  # puts "updating #{server_list.length} servers"
  server_list.each do |server|
    pool.post { update_server(server) }
  end

  pool.shutdown
  pool.wait_for_termination
  @servers = unique_servers(server_list)
  # puts "#{@servers.length} unique servers found"
  save_server_data(server_list)
end
url_list_path() click to toggle source
# File lib/google_web_translate/server_list.rb, line 75
def url_list_path
  File.join(data_dir, 'urls.txt')
end