in visual/react/server.go [19:73]
func (sh StaticHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
// resp.Header().Set("Access-Control-Allow-Origin", "http://localhost:3000")
root := &Node{ID: "root"}
nodes := map[flow.Steper]*Node{sh.Workflow: root}
getNode := func(s flow.Steper) *Node {
node, ok := nodes[s]
if !ok {
node = &Node{ID: uuid.NewString()}
nodes[s] = node
}
return node
}
flow.Traverse(sh.Workflow, func(s flow.Steper, walked []flow.Steper) flow.TraverseDecision {
if w, ok := s.(interface {
Unwrap() []flow.Steper
UpstreamOf(flow.Steper) map[flow.Steper]flow.StepResult
}); ok {
for _, r := range w.Unwrap() {
n := getNode(r)
n.Labels = append(n.Labels, Label{flow.String(r)})
parent := s
for i := len(walked) - 1; i >= 0; i-- {
if _, ok := walked[i].(interface{ Unwrap() []flow.Steper }); ok {
if i < len(walked)-1 {
parent = walked[i+1]
break
}
}
}
getNode(parent).Children = append(getNode(parent).Children, n)
for up := range w.UpstreamOf(r) {
eid := uuid.NewString()
getNode(parent).Edges = append(getNode(parent).Edges, &Edge{
ID: eid,
Sources: []string{getNode(up).ID},
Targets: []string{getNode(r).ID},
})
}
}
}
return flow.TraverseContinue
})
b, err := json.Marshal(root)
if err != nil {
resp.WriteHeader(http.StatusInternalServerError)
slog.Error("failed to marshal flow", "error", err)
return
}
resp.WriteHeader(http.StatusOK)
if _, err := resp.Write(b); err != nil {
slog.Error("failed to write response", "error", err)
return
}
}