golang.org/x/tools@v0.21.0/cmd/present/play.go (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "bytes" 9 "fmt" 10 "io/fs" 11 "net/http" 12 "net/url" 13 "time" 14 15 "golang.org/x/tools/playground/socket" 16 "golang.org/x/tools/present" 17 18 // This will register a handler at /compile that will proxy to the 19 // respective endpoints at play.golang.org. This allows the frontend to call 20 // these endpoints without needing cross-origin request sharing (CORS). 21 // Note that this is imported regardless of whether the endpoints are used or 22 // not (in the case of a local socket connection, they are not called). 23 _ "golang.org/x/tools/playground" 24 ) 25 26 var scripts = []string{"jquery.js", "jquery-ui.js", "playground.js", "play.js"} 27 28 // playScript registers an HTTP handler at /play.js that serves all the 29 // scripts specified by the variable above, and appends a line that 30 // initializes the playground with the specified transport. 31 func playScript(fsys fs.FS, transport string) { 32 modTime := time.Now() 33 var buf bytes.Buffer 34 for _, p := range scripts { 35 b, err := fs.ReadFile(fsys, "static/"+p) 36 if err != nil { 37 panic(err) 38 } 39 buf.Write(b) 40 } 41 fmt.Fprintf(&buf, "\ninitPlayground(new %v());\n", transport) 42 b := buf.Bytes() 43 http.HandleFunc("/play.js", func(w http.ResponseWriter, r *http.Request) { 44 w.Header().Set("Content-type", "application/javascript") 45 http.ServeContent(w, r, "", modTime, bytes.NewReader(b)) 46 }) 47 } 48 49 func initPlayground(fsys fs.FS, origin *url.URL) { 50 if !present.PlayEnabled { 51 return 52 } 53 if *usePlayground { 54 playScript(fsys, "HTTPTransport") 55 return 56 } 57 58 playScript(fsys, "SocketTransport") 59 http.Handle("/socket", socket.NewHandler(origin)) 60 } 61 62 func playable(c present.Code) bool { 63 play := present.PlayEnabled && c.Play 64 65 // Restrict playable files to only Go source files when using play.golang.org, 66 // since there is no method to execute shell scripts there. 67 if *usePlayground { 68 return play && c.Ext == ".go" 69 } 70 return play 71 }