diff options
| author | Peter Stone <thepeterstone@gmail.com> | 2026-03-16 20:57:00 +0000 |
|---|---|---|
| committer | Peter Stone <thepeterstone@gmail.com> | 2026-03-16 20:57:00 +0000 |
| commit | 85003cd4372475b9cae973b74261a6ca3f61af0d (patch) | |
| tree | 3a33811f0b117f365ec46ee0bf547241c6b40b2f /internal | |
| parent | 48aec51b531d995574c5788e5f474343cc6e5c87 (diff) | |
fix: serve sw.js from /api/push/sw.js to bypass Apache static file routing
Apache fronts the Go service and only proxies /api/ paths; /sw.js hits
Apache's filesystem and 404s. Serve the service worker from
/api/push/sw.js with Service-Worker-Allowed: / so the browser allows
it to control the full origin scope. Update SW registration URL.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/api/push.go | 15 | ||||
| -rw-r--r-- | internal/api/server.go | 1 |
2 files changed, 16 insertions, 0 deletions
diff --git a/internal/api/push.go b/internal/api/push.go index 6fd805a..dde5441 100644 --- a/internal/api/push.go +++ b/internal/api/push.go @@ -6,6 +6,7 @@ import ( "github.com/google/uuid" "github.com/thepeterstone/claudomator/internal/storage" + webui "github.com/thepeterstone/claudomator/web" ) // pushSubscriptionStore is the minimal interface needed by push handlers. @@ -37,6 +38,20 @@ func (s *Server) handleGetVAPIDKey(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusOK, map[string]string{"public_key": s.vapidPublicKey}) } +// handleServiceWorker serves sw.js with a Service-Worker-Allowed: / header so +// the SW can control the full origin even though it is registered from /api/push/sw.js. +func (s *Server) handleServiceWorker(w http.ResponseWriter, r *http.Request) { + data, err := webui.Files.ReadFile("sw.js") + if err != nil { + http.Error(w, "service worker not found", http.StatusNotFound) + return + } + w.Header().Set("Content-Type", "application/javascript") + w.Header().Set("Service-Worker-Allowed", "/") + w.WriteHeader(http.StatusOK) + w.Write(data) +} + // handlePushSubscribe saves a new push subscription. func (s *Server) handlePushSubscribe(w http.ResponseWriter, r *http.Request) { var input struct { diff --git a/internal/api/server.go b/internal/api/server.go index 488c500..f640aba 100644 --- a/internal/api/server.go +++ b/internal/api/server.go @@ -134,6 +134,7 @@ func (s *Server) routes() { s.mux.HandleFunc("GET /api/health", s.handleHealth) s.mux.HandleFunc("POST /api/webhooks/github", s.handleGitHubWebhook) s.mux.HandleFunc("GET /api/push/vapid-key", s.handleGetVAPIDKey) + s.mux.HandleFunc("GET /api/push/sw.js", s.handleServiceWorker) s.mux.HandleFunc("POST /api/push/subscribe", s.handlePushSubscribe) s.mux.HandleFunc("DELETE /api/push/subscribe", s.handlePushUnsubscribe) s.mux.HandleFunc("GET /api/drops", s.handleListDrops) |
