125 lines
3.5 KiB
GDScript
125 lines
3.5 KiB
GDScript
extends Node
|
|
|
|
signal request_started(request: NetworkRequest)
|
|
signal request_completed(request: NetworkRequest)
|
|
signal request_failed(request: NetworkRequest)
|
|
|
|
var active_requests: Dictionary = {} # request_id -> NetworkRequest
|
|
var all_requests: Array[NetworkRequest] = []
|
|
var dev_tools_network_tab: NetworkTab = null
|
|
|
|
func register_dev_tools_network_tab(network_tab: NetworkTab):
|
|
dev_tools_network_tab = network_tab
|
|
|
|
func start_request(url: String, method: String = "GET", is_from_lua: bool = false) -> NetworkRequest:
|
|
var request = NetworkRequest.new(url, method)
|
|
request.is_from_lua = is_from_lua
|
|
|
|
active_requests[request.id] = request
|
|
all_requests.append(request)
|
|
|
|
# Notify dev tools
|
|
if dev_tools_network_tab:
|
|
dev_tools_network_tab.add_network_request(request)
|
|
|
|
request_started.emit(request)
|
|
return request
|
|
|
|
func complete_request(request_id: String, status_code: int, status_text: String, headers: Dictionary, body: String, body_bytes: PackedByteArray = []):
|
|
var request = active_requests.get(request_id)
|
|
if not request:
|
|
return
|
|
|
|
request.set_response(status_code, status_text, headers, body, body_bytes)
|
|
active_requests.erase(request_id)
|
|
|
|
# Update dev tools UI
|
|
if dev_tools_network_tab:
|
|
dev_tools_network_tab.update_request_item(request)
|
|
|
|
if request.status == NetworkRequest.RequestStatus.SUCCESS:
|
|
request_completed.emit(request)
|
|
else:
|
|
request_failed.emit(request)
|
|
|
|
func fail_request(request_id: String, error_message: String):
|
|
var request = active_requests.get(request_id)
|
|
if not request:
|
|
return
|
|
|
|
request.set_error(error_message)
|
|
active_requests.erase(request_id)
|
|
|
|
# Update dev tools UI
|
|
if dev_tools_network_tab:
|
|
dev_tools_network_tab.update_request_item(request)
|
|
|
|
request_failed.emit(request)
|
|
|
|
func set_request_headers(request_id: String, headers: Dictionary):
|
|
var request = active_requests.get(request_id)
|
|
if request:
|
|
request.request_headers = headers
|
|
|
|
func set_request_body(request_id: String, body: String):
|
|
var request = active_requests.get(request_id)
|
|
if request:
|
|
request.request_body = body
|
|
|
|
func get_all_requests() -> Array[NetworkRequest]:
|
|
return all_requests
|
|
|
|
func clear_all_requests():
|
|
active_requests.clear()
|
|
all_requests.clear()
|
|
|
|
if dev_tools_network_tab:
|
|
dev_tools_network_tab.clear_all_requests()
|
|
|
|
func clear_all_requests_except(preserve_request_id: String):
|
|
# Remove from active_requests but preserve specific request
|
|
var preserved_active = null
|
|
if active_requests.has(preserve_request_id):
|
|
preserved_active = active_requests[preserve_request_id]
|
|
|
|
active_requests.clear()
|
|
if preserved_active:
|
|
active_requests[preserve_request_id] = preserved_active
|
|
|
|
# Remove from all_requests but preserve specific request
|
|
var preserved_request = null
|
|
for request in all_requests:
|
|
if request.id == preserve_request_id:
|
|
preserved_request = request
|
|
break
|
|
|
|
all_requests.clear()
|
|
if preserved_request:
|
|
all_requests.append(preserved_request)
|
|
|
|
if dev_tools_network_tab:
|
|
dev_tools_network_tab.clear_all_requests_except(preserve_request_id)
|
|
|
|
func get_request_stats() -> Dictionary:
|
|
var total_requests = all_requests.size()
|
|
var total_size = 0
|
|
var successful_requests = 0
|
|
var failed_requests = 0
|
|
var pending_requests = active_requests.size()
|
|
|
|
for request in all_requests:
|
|
total_size += request.size
|
|
match request.status:
|
|
NetworkRequest.RequestStatus.SUCCESS:
|
|
successful_requests += 1
|
|
NetworkRequest.RequestStatus.ERROR:
|
|
failed_requests += 1
|
|
|
|
return {
|
|
"total": total_requests,
|
|
"successful": successful_requests,
|
|
"failed": failed_requests,
|
|
"pending": pending_requests,
|
|
"total_size": total_size
|
|
}
|