-
Notifications
You must be signed in to change notification settings - Fork 0
/
utilities.rb
98 lines (76 loc) · 2.11 KB
/
utilities.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
require "colorize"
require "faraday"
require_relative "constants"
module Utilities
####################
# String Utilities #
####################
def self.is_prefixed_with_number(string, prefix, number)
return string[0..(number - 1)].split("").all? { |c| c == prefix }
end
def self.is_prefixed_with_zeroes(string, number)
return is_prefixed_with_number(string, "0", number)
end
def self.fixed_length(string, length)
if !string
return "-" * (length - 1)
end
(string.length > length) ? string.slice(0..length - 4) + "..." : string.ljust(length, " ")
end
########################
# Networking Utilities #
########################
def self.get_peers(nodes:)
nodes.select(&:is_peer)
end
def self.check_for_eviction(nodes:)
peers = Utilities::get_peers(nodes: nodes)
if peers.count > Constants::MAX_PEERS_COUNT
peer_to_remove = peers.sample
peer_to_remove.is_peer = false
end
end
def self.send_message_to_peers(message:, peers:)
peers.each do |peer|
Utilities::log "Sending message #{message.uuid} to port #{peer.port}".light_blue
Utilities::make_request(
port: peer.port,
path: "gossip",
body: message.to_hash,
post: true
)
end
end
def self.make_request(port:, path:, body: {}, post: false)
url = "http://localhost:#{port}/#{path}"
begin
if post
response = Faraday.new(url: url).post do |f|
f.headers['Content-Type'] = 'application/json'
f.body = body.to_json.force_encoding(Encoding::UTF_8)
end
return response.body
else
Faraday.get(url).body
end
rescue Errno::ECONNREFUSED => e
puts e
end
end
#####################
# Logging Utilities #
#####################
def self.log(string)
puts "[#{Time.now}] " + string.to_s
end
##################
# Math Utilities #
##################
def self.is_power_of_two(number:)
number.to_s(2).count("1") == 1
end
def self.next_highest_power_of_two(number:)
return 1 if number == 0
return 2 ** Math.log2(number).ceil
end
end