aboutsummaryrefslogtreecommitdiffstats
path: root/net/server_event.lua
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2010-05-05 15:25:48 +0100
committerMatthew Wild <mwild1@gmail.com>2010-05-05 15:25:48 +0100
commita22e2228658189c68d1125f1fb6623088f8bc3cb (patch)
tree9e0f3456c0aacc4ea87eb5d27e29163325f0ba3c /net/server_event.lua
parent3c7eb58b08e7f416d73f86061706674d37f83c4f (diff)
downloadprosody-a22e2228658189c68d1125f1fb6623088f8bc3cb.tar.gz
prosody-a22e2228658189c68d1125f1fb6623088f8bc3cb.zip
net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Diffstat (limited to 'net/server_event.lua')
-rw-r--r--net/server_event.lua21
1 files changed, 21 insertions, 0 deletions
diff --git a/net/server_event.lua b/net/server_event.lua
index 8eaa96da..43e70a0f 100644
--- a/net/server_event.lua
+++ b/net/server_event.lua
@@ -845,11 +845,32 @@ function hook_signal(signal_num, handler)
return signal_events[signal_num];
end
+local function link(sender, receiver, buffersize)
+ sender:set_mode(buffersize);
+ local sender_locked;
+
+ function receiver:ondrain()
+ if sender_locked then
+ sender:resume();
+ sender_locked = nil;
+ end
+ end
+
+ function sender:onincoming(data)
+ receiver:write(data);
+ if receiver.writebufferlen >= buffersize then
+ sender_locked = true;
+ sender:pause();
+ end
+ end
+end
+
return {
cfg = cfg,
base = base,
loop = loop,
+ link = link,
event = event,
event_base = base,
addevent = newevent,