Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion antd-kotlin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ All methods are `suspend` functions for use with Kotlin coroutines.

| Domain | Methods |
|---|---|
| **Health** | `health()` |
| **Health** | `health()` returns `HealthStatus` carrying antd version, EVM network, uptime, build commit, and payment contract addresses (antd ≥ 0.4.0) |
| **Data** | `dataPutPublic`, `dataGetPublic`, `dataPutPrivate`, `dataGetPrivate`, `dataCost` |
| **Chunks** | `chunkPut`, `chunkGet` |
| **Files** | `fileUploadPublic`, `fileDownloadPublic`, `dirUploadPublic`, `dirDownloadPublic`, `fileCost` |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,16 @@ class AntdGrpcClient(target: String = "localhost:50051") : IAntdClient {

override suspend fun health(): HealthStatus = try {
val resp = healthStub.check(healthCheckRequest { })
HealthStatus(resp.status == "ok", resp.network.ifEmpty { "unknown" })
HealthStatus(
ok = resp.status == "ok",
network = resp.network.ifEmpty { "unknown" },
version = resp.version,
evmNetwork = resp.evmNetwork,
uptimeSeconds = resp.uptimeSeconds.toULong(),
buildCommit = resp.buildCommit,
paymentTokenAddress = resp.paymentTokenAddress,
paymentVaultAddress = resp.paymentVaultAddress,
)
} catch (ex: StatusRuntimeException) {
if (ex.status.code == Status.Code.UNAVAILABLE) {
HealthStatus(false, "unknown")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,7 @@ class AntdRestClient(
// ── Health ──

override suspend fun health(): HealthStatus = try {
val resp = getJson<HealthResponseDto>("/health")
HealthStatus(resp.status == "ok", resp.network ?: "unknown")
getJson<HealthResponseDto>("/health").toHealthStatus()
} catch (_: Exception) {
HealthStatus(false, "unknown")
}
Expand Down
37 changes: 35 additions & 2 deletions antd-kotlin/lib/src/main/kotlin/com/autonomi/sdk/Models.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,24 @@ package com.autonomi.sdk
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

/** Health check result from the antd daemon. */
data class HealthStatus(val ok: Boolean, val network: String)
/**
* Health check result from the antd daemon.
*
* The diagnostic fields ([version], [evmNetwork], [uptimeSeconds],
* [buildCommit], [paymentTokenAddress], [paymentVaultAddress]) were added in
* antd 0.4.0. They default to "" / 0 so the type stays constructable from a
* pre-0.4.0 daemon's response.
*/
data class HealthStatus(
val ok: Boolean,
val network: String,
val version: String = "",
val evmNetwork: String = "",
val uptimeSeconds: ULong = 0u,
val buildCommit: String = "",
val paymentTokenAddress: String = "",
val paymentVaultAddress: String = "",
)

/** Result of a put/create operation that stores data on the network. */
data class PutResult(val cost: String, val address: String)
Expand Down Expand Up @@ -77,6 +93,23 @@ data class UploadCostEstimate(
internal data class HealthResponseDto(
val status: String? = null,
val network: String? = null,
val version: String? = null,
@SerialName("evm_network") val evmNetwork: String? = null,
@SerialName("uptime_seconds") val uptimeSeconds: ULong? = null,
@SerialName("build_commit") val buildCommit: String? = null,
@SerialName("payment_token_address") val paymentTokenAddress: String? = null,
@SerialName("payment_vault_address") val paymentVaultAddress: String? = null,
)

internal fun HealthResponseDto.toHealthStatus(): HealthStatus = HealthStatus(
ok = status == "ok",
network = network ?: "unknown",
version = version ?: "",
evmNetwork = evmNetwork ?: "",
uptimeSeconds = uptimeSeconds ?: 0u,
buildCommit = buildCommit ?: "",
paymentTokenAddress = paymentTokenAddress ?: "",
paymentVaultAddress = paymentVaultAddress ?: "",
)

@Serializable
Expand Down
1 change: 1 addition & 0 deletions antd-kotlin/lib/src/main/proto/antd/v1/chunks.proto
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ syntax = "proto3";
package antd.v1;

option csharp_namespace = "Antd.V1";
option go_package = "github.com/WithAutonomi/ant-sdk/antd-go/proto/antd/v1;v1";

import "antd/v1/common.proto";

Expand Down
1 change: 1 addition & 0 deletions antd-kotlin/lib/src/main/proto/antd/v1/common.proto
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ syntax = "proto3";
package antd.v1;

option csharp_namespace = "Antd.V1";
option go_package = "github.com/WithAutonomi/ant-sdk/antd-go/proto/antd/v1;v1";

message Cost {
string atto_tokens = 1; // storage cost in atto tokens as string
Expand Down
1 change: 1 addition & 0 deletions antd-kotlin/lib/src/main/proto/antd/v1/data.proto
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ syntax = "proto3";
package antd.v1;

option csharp_namespace = "Antd.V1";
option go_package = "github.com/WithAutonomi/ant-sdk/antd-go/proto/antd/v1;v1";

import "antd/v1/common.proto";

Expand Down
1 change: 1 addition & 0 deletions antd-kotlin/lib/src/main/proto/antd/v1/events.proto
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ syntax = "proto3";
package antd.v1;

option csharp_namespace = "Antd.V1";
option go_package = "github.com/WithAutonomi/ant-sdk/antd-go/proto/antd/v1;v1";

service EventService {
rpc Subscribe(SubscribeRequest) returns (stream ClientEventProto);
Expand Down
1 change: 1 addition & 0 deletions antd-kotlin/lib/src/main/proto/antd/v1/files.proto
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ syntax = "proto3";
package antd.v1;

option csharp_namespace = "Antd.V1";
option go_package = "github.com/WithAutonomi/ant-sdk/antd-go/proto/antd/v1;v1";

import "antd/v1/common.proto";

Expand Down
7 changes: 7 additions & 0 deletions antd-kotlin/lib/src/main/proto/antd/v1/health.proto
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ syntax = "proto3";
package antd.v1;

option csharp_namespace = "Antd.V1";
option go_package = "github.com/WithAutonomi/ant-sdk/antd-go/proto/antd/v1;v1";

service HealthService {
rpc Check(HealthCheckRequest) returns (HealthCheckResponse);
Expand All @@ -13,4 +14,10 @@ message HealthCheckRequest {}
message HealthCheckResponse {
string status = 1; // "ok"
string network = 2; // "default", "local", "alpha"
string version = 3; // antd crate version (e.g. "0.4.0")
string evm_network = 4; // EVM preset: "arbitrum-one", "arbitrum-sepolia", "local", "custom"
uint64 uptime_seconds = 5; // seconds since process start
string build_commit = 6; // short git SHA, or "" if built outside a git checkout
string payment_token_address = 7; // token contract, or "" if unconfigured
string payment_vault_address = 8; // payment vault contract, or "" if unconfigured
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class RestClientTest {

// Health
if (method == "GET" && path == "/health") {
return json("""{"status":"ok","network":"local"}""")
return json("""{"status":"ok","network":"local","version":"0.4.0","evm_network":"local","uptime_seconds":42,"build_commit":"abcdef123456","payment_token_address":"0xtoken","payment_vault_address":"0xvault"}""")
}

// Data put public
Expand Down Expand Up @@ -116,6 +116,25 @@ class RestClientTest {
val status = client.health()
assertTrue(status.ok)
assertEquals("local", status.network)
assertEquals("0.4.0", status.version)
assertEquals("local", status.evmNetwork)
assertEquals(42UL, status.uptimeSeconds)
assertEquals("abcdef123456", status.buildCommit)
assertEquals("0xtoken", status.paymentTokenAddress)
assertEquals("0xvault", status.paymentVaultAddress)
}

@Test
fun `HealthStatus defaults stay empty for pre-0_4_0 daemon shape`() {
// Older daemons reply with just status + network; the data class
// defaults populate the diagnostic fields so callers don't NPE.
val s = HealthStatus(ok = true, network = "default")
assertEquals("", s.version)
assertEquals("", s.evmNetwork)
assertEquals(0UL, s.uptimeSeconds)
assertEquals("", s.buildCommit)
assertEquals("", s.paymentTokenAddress)
assertEquals("", s.paymentVaultAddress)
}

@Test
Expand Down