Skip to content

Commit 28d36a0

Browse files
viewer has been extracted, but still depends on internal svelte rendering
1 parent 297986c commit 28d36a0

File tree

5 files changed

+99
-10
lines changed

5 files changed

+99
-10
lines changed

example/basic/viewer/svelte/svelte.go

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,20 @@ import (
55
"fmt"
66
"io/fs"
77
"net/http"
8+
"strings"
89

10+
"github.com/livebud/bud/framework/view/ssr"
911
"github.com/livebud/bud/package/js"
1012
"github.com/livebud/bud/package/router"
1113
)
1214

1315
func New(fsys fs.FS, vm js.VM) *Viewer {
14-
return &Viewer{fsys, vm}
16+
return &Viewer{fsys, http.FS(fsys), vm}
1517
}
1618

1719
type Viewer struct {
1820
fsys fs.FS
21+
hfs http.FileSystem
1922
vm js.VM
2023
}
2124

@@ -41,10 +44,48 @@ func (v *Viewer) Render(w http.ResponseWriter, viewPath string, props interface{
4144
http.Error(w, err.Error(), http.StatusInternalServerError)
4245
return
4346
}
44-
fmt.Println("got result", result)
45-
return
47+
// Unmarshal the response
48+
res := new(ssr.Response)
49+
if err := json.Unmarshal([]byte(result), res); err != nil {
50+
http.Error(w, err.Error(), http.StatusInternalServerError)
51+
return
52+
}
53+
if res.Status < 100 || res.Status > 999 {
54+
err := fmt.Errorf("view: invalid status code %d", res.Status)
55+
http.Error(w, err.Error(), http.StatusInternalServerError)
56+
return
57+
}
58+
headers := w.Header()
59+
for key, value := range res.Headers {
60+
headers.Set(key, value)
61+
}
62+
w.WriteHeader(res.Status)
63+
w.Write([]byte(res.Body))
64+
}
65+
66+
func (v *Viewer) Serve(router *router.Router) {
67+
router.Get("/bud/view/:path*", http.HandlerFunc(v.serveClient))
68+
router.Get("/bud/node_modules/:path*", http.HandlerFunc(v.serveClient))
4669
}
4770

48-
func (v *Viewer) Serve(r *router.Router) {
49-
// Serving files!
71+
func (v *Viewer) serveClient(w http.ResponseWriter, r *http.Request) {
72+
file, err := v.hfs.Open(r.URL.Path)
73+
if err != nil {
74+
// TODO: swap with logger
75+
fmt.Println("view: open error", err)
76+
http.Error(w, err.Error(), http.StatusInternalServerError)
77+
return
78+
}
79+
stat, err := file.Stat()
80+
if err != nil {
81+
// TODO: swap with logger
82+
fmt.Println("view: stat error", err)
83+
http.Error(w, err.Error(), http.StatusInternalServerError)
84+
return
85+
}
86+
// Maintain support to resolve and run "/bud/node_modules/livebud/runtime".
87+
if strings.HasPrefix(r.URL.Path, "/bud/node_modules/") {
88+
w.Header().Add("Content-Type", "text/javascript")
89+
}
90+
http.ServeContent(w, r, r.URL.Path, stat.ModTime(), file)
5091
}

framework/controller/controller.gotext

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ type {{ $.Pascal }}Controller struct {
2626
// {{ $.Pascal }}{{$action.Pascal}}Action struct
2727
type {{ $.Pascal }}{{$action.Pascal}}Action struct {
2828
{{- if $action.View }}
29-
View view.Server
29+
{{/* View view.Server */}}
3030
Viewer view.Viewer
3131
{{- end }}
3232
{{- with $provider := $action.Provider }}

framework/web/web.gotext

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,19 @@ func New(
3434
router.{{ $action.Method }}(`{{ $action.Route }}`, controller.{{ $action.CallName }})
3535
{{- end }}
3636
{{- end }}
37+
{{- if $.HasView }}
38+
viewer.Serve(router)
39+
{{- end }}
3740
// Compose the middleware together
3841
middleware := middleware.Compose(
3942
middleware.MethodOverride(),
4043
router,
4144
{{- if $.ShowWelcome }}
4245
welcome,
4346
{{- end }}
44-
{{- if $.HasView }}
47+
{{/* {{- if $.HasView }}
4548
view,
46-
{{- end }}
49+
{{- end }} */}}
4750
{{- if $.HasPublic }}
4851
public,
4952
{{- end }}

package/budclient/client.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,30 @@ func (c *client) Script(path, script string) error {
8787
return fmt.Errorf("budclient: script not implemented yet")
8888
}
8989

90-
func (c *client) Eval(path, expression string) (string, error) {
91-
return "", fmt.Errorf("budclient: eval not implemented yet")
90+
type JS struct {
91+
Path string
92+
Expr string
93+
}
94+
95+
func (c *client) Eval(name, expr string) (string, error) {
96+
body, err := json.Marshal(JS{name, expr})
97+
if err != nil {
98+
return "", err
99+
}
100+
url := c.baseURL + "/eval"
101+
res, err := c.httpClient.Post(url, "application/json", bytes.NewReader(body))
102+
if err != nil {
103+
return "", err
104+
}
105+
defer res.Body.Close()
106+
resBody, err := io.ReadAll(res.Body)
107+
if err != nil {
108+
return "", err
109+
}
110+
if res.StatusCode != http.StatusOK {
111+
return "", fmt.Errorf("budclient: eval returned unexpected %d. %s", res.StatusCode, resBody)
112+
}
113+
return string(resBody), nil
92114
}
93115

94116
// Render a path with props on the dev server

package/budserver/server.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ func New(fsys fs.FS, bus pubsub.Client, log log.Interface, vm js.VM) *Server {
4040
router.Post("/bud/events", http.HandlerFunc(server.createEvent))
4141
// Open a file
4242
router.Get("/open/:path*", http.HandlerFunc(server.openFile))
43+
// Eval some JS
44+
router.Post("/eval", http.HandlerFunc(server.evalJS))
4345
return server
4446
}
4547

@@ -145,6 +147,27 @@ func (s *Server) openFile(w http.ResponseWriter, r *http.Request) {
145147
s.log.Debug("devserver: opened", "file", filePath)
146148
}
147149

150+
func (s *Server) evalJS(w http.ResponseWriter, r *http.Request) {
151+
s.log.Debug("devserver: evaling")
152+
body, err := io.ReadAll(r.Body)
153+
if err != nil {
154+
http.Error(w, err.Error(), http.StatusBadRequest)
155+
return
156+
}
157+
var input budclient.JS
158+
if err := json.Unmarshal(body, &input); err != nil {
159+
http.Error(w, err.Error(), http.StatusBadRequest)
160+
return
161+
}
162+
result, err := s.vm.Eval(input.Path, input.Expr)
163+
if err != nil {
164+
http.Error(w, err.Error(), http.StatusBadRequest)
165+
return
166+
}
167+
w.Write([]byte(result))
168+
s.log.Debug("devserver: evaled")
169+
}
170+
148171
func (s *Server) createEvent(w http.ResponseWriter, r *http.Request) {
149172
// Read the body
150173
body, err := io.ReadAll(r.Body)

0 commit comments

Comments
 (0)