refactor: harden client runtime and exports
This commit is contained in:
@@ -16,11 +16,8 @@ signal cafe_companion_agent_registered(data: Dictionary)
|
||||
signal cafe_companion_employment_resigned(data: Dictionary)
|
||||
signal cafe_companion_models_ready(data: Dictionary)
|
||||
|
||||
const NetworkConfig = preload("res://_Core/utils/NetworkConfig.gd")
|
||||
|
||||
const REQUEST_TIMEOUT: float = 24.0
|
||||
|
||||
var _activeRequests: Array[HTTPRequest] = []
|
||||
var _cachedProducts: Array = []
|
||||
var _cachedServicePoints: Array = []
|
||||
var _accountGeneration: int = -1
|
||||
@@ -31,9 +28,6 @@ func _ready() -> void:
|
||||
if authManager != null and authManager.has_signal("auth_state_changed"):
|
||||
authManager.auth_state_changed.connect(_on_auth_state_changed)
|
||||
|
||||
func _exit_tree() -> void:
|
||||
_cancel_active_requests()
|
||||
|
||||
func get_chat_time_products(forceRefresh: bool = false) -> void:
|
||||
if not forceRefresh and not _cachedProducts.is_empty():
|
||||
var cachedData := {"products": _cachedProducts}
|
||||
@@ -114,56 +108,15 @@ func get_employment_models(protocol: String, baseUrl: String, token: String) ->
|
||||
}, _on_employment_models_response)
|
||||
|
||||
func _request_json(endpoint: String, payload: Dictionary, callback: Callable, method: int = HTTPClient.METHOD_POST) -> void:
|
||||
var request := HTTPRequest.new()
|
||||
request.timeout = REQUEST_TIMEOUT
|
||||
add_child(request)
|
||||
_activeRequests.append(request)
|
||||
var requestGeneration := _current_account_generation()
|
||||
|
||||
request.request_completed.connect(func(result: int, responseCode: int, _headers: PackedStringArray, body: PackedByteArray) -> void:
|
||||
_activeRequests.erase(request)
|
||||
request.queue_free()
|
||||
if requestGeneration != _current_account_generation():
|
||||
var request_generation := _current_account_generation()
|
||||
ApiClient.request_json(endpoint, payload, func(success: bool, response: Dictionary, error_info: Dictionary) -> void:
|
||||
if request_generation != _current_account_generation():
|
||||
return
|
||||
_handle_json_response(result, responseCode, body, callback)
|
||||
)
|
||||
|
||||
var headers := PackedStringArray(["Content-Type: application/json"])
|
||||
var token := _get_auth_token()
|
||||
if not token.is_empty():
|
||||
headers.append("Authorization: Bearer %s" % token)
|
||||
|
||||
var body := "" if method == HTTPClient.METHOD_GET else JSON.stringify(payload)
|
||||
var err := request.request("%s%s" % [NetworkConfig.get_api_base_url(), endpoint], headers, method, body)
|
||||
if err != OK:
|
||||
_activeRequests.erase(request)
|
||||
request.queue_free()
|
||||
if requestGeneration == _current_account_generation():
|
||||
_emit_chat_error("咖啡店陪聊请求发送失败: %s" % error_string(err))
|
||||
|
||||
func _handle_json_response(result: int, responseCode: int, body: PackedByteArray, callback: Callable) -> void:
|
||||
if result != HTTPRequest.RESULT_SUCCESS:
|
||||
_emit_chat_error("咖啡店陪聊网络请求失败: %s" % _http_result_to_string(result))
|
||||
return
|
||||
|
||||
var bodyText := body.get_string_from_utf8()
|
||||
var json := JSON.new()
|
||||
if json.parse(bodyText) != OK:
|
||||
_emit_chat_error("咖啡店陪聊响应解析失败")
|
||||
return
|
||||
|
||||
var payloadVariant: Variant = json.data
|
||||
if not (payloadVariant is Dictionary):
|
||||
_emit_chat_error("咖啡店陪聊响应格式错误")
|
||||
return
|
||||
|
||||
var response: Dictionary = payloadVariant
|
||||
var success := responseCode >= 200 and responseCode < 300 and bool(response.get("success", true))
|
||||
if not success:
|
||||
_emit_chat_error(str(response.get("message", "咖啡店陪聊请求失败")))
|
||||
return
|
||||
|
||||
callback.call(response)
|
||||
if not success:
|
||||
_emit_chat_error(str(error_info.get("message", "咖啡店陪聊请求失败")))
|
||||
return
|
||||
callback.call(response)
|
||||
, method, true, REQUEST_TIMEOUT)
|
||||
|
||||
func _on_chat_time_products_response(response: Dictionary) -> void:
|
||||
var data := _response_data(response)
|
||||
@@ -257,30 +210,5 @@ func _on_auth_state_changed(_isAuthenticated: bool, _user: Dictionary) -> void:
|
||||
if currentGeneration == _accountGeneration:
|
||||
return
|
||||
_accountGeneration = currentGeneration
|
||||
_cancel_active_requests()
|
||||
_cachedProducts.clear()
|
||||
_cachedServicePoints.clear()
|
||||
|
||||
func _cancel_active_requests() -> void:
|
||||
for request in _activeRequests.duplicate():
|
||||
if is_instance_valid(request):
|
||||
request.cancel_request()
|
||||
request.queue_free()
|
||||
_activeRequests.clear()
|
||||
|
||||
func _http_result_to_string(result: int) -> String:
|
||||
match result:
|
||||
HTTPRequest.RESULT_SUCCESS:
|
||||
return "SUCCESS"
|
||||
HTTPRequest.RESULT_TIMEOUT:
|
||||
return "TIMEOUT"
|
||||
HTTPRequest.RESULT_CANT_CONNECT:
|
||||
return "CANT_CONNECT"
|
||||
HTTPRequest.RESULT_CANT_RESOLVE:
|
||||
return "CANT_RESOLVE"
|
||||
HTTPRequest.RESULT_CONNECTION_ERROR:
|
||||
return "CONNECTION_ERROR"
|
||||
HTTPRequest.RESULT_TLS_HANDSHAKE_ERROR:
|
||||
return "TLS_HANDSHAKE_ERROR"
|
||||
_:
|
||||
return "HTTP_RESULT_%d" % result
|
||||
|
||||
Reference in New Issue
Block a user