Lifecycle pluginu#
Przegląd#
graph LR
A[INSTALL] --> B[LOAD] --> C[CONFIGURE] --> D[UNLOAD] --> E[UNINSTALL]Install#
- 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#
graph TD
install["INSTALL<br/><i>Download → Save to plugins/<br/>→ Save .vclu.json</i>"]
load["LOAD<br/><i>Sandbox → init.lua → Plugin:new()<br/>→ onInit(config)<br/>→ start timers, pollers, subscriptions</i>"]
running["RUNNING<br/><i>Plugin aktywny: pollery, eventy, HTTP, MQTT<br/>CONFIG CHANGE → unload → load (z nowym cfg)</i>"]
unload["UNLOAD<br/><i>onCleanup() → auto-cleanup zasobów<br/>→ clear timers → unsub events → unsub MQTT<br/>→ delete registry objects → clear throttle</i>"]
uninstall["UNINSTALL<br/><i>Remove from .vclu.json<br/>(dir stays on disk)</i>"]
install --> load --> running --> unload --> uninstall