More work on Ractor communication. Need to have a proper think about how to keep it DRY and KISS :)

This commit is contained in:
2026-04-22 23:12:30 -05:00
parent c8bb271d82
commit 0eb188f72e
8 changed files with 51 additions and 40 deletions

View File

@@ -4,6 +4,7 @@ source "https://gem.coop"
gem "base64" gem "base64"
gem "rexml" gem "rexml"
gem "logger" gem "logger"
gem "json"
# "game" library gem # "game" library gem
gem "cyberarm_engine" gem "cyberarm_engine"

View File

@@ -80,6 +80,7 @@ DEPENDENCIES
cyberarm_engine cyberarm_engine
digest-crc digest-crc
ircparser ircparser
json
logger logger
rexml rexml
rubyzip rubyzip

View File

@@ -15,23 +15,16 @@ module W3DHubLauncher
title "Initial Setup" title "Initial Setup"
caption "Please confirm launcher's default settings and make any desired tweaks.", font: FONT_REGULAR caption "Please confirm launcher's default settings and make any desired tweaks.", font: FONT_REGULAR
flow(width: 1.0, height: 40, margin_top: PADDING) do
tagline "Launcher data directory", height: 1.0, text_v_align: :center
edit_line format("%s/.local/share/W3D Hub", Dir.home), fill: true
button "Browse..."
end
inscription "Location where the launcher stores it's configuration files and cache interface data."
flow(width: 1.0, height: 40, margin_top: HALF_PADDING) do flow(width: 1.0, height: 40, margin_top: HALF_PADDING) do
tagline "Launcher package cache directory", height: 1.0, text_v_align: :center tagline "Launcher package cache directory", height: 1.0, text_v_align: :center
edit_line format("%s/.local/share/W3D Hub/package-cache", Dir.home), fill: true edit_line DEFAULT_PACKAGE_CACHE_PATH, fill: true
button "Browse..." button "Browse..."
end end
inscription "Location where the launcher will download application packages." inscription "Location where the launcher will download application packages."
flow(width: 1.0, height: 40, margin_top: HALF_PADDING) do flow(width: 1.0, height: 40, margin_top: HALF_PADDING) do
tagline "Application installation directory", height: 1.0, text_v_align: :center tagline "Application installation directory", height: 1.0, text_v_align: :center
edit_line format("%s/.local/share/W3D Hub/applications", Dir.home), fill: true edit_line DEFAULT_APPLICATIONS_PATH, fill: true
button "Browse..." button "Browse..."
end end
inscription "Location where the launcher will install new applications." inscription "Location where the launcher will install new applications."
@@ -53,8 +46,18 @@ module W3DHubLauncher
flow(width: 1.0, padding_top: PADDING) do flow(width: 1.0, padding_top: PADDING) do
flow(fill: true) flow(fill: true)
button "Accept" do button "Accept" do |btn|
btn.enabled = false
Worker::Api.update_settings({}) do |result|
if result.okay?
page(Page::Boot::StartUp) page(Page::Boot::StartUp)
else
btn.enabled = true
end
puts "NOW!"
end
end end
end end
end end

View File

@@ -4,8 +4,8 @@ module W3DHubLauncher
self.show_cursor = true self.show_cursor = true
self.caption = format("%s | v%s (%s)", NAME, VERSION, VERSION_NAME) # "Cyberarm's W3D Hub Linux Launcher | v2.0.0 alpha" self.caption = format("%s | v%s (%s)", NAME, VERSION, VERSION_NAME) # "Cyberarm's W3D Hub Linux Launcher | v2.0.0 alpha"
# push_state(States::Boot) push_state(States::Boot)
push_state(States::Interface) # push_state(States::Interface)
end end
def needs_redraw? def needs_redraw?

View File

@@ -6,6 +6,8 @@ module W3DHubLauncher
@threads = [] @threads = []
@requests = [] @requests = []
@settings = # Settings.new
# next available request_id to assign incoming requests # next available request_id to assign incoming requests
@request_id = 0 @request_id = 0
@@ -35,6 +37,13 @@ module W3DHubLauncher
response = Response.new(result.okay? ? Request::STATUS_COMPLETE : Request::STATUS_ERROR, query.request_id, result) response = Response.new(result.okay? ? Request::STATUS_COMPLETE : Request::STATUS_ERROR, query.request_id, result)
Ractor.main.send(response) Ractor.main.send(response)
end end
when Request::LAUNCHER_UPDATE_SETTINGS
result = CyberarmEngine::Result.new
FileUtils.mkdir_p(W3DHubLauncher::CONFIG_PATH) # FAILABLE!
File.write("#{W3DHubLauncher::CONFIG_PATH}/settings.json", query.data) # FAILABLE!
result.data = query.data
response = Response.new(result.okay? ? Request::STATUS_COMPLETE : Request::STATUS_ERROR, query.request_id, result)
Ractor.main.send(response)
else else
raise "UNKNOWN REQUEST" raise "UNKNOWN REQUEST"
end end

View File

@@ -3,76 +3,71 @@
module W3DHubLauncher module W3DHubLauncher
class Worker class Worker
class Api class Api
Request = Data.define(:coming_soon)
def initialize
@requests = []
end
# downloads requested resource, returns raw string # downloads requested resource, returns raw string
def fetch_url def self.fetch_url
end end
# downloads requested resource, periodically reporting progress until completion, returning path for file on disk # downloads requested resource, periodically reporting progress until completion, returning path for file on disk
def download_url def self.download_url
end end
# returns user account data # returns user account data
# #
# automatically handles signing in / refreshing token (DOES NOT remove account data if failed to refresh token due to network timeout) # automatically handles signing in / refreshing token (DOES NOT remove account data if failed to refresh token due to network timeout)
def account def self.account
end end
# returns launcher settings # returns launcher settings
def settings def self.settings
end end
# write updated launcher settings # write updated launcher settings
def update_settings def self.update_settings(settings, &block)
Worker::Request.new(Request::LAUNCHER_UPDATE_SETTINGS, settings.to_json, &block)
end end
# returns list of available applications # returns list of available applications
# #
# if updated list is requested, return cached version immediately and then the updated list later. # if updated list is requested, return cached version immediately and then the updated list later.
def applications def self.applications
end end
# returns current list of servers as reported from GSH / cache # returns current list of servers as reported from GSH / cache
def servers def self.servers
end end
# returns news for application # returns news for application
def news def self.news
end end
# request installation of application # request installation of application
# #
# periodically reports progress until completion # periodically reports progress until completion
def install_application def self.install_application
end end
# request update of application # request update of application
# #
# periodically reports progress until completion # periodically reports progress until completion
def update_application def self.update_application
end end
# request repair of application # request repair of application
# #
# periodically reports progress until completion # periodically reports progress until completion
def repair_application def self.repair_application
end end
# request relocation of application # request relocation of application
# #
# periodically reports progress until completion # periodically reports progress until completion
def move_application def self.move_application
end end
# request removal of application # request removal of application
# #
# periodically reports progress until completion # periodically reports progress until completion
def uninstall_application def self.uninstall_application
end end
end end
end end

View File

@@ -6,6 +6,8 @@ module W3DHubLauncher
FETCH_URL = 0 FETCH_URL = 0
DOWNLOAD_URL = 1 DOWNLOAD_URL = 1
W3DHUB_API_CALL = 10 W3DHUB_API_CALL = 10
LAUNCHER_SETTINGS = 1000
LAUNCHER_UPDATE_SETTINGS = 1001
STATUS_ERROR = -1 # request has failed STATUS_ERROR = -1 # request has failed
STATUS_PENDING = 0 # request has not yet started STATUS_PENDING = 0 # request has not yet started
@@ -53,9 +55,8 @@ module W3DHubLauncher
pp [event, data] pp [event, data]
case event case event
when STATUS_COMPLETE when STATUS_ERROR, STATUS_COMPLETE
Request.requests.delete(self) @callback&.call(data)
when STATUS_ERROR
Request.requests.delete(self) Request.requests.delete(self)
end end
end end

View File

@@ -28,6 +28,7 @@ require_relative "lib/pages/boot/terms"
require_relative "lib/pages/boot/initial_setup" require_relative "lib/pages/boot/initial_setup"
require_relative "lib/pages/boot/start_up" require_relative "lib/pages/boot/start_up"
require_relative "lib/dialogs/about" require_relative "lib/dialogs/about"
require_relative "lib/dialogs/downloads"
require_relative "lib/states/boot" require_relative "lib/states/boot"
require_relative "lib/states/interface" require_relative "lib/states/interface"
require_relative "lib/window" require_relative "lib/window"
@@ -63,11 +64,11 @@ Thread.new do
end end
end end
10.times do # 10.times do
W3DHubLauncher::Worker::Request.new(W3DHubLauncher::Worker::Request::W3DHUB_API_CALL, { call: :fetch_applications }) do |result| # W3DHubLauncher::Worker::Request.new(W3DHubLauncher::Worker::Request::W3DHUB_API_CALL, { call: :fetch_applications }) do |result|
pp result # pp result
end # end
end # end
window = W3DHubLauncher::Window.new(width: 1280, height: 800, resizable: true) window = W3DHubLauncher::Window.new(width: 1280, height: 800, resizable: true)
# window = W3DHubLauncher::Window.new(width: 1920, height: 1080, resizable: true) # window = W3DHubLauncher::Window.new(width: 1920, height: 1080, resizable: true)