5 "github.com/yuin/gopher-lua"
13 var lastTime = time.Now()
14 var signalChannel chan os.Signal
16 var serializeVer uint8 = 29
17 var protoVer uint16 = 40
19 //go:embed builtin/luax/init.lua
20 var builtinLuaX string
22 //go:embed builtin/vector.lua
23 var builtinVector string
25 //go:embed builtin/escapes.lua
26 var builtinEscapes string
28 //go:embed builtin/client.lua
29 var builtinClient string
31 //go:embed builtin/base64.lua
32 var builtinBase64 string
34 var builtinFiles = []string{
42 var hydraFuncs = map[string]lua.LGFunction{
50 func l_dtime(l *lua.LState) int {
51 l.Push(lua.LNumber(time.Since(lastTime).Seconds()))
56 func l_poll(l *lua.LState) int {
57 return doPoll(l, getClients(l))
60 func l_close(l *lua.LState) int {
61 for _, client := range getClients(l) {
70 panic("missing filename")
73 signalChannel = make(chan os.Signal, 1)
74 signal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
77 ch := make(chan os.Signal, 1)
78 signal.Notify(ch, syscall.SIGUSR1)
81 pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
89 for i, a := range os.Args {
90 l.RawSetInt(arg, i-1, lua.LString(a))
92 l.SetGlobal("arg", arg)
94 hydra := l.SetFuncs(l.NewTable(), hydraFuncs)
95 l.SetField(hydra, "BS", lua.LNumber(10.0))
96 l.SetField(hydra, "serialize_ver", lua.LNumber(serializeVer))
97 l.SetField(hydra, "proto_ver", lua.LNumber(protoVer))
98 l.SetGlobal("hydra", hydra)
100 l.SetField(l.NewTypeMetatable("hydra.client"), "__index", l.NewFunction(l_client_index))
101 l.SetField(l.NewTypeMetatable("hydra.map"), "__index", l.SetFuncs(l.NewTable(), mapFuncs))
103 l.SetField(l.NewTypeMetatable("hydra.comp.auth"), "__index", l.SetFuncs(l.NewTable(), compAuthFuncs))
104 l.SetField(l.NewTypeMetatable("hydra.comp.map"), "__index", l.SetFuncs(l.NewTable(), compMapFuncs))
105 l.SetField(l.NewTypeMetatable("hydra.comp.pkts"), "__index", l.SetFuncs(l.NewTable(), compPktsFuncs))
107 for _, str := range builtinFiles {
108 if err := l.DoString(str); err != nil {
113 if err := l.DoFile(os.Args[1]); err != nil {