Swim.Protocol

swim · API reference

type t = {
  config : Types.config;
  self : Types.node_info;
  members : Membership.t;
  incarnation : Types.incarnation Kcas.Loc.t;
  sequence : int Kcas.Loc.t;
  broadcast_queue : Dissemination.t;
  pending_acks : Pending_acks.t;
  probe_index : int Kcas.Loc.t;
  send_pool : Buffer_pool.t;
  recv_pool : Buffer_pool.t;
  tcp_recv_pool : Buffer_pool.t;
  tcp_decompress_pool : Buffer_pool.t;
  udp_sock : [ `Generic ] Eio.Net.datagram_socket_ty Eio.Resource.t;
  tcp_listener : [ `Generic ] Eio.Net.listening_socket_ty Eio.Resource.t;
  event_stream : Types.node_event Eio.Stream.t;
  user_handlers : (Types.node_info -> string -> string -> unit) list Kcas.Loc.t;
  cipher_key : Crypto.key;
  stats : Types.stats Kcas.Loc.t;
  shutdown : bool Kcas.Loc.t;
  clock : float Eio.Time.clock_ty Eio.Resource.t;
  mono_clock : Eio.Time.Mono.ty Eio.Resource.t;
  secure_random : Eio.Flow.source_ty Eio.Resource.t;
  sw : Eio.Switch.t;
}
val next_seq : t -> int
val get_incarnation : t -> Types.incarnation
val incr_my_incarnation : t -> Types.incarnation
val is_shutdown : t -> bool
val now_mtime : t -> Mtime.span
val update_stats : t -> (Types.stats -> Types.stats) -> unit
val emit_event : t -> Types.node_event -> unit
val send_packet : t -> dst:Eio.Net.Sockaddr.datagram -> Types.packet -> unit
val make_packet : 
  t ->
  primary:Types.protocol_msg ->
  piggyback:Types.protocol_msg list ->
  Types.packet
val drain_piggyback : t -> max_bytes:int -> Types.protocol_msg list
val enqueue_broadcast : t -> Types.protocol_msg -> unit
val handle_ping : 
  t ->
  src:Eio.Net.Sockaddr.datagram ->
  Types.protocol_msg ->
  unit
val handle_ping_req : t -> src:'a -> Types.protocol_msg -> unit
val handle_ack : t -> Types.protocol_msg -> unit
val apply_member_transition : 
  t ->
  Types.node_id ->
  (Types.member_snapshot ->
    now:Mtime.span ->
    Types.member_snapshot Protocol_pure.transition) ->
  unit
val handle_alive_msg : t -> Types.protocol_msg -> unit
val handle_suspect_msg : t -> Types.protocol_msg -> unit
val handle_dead_msg : t -> Types.protocol_msg -> unit
val handle_user_msg : t -> Types.protocol_msg -> unit
val handle_message : 
  t ->
  src:Eio.Net.Sockaddr.datagram ->
  Types.protocol_msg ->
  unit
val handle_packet : t -> src:Eio.Net.Sockaddr.datagram -> Types.packet -> unit
val process_udp_packet : 
  t ->
  buf:Cstruct.t ->
  src:Eio.Net.Sockaddr.datagram ->
  unit
val run_udp_receiver : t -> unit
val build_local_state : 
  t ->
  is_join:bool ->
  Types.Wire.push_pull_header * Types.Wire.push_node_state list
val merge_remote_state : 
  t ->
  Types.Wire.push_node_state list ->
  is_join:bool ->
  unit
val read_exact : 
  [> Eio.Flow.source_ty ] Eio.Flow.source ->
  Cstruct.t ->
  int ->
  (unit, [> `Connection_closed | `Read_error ]) result
val read_available : 
  [> Eio.Flow.source_ty ] Eio.Flow.source ->
  Cstruct.t ->
  int
val decompress_payload : Msgpck.String.buf_in -> string option
val decompress_payload_cstruct : src:Cstruct.t -> dst:Cstruct.t -> int option
val handle_tcp_connection : t -> [> `Flow | `R | `W ] Eio.Flow.source -> unit
val read_to_eof : [> Eio.Flow.source_ty ] Eio.Flow.source -> Cstruct.t -> int
val initiate_push_pull : 
  t ->
  net:[> [> `Generic ] Eio.Net.ty ] Eio.Net.t ->
  addr:Types.addr ->
  (unit, [> `Connection_closed | `Invalid_response | `Unreachable ]) result
val run_tcp_listener : t -> unit
val probe_member : t -> Membership.Member.t -> bool
val indirect_probe : t -> Membership.Member.t -> bool
val suspect_member : t -> Membership.Member.t -> unit
val probe_cycle : t -> unit
val run_protocol : t -> unit
val create : 
  sw:Eio.Switch.t ->
  config:Types.config ->
  self:Types.node_info ->
  udp_sock:[ `Generic ] Eio.Net.datagram_socket_ty Eio.Resource.t ->
  tcp_listener:[ `Generic ] Eio.Net.listening_socket_ty Eio.Resource.t ->
  clock:float Eio.Time.clock_ty Eio.Resource.t ->
  mono_clock:Eio.Time.Mono.ty Eio.Resource.t ->
  secure_random:Eio.Flow.source_ty Eio.Resource.t ->
  (t, [> `Invalid_key ]) result
val shutdown : t -> unit
val add_member : t -> Types.node_info -> unit
val remove_member : t -> Types.node_id -> bool
val local_node : t -> Types.node_info
val members : t -> Membership.Member.t list
val member_count : t -> int
val events : t -> Types.node_event Eio.Stream.t
val stats : t -> Types.stats
val broadcast : t -> topic:string -> payload:string -> unit
val send_direct : 
  t ->
  target:Types.node_id ->
  topic:string ->
  payload:string ->
  (unit, [> `Unknown_node ]) result
val send_to_addr : 
  t ->
  addr:Eio.Net.Sockaddr.datagram ->
  topic:string ->
  payload:string ->
  unit
val on_message : t -> (Types.node_info -> string -> string -> unit) -> unit