fix(multimodal): reconnect websocket with fresh auth
This commit is contained in:
@@ -547,11 +547,15 @@ static void control_plane_multimodal_event_bridge(control_plane_multimodal_event
|
|||||||
case CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_DISCONNECTED:
|
case CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_DISCONNECTED:
|
||||||
control_plane_clear_cloud_chouqian_pending("transport disconnected");
|
control_plane_clear_cloud_chouqian_pending("transport disconnected");
|
||||||
control_plane_multimodal_stop_uplink();
|
control_plane_multimodal_stop_uplink();
|
||||||
|
ESP_LOGI(TAG, "Schedule fresh-auth reconnect after transport disconnect");
|
||||||
|
(void)control_plane_schedule_websocket_wait_task();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_ERROR:
|
case CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_ERROR:
|
||||||
control_plane_clear_cloud_chouqian_pending("transport error");
|
control_plane_clear_cloud_chouqian_pending("transport error");
|
||||||
control_plane_multimodal_stop_uplink();
|
control_plane_multimodal_stop_uplink();
|
||||||
|
ESP_LOGI(TAG, "Schedule fresh-auth reconnect after transport error");
|
||||||
|
(void)control_plane_schedule_websocket_wait_task();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CONTROL_PLANE_MULTIMODAL_EVENT_TASK_FAILED:
|
case CONTROL_PLANE_MULTIMODAL_EVENT_TASK_FAILED:
|
||||||
|
|||||||
@@ -462,10 +462,15 @@ void control_plane_multimodal_mark_transport_unavailable(
|
|||||||
control_plane_multimodal_stop_uplink();
|
control_plane_multimodal_stop_uplink();
|
||||||
|
|
||||||
bool close_transport = reason == CONTROL_PLANE_TRANSPORT_LOSS_PROTOCOL_ERROR ||
|
bool close_transport = reason == CONTROL_PLANE_TRANSPORT_LOSS_PROTOCOL_ERROR ||
|
||||||
|
reason == CONTROL_PLANE_TRANSPORT_LOSS_WS_ERROR ||
|
||||||
|
reason == CONTROL_PLANE_TRANSPORT_LOSS_WS_DISCONNECTED ||
|
||||||
reason == CONTROL_PLANE_TRANSPORT_LOSS_SEND_TEXT_FAILURE ||
|
reason == CONTROL_PLANE_TRANSPORT_LOSS_SEND_TEXT_FAILURE ||
|
||||||
reason == CONTROL_PLANE_TRANSPORT_LOSS_LISTENING_TIMEOUT ||
|
reason == CONTROL_PLANE_TRANSPORT_LOSS_LISTENING_TIMEOUT ||
|
||||||
reason == CONTROL_PLANE_TRANSPORT_LOSS_NO_RESPONSE_TIMEOUT;
|
reason == CONTROL_PLANE_TRANSPORT_LOSS_NO_RESPONSE_TIMEOUT;
|
||||||
if (close_transport) {
|
if (close_transport) {
|
||||||
|
ESP_LOGI(TAG,
|
||||||
|
"Retire unavailable transport: reason=%s; next start requires fresh auth",
|
||||||
|
transport_loss_reason_name(reason));
|
||||||
esp_err_t stop_err = domain_runtime_multimodal_transport_stop(0);
|
esp_err_t stop_err = domain_runtime_multimodal_transport_stop(0);
|
||||||
if (stop_err != ESP_OK) {
|
if (stop_err != ESP_OK) {
|
||||||
ESP_LOGW(TAG,
|
ESP_LOGW(TAG,
|
||||||
|
|||||||
@@ -1547,7 +1547,12 @@ static void control_plane_wifi_state_task(void *arg)
|
|||||||
if (ws_start_due &&
|
if (ws_start_due &&
|
||||||
!control_plane_get_ptt_active() &&
|
!control_plane_get_ptt_active() &&
|
||||||
!control_plane_multimodal_is_connected()) {
|
!control_plane_multimodal_is_connected()) {
|
||||||
control_plane_try_start_multimodal_from_state_machine(&last_ws_start_attempt_tick, false);
|
bool ws_started = control_plane_try_start_multimodal_from_state_machine(
|
||||||
|
&last_ws_start_attempt_tick,
|
||||||
|
false);
|
||||||
|
if (!ws_started) {
|
||||||
|
(void)control_plane_schedule_websocket_wait_task();
|
||||||
|
}
|
||||||
now_tick = xTaskGetTickCount();
|
now_tick = xTaskGetTickCount();
|
||||||
}
|
}
|
||||||
control_plane_drive_ptt_state_machine(&last_ws_start_attempt_tick);
|
control_plane_drive_ptt_state_machine(&last_ws_start_attempt_tick);
|
||||||
|
|||||||
@@ -754,8 +754,8 @@ static esp_err_t start_websocket_client_with_fallback(void)
|
|||||||
.headers = s_headers,
|
.headers = s_headers,
|
||||||
.network_timeout_ms = CONFIG_MULTIMODAL_CONNECT_TIMEOUT_MS,
|
.network_timeout_ms = CONFIG_MULTIMODAL_CONNECT_TIMEOUT_MS,
|
||||||
.reconnect_timeout_ms = CONFIG_MULTIMODAL_RECONNECT_DELAY_MS,
|
.reconnect_timeout_ms = CONFIG_MULTIMODAL_RECONNECT_DELAY_MS,
|
||||||
.disable_auto_reconnect = false,
|
.disable_auto_reconnect = true,
|
||||||
.enable_close_reconnect = true,
|
.enable_close_reconnect = false,
|
||||||
.task_stack = candidates[i],
|
.task_stack = candidates[i],
|
||||||
.task_prio = CONFIG_MULTIMODAL_WEBSOCKET_TASK_PRIORITY,
|
.task_prio = CONFIG_MULTIMODAL_WEBSOCKET_TASK_PRIORITY,
|
||||||
.task_name = "multimodal_ws",
|
.task_name = "multimodal_ws",
|
||||||
|
|||||||
@@ -83,6 +83,20 @@ if ! rg -n '#include "esp_afe_aec.h"' components/platform/src/multimodal/audio_p
|
|||||||
! rg -n 'afe_aec_process\(' components/platform/src/multimodal/audio_pipeline/audio_pipeline_runtime_impl.c >/dev/null 2>&1; then
|
! rg -n 'afe_aec_process\(' components/platform/src/multimodal/audio_pipeline/audio_pipeline_runtime_impl.c >/dev/null 2>&1; then
|
||||||
fail "Platform must own the synchronous ESP-SR AEC implementation"
|
fail "Platform must own the synchronous ESP-SR AEC implementation"
|
||||||
fi
|
fi
|
||||||
|
if rg -n '\.disable_auto_reconnect = false|\.enable_close_reconnect = true' \
|
||||||
|
components/platform/src/multimodal/transport_ws/transport_ws_workers_impl.c >/dev/null 2>&1 ||
|
||||||
|
! rg -n '\.disable_auto_reconnect = true' \
|
||||||
|
components/platform/src/multimodal/transport_ws/transport_ws_workers_impl.c >/dev/null 2>&1 ||
|
||||||
|
! rg -n 'reason == CONTROL_PLANE_TRANSPORT_LOSS_WS_ERROR' \
|
||||||
|
components/control_plane/src/multimodal/control_plane_multimodal_session_service.c >/dev/null 2>&1 ||
|
||||||
|
! rg -n 'reason == CONTROL_PLANE_TRANSPORT_LOSS_WS_DISCONNECTED' \
|
||||||
|
components/control_plane/src/multimodal/control_plane_multimodal_session_service.c >/dev/null 2>&1 ||
|
||||||
|
! rg -n 'Schedule fresh-auth reconnect after transport (error|disconnect)' \
|
||||||
|
components/control_plane/src/multimodal/control_plane_multimodal_runtime.c >/dev/null 2>&1 ||
|
||||||
|
! rg -n 'if \(!ws_started\)' \
|
||||||
|
components/control_plane/src/runtime/control_plane_runtime_workers.c >/dev/null 2>&1; then
|
||||||
|
fail "WebSocket recovery must retire stale credentials and reconnect through fresh control-plane authentication"
|
||||||
|
fi
|
||||||
if rg -n 'esp_afe_aec\.h|afe_aec_process\(' \
|
if rg -n 'esp_afe_aec\.h|afe_aec_process\(' \
|
||||||
components/domain/{include,internal,src} \
|
components/domain/{include,internal,src} \
|
||||||
components/control_plane/{include,internal,src} \
|
components/control_plane/{include,internal,src} \
|
||||||
|
|||||||
Reference in New Issue
Block a user