owenclave / app/src/main/java/io/nekohasekai/sagernet/bg/test/V2RayTestInstance.kt

github - dev - back to tree - upstream
/****************************************************************************** * * * Copyright (C) 2021 by nekohasekai * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ******************************************************************************/ package io.nekohasekai.sagernet.bg.test import android.net.Network import io.nekohasekai.sagernet.bg.GuardedProcessPool import io.nekohasekai.sagernet.bg.LocalResolver import io.nekohasekai.sagernet.bg.proto.V2RayInstance import io.nekohasekai.sagernet.database.ProxyEntity import io.nekohasekai.sagernet.fmt.buildV2RayConfig import io.nekohasekai.sagernet.ktx.Logs import io.nekohasekai.sagernet.ktx.runOnDefaultDispatcher import io.nekohasekai.sagernet.ktx.tryResume import io.nekohasekai.sagernet.ktx.tryResumeWithException import io.nekohasekai.sagernet.utils.DefaultNetworkListener import kotlinx.coroutines.delay import libexclavecore.Libexclavecore import kotlin.coroutines.Continuation import kotlin.coroutines.suspendCoroutine class V2RayTestInstance(profile: ProxyEntity, val link: String, val timeout: Int, val protectPath: String = "") : V2RayInstance( profile, ), LocalResolver { lateinit var continuation: Continuation suspend fun doTest(): Int { return suspendCoroutine { c -> continuation = c processes = GuardedProcessPool { Logs.w(it) c.tryResumeWithException(it) } runOnDefaultDispatcher { try { init() launch() if (pluginConfigs.isNotEmpty()) { delay(500L) } c.tryResume(Libexclavecore.urlTest(v2rayPoint, "", link, timeout)) } catch (e: Exception) { c.tryResumeWithException(e) } } } } @Volatile override var underlyingNetwork: Network? = null override suspend fun init() { super.init() v2rayPoint.withLocalResolver(this) v2rayPoint.withAlternativeSystemDialer(protectPath) DefaultNetworkListener.start(this) { underlyingNetwork = it } } override fun close() { runOnDefaultDispatcher { DefaultNetworkListener.stop(this) } super.close() } override fun buildConfig() { config = buildV2RayConfig(profile, forTest = true) } }