Skip to content

Commit 2972024

Browse files
committed
add plugin.do_{file,string}_with_payload
1 parent cc42bcd commit 2972024

File tree

5 files changed

+84
-17
lines changed

5 files changed

+84
-17
lines changed

plugin/README.md

+13-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ local plugin_body = [[
1717
]]
1818

1919
-- plugin.do_string(body)
20+
-- also you can use: plugin.do_file(filename)
2021
local print_plugin = plugin.do_string(plugin_body)
2122
print_plugin:run()
2223
time.sleep(2)
@@ -25,7 +26,17 @@ time.sleep(1)
2526

2627
local running = print_plugin:is_running()
2728
if running then error("already running") end
28-
29-
-- also you can use: plugin.do_file(filename)
3029
-- also you can get last error: print_plugin:error()
30+
31+
-- plugin.do_string_with_payload()
32+
-- also you can use: plugin.do_file_with_payload(filename)
33+
local job_body = [[
34+
print(payload)
35+
]]
36+
local print_plugin_with_payload = plugin.do_string_with_payload(plugin_body, "text of payload")
37+
print_plugin_with_payload:run()
38+
-- must print: "text of payload"
39+
time.sleep(1)
40+
local running = print_plugin:is_running()
41+
if running then error("already running") end
3142
```

plugin/api.go

+40-10
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@ type luaPlugin struct {
3838
cancelFunc context.CancelFunc
3939
running bool
4040
error error
41-
body string
42-
filename string
41+
body *string
42+
filename *string
43+
jobPayload *string
4344
}
4445

4546
func (p *luaPlugin) getError() error {
@@ -68,7 +69,7 @@ func (p *luaPlugin) setRunning(val bool) {
6869
p.running = val
6970
}
7071

71-
// NewPluginState return lua state for plugin
72+
// NewPluginState return lua state
7273
func NewPluginState() *lua.LState {
7374
state := lua.NewState()
7475
// preload all
@@ -100,22 +101,27 @@ func NewPluginState() *lua.LState {
100101

101102
func (p *luaPlugin) start() {
102103
p.Lock()
103-
104104
state := NewPluginState()
105105
p.state = state
106106
p.error = nil
107107
p.running = true
108+
isBody := (p.filename == nil)
109+
if !(p.jobPayload == nil) {
110+
payload := *p.jobPayload
111+
state.SetGlobal(`payload`, lua.LString(payload))
112+
}
108113
ctx, cancelFunc := context.WithCancel(context.Background())
109-
p.state.SetContext(ctx)
110114
p.cancelFunc = cancelFunc
111-
isBody := (p.filename == "")
115+
p.state.SetContext(ctx)
112116
p.Unlock()
113117

114118
// blocking
115119
if isBody {
116-
p.setError(p.state.DoString(p.body))
120+
body := *p.body
121+
p.setError(p.state.DoString(body))
117122
} else {
118-
p.setError(p.state.DoFile(p.filename))
123+
filename := *p.filename
124+
p.setError(p.state.DoFile(filename))
119125
}
120126
p.setRunning(false)
121127
}
@@ -132,7 +138,7 @@ func checkPlugin(L *lua.LState, n int) *luaPlugin {
132138
// DoString lua plugin.do_string(body) returns plugin_ud
133139
func DoString(L *lua.LState) int {
134140
body := L.CheckString(1)
135-
p := &luaPlugin{body: body}
141+
p := &luaPlugin{body: &body}
136142
ud := L.NewUserData()
137143
ud.Value = p
138144
L.SetMetatable(ud, L.GetTypeMetatable(`plugin_ud`))
@@ -143,7 +149,31 @@ func DoString(L *lua.LState) int {
143149
// DoFile lua plugin.do_file(filename) returns plugin_ud
144150
func DoFile(L *lua.LState) int {
145151
filename := L.CheckString(1)
146-
p := &luaPlugin{filename: filename}
152+
p := &luaPlugin{filename: &filename}
153+
ud := L.NewUserData()
154+
ud.Value = p
155+
L.SetMetatable(ud, L.GetTypeMetatable(`plugin_ud`))
156+
L.Push(ud)
157+
return 1
158+
}
159+
160+
// DoFileWithPayload lua plugin.async() returns (plugin_ud, err)
161+
func DoFileWithPayload(L *lua.LState) int {
162+
filename := L.CheckString(1)
163+
payload := L.CheckString(2)
164+
p := &luaPlugin{filename: &filename, jobPayload: &payload}
165+
ud := L.NewUserData()
166+
ud.Value = p
167+
L.SetMetatable(ud, L.GetTypeMetatable(`plugin_ud`))
168+
L.Push(ud)
169+
return 1
170+
}
171+
172+
// DoStringWithPayload lua plugin.async() returns (plugin_ud, err)
173+
func DoStringWithPayload(L *lua.LState) int {
174+
body := L.CheckString(1)
175+
payload := L.CheckString(2)
176+
p := &luaPlugin{body: &body, jobPayload: &payload}
147177
ud := L.NewUserData()
148178
ud.Value = p
149179
L.SetMetatable(ud, L.GetTypeMetatable(`plugin_ud`))

plugin/loader.go

+7-5
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ func Preload(L *lua.LState) {
1515
// Loader is the module loader function.
1616
func Loader(L *lua.LState) int {
1717

18-
plugin_ud := L.NewTypeMetatable(`plugin_ud`)
19-
L.SetGlobal(`plugin_ud`, plugin_ud)
20-
L.SetField(plugin_ud, "__index", L.SetFuncs(L.NewTable(), map[string]lua.LGFunction{
18+
pluginUd := L.NewTypeMetatable(`plugin_ud`)
19+
L.SetGlobal(`plugin_ud`, pluginUd)
20+
L.SetField(pluginUd, "__index", L.SetFuncs(L.NewTable(), map[string]lua.LGFunction{
2121
"run": Run,
2222
"error": Error,
2323
"stop": Stop,
@@ -31,6 +31,8 @@ func Loader(L *lua.LState) int {
3131
}
3232

3333
var api = map[string]lua.LGFunction{
34-
"do_string": DoString,
35-
"do_file": DoFile,
34+
"do_string": DoString,
35+
"do_file": DoFile,
36+
"do_string_with_payload": DoStringWithPayload,
37+
"do_file_with_payload": DoFileWithPayload,
3638
}

plugin/test/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
/file.txt
2+
/payload.txt

plugin/test/test_api.lua

+23
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,26 @@ if err then error(err) end
4141
print(data)
4242
local i = tonumber(data)
4343
if i < 1 then error("i < 1") end
44+
45+
46+
-- test with payload
47+
local plugin_body_2 = [[
48+
local ioutil = require("ioutil")
49+
local err = ioutil.write_file("./test/payload.txt", payload)
50+
if err then error(err) end
51+
]]
52+
local test_payload = "OK"
53+
local plugin_with_payload = plugin.do_string_with_payload(plugin_body_2, test_payload)
54+
plugin_with_payload:run()
55+
56+
time.sleep(1)
57+
local i = 0
58+
while plugin_with_payload:is_running() do
59+
time.sleep(1)
60+
i = i + 1
61+
if i > 3 then error("timeout") end
62+
end
63+
64+
local data, err = ioutil.read_file("./test/payload.txt")
65+
if err then error(err) end
66+
if not(data == test_payload) then error("data <> test_payload") end

0 commit comments

Comments
 (0)