Skip to content

Commit 192a43f

Browse files
ilgonmicdkrasnoff
authored andcommitted
Add resources server
1 parent f8907a2 commit 192a43f

File tree

11 files changed

+344
-30
lines changed

11 files changed

+344
-30
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ build/
44
!**/src/main/**
55
!**/src/test/**
66
src/main/resources/application.properties
7+
resource-server/src/main/resources/application.properties
78

89
# compile artifacts
910
.kotlin/

build.gradle.kts

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import org.gradle.kotlin.dsl.support.serviceOf
22
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin.Companion.kotlinNodeJsEnvSpec
3+
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
34
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
45
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
56
import org.springframework.boot.gradle.tasks.bundling.BootJar
@@ -33,11 +34,6 @@ allprojects {
3334
}
3435
}
3536

36-
val resourceDependency: Configuration by configurations.creating {
37-
isCanBeResolved = true
38-
isCanBeConsumed = false
39-
}
40-
4137

4238
val kotlinComposeWasmStdlibTypeInfo: Configuration by configurations.creating {
4339
isTransitive = false
@@ -50,7 +46,7 @@ val kotlinComposeWasmStdlibTypeInfo: Configuration by configurations.creating {
5046
)
5147
attribute(
5248
CacheAttribute.cacheAttribute,
53-
CacheAttribute.STDLIB
49+
CacheAttribute.TYPEINFO
5450
)
5551
}
5652
}
@@ -81,8 +77,6 @@ dependencies {
8177
}
8278
testImplementation(libs.kotlinx.coroutines.test)
8379

84-
resourceDependency(libs.skiko.js.wasm.runtime)
85-
8680
kotlinComposeWasmStdlibTypeInfo(project(":cache-maker"))
8781
}
8882

@@ -113,15 +107,23 @@ fun generateProperties(prefix: String = "") = """
113107
server.compression.enabled=true
114108
server.compression.mime-types=application/json,text/javascript,application/wasm
115109
springdoc.swagger-ui.path: /api-docs/swagger-ui.html
110+
skiko.version=${libs.versions.skiko.get()}
116111
""".trimIndent()
117112

113+
val composeWasmPropertiesUpdater by tasks.registering(ComposeWasmPropertiesUpdater::class) {
114+
dependsOn(kotlinComposeWasmStdlibTypeInfo)
115+
propertiesPath.set(rootDir.resolve("src/main/resources/${propertyFile}").absolutePath)
116+
typeInfoFile.set(kotlinComposeWasmStdlibTypeInfo.singleFile)
117+
}
118+
118119
tasks.withType<KotlinCompile> {
119120
compilerOptions {
120121
freeCompilerArgs.set(listOf("-Xjsr305=strict"))
121122
}
122123
dependsOn(":executors:jar")
123124
dependsOn(":indexation:run")
124125
dependsOn(kotlinComposeWasmStdlibTypeInfo)
126+
dependsOn(composeWasmPropertiesUpdater)
125127
buildPropertyFile()
126128
}
127129
println("Using Kotlin compiler ${libs.versions.kotlin.get()}")
@@ -161,12 +163,7 @@ val buildLambda by tasks.creating(Zip::class) {
161163
}
162164

163165
tasks.named<Copy>("processResources") {
164-
val archiveOperation = project.serviceOf<ArchiveOperations>()
165-
from(resourceDependency.map {
166-
archiveOperation.zipTree(it)
167-
}) {
168-
into("com/compiler/server")
169-
}
166+
dependsOn(composeWasmPropertiesUpdater)
170167
}
171168

172169
tasks.withType<Test> {

buildSrc/src/main/kotlin/CacheAttribute.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import org.gradle.api.attributes.Attribute
22

33
enum class CacheAttribute {
4-
STDLIB;
4+
FULL,
5+
TYPEINFO;
56

67
companion object {
78
val cacheAttribute = Attribute.of("org.jetbrains.kotlin-compiler-server.cache", CacheAttribute::class.java)
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import org.gradle.api.DefaultTask
2+
import org.gradle.api.file.RegularFileProperty
3+
import org.gradle.api.provider.MapProperty
4+
import org.gradle.api.provider.Property
5+
import org.gradle.api.tasks.Input
6+
import org.gradle.api.tasks.InputFile
7+
import org.gradle.api.tasks.OutputFile
8+
import org.gradle.api.tasks.TaskAction
9+
import java.io.File
10+
import java.io.FileInputStream
11+
import java.security.MessageDigest
12+
13+
abstract class ComposeWasmPropertiesUpdater : DefaultTask() {
14+
15+
@get:InputFile
16+
abstract val propertiesPath: Property<String>
17+
18+
@get:InputFile
19+
abstract val typeInfoFile: RegularFileProperty
20+
21+
@get:Input
22+
abstract val propertiesMap: MapProperty<String, String>
23+
24+
@get:OutputFile
25+
val updatedPropertiesFile: RegularFileProperty = project.objects.fileProperty().fileProvider(propertiesPath.map { File(it) })
26+
27+
@TaskAction
28+
fun updateProperties() {
29+
val file = File(propertiesPath.get())
30+
31+
propertiesMap.get().let {
32+
if (it.isNotEmpty()) {
33+
file.writeText("")
34+
it.forEach { (key, value) ->
35+
file.appendText("$key=$value\n")
36+
}
37+
}
38+
}
39+
40+
file.appendText(
41+
"\ndependencies.compose.wasm=${hashFileContent(typeInfoFile.get().asFile.absolutePath)}"
42+
)
43+
}
44+
}
45+
46+
fun hashFileContent(filePath: String, hashAlgorithm: String = "SHA-256"): String {
47+
val file = File(filePath)
48+
val digest = MessageDigest.getInstance(hashAlgorithm)
49+
50+
// Read the file content in chunks and update the digest
51+
FileInputStream(file).use { fileInputStream ->
52+
val buffer = ByteArray(1024)
53+
var bytesRead: Int
54+
while (fileInputStream.read(buffer).also { bytesRead = it } != -1) {
55+
digest.update(buffer, 0, bytesRead)
56+
}
57+
}
58+
59+
// Convert the resulting byte array to a readable hex string
60+
return digest.digest().joinToString("") { "%02x".format(it) }
61+
}

cache-maker/build.gradle.kts

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,23 @@ kotlin {
2222
}
2323
}
2424

25-
val composeWasmStdlibTypeInfo: Provider<RegularFile> = layout.buildDirectory
26-
.file("compose-wasm-stdlib-output/stdlib.typeinfo.bin")
25+
val composeWasmStdlib: Provider<Directory> = layout.buildDirectory
26+
.dir("compose-wasm-stdlib-output")
27+
val composeWasmStdlibTypeInfo: Provider<RegularFile> = composeWasmStdlib
28+
.map { it.file("compose-wasm-stdlib-output/stdlib.typeinfo.bin") }
2729

2830
val buildComposeWasmStdlibModule by tasks.registering(Exec::class) {
31+
2932
workingDir = rootDir
3033
executable = "${project.name}/docker-build-incremental-cache.sh"
3134

32-
val outputDir = composeWasmStdlibTypeInfo.map { it.asFile.parentFile }
35+
val outputDir = composeWasmStdlib
3336

3437
inputs.file(layout.projectDirectory.file("Dockerfile"))
3538
inputs.file(layout.projectDirectory.file("docker-build-incremental-cache.sh"))
3639
outputs.dir(outputDir)
3740

38-
argumentProviders.add {
39-
listOf(
40-
lambdaPrefix, // baseDir
41-
outputDir.get().normalize().absolutePath, // targetDir
42-
)
43-
}
41+
args(lambdaPrefix, outputDir.get().asFile.normalize().absolutePath)
4442
}
4543

4644
val prepareTypeInfoIntoComposeWasmCache by tasks.registering(Sync::class) {
@@ -65,12 +63,24 @@ kotlinComposeWasmStdlibTypeInfo.outgoing.variants.create("stdlib") {
6563
attributes {
6664
attribute(
6765
CacheAttribute.cacheAttribute,
68-
CacheAttribute.STDLIB
66+
CacheAttribute.FULL
67+
)
68+
}
69+
70+
artifact(composeWasmStdlib) {
71+
builtBy(prepareTypeInfoIntoComposeWasmCache)
72+
}
73+
}
74+
75+
kotlinComposeWasmStdlibTypeInfo.outgoing.variants.create("typeinfo") {
76+
attributes {
77+
attribute(
78+
CacheAttribute.cacheAttribute,
79+
CacheAttribute.TYPEINFO
6980
)
7081
}
7182

72-
artifact(cachesComposeWasmFolder) {
73-
type = "directory"
83+
artifact(cachesComposeWasmFolder.file("stdlib.typeinfo.bin")) {
7484
builtBy(prepareTypeInfoIntoComposeWasmCache)
7585
}
7686
}

resource-server/build.gradle.kts

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import org.gradle.kotlin.dsl.support.serviceOf
2+
import org.gradle.kotlin.dsl.withType
3+
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
4+
5+
plugins {
6+
alias(libs.plugins.spring.dependency.management)
7+
alias(libs.plugins.spring.boot)
8+
alias(libs.plugins.kotlin.jvm)
9+
alias(libs.plugins.kotlin.plugin.spring)
10+
}
11+
12+
kotlin.jvmToolchain {
13+
languageVersion.set(JavaLanguageVersion.of(17))
14+
vendor.set(JvmVendorSpec.AMAZON)
15+
}
16+
17+
val resourceDependency: Configuration by configurations.creating {
18+
isCanBeResolved = true
19+
isCanBeConsumed = false
20+
}
21+
22+
val kotlinComposeWasmStdlibTypeInfo: Configuration by configurations.creating {
23+
isTransitive = false
24+
isCanBeResolved = true
25+
isCanBeConsumed = false
26+
attributes {
27+
attribute(
28+
Category.CATEGORY_ATTRIBUTE,
29+
objects.categoryComposeCache
30+
)
31+
attribute(
32+
CacheAttribute.cacheAttribute,
33+
CacheAttribute.TYPEINFO
34+
)
35+
}
36+
}
37+
38+
val kotlinComposeWasmStdlib: Configuration by configurations.creating {
39+
isTransitive = false
40+
isCanBeResolved = true
41+
isCanBeConsumed = false
42+
attributes {
43+
attribute(
44+
Category.CATEGORY_ATTRIBUTE,
45+
objects.categoryComposeCache
46+
)
47+
attribute(
48+
CacheAttribute.cacheAttribute,
49+
CacheAttribute.FULL
50+
)
51+
}
52+
}
53+
54+
dependencies {
55+
implementation("org.springframework.boot:spring-boot-starter-web")
56+
// implementation(libs.springfox.boot.starter)
57+
// implementation(libs.aws.springboot.container)
58+
// implementation(libs.junit)
59+
// implementation(libs.logback.logstash.encoder)
60+
// implementation(libs.intellij.trove4j)
61+
// implementation(libs.kotlin.reflect)
62+
// implementation(libs.bundles.kotlin.stdlib)
63+
// implementation(libs.kotlin.test)
64+
// implementation(libs.kotlin.compiler)
65+
// implementation(libs.kotlin.script.runtime)
66+
// implementation(libs.kotlin.compiler.ide) {
67+
// isTransitive = false
68+
// }
69+
// implementation(libs.kotlin.core)
70+
// implementation(project(":executors", configuration = "default"))
71+
// implementation(project(":common", configuration = "default"))
72+
//
73+
// testImplementation("org.springframework.boot:spring-boot-starter-test") {
74+
// exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
75+
// }
76+
// testImplementation(libs.kotlinx.coroutines.test)
77+
78+
resourceDependency(libs.skiko.js.wasm.runtime)
79+
kotlinComposeWasmStdlib(project(":cache-maker"))
80+
kotlinComposeWasmStdlibTypeInfo(project(":cache-maker"))
81+
}
82+
83+
val composeWasmPropertiesUpdater by tasks.registering(ComposeWasmPropertiesUpdater::class) {
84+
dependsOn(kotlinComposeWasmStdlibTypeInfo)
85+
propertiesMap.put("spring.mvc.pathmatch.matching-strategy", "ant_path_matcher")
86+
propertiesMap.put("server.port", "8081")
87+
propertiesMap.put("skiko.version", libs.versions.skiko.get())
88+
89+
val applicationPropertiesFile = projectDir.resolve("src/main/resources/application.properties")
90+
val applicationProperties = applicationPropertiesFile.absolutePath
91+
propertiesPath.set(applicationProperties)
92+
93+
typeInfoFile.set(kotlinComposeWasmStdlibTypeInfo.singleFile)
94+
95+
if (!applicationPropertiesFile.exists()) {
96+
applicationPropertiesFile.createNewFile()
97+
}
98+
}
99+
100+
tasks.withType<KotlinCompile> {
101+
dependsOn(composeWasmPropertiesUpdater)
102+
}
103+
104+
tasks.named<Copy>("processResources") {
105+
dependsOn(composeWasmPropertiesUpdater)
106+
val archiveOperation = project.serviceOf<ArchiveOperations>()
107+
from(resourceDependency.map {
108+
archiveOperation.zipTree(it)
109+
}) {
110+
into("com/compiler/server")
111+
}
112+
from(kotlinComposeWasmStdlib) {
113+
into("com/compiler/server")
114+
}
115+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.compiler.server
2+
3+
import org.springframework.boot.autoconfigure.SpringBootApplication
4+
import org.springframework.boot.runApplication
5+
6+
@SpringBootApplication
7+
class ResourceApplication
8+
9+
fun main(args: Array<String>) {
10+
runApplication<ResourceApplication>(*args)
11+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.compiler.server.configuration
2+
3+
import org.springframework.context.annotation.Bean
4+
import org.springframework.context.annotation.Configuration
5+
import org.springframework.web.cors.CorsConfiguration
6+
import org.springframework.web.cors.UrlBasedCorsConfigurationSource
7+
import org.springframework.web.filter.CorsFilter
8+
9+
val ACCESS_CONTROL_ALLOW_ORIGIN_VALUE: String = System.getenv("ACCESS_CONTROL_ALLOW_ORIGIN_VALUE") ?: "*"
10+
val ACCESS_CONTROL_ALLOW_HEADER_VALUE: String = System.getenv("ACCESS_CONTROL_ALLOW_HEADER_VALUE") ?: "*"
11+
12+
@Configuration
13+
class CorsConfiguration {
14+
@Bean
15+
fun corsFilter(): CorsFilter {
16+
val source = UrlBasedCorsConfigurationSource()
17+
val config = CorsConfiguration().apply {
18+
addAllowedHeader(ACCESS_CONTROL_ALLOW_HEADER_VALUE)
19+
addAllowedOrigin(ACCESS_CONTROL_ALLOW_ORIGIN_VALUE)
20+
addAllowedMethod("GET")
21+
addAllowedMethod("POST")
22+
}
23+
source.registerCorsConfiguration("/**", config)
24+
return CorsFilter(source)
25+
}
26+
}

0 commit comments

Comments
 (0)