Source

core hello world / common.ml

open Core.Std
open Async.Std

let port_arg () =
  Command.Spec.(
    flag "-port" (optional_with_default 8080 int)
      ~doc:" Broker's port"
  )

let host_arg () =
  Command.Spec.(
    flag "-hostname" (optional_with_default "127.0.0.1" string)
      ~doc:" Broker's hostname"
  )

let with_rpc_conn f ~host ~port =
  Log.Global.info "starting RPC connection to %s:%d" host port;
  Tcp.with_connection
    (Tcp.to_host_and_port host port)
    ~timeout:(sec 1.)
    (fun r w ->
      Log.Global.info "Connection established";
      Rpc.Connection.create r w ~connection_state:()
      >>= function
      | Error exn ->
        Log.Global.info "Received error";
        raise exn
      | Ok conn ->
        Log.Global.info "Calling handling function";
        f conn
    )

let start_server ~env ?(stop=Deferred.never ()) ~implementations ~port () =
  Log.Global.info "starting server on %d" port;
  let implementations =
    Rpc.Implementations.create ~on_unknown_rpc:`Ignore ~implementations
  in
  match implementations with
  | Error (`Duplicate_implementations _) -> assert false
  | Ok implementations ->
    Log.Global.info "About to start TCP server";
    Tcp.Server.create
      ~on_handler_error:(`Call (fun _ exn -> Log.Global.sexp exn Exn.sexp_of_t))
      (Tcp.on_port port)
      (fun _addr r w ->
        Rpc.Connection.server_with_close r w
          ~connection_state:env
          ~on_handshake_error:(
            `Call (fun exn -> Log.Global.sexp exn Exn.sexp_of_t; return ()))
          ~implementations
      )
    >>= fun server ->
    Log.Global.info "TCP server started, waiting for close";
    Deferred.any
      [ (stop >>= fun () -> Tcp.Server.close server)
      ; Tcp.Server.close_finished server ]
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.