Documentation
¶
Overview ¶
Package plugin defines the unified interface for GoatKit plugins.
Plugins can be implemented as either:
- WASM modules (portable, sandboxed, via wazero)
- gRPC services (native, for I/O-heavy workloads, via go-plugin)
The host doesn't care which runtime backs a plugin - both implement this interface and are managed uniformly by the plugin manager.
Index ¶
- type DefaultHostAPI
- func (h *DefaultHostAPI) CacheDelete(ctx context.Context, key string) error
- func (h *DefaultHostAPI) CacheGet(ctx context.Context, key string) ([]byte, bool, error)
- func (h *DefaultHostAPI) CacheSet(ctx context.Context, key string, value []byte, ttlSeconds int) error
- func (h *DefaultHostAPI) ConfigGet(ctx context.Context, key string) (string, error)
- func (h *DefaultHostAPI) DBExec(ctx context.Context, query string, args ...any) (int64, error)
- func (h *DefaultHostAPI) DBQuery(ctx context.Context, query string, args ...any) ([]map[string]any, error)
- func (h *DefaultHostAPI) HTTPRequest(ctx context.Context, method, url string, headers map[string]string, ...) (int, []byte, error)
- func (h *DefaultHostAPI) Log(ctx context.Context, level, message string, fields map[string]any)
- func (h *DefaultHostAPI) SendEmail(ctx context.Context, to, subject, body string, html bool) error
- func (h *DefaultHostAPI) Translate(ctx context.Context, key string, args ...any) string
- type GKRegistration
- type HostAPI
- type JobSpec
- type Manager
- func (m *Manager) Call(ctx context.Context, pluginName, fn string, args []byte) ([]byte, error)
- func (m *Manager) Disable(name string) error
- func (m *Manager) Enable(name string) error
- func (m *Manager) Get(name string) (Plugin, bool)
- func (m *Manager) Jobs() []PluginJob
- func (m *Manager) List() []GKRegistration
- func (m *Manager) MenuItems(location string) []PluginMenuItem
- func (m *Manager) Register(ctx context.Context, p Plugin) error
- func (m *Manager) Routes() []PluginRoute
- func (m *Manager) ShutdownAll(ctx context.Context) error
- func (m *Manager) Unregister(ctx context.Context, name string) error
- func (m *Manager) Widgets(location string) []PluginWidget
- type MenuItemSpec
- type Plugin
- type PluginJob
- type PluginMenuItem
- type PluginRoute
- type PluginWidget
- type RouteSpec
- type TemplateSpec
- type WidgetSpec
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type DefaultHostAPI ¶
type DefaultHostAPI struct {
}
DefaultHostAPI provides a basic implementation of HostAPI. In production, this would be wired to actual database, cache, etc.
func NewDefaultHostAPI ¶
func NewDefaultHostAPI() *DefaultHostAPI
NewDefaultHostAPI creates a new default host API.
func (*DefaultHostAPI) CacheDelete ¶
func (h *DefaultHostAPI) CacheDelete(ctx context.Context, key string) error
CacheDelete removes a value from cache.
func (*DefaultHostAPI) CacheSet ¶
func (h *DefaultHostAPI) CacheSet(ctx context.Context, key string, value []byte, ttlSeconds int) error
CacheSet stores a value in cache.
func (*DefaultHostAPI) DBQuery ¶
func (h *DefaultHostAPI) DBQuery(ctx context.Context, query string, args ...any) ([]map[string]any, error)
DBQuery executes a query and returns rows as maps.
func (*DefaultHostAPI) HTTPRequest ¶
func (h *DefaultHostAPI) HTTPRequest(ctx context.Context, method, url string, headers map[string]string, body []byte) (int, []byte, error)
HTTPRequest makes an outbound HTTP request.
type GKRegistration ¶
type GKRegistration struct {
// Identity
Name string `json:"name"` // unique identifier, e.g. "stats"
Version string `json:"version"` // semver, e.g. "1.0.0"
Description string `json:"description"` // human-readable description
Author string `json:"author"` // author or organization
License string `json:"license"` // SPDX identifier, e.g. "Apache-2.0"
Homepage string `json:"homepage"` // URL to plugin docs/repo
// Capabilities - what the plugin exposes to the host
Routes []RouteSpec `json:"routes,omitempty"` // HTTP routes to register
MenuItems []MenuItemSpec `json:"menu_items,omitempty"` // navigation menu entries
Widgets []WidgetSpec `json:"widgets,omitempty"` // dashboard widgets
Jobs []JobSpec `json:"jobs,omitempty"` // scheduled/cron tasks
Templates []TemplateSpec `json:"templates,omitempty"` // template overrides/additions
// Requirements
MinHostVersion string `json:"min_host_version,omitempty"` // minimum GOTRS version
Permissions []string `json:"permissions,omitempty"` // required host permissions
}
GKRegistration describes what a plugin provides to the host. This is returned by GKRegister() - the self-describing plugin protocol.
type HostAPI ¶
type HostAPI interface {
// Database
DBQuery(ctx context.Context, query string, args ...any) ([]map[string]any, error)
DBExec(ctx context.Context, query string, args ...any) (int64, error)
// Cache
CacheGet(ctx context.Context, key string) ([]byte, bool, error)
CacheSet(ctx context.Context, key string, value []byte, ttlSeconds int) error
CacheDelete(ctx context.Context, key string) error
// HTTP (outbound)
HTTPRequest(ctx context.Context, method, url string, headers map[string]string, body []byte) (int, []byte, error)
// Email
SendEmail(ctx context.Context, to, subject, body string, html bool) error
// Logging
Log(ctx context.Context, level, message string, fields map[string]any)
// Config
ConfigGet(ctx context.Context, key string) (string, error)
// i18n
Translate(ctx context.Context, key string, args ...any) string
}
HostAPI is the interface plugins use to access host services. Passed to Plugin.Init() - plugins store this for later use.
type JobSpec ¶
type JobSpec struct {
ID string `json:"id"` // unique identifier
Handler string `json:"handler"` // plugin function to call
Schedule string `json:"schedule"` // cron expression, e.g. "0 * * * *"
Description string `json:"description,omitempty"` // human-readable description
Enabled bool `json:"enabled"` // whether job runs by default
Timeout string `json:"timeout,omitempty"` // max execution time, e.g. "5m"
}
JobSpec defines a scheduled/cron task.
type Manager ¶
type Manager struct {
// contains filtered or unexported fields
}
Manager handles plugin lifecycle: loading, registration, and invocation.
func NewManager ¶
NewManager creates a plugin manager with the given host API.
func (*Manager) List ¶
func (m *Manager) List() []GKRegistration
List returns all registered plugin manifests.
func (*Manager) MenuItems ¶
func (m *Manager) MenuItems(location string) []PluginMenuItem
MenuItems returns all menu items from all enabled plugins.
func (*Manager) Routes ¶
func (m *Manager) Routes() []PluginRoute
Routes returns all routes from all enabled plugins.
func (*Manager) ShutdownAll ¶
ShutdownAll shuts down all plugins gracefully.
func (*Manager) Unregister ¶
Unregister shuts down and removes a plugin.
func (*Manager) Widgets ¶
func (m *Manager) Widgets(location string) []PluginWidget
Widgets returns all widgets from all enabled plugins for a location.
type MenuItemSpec ¶
type MenuItemSpec struct {
ID string `json:"id"` // unique identifier
Label string `json:"label"` // display text (can be i18n key)
Icon string `json:"icon,omitempty"` // icon name or SVG
Path string `json:"path"` // URL path when clicked
Location string `json:"location"` // where to insert: "admin", "agent", "customer"
Parent string `json:"parent,omitempty"` // parent menu ID for submenus
Order int `json:"order,omitempty"` // sort order within location
Children []MenuItemSpec `json:"children,omitempty"` // nested menu items
}
MenuItemSpec defines a navigation menu entry.
type Plugin ¶
type Plugin interface {
// GKRegister returns plugin metadata. Called once at load time.
// This is how plugins self-describe their capabilities per the GoatKit spec.
GKRegister() GKRegistration
// Init is called after loading, before the plugin serves requests.
// The HostAPI provides access to host services (db, cache, http, etc).
Init(ctx context.Context, host HostAPI) error
// Call invokes a plugin function by name with JSON-encoded arguments.
// Returns JSON-encoded response or error.
// This is the primary communication channel between host and plugin.
Call(ctx context.Context, fn string, args json.RawMessage) (json.RawMessage, error)
// Shutdown is called before unloading the plugin.
// Plugins should clean up resources and finish pending work.
Shutdown(ctx context.Context) error
}
Plugin is the unified interface for WASM and gRPC plugins. Both runtime implementations must satisfy this interface.
type PluginMenuItem ¶
type PluginMenuItem struct {
PluginName string
MenuItemSpec
}
PluginMenuItem pairs a menu item spec with its plugin name.
type PluginRoute ¶
PluginRoute pairs a route spec with its plugin name.
type PluginWidget ¶
type PluginWidget struct {
PluginName string
WidgetSpec
}
PluginWidget pairs a widget spec with its plugin name.
type RouteSpec ¶
type RouteSpec struct {
Method string `json:"method"` // GET, POST, PUT, DELETE, etc.
Path string `json:"path"` // URL path, e.g. "/admin/stats"
Handler string `json:"handler"` // plugin function to call
Middleware []string `json:"middleware,omitempty"` // middleware chain, e.g. ["auth", "admin"]
Description string `json:"description,omitempty"` // for documentation
}
RouteSpec defines an HTTP route the plugin wants to handle.
type TemplateSpec ¶
type TemplateSpec struct {
Name string `json:"name"` // template name, e.g. "stats/dashboard.html"
Path string `json:"path"` // path within plugin package
Override bool `json:"override,omitempty"` // if true, overrides host template of same name
}
TemplateSpec defines a template the plugin provides.
type WidgetSpec ¶
type WidgetSpec struct {
ID string `json:"id"` // unique identifier
Title string `json:"title"` // display title (can be i18n key)
Description string `json:"description,omitempty"` // widget description
Handler string `json:"handler"` // plugin function that returns widget HTML
Location string `json:"location"` // dashboard location: "agent_home", "admin_home"
Size string `json:"size,omitempty"` // "small", "medium", "large", "full"
Order int `json:"order,omitempty"` // sort order within location
Refreshable bool `json:"refreshable,omitempty"` // can be refreshed via AJAX
RefreshSec int `json:"refresh_sec,omitempty"` // auto-refresh interval
}
WidgetSpec defines a dashboard widget.
Directories
¶
| Path | Synopsis |
|---|---|
|
Package example provides example plugin implementations for testing.
|
Package example provides example plugin implementations for testing. |
|
Package grpc provides gRPC-based plugin runtime using HashiCorp go-plugin.
|
Package grpc provides gRPC-based plugin runtime using HashiCorp go-plugin. |
|
example
command
Example gRPC plugin for GoatKit.
|
Example gRPC plugin for GoatKit. |
|
Package wasm provides a WASM-based plugin runtime using wazero.
|
Package wasm provides a WASM-based plugin runtime using wazero. |