package awskit-lwt

  1. Overview
  2. Docs
Lwt runtime adapter for Awskit

Install

dune-project
 Dependency

Authors

Maintainers

Sources

awskit-v0.2.0.tbz
sha256=b69c81378d08f443a276b947d9a2b45913495cb61b2ff3aa0ad74d6b071f32f8
sha512=50714b8eda6ea6e589eb34a305afdfa4870a5e8e4240c091ff5cecd309c21fdfda6163fb6449caad5cdaf800857369df5da0534d822cf152ac76fc16fb9216e5

doc/src/awskit-lwt/awskit_lwt.ml.html

Source file awskit_lwt.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
module Credentials = struct
  module Provider = struct
    type credentials = Awskit.Credentials.t
    type source = Awskit.Credentials.Provider.source
    type unavailable = { source : source; reason : string }

    type resolution =
      | Resolved of credentials
      | Unavailable of unavailable
      | Invalid of Awskit.Error.t
      | Failed of Awskit.Error.t

    type t = unit -> resolution Lwt.t

    let create f = f
    let resolve t = t ()

    let static credentials =
      let provider = Awskit.Credentials.Provider.static credentials in
      fun () ->
        match Awskit.Credentials.Provider.resolve provider with
        | Awskit.Credentials.Provider.Resolved credentials ->
            Lwt.return (Resolved credentials)
        | Awskit.Credentials.Provider.Unavailable { source; reason } ->
            Lwt.return (Unavailable { source; reason })
        | Awskit.Credentials.Provider.Invalid error ->
            Lwt.return (Invalid error)
        | Awskit.Credentials.Provider.Failed error -> Lwt.return (Failed error)

    let chain providers =
     fun () ->
      let rec loop last_unavailable = function
        | [] ->
            Lwt.return
              (Unavailable
                 (Option.value last_unavailable
                    ~default:
                      {
                        source = `Custom "chain";
                        reason = "no credential providers configured";
                      }))
        | provider :: rest ->
            Lwt.bind (provider ()) (function
              | Resolved _ as resolved -> Lwt.return resolved
              | Unavailable unavailable -> loop (Some unavailable) rest
              | Invalid _ as invalid -> Lwt.return invalid
              | Failed _ as failed -> Lwt.return failed)
      in
      loop None providers

    let source_label = Awskit.Credentials.Provider.source_label
  end
end

let provider_resolution_to_result resolution =
  let open Credentials.Provider in
  match resolution with
  | Resolved credentials -> Ok credentials
  | Unavailable { source; reason } ->
      Error
        (Awskit.Error.Producer.credentials
           ~source:(Awskit.Credentials.Provider.source_label source)
           reason)
  | Invalid error | Failed error -> Error error

module Make (Client : Cohttp_lwt.S.Client) = struct
  module Inner = Runtime.Make (Client)

  type t = Inner.t

  module Runtime = Inner.Runtime

  let create = Inner.create

  let create_with_credentials_provider ?ctx ?endpoint ~region
      ~credentials_provider ~clock ?retry_policy ?sleep ?random_float
      ?timeout_policy ?max_response_drain_bytes () =
    let credentials_provider () =
      Lwt.map provider_resolution_to_result
        (Credentials.Provider.resolve credentials_provider)
    in
    Inner.create_with_credentials_provider ?ctx ?endpoint ~region
      ~credentials_provider ~clock ?retry_policy ?sleep ?random_float
      ?timeout_policy ?max_response_drain_bytes ()
end