lib/collections/expiremental.ex

defmodule CensysEx.Experimental do
  @moduledoc """
  CensysEx wrapper for the search.censys.io v2 "experimental" APIs.
  *_NOTE_*: these APIs are subject to change in the future and CensysEx may get out of sync with Censys
  """

  alias CensysEx.{API, Paginate, Util}

  @doc """
  Hits the Experimental Censys host events API

    - API docs: https://search.censys.io/api#/experimental/viewHostEvents

  ## Examples

  ```
  CensysEx.Experimental.host_events("127.0.0.1")
  |> Stream.take(25)
  |> Stream.map(&Map.get(&1, "_event"))
  |> Enum.to_list()
  ["service_observed", "location_updated", ...]
  ```
  """
  @spec host_events(API.t(), String.t(), integer(), boolean(), DateTime.t() | nil, DateTime.t() | nil) ::
          CensysEx.result_stream(map())
  def host_events(client, ip, per_page \\ 50, reversed \\ false, start_time \\ nil, end_time \\ nil) do
    next = fn client, params -> API.get(client, "experimental", "hosts/#{ip}/events", params) end
    extractor = fn client = %Paginate{} -> get_in(client.results, ["result", "events"]) end

    Paginate.stream(
      client,
      next,
      extractor,
      Util.build_experimental_get_host_events(per_page, reversed, start_time, end_time)
    )
  end
end