Saltar al contenido principal

Referencia de API gRPC

El daemon de Almena expone una API gRPC definida en el paquete almena.daemon.v1. El endpoint por defecto es [::1]:50051 (localhost IPv6).

Servicio: DaemonService

Ping

Verificación de salud para confirmar que el daemon está ejecutándose.

rpc Ping(PingRequest) returns (PingResponse);

Solicitud: Mensaje vacío.

Respuesta:

CampoTipoDescripción
messagestringSiempre retorna "pong"

GetVersion

Retorna la cadena de versión del daemon.

rpc GetVersion(GetVersionRequest) returns (GetVersionResponse);

Solicitud: Mensaje vacío.

Respuesta:

CampoTipoDescripción
versionstringVersión del daemon (ej., "2026.1.1-develop")

GetSystemInfo

Retorna información sobre el sistema operativo del host.

rpc GetSystemInfo(GetSystemInfoRequest) returns (GetSystemInfoResponse);

Solicitud: Mensaje vacío.

Respuesta:

CampoTipoDescripción
os_namestringNombre del sistema operativo (ej., "macOS")
os_versionstringVersión del SO (ej., "15.3.2")

GetGeolocation

Retorna datos de geolocalización basados en la dirección IP pública del nodo. Los datos se obtienen de la API de ipapi.co.

rpc GetGeolocation(GetGeolocationRequest) returns (GetGeolocationResponse);

Solicitud: Mensaje vacío.

Respuesta:

CampoTipoDescripción
ipstringDirección IP pública
citystringNombre de la ciudad
regionstringRegión o estado
country_codestringCódigo de país ISO (ej., "US")
country_namestringNombre completo del país
timezonestringIdentificador de zona horaria (ej., "America/New_York")
latitudedoubleLatitud geográfica
longitudedoubleLongitud geográfica
nota

Este endpoint requiere acceso a internet. Retornará un error gRPC si la API externa no está disponible.


ListPeers

Retorna todos los peers P2P descubiertos, incluyendo el nodo local.

rpc ListPeers(ListPeersRequest) returns (ListPeersResponse);

Solicitud: Mensaje vacío.

Respuesta:

CampoTipoDescripción
peersPeerInfo[]Lista de peers descubiertos
local_node_geoGetGeolocationResponseGeolocalización del nodo local

PeerInfo

CampoTipoDescripción
peer_idstringIdentificador único del peer (libp2p PeerId)
addressesstring[]Multidirecciones donde este peer es alcanzable
is_internalbooltrue si el peer está en la red local (LAN)
is_connectedbooltrue si está actualmente conectado
is_selfbooltrue si esta entrada representa al daemon local

Archivo Proto

La definición proto canónica se encuentra en:

daemon/proto/almena/daemon/v1/service.proto

Definición Completa

syntax = "proto3";

package almena.daemon.v1;

service DaemonService {
rpc Ping(PingRequest) returns (PingResponse);
rpc GetVersion(GetVersionRequest) returns (GetVersionResponse);
rpc GetSystemInfo(GetSystemInfoRequest) returns (GetSystemInfoResponse);
rpc GetGeolocation(GetGeolocationRequest) returns (GetGeolocationResponse);
rpc ListPeers(ListPeersRequest) returns (ListPeersResponse);
}

message PingRequest {}
message PingResponse { string message = 1; }

message GetVersionRequest {}
message GetVersionResponse { string version = 1; }

message GetSystemInfoRequest {}
message GetSystemInfoResponse {
string os_name = 1;
string os_version = 2;
}

message GetGeolocationRequest {}
message GetGeolocationResponse {
string ip = 1;
string city = 2;
string region = 3;
string country_code = 4;
string country_name = 5;
string timezone = 6;
double latitude = 7;
double longitude = 8;
}

message ListPeersRequest {}
message ListPeersResponse {
repeated PeerInfo peers = 1;
GetGeolocationResponse local_node_geo = 2;
}

message PeerInfo {
string peer_id = 1;
repeated string addresses = 2;
bool is_internal = 3;
bool is_connected = 4;
bool is_self = 5;
}

Server Reflection

El daemon tiene habilitado gRPC Server Reflection. Herramientas compatibles (Postman, grpcurl, BloomRPC) pueden descubrir todos los servicios y métodos disponibles automáticamente sin necesitar el archivo proto.

Ejemplos de Conexión

grpcurl

# Listar todos los servicios
grpcurl -plaintext '[::1]:50051' list

# Llamar Ping
grpcurl -plaintext '[::1]:50051' almena.daemon.v1.DaemonService/Ping

# Obtener versión
grpcurl -plaintext '[::1]:50051' almena.daemon.v1.DaemonService/GetVersion

# Listar peers
grpcurl -plaintext '[::1]:50051' almena.daemon.v1.DaemonService/ListPeers

Rust (tonic)

use tonic::transport::Channel;

// Generado desde proto
pub mod daemon {
tonic::include_proto!("almena.daemon.v1");
}

use daemon::daemon_service_client::DaemonServiceClient;
use daemon::PingRequest;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let channel = Channel::from_static("http://[::1]:50051")
.connect()
.await?;

let mut client = DaemonServiceClient::new(channel);
let response = client.ping(PingRequest {}).await?;

println!("Respuesta: {}", response.into_inner().message);
Ok(())
}