How To Call It
Workflow is a global table: call its functions with a dot (Workflow.<method>(...)), not a colon. Requires Macro Handler 1.0.51 or later.
Polls a predicate until it returns a truthy value, times out or reaches the attempt limit, returning a structured result.
Documented for app version 1.0.50Updated:
Workflow is a global table: call its functions with a dot (Workflow.<method>(...)), not a colon. Requires Macro Handler 1.0.51 or later.
Polls a predicate until it returns a truthy value, times out or reaches the attempt limit, returning a structured result.
predicate(attempt); options: timeoutMs, intervalMs (default 100), maxAttempts (default 10000), accept(value, attempt, values). An ordinary predicate error returns reason="error". The result has ok, reason, attempts, elapsedMs, value, values and error; values.n preserves the number of multiple returns, including nil. The default timeout is 30000 ms, with a maximum of 86400000 ms and up to 1000000 iterations. Calls are synchronous and cooperative; a blocking operation must still use its own timeout.
Combine API calls, conditions and reusable Module functions. Stop, pause and execution budgets remain active. Retry actions must be safe to repeat; do not automatically repeat side effects such as payments or taps after an ambiguous network response.
The snippet below is a starter pattern that can be applied directly in runtime flow.
local checks = 0
local result = Workflow.waitUntil(function(attempt)
checks = checks + 1
return checks >= 3
end, {timeoutMs = 1000, intervalMs = 50})
print(result.ok, result.reason, result.attempts)From foundation to combined usage, each level is provided as a separate code block so you can copy the level you need and adapt it directly.
local checks = 0
local result = Workflow.waitUntil(function(attempt)
checks = checks + 1
return checks >= 3
end, {timeoutMs = 1000, intervalMs = 50})
print(result.ok, result.reason, result.attempts)local stepOk = true
local checks = 0
local result = Workflow.waitUntil(function(attempt)
checks = checks + 1
return checks >= 3
end, {timeoutMs = 1000, intervalMs = 50})
print(result.ok, result.reason, result.attempts)
if stepOk then
wait(200)
endlocal ok, err = pcall(function()
local checks = 0
local result = Workflow.waitUntil(function(attempt)
checks = checks + 1
return checks >= 3
end, {timeoutMs = 1000, intervalMs = 50})
print(result.ok, result.reason, result.attempts)
end)
if not ok then
print("API step failed: Workflow.waitUntil: " .. tostring(err))
requestStop()
end-- Workflow.waitUntil(predicate, options?)
local function run_waituntil_step()
local checks = 0
local result = Workflow.waitUntil(function(attempt)
checks = checks + 1
return checks >= 3
end, {timeoutMs = 1000, intervalMs = 50})
print(result.ok, result.reason, result.attempts)
end
local ok, err = pcall(run_waituntil_step)
if not ok then
toast("Step failed")
print(err)
endlocal checks = 0
local result = Workflow.waitUntil(function(attempt)
checks = checks + 1
return checks >= 3
end, {timeoutMs = 1000, intervalMs = 50})
print(result.ok, result.reason, result.attempts)