feat(lifecycle): supervise services and bounded shutdown (#13)
Documentation / docs (push) Successful in 25s
ci / check (push) Successful in 1m43s

Add ordered setup, reverse rollback and teardown, concurrent services,
and managed background workers using only the standard library.

Coordinate context cancellation, injectable signals and joined errors within
one configurable shutdown deadline. Include race tests, a two-service example,
and the accepted lifecycle ADR.

Closes #5
This commit was merged in pull request #13.
This commit is contained in:
end committed 2026-10-27 15:01:50 -07:00
1 parent 46c4416ed4
commit e5298cff37
5 files changed
+1228 -1

No files matched your search

+26 -1
View File
@@ -1,6 +1,6 @@
# corestack go
Shared Go building blocks. The first one is `docs`, a checker for architecture decision records (ADRs) and implementation plans.
Shared Go building blocks. Includes `docs`, a checker for architecture decision records (ADRs) and implementation plans, and `lifecycle`, a service and worker coordinator.
## docs
@@ -20,6 +20,31 @@ docs check [--root DIR] # prints path:line: messa
The format is specified in [docs/docs-format.md](docs/docs-format.md); that document is the complete rule set. Exit status is `0` when every record is valid, `1` when problems are reported and `2` for usage errors.
## lifecycle
`go.auvem.com/corestack/lifecycle` sets up modules in registration order, runs
services concurrently, and tears down successful setups in reverse order.
Construct an `App` with a required `*slog.Logger`, register `Module` callbacks,
and call `Run(ctx)` once. See the [two-service example](lifecycle/example_test.go).
Launch background work with `app.Go(ctx, name, fn)` using the callback's lifecycle
context or a descendant, and handle admission errors. Run waits for every service
and admitted worker; raw goroutines remain your responsibility. First failure or
an injected signal cancels work before teardown. One shared shutdown deadline
(default 30 seconds) covers hooks and callback completion; a second signal
abandons shutdown. Callbacks must cooperate: abandonment cannot kill goroutines,
and the caller owns process exit and any unreleased resources.
During App-initiated shutdown, callback errors containing only the callback's
context cancellation are omitted. Mixed cancellation and independent failures
are retained intact to preserve wrapper types, identity and custom matching;
these errors may still match cancellation through `errors.Is`.
The caller owns signal subscription, SIGINT/SIGTERM filtering, a channel buffered
for at least two signals, and subscription cleanup. Nil signals disable reception.
There are no signal subscriptions, process exits, external dependencies or CLI
integration in this package.
## Status
No support is guaranteed. Breaking changes, including to the format rules, may happen before 1.0 and are listed in the release notes.