feat(scripting): ipc global channels

This commit is contained in:
rhunk
2023-09-17 19:35:36 +02:00
parent 98b3f2bfc9
commit 19a0ab8398
6 changed files with 99 additions and 64 deletions

View File

@ -10,7 +10,7 @@ interface IScripting {
void registerReloadListener(ReloadListener listener);
void registerIPCListener(String eventName, IPCListener listener);
void registerIPCListener(String channel, String eventName, IPCListener listener);
void sendIPCMessage(String eventName, in String[] args);
void sendIPCMessage(String channel, String eventName, in String[] args);
}

View File

@ -5,8 +5,13 @@ typealias Listener = (Array<out String?>) -> Unit
abstract class IPCInterface {
abstract fun on(eventName: String, listener: Listener)
abstract fun onBroadcast(channel: String, eventName: String, listener: Listener)
abstract fun emit(eventName: String, vararg args: String?)
abstract fun broadcast(channel: String, eventName: String, vararg args: String?)
@Suppress("unused")
fun emit(eventName: String) = emit(eventName, *emptyArray())
@Suppress("unused")
fun emit(channel: String, eventName: String) = broadcast(channel, eventName, *emptyArray())
}

View File

@ -18,7 +18,6 @@ class CoreScriptRuntime(
private val scriptHookers = mutableListOf<ScriptHooker>()
fun connect(scriptingInterface: IScripting) {
scriptingInterface.apply {
registerReloadListener(object: ReloadListener.Stub() {
@ -27,31 +26,39 @@ class CoreScriptRuntime(
}
})
ipcInterface = object: IPCInterface() {
override fun on(eventName: String, listener: Listener) {
registerIPCListener(eventName, object: IPCListener.Stub() {
override fun onMessage(args: Array<out String?>) {
listener(args)
}
})
}
buildModuleObject = { module ->
putConst("ipc", this, object: IPCInterface() {
override fun onBroadcast(channel: String, eventName: String, listener: Listener) {
registerIPCListener(channel, eventName, object: IPCListener.Stub() {
override fun onMessage(args: Array<out String?>) {
listener(args)
}
})
}
override fun emit(eventName: String, args: Array<out String?>) {
sendIPCMessage(eventName, args)
override fun on(eventName: String, listener: Listener) {
onBroadcast(module.moduleInfo.name, eventName, listener)
}
override fun emit(eventName: String, vararg args: String?) {
broadcast(module.moduleInfo.name, eventName, *args)
}
override fun broadcast(channel: String, eventName: String, vararg args: String?) {
sendIPCMessage(channel, eventName, args)
}
})
putFunction("findClass") {
val className = it?.get(0).toString()
classLoader.loadClass(className)
}
putConst("hooker", this, ScriptHooker(module.moduleInfo, logger, classLoader).also {
scriptHookers.add(it)
})
}
}
buildModuleObject = { module ->
putConst("ipc", this, ipcInterface)
putFunction("findClass") {
val className = it?.get(0).toString()
classLoader.loadClass(className)
}
putConst("hooker", this, ScriptHooker(module.moduleInfo, logger, classLoader).also {
scriptHookers.add(it)
})
}
scriptingInterface.enabledScripts.forEach { path ->
runCatching {