From de5fd07a22cb358f2fac1064beef66630c719bb0 Mon Sep 17 00:00:00 2001 From: Jakub Date: Thu, 30 Mar 2023 17:50:40 +0200 Subject: [PATCH] feat(GODT-2500): Reorganise async methods. --- Makefile | 2 +- go.mod | 6 +- go.sum | 20 +- internal/app/migration_test.go | 8 +- internal/app/vault.go | 2 +- internal/async/context.go | 82 ------ internal/async/group.go | 233 ------------------ internal/bridge/api.go | 4 +- internal/bridge/api_default.go | 4 +- internal/bridge/api_qa.go | 4 +- internal/bridge/bridge.go | 2 +- internal/bridge/bridge_test.go | 4 +- internal/bridge/imap.go | 2 +- internal/bridge/sync_test.go | 4 +- internal/bridge/user.go | 2 +- internal/bridge/user_event_test.go | 6 +- internal/dialer/dialer_proxy.go | 10 +- internal/dialer/dialer_proxy_provider.go | 16 +- internal/dialer/dialer_proxy_provider_test.go | 26 +- internal/dialer/dialer_proxy_test.go | 22 +- internal/focus/service.go | 12 +- internal/frontend/cli/frontend.go | 10 +- internal/frontend/grpc/service.go | 5 +- internal/frontend/grpc/service_stream.go | 2 +- internal/frontend/grpc/service_user.go | 6 +- internal/try/try.go | 16 +- internal/user/events.go | 6 +- internal/user/smtp.go | 7 +- internal/user/sync.go | 14 +- internal/user/sync_reporter.go | 6 +- internal/user/types.go | 2 +- internal/user/user.go | 25 +- internal/vault/migrate_test.go | 4 +- internal/vault/settings_test.go | 4 +- internal/vault/vault.go | 10 +- internal/vault/vault_bench_test.go | 4 +- internal/vault/vault_test.go | 16 +- tests/collector_test.go | 14 +- tests/ctx_bridge_test.go | 12 +- tests/ctx_helper_test.go | 4 +- tests/ctx_test.go | 4 +- utils/vault-editor/main.go | 5 +- 42 files changed, 136 insertions(+), 511 deletions(-) delete mode 100644 internal/async/context.go delete mode 100644 internal/async/group.go diff --git a/Makefile b/Makefile index c08dfb35..b5715507 100644 --- a/Makefile +++ b/Makefile @@ -253,7 +253,7 @@ coverage: test mocks: mockgen --package mocks github.com/ProtonMail/proton-bridge/v3/internal/bridge TLSReporter,ProxyController,Autostarter > tmp mv tmp internal/bridge/mocks/mocks.go - mockgen --package mocks github.com/ProtonMail/proton-bridge/v3/internal/async PanicHandler > internal/bridge/mocks/async_mocks.go + mockgen --package mocks github.com/ProtonMail/gluon/async PanicHandler > internal/bridge/mocks/async_mocks.go mockgen --package mocks github.com/ProtonMail/gluon/reporter Reporter > internal/bridge/mocks/gluon_mocks.go mockgen --package mocks github.com/ProtonMail/proton-bridge/v3/internal/updater Downloader,Installer > internal/updater/mocks/mocks.go diff --git a/go.mod b/go.mod index aa13f862..66927c0d 100644 --- a/go.mod +++ b/go.mod @@ -5,9 +5,9 @@ go 1.18 require ( github.com/0xAX/notificator v0.0.0-20220220101646-ee9b8921e557 github.com/Masterminds/semver/v3 v3.2.0 - github.com/ProtonMail/gluon v0.15.1-0.20230329124608-19b8f7b4e7b0 + github.com/ProtonMail/gluon v0.15.1-0.20230331095629-e23a7a1be2a8 github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a - github.com/ProtonMail/go-proton-api v0.4.1-0.20230327135835-2751384cef6f + github.com/ProtonMail/go-proton-api v0.4.1-0.20230331115846-7ba084061eaa github.com/ProtonMail/gopenpgp/v2 v2.5.2 github.com/PuerkitoBio/goquery v1.8.1 github.com/abiosoft/ishell v2.0.0+incompatible @@ -125,8 +125,6 @@ require ( ) replace ( - github.com/ProtonMail/gluon => /home/dev/gopath18/src/gluon - github.com/ProtonMail/go-proton-api => /home/dev/gopath18/src/go-proton-api github.com/docker/docker-credential-helpers => github.com/ProtonMail/docker-credential-helpers v1.1.0 github.com/emersion/go-message => github.com/ProtonMail/go-message v0.0.0-20210611055058-fabeff2ec753 github.com/keybase/go-keychain => github.com/cuthix/go-keychain v0.0.0-20220405075754-31e7cee908fe diff --git a/go.sum b/go.sum index 3d09459d..1466ca35 100644 --- a/go.sum +++ b/go.sum @@ -28,12 +28,8 @@ github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf h1:yc9daCCYUefEs github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf/go.mod h1:o0ESU9p83twszAU8LBeJKFAAMX14tISa0yk4Oo5TOqo= github.com/ProtonMail/docker-credential-helpers v1.1.0 h1:+kvUIpwWcbtP3WFv5sSvkFn/XLzSqPOB5AAthuk9xPk= github.com/ProtonMail/docker-credential-helpers v1.1.0/go.mod h1:mK0aBveCxhnQ756AmaTfXMZDeULvheYVhF/MWMErN5g= -github.com/ProtonMail/gluon v0.15.1-0.20230321074233-2d09826346c1 h1:zVKqnKO/vTMrVw1dleGsj1JlY9jbhK890X0htvGCbjY= -github.com/ProtonMail/gluon v0.15.1-0.20230321074233-2d09826346c1/go.mod h1:yA4hk6CJw0BMo+YL8Y3ckCYs5L20sysu9xseshwY3QI= -github.com/ProtonMail/gluon v0.15.1-0.20230322121010-574da2df3546 h1:eJ8gO99EjpuGoUDI0R2VZSzQ7SGPD0ggTbjJaA0xtzE= -github.com/ProtonMail/gluon v0.15.1-0.20230322121010-574da2df3546/go.mod h1:yA4hk6CJw0BMo+YL8Y3ckCYs5L20sysu9xseshwY3QI= -github.com/ProtonMail/gluon v0.15.1-0.20230329124608-19b8f7b4e7b0 h1:FASrdEaNRJSHFjrOZ5WO4CKuYZb2zoCyFNqplrsZmOQ= -github.com/ProtonMail/gluon v0.15.1-0.20230329124608-19b8f7b4e7b0/go.mod h1:yA4hk6CJw0BMo+YL8Y3ckCYs5L20sysu9xseshwY3QI= +github.com/ProtonMail/gluon v0.15.1-0.20230331095629-e23a7a1be2a8 h1:USMR8imbxkP4Ailch4ceV3hCZTaANMIGHhb5rpZFYn4= +github.com/ProtonMail/gluon v0.15.1-0.20230331095629-e23a7a1be2a8/go.mod h1:yA4hk6CJw0BMo+YL8Y3ckCYs5L20sysu9xseshwY3QI= github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a h1:D+aZah+k14Gn6kmL7eKxoo/4Dr/lK3ChBcwce2+SQP4= github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a/go.mod h1:oTGdE7/DlWIr23G0IKW3OXK9wZ5Hw1GGiaJFccTvZi4= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= @@ -44,16 +40,8 @@ github.com/ProtonMail/go-message v0.0.0-20210611055058-fabeff2ec753 h1:I8IsYA297 github.com/ProtonMail/go-message v0.0.0-20210611055058-fabeff2ec753/go.mod h1:NBAn21zgCJ/52WLDyed18YvYFm5tEoeDauubFqLokM4= github.com/ProtonMail/go-mime v0.0.0-20221031134845-8fd9bc37cf08 h1:dS7r5z4iGS0qCjM7UwWdsEMzQesUQbGcXdSm2/tWboA= github.com/ProtonMail/go-mime v0.0.0-20221031134845-8fd9bc37cf08/go.mod h1:qRZgbeASl2a9OwmsV85aWwRqic0NHPh+9ewGAzb4cgM= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230321105122-1945ba8a46f9 h1:RyOYt/rc3hQtIKFUDJObah2g8wouIFVTorou5mmIHQI= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230321105122-1945ba8a46f9/go.mod h1:4AXhqhB+AGVasVIlift9Lr1Btxg5S83xXPiyiT7mKUc= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230323120945-5a6ef5a2ecdd h1:Y/XKWw0s7DDJn5R1lJmsREeGyumLcn/RDcvLozYnB88= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230323120945-5a6ef5a2ecdd/go.mod h1:4AXhqhB+AGVasVIlift9Lr1Btxg5S83xXPiyiT7mKUc= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230324123811-83e98cb35c9a h1:sKcw8YlNxqO9iDDYdbZNVUCqk6Ta6liyfFBUR0Lai7o= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230324123811-83e98cb35c9a/go.mod h1:4AXhqhB+AGVasVIlift9Lr1Btxg5S83xXPiyiT7mKUc= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230327062918-71c20587e0fc h1:D0F4mxNVwIzYcjt8SEuIh4EzJhWgWw1f4eNc1iWrXnQ= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230327062918-71c20587e0fc/go.mod h1:4AXhqhB+AGVasVIlift9Lr1Btxg5S83xXPiyiT7mKUc= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230327135835-2751384cef6f h1:lqf3DlFQMvfDi7zGVKTlciyxXfvkoi6CCISu9nx8nak= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230327135835-2751384cef6f/go.mod h1:4AXhqhB+AGVasVIlift9Lr1Btxg5S83xXPiyiT7mKUc= +github.com/ProtonMail/go-proton-api v0.4.1-0.20230331115846-7ba084061eaa h1:0JKWkz/gIYf+eky0dCFeBWrjEDLf59lS8HOlXtvn6Nk= +github.com/ProtonMail/go-proton-api v0.4.1-0.20230331115846-7ba084061eaa/go.mod h1:RfpLBcTIhfjOIcBhh7f36LtAOEi0mqPd3t8gyLWmCZM= github.com/ProtonMail/go-srp v0.0.5 h1:xhUioxZgDbCnpo9JehyFhwwsn9JLWkUGfB0oiKXgiGg= github.com/ProtonMail/go-srp v0.0.5/go.mod h1:06iYHtLXW8vjLtccWj++x3MKy65sIT8yZd7nrJF49rs= github.com/ProtonMail/gopenpgp/v2 v2.5.2 h1:97SjlWNAxXl9P22lgwgrZRshQdiEfAht0g3ZoiA1GCw= diff --git a/internal/app/migration_test.go b/internal/app/migration_test.go index c994ed63..e25f2a59 100644 --- a/internal/app/migration_test.go +++ b/internal/app/migration_test.go @@ -25,7 +25,7 @@ import ( "runtime" "testing" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/gopenpgp/v2/crypto" "github.com/ProtonMail/proton-bridge/v3/internal/bridge" "github.com/ProtonMail/proton-bridge/v3/internal/cookies" @@ -41,7 +41,7 @@ import ( func TestMigratePrefsToVaultWithKeys(t *testing.T) { // Create a new vault. - vault, corrupt, err := vault.New(t.TempDir(), t.TempDir(), []byte("my secret key"), queue.NoopPanicHandler{}) + vault, corrupt, err := vault.New(t.TempDir(), t.TempDir(), []byte("my secret key"), async.NoopPanicHandler{}) require.NoError(t, err) require.False(t, corrupt) @@ -62,7 +62,7 @@ func TestMigratePrefsToVaultWithKeys(t *testing.T) { func TestMigratePrefsToVaultWithoutKeys(t *testing.T) { // Create a new vault. - vault, corrupt, err := vault.New(t.TempDir(), t.TempDir(), []byte("my secret key"), queue.NoopPanicHandler{}) + vault, corrupt, err := vault.New(t.TempDir(), t.TempDir(), []byte("my secret key"), async.NoopPanicHandler{}) require.NoError(t, err) require.False(t, corrupt) @@ -174,7 +174,7 @@ func TestUserMigration(t *testing.T) { token, err := crypto.RandomToken(32) require.NoError(t, err) - v, corrupt, err := vault.New(settingsFolder, settingsFolder, token, queue.NoopPanicHandler{}) + v, corrupt, err := vault.New(settingsFolder, settingsFolder, token, async.NoopPanicHandler{}) require.NoError(t, err) require.False(t, corrupt) diff --git a/internal/app/vault.go b/internal/app/vault.go index 013653a5..b194fcae 100644 --- a/internal/app/vault.go +++ b/internal/app/vault.go @@ -21,7 +21,7 @@ import ( "fmt" "path" - "github.com/ProtonMail/proton-bridge/v3/internal/async" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/proton-bridge/v3/internal/certs" "github.com/ProtonMail/proton-bridge/v3/internal/constants" "github.com/ProtonMail/proton-bridge/v3/internal/locations" diff --git a/internal/async/context.go b/internal/async/context.go deleted file mode 100644 index becf9426..00000000 --- a/internal/async/context.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2023 Proton AG -// -// This file is part of Proton Mail Bridge. -// -// Proton Mail Bridge is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Proton Mail Bridge is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Proton Mail Bridge. If not, see . - -package async - -import ( - "context" - "sync" -) - -// Abortable collects groups of functions that can be aborted by calling Abort. -type Abortable struct { - abortFunc []context.CancelFunc - abortLock sync.RWMutex -} - -func (a *Abortable) Do(ctx context.Context, fn func(context.Context)) { - fn(a.newCancelCtx(ctx)) -} - -func (a *Abortable) Abort() { - a.abortLock.RLock() - defer a.abortLock.RUnlock() - - for _, fn := range a.abortFunc { - fn() - } -} - -func (a *Abortable) newCancelCtx(ctx context.Context) context.Context { - a.abortLock.Lock() - defer a.abortLock.Unlock() - - ctx, cancel := context.WithCancel(ctx) - - a.abortFunc = append(a.abortFunc, cancel) - - return ctx -} - -// RangeContext iterates over the given channel until the context is canceled or the -// channel is closed. -func RangeContext[T any](ctx context.Context, ch <-chan T, fn func(T)) { - for { - select { - case v, ok := <-ch: - if !ok { - return - } - - fn(v) - - case <-ctx.Done(): - return - } - } -} - -// ForwardContext forwards all values from the src channel to the dst channel until the -// context is canceled or the src channel is closed. -func ForwardContext[T any](ctx context.Context, dst chan<- T, src <-chan T) { - RangeContext(ctx, src, func(v T) { - select { - case dst <- v: - case <-ctx.Done(): - } - }) -} diff --git a/internal/async/group.go b/internal/async/group.go deleted file mode 100644 index 1479ab89..00000000 --- a/internal/async/group.go +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright (c) 2023 Proton AG -// -// This file is part of Proton Mail Bridge. -// -// Proton Mail Bridge is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Proton Mail Bridge is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Proton Mail Bridge. If not, see . - -package async - -import ( - "context" - "math/rand" - "sync" - "time" -) - -type PanicHandler interface { - HandlePanic() -} - -// Group is forked and improved version of "github.com/bradenaw/juniper/xsync.Group". -// -// It manages a group of goroutines. The main change to original is posibility -// to wait passed function to finish without canceling it's context and adding -// PanicHandler. -type Group struct { - baseCtx context.Context - ctx context.Context - jobCtx context.Context - cancel context.CancelFunc - finish context.CancelFunc - wg sync.WaitGroup - - panicHandler PanicHandler -} - -// NewGroup returns a Group ready for use. The context passed to any of the f functions will be a -// descendant of ctx. -func NewGroup(ctx context.Context, panicHandler PanicHandler) *Group { - bgCtx, cancel := context.WithCancel(ctx) - jobCtx, finish := context.WithCancel(ctx) - return &Group{ - baseCtx: ctx, - ctx: bgCtx, - jobCtx: jobCtx, - cancel: cancel, - finish: finish, - panicHandler: panicHandler, - } -} - -// Once calls f once from another goroutine. -func (g *Group) Once(f func(ctx context.Context)) { - g.wg.Add(1) - go func() { - defer g.handlePanic() - - f(g.ctx) - g.wg.Done() - }() -} - -// jitterDuration returns a random duration in [d - jitter, d + jitter]. -func jitterDuration(d time.Duration, jitter time.Duration) time.Duration { - return d + time.Duration(float64(jitter)*((rand.Float64()*2)-1)) //nolint:gosec -} - -// Periodic spawns a goroutine that calls f once per interval +/- jitter. -func (g *Group) Periodic( - interval time.Duration, - jitter time.Duration, - f func(ctx context.Context), -) { - g.wg.Add(1) - go func() { - defer g.handlePanic() - - defer g.wg.Done() - - t := time.NewTimer(jitterDuration(interval, jitter)) - defer t.Stop() - - for { - if g.ctx.Err() != nil { - return - } - - select { - case <-g.jobCtx.Done(): - return - case <-t.C: - } - - t.Reset(jitterDuration(interval, jitter)) - f(g.ctx) - } - }() -} - -// Trigger spawns a goroutine which calls f whenever the returned function is called. If f is -// already running when triggered, f will run again immediately when it finishes. -func (g *Group) Trigger(f func(ctx context.Context)) func() { - c := make(chan struct{}, 1) - g.wg.Add(1) - go func() { - defer g.handlePanic() - - defer g.wg.Done() - - for { - if g.ctx.Err() != nil { - return - } - select { - case <-g.jobCtx.Done(): - return - case <-c: - } - f(g.ctx) - } - }() - - return func() { - select { - case c <- struct{}{}: - default: - } - } -} - -// PeriodicOrTrigger spawns a goroutine which calls f whenever the returned function is called. If -// f is already running when triggered, f will run again immediately when it finishes. Also calls f -// when it has been interval+/-jitter since the last trigger. -func (g *Group) PeriodicOrTrigger( - interval time.Duration, - jitter time.Duration, - f func(ctx context.Context), -) func() { - c := make(chan struct{}, 1) - g.wg.Add(1) - go func() { - defer g.handlePanic() - - defer g.wg.Done() - - t := time.NewTimer(jitterDuration(interval, jitter)) - defer t.Stop() - - for { - if g.ctx.Err() != nil { - return - } - select { - case <-g.jobCtx.Done(): - return - case <-t.C: - t.Reset(jitterDuration(interval, jitter)) - case <-c: - if !t.Stop() { - <-t.C - } - t.Reset(jitterDuration(interval, jitter)) - } - f(g.ctx) - } - }() - - return func() { - select { - case c <- struct{}{}: - default: - } - } -} - -func (g *Group) resetCtx() { - g.jobCtx, g.finish = context.WithCancel(g.baseCtx) - g.ctx, g.cancel = context.WithCancel(g.baseCtx) -} - -// Cancel is send to all of the spawn goroutines and ends periodic -// or trigger routines. -func (g *Group) Cancel() { - g.cancel() - g.finish() - g.resetCtx() -} - -// Finish will ends all periodic or polls routines. It will let -// currently running functions to finish (cancel is not sent). -// -// It is not safe to call Wait concurrently with any other method on g. -func (g *Group) Finish() { - g.finish() - g.jobCtx, g.finish = context.WithCancel(g.baseCtx) -} - -// CancelAndWait cancels the context passed to any of the spawned goroutines and waits for all spawned -// goroutines to exit. -// -// It is not safe to call Wait concurrently with any other method on g. -func (g *Group) CancelAndWait() { - g.finish() - g.cancel() - g.wg.Wait() - g.resetCtx() -} - -// WaitToFinish will ends all periodic or polls routines. It will wait for -// currently running functions to finish (cancel is not sent). -// -// It is not safe to call Wait concurrently with any other method on g. -func (g *Group) WaitToFinish() { - g.finish() - g.wg.Wait() - g.jobCtx, g.finish = context.WithCancel(g.baseCtx) -} - -func (g *Group) handlePanic() { - if g.panicHandler != nil { - g.panicHandler.HandlePanic() - } -} diff --git a/internal/bridge/api.go b/internal/bridge/api.go index f7c3d41a..dd397992 100644 --- a/internal/bridge/api.go +++ b/internal/bridge/api.go @@ -21,7 +21,7 @@ import ( "net/http" "github.com/Masterminds/semver/v3" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/go-proton-api" "github.com/ProtonMail/proton-bridge/v3/internal/constants" "github.com/sirupsen/logrus" @@ -33,7 +33,7 @@ func defaultAPIOptions( version *semver.Version, cookieJar http.CookieJar, transport http.RoundTripper, - panicHandler queue.PanicHandler, + panicHandler async.PanicHandler, ) []proton.Option { return []proton.Option{ proton.WithHostURL(apiURL), diff --git a/internal/bridge/api_default.go b/internal/bridge/api_default.go index cc89fe16..244543f8 100644 --- a/internal/bridge/api_default.go +++ b/internal/bridge/api_default.go @@ -23,7 +23,7 @@ import ( "net/http" "github.com/Masterminds/semver/v3" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/go-proton-api" ) @@ -33,7 +33,7 @@ func newAPIOptions( version *semver.Version, cookieJar http.CookieJar, transport http.RoundTripper, - panicHandler queue.PanicHandler, + panicHandler async.PanicHandler, ) []proton.Option { return defaultAPIOptions(apiURL, version, cookieJar, transport, panicHandler) } diff --git a/internal/bridge/api_qa.go b/internal/bridge/api_qa.go index a8c5a71a..db342811 100644 --- a/internal/bridge/api_qa.go +++ b/internal/bridge/api_qa.go @@ -24,7 +24,7 @@ import ( "os" "github.com/Masterminds/semver/v3" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/go-proton-api" ) @@ -34,7 +34,7 @@ func newAPIOptions( version *semver.Version, cookieJar http.CookieJar, transport http.RoundTripper, - panicHandler queue.PanicHandler, + panicHandler async.PanicHandler, ) []proton.Option { opt := defaultAPIOptions(apiURL, version, cookieJar, transport, panicHandler) diff --git a/internal/bridge/bridge.go b/internal/bridge/bridge.go index 0eba71fc..f675cbe7 100644 --- a/internal/bridge/bridge.go +++ b/internal/bridge/bridge.go @@ -30,12 +30,12 @@ import ( "github.com/Masterminds/semver/v3" "github.com/ProtonMail/gluon" + "github.com/ProtonMail/gluon/async" imapEvents "github.com/ProtonMail/gluon/events" "github.com/ProtonMail/gluon/imap" "github.com/ProtonMail/gluon/reporter" "github.com/ProtonMail/gluon/watcher" "github.com/ProtonMail/go-proton-api" - "github.com/ProtonMail/proton-bridge/v3/internal/async" "github.com/ProtonMail/proton-bridge/v3/internal/constants" "github.com/ProtonMail/proton-bridge/v3/internal/events" "github.com/ProtonMail/proton-bridge/v3/internal/focus" diff --git a/internal/bridge/bridge_test.go b/internal/bridge/bridge_test.go index 28778cd5..b6191a3d 100644 --- a/internal/bridge/bridge_test.go +++ b/internal/bridge/bridge_test.go @@ -30,8 +30,8 @@ import ( "time" "github.com/Masterminds/semver/v3" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/gluon/imap" - "github.com/ProtonMail/gluon/queue" "github.com/ProtonMail/go-proton-api" "github.com/ProtonMail/go-proton-api/server" "github.com/ProtonMail/go-proton-api/server/backend" @@ -700,7 +700,7 @@ func withBridgeNoMocks( require.NoError(t, err) // Create the vault. - vault, _, err := vault.New(vaultDir, t.TempDir(), vaultKey, queue.NoopPanicHandler{}) + vault, _, err := vault.New(vaultDir, t.TempDir(), vaultKey, async.NoopPanicHandler{}) require.NoError(t, err) // Create a new cookie jar. diff --git a/internal/bridge/imap.go b/internal/bridge/imap.go index 752155dd..bdd51845 100644 --- a/internal/bridge/imap.go +++ b/internal/bridge/imap.go @@ -27,12 +27,12 @@ import ( "github.com/Masterminds/semver/v3" "github.com/ProtonMail/gluon" + "github.com/ProtonMail/gluon/async" imapEvents "github.com/ProtonMail/gluon/events" "github.com/ProtonMail/gluon/imap" "github.com/ProtonMail/gluon/reporter" "github.com/ProtonMail/gluon/store" "github.com/ProtonMail/gluon/store/fallback_v0" - "github.com/ProtonMail/proton-bridge/v3/internal/async" "github.com/ProtonMail/proton-bridge/v3/internal/constants" "github.com/ProtonMail/proton-bridge/v3/internal/events" "github.com/ProtonMail/proton-bridge/v3/internal/logging" diff --git a/internal/bridge/sync_test.go b/internal/bridge/sync_test.go index e0ffe1c8..a83dac42 100644 --- a/internal/bridge/sync_test.go +++ b/internal/bridge/sync_test.go @@ -28,7 +28,7 @@ import ( "testing" "time" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/gluon/rfc822" "github.com/ProtonMail/go-proton-api" "github.com/ProtonMail/go-proton-api/server" @@ -429,7 +429,7 @@ func createMessages(ctx context.Context, t *testing.T, c *proton.Client, addrID, keyPass, err := salt.SaltForKey(password, user.Keys.Primary().ID) require.NoError(t, err) - _, addrKRs, err := proton.Unlock(user, addr, keyPass, queue.NoopPanicHandler{}) + _, addrKRs, err := proton.Unlock(user, addr, keyPass, async.NoopPanicHandler{}) require.NoError(t, err) _, ok := addrKRs[addrID] diff --git a/internal/bridge/user.go b/internal/bridge/user.go index 4bdb6152..5f2a2f1e 100644 --- a/internal/bridge/user.go +++ b/internal/bridge/user.go @@ -23,10 +23,10 @@ import ( "fmt" "runtime" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/gluon/imap" "github.com/ProtonMail/gluon/reporter" "github.com/ProtonMail/go-proton-api" - "github.com/ProtonMail/proton-bridge/v3/internal/async" "github.com/ProtonMail/proton-bridge/v3/internal/events" "github.com/ProtonMail/proton-bridge/v3/internal/logging" "github.com/ProtonMail/proton-bridge/v3/internal/safe" diff --git a/internal/bridge/user_event_test.go b/internal/bridge/user_event_test.go index 616f492c..2cc777d2 100644 --- a/internal/bridge/user_event_test.go +++ b/internal/bridge/user_event_test.go @@ -28,7 +28,7 @@ import ( "testing" "time" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/gluon/rfc822" "github.com/ProtonMail/go-proton-api" "github.com/ProtonMail/go-proton-api/server" @@ -475,7 +475,7 @@ func TestBridge_User_UpdateDraftAndCreateOtherMessage(t *testing.T) { keyPass, err := salts.SaltForKey(password, user.Keys.Primary().ID) require.NoError(t, err) - _, addrKRs, err := proton.Unlock(user, addrs, keyPass, queue.NoopPanicHandler{}) + _, addrKRs, err := proton.Unlock(user, addrs, keyPass, async.NoopPanicHandler{}) require.NoError(t, err) // Create a draft (generating a "create draft message" event). @@ -557,7 +557,7 @@ func TestBridge_User_SendDraftRemoveDraftFlag(t *testing.T) { keyPass, err := salts.SaltForKey(password, user.Keys.Primary().ID) require.NoError(t, err) - _, addrKRs, err := proton.Unlock(user, addrs, keyPass, queue.NoopPanicHandler{}) + _, addrKRs, err := proton.Unlock(user, addrs, keyPass, async.NoopPanicHandler{}) require.NoError(t, err) // Create a draft (generating a "create draft message" event). diff --git a/internal/dialer/dialer_proxy.go b/internal/dialer/dialer_proxy.go index 0ce2945e..453c9d05 100644 --- a/internal/dialer/dialer_proxy.go +++ b/internal/dialer/dialer_proxy.go @@ -24,7 +24,7 @@ import ( "sync" "time" - "github.com/ProtonMail/proton-bridge/v3/internal/async" + "github.com/ProtonMail/gluon/async" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -79,12 +79,6 @@ func formatAsAddress(rawURL string) string { return net.JoinHostPort(host, port) } -func (d *ProxyTLSDialer) handlePanic() { - if d.panicHandler != nil { - d.panicHandler.HandlePanic() - } -} - // DialTLSContext dials the given network/address. If it fails, it retries using a proxy. func (d *ProxyTLSDialer) DialTLSContext(ctx context.Context, network, address string) (net.Conn, error) { d.locker.RLock() @@ -139,7 +133,7 @@ func (d *ProxyTLSDialer) switchToReachableServer() error { // This means we want to disable it again in 24 hours. if d.proxyAddress == d.directAddress { go func() { - defer d.handlePanic() + defer async.HandlePanic(d.panicHandler) <-time.After(d.proxyUseDuration) diff --git a/internal/dialer/dialer_proxy_provider.go b/internal/dialer/dialer_proxy_provider.go index e4006891..244b437a 100644 --- a/internal/dialer/dialer_proxy_provider.go +++ b/internal/dialer/dialer_proxy_provider.go @@ -24,7 +24,7 @@ import ( "sync" "time" - "github.com/ProtonMail/proton-bridge/v3/internal/async" + "github.com/ProtonMail/gluon/async" "github.com/go-resty/resty/v2" "github.com/miekg/dns" "github.com/pkg/errors" @@ -92,12 +92,6 @@ func newProxyProvider(dialer TLSDialer, hostURL string, providers []string, pani return } -func (p *proxyProvider) handlePanic() { - if p.panicHandler != nil { - p.panicHandler.HandlePanic() - } -} - // findReachableServer returns a working API server (either proxy or standard API). func (p *proxyProvider) findReachableServer() (proxy string, err error) { logrus.Debug("Trying to find a reachable server") @@ -119,13 +113,13 @@ func (p *proxyProvider) findReachableServer() (proxy string, err error) { wg.Add(2) go func() { - defer p.handlePanic() + defer async.HandlePanic(p.panicHandler) defer wg.Done() apiReachable = p.canReach(p.hostURL) }() go func() { - defer p.handlePanic() + defer async.HandlePanic(p.panicHandler) defer wg.Done() err = p.refreshProxyCache() }() @@ -162,7 +156,7 @@ func (p *proxyProvider) refreshProxyCache() error { resultChan := make(chan []string) go func() { - defer p.handlePanic() + defer async.HandlePanic(p.panicHandler) for _, provider := range p.providers { if proxies, err := p.dohLookup(ctx, p.query, provider); err == nil { @@ -217,7 +211,7 @@ func (p *proxyProvider) defaultDoHLookup(ctx context.Context, query, dohProvider dataChan, errChan := make(chan []string), make(chan error) go func() { - defer p.handlePanic() + defer async.HandlePanic(p.panicHandler) // Build new DNS request in RFC1035 format. dnsRequest := new(dns.Msg).SetQuestion(dns.Fqdn(query), dns.TypeTXT) diff --git a/internal/dialer/dialer_proxy_provider_test.go b/internal/dialer/dialer_proxy_provider_test.go index ddd7aed2..5c25c4bb 100644 --- a/internal/dialer/dialer_proxy_provider_test.go +++ b/internal/dialer/dialer_proxy_provider_test.go @@ -23,7 +23,7 @@ import ( "testing" "time" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/proton-bridge/v3/internal/useragent" r "github.com/stretchr/testify/require" ) @@ -32,7 +32,7 @@ func TestProxyProvider_FindProxy(t *testing.T) { proxy := getTrustedServer() defer closeServer(proxy) - p := newProxyProvider(NewBasicTLSDialer(""), "", []string{"not used"}, queue.NoopPanicHandler{}) + p := newProxyProvider(NewBasicTLSDialer(""), "", []string{"not used"}, async.NoopPanicHandler{}) p.dohLookup = func(ctx context.Context, q, p string) ([]string, error) { return []string{proxy.URL}, nil } url, err := p.findReachableServer() @@ -48,7 +48,7 @@ func TestProxyProvider_FindProxy_ChooseReachableProxy(t *testing.T) { unreachableProxy := getTrustedServer() closeServer(unreachableProxy) - p := newProxyProvider(NewBasicTLSDialer(""), "", []string{"not used"}, queue.NoopPanicHandler{}) + p := newProxyProvider(NewBasicTLSDialer(""), "", []string{"not used"}, async.NoopPanicHandler{}) p.dohLookup = func(ctx context.Context, q, p string) ([]string, error) { return []string{reachableProxy.URL, unreachableProxy.URL}, nil } @@ -69,7 +69,7 @@ func TestProxyProvider_FindProxy_ChooseTrustedProxy(t *testing.T) { checker := NewTLSPinChecker(TrustedAPIPins) dialer := NewPinningTLSDialer(NewBasicTLSDialer(""), reporter, checker) - p := newProxyProvider(dialer, "", []string{"not used"}, queue.NoopPanicHandler{}) + p := newProxyProvider(dialer, "", []string{"not used"}, async.NoopPanicHandler{}) p.dohLookup = func(ctx context.Context, q, p string) ([]string, error) { return []string{untrustedProxy.URL, trustedProxy.URL}, nil } @@ -86,7 +86,7 @@ func TestProxyProvider_FindProxy_FailIfNoneReachable(t *testing.T) { unreachableProxy2 := getTrustedServer() closeServer(unreachableProxy2) - p := newProxyProvider(NewBasicTLSDialer(""), "", []string{"not used"}, queue.NoopPanicHandler{}) + p := newProxyProvider(NewBasicTLSDialer(""), "", []string{"not used"}, async.NoopPanicHandler{}) p.dohLookup = func(ctx context.Context, q, p string) ([]string, error) { return []string{unreachableProxy1.URL, unreachableProxy2.URL}, nil } @@ -106,7 +106,7 @@ func TestProxyProvider_FindProxy_FailIfNoneTrusted(t *testing.T) { checker := NewTLSPinChecker(TrustedAPIPins) dialer := NewPinningTLSDialer(NewBasicTLSDialer(""), reporter, checker) - p := newProxyProvider(dialer, "", []string{"not used"}, queue.NoopPanicHandler{}) + p := newProxyProvider(dialer, "", []string{"not used"}, async.NoopPanicHandler{}) p.dohLookup = func(ctx context.Context, q, p string) ([]string, error) { return []string{untrustedProxy1.URL, untrustedProxy2.URL}, nil } @@ -116,7 +116,7 @@ func TestProxyProvider_FindProxy_FailIfNoneTrusted(t *testing.T) { } func TestProxyProvider_FindProxy_RefreshCacheTimeout(t *testing.T) { - p := newProxyProvider(NewBasicTLSDialer(""), "", []string{"not used"}, queue.NoopPanicHandler{}) + p := newProxyProvider(NewBasicTLSDialer(""), "", []string{"not used"}, async.NoopPanicHandler{}) p.cacheRefreshTimeout = 1 * time.Second p.dohLookup = func(ctx context.Context, q, p string) ([]string, error) { time.Sleep(2 * time.Second); return nil, nil } @@ -133,7 +133,7 @@ func TestProxyProvider_FindProxy_CanReachTimeout(t *testing.T) { })) defer closeServer(slowProxy) - p := newProxyProvider(NewBasicTLSDialer(""), "", []string{"not used"}, queue.NoopPanicHandler{}) + p := newProxyProvider(NewBasicTLSDialer(""), "", []string{"not used"}, async.NoopPanicHandler{}) p.canReachTimeout = 1 * time.Second p.dohLookup = func(ctx context.Context, q, p string) ([]string, error) { return []string{slowProxy.URL}, nil } @@ -145,7 +145,7 @@ func TestProxyProvider_FindProxy_CanReachTimeout(t *testing.T) { } func TestProxyProvider_DoHLookup_Quad9(t *testing.T) { - p := newProxyProvider(NewBasicTLSDialer(""), "", []string{Quad9Provider, GoogleProvider}, queue.NoopPanicHandler{}) + p := newProxyProvider(NewBasicTLSDialer(""), "", []string{Quad9Provider, GoogleProvider}, async.NoopPanicHandler{}) records, err := p.dohLookup(context.Background(), proxyQuery, Quad9Provider) r.NoError(t, err) @@ -156,7 +156,7 @@ func TestProxyProvider_DoHLookup_Quad9(t *testing.T) { // port filter. Basic functionality should be covered by other tests. Keeping // code here to be able to run it locally if needed. func DISABLEDTestProxyProviderDoHLookupQuad9Port(t *testing.T) { - p := newProxyProvider(NewBasicTLSDialer(""), "", []string{Quad9Provider, GoogleProvider}, queue.NoopPanicHandler{}) + p := newProxyProvider(NewBasicTLSDialer(""), "", []string{Quad9Provider, GoogleProvider}, async.NoopPanicHandler{}) records, err := p.dohLookup(context.Background(), proxyQuery, Quad9PortProvider) r.NoError(t, err) @@ -164,7 +164,7 @@ func DISABLEDTestProxyProviderDoHLookupQuad9Port(t *testing.T) { } func TestProxyProvider_DoHLookup_Google(t *testing.T) { - p := newProxyProvider(NewBasicTLSDialer(""), "", []string{Quad9Provider, GoogleProvider}, queue.NoopPanicHandler{}) + p := newProxyProvider(NewBasicTLSDialer(""), "", []string{Quad9Provider, GoogleProvider}, async.NoopPanicHandler{}) records, err := p.dohLookup(context.Background(), proxyQuery, GoogleProvider) r.NoError(t, err) @@ -174,7 +174,7 @@ func TestProxyProvider_DoHLookup_Google(t *testing.T) { func TestProxyProvider_DoHLookup_FindProxy(t *testing.T) { skipIfProxyIsSet(t) - p := newProxyProvider(NewBasicTLSDialer(""), "", []string{Quad9Provider, GoogleProvider}, queue.NoopPanicHandler{}) + p := newProxyProvider(NewBasicTLSDialer(""), "", []string{Quad9Provider, GoogleProvider}, async.NoopPanicHandler{}) url, err := p.findReachableServer() r.NoError(t, err) @@ -184,7 +184,7 @@ func TestProxyProvider_DoHLookup_FindProxy(t *testing.T) { func TestProxyProvider_DoHLookup_FindProxyFirstProviderUnreachable(t *testing.T) { skipIfProxyIsSet(t) - p := newProxyProvider(NewBasicTLSDialer(""), "", []string{"https://unreachable", Quad9Provider, GoogleProvider}, queue.NoopPanicHandler{}) + p := newProxyProvider(NewBasicTLSDialer(""), "", []string{"https://unreachable", Quad9Provider, GoogleProvider}, async.NoopPanicHandler{}) url, err := p.findReachableServer() r.NoError(t, err) diff --git a/internal/dialer/dialer_proxy_test.go b/internal/dialer/dialer_proxy_test.go index a78b3055..3fe72b12 100644 --- a/internal/dialer/dialer_proxy_test.go +++ b/internal/dialer/dialer_proxy_test.go @@ -25,7 +25,7 @@ import ( "testing" "time" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/stretchr/testify/require" ) @@ -142,8 +142,8 @@ func TestProxyDialer_UseProxy(t *testing.T) { trustedProxy := getTrustedServer() defer closeServer(trustedProxy) - provider := newProxyProvider(NewBasicTLSDialer(""), "", DoHProviders, queue.NoopPanicHandler{}) - d := NewProxyTLSDialer(NewBasicTLSDialer(""), "", queue.NoopPanicHandler{}) + provider := newProxyProvider(NewBasicTLSDialer(""), "", DoHProviders, async.NoopPanicHandler{}) + d := NewProxyTLSDialer(NewBasicTLSDialer(""), "", async.NoopPanicHandler{}) d.proxyProvider = provider provider.dohLookup = func(ctx context.Context, q, p string) ([]string, error) { return []string{trustedProxy.URL}, nil } @@ -160,8 +160,8 @@ func TestProxyDialer_UseProxy_MultipleTimes(t *testing.T) { proxy3 := getTrustedServer() defer closeServer(proxy3) - provider := newProxyProvider(NewBasicTLSDialer(""), "", DoHProviders, queue.NoopPanicHandler{}) - d := NewProxyTLSDialer(NewBasicTLSDialer(""), "", queue.NoopPanicHandler{}) + provider := newProxyProvider(NewBasicTLSDialer(""), "", DoHProviders, async.NoopPanicHandler{}) + d := NewProxyTLSDialer(NewBasicTLSDialer(""), "", async.NoopPanicHandler{}) d.proxyProvider = provider provider.dohLookup = func(ctx context.Context, q, p string) ([]string, error) { return []string{proxy1.URL}, nil } @@ -190,8 +190,8 @@ func TestProxyDialer_UseProxy_RevertAfterTime(t *testing.T) { trustedProxy := getTrustedServer() defer closeServer(trustedProxy) - provider := newProxyProvider(NewBasicTLSDialer(""), "", DoHProviders, queue.NoopPanicHandler{}) - d := NewProxyTLSDialer(NewBasicTLSDialer(""), "", queue.NoopPanicHandler{}) + provider := newProxyProvider(NewBasicTLSDialer(""), "", DoHProviders, async.NoopPanicHandler{}) + d := NewProxyTLSDialer(NewBasicTLSDialer(""), "", async.NoopPanicHandler{}) d.proxyProvider = provider d.proxyUseDuration = time.Second @@ -213,8 +213,8 @@ func TestProxyDialer_UseProxy_RevertAfterTime(t *testing.T) { func TestProxyDialer_UseProxy_RevertIfProxyStopsWorkingAndOriginalAPIIsReachable(t *testing.T) { trustedProxy := getTrustedServer() - provider := newProxyProvider(NewBasicTLSDialer(""), "", DoHProviders, queue.NoopPanicHandler{}) - d := NewProxyTLSDialer(NewBasicTLSDialer(""), "", queue.NoopPanicHandler{}) + provider := newProxyProvider(NewBasicTLSDialer(""), "", DoHProviders, async.NoopPanicHandler{}) + d := NewProxyTLSDialer(NewBasicTLSDialer(""), "", async.NoopPanicHandler{}) d.proxyProvider = provider provider.dohLookup = func(ctx context.Context, q, p string) ([]string, error) { return []string{trustedProxy.URL}, nil } @@ -243,8 +243,8 @@ func TestProxyDialer_UseProxy_FindSecondAlternativeIfFirstFailsAndAPIIsStillBloc proxy2 := getTrustedServer() defer closeServer(proxy2) - provider := newProxyProvider(NewBasicTLSDialer(""), "", DoHProviders, queue.NoopPanicHandler{}) - d := NewProxyTLSDialer(NewBasicTLSDialer(""), "", queue.NoopPanicHandler{}) + provider := newProxyProvider(NewBasicTLSDialer(""), "", DoHProviders, async.NoopPanicHandler{}) + d := NewProxyTLSDialer(NewBasicTLSDialer(""), "", async.NoopPanicHandler{}) d.proxyProvider = provider provider.dohLookup = func(ctx context.Context, q, p string) ([]string, error) { return []string{proxy1.URL, proxy2.URL}, nil } diff --git a/internal/focus/service.go b/internal/focus/service.go index ad0395d1..a4f7b885 100644 --- a/internal/focus/service.go +++ b/internal/focus/service.go @@ -24,7 +24,7 @@ import ( "net" "github.com/Masterminds/semver/v3" - "github.com/ProtonMail/proton-bridge/v3/internal/async" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/proton-bridge/v3/internal/focus/proto" "github.com/ProtonMail/proton-bridge/v3/internal/service" "github.com/sirupsen/logrus" @@ -77,7 +77,7 @@ func NewService(locator service.Locator, version *semver.Version, panicHandler a } go func() { - defer serv.handlePanic() + defer async.HandlePanic(serv.panicHandler) if err := serv.server.Serve(listener); err != nil { fmt.Printf("failed to serve: %v", err) @@ -88,12 +88,6 @@ func NewService(locator service.Locator, version *semver.Version, panicHandler a 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{}{} @@ -115,7 +109,7 @@ func (service *Service) GetRaiseCh() <-chan struct{} { // Close closes the service. func (service *Service) Close() { go func() { - defer service.handlePanic() + defer async.HandlePanic(service.panicHandler) // 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). diff --git a/internal/frontend/cli/frontend.go b/internal/frontend/cli/frontend.go index 94b5414a..b753c337 100644 --- a/internal/frontend/cli/frontend.go +++ b/internal/frontend/cli/frontend.go @@ -21,7 +21,7 @@ package cli import ( "errors" - "github.com/ProtonMail/proton-bridge/v3/internal/async" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/proton-bridge/v3/internal/bridge" "github.com/ProtonMail/proton-bridge/v3/internal/constants" "github.com/ProtonMail/proton-bridge/v3/internal/events" @@ -289,7 +289,7 @@ func New(bridge *bridge.Bridge, restarter *restarter.Restarter, eventCh <-chan e } func (f *frontendCLI) watchEvents(eventCh <-chan events.Event) { // nolint:gocyclo - defer f.handlePanic() + defer async.HandlePanic(f.panicHandler) // GODT-1949: Better error events. for _, err := range f.bridge.GetErrors() { @@ -451,12 +451,6 @@ func (f *frontendCLI) watchEvents(eventCh <-chan events.Event) { // nolint:gocyc */ } -func (f *frontendCLI) handlePanic() { - if f.panicHandler != nil { - f.panicHandler.HandlePanic() - } -} - // Loop starts the frontend loop with an interactive shell. func (f *frontendCLI) Loop() error { f.Printf(` diff --git a/internal/frontend/grpc/service.go b/internal/frontend/grpc/service.go index 4f308ef3..d2747769 100644 --- a/internal/frontend/grpc/service.go +++ b/internal/frontend/grpc/service.go @@ -33,6 +33,7 @@ import ( "sync" "time" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/go-proton-api" "github.com/ProtonMail/proton-bridge/v3/internal/bridge" "github.com/ProtonMail/proton-bridge/v3/internal/certs" @@ -192,9 +193,7 @@ func NewService( } func (s *Service) handlePanic() { - if s.panicHandler != nil { - s.panicHandler.HandlePanic() - } + async.HandlePanic(s.panicHandler) } func (s *Service) initAutostart() { diff --git a/internal/frontend/grpc/service_stream.go b/internal/frontend/grpc/service_stream.go index c7243523..4b5462da 100644 --- a/internal/frontend/grpc/service_stream.go +++ b/internal/frontend/grpc/service_stream.go @@ -49,7 +49,7 @@ func (s *Service) RunEventStream(request *EventStreamRequest, server Bridge_RunE // if events occurred before streaming started, they've been queued. Now that the stream channel is available // we can flush the queued go func() { - defer s.panicHandler.HandlePanic() + defer s.handlePanic() s.eventQueueMutex.Lock() defer s.eventQueueMutex.Unlock() diff --git a/internal/frontend/grpc/service_user.go b/internal/frontend/grpc/service_user.go index 7b9d3142..e3290c33 100644 --- a/internal/frontend/grpc/service_user.go +++ b/internal/frontend/grpc/service_user.go @@ -70,7 +70,7 @@ func (s *Service) SetUserSplitMode(ctx context.Context, splitMode *UserSplitMode } go func() { - defer s.panicHandler.HandlePanic() + defer s.handlePanic() defer func() { _ = s.SendEvent(NewUserToggleSplitModeFinishedEvent(splitMode.UserID)) }() var targetMode vault.AddressMode @@ -121,7 +121,7 @@ func (s *Service) LogoutUser(ctx context.Context, userID *wrapperspb.StringValue } go func() { - defer s.panicHandler.HandlePanic() + defer s.handlePanic() if err := s.bridge.LogoutUser(context.Background(), userID.Value); err != nil { s.log.WithError(err).Error("Failed to log user out") @@ -135,7 +135,7 @@ func (s *Service) RemoveUser(ctx context.Context, userID *wrapperspb.StringValue s.log.WithField("UserID", userID.Value).Debug("RemoveUser") go func() { - defer s.panicHandler.HandlePanic() + defer s.handlePanic() // remove preferences if err := s.bridge.DeleteUser(context.Background(), userID.Value); err != nil { diff --git a/internal/try/try.go b/internal/try/try.go index c134d5ab..7cdccc48 100644 --- a/internal/try/try.go +++ b/internal/try/try.go @@ -21,7 +21,7 @@ import ( "fmt" "sync" - "github.com/ProtonMail/proton-bridge/v3/internal/async" + "github.com/ProtonMail/gluon/async" "github.com/bradenaw/juniper/xerrors" "github.com/sirupsen/logrus" ) @@ -73,26 +73,20 @@ type Group struct { panicHandler async.PanicHandler } -func (wg *Group) SetPanicHandler(panicHandler async.PanicHandler) { - wg.panicHandler = panicHandler -} - -func (wg *Group) handlePanic() { - if wg.panicHandler != nil { - wg.panicHandler.HandlePanic() - } +func MakeGroup(panicHandler async.PanicHandler) Group { + return Group{panicHandler: panicHandler} } func (wg *Group) GoTry(fn func(bool)) { if wg.mu.TryLock() { go func() { - defer wg.handlePanic() + defer async.HandlePanic(wg.panicHandler) defer wg.mu.Unlock() fn(true) }() } else { go func() { - defer wg.handlePanic() + defer async.HandlePanic(wg.panicHandler) fn(false) }() } diff --git a/internal/user/events.go b/internal/user/events.go index 8f978ed0..c2ed3db1 100644 --- a/internal/user/events.go +++ b/internal/user/events.go @@ -25,8 +25,8 @@ import ( "net/http" "github.com/ProtonMail/gluon" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/gluon/imap" - "github.com/ProtonMail/gluon/queue" "github.com/ProtonMail/gluon/reporter" "github.com/ProtonMail/go-proton-api" "github.com/ProtonMail/gopenpgp/v2/crypto" @@ -225,7 +225,7 @@ func (user *User) handleCreateAddressEvent(ctx context.Context, event proton.Add user.updateCh[event.Address.ID] = user.updateCh[primAddr.ID] case vault.SplitMode: - user.updateCh[event.Address.ID] = queue.NewQueuedChannel[imap.Update](0, 0, user.panicHandler) + user.updateCh[event.Address.ID] = async.NewQueuedChannel[imap.Update](0, 0, user.panicHandler) } user.eventCh.Enqueue(events.UserAddressCreated{ @@ -284,7 +284,7 @@ func (user *User) handleUpdateAddressEvent(_ context.Context, event proton.Addre user.updateCh[event.Address.ID] = user.updateCh[primAddr.ID] case vault.SplitMode: - user.updateCh[event.Address.ID] = queue.NewQueuedChannel[imap.Update](0, 0, user.panicHandler) + user.updateCh[event.Address.ID] = async.NewQueuedChannel[imap.Update](0, 0, user.panicHandler) } user.eventCh.Enqueue(events.UserAddressEnabled{ diff --git a/internal/user/smtp.go b/internal/user/smtp.go index bcc093f1..9e237474 100644 --- a/internal/user/smtp.go +++ b/internal/user/smtp.go @@ -29,6 +29,7 @@ import ( "strings" "time" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/gluon/reporter" "github.com/ProtonMail/gluon/rfc5322" "github.com/ProtonMail/gluon/rfc822" @@ -48,7 +49,7 @@ import ( // sendMail sends an email from the given address to the given recipients. func (user *User) sendMail(authID string, from string, to []string, r io.Reader) error { - defer user.handlePanic() + defer async.HandlePanic(user.panicHandler) return safe.RLockRet(func() error { ctx, cancel := context.WithCancel(context.Background()) @@ -392,7 +393,7 @@ func (user *User) createAttachments( } keys, err := parallel.MapContext(ctx, runtime.NumCPU(), attachments, func(ctx context.Context, att message.Attachment) (attKey, error) { - defer user.handlePanic() + defer async.HandlePanic(user.panicHandler) logrus.WithFields(logrus.Fields{ "name": logging.Sensitive(att.Name), @@ -471,7 +472,7 @@ func (user *User) getRecipients( }) prefs, err := parallel.MapContext(ctx, runtime.NumCPU(), addresses, func(ctx context.Context, recipient string) (proton.SendPreferences, error) { - defer user.handlePanic() + defer async.HandlePanic(user.panicHandler) pubKeys, recType, err := client.GetPublicKeys(ctx, recipient) if err != nil { diff --git a/internal/user/sync.go b/internal/user/sync.go index 6b281386..6c40cd46 100644 --- a/internal/user/sync.go +++ b/internal/user/sync.go @@ -25,9 +25,9 @@ import ( "strings" "time" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/gluon/imap" "github.com/ProtonMail/gluon/logging" - "github.com/ProtonMail/gluon/queue" "github.com/ProtonMail/gluon/reporter" "github.com/ProtonMail/go-proton-api" "github.com/ProtonMail/gopenpgp/v2/crypto" @@ -184,7 +184,7 @@ func (user *User) sync(ctx context.Context) error { } // nolint:exhaustive -func syncLabels(ctx context.Context, apiLabels map[string]proton.Label, updateCh ...*queue.QueuedChannel[imap.Update]) error { +func syncLabels(ctx context.Context, apiLabels map[string]proton.Label, updateCh ...*async.QueuedChannel[imap.Update]) error { var updates []imap.Update // Create placeholder Folders/Labels mailboxes with the \Noselect attribute. @@ -251,8 +251,8 @@ func (user *User) syncMessages( vault *vault.User, apiLabels map[string]proton.Label, addrKRs map[string]*crypto.KeyRing, - updateCh map[string]*queue.QueuedChannel[imap.Update], - eventCh *queue.QueuedChannel[events.Event], + updateCh map[string]*async.QueuedChannel[imap.Update], + eventCh *async.QueuedChannel[events.Event], maxSyncMemory uint64, ) error { ctx, cancel := context.WithCancel(ctx) @@ -456,7 +456,7 @@ func (user *User) syncMessages( } result, err := parallel.MapContext(ctx, maxParallelDownloads, request.ids, func(ctx context.Context, id string) (proton.FullMessage, error) { - defer user.handlePanic() + defer async.HandlePanic(user.panicHandler) var result proton.FullMessage @@ -511,7 +511,7 @@ func (user *User) syncMessages( logrus.Debugf("Build request: %v of %v count=%v", index, len(chunks), len(chunk)) result, err := parallel.MapContext(ctx, maxMessagesInParallel, chunk, func(ctx context.Context, msg proton.FullMessage) (*buildRes, error) { - defer user.handlePanic() + defer async.HandlePanic(user.panicHandler) return buildRFC822(apiLabels, msg, addrKRs[msg.AddressID], new(bytes.Buffer)), nil }) @@ -538,7 +538,7 @@ func (user *User) syncMessages( type updateTargetInfo struct { queueIndex int - ch *queue.QueuedChannel[imap.Update] + ch *async.QueuedChannel[imap.Update] } pendingUpdates := make([][]*imap.MessageCreated, len(updateCh)) diff --git a/internal/user/sync_reporter.go b/internal/user/sync_reporter.go index 51a73663..91d296f7 100644 --- a/internal/user/sync_reporter.go +++ b/internal/user/sync_reporter.go @@ -20,13 +20,13 @@ package user import ( "time" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/proton-bridge/v3/internal/events" ) type syncReporter struct { userID string - eventCh *queue.QueuedChannel[events.Event] + eventCh *async.QueuedChannel[events.Event] start time.Time total int @@ -36,7 +36,7 @@ type syncReporter struct { freq time.Duration } -func newSyncReporter(userID string, eventCh *queue.QueuedChannel[events.Event], total int, freq time.Duration) *syncReporter { +func newSyncReporter(userID string, eventCh *async.QueuedChannel[events.Event], total int, freq time.Duration) *syncReporter { return &syncReporter{ userID: userID, eventCh: eventCh, diff --git a/internal/user/types.go b/internal/user/types.go index 3da287fb..fc6a2286 100644 --- a/internal/user/types.go +++ b/internal/user/types.go @@ -23,8 +23,8 @@ import ( "runtime" "strings" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/go-proton-api" - "github.com/ProtonMail/proton-bridge/v3/internal/async" "golang.org/x/exp/maps" "golang.org/x/exp/slices" ) diff --git a/internal/user/user.go b/internal/user/user.go index cd4b14c7..71a46236 100644 --- a/internal/user/user.go +++ b/internal/user/user.go @@ -29,13 +29,12 @@ import ( "sync/atomic" "time" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/gluon/connector" "github.com/ProtonMail/gluon/imap" - "github.com/ProtonMail/gluon/queue" "github.com/ProtonMail/gluon/reporter" "github.com/ProtonMail/go-proton-api" "github.com/ProtonMail/proton-bridge/v3/internal" - "github.com/ProtonMail/proton-bridge/v3/internal/async" "github.com/ProtonMail/proton-bridge/v3/internal/events" "github.com/ProtonMail/proton-bridge/v3/internal/logging" "github.com/ProtonMail/proton-bridge/v3/internal/safe" @@ -65,7 +64,7 @@ type User struct { reporter reporter.Reporter sendHash *sendRecorder - eventCh *queue.QueuedChannel[events.Event] + eventCh *async.QueuedChannel[events.Event] eventLock safe.RWMutex apiUser proton.User @@ -77,7 +76,7 @@ type User struct { apiLabels map[string]proton.Label apiLabelsLock safe.RWMutex - updateCh map[string]*queue.QueuedChannel[imap.Update] + updateCh map[string]*async.QueuedChannel[imap.Update] updateChLock safe.RWMutex tasks *async.Group @@ -129,7 +128,7 @@ func New( reporter: reporter, sendHash: newSendRecorder(sendEntryExpiry), - eventCh: queue.NewQueuedChannel[events.Event](0, 0, crashHandler), + eventCh: async.NewQueuedChannel[events.Event](0, 0, crashHandler), eventLock: safe.NewRWMutex(), apiUser: apiUser, @@ -141,7 +140,7 @@ func New( apiLabels: groupBy(apiLabels, func(label proton.Label) string { return label.ID }), apiLabelsLock: safe.NewRWMutex(), - updateCh: make(map[string]*queue.QueuedChannel[imap.Update]), + updateCh: make(map[string]*async.QueuedChannel[imap.Update]), updateChLock: safe.NewRWMutex(), tasks: async.NewGroup(context.Background(), crashHandler), @@ -184,7 +183,7 @@ func New( doneCh := make(chan struct{}) go func() { - defer user.handlePanic() + defer async.HandlePanic(user.panicHandler) user.pollAPIEventsCh <- doneCh }() @@ -237,12 +236,6 @@ func New( return user, nil } -func (user *User) handlePanic() { - if user.panicHandler != nil { - user.panicHandler.HandlePanic() - } -} - func (user *User) TriggerSync() { user.goSync() } @@ -605,11 +598,11 @@ func (user *User) initUpdateCh(mode vault.AddressMode) { updateCh.CloseAndDiscardQueued() } - user.updateCh = make(map[string]*queue.QueuedChannel[imap.Update]) + user.updateCh = make(map[string]*async.QueuedChannel[imap.Update]) switch mode { case vault.CombinedMode: - primaryUpdateCh := queue.NewQueuedChannel[imap.Update](0, 0, user.panicHandler) + primaryUpdateCh := async.NewQueuedChannel[imap.Update](0, 0, user.panicHandler) for addrID := range user.apiAddrs { user.updateCh[addrID] = primaryUpdateCh @@ -617,7 +610,7 @@ func (user *User) initUpdateCh(mode vault.AddressMode) { case vault.SplitMode: for addrID := range user.apiAddrs { - user.updateCh[addrID] = queue.NewQueuedChannel[imap.Update](0, 0, user.panicHandler) + user.updateCh[addrID] = async.NewQueuedChannel[imap.Update](0, 0, user.panicHandler) } } } diff --git a/internal/vault/migrate_test.go b/internal/vault/migrate_test.go index 2d3662e1..c69fe000 100644 --- a/internal/vault/migrate_test.go +++ b/internal/vault/migrate_test.go @@ -25,7 +25,7 @@ import ( "path/filepath" "testing" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/gopenpgp/v2/crypto" "github.com/stretchr/testify/require" "github.com/vmihailenco/msgpack/v5" @@ -53,7 +53,7 @@ func TestMigrate(t *testing.T) { require.NoError(t, os.WriteFile(filepath.Join(dir, "vault.enc"), b, 0o600)) // Migrate the vault. - s, corrupt, err := New(dir, "default-gluon-dir", []byte("my secret key"), queue.NoopPanicHandler{}) + s, corrupt, err := New(dir, "default-gluon-dir", []byte("my secret key"), async.NoopPanicHandler{}) require.NoError(t, err) require.False(t, corrupt) diff --git a/internal/vault/settings_test.go b/internal/vault/settings_test.go index e0265798..cc4e1b77 100644 --- a/internal/vault/settings_test.go +++ b/internal/vault/settings_test.go @@ -22,7 +22,7 @@ import ( "testing" "github.com/Masterminds/semver/v3" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/proton-bridge/v3/internal/updater" "github.com/ProtonMail/proton-bridge/v3/internal/vault" "github.com/stretchr/testify/require" @@ -64,7 +64,7 @@ func TestVault_Settings_SMTP(t *testing.T) { func TestVault_Settings_GluonDir(t *testing.T) { // create a new test vault. - s, corrupt, err := vault.New(t.TempDir(), "/path/to/gluon", []byte("my secret key"), queue.NoopPanicHandler{}) + s, corrupt, err := vault.New(t.TempDir(), "/path/to/gluon", []byte("my secret key"), async.NoopPanicHandler{}) require.NoError(t, err) require.False(t, corrupt) diff --git a/internal/vault/vault.go b/internal/vault/vault.go index 757f5707..0b1c7002 100644 --- a/internal/vault/vault.go +++ b/internal/vault/vault.go @@ -29,7 +29,7 @@ import ( "path/filepath" "sync" - "github.com/ProtonMail/proton-bridge/v3/internal/async" + "github.com/ProtonMail/gluon/async" "github.com/bradenaw/juniper/parallel" "github.com/bradenaw/juniper/xslices" "github.com/sirupsen/logrus" @@ -77,12 +77,6 @@ func New(vaultDir, gluonCacheDir string, key []byte, panicHandler async.PanicHan return vault, corrupt, nil } -func (vault *Vault) handlePanic() { - if vault.panicHandler != nil { - vault.panicHandler.HandlePanic() - } -} - // GetUserIDs returns the user IDs and usernames of all users in the vault. func (vault *Vault) GetUserIDs() []string { return xslices.Map(vault.get().Users, func(user UserData) string { @@ -126,7 +120,7 @@ func (vault *Vault) ForUser(parallelism int, fn func(*User) error) error { userIDs := vault.GetUserIDs() return parallel.DoContext(context.Background(), parallelism, len(userIDs), func(_ context.Context, idx int) error { - defer vault.handlePanic() + defer async.HandlePanic(vault.panicHandler) user, err := vault.NewUser(userIDs[idx]) if err != nil { diff --git a/internal/vault/vault_bench_test.go b/internal/vault/vault_bench_test.go index c5903ceb..d6e96f2c 100644 --- a/internal/vault/vault_bench_test.go +++ b/internal/vault/vault_bench_test.go @@ -22,7 +22,7 @@ import ( "runtime" "testing" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/proton-bridge/v3/internal/vault" "github.com/google/uuid" "github.com/stretchr/testify/require" @@ -32,7 +32,7 @@ func BenchmarkVault(b *testing.B) { vaultDir, gluonDir := b.TempDir(), b.TempDir() // Create a new vault. - s, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), queue.NoopPanicHandler{}) + s, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), async.NoopPanicHandler{}) require.NoError(b, err) require.False(b, corrupt) diff --git a/internal/vault/vault_test.go b/internal/vault/vault_test.go index 12fea53d..25772074 100644 --- a/internal/vault/vault_test.go +++ b/internal/vault/vault_test.go @@ -22,7 +22,7 @@ import ( "path/filepath" "testing" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/proton-bridge/v3/internal/vault" "github.com/stretchr/testify/require" ) @@ -31,19 +31,19 @@ func TestVault_Corrupt(t *testing.T) { vaultDir, gluonDir := t.TempDir(), t.TempDir() { - _, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), queue.NoopPanicHandler{}) + _, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), async.NoopPanicHandler{}) require.NoError(t, err) require.False(t, corrupt) } { - _, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), queue.NoopPanicHandler{}) + _, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), async.NoopPanicHandler{}) require.NoError(t, err) require.False(t, corrupt) } { - _, corrupt, err := vault.New(vaultDir, gluonDir, []byte("bad key"), queue.NoopPanicHandler{}) + _, corrupt, err := vault.New(vaultDir, gluonDir, []byte("bad key"), async.NoopPanicHandler{}) require.NoError(t, err) require.True(t, corrupt) } @@ -53,13 +53,13 @@ func TestVault_Corrupt_JunkData(t *testing.T) { vaultDir, gluonDir := t.TempDir(), t.TempDir() { - _, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), queue.NoopPanicHandler{}) + _, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), async.NoopPanicHandler{}) require.NoError(t, err) require.False(t, corrupt) } { - _, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), queue.NoopPanicHandler{}) + _, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), async.NoopPanicHandler{}) require.NoError(t, err) require.False(t, corrupt) } @@ -72,7 +72,7 @@ func TestVault_Corrupt_JunkData(t *testing.T) { _, err = f.Write([]byte("junk data")) require.NoError(t, err) - _, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), queue.NoopPanicHandler{}) + _, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), async.NoopPanicHandler{}) require.NoError(t, err) require.True(t, corrupt) } @@ -100,7 +100,7 @@ func TestVault_Reset(t *testing.T) { func newVault(t *testing.T) *vault.Vault { t.Helper() - s, corrupt, err := vault.New(t.TempDir(), t.TempDir(), []byte("my secret key"), queue.NoopPanicHandler{}) + s, corrupt, err := vault.New(t.TempDir(), t.TempDir(), []byte("my secret key"), async.NoopPanicHandler{}) require.NoError(t, err) require.False(t, corrupt) diff --git a/tests/collector_test.go b/tests/collector_test.go index cfcd62f6..f11e149a 100644 --- a/tests/collector_test.go +++ b/tests/collector_test.go @@ -23,20 +23,20 @@ import ( "sync" "time" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/proton-bridge/v3/internal/events" ) type eventCollector struct { - events map[reflect.Type]*queue.QueuedChannel[events.Event] - fwdCh []*queue.QueuedChannel[events.Event] + events map[reflect.Type]*async.QueuedChannel[events.Event] + fwdCh []*async.QueuedChannel[events.Event] lock sync.Mutex wg sync.WaitGroup } func newEventCollector() *eventCollector { return &eventCollector{ - events: make(map[reflect.Type]*queue.QueuedChannel[events.Event]), + events: make(map[reflect.Type]*async.QueuedChannel[events.Event]), } } @@ -44,7 +44,7 @@ func (c *eventCollector) collectFrom(eventCh <-chan events.Event) <-chan events. c.lock.Lock() defer c.lock.Unlock() - fwdCh := queue.NewQueuedChannel[events.Event](0, 0, queue.NoopPanicHandler{}) + fwdCh := async.NewQueuedChannel[events.Event](0, 0, async.NoopPanicHandler{}) c.fwdCh = append(c.fwdCh, fwdCh) @@ -87,7 +87,7 @@ func (c *eventCollector) push(event events.Event) { defer c.lock.Unlock() if _, ok := c.events[reflect.TypeOf(event)]; !ok { - c.events[reflect.TypeOf(event)] = queue.NewQueuedChannel[events.Event](0, 0, queue.NoopPanicHandler{}) + c.events[reflect.TypeOf(event)] = async.NewQueuedChannel[events.Event](0, 0, async.NoopPanicHandler{}) } c.events[reflect.TypeOf(event)].Enqueue(event) @@ -102,7 +102,7 @@ func (c *eventCollector) getEventCh(ofType events.Event) <-chan events.Event { defer c.lock.Unlock() if _, ok := c.events[reflect.TypeOf(ofType)]; !ok { - c.events[reflect.TypeOf(ofType)] = queue.NewQueuedChannel[events.Event](0, 0, queue.NoopPanicHandler{}) + c.events[reflect.TypeOf(ofType)] = async.NewQueuedChannel[events.Event](0, 0, async.NoopPanicHandler{}) } return c.events[reflect.TypeOf(ofType)].GetChannel() diff --git a/tests/ctx_bridge_test.go b/tests/ctx_bridge_test.go index 7a6edf66..92cdf0e1 100644 --- a/tests/ctx_bridge_test.go +++ b/tests/ctx_bridge_test.go @@ -29,8 +29,8 @@ import ( "runtime" "time" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/gluon/imap" - "github.com/ProtonMail/gluon/queue" "github.com/ProtonMail/proton-bridge/v3/internal/bridge" "github.com/ProtonMail/proton-bridge/v3/internal/constants" "github.com/ProtonMail/proton-bridge/v3/internal/cookies" @@ -108,7 +108,7 @@ func (t *testCtx) initBridge() (<-chan events.Event, error) { } // Create the vault. - vault, corrupt, err := vault.New(vaultDir, gluonCacheDir, t.storeKey, queue.NoopPanicHandler{}) + vault, corrupt, err := vault.New(vaultDir, gluonCacheDir, t.storeKey, async.NoopPanicHandler{}) if err != nil { return nil, fmt.Errorf("could not create vault: %w", err) } else if corrupt { @@ -200,7 +200,7 @@ func (t *testCtx) initFrontendService(eventCh <-chan events.Event) error { t.mocks.Autostarter.EXPECT().IsEnabled().AnyTimes() service, err := frontend.NewService( - new(mockCrashHandler), + &async.NoopPanicHandler{}, new(mockRestarter), t.locator, t.bridge, @@ -301,7 +301,7 @@ func (t *testCtx) initFrontendClient() error { return fmt.Errorf("could not start event stream: %w", err) } - eventCh := queue.NewQueuedChannel[*frontend.StreamEvent](0, 0, queue.NoopPanicHandler{}) + eventCh := async.NewQueuedChannel[*frontend.StreamEvent](0, 0, async.NoopPanicHandler{}) go func() { defer eventCh.CloseAndDiscardQueued() @@ -343,10 +343,6 @@ func (t *testCtx) closeFrontendClient() error { return nil } -type mockCrashHandler struct{} - -func (m *mockCrashHandler) HandlePanic() {} - type mockRestarter struct{} func (m *mockRestarter) Set(restart, crash bool) {} diff --git a/tests/ctx_helper_test.go b/tests/ctx_helper_test.go index 05c5b0a4..38641c39 100644 --- a/tests/ctx_helper_test.go +++ b/tests/ctx_helper_test.go @@ -23,7 +23,7 @@ import ( "os" "runtime" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/go-proton-api" "github.com/ProtonMail/gopenpgp/v2/crypto" "github.com/bradenaw/juniper/stream" @@ -114,7 +114,7 @@ func (t *testCtx) withAddrKR( return err } - _, addrKRs, err := proton.Unlock(user, addr, keyPass, queue.NoopPanicHandler{}) + _, addrKRs, err := proton.Unlock(user, addr, keyPass, async.NoopPanicHandler{}) if err != nil { return err } diff --git a/tests/ctx_test.go b/tests/ctx_test.go index fd6be67c..13bff820 100644 --- a/tests/ctx_test.go +++ b/tests/ctx_test.go @@ -29,7 +29,7 @@ import ( "testing" "github.com/Masterminds/semver/v3" - "github.com/ProtonMail/gluon/queue" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/go-proton-api" "github.com/ProtonMail/go-proton-api/server" "github.com/ProtonMail/proton-bridge/v3/internal/bridge" @@ -141,7 +141,7 @@ type testCtx struct { // client holds the gRPC frontend client under test. client frontend.BridgeClient clientConn *grpc.ClientConn - clientEventCh *queue.QueuedChannel[*frontend.StreamEvent] + clientEventCh *async.QueuedChannel[*frontend.StreamEvent] // These maps hold test objects created during the test. userByID map[string]*testUser diff --git a/utils/vault-editor/main.go b/utils/vault-editor/main.go index a396a05f..20a535d9 100644 --- a/utils/vault-editor/main.go +++ b/utils/vault-editor/main.go @@ -24,6 +24,7 @@ import ( "io" "os" + "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/proton-bridge/v3/internal/app" "github.com/ProtonMail/proton-bridge/v3/internal/locations" "github.com/ProtonMail/proton-bridge/v3/internal/vault" @@ -49,7 +50,7 @@ func main() { func readAction(c *cli.Context) error { return app.WithLocations(func(locations *locations.Locations) error { - return app.WithVault(locations, func(vault *vault.Vault, insecure, corrupt bool) error { + return app.WithVault(locations, async.NoopPanicHandler{}, func(vault *vault.Vault, insecure, corrupt bool) error { if _, err := os.Stdout.Write(vault.ExportJSON()); err != nil { return fmt.Errorf("failed to write vault: %w", err) } @@ -61,7 +62,7 @@ func readAction(c *cli.Context) error { func writeAction(c *cli.Context) error { return app.WithLocations(func(locations *locations.Locations) error { - return app.WithVault(locations, func(vault *vault.Vault, insecure, corrupt bool) error { + return app.WithVault(locations, async.NoopPanicHandler{}, func(vault *vault.Vault, insecure, corrupt bool) error { b, err := io.ReadAll(os.Stdin) if err != nil { return fmt.Errorf("failed to read vault: %w", err)