Class: ZeroDrop::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/zerodrop.rb

Overview

The ZeroDrop API client.

Instance Method Summary collapse

Constructor Details

#initialize(api_key: nil, base_url: DEFAULT_BASE_URL) ⇒ Client

Returns a new instance of Client.

Parameters:

  • api_key (String, nil) (defaults to: nil)

    Workspace API key. Omit for free sandbox mode.

  • base_url (String) (defaults to: DEFAULT_BASE_URL)

    Override for self-hosted instances.



79
80
81
82
# File 'lib/zerodrop.rb', line 79

def initialize(api_key: nil, base_url: DEFAULT_BASE_URL)
  @api_key = api_key
  @base_url = base_url.chomp("/")
end

Instance Method Details

#fetch_latest(inbox, filter: nil) ⇒ ZeroDrop::Email?

Returns the newest email matching the filter, or nil.

Parameters:

  • inbox (String)

    inbox address or name

  • filter (ZeroDrop::Filter, nil) (defaults to: nil)

Returns:



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/zerodrop.rb', line 99

def fetch_latest(inbox, filter: nil)
  name = inbox_name(inbox)
  uri = URI("#{@base_url}/api/inbox/#{name}?source=ruby-sdk")

  res = http_get(uri)
  raise AuthError if res.code == "401"
  raise NetworkError, "API returned #{res.code}" unless res.code == "200"

  payload = JSON.parse(res.body)
  emails = payload.fetch("emails", [])

  emails.each do |raw|
    email = build_email(raw)
    return email if filter.nil? || filter.matches?(email)
  end
  nil
rescue JSON::ParserError => e
  raise NetworkError, "invalid response: #{e.message}"
rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT, SocketError => e
  raise NetworkError, "#{e.message} (check https://zerodrop.instatus.com)"
end

#generate_inboxString

Returns a ready-to-use email address instantly. No network request is made.

Returns:

  • (String)

    e.g. "swift-x7k29ab@zerodrop-sandbox.online"



88
89
90
91
92
# File 'lib/zerodrop.rb', line 88

def generate_inbox
  adjective = ADJECTIVES.sample
  suffix = SecureRandom.alphanumeric(7).downcase
  "#{adjective}-#{suffix}@#{FREE_DOMAIN}"
end

#wait_for_latest(inbox, timeout: 10, poll_interval: 2, filter: nil) ⇒ ZeroDrop::Email

Blocks until an email matching the filter arrives. Polls every poll_interval seconds up to timeout seconds.

Parameters:

  • inbox (String)

    inbox address or name

  • timeout (Numeric) (defaults to: 10)

    seconds to wait (default 10)

  • poll_interval (Numeric) (defaults to: 2)

    seconds between polls (default 2)

  • filter (ZeroDrop::Filter, nil) (defaults to: nil)

Returns:

Raises:



130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/zerodrop.rb', line 130

def wait_for_latest(inbox, timeout: 10, poll_interval: 2, filter: nil)
  deadline = Time.now + timeout

  loop do
    email = fetch_latest(inbox, filter: filter)
    return email if email

    raise TimeoutError.new(inbox, timeout) if Time.now + poll_interval > deadline

    sleep poll_interval
  end
end