aboutsummaryrefslogtreecommitdiff
path: root/portal
diff options
context:
space:
mode:
authorClombrong <cromblong@egregore.fun>2025-06-29 05:37:20 +0200
committerClombrong <cromblong@egregore.fun>2025-06-29 05:38:34 +0200
commit1fa0e770fe4d6108fe85ca7b49fd0e0b1e545215 (patch)
tree319a28d28c296e0e6475ac434405feb6fc7c5495 /portal
parent3bc4f79c124f3fbafe6cd00dc5f446f38e29320b (diff)
feat(portal_tcp): send closing element when pushing None
Diffstat (limited to 'portal')
-rw-r--r--portal/tcp/portal.ml11
1 files changed, 10 insertions, 1 deletions
diff --git a/portal/tcp/portal.ml b/portal/tcp/portal.ml
index 31c45c0..c767f3e 100644
--- a/portal/tcp/portal.ml
+++ b/portal/tcp/portal.ml
@@ -123,8 +123,17 @@ let socket_to_stream (sock : socket) =
in
let outbound_stream, outbound_push = Lwt_stream.create () in
let push = function
- | None -> outbound_push None
| Some signals -> Markup.iter (fun f -> outbound_push (Some f)) signals
+ | None -> begin
+ (* XMPP streams are one long XML document, so naturally ending the document
+ closes the stream. *)
+ outbound_push (Some `End_element);
+ Lwt.async
+ (fun () ->
+ (* We drain completely the stream when closing, so the socket can close. *)
+ let+ () = Markup_lwt.drain stream
+ in outbound_push None)
+ end
in Lwt.async begin
fun () ->
let* _ =