import (
_ "embed"
- "github.com/dragonfireclient/hydra-dragonfire/convert"
"github.com/yuin/gopher-lua"
"os"
"os/signal"
+ "runtime/pprof"
"syscall"
"time"
)
var lastTime = time.Now()
-var canceled = false
+var signalChannel chan os.Signal
+
+var serializeVer uint8 = 29
+var protoVer uint16 = 40
//go:embed builtin/luax/init.lua
var builtinLuaX string
//go:embed builtin/client.lua
var builtinClient string
+//go:embed builtin/base64.lua
+var builtinBase64 string
+
var builtinFiles = []string{
builtinLuaX,
builtinVector,
builtinEscapes,
builtinClient,
+ builtinBase64,
}
var hydraFuncs = map[string]lua.LGFunction{
- "client": l_client,
- "dtime": l_dtime,
- "canceled": l_canceled,
- "poll": l_poll,
- "disconnect": l_disconnect,
-}
-
-func signalChannel() chan os.Signal {
- sig := make(chan os.Signal, 1)
- signal.Notify(sig, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
- return sig
+ "client": l_client,
+ "map": l_map,
+ "dtime": l_dtime,
+ "poll": l_poll,
+ "close": l_close,
}
func l_dtime(l *lua.LState) int {
l.Push(lua.LNumber(time.Since(lastTime).Seconds()))
- return 1
-}
-
-func l_canceled(l *lua.LState) int {
- l.Push(lua.LBool(canceled))
+ lastTime = time.Now()
return 1
}
func l_poll(l *lua.LState) int {
- client, pkt, timeout := doPoll(l, getClients(l))
- if client == nil {
- l.Push(lua.LNil)
- } else {
- l.Push(client.userdata)
- }
- l.Push(convert.PushPkt(l, pkt))
- l.Push(lua.LBool(timeout))
- return 3
+ return doPoll(l, getClients(l))
}
-func l_disconnect(l *lua.LState) int {
+func l_close(l *lua.LState) int {
for _, client := range getClients(l) {
- client.disconnect()
+ client.closeConn()
}
return 0
panic("missing filename")
}
+ signalChannel = make(chan os.Signal, 1)
+ signal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
+
go func() {
- <-signalChannel()
- canceled = true
+ ch := make(chan os.Signal, 1)
+ signal.Notify(ch, syscall.SIGUSR1)
+ for {
+ <-ch
+ pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
+ }
}()
- l := lua.NewState(lua.Options{IncludeGoStackTrace: true})
+ l := lua.NewState()
defer l.Close()
arg := l.NewTable()
hydra := l.SetFuncs(l.NewTable(), hydraFuncs)
l.SetField(hydra, "BS", lua.LNumber(10.0))
+ l.SetField(hydra, "serialize_ver", lua.LNumber(serializeVer))
+ l.SetField(hydra, "proto_ver", lua.LNumber(protoVer))
l.SetGlobal("hydra", hydra)
- l.SetField(l.NewTypeMetatable("hydra.auth"), "__index", l.SetFuncs(l.NewTable(), authFuncs))
l.SetField(l.NewTypeMetatable("hydra.client"), "__index", l.NewFunction(l_client_index))
+ l.SetField(l.NewTypeMetatable("hydra.map"), "__index", l.SetFuncs(l.NewTable(), mapFuncs))
+
+ l.SetField(l.NewTypeMetatable("hydra.comp.auth"), "__index", l.SetFuncs(l.NewTable(), compAuthFuncs))
+ l.SetField(l.NewTypeMetatable("hydra.comp.map"), "__index", l.SetFuncs(l.NewTable(), compMapFuncs))
+ l.SetField(l.NewTypeMetatable("hydra.comp.pkts"), "__index", l.SetFuncs(l.NewTable(), compPktsFuncs))
for _, str := range builtinFiles {
if err := l.DoString(str); err != nil {