Tu aplicación está en JavaScript. Encuentras una biblioteca de Python que resuelve justo lo que necesitas. O tienes un cálculo que encaja muy bien en Rust. O una herramienta escrita en Go que quieres integrar.
Entonces llega la parte menos divertida: conectar procesos, intercambiar datos, gestionar errores y decidir qué hacer cuando algo tarda demasiado.
TotalFusion nace para facilitar esa conexión. Permite llamar a funciones escritas en Python, Rust, Go y WebAssembly desde Total.js y Node.js mediante una API asíncrona.
El proyecto es abierto, tiene licencia MIT y ya está disponible en npm:
npm install totalfusion
Empecemos con algo pequeño
Creamos una función de Python:
# python/hello.py
def greet(data):
return {
'message': 'Hola, ' + data['name']
}
Y la llamamos desde JavaScript:
const fusion = require('totalfusion');
fusion.configure({
python: {
path: './python'
}
});
async function main() {
try {
const result = await fusion.python('hello.greet', {
name: 'DEV Community'
});
console.log(result.message);
} finally {
await fusion.shutdown();
}
}
main().catch(console.error);
La llamada devuelve una promesa. Python ejecuta la función y JavaScript recibe el resultado.
Los procesos de Python permanecen activos entre llamadas. Eso permite conservar en memoria un modelo o una biblioteca costosa de inicializar y reutilizarlos en las siguientes peticiones.
Puedes empezar por el ejemplo para Node.js.
En Total.js, la función también puede ser una Action
Aquí es donde la integración empieza a resultar especialmente interesante.
Añadimos un contrato a la función:
# python/hello.py
from totalfusion import action
@action(
summary='Saluda a una persona',
input='*name:String',
output='message:String'
)
def greet(data):
return {
'message': 'Hola, ' + data['name']
}
Y registramos el directorio desde nuestra aplicación Total.js 5:
// definitions/fusion.js
const fusion = REQUIRE('totalfusion');
exports.install = async function() {
await fusion.register({
python: {
path: PATH.root('python')
},
watch: DEBUG
});
};
Ya podemos invocarla como una Action:
const result = await ACTION('hello/greet', {
name: 'DEV Community'
}).promise();
El contrato declara name como obligatorio. Total.js valida la entrada antes de ejecutar Python. La función se integra en el sistema de Actions del framework, donde también puede utilizar permisos y conectarse a rutas API.
Con watch: DEBUG, los cambios en el código se recogen para las siguientes llamadas durante el desarrollo.
La documentación de Total.js 5 explica esta integración.
Cada lenguaje aporta sus herramientas
A partir de ahí, aparecen posibilidades bastante prácticas:
- Python: integrar bibliotecas de análisis de datos, cálculo científico o machine learning.
- Rust: ejecutar funciones intensivas en CPU en un worker compilado.
- Go: incorporar código de red e infraestructura.
- WebAssembly: ejecutar módulos en un entorno aislado, sin acceso a archivos, red ni variables de entorno.
El motor de TotalFusion funciona en Node.js sin depender de Total.js. La integración con el framework añade Actions, rutas API y componentes para Flow.
La parte que también importa: cuando algo falla
Una integración entre lenguajes necesita resolver más cosas que la primera llamada.
TotalFusion incluye pools de workers, colas limitadas, timeouts, cancelación y reinicio de procesos que fallan. También ofrece streaming con control de flujo y transferencia binaria para buffers y arrays tipados.
Esto permite trabajar con imágenes, audio o datos numéricos sin convertir los binarios a base64.
Para revisar la configuración de Python antes de empezar:
npx totalfusion doctor --path ./python
El diagnóstico indica qué falta y cómo corregirlo. Las dependencias de cada lenguaje y la compilación de los workers siguen estando bajo tu control.
Un proyecto temprano, con mucho que explorar
TotalFusion está en la versión 0.1.1. El repositorio incluye documentación, tutoriales y ejemplos con Total.js, NumPy, Rust, streaming y Flow.
La idea que queremos explorar es sencilla: mantener la aplicación en JavaScript y poder incorporar el ecosistema de otros lenguajes cuando resulte útil.
Si te apetece probarlo, revisar el código o proponer un caso de uso:
¿Qué integrarías primero en tu backend: una biblioteca de Python, una función en Rust o un módulo WebAssembly?
Top comments (0)