mirror of
https://github.com/cyberarm/w3d_hub_linux_launcher.git
synced 2026-09-19 23:03:53 +00:00
Initial functioning work to get IPC working via UNIX sockets since ractors are still not a viable option :sad:
This commit is contained in:
101
lib/worker.rb
101
lib/worker.rb
@@ -3,16 +3,28 @@ module W3DHubLauncher
|
||||
Response = Data.define(:status, :request_id, :data)
|
||||
|
||||
def initialize
|
||||
end
|
||||
|
||||
def connect
|
||||
puts :connect
|
||||
|
||||
@socket = UNIXSocket.new(IPC_PATH)
|
||||
end
|
||||
|
||||
def connected?
|
||||
@socket && !@socket.closed?
|
||||
end
|
||||
|
||||
def listen
|
||||
init_server
|
||||
end
|
||||
|
||||
def init_server
|
||||
@threads = []
|
||||
@requests = []
|
||||
|
||||
@settings = # Settings.new
|
||||
@settings = 0# Settings.new
|
||||
|
||||
# next available request_id to assign incoming requests
|
||||
@request_id = 0
|
||||
|
||||
# listen for requests from frontend
|
||||
listener = Thread.new { listen }
|
||||
# connect to and monitor GSH web service
|
||||
@threads << Thread.new { game_server_hub_websocket }
|
||||
# connect to and monitor Backend web service
|
||||
@@ -20,20 +32,26 @@ module W3DHubLauncher
|
||||
|
||||
@w3dhub_api = W3DHubLauncher::W3DHubApi.new
|
||||
|
||||
listener.join
|
||||
end
|
||||
Async do |task|
|
||||
UNIXServer.open(IPC_PATH) do |server|
|
||||
while(socket = server.accept)
|
||||
task.async do
|
||||
data = socket.gets
|
||||
json = JSON.parse(data)
|
||||
query = Request::Query.new(type: json["type"].to_sym, request_id: json["request_id"], data: json["data"])
|
||||
|
||||
def listen
|
||||
loop do
|
||||
query = Ractor.receive
|
||||
pp query
|
||||
pp [:server_incoming, data, query]
|
||||
|
||||
if respond_to?(query.type)
|
||||
Async do
|
||||
send(query.type, query)
|
||||
if respond_to?(query.type)
|
||||
response = send(query.type, query)
|
||||
pp [:server_to_client, response]
|
||||
payload = { status: response.status, request_id: response.request_id, data: response.data.data }.to_json
|
||||
socket.puts(payload)
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
raise "UNKNOWN REQUEST: #{query}"
|
||||
ensure # manually delete "socket"
|
||||
File.delete(IPC_PATH)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -44,6 +62,45 @@ module W3DHubLauncher
|
||||
def backend_websocket
|
||||
end
|
||||
|
||||
# Send request to server
|
||||
def request(query)
|
||||
pp [:client_request, query]
|
||||
payload = { type: query.type, request_id: query.request_id, data: query.data }.to_json
|
||||
|
||||
if respond_to?(query.type)
|
||||
@socket.puts(payload)
|
||||
else
|
||||
raise "UNKNOWN REQUEST: #{query}"
|
||||
end
|
||||
end
|
||||
|
||||
def service
|
||||
data = @socket.read_nonblock(1_048_576) # 1 MB
|
||||
pp [:CLIENT, data]
|
||||
json = JSON.parse(data)
|
||||
response = Response.new(status: json["status"], request_id: json["request_id"], data: json["data"])
|
||||
request = W3DHubLauncher::Worker::Request.requests.find { |r| r.request_id == response.request_id }
|
||||
|
||||
pp [json, response, request]
|
||||
return unless request
|
||||
|
||||
CyberarmEngine::Window.instance&.add_to_queue(proc {
|
||||
request.handle_event(
|
||||
response.status,
|
||||
CyberarmEngine::Result.new(data: response.data, error: response.status.negative? ? true : nil)
|
||||
)
|
||||
})
|
||||
|
||||
rescue Errno::EWOULDBLOCK
|
||||
end
|
||||
|
||||
def deliver_response(result, query)
|
||||
response = Response.new(result.okay? ? Request::STATUS_COMPLETE : Request::STATUS_ERROR, query.request_id, result)
|
||||
pp response
|
||||
|
||||
response
|
||||
end
|
||||
|
||||
#
|
||||
# ------------ query / request handlers ------------
|
||||
#
|
||||
@@ -54,11 +111,9 @@ module W3DHubLauncher
|
||||
end
|
||||
|
||||
def w3dhub_api_call(query)
|
||||
result = @w3dhub_api.send(query.data[:call], *(query.data[:arguments] || []))
|
||||
pp result
|
||||
response = Response.new(result.okay? ? Request::STATUS_COMPLETE : Request::STATUS_ERROR, query.request_id, result)
|
||||
result = @w3dhub_api.send(query.data["call"], *(query.data["arguments"] || []))
|
||||
|
||||
Ractor.main.send(response)
|
||||
deliver_response(result, query)
|
||||
end
|
||||
|
||||
def update_settings(query)
|
||||
@@ -67,9 +122,7 @@ module W3DHubLauncher
|
||||
FileUtils.mkdir_p(W3DHubLauncher::CONFIG_PATH) # FIXME: FAILABLE!
|
||||
File.write("#{W3DHubLauncher::CONFIG_PATH}/settings.json", query.data) # FIXME: FAILABLE!
|
||||
result.data = query.data
|
||||
response = Response.new(result.okay? ? Request::STATUS_COMPLETE : Request::STATUS_ERROR, query.request_id, result)
|
||||
|
||||
Ractor.main.send(response)
|
||||
deliver_response(result, query)
|
||||
end
|
||||
|
||||
def install_application(query)
|
||||
|
||||
Reference in New Issue
Block a user