Zum Inhalt springen

Entry-Typen-Referenz

Vollständige Referenz aller in Wippy verfügbaren Entry-Typen.

Einträge referenzieren sich gegenseitig im namespace:name-Format. Die Registry verbindet Abhängigkeiten automatisch basierend auf diesen Referenzen und stellt sicher, dass Ressourcen in der richtigen Reihenfolge initialisiert werden.

KindBeschreibung
function.luaLua-Funktions-Entry-Point
process.luaLanglebiger Lua-Prozess
workflow.luaTemporal-Workflow (deterministisch)
library.luaGemeinsam genutzte Lua-Bibliothek
module.luaLua-Modul-Oberflaeche
function.lua.bcVorkompiliertes Funktions-Bytecode
library.lua.bcVorkompiliertes Bibliothek-Bytecode
process.lua.bcVorkompiliertes Prozess-Bytecode
workflow.lua.bcVorkompiliertes Workflow-Bytecode
- name: handler
kind: function.lua
source: file://handler.lua
method: main
modules:
- http
- json
imports:
utils: app.lib:helpers # Anderen Eintrag als Modul importieren
Verwenden Sie imports um andere Lua-Einträge zu referenzieren. Sie werden über require("alias_name") in Ihrem Code verfügbar.
KindBeschreibung
http.serviceHTTP-Server (bindet Port)
http.routerRouten-Präfix und Middleware
http.endpointHTTP-Endpunkt (Methode + Pfad)
http.staticStatische Datei-Bereitstellung
# HTTP-Server
- name: gateway
kind: http.service
addr: ":8080"
lifecycle:
auto_start: true
# Router mit Middleware
- name: api
kind: http.router
meta:
server: gateway
prefix: /api
middleware:
- cors
- rate_limit
# Endpunkt
- name: users_list
kind: http.endpoint
meta:
router: app:api
method: GET
path: /users
func: list_handler

Lua-API: Siehe HTTP-Modul

local http = require("http")
local req = http.request()
local resp = http.response()
resp:status(200):json({users = get_users()})
KindBeschreibung
db.sql.sqliteSQLite-Datenbank
db.sql.postgresPostgreSQL-Datenbank
db.sql.mysqlMySQL-Datenbank
- name: database
kind: db.sql.sqlite
file: "./data/app.db"
lifecycle:
auto_start: true
# In-Memory für Tests
- 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

Siehe Datenbank fuer *_env-Suffix-Varianten, TLS-Optionen und Verbindungs-Pool-Tuning.

Lua-API: Siehe SQL-Modul

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)
KindBeschreibung
store.memoryIn-Memory-Key-Value-Store
store.sqlSQL-basierter Key-Value-Store
store.kv.raftCluster-replizierter, stark konsistenter KV (geteiltes Raft)
store.kv.crdtCluster-replizierter, letztlich konsistenter KV (Gossip/CRDT)
# Memory-Store
- name: cache
kind: store.memory
lifecycle:
auto_start: true
# SQL-basierter Store
- name: persistent_store
kind: store.sql
database: app:database
table: kv_store
lifecycle:
auto_start: true
# Cluster-replizierter Store (erfordert Clustering)
- name: deployments
kind: store.kv.raft
namespace: deploy

Die store.kv.*-Typen benötigen aktiviertes Clustering. Siehe Store für die Konsistenz-Abwägungen.

Lua-API: Siehe Store-Modul

local store = require("store")
local s, err = store.get("app:cache")
s:set("user:123", user_data, 3600) -- TTL in Sekunden
local data = s:get("user:123")
KindBeschreibung
queue.driver.memoryIn-Memory-Queue-Treiber
queue.driver.amqpAMQP-Treiber (RabbitMQ)
queue.driver.sqsAWS-SQS-Treiber
queue.queueQueue-Deklaration
queue.consumerQueue-Konsument
# Treiber
- name: queue_driver
kind: queue.driver.memory
lifecycle:
auto_start: true
# Queue
- name: jobs
kind: queue.queue
driver: queue_driver
# Konsument
- name: job_consumer
kind: queue.consumer
queue: app:jobs
func: job_handler
concurrency: 4
prefetch: 10
lifecycle:
auto_start: true

Lua-API: Siehe Queue-Modul

local queue = require("queue")
-- Nachricht veröffentlichen
queue.publish("app:jobs", {task = "process", id = 123})
-- Im Consumer-Handler auf aktuelle Nachricht zugreifen
local msg = queue.message()
local data = msg:body_json()
Die func des Consumers wird für jede Nachricht aufgerufen. Verwenden Sie queue.message() im Handler um auf die aktuelle Nachricht zuzugreifen.
KindBeschreibung
process.hostProzessausführungs-Host
process.serviceÜberwachter Prozess (umhüllt process.lua)
terminal.hostTerminal/CLI-Host
# Process Host (wo Prozesse laufen)
- name: processes
kind: process.host
host:
workers: 32 # Worker-Goroutinen (Standard: NumCPU)
queue_size: 1024 # Globale Queue-Kapazität
local_queue_size: 256 # Pro-Worker-Queue
lifecycle:
auto_start: true
# Prozessdefinition
- name: worker_process
kind: process.lua
source: file://worker.lua
method: main
# Überwachter Prozessdienst
- 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
Verwenden Sie process.service wenn ein Prozess als überwachter Dienst mit automatischem Neustart laufen soll. Das process-Feld referenziert einen process.lua-Eintrag.
KindBeschreibung
temporal.clientTemporal-Client-Verbindung
temporal.workerTemporal-Worker
- 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
KindBeschreibung
config.awsAWS-Konfiguration
cloudstorage.s3S3-Bucket-Zugriff
- 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: "" # Optional, für S3-kompatible Dienste

Lua-API: Siehe Cloud-Storage-Modul

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"})
Verwenden Sie endpoint um sich mit S3-kompatiblen Diensten wie MinIO oder DigitalOcean Spaces zu verbinden.
KindBeschreibung
fs.directoryVerzeichniszugriff
fs.embedSchreibgeschuetztes eingebettetes Dateisystem
- name: data_dir
kind: fs.directory
directory: "./data"
auto_init: true # Erstellen wenn nicht vorhanden
mode: "0755" # Berechtigungen

Lua-API: Siehe Dateisystem-Modul

local fs = require("fs")
local filesystem, err = fs.get("app:data_dir")
local file = filesystem:open("output.txt", "w")
file:write("Hello, World!")
file:close()
KindBeschreibung
env.storage.memoryIn-Memory-Umgebungsspeicher
env.storage.fileDateibasierter Umgebungsspeicher
env.storage.osBetriebssystem-Umgebung
env.storage.staticSchreibgeschützter statischer Key-Value-Speicher
env.storage.routerUmgebungs-Router (mehrere Speicher)
env.variableUmgebungsvariable
- 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

Lua-API: Siehe Env-Modul

local env = require("env")
local api_key = env.get("API_KEY")
env.set("CACHE_TTL", "3600")
Der Router versucht Speicher der Reihe nach. Der erste Treffer gewinnt beim Lesen; Schreibvorgänge gehen an den ersten beschreibbaren Speicher.
KindBeschreibung
template.jetEinzelne Jet-Vorlage
template.setVorlagen-Set-Konfiguration
# Vorlagen-Set mit Engine-Konfiguration
- name: templates
kind: template.set
engine:
development_mode: false
extensions:
- ".jet"
- ".html.jet"
# Einzelne Vorlage
- name: email_template
kind: template.jet
source: file://templates/email.jet
set: app:templates

Lua-API: Siehe Template-Modul

local templates = require("templates")
local set, err = templates.get("app:templates")
local html = set:render("email", {
user = "Alice",
message = "Willkommen!"
})
KindBeschreibung
security.policySicherheitsrichtlinie mit Bedingungen
security.policy.exprExpression-basierte Richtlinie
security.token_storeToken-Speicher
# Bedingungsbasierte Richtlinie
- name: admin_policy
kind: security.policy
policy:
actions: "*"
resources: "*"
effect: allow
conditions:
- field: "actor.meta.role"
operator: eq
value: "admin"
# Expression-basierte Richtlinie
- name: owner_policy
kind: security.policy.expr
policy:
actions: "*"
resources: "*"
effect: allow
expression: 'actor.id == meta.owner_id || actor.meta.role == "admin"'

Lua-API: Siehe Sicherheitsmodul

local security = require("security")
-- Berechtigung vor Aktion prüfen
if security.can("delete", "users", {user_id = id}) then
delete_user(id)
end
-- Aktuellen Actor abrufen
local actor = security.actor()
Richtlinien werden der Reihe nach ausgewertet. Die erste passende Richtlinie bestimmt den Zugriff. Platzieren Sie spezifischere Richtlinien vor allgemeineren.
KindBeschreibung
contract.definitionSchnittstelle mit Methodenspezifikationen
contract.bindingOrdnet Contract-Methoden Funktionsimplementierungen zu
# Contract-Schnittstelle definieren
- name: greeter
kind: contract.definition
methods:
- name: greet
description: Gibt eine Begrüßungsnachricht zurück
- name: greet_with_name
description: Gibt eine personalisierte Begrüßung zurück
input_schemas:
- format: "application/schema+json"
definition: {"type": "string"}
output_schemas:
- format: "application/schema+json"
definition: {"type": "string"}
# Implementierungsfunktionen
- 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
# Contract-Methoden an Implementierungen binden
- name: greeter_impl
kind: contract.binding
contracts:
- contract: app:greeter
default: true
methods:
greet: app:greeter_greet
greet_with_name: app:greeter_greet_name

Verwendung aus Lua:

local contract = require("contract")
-- Binding nach ID öffnen
local greeter, err = contract.open("app:greeter_impl")
-- Methoden aufrufen
local result = greeter:greet()
local personalized = greeter:greet_with_name("Alice")
-- Prüfen ob Instanz Contract implementiert
local is_greeter = contract.is(greeter, "app:greeter")

Lua-API: Siehe Contract-Modul

Markieren Sie ein Binding als default: true um es zu verwenden wenn ein Contract ohne Angabe einer Binding-ID geöffnet wird (funktioniert nur wenn keine context_required-Felder gesetzt sind).
KindBeschreibung
exec.nativeNative Befehlsausführung
exec.dockerDocker-Container-Ausführung
- 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"
KindBeschreibung
function.watWebAssembly-Funktion (WAT-Textformat)
function.wasmWebAssembly-Funktion (binär)
process.wasmWebAssembly-Prozess
- name: sum
kind: function.wasm
source: file://sum.wasm
transport: payload # oder wasi-http

Siehe WASM-Übersicht.

KindBeschreibung
networkBasis-Netzwerk-Overlay
network.socks5SOCKS5-Proxy-Overlay
network.i2pI2P-Netzwerk-Overlay
network.tailscaleTailscale-Overlay

Wird von http.service ueber network:, von funcs/process ueber die Option network und von http_client ueber die Option overlay_network referenziert. Siehe Netzwerk.

KindBeschreibung
registry.entryEintragsdeskriptor (intern)
ns.definitionNamespace-Definition
ns.requirementNamespace-Anforderungsdeklaration
ns.dependencyNamespace-Abhängigkeit

Diese werden vom Registry-Loader aus dem _index.yaml-Frontmatter und Abhängigkeitsdeklarationen erzeugt. Autoren definieren sie in der Regel nicht direkt — sie entstehen als Ergebnis der Auflösung von version:-, namespace:- und Abhängigkeitsblöcken.

Die meisten Einträge unterstützen Lebenszyklus-Konfiguration:

- name: service
kind: some.kind
lifecycle:
auto_start: true # Automatisch starten
start_timeout: 10s # Maximale Startzeit
stop_timeout: 10s # Maximale Shutdown-Zeit
stable_threshold: 5s # Zeit bis als stabil betrachtet
depends_on:
- app:database
restart: # Retry-Richtlinie
initial_delay: 1s
max_delay: 90s
backoff_factor: 2.0
max_attempts: 0 # 0 = unendlich
Verwenden Sie depends_on um sicherzustellen, dass Einträge in der richtigen Reihenfolge starten. Der Supervisor wartet auf Abhängigkeiten bis sie stabil sind, bevor abhängige Einträge gestartet werden.

Einträge werden im namespace:name-Format referenziert:

# Definition
namespace: app.users
entries:
- name: handler
kind: function.lua
# Referenz aus anderem Eintrag
func: app.users:handler

Jedes Feld eines Eintrags — einschließlich seines kind — kann beim Start überschrieben werden, ohne die Quell-YAML zu bearbeiten, über den Konfigurationsabschnitt override: oder das CLI-Flag -o. Schlüssel verwenden das Format namespace:entry:path:

override:
app:gateway:addr: ":9090" # Datenfeld (ein nackter Pfad zielt auf data.*)
app:worker:meta.priority: high # Meta-Feld
app:db:kind: db.sql.postgres # das typisierte kind des Eintrags
app:db:data.kind: custom # ein Payload-Feld, das wörtlich "kind" heißt
PfadZiel
kindDas typisierte kind des Eintrags (muss ein nicht-leerer string sein)
data.<field> oder nacktes <field>Ein Feld im Daten-Payload des Eintrags
meta.<field>Ein Feld in den Metadaten des Eintrags

Dieselben Overrides gelten über die CLI:

Terminal-Fenster
wippy run -o app:db:kind=db.sql.postgres -o app:gateway:addr=:9090

CLI-Werte (-o) werden anhand ihrer Form gecastet (true/false zu bool, Zahlen zu Zahlen, sonst string); Werte im Abschnitt override: behalten ihren YAML-Typ. Um globale Konfigurations-Abschnitte statt Einträgen zu überschreiben, verwenden Sie --set.