123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123open!Coreopen!Asyncopen!Importopen!Require_explicit_time_sourceincludePersistent_connection_intfmoduleMake(Conn:T)=structincludePersistent_connection_kernel.Make(Conn)letcreate~server_name?log?(on_event=fun_->Deferred.unit)?retry_delay?random_state?time_source~connectget_address=letretry_delay=Option.mapretry_delay~f:(funf()->f()|>Time_ns.Span.of_span_float_round_nearest)inleton_eventevent=Option.iterlog~f:(funlog->ifLog.would_loglog(Some(Event.log_levelevent))thenLog.sexplog~tags:["persistent-connection-to",server_name]~level:(Event.log_levelevent)(Event.sexp_of_tevent));on_eventeventincreate~server_name~on_event?retry_delay?random_state?time_source~connectget_address;;endletcreate_convenience_wrapper~create~connection_of_rpc_connection~server_name?log?on_event?retry_delay?bind_to_address?implementations?max_message_size?make_transport?handshake_timeout?heartbeat_configget_address=letconnecthost_and_port=let%bind.Deferred.Or_errorconn=Rpc.Connection.client(Tcp.Where_to_connect.of_host_and_port?bind_to_addresshost_and_port)?implementations?max_message_size?make_transport?handshake_timeout?heartbeat_config~description:(Info.of_string("persistent connection to "^server_name))>>|Or_error.of_exn_resultinconnection_of_rpc_connectionconnincreate~server_name?log?on_event?retry_delay?random_state:None?time_source:None~connectget_address;;moduleVersioned_rpc=structincludeMake(structmoduleAddress=Host_and_porttypet=Versioned_rpc.Connection_with_menu.tletrpc_connection=Versioned_rpc.Connection_with_menu.connectionletcloset=Rpc.Connection.close(rpc_connectiont)letis_closedt=Rpc.Connection.is_closed(rpc_connectiont)letclose_finishedt=Rpc.Connection.close_finished(rpc_connectiont)end)letcreate'~server_name=create_convenience_wrapper~server_name~create~connection_of_rpc_connection:Versioned_rpc.Connection_with_menu.create;;endmoduleRpc=structincludeMake(structmoduleAddress=Host_and_porttypet=Rpc.Connection.tletcloset=Rpc.Connection.closetletis_closedt=Rpc.Connection.is_closedtletclose_finishedt=Rpc.Connection.close_finishedtend)letcreate'~server_name=create_convenience_wrapper~server_name~create~connection_of_rpc_connection:Deferred.Or_error.return;;end