-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaction_attempt_utils.rb
51 lines (40 loc) · 1.65 KB
/
action_attempt_utils.rb
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
# frozen_string_literal: true
module Seam
module Utils
module ActionAttemptUtils
def self.decide_and_wait(action_attempt, client, wait_for_action_attempt)
wait_decision = wait_for_action_attempt.nil? ? client.defaults["wait_for_action_attempt"] : wait_for_action_attempt
if wait_decision == true
wait_until_finished(action_attempt, client)
elsif wait_decision.is_a?(Hash)
wait_until_finished(action_attempt, client, timeout: wait_decision[:timeout],
polling_interval: wait_decision[:polling_interval])
end
end
def self.wait_until_finished(action_attempt, client, timeout: nil, polling_interval: nil)
timeout = timeout.nil? ? 5.0 : timeout
polling_interval = polling_interval.nil? ? 0.5 : polling_interval
time_waiting = 0.0
while action_attempt.status == "pending"
sleep(polling_interval)
time_waiting += polling_interval
raise Errors::SeamActionAttemptTimeoutError.new(action_attempt, timeout) if time_waiting > timeout
action_attempt = update_action_attempt(action_attempt, client)
end
raise Errors::SeamActionAttemptFailedError.new(action_attempt) if action_attempt.status == "error"
action_attempt
end
def self.update_action_attempt(action_attempt, client)
response = client.request_seam(
:post,
"/action_attempts/get",
body: {
action_attempt_id: action_attempt.action_attempt_id
}
)
action_attempt.update_from_response(response["action_attempt"])
action_attempt
end
end
end
end