Help us shape the future of Go! Take the 2026 Go Developer Survey

events

package
v0.3.0 Latest Latest
Warning

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

Go to latest
Published: Oct 19, 2026 License: AGPL-3.0 Imports: 1 Imported by: 0

Documentation

Overview

Package events is the in-process event hub. The pipeline, the action executor and the account supervisors publish; the HTTP layer subscribes and writes each event to its Server-Sent Events stream. It lives outside internal/api so publishers need not import the HTTP layer.

Index

Constants

View Source
const (
	MessageProcessed = "message.processed" // Data: store.ActivityRow
	MessageReview    = "message.review"    // Data: store.ActivityRow
	ActionUndone     = "action.undone"     // Data: store.Action
	AccountStatus    = "account.status"    // Data: store.Account
	BatchProgress    = "batch.progress"
	CheckProgress    = "check.progress" // a cleanup check moved forward or ended; Data: worker.CheckState (rows omitted)
	RulesChanged     = "rules.changed"
	UsageUpdated     = "usage.updated" // Data: nil
	// NotificationsChanged: a notification destination was added or removed, or a module
	// reported a delivery. Data: nil
	NotificationsChanged = "notifications.changed"
	// QuestionsChanged: a question about the person's moves was asked, brought up to date
	// or answered (GET /api/activity/questions). Data: nil
	QuestionsChanged = "questions.changed"
	// PlanChanged: the tenant's plan changed (bought, changed, ended), and with it what it
	// may use and which features it has (GET /api/plan, /api/settings, /api/limits). Data: nil
	PlanChanged = "plan.changed"
)

Event names, as sent in the SSE "event:" field.

View Source
const Keep = 200

Keep is how many past events a reconnecting subscriber can replay.

Variables

This section is empty.

Functions

This section is empty.

Types

type Event

type Event struct {
	ID        int64
	Name      string
	Data      any
	TenantID  int64
	AccountID int64 // 0 = not about one mailbox
}

Event is one published event. IDs grow by one per event and restart with the daemon. Data is the Go value; the HTTP layer chooses its JSON shape.

TenantID and AccountID say who may receive it: the HTTP layer hands an event only to a subscriber of that tenant and, when AccountID is set, only to one who sees that mailbox at the moment it is sent. Every publisher names a tenant: an event of TenantID 0 goes to nobody.

type Hub

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

Hub fans events out to subscribers and remembers the last Keep. A nil *Hub drops everything, so publishers need no nil checks.

func NewHub

func NewHub() *Hub

NewHub returns an empty hub.

func (*Hub) Publish

func (h *Hub) Publish(tenantID, accountID int64, name string, data any)

Publish stores the event, for tenantID and, when it is about one mailbox, accountID (0 = none), and hands it to every subscriber. It never blocks: a subscriber that has fallen subBuffer events behind is dropped (its channel closes) and catches up by subscribing again with the last id it saw.

func (*Hub) Subscribe

func (h *Hub) Subscribe(lastID int64) (missed []Event, live <-chan Event, cancel func())

Subscribe returns the kept events with an id above lastID (the client's Last-Event-ID; 0 for a new client replays nothing), then a channel of everything published afterwards. A lastID from before a daemon restart is ahead of the hub and replays everything kept. cancel ends the subscription and may be called more than once.

Jump to

Keyboard shortcuts

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