From 11966a71fbed60d8d14efdb662e45ac3c45770dc Mon Sep 17 00:00:00 2001 From: Marton Lederer Date: Fri, 10 Oct 2025 17:42:24 +0200 Subject: [PATCH 1/6] feat: logic for summarized patch --- src/process.lua | 13 +++++++++++-- src/token/patching.lua | 11 +++++++++++ src/utils/utils.lua | 13 +++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/process.lua b/src/process.lua index 8fb09b8..3603631 100644 --- a/src/process.lua +++ b/src/process.lua @@ -58,6 +58,13 @@ local function setup_handlers() end ) + -- add patch structure setup + Handlers.add( + "setup-current-patch-iter", + function () return "continue" end, + function () Patch = { device = "patch@1.0" } end + ) + -- current timestamp sync -- (this is required for coroutines, so they always -- have the up-to-date timestamp and they don't have @@ -380,10 +387,12 @@ function process.handle(msg, env) if not status then -- call default error handler Handlers.defaultErrorHandler(msg, env, result) - - return ao.result() end + -- send summarized patch + ao.send(Patch) + Patch = { device = "patch@1.0" } + return ao.result() end diff --git a/src/token/patching.lua b/src/token/patching.lua index 146b9b0..695d4c1 100644 --- a/src/token/patching.lua +++ b/src/token/patching.lua @@ -10,6 +10,9 @@ local mod = { ---@type HandlerFunction function mod.setup() + PatchingSetUp = PatchingSetUp or false + if PatchingSetUp then return end + -- enabled and disabled interactions local enabledInteractions, disabledInteractions = mod.utils.interactionsState() @@ -87,6 +90,14 @@ function mod.setup() ["interest-indices"] = interestIndices, orders = { device = "trie@1.0" } }) + + PatchingSetUp = true +end + +-- Add a param to the patch message going out after all handlers were executed +---@param data table The data to patch +function mod.patch(data) + utils.patch_table(Patch, data) end -- Patch the result of a borrow/mint/redeem/repay diff --git a/src/utils/utils.lua b/src/utils/utils.lua index 6db032f..4c7fa7c 100644 --- a/src/utils/utils.lua +++ b/src/utils/utils.lua @@ -402,4 +402,17 @@ function utils.udiv_roundup(x, y) ) end +-- Patches a table with another table, without deleting any keys (recursively merges nested tables) +---@param target table The table to be patched (modified in-place) +---@param patch table The table providing new or updated values +function utils.patch_table(target, patch) + for k, v in pairs(patch) do + if type(v) == "table" and type(target[k]) == "table" then + utils.patch_table(target[k], v) + else + target[k] = v + end + end +end + return utils From 5383e0ad23fd80dbef27427aba77545011a6cccc Mon Sep 17 00:00:00 2001 From: Marton Lederer Date: Fri, 10 Oct 2025 17:51:28 +0200 Subject: [PATCH 2/6] feat: use new patch function --- __tests__/supply.test.ts | 2 ++ __tests__/token.test.ts | 2 +- src/borrow/borrow.lua | 3 +-- src/borrow/interest.lua | 7 +++---- src/borrow/repay.lua | 3 +-- src/controller/config.lua | 6 ++---- src/controller/cooldown.lua | 4 ++-- src/controller/friend.lua | 7 +++---- src/controller/reserves.lua | 4 ++-- src/liquidations/liquidate.lua | 3 +-- src/supply/mint.lua | 3 +-- src/supply/redeem.lua | 3 +-- src/token/patching.lua | 3 +-- src/token/transfer.lua | 3 +-- 14 files changed, 22 insertions(+), 31 deletions(-) diff --git a/__tests__/supply.test.ts b/__tests__/supply.test.ts index 3259cc0..19f3a54 100644 --- a/__tests__/supply.test.ts +++ b/__tests__/supply.test.ts @@ -322,6 +322,8 @@ describe("Minting and providing", () => { )["Reference"] })); + console.log(JSON.stringify(res.Messages, null, 2)) + expect(res.Messages).toEqual( expect.arrayContaining([ expect.objectContaining({ diff --git a/__tests__/token.test.ts b/__tests__/token.test.ts index 19a4007..1223138 100644 --- a/__tests__/token.test.ts +++ b/__tests__/token.test.ts @@ -681,7 +681,7 @@ describe("Token standard functionalities", () => { const res = await handle( generateOracleResponse({ BTC: 85325.425 }, oracleRes) ); - + expect(res.Messages).toEqual( expect.arrayContaining([ expect.objectContaining({ diff --git a/src/borrow/borrow.lua b/src/borrow/borrow.lua index b3be414..f3d27fe 100644 --- a/src/borrow/borrow.lua +++ b/src/borrow/borrow.lua @@ -94,8 +94,7 @@ function mod.borrow(msg, _, oracle) " " .. CollateralTicker ) - ao.send({ - device = "patch@1.0", + patching.patch({ ["pool-state"] = { cash = precision.formatInternalAsNative(Cash, "rounddown"), ["total-borrows"] = precision.formatInternalAsNative(TotalBorrows, "roundup"), diff --git a/src/borrow/interest.lua b/src/borrow/interest.lua index f5a2521..e2eb6dd 100644 --- a/src/borrow/interest.lua +++ b/src/borrow/interest.lua @@ -1,4 +1,5 @@ local precision = require ".utils.precision" +local patching = require ".token.patching" local bint = require ".utils.bint"(1024) local utils = require ".utils.utils" @@ -170,8 +171,7 @@ function mod.accrueInterest(msg) ReservesRemainder = tostring(remainder) -- patch the updated globals - ao.send({ - device = "patch@1.0", + patching.patch({ ["pool-state"] = { ["total-borrows"] = precision.formatInternalAsNative(TotalBorrows, "roundup"), ["total-reserves"] = precision.formatInternalAsNative(Reserves, "roundup"), @@ -212,8 +212,7 @@ function mod.accrueInterestForUser(address) InterestIndices[address] = tostring(interestIndex) -- patch updated global values - ao.send({ - device = "patch@1.0", + patching.patch({ loans = { [address] = Loans[address] }, ["interest-indices"] = { [address] = InterestIndices[address] }, -- !!do not update positions to avoid an infinite recursive loop!! diff --git a/src/borrow/repay.lua b/src/borrow/repay.lua index f367754..aa27caf 100644 --- a/src/borrow/repay.lua +++ b/src/borrow/repay.lua @@ -159,8 +159,7 @@ function repay.repayToPool(target, quantity) TotalBorrows = tostring(bint(TotalBorrows) - precision.toInternalPrecision(actualRepaidQty)) -- patch the updated globals - ao.send({ - device = "patch@1.0", + patching.patch({ ["pool-state"] = { cash = precision.formatInternalAsNative(Cash, "rounddown"), ["total-borrows"] = precision.formatInternalAsNative(TotalBorrows, "roundup"), diff --git a/src/controller/config.lua b/src/controller/config.lua index 1903fb0..83f6b97 100644 --- a/src/controller/config.lua +++ b/src/controller/config.lua @@ -111,8 +111,7 @@ function mod.update(msg) if newAOToken then AOToken = newAOToken end -- patch - ao.send({ - device = "patch@1.0", + patching.patch({ environment = { ["risk-parameters"] = { ["collateral-factor"] = CollateralFactor, @@ -173,8 +172,7 @@ function mod.toggleInteractions(msg) -- patch local enabledInteractions, disabledInteractions = patching.utils.interactionsState() - ao.send({ - device = "patch@1.0", + patching.patch({ environment = { limits = { ["enabled-interactions"] = enabledInteractions, diff --git a/src/controller/cooldown.lua b/src/controller/cooldown.lua index dd80ba6..1839327 100644 --- a/src/controller/cooldown.lua +++ b/src/controller/cooldown.lua @@ -1,3 +1,4 @@ +local patching = require ".token.patching" local json = require "json" local mod = {} @@ -49,8 +50,7 @@ function mod.gate(msg) Cooldowns[sender] = msg["Block-Height"] + CooldownPeriod -- patch - ao.send({ - device = "patch@1.0", + patching.patch({ cooldowns = { [sender] = Cooldowns[sender] } }) end diff --git a/src/controller/friend.lua b/src/controller/friend.lua index 4e751ca..663e374 100644 --- a/src/controller/friend.lua +++ b/src/controller/friend.lua @@ -1,4 +1,5 @@ local assertions = require ".utils.assertions" +local patching = require ".token.patching" local utils = require ".utils.utils" local json = require "json" @@ -52,8 +53,7 @@ function friend.add(msg) }) -- patch - ao.send({ - device = "patch@1.0", + patching.patch({ environment = { friends = Friends } }) @@ -89,8 +89,7 @@ function friend.remove(msg) assert(#removed > 0, "Friend " .. target .. " not yet added") -- patch - ao.send({ - device = "patch@1.0", + patching.patch({ environment = { friends = Friends } }) diff --git a/src/controller/reserves.lua b/src/controller/reserves.lua index 664f96c..15dfc6d 100644 --- a/src/controller/reserves.lua +++ b/src/controller/reserves.lua @@ -1,5 +1,6 @@ local assertions = require ".utils.assertions" local precision = require ".utils.precision" +local patching = require ".token.patching" local bint = require ".utils.bint"(1024) local mod = {} @@ -66,8 +67,7 @@ function mod.deploy(msg) Cash = tostring(bint(Cash) + quantity) -- patch - ao.send({ - device = "patch@1.0", + patching.patch({ ["pool-state"] = { cash = precision.formatInternalAsNative(Cash, "rounddown"), ["total-reserves"] = precision.formatInternalAsNative(Reserves, "roundup") diff --git a/src/liquidations/liquidate.lua b/src/liquidations/liquidate.lua index 11434fb..2e1c1be 100644 --- a/src/liquidations/liquidate.lua +++ b/src/liquidations/liquidate.lua @@ -243,8 +243,7 @@ function mod.liquidatePosition(msg) }) -- patch - ao.send({ - device = "patch@1.0", + patching.patch({ ["token-info"] = { supply = TotalSupply }, ["pool-state"] = { cash = precision.formatInternalAsNative(Cash, "rounddown"), diff --git a/src/supply/mint.lua b/src/supply/mint.lua index 2483343..8ed43fe 100644 --- a/src/supply/mint.lua +++ b/src/supply/mint.lua @@ -61,8 +61,7 @@ function mint.handler(msg) -- patch patching.patchOrder(msg.Tags["Pushed-For"] or msg.Id, true) - ao.send({ - device = "patch@1.0", + patching.patch({ ["pool-state"] = { cash = precision.formatInternalAsNative(Cash, "rounddown"), ["total-borrows"] = precision.formatInternalAsNative(TotalBorrows, "roundup"), diff --git a/src/supply/redeem.lua b/src/supply/redeem.lua index 47da439..60b748e 100644 --- a/src/supply/redeem.lua +++ b/src/supply/redeem.lua @@ -99,8 +99,7 @@ function mod.redeem(msg, _, oracle) Recipient = sender }) patching.patchOrder(msg.Id, true) - ao.send({ - device = "patch@1.0", + patching.patch({ ["pool-state"] = { cash = precision.formatInternalAsNative(Cash, "rounddown"), ["total-borrows"] = precision.formatInternalAsNative(TotalBorrows, "roundup"), diff --git a/src/token/patching.lua b/src/token/patching.lua index 695d4c1..40fe34c 100644 --- a/src/token/patching.lua +++ b/src/token/patching.lua @@ -105,8 +105,7 @@ end ---@param success boolean The result of the order ---@param message string? Optional result message function mod.patchOrder(id, success, message) - ao.send({ - device = "patch@1.0", + mod.patch({ orders = { [id] = { success = success, diff --git a/src/token/transfer.lua b/src/token/transfer.lua index 9d882ac..5e4983c 100644 --- a/src/token/transfer.lua +++ b/src/token/transfer.lua @@ -63,8 +63,7 @@ local function transfer(msg, _, oracle) Balances[sender] = tostring(walletBalance - quantity) -- patch transfer - ao.send({ - device = "patch@1.0", + patching.patch({ balances = { [sender] = Balances[sender], [target] = Balances[target] From ecbe1c9ff6cb86c66317a74491c3183ee9b51a40 Mon Sep 17 00:00:00 2001 From: Marton Lederer Date: Fri, 10 Oct 2025 17:56:31 +0200 Subject: [PATCH 3/6] feat: move patch init --- src/process.lua | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/process.lua b/src/process.lua index 3603631..9449ca1 100644 --- a/src/process.lua +++ b/src/process.lua @@ -58,13 +58,6 @@ local function setup_handlers() end ) - -- add patch structure setup - Handlers.add( - "setup-current-patch-iter", - function () return "continue" end, - function () Patch = { device = "patch@1.0" } end - ) - -- current timestamp sync -- (this is required for coroutines, so they always -- have the up-to-date timestamp and they don't have @@ -348,6 +341,9 @@ local function setup_handlers() end function process.handle(msg, env) + -- reset current patch + Patch = { device = "patch@1.0" } + -- add reply and forward actions ao.add_message_actions(msg) From cab5cee4ef52905bc0d38d302ef593a03032b071 Mon Sep 17 00:00:00 2001 From: Marton Lederer Date: Fri, 10 Oct 2025 18:04:11 +0200 Subject: [PATCH 4/6] fix: only send patch when it has keys --- src/process.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/process.lua b/src/process.lua index 9449ca1..525256b 100644 --- a/src/process.lua +++ b/src/process.lua @@ -342,7 +342,7 @@ end function process.handle(msg, env) -- reset current patch - Patch = { device = "patch@1.0" } + Patch = {} -- add reply and forward actions ao.add_message_actions(msg) @@ -386,8 +386,11 @@ function process.handle(msg, env) end -- send summarized patch - ao.send(Patch) - Patch = { device = "patch@1.0" } + if next(Patch) ~= nil then + Patch.device = "patch@1.0" + ao.send(Patch) + Patch = {} + end return ao.result() end From 766dd76743b962ae1598a8d288d5704c4a70acea Mon Sep 17 00:00:00 2001 From: Marton Lederer Date: Fri, 10 Oct 2025 18:25:26 +0200 Subject: [PATCH 5/6] fix: circular require for patching --- __tests__/supply.test.ts | 2 -- src/borrow/borrow.lua | 2 +- src/borrow/interest.lua | 5 ++--- src/borrow/repay.lua | 2 +- src/controller/config.lua | 4 ++-- src/controller/cooldown.lua | 3 +-- src/controller/friend.lua | 4 ++-- src/controller/reserves.lua | 2 +- src/liquidations/liquidate.lua | 2 +- src/process.lua | 14 ++++++++------ src/supply/mint.lua | 2 +- src/supply/redeem.lua | 2 +- src/token/patching.lua | 8 +------- src/token/transfer.lua | 2 +- 14 files changed, 23 insertions(+), 31 deletions(-) diff --git a/__tests__/supply.test.ts b/__tests__/supply.test.ts index 19f3a54..3259cc0 100644 --- a/__tests__/supply.test.ts +++ b/__tests__/supply.test.ts @@ -322,8 +322,6 @@ describe("Minting and providing", () => { )["Reference"] })); - console.log(JSON.stringify(res.Messages, null, 2)) - expect(res.Messages).toEqual( expect.arrayContaining([ expect.objectContaining({ diff --git a/src/borrow/borrow.lua b/src/borrow/borrow.lua index f3d27fe..91b9fae 100644 --- a/src/borrow/borrow.lua +++ b/src/borrow/borrow.lua @@ -94,7 +94,7 @@ function mod.borrow(msg, _, oracle) " " .. CollateralTicker ) - patching.patch({ + patch({ ["pool-state"] = { cash = precision.formatInternalAsNative(Cash, "rounddown"), ["total-borrows"] = precision.formatInternalAsNative(TotalBorrows, "roundup"), diff --git a/src/borrow/interest.lua b/src/borrow/interest.lua index e2eb6dd..aabf075 100644 --- a/src/borrow/interest.lua +++ b/src/borrow/interest.lua @@ -1,5 +1,4 @@ local precision = require ".utils.precision" -local patching = require ".token.patching" local bint = require ".utils.bint"(1024) local utils = require ".utils.utils" @@ -171,7 +170,7 @@ function mod.accrueInterest(msg) ReservesRemainder = tostring(remainder) -- patch the updated globals - patching.patch({ + patch({ ["pool-state"] = { ["total-borrows"] = precision.formatInternalAsNative(TotalBorrows, "roundup"), ["total-reserves"] = precision.formatInternalAsNative(Reserves, "roundup"), @@ -212,7 +211,7 @@ function mod.accrueInterestForUser(address) InterestIndices[address] = tostring(interestIndex) -- patch updated global values - patching.patch({ + patch({ loans = { [address] = Loans[address] }, ["interest-indices"] = { [address] = InterestIndices[address] }, -- !!do not update positions to avoid an infinite recursive loop!! diff --git a/src/borrow/repay.lua b/src/borrow/repay.lua index aa27caf..1ad402e 100644 --- a/src/borrow/repay.lua +++ b/src/borrow/repay.lua @@ -159,7 +159,7 @@ function repay.repayToPool(target, quantity) TotalBorrows = tostring(bint(TotalBorrows) - precision.toInternalPrecision(actualRepaidQty)) -- patch the updated globals - patching.patch({ + patch({ ["pool-state"] = { cash = precision.formatInternalAsNative(Cash, "rounddown"), ["total-borrows"] = precision.formatInternalAsNative(TotalBorrows, "roundup"), diff --git a/src/controller/config.lua b/src/controller/config.lua index 83f6b97..59ca5f7 100644 --- a/src/controller/config.lua +++ b/src/controller/config.lua @@ -111,7 +111,7 @@ function mod.update(msg) if newAOToken then AOToken = newAOToken end -- patch - patching.patch({ + patch({ environment = { ["risk-parameters"] = { ["collateral-factor"] = CollateralFactor, @@ -172,7 +172,7 @@ function mod.toggleInteractions(msg) -- patch local enabledInteractions, disabledInteractions = patching.utils.interactionsState() - patching.patch({ + patch({ environment = { limits = { ["enabled-interactions"] = enabledInteractions, diff --git a/src/controller/cooldown.lua b/src/controller/cooldown.lua index 1839327..36b62b2 100644 --- a/src/controller/cooldown.lua +++ b/src/controller/cooldown.lua @@ -1,4 +1,3 @@ -local patching = require ".token.patching" local json = require "json" local mod = {} @@ -50,7 +49,7 @@ function mod.gate(msg) Cooldowns[sender] = msg["Block-Height"] + CooldownPeriod -- patch - patching.patch({ + patch({ cooldowns = { [sender] = Cooldowns[sender] } }) end diff --git a/src/controller/friend.lua b/src/controller/friend.lua index 663e374..2b89728 100644 --- a/src/controller/friend.lua +++ b/src/controller/friend.lua @@ -53,7 +53,7 @@ function friend.add(msg) }) -- patch - patching.patch({ + patch({ environment = { friends = Friends } }) @@ -89,7 +89,7 @@ function friend.remove(msg) assert(#removed > 0, "Friend " .. target .. " not yet added") -- patch - patching.patch({ + patch({ environment = { friends = Friends } }) diff --git a/src/controller/reserves.lua b/src/controller/reserves.lua index 15dfc6d..0670b80 100644 --- a/src/controller/reserves.lua +++ b/src/controller/reserves.lua @@ -67,7 +67,7 @@ function mod.deploy(msg) Cash = tostring(bint(Cash) + quantity) -- patch - patching.patch({ + patch({ ["pool-state"] = { cash = precision.formatInternalAsNative(Cash, "rounddown"), ["total-reserves"] = precision.formatInternalAsNative(Reserves, "roundup") diff --git a/src/liquidations/liquidate.lua b/src/liquidations/liquidate.lua index 2e1c1be..3ca9c3f 100644 --- a/src/liquidations/liquidate.lua +++ b/src/liquidations/liquidate.lua @@ -243,7 +243,7 @@ function mod.liquidatePosition(msg) }) -- patch - patching.patch({ + patch({ ["token-info"] = { supply = TotalSupply }, ["pool-state"] = { cash = precision.formatInternalAsNative(Cash, "rounddown"), diff --git a/src/process.lua b/src/process.lua index 525256b..c0beeb0 100644 --- a/src/process.lua +++ b/src/process.lua @@ -7,6 +7,9 @@ require(".utils.assignment").init(ao) local process = { _version = "0.0.1" } local coroutine = require "coroutine" +local utils = require ".utils.utils" + +patch = function (data) utils.patch_table(PatchData or {}, data) end local friend = require ".controller.friend" local config = require ".controller.config" @@ -34,7 +37,6 @@ local rate = require ".supply.rate" local redeem = require ".supply.redeem" local delegation = require ".supply.delegation" -local utils = require ".utils.utils" local precision = require ".utils.precision" HandlersAdded = HandlersAdded or false @@ -342,7 +344,7 @@ end function process.handle(msg, env) -- reset current patch - Patch = {} + PatchData = {} -- add reply and forward actions ao.add_message_actions(msg) @@ -386,10 +388,10 @@ function process.handle(msg, env) end -- send summarized patch - if next(Patch) ~= nil then - Patch.device = "patch@1.0" - ao.send(Patch) - Patch = {} + if next(PatchData) ~= nil then + PatchData.device = "patch@1.0" + ao.send(PatchData) + PatchData = {} end return ao.result() diff --git a/src/supply/mint.lua b/src/supply/mint.lua index 8ed43fe..f6abe8e 100644 --- a/src/supply/mint.lua +++ b/src/supply/mint.lua @@ -61,7 +61,7 @@ function mint.handler(msg) -- patch patching.patchOrder(msg.Tags["Pushed-For"] or msg.Id, true) - patching.patch({ + patch({ ["pool-state"] = { cash = precision.formatInternalAsNative(Cash, "rounddown"), ["total-borrows"] = precision.formatInternalAsNative(TotalBorrows, "roundup"), diff --git a/src/supply/redeem.lua b/src/supply/redeem.lua index 60b748e..66ad35a 100644 --- a/src/supply/redeem.lua +++ b/src/supply/redeem.lua @@ -99,7 +99,7 @@ function mod.redeem(msg, _, oracle) Recipient = sender }) patching.patchOrder(msg.Id, true) - patching.patch({ + patch({ ["pool-state"] = { cash = precision.formatInternalAsNative(Cash, "rounddown"), ["total-borrows"] = precision.formatInternalAsNative(TotalBorrows, "roundup"), diff --git a/src/token/patching.lua b/src/token/patching.lua index 40fe34c..522fedb 100644 --- a/src/token/patching.lua +++ b/src/token/patching.lua @@ -94,18 +94,12 @@ function mod.setup() PatchingSetUp = true end --- Add a param to the patch message going out after all handlers were executed ----@param data table The data to patch -function mod.patch(data) - utils.patch_table(Patch, data) -end - -- Patch the result of a borrow/mint/redeem/repay ---@param id string The ID of the message that initiated the order (pushed for or message id) ---@param success boolean The result of the order ---@param message string? Optional result message function mod.patchOrder(id, success, message) - mod.patch({ + patch({ orders = { [id] = { success = success, diff --git a/src/token/transfer.lua b/src/token/transfer.lua index 5e4983c..adecb33 100644 --- a/src/token/transfer.lua +++ b/src/token/transfer.lua @@ -63,7 +63,7 @@ local function transfer(msg, _, oracle) Balances[sender] = tostring(walletBalance - quantity) -- patch transfer - patching.patch({ + patch({ balances = { [sender] = Balances[sender], [target] = Balances[target] From 30e3b42b57b768ebeee5a5e0851eea8a84e8f3df Mon Sep 17 00:00:00 2001 From: Marton Lederer Date: Fri, 10 Oct 2025 18:39:26 +0200 Subject: [PATCH 6/6] fix: patch for updates --- src/process.lua | 10 ---------- src/utils/handlers.lua | 12 +++++++++++- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/process.lua b/src/process.lua index c0beeb0..ea2e548 100644 --- a/src/process.lua +++ b/src/process.lua @@ -343,9 +343,6 @@ local function setup_handlers() end function process.handle(msg, env) - -- reset current patch - PatchData = {} - -- add reply and forward actions ao.add_message_actions(msg) @@ -387,13 +384,6 @@ function process.handle(msg, env) Handlers.defaultErrorHandler(msg, env, result) end - -- send summarized patch - if next(PatchData) ~= nil then - PatchData.device = "patch@1.0" - ao.send(PatchData) - PatchData = {} - end - return ao.result() end diff --git a/src/utils/handlers.lua b/src/utils/handlers.lua index d75c73a..7978f47 100644 --- a/src/utils/handlers.lua +++ b/src/utils/handlers.lua @@ -468,6 +468,9 @@ function handlers.evaluate(msg, env) assert(type(msg) == 'table', 'msg is not valid') assert(type(env) == 'table', 'env is not valid') + -- reset current patch + PatchData = {} + for _, o in ipairs(handlers.list) do if o.name ~= "_default" and not o.inactive then local match = utils.matchesSpec(msg, o.pattern) @@ -556,7 +559,7 @@ function handlers.evaluate(msg, env) end end if match < 0 then - return handled + break end end end @@ -569,6 +572,13 @@ function handlers.evaluate(msg, env) handlers.remove(name) end + -- send summarized patch + if next(PatchData) ~= nil then + PatchData.device = "patch@1.0" + ao.send(PatchData) + PatchData = {} + end + -- make sure the request was handled assert( handled or msg.Id == ao.id or string.match(msg.Action or "", "Error$"),