diff --git a/lib/api.rb b/lib/api.rb index eda836f..9a86f2f 100644 --- a/lib/api.rb +++ b/lib/api.rb @@ -126,15 +126,12 @@ class W3DHub # /apis/launcher/1/get-package-details # client requests package details: data={"packages":[{"category":"games","name":"apb.ico","subcategory":"apb","version":""}]} - def self.package_details(packages) - response = Excon.post( - "#{ENDPOINT}/apis/launcher/1/get-package-details", - headers: DEFAULT_HEADERS.merge({"Content-Type": "application/x-www-form-urlencoded"}), - body: "data=#{JSON.dump({ packages: packages })}" - ) + def self.package_details(internet, packages) + body = "data=#{JSON.dump({ packages: packages })}" + response = internet.post("#{ENDPOINT}/apis/launcher/1/get-package-details", FORM_ENCODED_HEADERS, body) - if response.status == 200 - hash = JSON.parse(response.body, symbolize_names: true) + if response.success? + hash = JSON.parse(response.read, symbolize_names: true) packages = hash[:packages].map { |pkg| Package.new(pkg) } return packages.first if packages.size == 1 return packages @@ -147,8 +144,8 @@ class W3DHub # client requests package: data={"category":"games","name":"ECW_Asteroids.zip","subcategory":"ecw","version":"1.0.0.0"} # # server responds with download bytes, probably supports chunked download and resume - def self.package(package, &block) - Cache.fetch_package(package, block) + def self.package(internet, package, &block) + Cache.fetch_package(internet, package, block) end #! === Server List API === !# diff --git a/lib/application_manager/pool.rb b/lib/application_manager/pool.rb index ab4c59f..98b92b7 100644 --- a/lib/application_manager/pool.rb +++ b/lib/application_manager/pool.rb @@ -29,7 +29,7 @@ class W3DHub @die = false @job = nil - Thread.new do + Async do until (@die) @job.process if @job && @job.waiting? @job = nil diff --git a/lib/application_manager/task.rb b/lib/application_manager/task.rb index 8859b1b..38d20ee 100644 --- a/lib/application_manager/task.rb +++ b/lib/application_manager/task.rb @@ -48,7 +48,7 @@ class W3DHub def start @task_state = :running - Thread.new do + Async do status = execute_task # Force free some bytes @@ -221,7 +221,8 @@ class W3DHub } end - package_details = Api.package_details(hashes) + internet = Async::HTTP::Internet.instance + package_details = Api.package_details(internet, hashes) if package_details @packages = [package_details].flatten @@ -427,6 +428,8 @@ class W3DHub while (chunk = f.read(32_000_000)) digest.update(chunk) + current = Async::Task.current? + current&.yield end f.close @@ -448,7 +451,9 @@ class W3DHub def fetch_manifest(category, subcategory, name, version, &block) # Check for and integrity of local manifest - package = Api.package_details([{ category: category, subcategory: subcategory, name: name, version: version }]) + internet = Async::HTTP::Internet.instance + + package = Api.package_details(internet, [{ category: category, subcategory: subcategory, name: name, version: version }]) if File.exist?(Cache.package_path(category, subcategory, name, version)) verified = verify_package(package) @@ -465,7 +470,9 @@ class W3DHub def package_fetch(package, &block) puts "Downloading: #{package.category}:#{package.subcategory}:#{package.name}-#{package.version}" - Api.package(package) do |chunk, remaining_bytes, total_bytes| + internet = Async::HTTP::Internet.instance + + Api.package(internet, package) do |chunk, remaining_bytes, total_bytes| # Store progress somewhere # Kernel.puts "#{name}-#{version}: #{(remaining_bytes.to_f / total_bytes).round}%" diff --git a/lib/cache.rb b/lib/cache.rb index a6d5423..4541ca9 100644 --- a/lib/cache.rb +++ b/lib/cache.rb @@ -44,7 +44,7 @@ class W3DHub end # Download a W3D Hub package - def self.fetch_package(package, block) + def self.fetch_package(internet, package, block) path = package_path(package.category, package.subcategory, package.name, package.version) headers = { "Content-Type": "application/x-www-form-urlencoded" } start_from_bytes = package.custom_partially_valid_at_bytes