controls

package
v1.3.0 Latest Latest
Warning

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

Go to latest
Published: Mar 23, 2026 License: MIT Imports: 9 Imported by: 0

README

Controls

Service orchestration and lifecycle management for long-running processes.

Provides:

  • Controller for managing background services
  • Lifecycle hooks for startup and shutdown
  • Standard interfaces for cancellable tasks

For detailed documentation and implementation patterns, see the Controls Component Documentation.

Documentation

Overview

Package controls provides a lifecycle controller for managing concurrent, long-running services such as HTTP servers, background workers, and schedulers.

The Controller orchestrates startup, health monitoring, and graceful shutdown with proper cleanup ordering. Shared communication channels carry errors, OS signals, and control messages between registered services.

The Controllable interface abstracts the controller for testing, exposing Start, Stop, IsRunning, IsStopped, IsStopping, Register, and configuration methods. Concrete transports are provided by the grpc and http sub-packages.

Index

Constants

View Source
const DefaultShutdownTimeout = 5 * time.Second

Variables

View Source
var ErrShutdown = errors.New("controller shutdown")

ErrShutdown is the cause attached to the controller context when a graceful shutdown is initiated. Callers can distinguish a controlled stop from an upstream cancellation via context.Cause(ctx) == controls.ErrShutdown.

Functions

This section is empty.

Types

type ChannelProvider

type ChannelProvider interface {
	Messages() chan Message
	Health() chan HealthMessage
	Errors() chan error
	Signals() chan os.Signal
}

ChannelProvider provides access to controller channels.

type Configurable

type Configurable interface {
	SetErrorsChannel(errs chan error)
	SetMessageChannel(control chan Message)
	SetSignalsChannel(sigs chan os.Signal)
	SetHealthChannel(health chan HealthMessage)
	SetWaitGroup(wg *sync.WaitGroup)
	SetShutdownTimeout(d time.Duration)
	SetLogger(l logger.Logger)
}

Configurable provides controller configuration setters.

type Controllable

type Controllable interface {
	Runner
	StateAccessor
	Configurable
	ChannelProvider
}

Controllable is the full controller interface, composed of all role-based interfaces. Prefer using the narrower interfaces (Runner, Configurable, etc.) where possible.

type Controller

type Controller struct {
	// contains filtered or unexported fields
}

func NewController

func NewController(ctx context.Context, opts ...ControllerOpt) *Controller

func (*Controller) Errors

func (c *Controller) Errors() chan error

func (*Controller) GetContext

func (c *Controller) GetContext() context.Context

func (*Controller) GetLogger

func (c *Controller) GetLogger() logger.Logger

func (*Controller) GetState

func (c *Controller) GetState() State

func (*Controller) Health

func (c *Controller) Health() chan HealthMessage

func (*Controller) IsRunning

func (c *Controller) IsRunning() bool

func (*Controller) IsStopped

func (c *Controller) IsStopped() bool

func (*Controller) IsStopping

func (c *Controller) IsStopping() bool

func (*Controller) Messages

func (c *Controller) Messages() chan Message

func (*Controller) Register

func (c *Controller) Register(id string, opts ...ServiceOption)

func (*Controller) SetErrorsChannel

func (c *Controller) SetErrorsChannel(errs chan error)

func (*Controller) SetHealthChannel

func (c *Controller) SetHealthChannel(health chan HealthMessage)

func (*Controller) SetLogger

func (c *Controller) SetLogger(l logger.Logger)

func (*Controller) SetMessageChannel

func (c *Controller) SetMessageChannel(messages chan Message)

func (*Controller) SetShutdownTimeout

func (c *Controller) SetShutdownTimeout(d time.Duration)

func (*Controller) SetSignalsChannel

func (c *Controller) SetSignalsChannel(signals chan os.Signal)

func (*Controller) SetState

func (c *Controller) SetState(state State)

func (*Controller) SetWaitGroup

func (c *Controller) SetWaitGroup(wg *sync.WaitGroup)

func (*Controller) Signals

func (c *Controller) Signals() chan os.Signal

func (*Controller) Start

func (c *Controller) Start()

Start launches all registered services. Duplicate calls while already running are no-ops.

func (*Controller) Stop

func (c *Controller) Stop()

Stop initiates a graceful shutdown. Duplicate calls while already stopping or stopped are safely ignored.

func (*Controller) Wait

func (c *Controller) Wait()

func (*Controller) WaitGroup

func (c *Controller) WaitGroup() *sync.WaitGroup

type ControllerOpt

type ControllerOpt func(Configurable)

ControllerOpt is a functional option for configuring a Controller.

func WithLogger

func WithLogger(l logger.Logger) ControllerOpt

WithLogger sets the controller logger.

func WithShutdownTimeout

func WithShutdownTimeout(d time.Duration) ControllerOpt

WithShutdownTimeout sets the graceful shutdown timeout.

func WithoutSignals

func WithoutSignals() ControllerOpt

WithoutSignals disables OS signal handling.

type HealthMessage

type HealthMessage struct {
	Host    string `json:"host"`
	Port    int    `json:"port"`
	Status  int    `json:"status"`
	Message string `json:"message"`
}

type Message

type Message string
const (
	Stop   Message = "stop"
	Status Message = "status"
)

type Runner

type Runner interface {
	Start()
	Stop()
	IsRunning() bool
	IsStopped() bool
	IsStopping() bool
	Register(id string, opts ...ServiceOption)
}

Runner provides service lifecycle operations.

type Service

type Service struct {
	Name   string
	Start  StartFunc
	Stop   StopFunc
	Status StatusFunc
}

type ServiceOption

type ServiceOption func(*Service)

func WithStart

func WithStart(fn StartFunc) ServiceOption

func WithStatus

func WithStatus(fn StatusFunc) ServiceOption

func WithStop

func WithStop(fn StopFunc) ServiceOption

type Services

type Services struct {
	// contains filtered or unexported fields
}

type StartFunc

type StartFunc func(context.Context) error

type State

type State string
const (
	Unknown  State = "unknown"
	Running  State = "running"
	Stopping State = "stopping"
	Stopped  State = "stopped"
)

type StateAccessor

type StateAccessor interface {
	GetState() State
	SetState(state State)
	GetContext() context.Context
	GetLogger() logger.Logger
}

StateAccessor provides read access to controller state and context.

type StatusFunc

type StatusFunc func()

type StopFunc

type StopFunc func(context.Context)

type ValidErrorFunc

type ValidErrorFunc func(error) bool

Directories

Path Synopsis
Package grpc provides a gRPC transport for the controls lifecycle controller, enabling remote service management and health checking over gRPC.
Package grpc provides a gRPC transport for the controls lifecycle controller, enabling remote service management and health checking over gRPC.
Package http provides an HTTP transport for the controls lifecycle controller, exposing health, readiness, and management endpoints for use with container orchestrators and load balancers.
Package http provides an HTTP transport for the controls lifecycle controller, exposing health, readiness, and management endpoints for use with container orchestrators and load balancers.

Jump to

Keyboard shortcuts

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