2021-01-13 17:07:04 +00:00
|
|
|
package endpoint
|
2020-04-13 22:14:56 +00:00
|
|
|
|
|
|
|
import (
|
2020-10-02 09:56:48 +00:00
|
|
|
"context"
|
2021-02-10 20:26:45 +00:00
|
|
|
"time"
|
2020-12-26 13:11:49 +00:00
|
|
|
|
2021-02-10 20:26:45 +00:00
|
|
|
"go.uber.org/zap"
|
2020-04-13 22:14:56 +00:00
|
|
|
)
|
|
|
|
|
2021-02-10 20:26:45 +00:00
|
|
|
const (
|
|
|
|
startupTimeoutDuration = 100 * time.Millisecond
|
|
|
|
)
|
2020-05-03 08:15:24 +00:00
|
|
|
|
2021-02-10 20:26:45 +00:00
|
|
|
type Endpoint struct {
|
|
|
|
Spec
|
|
|
|
name string
|
|
|
|
uplink Uplink
|
2020-04-13 22:14:56 +00:00
|
|
|
}
|
|
|
|
|
2021-02-10 20:26:45 +00:00
|
|
|
func (e Endpoint) Start(lifecycle Lifecycle) (err error) {
|
|
|
|
startupResult := make(chan error)
|
|
|
|
ctx, cancel := context.WithTimeout(lifecycle.Context(), startupTimeoutDuration)
|
|
|
|
defer cancel()
|
2020-05-03 08:15:24 +00:00
|
|
|
|
2021-02-10 20:26:45 +00:00
|
|
|
go func() {
|
|
|
|
defer func() {
|
|
|
|
if r := recover(); r != nil {
|
|
|
|
lifecycle.Logger().Fatal("Startup error recovered", zap.Any("recovered", r))
|
|
|
|
}
|
|
|
|
}()
|
2020-05-03 08:15:24 +00:00
|
|
|
|
2021-02-10 20:26:45 +00:00
|
|
|
startupResult <- e.Handler.Start(lifecycle)
|
|
|
|
}()
|
2020-05-03 08:15:24 +00:00
|
|
|
|
2021-02-10 20:26:45 +00:00
|
|
|
select {
|
|
|
|
case err = <-startupResult:
|
|
|
|
case <-ctx.Done():
|
|
|
|
err = ErrStartupTimeout
|
|
|
|
}
|
2020-04-13 22:14:56 +00:00
|
|
|
|
2021-02-10 20:26:45 +00:00
|
|
|
return
|
2020-04-13 22:14:56 +00:00
|
|
|
}
|