From f31762a075f391c8ba2a8363f8c7d9b5a9713962 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Fri, 21 Jan 2022 17:56:20 +0100 Subject: net.resolvers.chain: A resolver for combining other resolvers Say if you wanted to try both _xmpp and _xmpps services --- net/resolvers/chain.lua | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 net/resolvers/chain.lua (limited to 'net/resolvers/chain.lua') diff --git a/net/resolvers/chain.lua b/net/resolvers/chain.lua new file mode 100644 index 00000000..b3135e67 --- /dev/null +++ b/net/resolvers/chain.lua @@ -0,0 +1,38 @@ + +local methods = {}; +local resolver_mt = { __index = methods }; + +-- Find the next target to connect to, and +-- pass it to cb() +function methods:next(cb) + if self.resolvers then + if not self.resolver then + if #self.resolvers == 0 then + cb(nil); + return; + end + local next_resolver = table.remove(self.resolvers, 1); + self.resolver = next_resolver; + end + self.resolver:next(function (...) + if self.resolver then + self.last_error = self.resolver.last_error; + end + if ... == nil then + self.resolver = nil; + self:next(cb); + else + cb(...); + end + end); + return; + end +end + +local function new(resolvers) + return setmetatable({ resolvers = resolvers }, resolver_mt); +end + +return { + new = new; +}; -- cgit v1.2.3