Files
w3dhub_linux_launcher/lib/network_manager.rb

73 lines
1.5 KiB
Ruby

class W3DHub
# all http(s) requests for API calls and downloading images run through here
class NetworkManager
NetworkEvent = Data.define(:context, :result)
Request = Struct.new(:active, :context, :callback)
Context = Data.define(
:request_id,
:method,
:url,
:headers,
:body,
:bearer_token
)
def initialize
@requests = []
@running = true
Thread.new do
http_client = HttpClient.new
Sync do
while @running
request = @requests.find { |r| !r.active }
# goto sleep for an second if there is no work to be doing
unless request
sleep 1
next
end
request.active = true
Async do |task|
assigned_request = request
result = http_client.handle(task, assigned_request)
@requests.delete(assigned_request)
Store.main_thread_queue << -> { assigned_request.callback.call(result) }
end
end
end
end
end
def request(method, url, headers, body, bearer_token, &block)
request_id = SecureRandom.hex
request = Request.new(
false,
Context.new(
request_id,
method,
url,
headers,
body,
bearer_token
),
block
)
@requests << request
request_id
end
def busy?
@requests.any?(&:active)
end
end
end