mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-05-29 13:00:17 +02:00
fix(scripting): dead objects
- add no args emit
This commit is contained in:
parent
08cd7917f3
commit
e79aba8165
@ -1,13 +1,19 @@
|
||||
package me.rhunk.snapenhance.scripting
|
||||
|
||||
class IRemoteIPC : IPCInterface {
|
||||
private val listeners = mutableMapOf<String, MutableSet<Listener>>()
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
class IRemoteIPC : IPCInterface() {
|
||||
private val listeners = ConcurrentHashMap<String, MutableSet<Listener>>()
|
||||
|
||||
fun removeListener(eventName: String, listener: Listener) {
|
||||
listeners[eventName]?.remove(listener)
|
||||
}
|
||||
|
||||
override fun on(eventName: String, listener: Listener) {
|
||||
listeners.getOrPut(eventName) { mutableSetOf() }.add(listener)
|
||||
}
|
||||
|
||||
override fun emit(eventName: String, args: Array<out String?>) {
|
||||
listeners[eventName]?.forEach { it(args) }
|
||||
listeners[eventName]?.toList()?.forEach { it(args) }
|
||||
}
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
package me.rhunk.snapenhance.scripting
|
||||
|
||||
import android.net.Uri
|
||||
import android.os.DeadObjectException
|
||||
import androidx.documentfile.provider.DocumentFile
|
||||
import me.rhunk.snapenhance.RemoteSideContext
|
||||
import me.rhunk.snapenhance.bridge.scripting.IPCListener
|
||||
@ -75,12 +76,24 @@ class RemoteScriptManager(
|
||||
}
|
||||
|
||||
override fun registerIPCListener(eventName: String, listener: IPCListener) {
|
||||
runtime.ipcManager.on(eventName) { args ->
|
||||
listener.onMessage(args)
|
||||
}
|
||||
runtime.ipcManager.on(eventName, object: Listener {
|
||||
override fun invoke(args: Array<out String?>) {
|
||||
try {
|
||||
listener.onMessage(args)
|
||||
} catch (e: DeadObjectException) {
|
||||
(runtime.ipcManager as IRemoteIPC).removeListener(eventName, this)
|
||||
} catch (t: Throwable) {
|
||||
context.log.error("Failed to invoke $eventName", t)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
override fun sendIPCMessage(eventName: String, args: Array<out String>) {
|
||||
runtime.ipcManager.emit(eventName, args)
|
||||
runCatching {
|
||||
runtime.ipcManager.emit(eventName, *args)
|
||||
}.onFailure {
|
||||
context.log.error("Failed to send message for $eventName", it)
|
||||
}
|
||||
}
|
||||
}
|
@ -125,7 +125,7 @@ class SnapEnhance {
|
||||
}
|
||||
})
|
||||
|
||||
scriptRuntime.ipcManager = object: IPCInterface {
|
||||
scriptRuntime.ipcManager = object: IPCInterface() {
|
||||
override fun on(eventName: String, listener: Listener) {
|
||||
registerIPCListener(eventName, object: IPCListener.Stub() {
|
||||
override fun onMessage(args: Array<out String?>) {
|
||||
|
@ -2,7 +2,10 @@ package me.rhunk.snapenhance.scripting
|
||||
|
||||
typealias Listener = (Array<out String?>) -> Unit
|
||||
|
||||
interface IPCInterface {
|
||||
fun on(eventName: String, listener: Listener)
|
||||
fun emit(eventName: String, args: Array<out String?>)
|
||||
abstract class IPCInterface {
|
||||
abstract fun on(eventName: String, listener: Listener)
|
||||
|
||||
abstract fun emit(eventName: String, vararg args: String?)
|
||||
|
||||
fun emit(eventName: String) = emit(eventName, *emptyArray())
|
||||
}
|
@ -13,7 +13,13 @@ class ScriptRuntime(
|
||||
private val modules = mutableMapOf<String, JSModule>()
|
||||
|
||||
fun eachModule(f: JSModule.() -> Unit) {
|
||||
modules.values.forEach(f)
|
||||
modules.values.forEach { module ->
|
||||
runCatching {
|
||||
module.f()
|
||||
}.onFailure {
|
||||
logger.error("Failed to run module function in ${module.moduleInfo.name}", it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun readModuleInfo(reader: BufferedReader): ModuleInfo {
|
||||
|
Loading…
x
Reference in New Issue
Block a user