SDK · Manuales
Descargas

XamiLib Rust — Referencia de clases

Crate: xamisdk_client. El punto de entrada es XamiSDK, creado con XamiSDK::new(config). Cada llamada a xami.pades(), xami.health(), etc. devuelve un valor nuevo que envuelve un Client clonado (barato — internamente comparte el agente HTTP), en vez de cachear una instancia perezosa como en el resto de SDKs de la suite; es el patrón más idiomático en Rust para este caso. Como self es palabra reservada, Health::self() se llama get_self().


XamiSDK

Punto de entrada de la librería.

Constructor

XamiSDK::new(config: Config) -> XamiSDK

Config acepta:

Campo Descripción
endpoint URL del servicio local (por defecto http://127.0.0.1:8300).
wrapper_key Credencial de aplicación (wrp_...).
wrapper_secret Secret de la credencial (wsec_...).
timeout_seconds Timeout HTTP en segundos (30 por defecto).

Métodos

Método Devuelve Descripción
pades() Pades Servicio de firma de documentos PDF.
blockchain() Blockchain Servicio de firma de transacciones EVM.
credentials() Credentials Consulta de credenciales.
designs() Designs Consulta de diseños de sello.
health() Health Estado del servicio local.
results() Results Resultados de firma recientes. (xamiSDK ≥ 0.2.0)
errors() Errors Errores registrados por el servicio local. (xamiSDK ≥ 0.2.0)
sync() -> Result<Value, XamiException> resumen Recarga credenciales y diseños desde Xami sin reiniciar. (xamiSDK ≥ 0.2.0)

Pades

Firma de documentos PDF (PAdES).

Métodos

sign(&self, pdf_bytes: &[u8], opts: &PadesSignOptions) -> Result<String, XamiException>

Envía un PDF a firmar. Devuelve el request_id. PadesSignOptions: credential_key (requerido), design_key, variables, reason, location, signer_name.

result(&self, request_id: &str) -> Result<Value, XamiException>

Consulta el estado. Cuando está DONE, incluye el PDF firmado en pdf_base64.

wait(&self, request_id: &str, timeout_seconds: u64, poll_seconds: f64) -> Result<Vec<u8>, XamiException>

Bloquea hasta que la firma esté lista y devuelve el PDF firmado.

sign_and_wait(&self, pdf_bytes: &[u8], opts: &PadesSignOptions, timeout_seconds: u64) -> Result<Vec<u8>, XamiException>

Atajo: sign() + wait(). Devuelve el PDF firmado.

Ejemplo

use xamisdk_client::PadesSignOptions;

let pdf_bytes = std::fs::read("documento.pdf")?;
let firmado = xami.pades().sign_and_wait(
    &pdf_bytes,
    &PadesSignOptions {
        credential_key: "TU_CREDENCIAL".to_string(),
        signer_name: Some("Tu Nombre".to_string()),
        reason: Some("Aprobación".to_string()),
        ..Default::default()
    },
    60,
)?;
std::fs::write("documento_firmado.pdf", firmado)?;

Blockchain

Firma de transacciones / mensajes EVM. El chip actúa como wallet y devuelve r/s/v; tú ensamblas la transacción con tu librería EVM.

Métodos

sign(&self, tx_hash: &str, opts: &BlockchainSignOptions) -> Result<String, XamiException>

Envía el hash a firmar. Devuelve el request_id. BlockchainSignOptions: credential_key (requerido, credencial EVM), chain_id.

result(&self, request_id: &str) -> Result<Value, XamiException>

Consulta el estado.

wait(&self, request_id: &str, timeout_seconds: u64, poll_seconds: f64) -> Result<Value, XamiException>

Bloquea hasta tener la firma. Devuelve el objeto con r/s/v/signature.

sign_and_wait(&self, tx_hash: &str, opts: &BlockchainSignOptions, timeout_seconds: u64) -> Result<Value, XamiException>

Atajo: sign() + wait().

Ejemplo

use xamisdk_client::BlockchainSignOptions;

let firma = xami.blockchain().sign_and_wait(
    "0xHASH_DE_LA_TX",
    &BlockchainSignOptions { credential_key: "TU_CREDENCIAL_EVM".to_string(), chain_id: Some(648541) },
    60,
)?;
// firma["r"], firma["s"], firma["v"]

Credentials

Consulta de credenciales en la caché local.

Método Devuelve Descripción
all(&self) -> Result<Vec<Value>, XamiException> lista Todas las credenciales disponibles.
get(&self, key: &str) -> Result<Option<Value>, XamiException> credencial u None Una credencial por su credential_key.

Designs

Consulta de diseños de sello en la caché local.

Método Devuelve Descripción
all(&self) -> Result<Vec<Value>, XamiException> lista Todos los diseños disponibles.
get(&self, key: &str) -> Result<Option<Value>, XamiException> diseño u None Un diseño por su design_key.

Health

Método Devuelve Descripción
get_self(&self) -> Result<Value, XamiException> estado Estado del servicio local (pareado, tenant, versión, etc.).
version(&self) -> Result<Option<String>, XamiException> versión Versión del xamiSDK local. None si es anterior a 0.2.0.
api_version(&self) -> Result<u64, XamiException> entero Versión del contrato local. 1 = sin sync, results ni errors.

Results

Requiere xamiSDK ≥ 0.2.0.

Pades::result() necesita que conserves el request_id. Si tu proceso se reinició o el push no llegó, ese documento quedaba inalcanzable desde la librería. Con Results puedes recuperar lo firmado sin depender de tu propio almacenamiento.

Método Devuelve Descripción
recent(&self, limit: u32) -> Result<Vec<Value>, XamiException> lista Últimos resultados (PENDING / DONE / ERROR).
pending(&self, limit: u32) -> Result<Vec<Value>, XamiException> lista Solo los que siguen esperando la firma del chip.
for r in xami.results().pending(50)? {
    println!("{} lleva esperando desde {}", r["request_id"], r["created_at"]);
}

Errors

Requiere xamiSDK ≥ 0.2.0.

Devuelve el mensaje corto y el error_id de cada fallo. Nunca devuelve el traceback: el detalle técnico solo sale del equipo del cliente cuando alguien ejecuta xamisdk report. Está pensado para que tu aplicación pueda decirle al usuario qué falló y con qué identificador pedir soporte.

Método Devuelve Descripción
recent(&self, limit: u32) -> Result<Vec<Value>, XamiException> lista Últimos errores registrados.
for_request(&self, request_id: &str) -> Result<Vec<Value>, XamiException> lista Errores de un request concreto.
let fallos = xami.errors().for_request(&request_id)?;
if let Some(f) = fallos.first() {
    println!("No se pudo firmar: {}", f["short"]);
    println!("Menciona {} al pedir soporte.", f["error_id"]);
}

Compatibilidad de versiones

Los métodos marcados con xamiSDK ≥ 0.2.0 devuelven 404 contra un servicio anterior. Compruébalo antes si no controlas la versión instalada:

if xami.health().api_version()? >= 2 {
    xami.sync()?;
}

Manejo de errores

Todos los métodos devuelven Result<_, XamiException>. XamiException implementa std::error::Error y Display, con campos message: String y code: Option<u16> (None en errores de red o de serialización).

match xami.pades().sign_and_wait(&pdf_bytes, &opts, 60) {
    Ok(pdf) => std::fs::write("documento_firmado.pdf", pdf)?,
    Err(e) => eprintln!("Error al firmar: {} ({:?})", e.message, e.code),
}
Descargar este manual (.md)