mqttagent

MQTT Lua Agent
git clone https://git.instinctive.eu/mqttagent.git
Log | Files | Refs | README | LICENSE

commit 5618ba4b61d9869d4f4798bf99fdc55c65c020d4
parent f60f04514a3f68d937860712b5c0c3cbc37bb9b4
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date:   Tue, 18 Feb 2025 19:11:24 +0000

MQTT clients are indexed by their configuration
Diffstat:
Mmqttagent.go | 32++++++++++++++++++++++++++++++--
1 file changed, 30 insertions(+), 2 deletions(-)

diff --git a/mqttagent.go b/mqttagent.go @@ -235,14 +235,16 @@ const luaStateName = "_mqttagent" const keyChanToLua = 1 const keyClientPrefix = 2 const keyClientNextId = 3 -const keyCnxTable = 4 -const keyTimerTable = 5 +const keyCfgMap = 4 +const keyCnxTable = 5 +const keyTimerTable = 6 func registerState(L *lua.LState, clientPrefix string, toLua chan<- MqttMessage) { st := L.NewTable() L.RawSetInt(st, keyChanToLua, newUserData(L, toLua)) L.RawSetInt(st, keyClientPrefix, lua.LString(clientPrefix)) L.RawSetInt(st, keyClientNextId, lua.LNumber(1)) + L.RawSetInt(st, keyCfgMap, newUserData(L, make(mqttConfigMap))) L.RawSetInt(st, keyCnxTable, L.NewTable()) L.RawSetInt(st, keyTimerTable, L.NewTable()) L.SetGlobal(luaStateName, st) @@ -266,6 +268,10 @@ func stateClientNextId(L *lua.LState) (int, string) { return result, fmt.Sprintf("%s-%d", prefix, result) } +func stateCfgMap(L *lua.LState) mqttConfigMap { + return stateValue(L, keyCfgMap).(*lua.LUserData).Value.(mqttConfigMap) +} + func stateCnxTable(L *lua.LState) *lua.LTable { return stateValue(L, keyCnxTable).(*lua.LTable) } @@ -308,6 +314,13 @@ type mqttConfig struct { CleanSession bool } +type mqttClientEntry struct { + client *mqtt.Client + id int +} + +type mqttConfigMap map[mqttConfig]mqttClientEntry + func mqttConfigBytes(src string) []byte { if src == "" { return nil @@ -358,6 +371,19 @@ func newMqttClient(L *lua.LState) int { return 2 } + cfgMap := stateCfgMap(L) + + if cfg, found := cfgMap[config]; found { + res := L.RawGetInt(stateCnxTable(L), cfg.id) + tbl := res.(*lua.LTable) + if L.RawGetInt(tbl, keyClient).(*lua.LUserData).Value.(*mqtt.Client) != cfg.client { + panic("Inconsistent configuration table") + } + + L.Push(res) + return 1 + } + id, idString := stateClientNextId(L) client, err := newClient(&config, idString) if err != nil { @@ -368,6 +394,8 @@ func newMqttClient(L *lua.LState) int { } go mqttRead(client, stateChanToLua(L), id) + cfgMap[config] = mqttClientEntry{id: id, client: client} + res := L.NewTable() L.RawSetInt(res, keyClient, newUserData(L, client)) L.RawSetInt(res, keySubTable, L.NewTable())