Перейти к содержимому

Типы записей

Полный справочник всех типов записей Wippy.

Записи ссылаются друг на друга в формате namespace:name. Реестр автоматически связывает зависимости, обеспечивая правильный порядок инициализации ресурсов.

ТипОписание
function.luaТочка входа Lua-функции
process.luaДолгоживущий Lua-процесс
workflow.luaTemporal workflow (детерминированный)
library.luaРазделяемая Lua-библиотека
module.luaМодульный интерфейс Lua
function.lua.bcПредкомпилированный байт-код функции
library.lua.bcПредкомпилированный байт-код библиотеки
process.lua.bcПредкомпилированный байт-код процесса
workflow.lua.bcПредкомпилированный байт-код workflow
- name: handler
kind: function.lua
source: file://handler.lua
method: main
modules:
- http
- json
imports:
utils: app.lib:helpers # Импорт другой записи как модуля
Используйте imports для ссылок на другие Lua-записи. Они становятся доступны через require("alias_name") в коде.
ТипОписание
http.serviceHTTP-сервер (слушает порт)
http.routerПрефикс маршрутов и middleware
http.endpointHTTP-эндпоинт (метод + путь)
http.staticРаздача статических файлов
# HTTP-сервер
- name: gateway
kind: http.service
addr: ":8080"
lifecycle:
auto_start: true
# Роутер с middleware
- name: api
kind: http.router
meta:
server: gateway
prefix: /api
middleware:
- cors
- rate_limit
# Эндпоинт
- name: users_list
kind: http.endpoint
meta:
router: app:api
method: GET
path: /users
func: list_handler

Lua API: См. Модуль HTTP

local http = require("http")
local req = http.request()
local resp = http.response()
resp:status(200):json({users = get_users()})
ТипОписание
db.sql.sqliteSQLite
db.sql.postgresPostgreSQL
db.sql.mysqlMySQL
- name: database
kind: db.sql.sqlite
file: "./data/app.db"
lifecycle:
auto_start: true
# In-memory для тестов
- 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

См. Database для вариантов с суффиксом *_env, параметров TLS и настройки пула соединений.

Lua API: См. Модуль 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)
ТипОписание
store.memoryIn-memory хранилище
store.sqlХранилище на базе SQL
store.kv.raftРеплицируемое в кластере, строго согласованное KV (общий Raft)
store.kv.crdtРеплицируемое в кластере, согласованное в конечном счёте KV (gossip/CRDT)
# Memory store
- name: cache
kind: store.memory
lifecycle:
auto_start: true
# SQL-backed store
- name: persistent_store
kind: store.sql
database: app:database
table: kv_store
lifecycle:
auto_start: true
# Cluster-replicated store (requires clustering)
- name: deployments
kind: store.kv.raft
namespace: deploy

Типы store.kv.* требуют включённой кластеризации. См. Store для компромиссов согласованности.

Lua API: См. Модуль Store

local store = require("store")
local s, err = store.get("app:cache")
s:set("user:123", user_data, 3600) -- TTL в секундах
local data = s:get("user:123")
ТипОписание
queue.driver.memoryIn-memory драйвер очередей
queue.driver.amqpДрайвер AMQP (RabbitMQ)
queue.driver.sqsДрайвер AWS SQS
queue.queueОбъявление очереди
queue.consumerПотребитель очереди
# Драйвер
- name: queue_driver
kind: queue.driver.memory
lifecycle:
auto_start: true
# Очередь
- name: jobs
kind: queue.queue
driver: queue_driver
# Потребитель
- name: job_consumer
kind: queue.consumer
queue: app:jobs
func: job_handler
concurrency: 4
prefetch: 10
lifecycle:
auto_start: true

Lua API: См. Модуль Queue

local queue = require("queue")
-- Публикация сообщения
queue.publish("app:jobs", {task = "process", id = 123})
-- В обработчике — доступ к текущему сообщению
local msg = queue.message()
local data = msg:body_json()
Функция func потребителя вызывается для каждого сообщения. Используйте queue.message() внутри обработчика для доступа к текущему сообщению.
ТипОписание
process.hostХост выполнения процессов
process.serviceСупервизируемый процесс (обёртка над process.lua)
terminal.hostХост терминала/CLI
# Хост процессов (где выполняются процессы)
- name: processes
kind: process.host
host:
workers: 32 # Горутины-воркеры (по умолчанию: NumCPU)
queue_size: 1024 # Размер глобальной очереди
local_queue_size: 256 # Очередь на воркер
lifecycle:
auto_start: true
# Определение процесса
- name: worker_process
kind: process.lua
source: file://worker.lua
method: main
# Супервизируемый сервис
- 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
Используйте process.service, когда нужен процесс как супервизируемый сервис с автоматическим перезапуском. Поле process ссылается на запись process.lua.
ТипОписание
temporal.clientПодключение к Temporal
temporal.workerВоркер 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
ТипОписание
config.awsКонфигурация AWS
cloudstorage.s3Доступ к 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: "" # Опционально, для S3-совместимых сервисов

Lua API: См. Модуль 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"})
Используйте endpoint для подключения к S3-совместимым сервисам типа MinIO или DigitalOcean Spaces.
ТипОписание
fs.directoryДоступ к каталогу
fs.embedВстраиваемая файловая система только для чтения
- name: data_dir
kind: fs.directory
directory: "./data"
auto_init: true # Создать, если не существует
mode: "0755" # Права доступа

Lua API: См. Модуль Filesystem

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()
ТипОписание
env.storage.memoryIn-memory хранилище переменных
env.storage.fileФайловое хранилище переменных
env.storage.osПеременные окружения ОС
env.storage.staticСтатическое хранилище (только чтение)
env.storage.routerРоутер окружения (несколько хранилищ)
env.variableПеременная окружения
- 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: См. Модуль Env

local env = require("env")
local api_key = env.get("API_KEY")
env.set("CACHE_TTL", "3600")
Роутер перебирает хранилища по порядку. При чтении возвращается первое найденное значение; запись идёт в первое записываемое хранилище.
ТипОписание
template.jetОтдельный Jet-шаблон
template.setНабор шаблонов
# Набор шаблонов с настройками движка
- name: templates
kind: template.set
engine:
development_mode: false
extensions:
- ".jet"
- ".html.jet"
# Отдельный шаблон
- name: email_template
kind: template.jet
source: file://templates/email.jet
set: app:templates

Lua API: См. Модуль Template

local templates = require("templates")
local set, err = templates.get("app:templates")
local html = set:render("email", {
user = "Alice",
message = "Welcome!"
})
ТипОписание
security.policyПолитика безопасности с условиями
security.policy.exprПолитика на основе выражений
security.token_storeХранилище токенов
# Политика с условиями
- name: admin_policy
kind: security.policy
policy:
actions: "*"
resources: "*"
effect: allow
conditions:
- field: "actor.meta.role"
operator: eq
value: "admin"
# Политика на основе выражений
- name: owner_policy
kind: security.policy.expr
policy:
actions: "*"
resources: "*"
effect: allow
expression: 'actor.id == meta.owner_id || actor.meta.role == "admin"'

Lua API: См. Модуль Security

local security = require("security")
-- Проверка разрешения перед действием
if security.can("delete", "users", {user_id = id}) then
delete_user(id)
end
-- Получить текущего актора
local actor = security.actor()
Политики вычисляются по порядку. Первая подходящая определяет доступ. Размещайте более специфичные политики перед общими.
ТипОписание
contract.definitionИнтерфейс со спецификациями методов
contract.bindingСвязывает методы контракта с реализациями
# Определение интерфейса
- name: greeter
kind: contract.definition
methods:
- name: greet
description: Возвращает приветствие
- name: greet_with_name
description: Возвращает персональное приветствие
input_schemas:
- format: "application/schema+json"
definition: {"type": "string"}
output_schemas:
- format: "application/schema+json"
definition: {"type": "string"}
# Функции-реализации
- 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
# Связывание методов контракта с реализациями
- name: greeter_impl
kind: contract.binding
contracts:
- contract: app:greeter
default: true
methods:
greet: app:greeter_greet
greet_with_name: app:greeter_greet_name

Использование в Lua:

local contract = require("contract")
-- Открыть binding по ID
local greeter, err = contract.open("app:greeter_impl")
-- Вызов методов
local result = greeter:greet()
local personalized = greeter:greet_with_name("Alice")
-- Проверка, реализует ли экземпляр контракт
local is_greeter = contract.is(greeter, "app:greeter")

Lua API: См. Модуль Contract

Пометьте один binding как default: true, чтобы использовать его при открытии контракта без указания binding ID (работает только если не заданы поля context_required).
ТипОписание
exec.nativeВыполнение нативных команд
exec.dockerВыполнение в 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"
ТипОписание
function.watWebAssembly-функция (текстовый формат WAT)
function.wasmWebAssembly-функция (бинарный формат)
process.wasmWebAssembly-процесс
- name: sum
kind: function.wasm
source: file://sum.wasm
transport: payload # или wasi-http

См. Обзор WASM.

ТипОписание
networkБазовый сетевой оверлей
network.socks5Оверлей SOCKS5-прокси
network.i2pОверлей сети I2P
network.tailscaleОверлей Tailscale

Используется в http.service через network:, в funcs/process через опцию network и в http_client через опцию overlay_network. См. Сеть.

ТипОписание
registry.entryДескриптор записи (внутренний)
ns.definitionОпределение пространства имён
ns.requirementДекларация требования пространства имён
ns.dependencyЗависимость пространства имён

Они создаются загрузчиком реестра из frontmatter _index.yaml и деклараций зависимостей. Авторы обычно не определяют их напрямую — они появляются как результат разрешения блоков version:, namespace: и зависимостей.

Большинство записей поддерживают настройку жизненного цикла:

- name: service
kind: some.kind
lifecycle:
auto_start: true # Запускать автоматически
start_timeout: 10s # Максимальное время запуска
stop_timeout: 10s # Максимальное время остановки
stable_threshold: 5s # Время до признания стабильным
depends_on:
- app:database
restart: # Политика перезапуска
initial_delay: 1s
max_delay: 90s
backoff_factor: 2.0
max_attempts: 0 # 0 = бесконечно
Используйте depends_on для правильного порядка запуска. Супервизор ждёт, пока зависимости станут стабильными, прежде чем запускать зависимые записи.

Записи указываются в формате namespace:name:

# Определение
namespace: app.users
entries:
- name: handler
kind: function.lua
# Ссылка из другой записи
func: app.users:handler

Любые поля записи — включая её kind — можно переопределить при запуске без редактирования исходного YAML, используя секцию конфигурации override: или CLI-флаг -o. Ключи используют формат namespace:entry:path:

override:
app:gateway:addr: ":9090" # data field (a bare path targets data.*)
app:worker:meta.priority: high # meta field
app:db:kind: db.sql.postgres # the entry's typed kind
app:db:data.kind: custom # a payload field literally named "kind"
ПутьЦель
kindТипизированный kind записи (должен быть непустой строкой)
data.<field> или просто <field>Поле в data-нагрузке записи
meta.<field>Поле в метаданных записи

Те же переопределения работают из CLI:

Окно терминала
wippy run -o app:db:kind=db.sql.postgres -o app:gateway:addr=:9090

Значения CLI (-o) приводятся по форме (true/false в bool, числа в числа, иначе строка); значения секции override: сохраняют свой YAML-тип. Чтобы переопределить глобальные секции конфигурации, а не записи, используйте --set.