1 files changed, 20 insertions, 1 deletions
diff --git a/synapse/util/__init__.py b/synapse/util/__init__.py
index fee76b0a9b..29f1344c5b 100644
--- a/synapse/util/__init__.py
+++ b/synapse/util/__init__.py
@@ -15,7 +15,7 @@
from synapse.util.logcontext import LoggingContext
-from twisted.internet import reactor, task
+from twisted.internet import defer, reactor, task
import time
@@ -53,3 +53,22 @@ class Clock(object):
def cancel_call_later(self, timer):
timer.cancel()
+
+ def time_bound_deferred(self, given_deferred, time_out):
+ ret_deferred = defer.Deferred()
+
+ def timed_out():
+ if not given_deferred.called:
+ given_deferred.cancel()
+ ret_deferred.errback(RuntimeError("Timed out"))
+
+ timer = self.call_later(time_out, timed_out)
+
+ def succeed(result):
+ self.cancel_call_later(timer)
+ ret_deferred.callback(result)
+
+ given_deferred.addCallback(succeed)
+ given_deferred.addErrback(ret_deferred.errback)
+
+ return ret_deferred
|