mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-23 10:28:06 +00:00
fix(lua): 同步注入在 Lua 中明确报不可用(避免自锁)+ 文档/mock 同步
sdk.inject_input_sync / *_opts / inject_input_media_sync* 在 Lua 里必然自锁: Lua 代码只在 Start/工具/阶段/输出/事件回调中执行,这些路径都持有 plg.mu, 而同步注入要等本轮回复(回复路径上的回调又需要同一把锁)。原实现会挂死 直到超时;现改为立即返回明确错误,并在中英文 PLUGIN_DEV 里标注不可用 + 指向 Go 插件/异步注入。mock sdk.lua(SDK 仓为事实源)同步为同样的错误语义。 新增 TestLuaSyncInjectUnavailable 钉住不挂死。
This commit is contained in:
@ -661,3 +661,46 @@ return plugin
|
||||
}
|
||||
bus.Publish(&events.Event{Type: events.EventAgentOutput, Source: "after-stop"})
|
||||
}
|
||||
|
||||
// TestLuaSyncInjectUnavailable 钉住「Lua 同步注入必须立即返回明确错误、不能挂死」。
|
||||
// 背景:同步注入要等本轮回复,而 Lua 回调持有插件锁 ⇒ 原实现必然自锁。
|
||||
func TestLuaSyncInjectUnavailable(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
os.WriteFile(filepath.Join(dir, "plugin.json"), []byte(`{"name":"synclua","entry":"main.lua"}`), 0644)
|
||||
os.WriteFile(filepath.Join(dir, "main.lua"), []byte(`
|
||||
local plugin = { name = "synclua" }
|
||||
function plugin.start(sdk)
|
||||
local r, err = sdk.inject_input_sync("src", "ch", "hello")
|
||||
_G.sync_reply = r
|
||||
_G.sync_err = err
|
||||
local _, err2 = sdk.inject_input_sync_opts("src", "ch", "hello", { no_memory = true })
|
||||
_G.sync_err2 = err2
|
||||
local _, err3 = sdk.inject_input_media_sync("src", "ch", "hi", {})
|
||||
_G.sync_media_err = err3
|
||||
end
|
||||
function plugin.stop() end
|
||||
return plugin
|
||||
`), 0644)
|
||||
|
||||
plg, err := tryLoadLua(dir, "synclua", nil)
|
||||
if err != nil {
|
||||
t.Fatalf("tryLoadLua failed: %v", err)
|
||||
}
|
||||
reg := internalConfig.NewConfigRegistry("")
|
||||
sett := sdk.NewSettings("synclua", reg)
|
||||
s := sdk.New("synclua", sdk.SDKConfig{Settings: sett})
|
||||
if err := plg.Start(s); err != nil {
|
||||
t.Fatalf("Start failed: %v", err)
|
||||
}
|
||||
defer plg.Stop()
|
||||
|
||||
L := plg.(*luaPlugin).L
|
||||
if L.GetGlobal("sync_reply").Type() != lua.LTNil {
|
||||
t.Errorf("sync inject should return nil reply, got %v", L.GetGlobal("sync_reply"))
|
||||
}
|
||||
for _, k := range []string{"sync_err", "sync_err2", "sync_media_err"} {
|
||||
if L.GetGlobal(k).Type() != lua.LTString {
|
||||
t.Errorf("%s should be an error string (unavailable), got %v", k, L.GetGlobal(k))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user