ref: b881ccc61dad23f9a33fd05c8aa00213d591adce
dir: /browser/fs/fs.go/
package fs
import (
"fmt"
"github.com/knusbaum/go9p/fs"
"github.com/knusbaum/go9p/proto"
"github.com/psilva261/opossum/logger"
"os/user"
"sync"
)
var (
log *logger.Logger
mu sync.RWMutex
oFS *fs.FS
un string
gn string
cssDir *fs.StaticDir
jsDir *fs.StaticDir
html string
)
func SetLogger(l *logger.Logger) {
log = l
}
func init() {
var root *fs.StaticDir
u, err := user.Current()
if err != nil {
log.Errorf("get user: %w", err)
return
}
un = u.Username
gn, err = group(u)
if err != nil {
log.Errorf("get group: %w", err)
return
}
oFS, root = fs.NewFS(un, gn, 0500)
h := fs.NewDynamicFile(
oFS.NewStat("html", un, gn, 0400),
func() []byte {
mu.RLock()
defer mu.RUnlock()
return []byte(html)
},
)
root.AddChild(h)
d, err := fs.CreateStaticDir(oFS, root, un, "css", 0500|proto.DMDIR, 0)
if err != nil {
log.Errorf("create static dir: %w", err)
return
}
cssDir = d.(*fs.StaticDir)
root.AddChild(cssDir)
d, err = fs.CreateStaticDir(oFS, root, un, "js", 0500|proto.DMDIR, 0)
if err != nil {
log.Errorf("create static dir: %w", err)
return
}
jsDir = d.(*fs.StaticDir)
root.AddChild(jsDir)
}
func Update(htm string, css []string, js []string) {
mu.Lock()
defer mu.Unlock()
html = htm
for name := range cssDir.Children() {
cssDir.DeleteChild(name)
}
for i, s := range css {
fn := fmt.Sprintf("%d.css", i)
f := fs.NewStaticFile(
oFS.NewStat(fn, un, gn, 0400),
[]byte(s),
)
cssDir.AddChild(f)
}
for name := range jsDir.Children() {
jsDir.DeleteChild(name)
}
for i, s := range js {
fn := fmt.Sprintf("%d.js", i)
f := fs.NewStaticFile(
oFS.NewStat(fn, un, gn, 0400),
[]byte(s),
)
jsDir.AddChild(f)
}
}
func Srv9p() {
if err := post(oFS.Server()); err != nil {
log.Errorf("srv9p: %v", err)
}
}