mirror of
https://github.com/yudai/gotty.git
synced 2026-02-08 09:24:21 +01:00
Add Progressive Web App support
provide manifest.json to enable PWA compatibilities
This commit is contained in:
parent
a080c85cbc
commit
b685b8040a
7 changed files with 146 additions and 54 deletions
106
server/asset.go
106
server/asset.go
File diff suppressed because one or more lines are too long
|
|
@ -169,6 +169,40 @@ func (server *Server) processWSConn(ctx context.Context, conn *websocket.Conn) e
|
|||
}
|
||||
|
||||
func (server *Server) handleIndex(w http.ResponseWriter, r *http.Request) {
|
||||
indexVars, err := server.indexVariables(r)
|
||||
if err != nil {
|
||||
http.Error(w, "Internal Server Error", 500)
|
||||
return
|
||||
}
|
||||
|
||||
indexBuf := new(bytes.Buffer)
|
||||
err = server.indexTemplate.Execute(indexBuf, indexVars)
|
||||
if err != nil {
|
||||
http.Error(w, "Internal Server Error", 500)
|
||||
return
|
||||
}
|
||||
|
||||
w.Write(indexBuf.Bytes())
|
||||
}
|
||||
|
||||
func (server *Server) handleManifest(w http.ResponseWriter, r *http.Request) {
|
||||
indexVars, err := server.indexVariables(r)
|
||||
if err != nil {
|
||||
http.Error(w, "Internal Server Error", 500)
|
||||
return
|
||||
}
|
||||
|
||||
indexBuf := new(bytes.Buffer)
|
||||
err = server.manifestTemplate.Execute(indexBuf, indexVars)
|
||||
if err != nil {
|
||||
http.Error(w, "Internal Server Error", 500)
|
||||
return
|
||||
}
|
||||
|
||||
w.Write(indexBuf.Bytes())
|
||||
}
|
||||
|
||||
func (server *Server) indexVariables(r *http.Request) (map[string]interface{}, error) {
|
||||
titleVars := server.titleVariables(
|
||||
[]string{"server", "master"},
|
||||
map[string]map[string]interface{}{
|
||||
|
|
@ -182,22 +216,13 @@ func (server *Server) handleIndex(w http.ResponseWriter, r *http.Request) {
|
|||
titleBuf := new(bytes.Buffer)
|
||||
err := server.titleTemplate.Execute(titleBuf, titleVars)
|
||||
if err != nil {
|
||||
http.Error(w, "Internal Server Error", 500)
|
||||
return
|
||||
return nil, err
|
||||
}
|
||||
|
||||
indexVars := map[string]interface{}{
|
||||
"title": titleBuf.String(),
|
||||
}
|
||||
|
||||
indexBuf := new(bytes.Buffer)
|
||||
err = server.indexTemplate.Execute(indexBuf, indexVars)
|
||||
if err != nil {
|
||||
http.Error(w, "Internal Server Error", 500)
|
||||
return
|
||||
}
|
||||
|
||||
w.Write(indexBuf.Bytes())
|
||||
return indexVars, err
|
||||
}
|
||||
|
||||
func (server *Server) handleAuthToken(w http.ResponseWriter, r *http.Request) {
|
||||
|
|
|
|||
|
|
@ -28,9 +28,10 @@ type Server struct {
|
|||
factory Factory
|
||||
options *Options
|
||||
|
||||
upgrader *websocket.Upgrader
|
||||
indexTemplate *template.Template
|
||||
titleTemplate *noesctmpl.Template
|
||||
upgrader *websocket.Upgrader
|
||||
indexTemplate *template.Template
|
||||
titleTemplate *noesctmpl.Template
|
||||
manifestTemplate *template.Template
|
||||
}
|
||||
|
||||
// New creates a new instance of Server.
|
||||
|
|
@ -52,6 +53,15 @@ func New(factory Factory, options *Options) (*Server, error) {
|
|||
panic("index template parse failed") // must be valid
|
||||
}
|
||||
|
||||
manifestData, err := Asset("static/manifest.json")
|
||||
if err != nil {
|
||||
panic("manifest not found") // must be in bindata
|
||||
}
|
||||
manifestTemplate, err := template.New("manifest").Parse(string(manifestData))
|
||||
if err != nil {
|
||||
panic("manifest template parse failed") // must be valid
|
||||
}
|
||||
|
||||
titleTemplate, err := noesctmpl.New("title").Parse(options.TitleFormat)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to parse window title format `%s`", options.TitleFormat)
|
||||
|
|
@ -78,8 +88,9 @@ func New(factory Factory, options *Options) (*Server, error) {
|
|||
Subprotocols: webtty.Protocols,
|
||||
CheckOrigin: originChekcer,
|
||||
},
|
||||
indexTemplate: indexTemplate,
|
||||
titleTemplate: titleTemplate,
|
||||
indexTemplate: indexTemplate,
|
||||
titleTemplate: titleTemplate,
|
||||
manifestTemplate: manifestTemplate,
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
|
@ -190,7 +201,9 @@ func (server *Server) setupHandlers(ctx context.Context, cancel context.CancelFu
|
|||
siteMux.Handle(pathPrefix+"js/", http.StripPrefix(pathPrefix, staticFileHandler))
|
||||
siteMux.Handle(pathPrefix+"favicon.png", http.StripPrefix(pathPrefix, staticFileHandler))
|
||||
siteMux.Handle(pathPrefix+"css/", http.StripPrefix(pathPrefix, staticFileHandler))
|
||||
siteMux.Handle(pathPrefix+"icon_192.png", http.StripPrefix(pathPrefix, staticFileHandler))
|
||||
|
||||
siteMux.HandleFunc(pathPrefix+"manifest.json", server.handleManifest)
|
||||
siteMux.HandleFunc(pathPrefix+"auth_token.js", server.handleAuthToken)
|
||||
siteMux.HandleFunc(pathPrefix+"config.js", server.handleConfig)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue