app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit 2d008582eb1ae1f1282e33f0e6bf6b9782ae61a4
parent 2b5fe5d8321fd0e248a9d304651b1ba54ee6a180
Author: triesap <tyson@radroots.org>
Date:   Thu,  6 Aug 2026 20:26:07 +0000

studio: cut product over to canonical source

- pin every Rust dependency to the canonical lib revision
- materialize native artifacts from the governed source lock
- update Kotlin hosts for the canonical FFI contract
- route Studio verification outputs through extbuild

Diffstat:
A.radroots-consumer-root | 1+
MMakefile | 58++++++++++++++++++++++++++++++----------------------------
Mapp/desktop/build.gradle.kts | 187+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
Mapp/desktop/src/main/kotlin/org/radroots/studio/application/NativeCompatibility.kt | 12++++++++----
Mapp/desktop/src/main/kotlin/org/radroots/studio/application/StudioCoreGateway.kt | 23+++++++++++++++--------
Mapp/desktop/src/test/kotlin/org/radroots/studio/application/NativeCompatibilityTest.kt | 8++++++--
Mbuild.gradle.kts | 5+++++
Mcore/Cargo.lock | 554+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Mcore/Cargo.toml | 29++++++++++-------------------
Acore/crates/source_lock/Cargo.toml | 20++++++++++++++++++++
Acore/crates/source_lock/src/lib.rs | 1+
Aradroots.lib.source-lock.v1.toml | 9+++++++++
12 files changed, 692 insertions(+), 215 deletions(-)

diff --git a/.radroots-consumer-root b/.radroots-consumer-root @@ -0,0 +1 @@ +studio diff --git a/Makefile b/Makefile @@ -3,6 +3,7 @@ GRADLE ?= ./gradlew CARGO ?= cargo CARGO_MANIFEST := core/Cargo.toml +EXTBUILD := cargo extbuild run -- .PHONY: help doctor format format-fix lint test check build bindings dev run audit licenses package release-check clean @@ -10,59 +11,60 @@ help: @printf '%s\n' doctor format format-fix lint test check build bindings dev run audit licenses package release-check clean doctor: - java -version - $(CARGO) --version - $(GRADLE) --version + cargo extbuild doctor + $(EXTBUILD) java -version + $(EXTBUILD) $(CARGO) --version + $(EXTBUILD) $(GRADLE) --version format: doctor - $(CARGO) fmt --manifest-path $(CARGO_MANIFEST) --all -- --check - $(GRADLE) --no-daemon :app:desktop:ktlintCheck + $(EXTBUILD) $(CARGO) fmt --manifest-path $(CARGO_MANIFEST) --all -- --check + $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:ktlintCheck format-fix: doctor - $(CARGO) fmt --manifest-path $(CARGO_MANIFEST) --all - $(GRADLE) --no-daemon :app:desktop:ktlintFormat + $(EXTBUILD) $(CARGO) fmt --manifest-path $(CARGO_MANIFEST) --all + $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:ktlintFormat lint: doctor - $(CARGO) clippy --manifest-path $(CARGO_MANIFEST) --workspace --all-targets -- -D warnings - $(GRADLE) --no-daemon :app:desktop:detekt + $(EXTBUILD) $(CARGO) clippy --manifest-path $(CARGO_MANIFEST) --workspace --all-targets --locked -- -D warnings + $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:detekt test: doctor - $(CARGO) test --manifest-path $(CARGO_MANIFEST) --workspace - $(GRADLE) --no-daemon :app:desktop:test + $(EXTBUILD) $(CARGO) test --manifest-path $(CARGO_MANIFEST) --workspace --locked + $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:test check: format lint test - $(GRADLE) --no-daemon :app:desktop:check + $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:check build: doctor - $(CARGO) build --manifest-path $(CARGO_MANIFEST) --workspace - $(GRADLE) --no-daemon :app:desktop:build + $(EXTBUILD) $(CARGO) build --manifest-path $(CARGO_MANIFEST) --workspace --locked + $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:build bindings: doctor - $(GRADLE) --no-daemon :app:desktop:verifyUniFfiBindings :app:desktop:verifyReleaseNativeLibrary + $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:verifyUniFfiBindings :app:desktop:verifyReleaseNativeLibrary dev: doctor - $(GRADLE) :app:desktop:hotRun --mainClass org.radroots.studio.desktop.MainKt + $(EXTBUILD) $(GRADLE) :app:desktop:hotRun --mainClass org.radroots.studio.desktop.MainKt run: doctor - $(GRADLE) :app:desktop:run + $(EXTBUILD) $(GRADLE) :app:desktop:run audit: doctor - $(CARGO) audit --file core/Cargo.lock - $(CARGO) deny --manifest-path $(CARGO_MANIFEST) check --config core/deny.toml advisories - $(GRADLE) --no-daemon --no-configuration-cache :app:desktop:dependencyCheckAnalyze + $(EXTBUILD) $(CARGO) audit --file core/Cargo.lock + $(EXTBUILD) $(CARGO) deny --manifest-path $(CARGO_MANIFEST) check --config core/deny.toml advisories + $(EXTBUILD) $(GRADLE) --no-daemon --no-configuration-cache :app:desktop:dependencyCheckAnalyze licenses: doctor - $(CARGO) deny --manifest-path $(CARGO_MANIFEST) check --config core/deny.toml licenses sources - $(GRADLE) --no-daemon --no-parallel --no-configuration-cache :app:desktop:checkLicense + $(EXTBUILD) $(CARGO) deny --manifest-path $(CARGO_MANIFEST) check --config core/deny.toml licenses sources + $(EXTBUILD) $(GRADLE) --no-daemon --no-parallel --no-configuration-cache :app:desktop:checkLicense package: check - $(GRADLE) --no-daemon :app:desktop:verifyMacOsPackage + $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:verifyMacOsPackage release-check: doctor - $(CARGO) audit --file core/Cargo.lock - $(CARGO) deny --manifest-path $(CARGO_MANIFEST) check --config core/deny.toml advisories licenses sources - $(GRADLE) --no-daemon --no-parallel --no-configuration-cache :app:desktop:releaseReadiness + $(EXTBUILD) $(CARGO) audit --file core/Cargo.lock + $(EXTBUILD) $(CARGO) deny --manifest-path $(CARGO_MANIFEST) check --config core/deny.toml advisories licenses sources + $(EXTBUILD) $(GRADLE) --no-daemon --no-parallel --no-configuration-cache :app:desktop:releaseReadiness clean: doctor - $(CARGO) clean --manifest-path $(CARGO_MANIFEST) - $(GRADLE) --no-daemon clean + $(EXTBUILD) $(CARGO) clean --manifest-path $(CARGO_MANIFEST) + $(EXTBUILD) $(GRADLE) --no-daemon clean diff --git a/app/desktop/build.gradle.kts b/app/desktop/build.gradle.kts @@ -18,6 +18,7 @@ import org.gradle.api.tasks.testing.Test import org.gradle.jvm.tasks.Jar import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import java.io.File import java.util.Properties import java.util.jar.JarFile @@ -61,31 +62,48 @@ configure<org.jlleitschuh.gradle.ktlint.KtlintExtension> { ), ) filter { - exclude { it.file.path.contains("/build/generated/") } + exclude("**/generated/uniffi/**") } } -tasks.withType<org.jlleitschuh.gradle.ktlint.tasks.BaseKtLintCheckTask>().configureEach { - exclude { it.file.path.contains("/build/generated/") } -} +val extBuildGradleRoot = + providers.environmentVariable("EXT_BUILD_GRADLE_BUILD_DIR").orNull + ?: throw GradleException("EXT_BUILD_GRADLE_BUILD_DIR is required; run Gradle through cargo extbuild") +val cargoTargetRoot = + providers.environmentVariable("CARGO_TARGET_DIR").orNull + ?: throw GradleException("CARGO_TARGET_DIR is required; run Gradle through cargo extbuild") +layout.buildDirectory.set(file(extBuildGradleRoot).resolve("app-desktop")) -val rustManifest = rootProject.layout.projectDirectory.file("core/Cargo.toml") -val compatibilityBaseline = rootProject.layout.projectDirectory.file("core/compatibility/v5-baseline.properties") +val radrootsOffline = + providers + .gradleProperty("radrootsOffline") + .map(String::toBooleanStrict) + .orElse(false) +val immutableCargoArguments = + if (radrootsOffline.get()) { + listOf("--frozen", "--offline") + } else { + listOf("--locked") + } + +val sourceLockFile = rootProject.layout.projectDirectory.file("radroots.lib.source-lock.v1.toml") -fun workspacePackageVersion(manifest: File): String { - val packageSection = - manifest - .readText() - .substringAfter("[workspace.package]", missingDelimiterValue = "") - .substringBefore("\n[") - return Regex("""(?m)^version\s*=\s*"([^"]+)"\s*$""") - .find(packageSection) +fun sourceLockValue(key: String): String { + val expression = Regex("""(?m)^${Regex.escape(key)}\s*=\s*"([^"]+)"\s*$""") + return expression + .find(sourceLockFile.asFile.readText()) ?.groupValues ?.get(1) - ?: throw GradleException("Cargo workspace package version is missing") + ?: throw GradleException("Source lock is missing $key") } -val appVersion = workspacePackageVersion(rustManifest.asFile) +val radrootsLibRepository = sourceLockValue("repository") +val radrootsLibRevision = sourceLockValue("revision") +val radrootsLibVersion = sourceLockValue("version") +val radrootsLibSource = file(extBuildGradleRoot).resolve("source/lib") +val rustManifest = radrootsLibSource.resolve("Cargo.toml") +val compatibilityBaseline = rootProject.layout.projectDirectory.file("core/compatibility/v5-baseline.properties") +val appVersion = radrootsLibVersion val macOsBuildVersion = "1" val baseline = Properties().apply { @@ -109,19 +127,102 @@ val applicationNamespace = baselineValue("package.namespace") version = appVersion val rustSources = - rootProject.fileTree("core") { + fileTree(radrootsLibSource) { include( - "**/Cargo.toml", + "Cargo.toml", "Cargo.lock", "rust-toolchain.toml", - "**/*.rs", - "**/*.sql", - "**/uniffi.toml", - "compatibility/**", + "contracts/crates/catalog.v1.toml", + "crates/studio_*/**", + "tools/xtask/**", ) exclude("target/**") } +abstract class SyncRadrootsLibSource : DefaultTask() { + @get:Input + abstract val repository: Property<String> + + @get:Input + abstract val revision: Property<String> + + @get:Input + abstract val offline: Property<Boolean> + + @get:OutputDirectory + abstract val sourceDirectory: DirectoryProperty + + @TaskAction + fun sync() { + val source = sourceDirectory.get().asFile + if (!source.resolve(".git").isDirectory) { + require(!offline.get()) { "Canonical source is not cached and offline mode is enabled" } + source.parentFile.mkdirs() + command(source.parentFile, "git", "clone", "--filter=blob:none", "--no-checkout", repository.get(), source.absolutePath) + } + require(command(source, "git", "remote", "get-url", "origin").trim() == repository.get()) { + "Canonical source cache origin does not match the source lock" + } + if (!offline.get()) { + command(source, "git", "fetch", "--force", "--no-tags", "origin", revision.get()) + } + command(source, "git", "cat-file", "-e", "${revision.get()}^{commit}") + command(source, "git", "checkout", "--detach", revision.get()) + require(command(source, "git", "rev-parse", "HEAD").trim() == revision.get()) { + "Materialized source revision does not match the source lock" + } + require(command(source, "git", "status", "--porcelain", "--untracked-files=all").isBlank()) { + "Materialized source tree is not clean" + } + } + + private fun command( + workingDirectory: File, + vararg command: String, + ): String { + val process = + ProcessBuilder(*command) + .directory(workingDirectory) + .redirectErrorStream(true) + .start() + val output = process.inputStream.bufferedReader().use { it.readText() } + require(process.waitFor() == 0) { + "${command.joinToString(" ")} failed: ${output.trim()}" + } + return output + } +} + +val syncRadrootsLibSource by tasks.registering(SyncRadrootsLibSource::class) { + repository.set(radrootsLibRepository) + revision.set(radrootsLibRevision) + offline.set( + radrootsOffline, + ) + sourceDirectory.set(radrootsLibSource) + outputs.upToDateWhen { false } +} + +val validateRadrootsSourceLock by tasks.registering(Exec::class) { + dependsOn(syncRadrootsLibSource) + workingDir(rootProject.projectDir) + commandLine( + "cargo", + "run", + "--manifest-path", + rustManifest.absolutePath, + "-p", + "xtask", + *immutableCargoArguments.toTypedArray(), + "--", + "source-lock", + "--consumer-root", + rootProject.projectDir.absolutePath, + ) + inputs.file(sourceLockFile) + inputs.file(rootProject.layout.projectDirectory.file("core/Cargo.lock")) +} + data class NativeTarget( val libraryName: String, val jnaPrefix: String, @@ -156,35 +257,41 @@ val nativeTarget = providers.gradleProperty("nativeArch").getOrElse(System.getProperty("os.arch")), ) val rustLibraryName = nativeTarget.libraryName -val rustDebugLibrary = rootProject.layout.projectDirectory.file("core/target/debug/$rustLibraryName") -val rustReleaseLibrary = rootProject.layout.projectDirectory.file("core/target/release/$rustLibraryName") +val rustDebugLibrary = file(cargoTargetRoot).resolve("debug/$rustLibraryName") +val rustReleaseLibrary = file(cargoTargetRoot).resolve("release/$rustLibraryName") val jnaPlatformPrefix = nativeTarget.jnaPrefix val buildRustCoreDebug by tasks.registering(Exec::class) { + dependsOn(validateRadrootsSourceLock) workingDir(rootProject.projectDir) commandLine( "cargo", "build", "--manifest-path", - rustManifest.asFile.absolutePath, + rustManifest.absolutePath, "-p", - "radroots-studio-ffi", + "radroots_studio_ffi", + *immutableCargoArguments.toTypedArray(), ) + environment("RADROOTS_SOURCE_SHA", radrootsLibRevision) inputs.files(rustSources) outputs.file(rustDebugLibrary) } val buildRustCoreRelease by tasks.registering(Exec::class) { + dependsOn(validateRadrootsSourceLock) workingDir(rootProject.projectDir) commandLine( "cargo", "build", "--release", "--manifest-path", - rustManifest.asFile.absolutePath, + rustManifest.absolutePath, "-p", - "radroots-studio-ffi", + "radroots_studio_ffi", + *immutableCargoArguments.toTypedArray(), ) + environment("RADROOTS_SOURCE_SHA", radrootsLibRevision) inputs.files(rustSources) outputs.file(rustReleaseLibrary) } @@ -201,9 +308,10 @@ val generateUniFfiKotlin by tasks.registering(Exec::class) { "cargo", "run", "--manifest-path", - rustManifest.asFile.absolutePath, + rustManifest.absolutePath, "-p", - "radroots-studio-uniffi-bindgen", + "radroots_studio_uniffi_bindgen", + *immutableCargoArguments.toTypedArray(), "--", "generate", "--library", @@ -212,15 +320,13 @@ val generateUniFfiKotlin by tasks.registering(Exec::class) { "--metadata-no-deps", "--no-format", "--config", - rootProject.layout.projectDirectory - .file("core/crates/ffi/uniffi.toml") - .asFile.absolutePath, + radrootsLibSource.resolve("crates/studio_ffi/uniffi.toml").absolutePath, "--out-dir", generatedUniFfiKotlin.get().asFile.absolutePath, - rustDebugLibrary.asFile.absolutePath, + rustDebugLibrary.absolutePath, ) inputs.file(rustDebugLibrary) - inputs.file(rootProject.layout.projectDirectory.file("core/crates/ffi/uniffi.toml")) + inputs.file(radrootsLibSource.resolve("crates/studio_ffi/uniffi.toml")) outputs.dir(generatedUniFfiKotlin) } @@ -541,10 +647,6 @@ tasks.withType<Test>().configureEach { } kotlin { - sourceSets.main { - kotlin.srcDir(generatedUniFfiKotlin) - } - compilerOptions { jvmTarget.set(JvmTarget.JVM_21) } @@ -552,8 +654,9 @@ kotlin { jvmToolchain(21) } -tasks.named("compileKotlin") { +tasks.named<KotlinCompile>("compileKotlin") { dependsOn(generateUniFfiKotlin) + source(generatedUniFfiKotlin) } tasks.named("runKtlintCheckOverMainSourceSet") { dependsOn(generateUniFfiKotlin) @@ -572,7 +675,7 @@ tasks.withType<Test>().configureEach { ) systemProperty( "jna.library.path", - rustDebugLibrary.asFile.parentFile.absolutePath, + rustDebugLibrary.parentFile.absolutePath, ) } tasks.withType<JavaExec>().configureEach { @@ -580,7 +683,7 @@ tasks.withType<JavaExec>().configureEach { systemProperty("radroots.studio.development", "true") systemProperty( "jna.library.path", - rustDebugLibrary.asFile.parentFile.absolutePath, + rustDebugLibrary.parentFile.absolutePath, ) } diff --git a/app/desktop/src/main/kotlin/org/radroots/studio/application/NativeCompatibility.kt b/app/desktop/src/main/kotlin/org/radroots/studio/application/NativeCompatibility.kt @@ -3,11 +3,13 @@ package org.radroots.studio.application import org.radroots.studio.ffi.CompatibilityDescriptor import org.radroots.studio.ffi.CompatibilityExpectation -internal const val EXPECTED_FFI_CONTRACT_HASH = "radroots-studio-native-v2-2026-08-03" -internal val EXPECTED_FFI_CONTRACT_MAJOR: UShort = 2.toUShort() +internal const val EXPECTED_PRODUCT_VERSION = "0.1.0-alpha" +internal const val EXPECTED_CARGO_PACKAGE_VERSION = "0.1.0-alpha" +internal const val EXPECTED_FFI_CONTRACT_HASH = "6804ed2b522cb033bf085d94cd4f9a358a60bd48fb52e73f7a308624eb85ab05" +internal val EXPECTED_FFI_CONTRACT_MAJOR: UShort = 3.toUShort() internal val MINIMUM_FFI_CONTRACT_MINOR: UShort = 0.toUShort() internal const val MINIMUM_STORAGE_SCHEMA: UInt = 5U -internal const val MAXIMUM_STORAGE_SCHEMA: UInt = 9U +internal const val MAXIMUM_STORAGE_SCHEMA: UInt = 10U internal class NativeCompatibilityException : IllegalStateException( @@ -16,7 +18,9 @@ internal class NativeCompatibilityException : internal fun verifyNativeCompatibility(descriptor: CompatibilityDescriptor): CompatibilityExpectation { val compatible = - descriptor.contractMajor == EXPECTED_FFI_CONTRACT_MAJOR && + descriptor.productVersion == EXPECTED_PRODUCT_VERSION && + descriptor.cargoPackageVersion == EXPECTED_CARGO_PACKAGE_VERSION && + descriptor.contractMajor == EXPECTED_FFI_CONTRACT_MAJOR && descriptor.contractMinor >= MINIMUM_FFI_CONTRACT_MINOR && descriptor.contractHash == EXPECTED_FFI_CONTRACT_HASH && descriptor.currentSchemaVersion >= MINIMUM_STORAGE_SCHEMA && diff --git a/app/desktop/src/main/kotlin/org/radroots/studio/application/StudioCoreGateway.kt b/app/desktop/src/main/kotlin/org/radroots/studio/application/StudioCoreGateway.kt @@ -160,7 +160,7 @@ class NativeStudioCoreGateway( return try { val request = core.beginGeneratedAccountV2() try { - NativeGeneratedRecoveryTicket(core, request, requestId, request.account()) + NativeGeneratedRecoveryTicket(core, request, ::requestContext, requestId, request.account()) } catch (error: Exception) { request.close() throw error @@ -182,7 +182,7 @@ class NativeStudioCoreGateway( override suspend fun confirmAccountRemoval(ticket: RemovalTicket): AppSnapshotDto { require(ticket is NativeRemovalTicket) { "Removal ticket does not belong to native core" } - return core.confirmAccountRemoval(ticket.request) + return core.confirmAccountRemoval(requestContext(), ticket.request) } override fun shutdown(): StudioShutdownReceipt = @@ -234,8 +234,11 @@ private class NativeSubscription( private val subscription: ObserverSubscription, ) : AutoCloseable { override fun close() { - subscription.unsubscribe() - subscription.close() + try { + runBlocking { subscription.unsubscribe() } + } finally { + subscription.close() + } } } @@ -255,6 +258,7 @@ private class NativeRemovalTicket( private class NativeGeneratedRecoveryTicket( private val core: StudioAppCore, private val request: GeneratedRecoveryRequest, + private val requestContext: () -> RequestContextDto, override val requestId: String, override val account: AccountDto, ) : GeneratedRecoveryTicket { @@ -270,10 +274,12 @@ private class NativeGeneratedRecoveryTicket( ) } - override suspend fun acknowledge(): AppSnapshotDto = - call("The generated account could not be saved.") { - core.acknowledgeGeneratedAccountV2(request) + override suspend fun acknowledge(): AppSnapshotDto { + val context = requestContext() + return call("The generated account could not be saved.", context.requestId) { + core.acknowledgeGeneratedAccountV2(context, request) } + } override suspend fun cancel(): Boolean = call("The generated key could not be cancelled safely.") { @@ -286,6 +292,7 @@ private class NativeGeneratedRecoveryTicket( private suspend fun <T> call( fallbackSafeMessage: String, + correlationId: String = requestId, operation: suspend () -> T, ): T = try { @@ -294,7 +301,7 @@ private class NativeGeneratedRecoveryTicket( throw error } catch (error: Exception) { throw StudioGatewayException( - error.toStudioCommandFailure(requestId, fallbackSafeMessage), + error.toStudioCommandFailure(correlationId, fallbackSafeMessage), ) } } diff --git a/app/desktop/src/test/kotlin/org/radroots/studio/application/NativeCompatibilityTest.kt b/app/desktop/src/test/kotlin/org/radroots/studio/application/NativeCompatibilityTest.kt @@ -14,10 +14,12 @@ class NativeCompatibilityTest { assertEquals(EXPECTED_FFI_CONTRACT_HASH, expectation.contractHash) listOf( - descriptor.copy(contractMajor = 3.toUShort()), + descriptor.copy(productVersion = "wrong"), + descriptor.copy(cargoPackageVersion = "wrong"), + descriptor.copy(contractMajor = 4.toUShort()), descriptor.copy(contractHash = "wrong"), descriptor.copy(currentSchemaVersion = 4U), - descriptor.copy(minimumSchemaVersion = 10U), + descriptor.copy(minimumSchemaVersion = 11U), ).forEach { incompatible -> assertFailsWith<NativeCompatibilityException> { verifyNativeCompatibility(incompatible) @@ -27,6 +29,8 @@ class NativeCompatibilityTest { private fun compatibleDescriptor() = CompatibilityDescriptor( + productVersion = EXPECTED_PRODUCT_VERSION, + cargoPackageVersion = EXPECTED_CARGO_PACKAGE_VERSION, contractMajor = EXPECTED_FFI_CONTRACT_MAJOR, contractMinor = MINIMUM_FFI_CONTRACT_MINOR, contractHash = EXPECTED_FFI_CONTRACT_HASH, diff --git a/build.gradle.kts b/build.gradle.kts @@ -3,3 +3,8 @@ plugins { alias(libs.plugins.compose.multiplatform) apply false alias(libs.plugins.compose.compiler) apply false } + +val extBuildGradleRoot = + providers.environmentVariable("EXT_BUILD_GRADLE_BUILD_DIR").orNull + ?: error("EXT_BUILD_GRADLE_BUILD_DIR is required; run Gradle through cargo extbuild") +layout.buildDirectory.set(file(extBuildGradleRoot).resolve("root")) diff --git a/core/Cargo.lock b/core/Cargo.lock @@ -40,20 +40,14 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] [[package]] -name = "anstyle" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" - -[[package]] name = "anyhow" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -61,9 +55,9 @@ checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "apple-native-keyring-store" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "797f94b6a53d7d10b56dc18290e0d40a2158352f108bb4ff32350825081a9f29" +checksum = "2b350bfd03649e07aa05c0a81b3e15934374e585c98204a57e20b9d49f49bb9a" dependencies = [ "keyring-core", "log", @@ -325,6 +319,12 @@ dependencies = [ ] [[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -548,45 +548,6 @@ dependencies = [ ] [[package]] -name = "clap" -version = "4.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301b56658598e48f3648647ac6fc887be7e7108eddfa4e9b63fcf3ec58c0cadf" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94a65403d1a1bd28f7dc68eb8506e8874808ee5eecb59298de588e2e1407a078" -dependencies = [ - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "clap_lex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" - -[[package]] name = "concurrent-queue" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -596,6 +557,12 @@ dependencies = [ ] [[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] name = "core-foundation" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -627,6 +594,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] name = "crypto-common" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -639,9 +618,19 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] [[package]] name = "deranged" @@ -699,6 +688,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" [[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "ff", + "generic-array", + "group", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] name = "endi" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -780,6 +786,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] name = "find-msvc-tools" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -916,6 +932,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -939,11 +956,22 @@ checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", ] [[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + +[[package]] name = "gimli" version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -979,6 +1007,17 @@ dependencies = [ ] [[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1156,6 +1195,16 @@ dependencies = [ [[package]] name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" @@ -1227,6 +1276,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] name = "js-sys" version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1238,6 +1293,16 @@ dependencies = [ ] [[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "elliptic-curve", +] + +[[package]] name = "keyring" version = "4.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1309,6 +1374,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" [[package]] +name = "mediatype" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120fa187be19d9962f0926633453784691731018a2bf936ddb4e29101b79c4a7" + +[[package]] name = "memchr" version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1389,13 +1460,49 @@ dependencies = [ ] [[package]] +name = "nostr" +version = "0.44.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ff7b77ef428b40aa2834a6acbae38a0e104c98b306208ca4b87a420d579a4b" +dependencies = [ + "aes", + "base64", + "bech32", + "bip39", + "bitcoin_hashes", + "cbc", + "chacha20", + "chacha20poly1305", + "getrandom 0.2.17", + "hex", + "instant", + "scrypt", + "secp256k1", + "serde", + "serde_json", + "unicode-normalization", + "url", + "url-fork", +] + +[[package]] name = "nostr-database" version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7462c9d8ae5ef6a28d66a192d399ad2530f1f2130b13186296dbb11bdef5b3d1" dependencies = [ "lru", - "nostr", + "nostr 0.44.8", + "tokio", +] + +[[package]] +name = "nostr-database" +version = "0.44.0" +source = "git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219" +dependencies = [ + "lru", + "nostr 0.44.1", "tokio", ] @@ -1405,22 +1512,30 @@ version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ade30de16869618919c6b5efc8258f47b654a98b51541eb77f85e8ec5e3c83a6" dependencies = [ - "nostr", + "nostr 0.44.8", ] [[package]] -name = "nostr-relay-builder" -version = "0.44.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08ed09e8363503c6f464087b530a1f43cf68be6292bd4928b5ea1141b03dc11c" +name = "nostr-gossip" +version = "0.44.0" +source = "git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219" +dependencies = [ + "nostr 0.44.1", +] + +[[package]] +name = "nostr-relay-pool" +version = "0.44.0" +source = "git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219" dependencies = [ "async-utility", "async-wsocket", "atomic-destructor", "hex", + "lru", "negentropy", - "nostr", - "nostr-database", + "nostr 0.44.1", + "nostr-database 0.44.0 (git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219)", "tokio", "tracing", ] @@ -1437,8 +1552,22 @@ dependencies = [ "hex", "lru", "negentropy", - "nostr", - "nostr-database", + "nostr 0.44.8", + "nostr-database 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio", + "tracing", +] + +[[package]] +name = "nostr-sdk" +version = "0.44.0" +source = "git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219" +dependencies = [ + "async-utility", + "nostr 0.44.1", + "nostr-database 0.44.0 (git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219)", + "nostr-gossip 0.44.0 (git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219)", + "nostr-relay-pool 0.44.0", "tokio", "tracing", ] @@ -1450,10 +1579,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "471732576710e779b64f04c55e3f8b5292f865fea228436daf19694f0bf70393" dependencies = [ "async-utility", - "nostr", - "nostr-database", - "nostr-gossip", - "nostr-relay-pool", + "nostr 0.44.8", + "nostr-database 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)", + "nostr-gossip 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)", + "nostr-relay-pool 0.44.3", "tokio", "tracing", ] @@ -1718,75 +1847,233 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] -name = "radroots-studio-application" +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radroots_blossom" +version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" +dependencies = [ + "mediatype", + "serde", + "sha2", + "unicode-general-category", + "url", +] + +[[package]] +name = "radroots_core" +version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" +dependencies = [ + "rust_decimal", + "serde", +] + +[[package]] +name = "radroots_event" version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" dependencies = [ - "nostr", - "nostr-relay-builder", - "nostr-sdk", - "radroots-studio-domain", - "radroots-studio-nostr", + "hex", + "jiff-tzdb", + "radroots_blossom", + "radroots_core", + "radroots_identity", + "radroots_protocol", + "serde", + "serde_json", + "sha2", + "unicode-general-category", + "url", +] + +[[package]] +name = "radroots_event_codec" +version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" +dependencies = [ + "hex", + "radroots_blossom", + "radroots_core", + "radroots_event", + "radroots_identity", + "radroots_protocol", + "secp256k1", + "serde", + "serde_json", + "sha2", +] + +[[package]] +name = "radroots_identity" +version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" +dependencies = [ + "k256", + "serde", + "thiserror 2.0.19", +] + +[[package]] +name = "radroots_nostr" +version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" +dependencies = [ + "nostr 0.44.8", + "radroots_event", + "radroots_event_codec", + "radroots_identity", + "serde", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "radroots_protocol" +version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" +dependencies = [ + "serde", +] + +[[package]] +name = "radroots_studio_application" +version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" +dependencies = [ + "radroots_studio_domain", "secrecy", "tokio", ] [[package]] -name = "radroots-studio-domain" +name = "radroots_studio_domain" version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" dependencies = [ "bech32", + "radroots_identity", "secrecy", "url", "zeroize", ] [[package]] -name = "radroots-studio-ffi" +name = "radroots_studio_ffi" version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" dependencies = [ "directories", - "nostr", - "nostr-relay-builder", - "nostr-sdk", - "radroots-studio-application", - "radroots-studio-domain", - "radroots-studio-storage", - "tempfile", + "quote", + "radroots_studio_application", + "radroots_studio_domain", + "radroots_studio_nostr", + "radroots_studio_runtime", + "radroots_studio_storage", + "sha2", + "syn 2.0.119", "tokio", "uniffi", ] [[package]] -name = "radroots-studio-nostr" +name = "radroots_studio_nostr" version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" +dependencies = [ + "nostr 0.44.1", + "nostr-sdk 0.44.0", + "radroots_identity", + "radroots_studio_application", + "radroots_studio_domain", + "radroots_transport", + "radroots_transport_nostr", + "tokio", +] + +[[package]] +name = "radroots_studio_preferences" +version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" dependencies = [ - "nostr", - "radroots-studio-domain", + "url", ] [[package]] -name = "radroots-studio-storage" +name = "radroots_studio_runtime" version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" +dependencies = [ + "radroots_studio_application", + "radroots_studio_domain", + "radroots_studio_nostr", + "radroots_studio_storage", + "tokio", + "uuid", +] + +[[package]] +name = "radroots_studio_source_lock" +version = "0.1.0-alpha" +dependencies = [ + "radroots_studio_application", + "radroots_studio_domain", + "radroots_studio_ffi", + "radroots_studio_nostr", + "radroots_studio_preferences", + "radroots_studio_runtime", + "radroots_studio_storage", +] + +[[package]] +name = "radroots_studio_storage" +version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" dependencies = [ "fs2", + "getrandom 0.2.17", + "hmac", "keyring", - "nostr", - "nostr-relay-builder", - "nostr-sdk", - "radroots-studio-application", - "radroots-studio-domain", + "radroots_studio_application", + "radroots_studio_domain", "refinery", "rusqlite", - "tempfile", - "tokio", + "rustix", + "sha2", "zeroize", ] [[package]] -name = "radroots-studio-uniffi-bindgen" +name = "radroots_transport" version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" dependencies = [ - "uniffi", + "radroots_event", + "radroots_identity", + "radroots_protocol", + "sha2", +] + +[[package]] +name = "radroots_transport_nostr" +version = "0.1.0-alpha" +source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3" +dependencies = [ + "async-wsocket", + "nostr-relay-pool 0.44.3", + "nostr-sdk 0.44.1", + "radroots_event_codec", + "radroots_nostr", + "radroots_protocol", + "radroots_transport", + "serde_json", + "tokio", + "tokio-tungstenite", + "url", ] [[package]] @@ -1914,9 +2201,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.16" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -1969,6 +2256,18 @@ dependencies = [ ] [[package]] +name = "rust_decimal" +version = "1.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2a24f50780bc85f09cc6ac299bdf1424302742d77221106859c9d8b102126a" +dependencies = [ + "arrayvec", + "num-traits", + "serde", + "wasm-bindgen", +] + +[[package]] name = "rustc-demangle" version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2084,6 +2383,19 @@ dependencies = [ ] [[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "subtle", + "zeroize", +] + +[[package]] name = "secp256k1" version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2324,12 +2636,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2370,12 +2676,12 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.23.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.3", "once_cell", "rustix", "windows-sys 0.61.2", @@ -2671,6 +2977,18 @@ dependencies = [ ] [[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-general-category" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f" + +[[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2692,9 +3010,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a782a48d72cfd7a2d65cfc7c691dbf5375c43104b3c195f7eccc716dcc3540c8" dependencies = [ "anyhow", - "camino", "cargo_metadata", - "clap", "uniffi_bindgen", "uniffi_core", "uniffi_macros", @@ -2829,13 +3145,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", - "idna", + "idna 1.1.0", "percent-encoding", "serde", "serde_derive", ] [[package]] +name = "url-fork" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fa3323c39b8e786154d3000b70ae9af0e9bd746c9791456da0d4a1f68ad89d6" +dependencies = [ + "form_urlencoded", + "idna 0.5.0", + "percent-encoding", + "serde", +] + +[[package]] name = "utf-8" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2853,6 +3181,7 @@ version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" dependencies = [ + "getrandom 0.4.3", "js-sys", "serde_core", "wasm-bindgen", @@ -2904,6 +3233,7 @@ dependencies = [ "cfg-if", "once_cell", "rustversion", + "serde", "wasm-bindgen-macro", "wasm-bindgen-shared", ] @@ -3246,18 +3576,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.55" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.55" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" dependencies = [ "proc-macro2", "quote", diff --git a/core/Cargo.toml b/core/Cargo.toml @@ -1,5 +1,6 @@ [workspace] -members = [ +members = ["crates/source_lock"] +exclude = [ "crates/application", "crates/domain", "crates/ffi", @@ -14,7 +15,7 @@ version = "0.1.0-alpha" edition = "2024" rust-version = "1.97.1" license = "GPL-3.0-only" -repository = "https://github.com/radroots/studio_app" +repository = "https://github.com/radrootslabs/studio_app" [workspace.lints.rust] unsafe_code = "forbid" @@ -24,20 +25,10 @@ all = "deny" pedantic = "deny" [workspace.dependencies] -bech32 = "=0.11.1" -keyring = "=4.1.6" -directories = "=6.0.0" -fs2 = "=0.4.3" -nostr = { git = "https://github.com/rust-nostr/nostr.git", rev = "5bba5163eb77107f82c4a8262cf29d7f33a73219", package = "nostr" } -nostr-sdk = "=0.44.1" -nostr-relay-builder = "=0.44.1" -refinery = { version = "=0.9.2", default-features = false, features = ["rusqlite"] } -rusqlite = { version = "=0.39.0", features = ["bundled"] } -secrecy = "=0.10.3" -url = "=2.5.8" -zeroize = "=1.9.0" -tokio = { version = "=1.47.1", features = ["macros", "rt-multi-thread", "sync", "time"] } -uniffi = "=0.32.0" - -[patch.crates-io] -nostr = { git = "https://github.com/rust-nostr/nostr.git", rev = "5bba5163eb77107f82c4a8262cf29d7f33a73219" } +radroots_studio_application = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" } +radroots_studio_domain = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" } +radroots_studio_ffi = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" } +radroots_studio_nostr = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" } +radroots_studio_preferences = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" } +radroots_studio_runtime = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" } +radroots_studio_storage = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" } diff --git a/core/crates/source_lock/Cargo.toml b/core/crates/source_lock/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "radroots_studio_source_lock" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +repository.workspace = true +publish = false + +[dependencies] +radroots_studio_application.workspace = true +radroots_studio_domain.workspace = true +radroots_studio_ffi.workspace = true +radroots_studio_nostr.workspace = true +radroots_studio_preferences.workspace = true +radroots_studio_runtime.workspace = true +radroots_studio_storage.workspace = true + +[lints] +workspace = true diff --git a/core/crates/source_lock/src/lib.rs b/core/crates/source_lock/src/lib.rs @@ -0,0 +1 @@ +#![no_std] diff --git a/radroots.lib.source-lock.v1.toml b/radroots.lib.source-lock.v1.toml @@ -0,0 +1,9 @@ +schema = "radroots.lib.source-lock.v1" +repository = "https://github.com/radrootslabs/lib" +revision = "09065a610d95e57acdc895a14c07580fa099e7c3" +architecture = "radroots.crates.release.v2" +workspace_catalog_sha256 = "8c27cebf6825f9ed74e122513c661f6dd31837dddb39d0988014121d8ab05e75" +version = "0.1.0-alpha" +source_archive_sha256 = "68badd1fb02d9396682d368e62dfe79969d8da48529760789c823fb4ab54aea3" +lockfile = "core/Cargo.lock" +lockfile_sha256 = "f84789b2a890ae3cd082dbce464adb582c4ebd4dcebedf52c2381476294f633a"