parent
3675d1d6a3
commit
d072090cae
@ -1,12 +1,20 @@ |
|||||||
package io.legado.app.web |
package io.legado.app.web |
||||||
|
|
||||||
import fi.iki.elonen.NanoWSD |
import fi.iki.elonen.NanoWSD |
||||||
|
import io.legado.app.web.socket.BookSourceDebugWebSocket |
||||||
|
import io.legado.app.web.socket.RssSourceDebugWebSocket |
||||||
|
|
||||||
class WebSocketServer(port: Int) : NanoWSD(port) { |
class WebSocketServer(port: Int) : NanoWSD(port) { |
||||||
|
|
||||||
override fun openWebSocket(handshake: IHTTPSession): WebSocket? { |
override fun openWebSocket(handshake: IHTTPSession): WebSocket? { |
||||||
return if (handshake.uri == "/sourceDebug") { |
return when (handshake.uri) { |
||||||
SourceDebugWebSocket(handshake) |
"/bookSourceDebug" -> { |
||||||
} else null |
BookSourceDebugWebSocket(handshake) |
||||||
|
} |
||||||
|
"/rssSourceDebug" -> { |
||||||
|
RssSourceDebugWebSocket(handshake) |
||||||
|
} |
||||||
|
else -> null |
||||||
|
} |
||||||
} |
} |
||||||
} |
} |
||||||
|
@ -0,0 +1,93 @@ |
|||||||
|
package io.legado.app.web.socket |
||||||
|
|
||||||
|
|
||||||
|
import fi.iki.elonen.NanoHTTPD |
||||||
|
import fi.iki.elonen.NanoWSD |
||||||
|
import io.legado.app.R |
||||||
|
import io.legado.app.data.appDb |
||||||
|
import io.legado.app.model.Debug |
||||||
|
import io.legado.app.utils.* |
||||||
|
import kotlinx.coroutines.* |
||||||
|
import kotlinx.coroutines.Dispatchers.IO |
||||||
|
import splitties.init.appCtx |
||||||
|
import java.io.IOException |
||||||
|
|
||||||
|
|
||||||
|
class RssSourceDebugWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) : |
||||||
|
NanoWSD.WebSocket(handshakeRequest), |
||||||
|
CoroutineScope by MainScope(), |
||||||
|
Debug.Callback { |
||||||
|
|
||||||
|
private val notPrintState = arrayOf(10, 20, 30, 40) |
||||||
|
|
||||||
|
override fun onOpen() { |
||||||
|
launch(IO) { |
||||||
|
kotlin.runCatching { |
||||||
|
while (isOpen) { |
||||||
|
ping("ping".toByteArray()) |
||||||
|
delay(30000) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
override fun onClose( |
||||||
|
code: NanoWSD.WebSocketFrame.CloseCode, |
||||||
|
reason: String, |
||||||
|
initiatedByRemote: Boolean |
||||||
|
) { |
||||||
|
cancel() |
||||||
|
Debug.cancelDebug(true) |
||||||
|
} |
||||||
|
|
||||||
|
override fun onMessage(message: NanoWSD.WebSocketFrame) { |
||||||
|
launch(IO) { |
||||||
|
kotlin.runCatching { |
||||||
|
if (!message.textPayload.isJson()) { |
||||||
|
send("数据必须为Json格式") |
||||||
|
close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) |
||||||
|
return@launch |
||||||
|
} |
||||||
|
val debugBean = GSON.fromJsonObject<Map<String, String>>(message.textPayload) |
||||||
|
if (debugBean != null) { |
||||||
|
val tag = debugBean["tag"] |
||||||
|
if (tag.isNullOrBlank()) { |
||||||
|
send(appCtx.getString(R.string.cannot_empty)) |
||||||
|
close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) |
||||||
|
return@launch |
||||||
|
} |
||||||
|
appDb.rssSourceDao.getByKey(tag)?.let { |
||||||
|
Debug.callback = this@RssSourceDebugWebSocket |
||||||
|
Debug.startDebug(this, it) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
override fun onPong(pong: NanoWSD.WebSocketFrame) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
override fun onException(exception: IOException) { |
||||||
|
Debug.cancelDebug(true) |
||||||
|
} |
||||||
|
|
||||||
|
override fun printLog(state: Int, msg: String) { |
||||||
|
if (state in notPrintState) { |
||||||
|
return |
||||||
|
} |
||||||
|
runOnIO { |
||||||
|
runCatching { |
||||||
|
send(msg) |
||||||
|
if (state == -1 || state == 1000) { |
||||||
|
Debug.cancelDebug(true) |
||||||
|
close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) |
||||||
|
} |
||||||
|
}.onFailure { |
||||||
|
it.printOnDebug() |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue