DocsInvitados WebAssembly

Invitados WebAssembly

Los plugins, efectos y extensiones pueden ser artefactos WebAssembly en lugar de ejecutables nativos. El core los detecta por la cabecera del binario, los ejecuta en un runtime wasmtime con sandbox y mantiene el mismo protocolo JSON, asi que la configuracion, el listado, los timeouts y los comandos de instalacion funcionan igual que con invitados nativos.

Formatos de invitado

FormatoObjetivoContratoLenguajes
Modulo corewasm32-wasip1Peticion JSON por stdin, respuesta JSON por stdout, host calls via xfetch.host_callRust, C, C++, Zig, Go, AssemblyScript, ...
ComponenteComponent modelExporta run desde el mundo WIT xfetch:runtime con imports tipadosPython (componentize-py), JavaScript (componentize-js), Rust/C/Go (wit-bindgen), .NET, ...

La deteccion es por contenido: los primeros ocho bytes distinguen modulos core de componentes. La extension del archivo da igual.

Instalacion

# Desde un checkout local (compila con el manifiesto si hace falta)
xfetch plugin install ./plugins/wasm-pacman
xfetch effects install ./effects/wasm-matrix
xfetch extension install ./extensions/wasm-night-mode

# Artefacto precompilado desde una URL
xfetch plugin install https://example.com/releases/plugin.wasm

El instalador coloca el artefacto como xfetch-<tipo>-<nombre>.wasm junto a un manifiesto en ~/.config/xfetch/.

Manifiesto

Las capacidades y los limites se declaran en un manifiesto JSON: sidecar (<nombre>.json junto al artefacto), seccion embebida xfetch:manifest, o valores por defecto conservadores si no existe.

{
  "manifest_version": 1,
  "name": "wasm-hello",
  "kind": "info_provider",
  "runtime": "core",
  "capabilities": {
    "http": { "allow": ["https://api.example.com/*"] },
    "exec": { "allow": ["pacman"], "env": ["PATH"] },
    "fs": [{ "host": "/proc", "guest": "/proc", "mode": "ro" }],
    "env": ["LANG"]
  },
  "limits": {
    "timeout_ms": 15000,
    "memory_mb": 64,
    "output_kb": 64,
    "host_call_kb": 256
  }
}

Los repositorios de origen usan xfetch-plugin.json, xfetch-effect.json o xfetch-extension.json con el mismo esquema; el instalador lo copia junto al artefacto.

Capacidades

Las capacidades se deniegan por defecto; un campo vacio o ausente deniega la operacion.

CapacidadCampoSemantica
HTTPhttp.allowPatrones glob contra la URL completa. Las redirecciones se revisan en cada salto.
Procesosexec.allowPatrones sobre el nombre del programa. No hay shell y el entorno se limpia salvo los nombres permitidos.
Sistema de archivosfsPreopens WASI. Las cadenas montan en solo lectura; los objetos eligen host, guest y mode (ro/rw).
EntornoenvNombres de variables expuestos al invitado.
ArgumentosargsSi es true, el invitado recibe su nombre como argv[0].

Las operaciones log y version estan siempre disponibles.

Limites

CampoPor defectoSignificado
timeout_ms30000Limite de tiempo; timeout_secs de la config lo sobrescribe.
memory_mb256Limite de memoria lineal. Los invitados de Python y Go necesitan margen.
output_kb4096Limite de la respuesta JSON.
host_call_kb4096Limite de una respuesta de host call.

Host calls

Los modulos core llaman a xfetch.host_call con una operacion JSON; los componentes usan los imports tipados fetch, exec, log y protocol-version. Los modulos Rust pueden usar el crate xfetch-guest-api. La referencia completa esta en docs/WASM.md del repositorio xfetch.

Herramientas

xfetch wasm inspect ./plugin.wasm                  # cabecera, manifiesto, capacidades
xfetch wasm inspect ./plugin.wasm --json           # el mismo informe en JSON
xfetch wasm run ./plugin.wasm --request '{"version":1,"kind":"info_provider"}'
xfetch wasm run ./plugin.wasm --request-file req.json --kind plugin --timeout 30
xfetch wasm wit                                    # contrato de componentes

wasm run acepta --request o --request-file, un --kind opcional (plugin, effect o extension, por defecto plugin) y un --timeout en segundos que sobrescribe el límite del manifiesto.

Logs

Los logs de los invitados van a stderr; por defecto solo se muestran warn y error. Ajusta XFETCH_WASM_LOG_LEVEL a off, error, warn, info o debug para cambiar el umbral.

Seguridad

Los invitados wasm no tienen autoridad ambiental: sin acceso a archivos, red, entorno o procesos salvo lo que permita el manifiesto, y con limites de tiempo, memoria y salida. Los plugins nativos conservan sus privilegios de proceso; elegir wasm es elegir el sandbox.

Ejemplos

InvitadoLenguajeFormatoRepositorio
wasm-cryptoRustModulo core, HTTPxfetch-cli/plugins
wasm-ip-geoPythonComponente, HTTPxfetch-cli/plugins
wasm-pacmanGoModulo core, execxfetch-cli/plugins
wasm-procCModulo core, filesystemxfetch-cli/plugins
wasm-matrixRustEfecto corexfetch-cli/effects
wasm-python-pulsePythonEfecto componentexfetch-cli/effects
wasm-night-modeRustExtension corexfetch-cli/extensions
wasm-updates-footerGoExtension corexfetch-cli/extensions
wasm-lang-labelsPythonExtension componentexfetch-cli/extensions

Consulta docs/WASM.md en el repositorio xfetch y docs/wasm-guests.md en el repositorio api para la referencia completa.