Serve Swagger UI from embedded assets instead of unpkg CDN

Bundle swagger-ui-dist@5.32.5 (bundle + CSS) with go:embed and expose
/docs/swagger-ui-bundle.js and /docs/swagger-ui.css so /docs works without
external script loads (fixes timeouts when unpkg is unreachable).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-05 04:25:44 +00:00
parent 14fcce50af
commit 7a1ceb49c3
4 changed files with 27 additions and 2 deletions

View File

@@ -11,6 +11,12 @@ import (
//go:embed openapi.yaml //go:embed openapi.yaml
var openapiYAML []byte var openapiYAML []byte
//go:embed swagger-ui-bundle.js
var swaggerUIBundleJS []byte
//go:embed swagger-ui.css
var swaggerUICSS []byte
var openapiJSON []byte var openapiJSON []byte
func init() { func init() {
@@ -70,11 +76,11 @@ const swaggerHTML = `<!DOCTYPE html>
<head> <head>
<title>NIP-05 API</title> <title>NIP-05 API</title>
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5/swagger-ui.css" /> <link rel="stylesheet" href="/docs/swagger-ui.css" />
</head> </head>
<body> <body>
<div id="swagger-ui"></div> <div id="swagger-ui"></div>
<script src="https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js"></script> <script src="/docs/swagger-ui-bundle.js"></script>
<script> <script>
window.onload = () => { window.onload = () => {
window.ui = SwaggerUIBundle({ window.ui = SwaggerUIBundle({
@@ -91,3 +97,15 @@ func ServeUI(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Header().Set("Content-Type", "text/html; charset=utf-8")
_, _ = w.Write([]byte(swaggerHTML)) _, _ = w.Write([]byte(swaggerHTML))
} }
func ServeJS(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/javascript; charset=utf-8")
w.Header().Set("Cache-Control", "public, max-age=86400")
_, _ = w.Write(swaggerUIBundleJS)
}
func ServeCSS(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/css; charset=utf-8")
w.Header().Set("Cache-Control", "public, max-age=86400")
_, _ = w.Write(swaggerUICSS)
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -62,6 +62,8 @@ func NewServer(d Deps) *http.Server {
r.Get("/openapi.json", docs.ServeJSON) r.Get("/openapi.json", docs.ServeJSON)
r.Get("/docs", docs.ServeUI) r.Get("/docs", docs.ServeUI)
r.Get("/docs/", docs.ServeUI) r.Get("/docs/", docs.ServeUI)
r.Get("/docs/swagger-ui-bundle.js", docs.ServeJS)
r.Get("/docs/swagger-ui.css", docs.ServeCSS)
r.Route("/v1", func(r chi.Router) { r.Route("/v1", func(r chi.Router) {
r.Get("/pricing", pricing.Handle) r.Get("/pricing", pricing.Handle)