feat: integrate nebula UI with worker-assets-gen

This commit is contained in:
Prad Nukala
2024-10-07 21:15:25 -04:00
parent e926e5b9d6
commit af6e07323b
22 changed files with 114 additions and 101 deletions
-10
View File
@@ -1,10 +0,0 @@
package commands
import "github.com/spf13/cobra"
func NewRootCmd() *cobra.Command {
return &cobra.Command{
Use: "motr",
Short: "Manage a local DWN instance for the Sonr blockchain",
}
}
-18
View File
@@ -1,18 +0,0 @@
package commands
import (
"github.com/spf13/cobra"
"github.com/onsonr/sonr/cmd/hway/server"
)
func NewStartCmd() *cobra.Command {
return &cobra.Command{
Use: "start",
Short: "Starts the DWN proxy server for the local IPFS node",
Run: func(cmd *cobra.Command, args []string) {
s := server.New()
s.Start()
},
}
}
-13
View File
@@ -1,13 +0,0 @@
package main
import (
"github.com/onsonr/sonr/cmd/hway/commands"
)
func main() {
rootCmd := commands.NewRootCmd()
rootCmd.AddCommand(commands.NewStartCmd())
if err := rootCmd.Execute(); err != nil {
panic(err)
}
}
-1
View File
@@ -1 +0,0 @@
package handlers
-1
View File
@@ -1 +0,0 @@
package handlers
-1
View File
@@ -1 +0,0 @@
package handlers
-1
View File
@@ -1 +0,0 @@
package handlers
-40
View File
@@ -1,40 +0,0 @@
package server
import (
"net/http"
"github.com/labstack/echo/v4"
"github.com/labstack/gommon/log"
"github.com/onsonr/sonr/internal/session"
"github.com/onsonr/sonr/pkg/nebula"
"github.com/onsonr/sonr/pkg/nebula/routes"
)
type Server struct {
*echo.Echo
}
func New() *Server {
s := &Server{Echo: echo.New()}
s.Logger.SetLevel(log.INFO)
s.Use(session.UseSession)
// Configure the server
if err := nebula.UseAssets(s.Echo); err != nil {
s.Logger.Fatal(err)
}
s.GET("/", routes.Home)
s.GET("/login", routes.LoginStart)
s.GET("/register", routes.RegisterStart)
// s.GET("/profile", router.Profile)
// s.GET("/authorize", router.Authorize)
return s
}
func (s *Server) Start() {
if err := s.Echo.Start(":1323"); err != http.ErrServerClosed {
log.Fatal(err)
}
}
-158
View File
@@ -1,158 +0,0 @@
//go:build js && wasm
// +build js,wasm
package main
import (
"bytes"
"fmt"
"io"
"net/http"
"net/http/httptest"
"strings"
"syscall/js"
"github.com/labstack/echo/v4"
promise "github.com/nlepage/go-js-promise"
"github.com/onsonr/sonr/internal/session"
"github.com/onsonr/sonr/pkg/nebula/routes"
"github.com/onsonr/sonr/pkg/nebula/worker"
)
func main() {
e := echo.New()
e.Use(session.UseSession)
registerViews(e)
registerState(e)
Serve(e)
}
func registerState(e *echo.Echo) {
g := e.Group("state")
g.POST("/login/:identifier", worker.HandleCredentialAssertion)
g.GET("/jwks", worker.GetJWKS)
g.GET("/token", worker.GetToken)
g.POST("/:origin/grant/:subject", worker.GrantAuthorization)
g.POST("/register/:subject", worker.HandleCredentialCreation)
g.POST("/register/:subject/check", worker.CheckSubjectIsValid)
}
func registerViews(e *echo.Echo) {
e.GET("/home", routes.Home)
e.GET("/login", routes.LoginStart)
e.GET("/register", routes.RegisterStart)
}
// Serve serves HTTP requests using handler or http.DefaultServeMux if handler is nil.
func Serve(handler http.Handler) func() {
h := handler
if h == nil {
h = http.DefaultServeMux
}
prefix := js.Global().Get("wasmhttp").Get("path").String()
for strings.HasSuffix(prefix, "/") {
prefix = strings.TrimSuffix(prefix, "/")
}
if prefix != "" {
mux := http.NewServeMux()
mux.Handle(prefix+"/", http.StripPrefix(prefix, h))
h = mux
}
cb := js.FuncOf(func(_ js.Value, args []js.Value) interface{} {
resPromise, resolve, reject := promise.New()
go func() {
defer func() {
if r := recover(); r != nil {
if err, ok := r.(error); ok {
reject(fmt.Sprintf("wasmhttp: panic: %+v\n", err))
} else {
reject(fmt.Sprintf("wasmhttp: panic: %v\n", r))
}
}
}()
res := NewResponseRecorder()
h.ServeHTTP(res, Request(args[0]))
resolve(res.JSResponse())
}()
return resPromise
})
js.Global().Get("wasmhttp").Call("setHandler", cb)
return cb.Release
}
// Request builds and returns the equivalent http.Request
func Request(r js.Value) *http.Request {
jsBody := js.Global().Get("Uint8Array").New(promise.Await(r.Call("arrayBuffer")))
body := make([]byte, jsBody.Get("length").Int())
js.CopyBytesToGo(body, jsBody)
req := httptest.NewRequest(
r.Get("method").String(),
r.Get("url").String(),
bytes.NewBuffer(body),
)
headersIt := r.Get("headers").Call("entries")
for {
e := headersIt.Call("next")
if e.Get("done").Bool() {
break
}
v := e.Get("value")
req.Header.Set(v.Index(0).String(), v.Index(1).String())
}
return req
}
// ResponseRecorder uses httptest.ResponseRecorder to build a JS Response
type ResponseRecorder struct {
*httptest.ResponseRecorder
}
// NewResponseRecorder returns a new ResponseRecorder
func NewResponseRecorder() ResponseRecorder {
return ResponseRecorder{httptest.NewRecorder()}
}
// JSResponse builds and returns the equivalent JS Response
func (rr ResponseRecorder) JSResponse() js.Value {
res := rr.Result()
body := js.Undefined()
if res.ContentLength != 0 {
b, err := io.ReadAll(res.Body)
if err != nil {
panic(err)
}
body = js.Global().Get("Uint8Array").New(len(b))
js.CopyBytesToJS(body, b)
}
init := make(map[string]interface{}, 2)
if res.StatusCode != 0 {
init["status"] = res.StatusCode
}
if len(res.Header) != 0 {
headers := make(map[string]interface{}, len(res.Header))
for k := range res.Header {
headers[k] = res.Header.Get(k)
}
init["headers"] = headers
}
return js.Global().Get("Response").New(body, init)
}