feat(GODT-2500): Add panic handlers everywhere.

This commit is contained in:
Jakub
2023-03-22 17:18:17 +01:00
parent 9f59e61b14
commit ec92c918cd
42 changed files with 283 additions and 130 deletions

View File

@ -30,7 +30,7 @@ func TestFocus_Raise(t *testing.T) {
tmpDir := t.TempDir()
locations := locations.New(newTestLocationsProvider(tmpDir), "config-name")
// Start the focus service.
service, err := NewService(locations, semver.MustParse("1.2.3"))
service, err := NewService(locations, semver.MustParse("1.2.3"), nil)
require.NoError(t, err)
settingsFolder, err := locations.ProvideSettingsPath()
@ -52,7 +52,7 @@ func TestFocus_Version(t *testing.T) {
tmpDir := t.TempDir()
locations := locations.New(newTestLocationsProvider(tmpDir), "config-name")
// Start the focus service.
_, err := NewService(locations, semver.MustParse("1.2.3"))
_, err := NewService(locations, semver.MustParse("1.2.3"), nil)
require.NoError(t, err)
settingsFolder, err := locations.ProvideSettingsPath()

View File

@ -24,6 +24,7 @@ import (
"net"
"github.com/Masterminds/semver/v3"
"github.com/ProtonMail/proton-bridge/v3/internal/async"
"github.com/ProtonMail/proton-bridge/v3/internal/focus/proto"
"github.com/ProtonMail/proton-bridge/v3/internal/service"
"github.com/sirupsen/logrus"
@ -43,15 +44,18 @@ type Service struct {
server *grpc.Server
raiseCh chan struct{}
version *semver.Version
panicHandler async.PanicHandler
}
// NewService creates a new focus service.
// It listens on the local host and port 1042 (by default).
func NewService(locator service.Locator, version *semver.Version) (*Service, error) {
func NewService(locator service.Locator, version *semver.Version, panicHandler async.PanicHandler) (*Service, error) {
serv := &Service{
server: grpc.NewServer(),
raiseCh: make(chan struct{}, 1),
version: version,
server: grpc.NewServer(),
raiseCh: make(chan struct{}, 1),
version: version,
panicHandler: panicHandler,
}
proto.RegisterFocusServer(serv.server, serv)
@ -73,6 +77,8 @@ func NewService(locator service.Locator, version *semver.Version) (*Service, err
}
go func() {
defer serv.handlePanic()
if err := serv.server.Serve(listener); err != nil {
fmt.Printf("failed to serve: %v", err)
}
@ -82,6 +88,12 @@ func NewService(locator service.Locator, version *semver.Version) (*Service, err
return serv, nil
}
func (service *Service) handlePanic() {
if service.panicHandler != nil {
service.panicHandler.HandlePanic()
}
}
// Raise implements the gRPC FocusService interface; it raises the application.
func (service *Service) Raise(context.Context, *emptypb.Empty) (*emptypb.Empty, error) {
service.raiseCh <- struct{}{}
@ -103,6 +115,8 @@ func (service *Service) GetRaiseCh() <-chan struct{} {
// Close closes the service.
func (service *Service) Close() {
go func() {
defer service.handlePanic()
// we do this in a goroutine, as on Windows, the gRPC shutdown may take minutes if something tries to
// interact with it in an invalid way (e.g. HTTP GET request from a Qt QNetworkManager instance).
service.server.Stop()