|
@@ -3,19 +3,26 @@ package io.legado.app.model
|
|
|
import com.google.gson.reflect.TypeToken
|
|
import com.google.gson.reflect.TypeToken
|
|
|
import com.script.SimpleBindings
|
|
import com.script.SimpleBindings
|
|
|
import io.legado.app.constant.SCRIPT_ENGINE
|
|
import io.legado.app.constant.SCRIPT_ENGINE
|
|
|
|
|
+import io.legado.app.exception.NoStackTraceException
|
|
|
import io.legado.app.help.http.newCallStrResponse
|
|
import io.legado.app.help.http.newCallStrResponse
|
|
|
import io.legado.app.help.http.okHttpClient
|
|
import io.legado.app.help.http.okHttpClient
|
|
|
|
|
+import io.legado.app.utils.ACache
|
|
|
import io.legado.app.utils.GSON
|
|
import io.legado.app.utils.GSON
|
|
|
import io.legado.app.utils.MD5Utils
|
|
import io.legado.app.utils.MD5Utils
|
|
|
import io.legado.app.utils.Rhino
|
|
import io.legado.app.utils.Rhino
|
|
|
import io.legado.app.utils.isAbsUrl
|
|
import io.legado.app.utils.isAbsUrl
|
|
|
import io.legado.app.utils.isJsonObject
|
|
import io.legado.app.utils.isJsonObject
|
|
|
import org.mozilla.javascript.Scriptable
|
|
import org.mozilla.javascript.Scriptable
|
|
|
|
|
+import splitties.init.appCtx
|
|
|
|
|
+import java.io.File
|
|
|
import java.lang.ref.WeakReference
|
|
import java.lang.ref.WeakReference
|
|
|
import kotlin.collections.set
|
|
import kotlin.collections.set
|
|
|
|
|
|
|
|
object SharedJsScope {
|
|
object SharedJsScope {
|
|
|
|
|
|
|
|
|
|
+ private val cacheFolder = File(appCtx.filesDir, "shareJs")
|
|
|
|
|
+ private val aCache = ACache.get(cacheFolder)
|
|
|
|
|
+
|
|
|
private val scopeMap = hashMapOf<String, WeakReference<Scriptable>>()
|
|
private val scopeMap = hashMapOf<String, WeakReference<Scriptable>>()
|
|
|
|
|
|
|
|
suspend fun getScope(jsLib: String?): Scriptable? {
|
|
suspend fun getScope(jsLib: String?): Scriptable? {
|
|
@@ -39,9 +46,18 @@ object SharedJsScope {
|
|
|
)
|
|
)
|
|
|
jsMap.values.forEach { value ->
|
|
jsMap.values.forEach { value ->
|
|
|
if (value.isAbsUrl()) {
|
|
if (value.isAbsUrl()) {
|
|
|
- val js = okHttpClient.newCallStrResponse {
|
|
|
|
|
- url(value)
|
|
|
|
|
- }.body
|
|
|
|
|
|
|
+ val fileName = MD5Utils.md5Encode(value)
|
|
|
|
|
+ var js = aCache.getAsString(fileName)
|
|
|
|
|
+ if (js == null) {
|
|
|
|
|
+ js = okHttpClient.newCallStrResponse {
|
|
|
|
|
+ url(value)
|
|
|
|
|
+ }.body
|
|
|
|
|
+ if (js !== null) {
|
|
|
|
|
+ aCache.put(fileName, js)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ throw NoStackTraceException("下载jsLib-${value}失败")
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
evaluateString(scope, js, "jsLib", 1, null)
|
|
evaluateString(scope, js, "jsLib", 1, null)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|