Mercurial > prosody-hg
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 |
