package Ġcom . github . dro ib it . messenger . internal Ċ Ċ import Ġcom . google . android . gms . we arable . Message Client Ċ import Ġcom . google . android . gms . we arable . Message Event Ċ import Ġkotlinx . coroutines . suspend C ancellable Coroutine Ċ import Ġkotlinx . coroutines . with Timeout Ċ import Ġkotlin . coroutines . Continuation Ċ import Ġkotlin . coroutines . resume Ċ Ċ internal Ġclass ĠMessage EventHandler Ġinternal Ġconstructor ( ĊĠ Ġprivate Ġval Ġexpected Paths : ĠSet < String >, ĊĠ Ġprivate Ġval Ġwait Message Millis : ĠLong , ĊĠ Ġprivate Ġval Ġdispatcher : ĠDispatcher Ċ ) Ġ: ĠMessage Client . On Message Received Listener Ġ{ ĊĠ Ġoverride Ġfun Ġon Message Received ( message Event : ĠMessage Event ) Ġ{ ĊĠĠĠ Ġif Ġ( message Event . path Ġ! in Ġexpected Paths ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġdispatcher . dispatch Message Event ( message Event ) ĊĠ Ġ} ĊĊĠ Ġsuspend Ġfun Ġobtain (): ĠMessage Event Ġ{ ĊĠĠĠ Ġreturn Ġwith Timeout ( wait Message Millis ) Ġ{ ĊĠĠĠĠĠ Ġsuspend C ancellable Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠ Ġdispatcher . continu ation Ġ= Ġcont ĊĠĠĠĠĠĠĠ Ġcont . invoke On Cancellation Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdispatcher . continu ation Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinternal Ġclass ĠDispatcher Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġmessage Event : ĠMessage Event ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġcontinuation : ĠContinu ation < Message Event >? Ġ= Ġnull ĊĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġmessage Event ?. let Ġ{ Ġvalue ?. resume ( it ) Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispatch Message Event ( message Event : ĠMessage Event ) Ġ{ ĊĠĠĠĠĠ Ġthis . message Event Ġ= Ġmessage Event ĊĠĠĠĠĠ Ġthis . continu ation ?. resume ( message Event ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinternal Ġclass ĠFactory ( private Ġval Ġwait Message Millis : ĠLong ) Ġ{ ĊĊĠĠĠ Ġfun Ġcreate ( expected Paths : ĠSet < String >): ĠMessage EventHandler Ġ{ ĊĠĠĠĠĠ Ġreturn ĠMessage EventHandler ( expected Paths , Ġwait Message Millis , ĠDispatcher ()) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }