re-add watcher setup, drop unnecessary files
This commit is contained in:
parent
2c731b9cbf
commit
d86167a86e
@ -1,35 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
/*
|
|
||||||
func (s *Moonshark) setupWatchers() {
|
|
||||||
manager := watchers.GetWatcherManager()
|
|
||||||
|
|
||||||
// Watch routes
|
|
||||||
if routeWatcher, err := watchers.WatchLuaRouter(s.LuaRouter, s.LuaRunner, s.Config.Dirs.Routes); err != nil {
|
|
||||||
logger.Warnf("Routes directory watch failed: %v", err)
|
|
||||||
} else {
|
|
||||||
routesDir := routeWatcher.GetDir()
|
|
||||||
s.cleanupFuncs = append(s.cleanupFuncs, func() error {
|
|
||||||
return manager.UnwatchDirectory(routesDir)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Watch modules
|
|
||||||
if moduleWatchers, err := watchers.WatchLuaModules(s.LuaRunner, s.Config.Dirs.Libs); err != nil {
|
|
||||||
logger.Warnf("Module directories watch failed: %v", err)
|
|
||||||
} else {
|
|
||||||
for _, watcher := range moduleWatchers {
|
|
||||||
dirPath := watcher.GetDir()
|
|
||||||
s.cleanupFuncs = append(s.cleanupFuncs, func() error {
|
|
||||||
return manager.UnwatchDirectory(dirPath)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
plural := "directory"
|
|
||||||
if len(moduleWatchers) != 1 {
|
|
||||||
plural = "directories"
|
|
||||||
}
|
|
||||||
logger.Infof("Watching %s module %s.", color.Yellow(strconv.Itoa(len(moduleWatchers))), plural)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
55
moonshark.go
55
moonshark.go
@ -9,6 +9,7 @@ import (
|
|||||||
"Moonshark/runner"
|
"Moonshark/runner"
|
||||||
"Moonshark/sessions"
|
"Moonshark/sessions"
|
||||||
"Moonshark/utils"
|
"Moonshark/utils"
|
||||||
|
"Moonshark/watchers"
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"flag"
|
"flag"
|
||||||
@ -17,6 +18,7 @@ import (
|
|||||||
"os/signal"
|
"os/signal"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -33,6 +35,7 @@ var (
|
|||||||
svr *fasthttp.Server // FastHTTP server
|
svr *fasthttp.Server // FastHTTP server
|
||||||
pub fasthttp.RequestHandler // Public asset handler
|
pub fasthttp.RequestHandler // Public asset handler
|
||||||
snm *sessions.SessionManager // Session data manager
|
snm *sessions.SessionManager // Session data manager
|
||||||
|
wmg *watchers.WatcherManager // Watcher manager
|
||||||
dbg bool // Debug mode flag
|
dbg bool // Debug mode flag
|
||||||
pubPfx []byte // Cached public asset prefix
|
pubPfx []byte // Cached public asset prefix
|
||||||
)
|
)
|
||||||
@ -83,6 +86,11 @@ func main() {
|
|||||||
logger.Fatalf("Router failed to init: %s", color.Red(err.Error()))
|
logger.Fatalf("Router failed to init: %s", color.Red(err.Error()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up the file watcher manager
|
||||||
|
if err := setupWatchers(); err != nil {
|
||||||
|
logger.Fatalf("Watcher manager failed to init: %s", color.Red(err.Error()))
|
||||||
|
}
|
||||||
|
|
||||||
// Set up the HTTP portion of the server
|
// Set up the HTTP portion of the server
|
||||||
logger.Http(cfg.Server.HTTPLogging) // Whether we'll log HTTP request results
|
logger.Http(cfg.Server.HTTPLogging) // Whether we'll log HTTP request results
|
||||||
svr = http.NewHttpServer(cfg, requestMux, dbg)
|
svr = http.NewHttpServer(cfg, requestMux, dbg)
|
||||||
@ -232,6 +240,46 @@ func initRouter() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up the file watchers.
|
||||||
|
func setupWatchers() error {
|
||||||
|
wmg = watchers.NewWatcherManager(watchers.DefaultPollInterval)
|
||||||
|
|
||||||
|
// Router watcher
|
||||||
|
err := wmg.WatchDirectory(watchers.DirectoryWatcherConfig{
|
||||||
|
Dir: cfg.Dirs.Routes,
|
||||||
|
Callback: rtr.Refresh,
|
||||||
|
Recursive: true,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to watch routes directory: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Infof("Started watching Lua routes! %s", color.Yellow(cfg.Dirs.Routes))
|
||||||
|
|
||||||
|
// Libs watchers
|
||||||
|
for _, dir := range cfg.Dirs.Libs {
|
||||||
|
err := wmg.WatchDirectory(watchers.DirectoryWatcherConfig{
|
||||||
|
Dir: dir,
|
||||||
|
EnhancedCallback: func(changes []watchers.FileChange) error {
|
||||||
|
for _, change := range changes {
|
||||||
|
if !change.IsDeleted && strings.HasSuffix(change.Path, ".lua") {
|
||||||
|
rnr.NotifyFileChanged(change.Path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
Recursive: true,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to watch modules directory: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Infof("Started watching Lua modules! %s", color.Yellow(dir))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Attempts to execute the Lua script at the given path inside a fully initialized sandbox environment. Handy
|
// Attempts to execute the Lua script at the given path inside a fully initialized sandbox environment. Handy
|
||||||
// for pre-launch tasks and the like.
|
// for pre-launch tasks and the like.
|
||||||
func handleScriptMode(path string) error {
|
func handleScriptMode(path string) error {
|
||||||
@ -263,6 +311,7 @@ func handleScriptMode(path string) error {
|
|||||||
func shutdown() {
|
func shutdown() {
|
||||||
logger.Infof("Shutting down...")
|
logger.Infof("Shutting down...")
|
||||||
|
|
||||||
|
// Close down the HTTP server
|
||||||
if svr != nil {
|
if svr != nil {
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
@ -272,10 +321,16 @@ func shutdown() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close down the Lua runner if it exists
|
||||||
if rnr != nil {
|
if rnr != nil {
|
||||||
rnr.Close()
|
rnr.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close down the watcher manager if it exists
|
||||||
|
if wmg != nil {
|
||||||
|
wmg.Close()
|
||||||
|
}
|
||||||
|
|
||||||
logger.Infof("Shutdown complete")
|
logger.Infof("Shutdown complete")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,6 +7,8 @@ import (
|
|||||||
"Moonshark/utils"
|
"Moonshark/utils"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"maps"
|
||||||
|
|
||||||
"github.com/valyala/fasthttp"
|
"github.com/valyala/fasthttp"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -69,9 +71,7 @@ func NewHTTPContext(httpCtx *fasthttp.RequestCtx, params *router.Params, session
|
|||||||
// Extract form data if present
|
// Extract form data if present
|
||||||
if httpCtx.IsPost() || httpCtx.IsPut() || httpCtx.IsPatch() {
|
if httpCtx.IsPost() || httpCtx.IsPut() || httpCtx.IsPatch() {
|
||||||
if form, err := utils.ParseForm(httpCtx); err == nil {
|
if form, err := utils.ParseForm(httpCtx); err == nil {
|
||||||
for k, v := range form {
|
maps.Copy(ctx.form, form)
|
||||||
ctx.form[k] = v
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,9 +88,7 @@ func NewHTTPContext(httpCtx *fasthttp.RequestCtx, params *router.Params, session
|
|||||||
|
|
||||||
// Add environment vars
|
// Add environment vars
|
||||||
if envMgr := lualibs.GetGlobalEnvManager(); envMgr != nil {
|
if envMgr := lualibs.GetGlobalEnvManager(); envMgr != nil {
|
||||||
for k, v := range envMgr.GetAll() {
|
maps.Copy(ctx.env, envMgr.GetAll())
|
||||||
ctx.env[k] = v
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Populate Values with all context data
|
// Populate Values with all context data
|
||||||
|
@ -1,85 +0,0 @@
|
|||||||
package watchers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"Moonshark/logger"
|
|
||||||
"Moonshark/router"
|
|
||||||
"Moonshark/runner"
|
|
||||||
|
|
||||||
"git.sharkk.net/Go/Color"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Global watcher manager instance with explicit creation
|
|
||||||
var (
|
|
||||||
globalManager *WatcherManager
|
|
||||||
globalManagerOnce sync.Once
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetWatcherManager returns the global watcher manager, creating it if needed
|
|
||||||
func GetWatcherManager() *WatcherManager {
|
|
||||||
globalManagerOnce.Do(func() {
|
|
||||||
globalManager = NewWatcherManager(DefaultPollInterval)
|
|
||||||
})
|
|
||||||
return globalManager
|
|
||||||
}
|
|
||||||
|
|
||||||
// ShutdownWatcherManager closes the global watcher manager if it exists
|
|
||||||
func ShutdownWatcherManager() {
|
|
||||||
if globalManager != nil {
|
|
||||||
globalManager.Close()
|
|
||||||
globalManager = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WatchLuaRouter sets up a watcher for a LuaRouter's routes directory
|
|
||||||
func WatchLuaRouter(router *router.Router, runner *runner.Runner, routesDir string) (*DirectoryWatcher, error) {
|
|
||||||
manager := GetWatcherManager()
|
|
||||||
|
|
||||||
config := DirectoryWatcherConfig{
|
|
||||||
Dir: routesDir,
|
|
||||||
Callback: router.Refresh,
|
|
||||||
Recursive: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
watcher, err := manager.WatchDirectory(config)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to watch directory: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.Infof("Started watching Lua routes! %s", color.Yellow(routesDir))
|
|
||||||
return watcher, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// WatchLuaModules sets up watchers for Lua module directories
|
|
||||||
func WatchLuaModules(luaRunner *runner.Runner, libDirs []string) ([]*DirectoryWatcher, error) {
|
|
||||||
manager := GetWatcherManager()
|
|
||||||
watchers := make([]*DirectoryWatcher, 0, len(libDirs))
|
|
||||||
|
|
||||||
for _, dir := range libDirs {
|
|
||||||
config := DirectoryWatcherConfig{
|
|
||||||
Dir: dir,
|
|
||||||
EnhancedCallback: func(changes []FileChange) error {
|
|
||||||
for _, change := range changes {
|
|
||||||
if !change.IsDeleted && strings.HasSuffix(change.Path, ".lua") {
|
|
||||||
luaRunner.NotifyFileChanged(change.Path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
Recursive: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
watcher, err := manager.WatchDirectory(config)
|
|
||||||
if err != nil {
|
|
||||||
// Error handling...
|
|
||||||
}
|
|
||||||
|
|
||||||
watchers = append(watchers, watcher)
|
|
||||||
logger.Infof("Started watching Lua modules! %s", color.Yellow(dir))
|
|
||||||
}
|
|
||||||
|
|
||||||
return watchers, nil
|
|
||||||
}
|
|
@ -11,7 +11,6 @@ import (
|
|||||||
// DefaultPollInterval is the time between directory checks
|
// DefaultPollInterval is the time between directory checks
|
||||||
const DefaultPollInterval = 1 * time.Second
|
const DefaultPollInterval = 1 * time.Second
|
||||||
|
|
||||||
// Common errors
|
|
||||||
var (
|
var (
|
||||||
ErrDirectoryNotFound = errors.New("directory not found")
|
ErrDirectoryNotFound = errors.New("directory not found")
|
||||||
ErrAlreadyWatching = errors.New("already watching directory")
|
ErrAlreadyWatching = errors.New("already watching directory")
|
||||||
@ -59,12 +58,12 @@ func (m *WatcherManager) Close() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WatchDirectory adds a new directory to watch and returns the watcher
|
// WatchDirectory adds a new directory to watch and returns the watcher
|
||||||
func (m *WatcherManager) WatchDirectory(config DirectoryWatcherConfig) (*DirectoryWatcher, error) {
|
func (m *WatcherManager) WatchDirectory(config DirectoryWatcherConfig) error {
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
defer m.mu.Unlock()
|
defer m.mu.Unlock()
|
||||||
|
|
||||||
if _, exists := m.watchers[config.Dir]; exists {
|
if _, exists := m.watchers[config.Dir]; exists {
|
||||||
return nil, ErrAlreadyWatching
|
return ErrAlreadyWatching
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.DebounceTime == 0 {
|
if config.DebounceTime == 0 {
|
||||||
@ -82,13 +81,13 @@ func (m *WatcherManager) WatchDirectory(config DirectoryWatcherConfig) (*Directo
|
|||||||
|
|
||||||
// Perform initial scan
|
// Perform initial scan
|
||||||
if err := watcher.scanDirectory(); err != nil {
|
if err := watcher.scanDirectory(); err != nil {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
m.watchers[config.Dir] = watcher
|
m.watchers[config.Dir] = watcher
|
||||||
logger.Debugf("WatcherManager added watcher for %s", config.Dir)
|
logger.Debugf("WatcherManager added watcher for %s", config.Dir)
|
||||||
|
|
||||||
return watcher, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnwatchDirectory removes a directory from being watched
|
// UnwatchDirectory removes a directory from being watched
|
||||||
|
Loading…
x
Reference in New Issue
Block a user