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) {