net.resolvers.chain: A resolver for combining other resolvers
authorKim Alvefur <zash@zash.se>
Fri, 21 Jan 2022 17:56:20 +0100
changeset 12208 7c397a49d163
parent 12207 320de3e4b579
child 12209 a2e6605303fa
net.resolvers.chain: A resolver for combining other resolvers Say if you wanted to try both _xmpp and _xmpps services
net/resolvers/chain.lua
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/net/resolvers/chain.lua	Fri Jan 21 17:56:20 2022 +0100
@@ -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;
+};