Moonshark/runner/embed.go
2025-06-03 12:00:09 -05:00

107 lines
2.3 KiB
Go

package runner
import (
"Moonshark/utils/logger"
_ "embed"
luajit "git.sharkk.net/Sky/LuaJIT-to-Go"
)
//go:embed lua/sandbox.lua
var sandboxLuaCode string
//go:embed lua/json.lua
var jsonLuaCode string
//go:embed lua/sqlite.lua
var sqliteLuaCode string
//go:embed lua/fs.lua
var fsLuaCode string
//go:embed lua/util.lua
var utilLuaCode string
//go:embed lua/string.lua
var stringLuaCode string
//go:embed lua/table.lua
var tableLuaCode string
//go:embed lua/crypto.lua
var cryptoLuaCode string
//go:embed lua/time.lua
var timeLuaCode string
//go:embed lua/math.lua
var mathLuaCode string
//go:embed lua/env.lua
var envLuaCode string
// Module represents a Lua module to load
type Module struct {
name string
code string
global bool // true if module defines globals, false if it returns a table
}
var modules = []Module{
{"json", jsonLuaCode, true},
{"sqlite", sqliteLuaCode, false},
{"fs", fsLuaCode, true},
{"util", utilLuaCode, true},
{"string", stringLuaCode, false},
{"table", tableLuaCode, false},
{"crypto", cryptoLuaCode, true},
{"time", timeLuaCode, false},
{"math", mathLuaCode, false},
{"env", envLuaCode, true},
}
// loadModule loads a single module into the Lua state
func loadModule(state *luajit.State, m Module) error {
if m.global {
// Module defines globals directly, just execute it
return state.DoString(m.code)
}
// Module returns a table, capture it and set as global
if err := state.LoadString(m.code); err != nil {
return err
}
if err := state.Call(0, 1); err != nil {
return err
}
state.SetGlobal(m.name)
return nil
}
// loadSandboxIntoState loads all modules and sandbox into a Lua state
func loadSandboxIntoState(state *luajit.State, verbose bool) error {
// Load all utility modules
for _, module := range modules {
if err := loadModule(state, module); err != nil {
if verbose {
logger.Errorf("Failed to load %s module: %v", module.name, err)
}
return err
}
if verbose {
logger.Debugf("Loaded %s.lua", module.name)
}
}
// Initialize module-specific globals
if err := state.DoString(`__active_sqlite_connections = {}`); err != nil {
return err
}
// Load sandbox last - defines __execute and core functions
if verbose {
logger.Debugf("Loading sandbox.lua")
}
return state.DoString(sandboxLuaCode)
}