From f31762a075f391c8ba2a8363f8c7d9b5a9713962 Mon Sep 17 00:00:00 2001
From: Kim Alvefur <zash@zash.se>
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')

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