Skip to content

Add IC for Compose Wasm #775

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Draft
wants to merge 31 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
ee02650
Add IC for Compose Wasm
ilgonmic Oct 10, 2024
ebc3a6a
No need docker in local case
ilgonmic Nov 5, 2024
daaef81
Remove image after cache build
ilgonmic Nov 5, 2024
fdbe7e6
Use lazy argumentProviders instead of args
ilgonmic Nov 5, 2024
53c8495
Readonly cache
ilgonmic Nov 18, 2024
aed319e
Remove time measure
ilgonmic Nov 18, 2024
873c1ff
Fix variant-aware configurations for Gradle
ilgonmic Dec 4, 2024
aaf39de
Fix sample to be compatible with example in playground
ilgonmic Dec 4, 2024
486f8cd
First version with typeinfo
ilgonmic Jan 21, 2025
e35603b
Add resources server
ilgonmic Jan 21, 2025
13f2848
Add test of resources server
ilgonmic Jan 21, 2025
8f4d761
Add test of resources server
ilgonmic Jan 21, 2025
443b465
Microfix
ilgonmic Jan 21, 2025
36fb805
Microfix #2
ilgonmic Jan 21, 2025
10cc00e
Microfix #3
ilgonmic Jan 21, 2025
837348d
Microfix #4
ilgonmic Jan 21, 2025
64faf91
Microfix #5
ilgonmic Jan 21, 2025
697a230
Microfix #6
ilgonmic Jan 21, 2025
273ac14
Microfix #7
ilgonmic Jan 21, 2025
ea488cf
Microfix #8
ilgonmic Jan 21, 2025
af10d26
Microfix #9
ilgonmic Jan 21, 2025
232c8e5
Fix after version upgrade
ilgonmic Mar 6, 2025
19088f7
Adopt #1
ilgonmic Mar 6, 2025
78ce527
Adopt #2
ilgonmic Mar 6, 2025
00c3a1c
Adopt #3
ilgonmic Mar 7, 2025
3d45530
Adopt #4
ilgonmic Mar 7, 2025
8e79d8b
Adopt #5
ilgonmic Mar 7, 2025
9cc42aa
One request for resources
ilgonmic Mar 7, 2025
e8cfa89
Fix resource server
ilgonmic Mar 7, 2025
af8bc3f
Fix stdlib.wasm file with hash
ilgonmic Mar 7, 2025
52e4b0a
Use compiler output instead of binaryen because it may be incorrect
ilgonmic Mar 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ build/
!**/src/main/**
!**/src/test/**
src/main/resources/application.properties
resource-server/src/main/resources/application.properties

# compile artifacts
.kotlin/
Expand Down
138 changes: 95 additions & 43 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import org.gradle.kotlin.dsl.support.serviceOf
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
Expand Down Expand Up @@ -32,6 +31,7 @@ allprojects {
maven("https://repo.spring.io/snapshot")
maven("https://repo.spring.io/milestone")
maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-ide")
maven("https://packages.jetbrains.team/maven/p/kt/dev/")
maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev")
maven("https://cache-redirector.jetbrains.com/jetbrains.bintray.com/intellij-third-party-dependencies")
maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-ide-plugin-dependencies")
Expand All @@ -41,9 +41,17 @@ allprojects {
maven("https://maven.pkg.jetbrains.space/kotlin/p/wasm/experimental")
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
}
afterEvaluate {
dependencies {
dependencies {
}

setOf(
rootProject,
project(":common"),
project(":executors"),
project(":indexation"),
).forEach { project ->
project.afterEvaluate {
project.dependencies {
project.dependencies {
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.15.2")
implementation(libs.kotlin.idea) {
isTransitive = false
Expand All @@ -53,9 +61,32 @@ allprojects {
}
}

val resourceDependency: Configuration by configurations.creating {
val kotlinComposeWasmStdlibFile: Configuration by configurations.creating {
isTransitive = false
isCanBeResolved = true
isCanBeConsumed = false
attributes {
attribute(
Category.CATEGORY_ATTRIBUTE,
objects.categoryComposeCache
)
attribute(
CacheAttribute.cacheAttribute,
CacheAttribute.WASM
)
}
}

val composeWasmStaticResources: Configuration by configurations.creating {
isTransitive = false
isCanBeResolved = true
isCanBeConsumed = false
attributes {
attribute(
Category.CATEGORY_ATTRIBUTE,
objects.categoryComposeWasmResources
)
}
}

dependencies {
Expand Down Expand Up @@ -84,43 +115,65 @@ dependencies {
}
testImplementation(libs.kotlinx.coroutines.test)

resourceDependency(libs.skiko.js.wasm.runtime)
kotlinComposeWasmStdlibFile(project(":cache-maker"))
composeWasmStaticResources(project(":resource-server"))
}

fun buildPropertyFile() {
rootDir.resolve("src/main/resources/${propertyFile}").apply {
println("Generate properties into $absolutePath")
parentFile.mkdirs()
writeText(generateProperties())
fun Project.generateProperties(
prefix: String = "",
): Map<String, String> = mapOf(
"kotlin.version" to kotlinVersion,
"policy.file" to prefix + policy,
"indexes.file" to prefix + indexes,
"indexesJs.file" to prefix + indexesJs,
"indexesWasm.file" to prefix + indexesWasm,
"indexesComposeWasm.file" to prefix + indexesComposeWasm,
"libraries.folder.jvm" to prefix + libJVM,
"libraries.folder.js" to prefix + libJS,
"libraries.folder.wasm" to prefix + libWasm,
"libraries.folder.compose-wasm" to prefix + libComposeWasm,
"libraries.folder.compose-wasm-compiler-plugins" to prefix + libComposeWasmCompilerPlugins,
"libraries.folder.compiler-plugins" to prefix + compilerPluginsForJVM,
"spring.mvc.pathmatch.matching-strategy" to "ant_path_matcher",
"server.compression.enabled" to "true",
"server.compression.mime-types" to "application/json,text/javascript,application/wasm",
"skiko.version" to libs.versions.skiko.get(),
)

val propertiesGenerator by tasks.registering(PropertiesGenerator::class) {
dependsOn(kotlinComposeWasmStdlibFile)
propertiesFile.fileValue(rootDir.resolve("src/main/resources/${propertyFile}"))
hashableFile.fileProvider(
provider {
kotlinComposeWasmStdlibFile.singleFile
}
)
generateProperties().forEach { (name, value) ->
propertiesMap.put(name, value)
}
}

fun generateProperties(prefix: String = "") = """
# this file is autogenerated by build.gradle.kts
kotlin.version=${kotlinVersion}
policy.file=${prefix + policy}
indexes.file=${prefix + indexes}
indexesJs.file=${prefix + indexesJs}
indexesWasm.file=${prefix + indexesWasm}
indexesComposeWasm.file=${prefix + indexesComposeWasm}
libraries.folder.jvm=${prefix + libJVM}
libraries.folder.js=${prefix + libJS}
libraries.folder.wasm=${prefix + libWasm}
libraries.folder.compose-wasm=${prefix + libComposeWasm}
libraries.folder.compose-wasm-compiler-plugins=${prefix + libComposeWasmCompilerPlugins}
libraries.folder.compiler-plugins=${prefix + compilerPluginsForJVM}
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
server.compression.enabled=true
server.compression.mime-types=application/json,text/javascript,application/wasm
""".trimIndent()
val lambdaPropertiesGenerator by tasks.registering(PropertiesGenerator::class) {
dependsOn(kotlinComposeWasmStdlibFile)
propertiesFile.set(layout.buildDirectory.file("tmp/propertiesGenerator/${propertyFile}"))
hashableFile.fileProvider(
provider {
kotlinComposeWasmStdlibFile.singleFile
}
)

generateProperties(lambdaPrefix).forEach { (name, value) ->
propertiesMap.put(name, value)
}
}

tasks.withType<KotlinCompile> {
compilerOptions {
freeCompilerArgs.set(listOf("-Xjsr305=strict"))
}
dependsOn(":executors:jar")
dependsOn(":indexation:run")
buildPropertyFile()
dependsOn(propertiesGenerator)
}
println("Using Kotlin compiler ${libs.versions.kotlin.get()}")

Expand All @@ -129,18 +182,19 @@ tasks.withType<BootJar> {
requiresUnpack("**/kotlinx-*.jar")
}

val prepareComposeWasmResources by tasks.registering(Sync::class) {
from(composeWasmStaticResources)
into(layout.buildDirectory.dir("compose-wasm-resources"))
}

val buildLambda by tasks.creating(Zip::class) {
val propertyFile = propertyFile
val propertyFileContent = generateProperties("/var/task/")

from(tasks.compileKotlin)
from(tasks.processResources) {
eachFile {
if (name == propertyFile) {
file.writeText(propertyFileContent)
}
}
exclude(propertyFile)
}
from(lambdaPropertiesGenerator)
from(policy)
from(indexes)
from(indexesJs)
Expand All @@ -150,20 +204,18 @@ val buildLambda by tasks.creating(Zip::class) {
from(libWasmFolder) { into(libWasm) }
from(libComposeWasmFolder) { into(libComposeWasm) }
from(libJVMFolder) { into(libJVM) }
from(compilerPluginsForJVMFolder) {into(compilerPluginsForJVM)}
from(compilerPluginsForJVMFolder) { into(compilerPluginsForJVM) }
from(libComposeWasmCompilerPluginsFolder) { into(libComposeWasmCompilerPlugins) }
dependsOn(kotlinComposeWasmStdlibFile)
into("lib") {
from(configurations.compileClasspath) { exclude("tomcat-embed-*") }
}

dependsOn(prepareComposeWasmResources)
}

tasks.named<Copy>("processResources") {
val archiveOperation = project.serviceOf<ArchiveOperations>()
from(resourceDependency.map {
archiveOperation.zipTree(it)
}) {
into("com/compiler/server")
}
dependsOn(propertiesGenerator)
}

tasks.withType<Test> {
Expand Down
10 changes: 10 additions & 0 deletions buildSrc/src/main/kotlin/CacheAttribute.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import org.gradle.api.attributes.Attribute

enum class CacheAttribute {
FULL,
WASM;

companion object {
val cacheAttribute = Attribute.of("org.jetbrains.kotlin-compiler-server.cache", CacheAttribute::class.java)
}
}
8 changes: 8 additions & 0 deletions buildSrc/src/main/kotlin/CategoryAttribute.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import org.gradle.api.attributes.Category
import org.gradle.api.model.ObjectFactory

val ObjectFactory.categoryComposeCache
get() = named(Category::class.java, "compose-cache")

val ObjectFactory.categoryComposeWasmResources
get() = named(Category::class.java, "compose-wasm-resources")
57 changes: 57 additions & 0 deletions buildSrc/src/main/kotlin/PropertiesUpdater.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import org.gradle.api.DefaultTask
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.MapProperty
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import java.io.File
import java.io.FileInputStream
import java.security.MessageDigest

abstract class PropertiesGenerator : DefaultTask() {

@get:InputFile
abstract val hashableFile: RegularFileProperty

@get:Input
abstract val propertiesMap: MapProperty<String, String>

@get:OutputFile
abstract val propertiesFile: RegularFileProperty

@TaskAction
fun updateProperties() {
val file = propertiesFile.get().asFile

propertiesMap.get().let {
if (it.isNotEmpty()) {
file.writeText("")
it.forEach { (key, value) ->
file.appendText("$key=$value\n")
}
}
}

file.appendText(
"\ndependencies.compose.wasm=${hashFileContent(hashableFile.get().asFile.absolutePath)}"
)
}
}

fun hashFileContent(filePath: String, hashAlgorithm: String = "SHA-256"): String {
val file = File(filePath)
val digest = MessageDigest.getInstance(hashAlgorithm)

// Read the file content in chunks and update the digest
FileInputStream(file).use { fileInputStream ->
val buffer = ByteArray(1024)
var bytesRead: Int
while (fileInputStream.read(buffer).also { bytesRead = it } != -1) {
digest.update(buffer, 0, bytesRead)
}
}

// Convert the resulting byte array to a readable hex string
return digest.digest().joinToString("") { "%02x".format(it) }
}
1 change: 1 addition & 0 deletions buildSrc/src/main/kotlin/lambda.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
val lambdaPrefix = "/var/task/"
2 changes: 1 addition & 1 deletion buildSrc/src/main/kotlin/properties.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import org.gradle.accessors.dm.LibrariesForLibs
import org.gradle.api.Project
import org.gradle.kotlin.dsl.provideDelegate
import org.gradle.accessors.dm.LibrariesForLibs
import org.gradle.kotlin.dsl.the

val indexes: String by System.getProperties()
Expand Down
Loading
Loading