David Colburn
Committed by GitHub

WS failure reason (#2)

* validate on failure

* get validation body

* extra super call

* remove extra import

* revert bytecodeTarget
@@ -11,10 +11,7 @@ import kotlinx.serialization.encodeToString @@ -11,10 +11,7 @@ import kotlinx.serialization.encodeToString
11 import kotlinx.serialization.json.Json 11 import kotlinx.serialization.json.Json
12 import livekit.LivekitModels 12 import livekit.LivekitModels
13 import livekit.LivekitRtc 13 import livekit.LivekitRtc
14 -import okhttp3.Request  
15 -import okhttp3.Response  
16 -import okhttp3.WebSocket  
17 -import okhttp3.WebSocketListener 14 +import okhttp3.*
18 import okio.ByteString 15 import okio.ByteString
19 import okio.ByteString.Companion.toByteString 16 import okio.ByteString.Companion.toByteString
20 import org.webrtc.IceCandidate 17 import org.webrtc.IceCandidate
@@ -42,6 +39,7 @@ constructor( @@ -42,6 +39,7 @@ constructor(
42 private var currentWs: WebSocket? = null 39 private var currentWs: WebSocket? = null
43 private var isReconnecting: Boolean = false 40 private var isReconnecting: Boolean = false
44 var listener: Listener? = null 41 var listener: Listener? = null
  42 + private var lastUrl: String? = null
45 43
46 fun join( 44 fun join(
47 url: String, 45 url: String,
@@ -67,6 +65,7 @@ constructor( @@ -67,6 +65,7 @@ constructor(
67 65
68 isConnected = false 66 isConnected = false
69 currentWs?.cancel() 67 currentWs?.cancel()
  68 + lastUrl = wsUrlString
70 69
71 val request = Request.Builder() 70 val request = Request.Builder()
72 .url(wsUrlString) 71 .url(wsUrlString)
@@ -76,8 +75,6 @@ constructor( @@ -76,8 +75,6 @@ constructor(
76 75
77 //--------------------------------- WebSocket Listener --------------------------------------// 76 //--------------------------------- WebSocket Listener --------------------------------------//
78 override fun onOpen(webSocket: WebSocket, response: Response) { 77 override fun onOpen(webSocket: WebSocket, response: Response) {
79 - super.onOpen(webSocket, response)  
80 -  
81 if (isReconnecting) { 78 if (isReconnecting) {
82 isReconnecting = false 79 isReconnecting = false
83 isConnected = true 80 isConnected = true
@@ -105,18 +102,38 @@ constructor( @@ -105,18 +102,38 @@ constructor(
105 102
106 override fun onClosed(webSocket: WebSocket, code: Int, reason: String) { 103 override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
107 Timber.v { "websocket closed" } 104 Timber.v { "websocket closed" }
108 - super.onClosed(webSocket, code, reason) 105 +
  106 + listener?.onClose(reason, code)
109 } 107 }
110 108
111 override fun onClosing(webSocket: WebSocket, code: Int, reason: String) { 109 override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
112 Timber.v { "websocket closing" } 110 Timber.v { "websocket closing" }
113 - super.onClosing(webSocket, code, reason)  
114 } 111 }
115 112
116 override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { 113 override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
117 - Timber.v(t) { "websocket failure: $response" } 114 + var reason: String? = null
  115 + try {
  116 + lastUrl?.let {
  117 + val validationUrl = "http" + it.
  118 + substring(2).
  119 + replaceFirst("/rtc?", "/rtc/validate?")
  120 + val request = Request.Builder().url(validationUrl).build()
  121 + val resp = OkHttpClient().newCall(request).execute()
  122 + if (!resp.isSuccessful) {
  123 + reason = resp.body?.string()
  124 + }
  125 + }
  126 + } catch (e: Throwable) {
  127 + Timber.e(e) { "failed to validate connection" }
  128 + }
118 129
119 - super.onFailure(webSocket, t, response) 130 + if (reason != null) {
  131 + Timber.e(t) { "websocket failure: $reason" }
  132 + listener?.onError(Exception(reason))
  133 + } else {
  134 + Timber.e(t) { "websocket failure: $response" }
  135 + listener?.onError(t as Exception)
  136 + }
120 } 137 }
121 138
122 //------------------------------- End WebSocket Listener ------------------------------------// 139 //------------------------------- End WebSocket Listener ------------------------------------//