diff --git a/pom.xml b/pom.xml index 1e7f05e..050bbc8 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ 11 11 UTF-8 - 1.8.21 + 1.9.22 @@ -99,6 +99,16 @@ + + io.ktor + ktor-server-host-common-jvm + 2.3.7 + + + io.ktor + ktor-server-netty-jvm + 2.3.7 + org.slf4j slf4j-api diff --git a/src/main/kotlin/org/levi/coffee/Window.kt b/src/main/kotlin/org/levi/coffee/Window.kt index 7fe2c60..64be34c 100644 --- a/src/main/kotlin/org/levi/coffee/Window.kt +++ b/src/main/kotlin/org/levi/coffee/Window.kt @@ -1,6 +1,11 @@ package org.levi.coffee + import dev.webview.Webview +import io.ktor.server.engine.* +import io.ktor.server.http.content.* +import io.ktor.server.netty.* +import io.ktor.server.routing.* import org.levi.coffee.internal.CodeGenerator import org.levi.coffee.internal.MethodBinder import org.levi.coffee.internal.util.FileUtil @@ -10,13 +15,13 @@ import java.util.* import java.util.function.Consumer import kotlin.system.exitProcess -class Window(dev: Boolean = true) { +class Window(val dev: Boolean = true) { private val log: Logger = LoggerFactory.getLogger(this::class.java) - private val _webview: Webview = Webview(dev) + private val _webview: Webview = Webview(true) private val _beforeStartCallbacks: MutableList = ArrayList() private val _onCloseCallbacks: MutableList = ArrayList() - private val _bindObjects: MutableList = ArrayList() + private val _bindObjects = ArrayList() private var _url: String = "" init { @@ -72,7 +77,9 @@ class Window(dev: Boolean = true) { } fun bind(vararg objects: Any) { - _bindObjects.addAll(objects) + for (o in objects) { + _bindObjects.add(o) + } } fun addBeforeStartCallback(r: Runnable) { @@ -85,18 +92,39 @@ class Window(dev: Boolean = true) { fun run() { - CodeGenerator.generateEventsAPI() - CodeGenerator.generateTypes(*_bindObjects.toTypedArray()) - CodeGenerator.generateFunctions(*_bindObjects.toTypedArray()) - MethodBinder.bind(_webview, *_bindObjects.toTypedArray()) + if (dev) { + val cg = CodeGenerator() + cg.generateTypes(*_bindObjects.toTypedArray()) + cg.generateFunctions(*_bindObjects.toTypedArray()) + cg.generateEventsAPI() + } - _beforeStartCallbacks.forEach(Consumer { it.run() }) + var server: NettyApplicationEngine? = null + if (!dev) { + val prodPort = 4567 + server = embeddedServer(Netty, port = prodPort, host = "localhost") { + routing { + staticResources("/", "dist") { + default("index.html") + preCompressed(CompressedFileType.GZIP) + } + } + } + server.start() + _url = "http://localhost:$prodPort" + } + + MethodBinder.bind(_webview, *_bindObjects.toTypedArray()) Ipc.setWebview(_webview) + _beforeStartCallbacks.forEach(Consumer { it.run() }) _webview.loadURL(_url) _webview.run() _onCloseCallbacks.forEach(Consumer { it.run() }) _webview.close() + + server?.stop() + } } \ No newline at end of file diff --git a/src/main/kotlin/org/levi/coffee/internal/CodeGenerator.kt b/src/main/kotlin/org/levi/coffee/internal/CodeGenerator.kt index daf78b7..049862d 100644 --- a/src/main/kotlin/org/levi/coffee/internal/CodeGenerator.kt +++ b/src/main/kotlin/org/levi/coffee/internal/CodeGenerator.kt @@ -8,12 +8,12 @@ import java.io.IOException import java.io.PrintWriter import kotlin.system.exitProcess -internal object CodeGenerator { +internal class CodeGenerator { private val log = LoggerFactory.getLogger(this::class.java) - private const val CLIENT_FOLDER_PATH = "frontend/coffee/" - private const val METHODS_FOLDER_PATH = CLIENT_FOLDER_PATH + "methods/" - private const val TYPES_FILE_PATH = CLIENT_FOLDER_PATH + "types.ts" + private val CLIENT_FOLDER_PATH = "frontend/coffee/" + private val METHODS_FOLDER_PATH = CLIENT_FOLDER_PATH + "methods/" + private val TYPES_FILE_PATH = CLIENT_FOLDER_PATH + "types.ts" private val ipcResources = listOf("events.ts", "window.ts") @@ -22,7 +22,7 @@ internal object CodeGenerator { FileUtil.createOrReplaceFile(TYPES_FILE_PATH) FileUtil.createOrReplaceDirectory(METHODS_FOLDER_PATH) } - + fun generateEventsAPI() { for (resource in ipcResources) { FileUtil.createOrReplaceFile(CLIENT_FOLDER_PATH + resource) @@ -31,8 +31,8 @@ internal object CodeGenerator { ?: throw Exception("Failed to find $resource in resources.") File(CLIENT_FOLDER_PATH + resource).printWriter().use { out -> out.println(eventsResource.readText()) } - log.info("Created events API files.") } + log.info("Created events API files.") } fun generateTypes(vararg objects: Any) {