comparison 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
parents 988ddd57e851
children 05c250fa335a
comparison
equal deleted inserted replaced
11740:b92f2abe0bda 11741:dcf38ac6a38c
447 self.ontimeout = listener.ontimeout; 447 self.ontimeout = listener.ontimeout;
448 self.onreadtimeout = listener.onreadtimeout; 448 self.onreadtimeout = listener.onreadtimeout;
449 self.onstatus = listener.onstatus; 449 self.onstatus = listener.onstatus;
450 self.ondetach = listener.ondetach; 450 self.ondetach = listener.ondetach;
451 self.onattach = listener.onattach; 451 self.onattach = listener.onattach;
452 self.onpredrain = listener.onpredrain;
452 self.ondrain = listener.ondrain; 453 self.ondrain = listener.ondrain;
453 self:onattach(data); 454 self:onattach(data);
454 end 455 end
455 456
456 -- Stub handlers 457 -- Stub handlers
461 function interface_mt:ondisconnect() 462 function interface_mt:ondisconnect()
462 end 463 end
463 function interface_mt:ontimeout() 464 function interface_mt:ontimeout()
464 end 465 end
465 function interface_mt:onreadtimeout() 466 function interface_mt:onreadtimeout()
467 end
468 function interface_mt:onpredrain()
466 end 469 end
467 function interface_mt:ondrain() 470 function interface_mt:ondrain()
468 end 471 end
469 function interface_mt:ondetach() 472 function interface_mt:ondetach()
470 end 473 end
488 onconnect = listener.onconnect; -- will be called when client disconnects 491 onconnect = listener.onconnect; -- will be called when client disconnects
489 ondisconnect = listener.ondisconnect; -- will be called when client disconnects 492 ondisconnect = listener.ondisconnect; -- will be called when client disconnects
490 onincoming = listener.onincoming; -- will be called when client sends data 493 onincoming = listener.onincoming; -- will be called when client sends data
491 ontimeout = listener.ontimeout; -- called when fatal socket timeout occurs 494 ontimeout = listener.ontimeout; -- called when fatal socket timeout occurs
492 onreadtimeout = listener.onreadtimeout; -- called when socket inactivity timeout occurs 495 onreadtimeout = listener.onreadtimeout; -- called when socket inactivity timeout occurs
496 onpredrain = listener.onpredrain; -- called before writes
493 ondrain = listener.ondrain; -- called when writebuffer is empty 497 ondrain = listener.ondrain; -- called when writebuffer is empty
494 ondetach = listener.ondetach; -- called when disassociating this listener from this connection 498 ondetach = listener.ondetach; -- called when disassociating this listener from this connection
495 onstatus = listener.onstatus; -- called for status changes (e.g. of SSL/TLS) 499 onstatus = listener.onstatus; -- called for status changes (e.g. of SSL/TLS)
496 eventread = false, eventwrite = false, eventclose = false, 500 eventread = false, eventwrite = false, eventclose = false,
497 eventhandshake = false, eventstarthandshake = false; -- event handler 501 eventhandshake = false, eventstarthandshake = false; -- event handler
538 if interface.eventwritetimeout then -- luasec only 542 if interface.eventwritetimeout then -- luasec only
539 interface.eventwritetimeout:close( ) -- first we have to close timeout event which where regged after a wantread error 543 interface.eventwritetimeout:close( ) -- first we have to close timeout event which where regged after a wantread error
540 interface.eventwritetimeout = false 544 interface.eventwritetimeout = false
541 end 545 end
542 end 546 end
547 interface:onpredrain();
543 interface.writebuffer = { t_concat(interface.writebuffer) } 548 interface.writebuffer = { t_concat(interface.writebuffer) }
544 local succ, err, byte = interface.conn:send( interface.writebuffer[1], 1, interface.writebufferlen ) 549 local succ, err, byte = interface.conn:send( interface.writebuffer[1], 1, interface.writebufferlen )
545 --vdebug( "write data:", interface.writebuffer, "error:", err, "part:", byte ) 550 --vdebug( "write data:", interface.writebuffer, "error:", err, "part:", byte )
546 if succ then -- writing successful 551 if succ then -- writing successful
547 interface.writebuffer[1] = nil 552 interface.writebuffer[1] = nil