Lifecycle pluginu#
Przegląd#
INSTALL → LOAD → CONFIGURE → UNLOAD → UNINSTALLInstall#
- Użytkownik wybiera plugin w UI (
/plugins) lubPOST /api/plugins/install - Loader pobiera
plugin.json+ pliki z repozytorium - Zapisuje do
plugins/{namespace}--{shortId}/ - Dodaje wpis w
.vclu.json→plugins.installed[]zconfig={} - Plugin nie jest ładowany — wymaga konfiguracji i włączenia
POST /api/plugins/install
{
"id": "weather",
"fullId": "@vclu/weather",
"repository": "vCLU Official"
}Load#
Wywoływany przy:
- Starcie serwera (wszystkie enabled pluginy)
- Włączeniu pluginu (
POST /plugins/:id/toggle) - Zmianie konfiguracji (
POST /plugins/:id/config)
Kroki:
- Odczyt
plugin.json(manifest) - Utworzenie izolowanego środowiska Lua
- Przekazanie konfiguracji z
.vclu.json - Załadowanie
init.luaw sandboxie - Wywołanie
onInit(config)callback - Plugin startuje timery, pollery, subskrypcje
Configure#
- Użytkownik wypełnia formularz w UI (generowany z
configSchema) POST /api/plugins/:id/configz nowym obiektem config- Config zapisywany do
.vclu.json - Jeśli plugin enabled:
- Unload — cleanup starego
- Load — załadowanie z nową konfiguracją
- Jeśli plugin disabled — tylko zapis config
POST /api/plugins/@vclu/weather/config
{
"config": {
"apiKey": "new-key",
"city": "Kraków"
}
}Unload#
Wywoływany przy:
- Wyłączeniu pluginu (
POST /plugins/:id/toggle) - Odinstalowaniu (
DELETE /plugins/:id) - Wyłączeniu serwera
- Zmianie konfiguracji (przed reload)
Kroki:
- Wywołanie
onCleanup()callback pluginu - Automatyczne czyszczenie zasobów:
- Usunięcie wszystkich timerów
- Wyrejestrowanie event subscriptions
- Wyrejestrowanie MQTT subscriptions
- Usunięcie obiektów z registry
- Wyczyszczenie throttle state
- Usunięcie instancji pluginu
-- Przykład onCleanup:
plugin:onCleanup(function()
plugin:log("info", "Cleaning up...")
-- Polery i timery auto-czyszczone
-- Wystarczy cleanup własnych zasobów
end)Uninstall#
DELETE /api/plugins/:id- Jeśli enabled → unload (cleanup)
- Usunięcie z
.vclu.json→plugins.installed[] - Katalog pluginu pozostaje na dysku (możliwy reinstall)
- Opcjonalnie: usunięcie pliku KV store
Diagram#
┌─ INSTALL ─────────────────────────────────────┐
│ Download → Save to plugins/ → Save .vclu.json │
└───────────────────────┬───────────────────────┘
▼
┌─ LOAD ────────────────────────────────────────┐
│ Sandbox → init.lua → Plugin:new() │
│ → onInit(config) │
│ → start timers, pollers, subscriptions │
└───────────────────────┬───────────────────────┘
▼
┌─ RUNNING ─────────────────────────────────────┐
│ Plugin aktywny: pollery, eventy, HTTP, MQTT │
│ │
│ CONFIG CHANGE → unload → load (z nowym cfg) │
└───────────────────────┬───────────────────────┘
▼
┌─ UNLOAD ──────────────────────────────────────┐
│ onCleanup() → auto-cleanup zasobów │
│ → clear timers → unsub events → unsub MQTT │
│ → delete registry objects → clear throttle │
└───────────────────────┬───────────────────────┘
▼
┌─ UNINSTALL ───────────────────────────────────┐
│ Remove from .vclu.json (dir stays on disk) │
└───────────────────────────────────────────────┘