|
|
|
@ -71,6 +71,23 @@ class StreamDictationClient( |
|
|
|
connectWebSocket() |
|
|
|
} |
|
|
|
|
|
|
|
private fun diagnoseDisconnectReason(t: Throwable): String { |
|
|
|
val msg = t.message ?: t.javaClass.simpleName |
|
|
|
return when { |
|
|
|
msg.contains("Software caused connection abort", ignoreCase = true) -> |
|
|
|
"قطع شدن سوکت به دلیل سوییچ اینترنت/تغییر مسیر شبکه گوشی (Software connection abort)" |
|
|
|
msg.contains("failed to connect", ignoreCase = true) && msg.contains("after", ignoreCase = true) -> |
|
|
|
"تایماوت شبکه اپراتور موبایل (عدم پاسخگویی پورت در بازه زمانی تعیینشده)" |
|
|
|
msg.contains("sent ping but didn't receive pong", ignoreCase = true) -> |
|
|
|
"افت پکتهای شبکه یا تاخیر پینگ بین گوشی و سرور (Ping/Pong timeout)" |
|
|
|
msg.contains("Connection refused", ignoreCase = true) -> |
|
|
|
"سرویس سرور در دسترس نیست یا متوقف شده (Connection refused)" |
|
|
|
msg.contains("Network is unreachable", ignoreCase = true) || msg.contains("ENETUNREACH", ignoreCase = true) -> |
|
|
|
"عدم دسترسی گوشی به اینترنت (Network unreachable)" |
|
|
|
else -> msg |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Synchronized |
|
|
|
fun connectWebSocket() { |
|
|
|
if (isConnected.get() || isConnecting.get()) return |
|
|
|
@ -110,6 +127,9 @@ class StreamDictationClient( |
|
|
|
val ts = json.optDouble("timestamp", System.currentTimeMillis() / 1000.0) |
|
|
|
|
|
|
|
val payload = SyncStatePayload(source, app, txt, cursor, sel, rev, ts) |
|
|
|
if (source != "android") { |
|
|
|
AppLogger.log("MacSync", "📥 دریافت وضعیت از مک [$app]: '${txt.take(30)}' (کرسر: $cursor)") |
|
|
|
} |
|
|
|
mainHandler.post { onSyncStateReceived(payload) } |
|
|
|
return |
|
|
|
} |
|
|
|
@ -151,7 +171,8 @@ class StreamDictationClient( |
|
|
|
} |
|
|
|
|
|
|
|
override fun onFailure(ws: WebSocket, t: Throwable, response: Response?) { |
|
|
|
AppLogger.log(tag, "🔴 قطع سوکت: ${t.message}. تلاش مجدد...") |
|
|
|
val diagnostic = diagnoseDisconnectReason(t) |
|
|
|
AppLogger.log(tag, "🔴 قطع سوکت: $diagnostic. تلاش مجدد...") |
|
|
|
isConnecting.set(false) |
|
|
|
isConnected.set(false) |
|
|
|
webSocket = null |
|
|
|
|