SDK · Manuales
Descargas

XamiLib .NET — Referencia de clases

Namespace: XamiSdk. El punto de entrada es la clase XamiSDK, que da acceso a los distintos servicios. Todos los métodos son async/Task y siguen la convención PascalCase de .NET (SignAsync, ResultAsync...).


XamiSDK

Punto de entrada de la librería. Implementa IDisposable.

Constructor

new XamiSDK(XamiConfig config)

XamiConfig acepta:

Propiedad Descripción
Endpoint URL del servicio local (por defecto http://127.0.0.1:8300).
WrapperKey Credencial de aplicación (wrp_...).
WrapperSecret Secret de la credencial (wsec_...).
TimeoutSeconds 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)
SyncAsync(): Task<JsonObject> resumen Recarga credenciales y diseños desde Xami sin reiniciar. (xamiSDK ≥ 0.2.0)

Pades

Firma de documentos PDF (PAdES).

Métodos

SignAsync(byte[] pdfBytes, PadesSignOptions opts): Task<string>

Envía un PDF a firmar. Devuelve el request_id. PadesSignOptions: CredentialKey (requerido), DesignKey, Variables, Reason, Location, SignerName.

ResultAsync(string requestId): Task<JsonObject>

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

WaitAsync(string requestId, int timeoutSeconds = 60, double pollSeconds = 1.0): Task<byte[]>

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

SignAndWaitAsync(byte[] pdfBytes, PadesSignOptions opts, int timeoutSeconds = 60): Task<byte[]>

Atajo: SignAsync() + WaitAsync(). Devuelve el PDF firmado.

Ejemplo

var pdfFirmado = await xami.Pades().SignAndWaitAsync(
    await File.ReadAllBytesAsync("documento.pdf"),
    new PadesSignOptions
    {
        CredentialKey = "TU_CREDENCIAL",
        SignerName    = "Tu Nombre",
        Reason        = "Aprobación",
        Variables     = new Dictionary<string, object?> { ["name"] = "Tu Nombre" },
    });
await File.WriteAllBytesAsync("documento_firmado.pdf", pdfFirmado);

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

SignAsync(string txHash, BlockchainSignOptions opts): Task<string>

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

ResultAsync(string requestId): Task<JsonObject>

Consulta el estado.

WaitAsync(string requestId, int timeoutSeconds = 60, double pollSeconds = 1.0): Task<JsonObject>

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

SignAndWaitAsync(string txHash, BlockchainSignOptions opts, int timeoutSeconds = 60): Task<JsonObject>

Atajo: SignAsync() + WaitAsync().

Ejemplo

var firma = await xami.Blockchain().SignAndWaitAsync("0xHASH_DE_LA_TX", new BlockchainSignOptions
{
    CredentialKey = "TU_CREDENCIAL_EVM",
    ChainId       = 648541,
});
// firma["r"], firma["s"], firma["v"]

Credentials

Consulta de credenciales en la caché local.

Método Devuelve Descripción
AllAsync(): Task<List<JsonObject>> lista Todas las credenciales disponibles.
GetAsync(string key): Task<JsonObject?> credencial o null Una credencial por su credential_key.

Designs

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

Método Devuelve Descripción
AllAsync(): Task<List<JsonObject>> lista Todos los diseños disponibles.
GetAsync(string key): Task<JsonObject?> diseño o null Un diseño por su design_key.

Health

Método Devuelve Descripción
SelfAsync(): Task<JsonObject> estado Estado del servicio local (pareado, tenant, versión, etc.).
VersionAsync(): Task<string?> versión Versión del xamiSDK local. null si es anterior a 0.2.0.
ApiVersionAsync(): Task<int> entero Versión del contrato local. 1 = sin Sync, Results ni Errors.

Results

Requiere xamiSDK ≥ 0.2.0.

Pades.ResultAsync() necesita que conserves el requestId. 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
RecentAsync(int limit = 50): Task<List<JsonObject>> lista Últimos resultados (PENDING / DONE / ERROR).
PendingAsync(int limit = 50): Task<List<JsonObject>> lista Solo los que siguen esperando la firma del chip.
foreach (var r in await xami.Results().PendingAsync())
    Console.WriteLine($"{r["request_id"]} lleva esperando desde {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
RecentAsync(int limit = 20): Task<List<JsonObject>> lista Últimos errores registrados.
ForRequestAsync(string requestId): Task<List<JsonObject>> lista Errores de un request concreto.
var fallos = await xami.Errors().ForRequestAsync(requestId);
if (fallos.Count > 0)
{
    Console.WriteLine($"No se pudo firmar: {fallos[0]["short"]}");
    Console.WriteLine($"Menciona {fallos[0]["error_id"]} al pedir soporte.");
}

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 (await xami.Health().ApiVersionAsync() >= 2)
{
    await xami.SyncAsync();
}

Manejo de errores

Todos los métodos lanzan XamiSdk.XamiException ante un fallo (credencial inválida, servicio caído, timeout). Expone Message y Code (código HTTP, null en errores de red).

try
{
    var pdf = await xami.Pades().SignAndWaitAsync(bytes, new PadesSignOptions { CredentialKey = "..." });
}
catch (XamiException e)
{
    Console.WriteLine($"Error al firmar: {e.Message} ({e.Code})");
}
Descargar este manual (.md)