Documentation
¶
Overview ¶
Package poller is the ingester a self-hosted bench needs by default.
Without a GitHub App there is no webhook to receive, so the daemon asks GitHub instead: once per interval it reads every repository in the local machine's published inventory and compares the answer with what it saw last time. A moved default branch or a renamed repository produces exactly the repositoryevent.Event the webhook path would have produced, enqueued for the local machine through the hub's own repository-event store. The daemon downstream cannot tell the two apart, which is the point: polling and webhooks are two ways to fill one queue.
Event IDs are derived from repository, reason and target, so a replay after a crash deduplicates through the store's marker collection rather than fast-forwarding a clone twice.
Index ¶
Constants ¶
const ( // DefaultAPIBaseURL is GitHub's public API. A test points this at an // httptest server instead. DefaultAPIBaseURL = "https://api.github.com" // DefaultInterval matches hub.github.poll_interval's default. DefaultInterval = 60 * time.Second // MaxBackoff bounds the exponential retreat after a transient GitHub // failure. Ten minutes is long enough to ride out an incident and short // enough that an operator who fixes their token does not have to restart // the daemon to see it work. MaxBackoff = 10 * time.Minute )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Options ¶
type Options struct {
// Client performs the GitHub requests.
Client *http.Client
// APIBaseURL is GitHub's API origin. Empty means DefaultAPIBaseURL.
APIBaseURL string
// Token returns the operator's GitHub token. It is called once per tick
// so that rotating the token file takes effect without a restart, and its
// result is never narrated, logged, or stored.
Token func() (string, error)
// Snapshots is where the local machine's repository inventory is read
// from: the poller polls exactly what the machine publishes.
Snapshots hub.MachineSnapshotStore
// Events receives the enqueued events.
Events hub.RepositoryEventStore
// Observations is the poller's memory of what it last saw.
Observations hub.PollObservationStore
// Machine is the local machine every polled event is queued for.
Machine hub.Machine
// Interval is the gap between ticks. Zero means DefaultInterval.
Interval time.Duration
// Now and Sleep exist so a test drives time instead of waiting for it.
Now func() time.Time
Sleep func(context.Context, time.Duration) error
// Narrate receives one line per repository observed, plus one line for a
// failure that ends a tick before any repository is read.
Narrate func(narrate.Line)
// Covered reports whether an installed GitHub App already delivers
// webhooks for a repository, which the poller then skips. Nil means
// nothing is covered, which is the whole of this feature's default
// journey; webhook mode supplies it.
Covered func(repository string) bool
}
Options configures a Poller. Client, Snapshots, Events, Observations and Machine are required; everything else has a working default.
type Poller ¶
type Poller struct {
// contains filtered or unexported fields
}
Poller reads GitHub on an interval and enqueues what changed.
func (*Poller) Repositories ¶
Repositories is how many repositories the last tick actually polled, which `wb daemon status` reports. It is read from another goroutine.
func (*Poller) Run ¶
Run ticks until ctx ends. It returns nil on a cancelled context: a stopped poller is a normal shutdown, not a failure the daemon should report.