@@ -3,6 +3,7 @@ defmodule Ask.Runtime.Session do
33 import Ecto
44
55 alias Ask . {
6+ Channel ,
67 Repo ,
78 QuotaBucket ,
89 Respondent ,
@@ -42,6 +43,7 @@ defmodule Ask.Runtime.Session do
4243 :flow ,
4344 :respondent ,
4445 :token ,
46+ :current_delay ,
4547 :fallback_delay ,
4648 :count_partial_results ,
4749 :schedule
@@ -69,16 +71,16 @@ defmodule Ask.Runtime.Session do
6971 ) do
7072 flow = Flow . start ( questionnaire , mode )
7173
74+ session_fallback_delay = fallback_delay || Survey . default_fallback_delay ( )
7275 session = % Session {
7376 current_mode: SessionModeProvider . new ( mode , channel , retries ) ,
7477 fallback_mode: SessionModeProvider . new ( fallback_mode , fallback_channel , fallback_retries ) ,
7578 flow: flow ,
7679 respondent: update_section_order ( respondent , flow . section_order , persist ) ,
77- fallback_delay: fallback_delay || Survey . default_fallback_delay ( ) ,
80+ fallback_delay: session_fallback_delay ,
7881 count_partial_results: count_partial_results ,
7982 schedule: schedule
8083 }
81-
8284 run_flow ( session , persist )
8385 end
8486
@@ -105,25 +107,23 @@ defmodule Ask.Runtime.Session do
105107 { :ok , session , % Reply { } , base_timeout ( session ) + current_timeout ( session ) }
106108
107109 true ->
108- timeout ( session , nil )
110+ do_timeout ( session )
109111 end
110112 end
111113
112- def timeout ( % { current_mode: % { retries: [ ] } , fallback_mode: nil } = session , _ ) do
114+ defp do_timeout ( % { current_mode: % { retries: [ ] } , fallback_mode: nil } = session ) do
113115 session = % { session | respondent: RetriesHistogram . remove_respondent ( session . respondent ) }
114116 terminate ( session )
115117 end
116118
117- def timeout ( % { current_mode: % { retries: [ ] } } = session , _ ) do
119+ defp do_timeout ( % { current_mode: % { retries: [ ] } } = session ) do
118120 switch_to_fallback_mode ( session )
119121 end
120122
121- def timeout ( % Session { } = session , _ ) do
122- best_timeout_option = best_timeout_option ( session )
123+ defp do_timeout ( % Session { } = session ) do
123124 session = retry ( session )
124125
125- # The new session will timeout as defined by hd(retries)
126- { :ok , session , % Reply { } , best_timeout_option || current_timeout ( session ) }
126+ { :ok , session , % Reply { } , session . current_delay }
127127 end
128128
129129 @ doc """
@@ -215,11 +215,11 @@ defmodule Ask.Runtime.Session do
215215 Respondent . update ( respondent , % { section_order: section_order } , persist )
216216 end
217217
218- def current_timeout ( % Session { current_mode: % { retries: [ ] } , fallback_delay: fallback_delay } ) do
218+ defp current_timeout ( % Session { current_mode: % { retries: [ ] } , fallback_delay: fallback_delay } ) do
219219 fallback_delay
220220 end
221221
222- def current_timeout ( % Session { current_mode: % { retries: [ next_retry | _ ] } } ) do
222+ defp current_timeout ( % Session { current_mode: % { retries: [ next_retry | _ ] } } ) do
223223 next_retry
224224 end
225225
@@ -335,6 +335,7 @@ defmodule Ask.Runtime.Session do
335335 flow: session . flow |> Flow . dump ( ) ,
336336 respondent_id: session . respondent . id ,
337337 token: session . token ,
338+ current_delay: session . current_delay ,
338339 fallback_delay: session . fallback_delay ,
339340 count_partial_results: session . count_partial_results ,
340341 schedule: session . schedule |> Schedule . dump! ( )
@@ -348,6 +349,7 @@ defmodule Ask.Runtime.Session do
348349 flow: Flow . load ( state [ "flow" ] ) ,
349350 respondent: Repo . get ( Ask.Respondent , state [ "respondent_id" ] ) ,
350351 token: state [ "token" ] ,
352+ current_delay: state [ "current_delay" ] ,
351353 fallback_delay: state [ "fallback_delay" ] ,
352354 count_partial_results: state [ "count_partial_results" ] ,
353355 schedule: state [ "schedule" ] |> Schedule . load! ( )
@@ -601,6 +603,14 @@ defmodule Ask.Runtime.Session do
601603 |> add_mode_attempt . ( )
602604
603605 mode_start ( session )
606+ |> update_current_delay
607+ end
608+
609+ defp update_current_delay ( { :ok , session , reply , timeout } ) do
610+ { :ok , % { session | current_delay: timeout } , reply , timeout }
611+ end
612+ defp update_current_delay ( { :end , _ , _ } = flow_result ) do
613+ flow_result
604614 end
605615
606616 defp apply_patterns_if_match ( patterns , respondent , persist ) do
@@ -628,7 +638,7 @@ defmodule Ask.Runtime.Session do
628638 defp log_prompts ( reply , channel , mode , respondent , force \\ false , persist \\ true ) do
629639 if persist do
630640 if force ||
631- ! ChannelBroker . has_delivery_confirmation? ( channel . id ) do
641+ ! Channel . has_delivery_confirmation? ( channel ) do
632642 disposition = Reply . disposition ( reply ) || respondent . disposition
633643
634644 Enum . each ( Reply . steps ( reply ) , fn step ->
@@ -712,12 +722,6 @@ defmodule Ask.Runtime.Session do
712722 % { session | token: nil }
713723 end
714724
715- defp best_timeout_option ( % { current_mode: % { retries: retries } , fallback_mode: nil } )
716- when length ( retries ) == 1 ,
717- do: hd ( retries )
718-
719- defp best_timeout_option ( _ ) , do: nil
720-
721725 defp terminate ( % { current_mode: % SMSMode { } , respondent: respondent } ) do
722726 { :failed , respondent }
723727 end
@@ -757,12 +761,19 @@ defmodule Ask.Runtime.Session do
757761 result
758762 end
759763
764+ defp consume_retry ( % { current_mode: % { retries: [ retry ] } , fallback_mode: nil } = session ) do
765+ % { session | current_mode: % { session . current_mode | retries: [ ] } , current_delay: retry }
766+ end
767+
760768 defp consume_retry ( % { current_mode: % { retries: [ _ | retries ] } } = session ) do
761- % { session | current_mode: % { session . current_mode | retries: retries } }
769+ session = % { session | current_mode: % { session . current_mode | retries: retries } }
770+ current_delay = current_timeout ( session )
771+ % { session | current_delay: current_delay }
762772 end
763773
764774 defp consume_retry ( % { current_mode: % { retries: [ ] } } = session ) do
765- session
775+ current_delay = current_timeout ( session )
776+ % { session | current_delay: current_delay }
766777 end
767778
768779 defp add_session_mode_attempt! ( % Session { } = session ) ,
@@ -831,7 +842,7 @@ defmodule Ask.Runtime.Session do
831842 persist
832843 )
833844
834- { :ok , % { session | flow: flow } , reply , current_timeout ( session ) }
845+ { :ok , % { session | flow: flow } , reply , session . current_delay }
835846 end
836847 end
837848
@@ -841,7 +852,7 @@ defmodule Ask.Runtime.Session do
841852 { :failed , session . respondent }
842853
843854 _ ->
844- { :hangup , % { session | flow: flow } , reply , current_timeout ( session ) , session . respondent }
855+ { :hangup , % { session | flow: flow } , reply , session . current_delay , session . respondent }
845856 end
846857 end
847858
0 commit comments