@@ -8,13 +8,18 @@ import dev.echonine.kite.api.annotations.Repository
88import dev.echonine.kite.scripting.configuration.compat.DynamicServerJarCompat
99import dev.echonine.kite.scripting.Script
1010import dev.echonine.kite.scripting.ScriptContext
11+ import dev.echonine.kite.scripting.cache.ImportsCache
12+ import kotlinx.coroutines.CoroutineScope
13+ import kotlinx.coroutines.Dispatchers
14+ import kotlinx.coroutines.launch
1115import org.bukkit.Server
1216import org.bukkit.plugin.java.JavaPlugin
1317import revxrsal.zapper.DependencyManager
1418import revxrsal.zapper.classloader.URLClassLoaderWrapper
1519import java.io.File
1620import java.net.URLClassLoader
1721import java.security.MessageDigest
22+ import kotlin.coroutines.CoroutineContext
1823import kotlin.script.experimental.api.*
1924import kotlin.script.experimental.host.FileBasedScriptSource
2025import kotlin.script.experimental.host.FileScriptSource
@@ -54,6 +59,10 @@ val cacheDirectory by lazy {
5459 File (Kite .instance?.dataFolder?.path ? : System .getProperty(" user.dir" , " ." ), " cache" )
5560}
5661
62+ val importsCache by lazy {
63+ ImportsCache ()
64+ }
65+
5766@Suppress(" JavaIoSerializableObjectMustHaveReadResolve" )
5867object KiteCompilationConfiguration : ScriptCompilationConfiguration({
5968 // Adding Bukkit APIs and Kite to default imports.
@@ -132,6 +141,10 @@ object KiteCompilationConfiguration : ScriptCompilationConfiguration({
132141 dependencies.append(JvmDependency (scriptDependencies.map { File (libsDirectory, it) }.filter { it.exists() }))
133142 // Appending imported sources to the script.
134143 importedSources.takeUnless { it.isEmpty() }?.let { importScripts.append(it) }
144+ CoroutineScope (Dispatchers .Default ).launch {
145+ importsCache.write(context.compilationConfiguration[displayName]!!, importedSources.map { it.file.path }.toList())
146+ }
147+
135148 }.asSuccess()
136149 })
137150 }
@@ -146,31 +159,18 @@ object KiteCompilationConfiguration : ScriptCompilationConfiguration({
146159 if (cacheDirectory.isDirectory || cacheDirectory.mkdirs()) {
147160 // Configuring compilation cache.
148161 compilationCache(CompiledScriptJarsCache { script, compilationConfiguration ->
162+ val name = compilationConfiguration[displayName]
163+ val checksum = MessageDigest .getInstance("MD5 ")
149164 // Getting the MD5 checksum and including it in the file name.
150165 // MD5 checksum acts as a file identifier here.
151- val mainScriptHash = script.text.toByteArray().let {
152- val md = MessageDigest .getInstance(" MD5 ")
153- md.update(it)
154- md.digest().joinToString("") { byte -> "%02x".format(byte) }
166+ checksum.update( script.text.toByteArray())
167+ // ...
168+ importsCache.cache[name]?.forEach {
169+ checksum.update( File (it).readBytes())
155170 }
156- // Also hash the imported scripts
157- val importsHash = (compilationConfiguration[importScripts]
158- ? : emptyList<FileScriptSource >()).joinToString("") { importedScript ->
159- importedScript.text.toByteArray().let {
160- val md = MessageDigest .getInstance("MD5 ")
161- md.update(it)
162- md.digest().joinToString("") { byte -> "%02x".format(byte) }
163- }
164- }
165-
166- // Creating the final hash by combining the main script hash and imports hash
167- val hash = MessageDigest .getInstance("MD5 ").apply {
168- update(mainScriptHash.toByteArray())
169- update(importsHash.toByteArray())
170- }.digest().joinToString("") { byte -> "%02x".format(byte) }
171-
171+ // ...
172+ val hash = checksum.digest().joinToString("") { "%02x".format(it) }
172173 val cacheFileName = "${compilationConfiguration[displayName]}.${hash}.cache.jar"
173-
174174 // Purging old cache files with different hashes (not the current one).
175175 cacheDirectory.listFiles()
176176 ?.filter {
0 commit comments