Puertos y enlaces
Comprender los puertos es comprender cuándo se ejecuta una caja. Esta página es la referencia del modelo.
Los tres puertos implícitos
Section titled “Los tres puertos implícitos”Toda caja los tiene, sin que aparezcan en su configuración:
| Puerto | Sentido | Flujo | Función |
|---|---|---|---|
in | Entrada | Señal | Disparador. Se aceptan varios enlaces entrantes |
error | Salida | Valor + señal | Ruta de fallo |
done | Salida | Señal | Se emite tras la finalización de la caja y de todo su subgrafo aguas abajo |
Tres cajas no tienen puerto error: Salida, Ahora y Retry (esta última es en
sí misma una frontera de error). Dos no tienen done: Salida y Throw.
Tipos de flujo
Section titled “Tipos de flujo”| Flujo | Símbolo mental | Comportamiento |
|---|---|---|
| Valor | Un dato | Transporta un valor; sirve también como disparador |
| Señal | Un pulso | No transporta nada, solo dispara |
| Ambos | Transporta un valor y dispara |
La única combinación prohibida: una salida de señal pura hacia una entrada de valor puro. No habría nada que poner en el valor.
Tipos de datos
Section titled “Tipos de datos”any · json · number · string · boolean · duration · response · status ·
list · object.
El tipado sirve sobre todo para la comodidad visual, con una excepción estricta: una
entrada de tipo lista (el puerto list de las acciones Añadir a una lista y Quitar
de una lista) rechaza un origen que no sea compatible con lista. json y list son
compatibles entre sí; un object simple no lo es.
Aridad
Section titled “Aridad”- Un puerto de entrada solo acepta un enlace. Es lo que hace legible el grafo: un valor, una procedencia.
- Salvo
in, que acepta tantos enlaces como se quiera. - Una salida puede alimentar tantas entradas como se quiera.
Cuándo se ejecuta una caja
Section titled “Cuándo se ejecuta una caja”Tres reglas, en este orden:
- Las raíces arrancan. Toda caja sin enlace entrante se ceba al lanzar el escenario. No existe ninguna caja de «inicio».
- Solo se esperan las entradas cableadas. Una caja se ejecuta cuando cada uno de sus puertos de entrada efectivamente conectados ha recibido un valor. Un puerto sin cablear nunca se espera. Los valores se memorizan: una entrada conserva el último valor recibido.
- El puerto
inhace de barrera. Alimentado por varios enlaces, espera a que todos hayan llegado y después dispara una sola vez. Es el «esperar a que estas tres ramas terminen» del modelo.
La excepción: repetir en cada evento
Section titled “La excepción: repetir en cada evento”La opción «Repetir en cada evento recibido» (menú contextual de la caja) convierte todas las entradas cableadas en puertas «o» no bloqueantes: la caja se vuelve a disparar con cada valor recibido, en cualquier puerto.
Dos usos: tratar un flujo mensaje a mensaje y desbloquear un ciclo de finalización (un grafo que se realimenta a sí mismo).
done frente a una salida de valor
Section titled “done frente a una salida de valor”Es la distinción más útil en la práctica:
- una salida de valor emite en cuanto la caja ha producido su resultado;
doneespera además a que todo lo que consume ese resultado haya terminado.
Para secuenciar —«hacer todo eso y después limpiar»— cablee desde done. Para pasar un dato,
cablee desde la salida de valor.
Las ramas condicionales
Section titled “Las ramas condicionales”No son un mecanismo aparte: son puertos de salida que llevan un rol, y ese rol determina su color.
| Caja | Salidas |
|---|---|
| If | then / else |
| While, Do…While | then (el cuerpo) |
| Assert | then (éxito) / else (fallo) |
| Retry | attempt / exhausted |
| Validación de esquema | valid / invalid / errors |
| Switch | un puerto por caso, más default |
| Conexión Socket.IO | un puerto por evento declarado, más others |
Selectores de enlace
Section titled “Selectores de enlace”Un enlace puede llevar un selector: una ruta aplicada al valor en tránsito.
data.items[0].idbody['user-id']headers["content-type"]statusSe aceptan las formas a.b, a[0], a['clave'] y a["clave"]. Un segmento que contiene
JSON se analiza al vuelo; una ruta que no corresponde a nada devuelve undefined.
A veces Restorm deduce un selector por sí solo en el momento del cableado, cuando el origen tiene una vista previa estática que se reduce a un único valor primitivo. Siempre puede sustituirlo o vaciarlo.