open Lwt.Syntax open Js_of_ocaml open Flesh (* https://stackoverflow.com/questions/34929382/what-are-the-differences-between-lwt-async-and-lwt-main-run-on-ocaml-node-js *) let rec run t = let next_tick (_callback : unit -> unit) = Js.Unsafe.(fun_call (js_expr "process.nextTick") [| inject (Js.wrap_callback _callback) |]) in Lwt.wakeup_paused (); match Lwt.poll t with | Some x -> x | None -> if Lwt.paused_count () > 0 then next_tick (fun () -> run t) else () let main (stream, push) jid password = let* _stream = Lwt_stream.get stream in let+ _auth = Sasl.send_auth_stanza (stream, push) jid password Sasl.PLAIN in push None; match _auth with | Error (NotAuthorized, Some (_, text)) -> print_endline ("Not authorized: " ^ text) | Error (MalformedRequest, Some (_, text)) -> print_endline ("Malformed request: " ^ text) | _ -> () let () = run @@ let jid = (Sys.getenv "EXAMPLE_JID") and password = (Sys.getenv "EXAMPLE_PASSWORD") in let domain = (List.nth (String.split_on_char '@' jid) 1) in let* stream, push = Stream.start domain in Lwt.catch (fun () -> main (stream, push) jid password) (fun exn -> push None; Lwt.fail exn)