Ir al contenido

Referencia de Tipos de Entrada

Referencia completa de todos los tipos de entrada disponibles en Wippy.

Las entradas se referencian entre sí usando el formato namespace:nombre. El registro conecta automáticamente las dependencias basándose en estas referencias, asegurando que los recursos se inicialicen en el orden correcto.

TipoDescripción
function.luaPunto de entrada de función Lua
process.luaProceso Lua de larga duración
workflow.luaFlujo de trabajo Temporal (determinístico)
library.luaBiblioteca Lua compartida
module.luaInterfaz de módulo Lua
function.lua.bcBytecode de función precompilado
library.lua.bcBytecode de biblioteca precompilado
process.lua.bcBytecode de proceso precompilado
workflow.lua.bcBytecode de workflow precompilado
- name: handler
kind: function.lua
source: file://handler.lua
method: main
modules:
- http
- json
imports:
utils: app.lib:helpers # Importar otra entrada como módulo
Use imports para referenciar otras entradas Lua. Se vuelven disponibles vía require("alias_name") en su código.
TipoDescripción
http.serviceServidor HTTP (enlaza puerto)
http.routerPrefijo de ruta y middleware
http.endpointEndpoint HTTP (método + ruta)
http.staticServicio de archivos estáticos
# Servidor HTTP
- name: gateway
kind: http.service
addr: ":8080"
lifecycle:
auto_start: true
# Router con middleware
- name: api
kind: http.router
meta:
server: gateway
prefix: /api
middleware:
- cors
- rate_limit
# Endpoint
- name: users_list
kind: http.endpoint
meta:
router: app:api
method: GET
path: /users
func: list_handler

API Lua: Ver Módulo HTTP

local http = require("http")
local req = http.request()
local resp = http.response()
resp:status(200):json({users = get_users()})
TipoDescripción
db.sql.sqliteBase de datos SQLite
db.sql.postgresBase de datos PostgreSQL
db.sql.mysqlBase de datos MySQL
- name: database
kind: db.sql.sqlite
file: "./data/app.db"
lifecycle:
auto_start: true
# En memoria para pruebas
- name: testdb
kind: db.sql.sqlite
file: ":memory:"
- name: database
kind: db.sql.postgres
host: localhost
port: 5432
database: dbname
username: user
password: pass
options:
sslmode: disable
pool:
max_open: 25
max_idle: 5
max_lifetime: "30m"
lifecycle:
auto_start: true
- name: database
kind: db.sql.mysql
host: localhost
port: 3306
database: dbname
username: user
password: pass
options:
parseTime: "true"
lifecycle:
auto_start: true

Consulta Database para variantes con sufijo *_env, opciones TLS y ajuste del pool de conexiones.

API Lua: Ver Módulo SQL

local sql = require("sql")
local db, err = sql.get("app:database")
local rows, err = db:query("SELECT * FROM users WHERE id = ?", user_id)
db:execute("INSERT INTO logs (msg) VALUES (?)", message)
TipoDescripción
store.memoryAlmacén clave-valor en memoria
store.sqlAlmacén clave-valor respaldado por SQL
store.kv.raftKV replicado en cluster, fuertemente consistente (Raft compartido)
store.kv.crdtKV replicado en cluster, eventualmente consistente (gossip/CRDT)
# Almacén en memoria
- name: cache
kind: store.memory
lifecycle:
auto_start: true
# Almacén respaldado por SQL
- name: persistent_store
kind: store.sql
database: app:database
table: kv_store
lifecycle:
auto_start: true
# Almacén replicado en cluster (requiere clustering)
- name: deployments
kind: store.kv.raft
namespace: deploy

Los tipos store.kv.* requieren que el clustering esté habilitado. Ver Store para los compromisos de consistencia.

API Lua: Ver Módulo Store

local store = require("store")
local s, err = store.get("app:cache")
s:set("user:123", user_data, 3600) -- TTL en segundos
local data = s:get("user:123")
TipoDescripción
queue.driver.memoryDriver de cola en memoria
queue.driver.amqpDriver AMQP (RabbitMQ)
queue.driver.sqsDriver AWS SQS
queue.queueDeclaración de cola
queue.consumerConsumidor de cola
# Driver
- name: queue_driver
kind: queue.driver.memory
lifecycle:
auto_start: true
# Cola
- name: jobs
kind: queue.queue
driver: queue_driver
# Consumidor
- name: job_consumer
kind: queue.consumer
queue: app:jobs
func: job_handler
concurrency: 4
prefetch: 10
lifecycle:
auto_start: true

API Lua: Ver Módulo Queue

local queue = require("queue")
-- Publicar un mensaje
queue.publish("app:jobs", {task = "process", id = 123})
-- En el handler del consumidor, acceder al mensaje actual
local msg = queue.message()
local data = msg:body_json()
El func del consumidor se invoca para cada mensaje. Use queue.message() dentro del handler para acceder al mensaje actual.
TipoDescripción
process.hostHost de ejecución de procesos
process.serviceProceso supervisado (envuelve process.lua)
terminal.hostHost de terminal/CLI
# Host de procesos (donde se ejecutan los procesos)
- name: processes
kind: process.host
host:
workers: 32 # Goroutines worker (por defecto: NumCPU)
queue_size: 1024 # Capacidad de cola global
local_queue_size: 256 # Cola por worker
lifecycle:
auto_start: true
# Definición de proceso
- name: worker_process
kind: process.lua
source: file://worker.lua
method: main
# Servicio de proceso supervisado
- name: worker
kind: process.service
process: app:worker_process
host: app:processes
input: ["arg1", "arg2"]
lifecycle:
auto_start: true
restart:
max_attempts: 10
- name: terminal
kind: terminal.host
lifecycle:
auto_start: true
Use process.service cuando necesite que un proceso se ejecute como servicio supervisado con reinicio automático. El campo process referencia una entrada process.lua.
TipoDescripción
temporal.clientConexión de cliente Temporal
temporal.workerWorker Temporal
- name: temporal_client
kind: temporal.client
address: "localhost:7233"
namespace: "default"
auth:
type: none # none, api_key, mtls
lifecycle:
auto_start: true
- name: temporal_worker
kind: temporal.worker
client: temporal_client
task_queue: "main-queue"
lifecycle:
auto_start: true
TipoDescripción
config.awsConfiguración AWS
cloudstorage.s3Acceso a bucket S3
- name: aws
kind: config.aws
region: "us-east-1"
access_key_id_env: "AWS_ACCESS_KEY_ID"
secret_access_key_env: "AWS_SECRET_ACCESS_KEY"
- name: uploads
kind: cloudstorage.s3
config: app:aws
bucket: "my-uploads"
endpoint: "" # Opcional, para servicios compatibles con S3

API Lua: Ver Módulo Cloud Storage

local cloudstorage = require("cloudstorage")
local storage, err = cloudstorage.get("app:uploads")
storage:upload_object("files/doc.pdf", file_content)
local url = storage:presigned_get_url("files/doc.pdf", {expires = "1h"})
Use endpoint para conectarse a servicios compatibles con S3 como MinIO o DigitalOcean Spaces.
TipoDescripción
fs.directoryAcceso a directorio
fs.embedSistema de archivos embebido de solo lectura
- name: data_dir
kind: fs.directory
directory: "./data"
auto_init: true # Crear si no existe
mode: "0755" # Permisos

API Lua: Ver Módulo Filesystem

local fs = require("fs")
local filesystem, err = fs.get("app:data_dir")
local file = filesystem:open("output.txt", "w")
file:write("Hola, Mundo!")
file:close()
TipoDescripción
env.storage.memoryAlmacén de env en memoria
env.storage.fileAlmacén de env basado en archivo
env.storage.osEntorno del SO
env.storage.staticAlmacenamiento estático de solo lectura clave-valor
env.storage.routerRouter de env (múltiples almacenes)
env.variableVariable de entorno
- name: os_env
kind: env.storage.os
- name: file_env
kind: env.storage.file
file_path: ".env"
auto_create: true
- name: defaults
kind: env.storage.static
values:
PUBLIC_API_HOST: "https://api.example.com"
APP_ENV: "production"
- name: app_env
kind: env.storage.router
storages:
- app:os_env
- app:file_env
- app:defaults

API Lua: Ver Módulo Env

local env = require("env")
local api_key = env.get("API_KEY")
env.set("CACHE_TTL", "3600")
El router intenta los almacenes en orden. La primera coincidencia gana para lecturas; las escrituras van al primer almacén con escritura.
TipoDescripción
template.jetPlantilla Jet individual
template.setConfiguración de conjunto de plantillas
# Conjunto de plantillas con configuración del motor
- name: templates
kind: template.set
engine:
development_mode: false
extensions:
- ".jet"
- ".html.jet"
# Plantilla individual
- name: email_template
kind: template.jet
source: file://templates/email.jet
set: app:templates

API Lua: Ver Módulo Template

local templates = require("templates")
local set, err = templates.get("app:templates")
local html = set:render("email", {
user = "Alice",
message = "Bienvenido!"
})
TipoDescripción
security.policyPolítica de seguridad con condiciones
security.policy.exprPolítica basada en expresiones
security.token_storeAlmacén de tokens
# Política basada en condiciones
- name: admin_policy
kind: security.policy
policy:
actions: "*"
resources: "*"
effect: allow
conditions:
- field: "actor.meta.role"
operator: eq
value: "admin"
# Política basada en expresiones
- name: owner_policy
kind: security.policy.expr
policy:
actions: "*"
resources: "*"
effect: allow
expression: 'actor.id == meta.owner_id || actor.meta.role == "admin"'

API Lua: Ver Módulo Security

local security = require("security")
-- Verificar permiso antes de acción
if security.can("delete", "users", {user_id = id}) then
delete_user(id)
end
-- Obtener actor actual
local actor = security.actor()
Las políticas se evalúan en orden. La primera política que coincide determina el acceso. Coloque políticas más específicas antes que las generales.
TipoDescripción
contract.definitionInterfaz con especificaciones de métodos
contract.bindingMapea métodos de contrato a implementaciones de funciones
# Definir la interfaz del contrato
- name: greeter
kind: contract.definition
methods:
- name: greet
description: Retorna un mensaje de saludo
- name: greet_with_name
description: Retorna un saludo personalizado
input_schemas:
- format: "application/schema+json"
definition: {"type": "string"}
output_schemas:
- format: "application/schema+json"
definition: {"type": "string"}
# Funciones de implementación
- name: greeter_greet
kind: function.lua
source: file://greeter_greet.lua
method: main
- name: greeter_greet_name
kind: function.lua
source: file://greeter_greet_name.lua
method: main
# Enlazar métodos del contrato a implementaciones
- name: greeter_impl
kind: contract.binding
contracts:
- contract: app:greeter
default: true
methods:
greet: app:greeter_greet
greet_with_name: app:greeter_greet_name

Uso desde Lua:

local contract = require("contract")
-- Abrir binding por ID
local greeter, err = contract.open("app:greeter_impl")
-- Llamar métodos
local result = greeter:greet()
local personalized = greeter:greet_with_name("Alice")
-- Verificar si instancia implementa contrato
local is_greeter = contract.is(greeter, "app:greeter")

API Lua: Ver Módulo Contract

Marque un binding como default: true para usarlo cuando se abra un contrato sin especificar un ID de binding (solo funciona cuando no hay campos context_required establecidos).
TipoDescripción
exec.nativeEjecución de comandos nativos
exec.dockerEjecución de contenedores Docker
- name: native_exec
kind: exec.native
default_work_dir: "/app"
command_whitelist:
- "ls"
- "cat"
- name: docker_exec
kind: exec.docker
image: "python:3.11-slim"
default_work_dir: "/workspace"
auto_remove: true
memory_limit: 536870912 # 512MB
command_whitelist:
- "python"
TipoDescripción
function.watFunción WebAssembly (formato de texto WAT)
function.wasmFunción WebAssembly (binario)
process.wasmProceso WebAssembly
- name: sum
kind: function.wasm
source: file://sum.wasm
transport: payload # o wasi-http

Ver Resumen de WASM.

TipoDescripción
networkOverlay de red base
network.socks5Overlay de proxy SOCKS5
network.i2pOverlay de red I2P
network.tailscaleOverlay de Tailscale

Referenciado por http.service mediante network:, por funcs/process mediante la opcion network y por http_client mediante la opcion overlay_network. Ver Red.

TipoDescripción
registry.entryDescriptor de entrada (interno)
ns.definitionDefinición de namespace
ns.requirementDeclaración de requisito de namespace
ns.dependencyDependencia de namespace

Son producidas por el cargador del registro a partir del frontmatter de _index.yaml y las declaraciones de dependencias. Los autores generalmente no las definen directamente — aparecen como resultado de la resolución de bloques version:, namespace: y de dependencias.

La mayoría de las entradas soportan configuración de ciclo de vida:

- name: service
kind: some.kind
lifecycle:
auto_start: true # Iniciar automáticamente
start_timeout: 10s # Tiempo máximo de inicio
stop_timeout: 10s # Tiempo máximo de apagado
stable_threshold: 5s # Tiempo para considerar estable
depends_on:
- app:database
restart: # Política de reintento
initial_delay: 1s
max_delay: 90s
backoff_factor: 2.0
max_attempts: 0 # 0 = infinito
Use depends_on para asegurar que las entradas inicien en el orden correcto. El supervisor espera a que las dependencias se estabilicen antes de iniciar entradas dependientes.

Las entradas se referencian usando el formato namespace:nombre:

# Definición
namespace: app.users
entries:
- name: handler
kind: function.lua
# Referencia desde otra entrada
func: app.users:handler

Sobrescribir entradas {id=“overriding-entries”}

Sección titulada «Sobrescribir entradas {id=“overriding-entries”}»

Cualquier campo de una entrada — incluido su kind — puede sobrescribirse en el arranque sin editar el YAML de origen, usando la sección de configuración override: o el flag de CLI -o. Las claves usan el formato namespace:entry:path:

override:
app:gateway:addr: ":9090" # campo de datos (una ruta simple apunta a data.*)
app:worker:meta.priority: high # campo meta
app:db:kind: db.sql.postgres # el kind tipado de la entrada
app:db:data.kind: custom # un campo de payload llamado literalmente "kind"
RutaApunta a
kindEl kind tipado de la entrada (debe ser un string no vacío)
data.<field> o <field> simpleUn campo en el payload de datos de la entrada
meta.<field>Un campo en los metadatos de la entrada

Las mismas sobrescrituras se aplican desde la CLI:

Ventana de terminal
wippy run -o app:db:kind=db.sql.postgres -o app:gateway:addr=:9090

Los valores de CLI (-o) se convierten según su forma (true/false a bool, números a números, en otro caso string); los valores de la sección override: mantienen su tipo YAML. Para sobrescribir secciones globales de configuración en lugar de entradas, usa --set.