plugin

package
v0.6.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 2, 2026 License: Apache-2.0 Imports: 5 Imported by: 0

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

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) CacheGet

func (h *DefaultHostAPI) CacheGet(ctx context.Context, key string) ([]byte, bool, error)

CacheGet retrieves 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) ConfigGet

func (h *DefaultHostAPI) ConfigGet(ctx context.Context, key string) (string, error)

ConfigGet retrieves a configuration value.

func (*DefaultHostAPI) DBExec

func (h *DefaultHostAPI) DBExec(ctx context.Context, query string, args ...any) (int64, error)

DBExec executes a statement and returns affected rows.

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.

func (*DefaultHostAPI) Log

func (h *DefaultHostAPI) Log(ctx context.Context, level, message string, fields map[string]any)

Log writes a log entry.

func (*DefaultHostAPI) SendEmail

func (h *DefaultHostAPI) SendEmail(ctx context.Context, to, subject, body string, html bool) error

SendEmail sends an email.

func (*DefaultHostAPI) Translate

func (h *DefaultHostAPI) Translate(ctx context.Context, key string, args ...any) string

Translate translates a key to the current locale.

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

func NewManager(host HostAPI) *Manager

NewManager creates a plugin manager with the given host API.

func (*Manager) Call

func (m *Manager) Call(ctx context.Context, pluginName, fn string, args []byte) ([]byte, error)

Call invokes a function on a specific plugin.

func (*Manager) Disable

func (m *Manager) Disable(name string) error

Disable disables a plugin without unloading it.

func (*Manager) Enable

func (m *Manager) Enable(name string) error

Enable enables a previously disabled plugin.

func (*Manager) Get

func (m *Manager) Get(name string) (Plugin, bool)

Get returns a plugin by name.

func (*Manager) Jobs

func (m *Manager) Jobs() []PluginJob

Jobs returns all jobs from all enabled plugins.

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) Register

func (m *Manager) Register(ctx context.Context, p Plugin) error

Register loads and initializes a plugin.

func (*Manager) Routes

func (m *Manager) Routes() []PluginRoute

Routes returns all routes from all enabled plugins.

func (*Manager) ShutdownAll

func (m *Manager) ShutdownAll(ctx context.Context) error

ShutdownAll shuts down all plugins gracefully.

func (*Manager) Unregister

func (m *Manager) Unregister(ctx context.Context, name string) error

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 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 PluginJob

type PluginJob struct {
	PluginName string
	JobSpec
}

PluginJob pairs a job spec with its plugin name.

type PluginMenuItem

type PluginMenuItem struct {
	PluginName string
	MenuItemSpec
}

PluginMenuItem pairs a menu item spec with its plugin name.

type PluginRoute

type PluginRoute struct {
	PluginName string
	RouteSpec  RouteSpec
}

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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL