Source file mehari_eio.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
module Addr = Common.Addr
module Direct = Common.Direct
module IO = Common.Direct

module type S =
  Mehari.NET
    with module IO := Direct
     and type addr = Eio.Net.Ipaddr.v4v6
     and type clock := Eio.Time.clock

module Clock = struct
  type t = Eio.Time.clock

  (* Taken from mirage-clock-unix https://github.com/mirage/mirage-clock/blob/main/unix/pclock.ml#L17 *)
  let ps_count_in_s = 1_000_000_000_000L

  let now_d_ps clock =
    let ns, secs = clock#now |> Float.modf in
    let ns = Int64.of_float (ns *. 1000.) in
    let secs = Int64.of_float secs in
    let days = Int64.div secs 86_400L in
    let rem_s = Int64.rem secs 86_400L in
    let frac_ps = Int64.mul ns 1000L in
    let rem_ps = Int64.mul rem_s ps_count_in_s in
    (Int64.to_int days, Int64.add rem_ps frac_ps)
end

module RateLimiter =
  Mehari.Private.Rate_limiter_impl.Make (Clock) (Direct) (Addr)

module Logger =
  Mehari.Private.Logger_impl.Make
    (Clock)
    (struct
      include Direct

      let finally t f r = try f (t ()) with exn -> r exn
    end)
    (Addr)

module Router = Mehari.Private.Router_impl.Make (RateLimiter) (Logger)
module Server = Server_impl.Make (Logger)

type addr = Addr.t
type handler = Router.handler
type middleware = handler -> handler
type route = Router.route
type rate_limiter = RateLimiter.t

let set_log_lvl = Logger.set_level
let logger = Logger.logger
let debug = Logger.debug
let info = Logger.info
let warning = Logger.warning
let error = Logger.error
let no_middleware = Router.no_middleware
let pipeline = Router.pipeline
let router = Router.router
let route = Router.route
let scope = Router.scope
let no_route = Router.no_route
let virtual_hosts = Router.virtual_hosts
let make_rate_limit = RateLimiter.make
let response_document = File.response_document
let static = File.static
let run = Server.run