mirror of
https://github.com/coder/coder.git
synced 2025-07-03 16:13:58 +00:00
feat(coderd): add webpush package (#17091)
* Adds `codersdk.ExperimentWebPush` (`web-push`) * Adds a `coderd/webpush` package that allows sending native push notifications via `github.com/SherClockHolmes/webpush-go` * Adds database tables to store push notification subscriptions. * Adds an API endpoint that allows users to subscribe/unsubscribe, and send a test notification (404 without experiment, excluded from API docs) * Adds server CLI command to regenerate VAPID keys (note: regenerating the VAPID keypair requires deleting all existing subscriptions) --------- Co-authored-by: Kyle Carberry <kyle@carberry.com>
This commit is contained in:
@ -78,6 +78,7 @@ import (
|
||||
"github.com/coder/coder/v2/coderd/unhanger"
|
||||
"github.com/coder/coder/v2/coderd/updatecheck"
|
||||
"github.com/coder/coder/v2/coderd/util/ptr"
|
||||
"github.com/coder/coder/v2/coderd/webpush"
|
||||
"github.com/coder/coder/v2/coderd/workspaceapps"
|
||||
"github.com/coder/coder/v2/coderd/workspaceapps/appurl"
|
||||
"github.com/coder/coder/v2/coderd/workspacestats"
|
||||
@ -161,6 +162,7 @@ type Options struct {
|
||||
Logger *slog.Logger
|
||||
StatsBatcher workspacestats.Batcher
|
||||
|
||||
WebpushDispatcher webpush.Dispatcher
|
||||
WorkspaceAppsStatsCollectorOptions workspaceapps.StatsCollectorOptions
|
||||
AllowWorkspaceRenames bool
|
||||
NewTicker func(duration time.Duration) (<-chan time.Time, func())
|
||||
@ -280,6 +282,15 @@ func NewOptions(t testing.TB, options *Options) (func(http.Handler), context.Can
|
||||
require.NoError(t, err, "insert a deployment id")
|
||||
}
|
||||
|
||||
if options.WebpushDispatcher == nil {
|
||||
// nolint:gocritic // Gets/sets VAPID keys.
|
||||
pushNotifier, err := webpush.New(dbauthz.AsNotifier(context.Background()), options.Logger, options.Database)
|
||||
if err != nil {
|
||||
panic(xerrors.Errorf("failed to create web push notifier: %w", err))
|
||||
}
|
||||
options.WebpushDispatcher = pushNotifier
|
||||
}
|
||||
|
||||
if options.DeploymentValues == nil {
|
||||
options.DeploymentValues = DeploymentValues(t)
|
||||
}
|
||||
@ -530,6 +541,7 @@ func NewOptions(t testing.TB, options *Options) (func(http.Handler), context.Can
|
||||
TrialGenerator: options.TrialGenerator,
|
||||
RefreshEntitlements: options.RefreshEntitlements,
|
||||
TailnetCoordinator: options.Coordinator,
|
||||
WebPushDispatcher: options.WebpushDispatcher,
|
||||
BaseDERPMap: derpMap,
|
||||
DERPMapUpdateFrequency: 150 * time.Millisecond,
|
||||
CoordinatorResumeTokenProvider: options.CoordinatorResumeTokenProvider,
|
||||
|
Reference in New Issue
Block a user