Diff

net/server_event.lua @ 11741:dcf38ac6a38c

net.server: Add a predrain callaback just before writes Allows sneaking in things in the write buffer just before it's sent to the network stack. For example ack requests, compression flushes or other things that make sense to send after stanzas or other things. This ensures any additional trailing data sent is included in the same write, and possibly the same TCP packet. Other methods used such as timers or nextTick might not have the same effect as it depends on scheduling.
author Kim Alvefur <zash@zash.se>
date Mon, 16 Aug 2021 12:34:52 +0200
parent 11068:988ddd57e851
child 12387:05c250fa335a
line wrap: on
line diff
--- a/net/server_event.lua	Mon Aug 16 11:37:51 2021 +0200
+++ b/net/server_event.lua	Mon Aug 16 12:34:52 2021 +0200
@@ -449,6 +449,7 @@
 	self.onstatus = listener.onstatus;
 	self.ondetach = listener.ondetach;
 	self.onattach = listener.onattach;
+	self.onpredrain = listener.onpredrain;
 	self.ondrain = listener.ondrain;
 	self:onattach(data);
 end
@@ -464,6 +465,8 @@
 end
 function interface_mt:onreadtimeout()
 end
+function interface_mt:onpredrain()
+end
 function interface_mt:ondrain()
 end
 function interface_mt:ondetach()
@@ -490,6 +493,7 @@
 		onincoming = listener.onincoming;  -- will be called when client sends data
 		ontimeout = listener.ontimeout; -- called when fatal socket timeout occurs
 		onreadtimeout = listener.onreadtimeout; -- called when socket inactivity timeout occurs
+		onpredrain = listener.onpredrain; -- called before writes
 		ondrain = listener.ondrain; -- called when writebuffer is empty
 		ondetach = listener.ondetach; -- called when disassociating this listener from this connection
 		onstatus = listener.onstatus; -- called for status changes (e.g. of SSL/TLS)
@@ -540,6 +544,7 @@
 					interface.eventwritetimeout = false
 				end
 			end
+			interface:onpredrain();
 			interface.writebuffer = { t_concat(interface.writebuffer) }
 			local succ, err, byte = interface.conn:send( interface.writebuffer[1], 1, interface.writebufferlen )
 			--vdebug( "write data:", interface.writebuffer, "error:", err, "part:", byte )