feat: rewrite app system
Some checks reported warnings
arcad/arcast/pipeline/head This commit is unstable
Some checks reported warnings
arcad/arcast/pipeline/head This commit is unstable
This commit is contained in:
@ -12,10 +12,11 @@ import (
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
InstanceID string `json:"instanceId"`
|
||||
HTTP HTTPConfig `json:"http"`
|
||||
HTTPS HTTPSConfig `json:"https"`
|
||||
Apps AppsConfig `json:"apps"`
|
||||
InstanceID string `json:"instanceId"`
|
||||
HTTP HTTPConfig `json:"http"`
|
||||
HTTPS HTTPSConfig `json:"https"`
|
||||
Apps AppsConfig `json:"apps"`
|
||||
AllowedOrigins []string `json:"allowedOrigins"`
|
||||
}
|
||||
|
||||
type HTTPConfig struct {
|
||||
@ -95,7 +96,8 @@ func LoadOrCreate(ctx context.Context, filename string, conf *Config, funcs ...T
|
||||
|
||||
func DefaultConfig() *Config {
|
||||
return &Config{
|
||||
InstanceID: server.NewRandomInstanceID(),
|
||||
InstanceID: server.NewRandomInstanceID(),
|
||||
AllowedOrigins: []string{},
|
||||
HTTP: HTTPConfig{
|
||||
Address: ":45555",
|
||||
},
|
||||
@ -108,7 +110,7 @@ func DefaultConfig() *Config {
|
||||
},
|
||||
Apps: AppsConfig{
|
||||
Enabled: true,
|
||||
DefaultApp: "home",
|
||||
DefaultApp: "main",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -13,16 +13,33 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
upgrader = websocket.Upgrader{}
|
||||
channels = &channelMap{
|
||||
index: make(map[string]map[*websocket.Conn]struct{}),
|
||||
}
|
||||
)
|
||||
|
||||
func (s *Server) checkOrigin(r *http.Request) bool {
|
||||
allowedOrigins, err := s.getAllowedOrigins()
|
||||
if err != nil {
|
||||
logger.Error(r.Context(), "could not retrieve allowed origins", logger.CapturedE(errors.WithStack(err)))
|
||||
return false
|
||||
}
|
||||
|
||||
requestOrigin := r.Header.Get("Origin")
|
||||
|
||||
for _, origin := range allowedOrigins {
|
||||
if requestOrigin == origin || origin == "*" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *Server) handleBroadcast(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
|
||||
c, err := upgrader.Upgrade(w, r, nil)
|
||||
c, err := s.upgrader.Upgrade(w, r, nil)
|
||||
if err != nil {
|
||||
log.Print("upgrade:", err)
|
||||
return
|
||||
@ -43,7 +60,11 @@ func (s *Server) handleBroadcast(w http.ResponseWriter, r *http.Request) {
|
||||
messageType, message, err := c.ReadMessage()
|
||||
if err != nil && !websocket.IsCloseError(err, 1001) {
|
||||
logger.Error(ctx, "could not read message", logger.E(errors.WithStack(err)))
|
||||
break
|
||||
return
|
||||
}
|
||||
|
||||
if messageType == -1 {
|
||||
return
|
||||
}
|
||||
|
||||
logger.Debug(ctx, "broadcasting message", logger.F("message", message), logger.F("messageType", messageType))
|
||||
|
@ -36,17 +36,12 @@ func init() {
|
||||
func (s *Server) startWebServers(ctx context.Context) error {
|
||||
router := chi.NewRouter()
|
||||
|
||||
if s.appsEnabled {
|
||||
ips, err := network.GetLANIPv4Addrs()
|
||||
if err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
allowedOrigins := make([]string, len(ips))
|
||||
for idx, ip := range ips {
|
||||
allowedOrigins[idx] = fmt.Sprintf("http://%s:%d", ip, s.port)
|
||||
}
|
||||
allowedOrigins, err := s.getAllowedOrigins()
|
||||
if err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
if len(allowedOrigins) > 0 {
|
||||
router.Use(cors.Handler(cors.Options{
|
||||
AllowedOrigins: allowedOrigins,
|
||||
AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
|
||||
@ -178,6 +173,27 @@ func (s *Server) startHTTPSServer(ctx context.Context, router chi.Router) error
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) getAllowedOrigins() ([]string, error) {
|
||||
allowedOrigins := make([]string, 0)
|
||||
|
||||
if s.appsEnabled {
|
||||
ips, err := network.GetLANIPv4Addrs()
|
||||
if err != nil {
|
||||
return nil, errors.WithStack(err)
|
||||
}
|
||||
|
||||
for _, ip := range ips {
|
||||
allowedOrigins = append(allowedOrigins, fmt.Sprintf("http://%s:%d", ip, s.port))
|
||||
}
|
||||
}
|
||||
|
||||
if len(s.allowedOrigins) > 0 {
|
||||
allowedOrigins = append(allowedOrigins, s.allowedOrigins...)
|
||||
}
|
||||
|
||||
return allowedOrigins, nil
|
||||
}
|
||||
|
||||
func (s *Server) handleHome(w http.ResponseWriter, r *http.Request) {
|
||||
type templateData struct {
|
||||
IPs []string
|
||||
|
@ -26,6 +26,7 @@ type Options struct {
|
||||
EnableServiceDiscovery bool
|
||||
EnableApps bool
|
||||
DefaultApp string
|
||||
AllowedOrigins []string
|
||||
Apps []App
|
||||
}
|
||||
|
||||
@ -39,6 +40,7 @@ func NewOptions(funcs ...OptionFunc) *Options {
|
||||
EnableServiceDiscovery: true,
|
||||
EnableApps: false,
|
||||
DefaultApp: "",
|
||||
AllowedOrigins: make([]string, 0),
|
||||
Apps: make([]App, 0),
|
||||
}
|
||||
|
||||
@ -67,6 +69,12 @@ func WithApps(apps ...App) OptionFunc {
|
||||
}
|
||||
}
|
||||
|
||||
func WithAllowedOrigins(origins ...string) OptionFunc {
|
||||
return func(opts *Options) {
|
||||
opts.AllowedOrigins = origins
|
||||
}
|
||||
}
|
||||
|
||||
func WithAddress(addr string) OptionFunc {
|
||||
return func(opts *Options) {
|
||||
opts.Address = addr
|
||||
|
@ -5,6 +5,7 @@ import (
|
||||
"crypto/tls"
|
||||
|
||||
"forge.cadoles.com/arcad/arcast/pkg/browser"
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/pkg/errors"
|
||||
"gitlab.com/wpetit/goweb/logger"
|
||||
)
|
||||
@ -23,12 +24,14 @@ type Server struct {
|
||||
|
||||
serviceDiscoveryEnabled bool
|
||||
|
||||
appsEnabled bool
|
||||
defaultApp string
|
||||
apps []App
|
||||
appsEnabled bool
|
||||
defaultApp string
|
||||
allowedOrigins []string
|
||||
apps []App
|
||||
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
upgrader websocket.Upgrader
|
||||
}
|
||||
|
||||
func (s *Server) Start() error {
|
||||
@ -78,15 +81,22 @@ func (s *Server) Wait() error {
|
||||
func New(browser browser.Browser, funcs ...OptionFunc) *Server {
|
||||
opts := NewOptions(funcs...)
|
||||
|
||||
return &Server{
|
||||
server := &Server{
|
||||
browser: browser,
|
||||
instanceID: opts.InstanceID,
|
||||
address: opts.Address,
|
||||
tlsAddress: opts.TLSAddress,
|
||||
tlsCert: opts.TLSCertificate,
|
||||
appsEnabled: opts.EnableApps,
|
||||
allowedOrigins: opts.AllowedOrigins,
|
||||
defaultApp: opts.DefaultApp,
|
||||
apps: opts.Apps,
|
||||
serviceDiscoveryEnabled: opts.EnableServiceDiscovery,
|
||||
}
|
||||
|
||||
server.upgrader = websocket.Upgrader{
|
||||
CheckOrigin: server.checkOrigin,
|
||||
}
|
||||
|
||||
return server
|
||||
}
|
||||
|
@ -13,9 +13,9 @@
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
||||
Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
|
||||
"Segoe UI Symbol";
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
|
||||
"Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans",
|
||||
"Helvetica Neue", sans-serif;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgb(76, 96, 188);
|
||||
|
Reference in New Issue
Block a user