Add PWA, service worker and Web Push
- Use new notification request/opt-in flow for push - Implement unsubscribing - Implement muting - Implement emojis in title - Add iOS specific PWA warning - Don’t use websockets when web push is enabled - Fix duplicate notifications - Implement default web push setting - Implement changing subscription type - Implement web push subscription refresh - Implement web push notification click
This commit is contained in:
		
							parent
							
								
									733ef4664b
								
							
						
					
					
						commit
						ff5c854192
					
				
					 53 changed files with 4363 additions and 249 deletions
				
			
		
							
								
								
									
										17
									
								
								cmd/serve.go
									
										
									
									
									
								
							
							
						
						
									
										17
									
								
								cmd/serve.go
									
										
									
									
									
								
							|  | @ -94,6 +94,11 @@ var flagsServe = append( | |||
| 	altsrc.NewBoolFlag(&cli.BoolFlag{Name: "enable-metrics", Aliases: []string{"enable_metrics"}, EnvVars: []string{"NTFY_ENABLE_METRICS"}, Value: false, Usage: "if set, Prometheus metrics are exposed via the /metrics endpoint"}), | ||||
| 	altsrc.NewStringFlag(&cli.StringFlag{Name: "metrics-listen-http", Aliases: []string{"metrics_listen_http"}, EnvVars: []string{"NTFY_METRICS_LISTEN_HTTP"}, Usage: "ip:port used to expose the metrics endpoint (implicitly enables metrics)"}), | ||||
| 	altsrc.NewStringFlag(&cli.StringFlag{Name: "profile-listen-http", Aliases: []string{"profile_listen_http"}, EnvVars: []string{"NTFY_PROFILE_LISTEN_HTTP"}, Usage: "ip:port used to expose the profiling endpoints (implicitly enables profiling)"}), | ||||
| 	altsrc.NewBoolFlag(&cli.BoolFlag{Name: "web-push-enabled", Aliases: []string{"web_push_enabled"}, EnvVars: []string{"NTFY_WEB_PUSH_ENABLED"}, Usage: "enable web push (requires public and private key)"}), | ||||
| 	altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-public-key", Aliases: []string{"web_push_public_key"}, EnvVars: []string{"NTFY_WEB_PUSH_PUBLIC_KEY"}, Usage: "public key used for web push notifications"}), | ||||
| 	altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-private-key", Aliases: []string{"web_push_private_key"}, EnvVars: []string{"NTFY_WEB_PUSH_PRIVATE_KEY"}, Usage: "private key used for web push notifications"}), | ||||
| 	altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-subscriptions-file", Aliases: []string{"web_push_subscriptions_file"}, EnvVars: []string{"NTFY_WEB_PUSH_SUBSCRIPTIONS_FILE"}, Usage: "file used to store web push subscriptions"}), | ||||
| 	altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-email-address", Aliases: []string{"web_push_email_address"}, EnvVars: []string{"NTFY_WEB_PUSH_EMAIL_ADDRESS"}, Usage: "e-mail address of sender, required to use browser push services"}), | ||||
| ) | ||||
| 
 | ||||
| var cmdServe = &cli.Command{ | ||||
|  | @ -129,6 +134,11 @@ func execServe(c *cli.Context) error { | |||
| 	keyFile := c.String("key-file") | ||||
| 	certFile := c.String("cert-file") | ||||
| 	firebaseKeyFile := c.String("firebase-key-file") | ||||
| 	webPushEnabled := c.Bool("web-push-enabled") | ||||
| 	webPushPrivateKey := c.String("web-push-private-key") | ||||
| 	webPushPublicKey := c.String("web-push-public-key") | ||||
| 	webPushSubscriptionsFile := c.String("web-push-subscriptions-file") | ||||
| 	webPushEmailAddress := c.String("web-push-email-address") | ||||
| 	cacheFile := c.String("cache-file") | ||||
| 	cacheDuration := c.Duration("cache-duration") | ||||
| 	cacheStartupQueries := c.String("cache-startup-queries") | ||||
|  | @ -183,6 +193,8 @@ func execServe(c *cli.Context) error { | |||
| 	// Check values | ||||
| 	if firebaseKeyFile != "" && !util.FileExists(firebaseKeyFile) { | ||||
| 		return errors.New("if set, FCM key file must exist") | ||||
| 	} else if webPushEnabled && (webPushPrivateKey == "" || webPushPublicKey == "" || webPushSubscriptionsFile == "" || webPushEmailAddress == "" || baseURL == "") { | ||||
| 		return errors.New("if web push is enabled, web-push-private-key, web-push-public-key, web-push-subscriptions-file, web-push-email-address, and base-url should be set. run 'ntfy web-push-keys' to generate keys") | ||||
| 	} else if keepaliveInterval < 5*time.Second { | ||||
| 		return errors.New("keepalive interval cannot be lower than five seconds") | ||||
| 	} else if managerInterval < 5*time.Second { | ||||
|  | @ -347,6 +359,11 @@ func execServe(c *cli.Context) error { | |||
| 	conf.MetricsListenHTTP = metricsListenHTTP | ||||
| 	conf.ProfileListenHTTP = profileListenHTTP | ||||
| 	conf.Version = c.App.Version | ||||
| 	conf.WebPushEnabled = webPushEnabled | ||||
| 	conf.WebPushPrivateKey = webPushPrivateKey | ||||
| 	conf.WebPushPublicKey = webPushPublicKey | ||||
| 	conf.WebPushSubscriptionsFile = webPushSubscriptionsFile | ||||
| 	conf.WebPushEmailAddress = webPushEmailAddress | ||||
| 
 | ||||
| 	// Set up hot-reloading of config | ||||
| 	go sigHandlerConfigReload(config) | ||||
|  |  | |||
							
								
								
									
										39
									
								
								cmd/web_push.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								cmd/web_push.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,39 @@ | |||
| //go:build !noserver | ||||
| 
 | ||||
| package cmd | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 
 | ||||
| 	"github.com/SherClockHolmes/webpush-go" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| ) | ||||
| 
 | ||||
| func init() { | ||||
| 	commands = append(commands, cmdWebPush) | ||||
| } | ||||
| 
 | ||||
| var cmdWebPush = &cli.Command{ | ||||
| 	Name:      "web-push-keys", | ||||
| 	Usage:     "Generate web push VAPID keys", | ||||
| 	UsageText: "ntfy web-push-keys", | ||||
| 	Category:  categoryServer, | ||||
| 	Action:    generateWebPushKeys, | ||||
| } | ||||
| 
 | ||||
| func generateWebPushKeys(c *cli.Context) error { | ||||
| 	privateKey, publicKey, err := webpush.GenerateVAPIDKeys() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	fmt.Fprintf(c.App.ErrWriter, `Add the following lines to your config file: | ||||
| web-push-enabled: true | ||||
| web-push-public-key: %s | ||||
| web-push-private-key: %s | ||||
| web-push-subscriptions-file: <filename> | ||||
| web-push-email-address: <email address> | ||||
| `, publicKey, privateKey) | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue