package Ġcom . pb j . sdk . concrete Implementation . live Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . pb j . sdk . domain . live . Live Interactor Ċ import Ġcom . pb j . sdk . domain . live . Live Repository Ċ import Ġcom . pb j . sdk . domain . live . model .* Ċ import Ġcom . pb j . sdk . domain . onError CallBack Ċ import Ġcom . pb j . sdk . domain . on Result Ċ import Ġcom . t inder . sc ar let . WebSocket Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . filter NotNull Ċ import Ġtim ber . log . Tim ber Ċ Ċ internal Ġclass ĠLive Interactor Impl ( ĊĠĠĠ Ġoverride Ġval Ġlive Repository : ĠLive Repository Ċ ) Ġ: ĠLive Interactor Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġweb Socket Status : ĠWebSocket . Event ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval ĠerrorHandler Ġ= ĠCor outine ExceptionHandler Ġ{ Ġ_, Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠ ĠTim ber . e ( Log . get StackTrace String ( throwable )) ĊĠĠĠĠĠĠĠ Ġthrow Ġthrowable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠCor outine Scope ( Supervisor Job () Ġ+ ĠDispatch ers . IO Ġ+ ĠerrorHandler ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġopen WebSocket Connection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen WebSocket Connection () Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( web Socket Status Ġ! is ĠWebSocket . Event . On Connection Opened <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Repository . web Socket Connection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket Status Ġ= Ġit ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠWebSocket . Event . On Connection Opened <* >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Repository . join Real Time Live Stream Updates () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Live Streams ( ĊĠĠĠĠĠĠĠ ĠonError : Ġ(( Throwable ) Ġ-> ĠUnit )? , ĊĠĠĠĠĠĠĠ ĠonSuccess : Ġ(( Episode Response ?) Ġ-> ĠUnit )? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Repository . fetch Live Streams (). on Result ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ?. invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess ?. invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Live Streams Schedule ( ĊĠĠĠĠĠĠĠ Ġdate : ĠString ?, ĊĠĠĠĠĠĠĠ Ġdays A head : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġsize : ĠInt ?, ĊĠĠĠĠĠĠĠ ĠonError : Ġ(( Throwable ) Ġ-> ĠUnit )? , ĊĠĠĠĠĠĠĠ ĠonSuccess : Ġ(( Episode Response ?) Ġ-> ĠUnit )? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Repository . fetch Live Streams Schedule ( date , Ġdays A head , Ġsize ). on Result ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ?. invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess ?. invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Episode s Next Page ( ĊĠĠĠĠĠĠĠ Ġnext Page Url : ĠString , ĊĠĠĠĠĠĠĠ ĠonError : ĠonError CallBack ?, ĊĠĠĠĠĠĠĠ ĠonSuccess : Ġ(( Episode Response ?) Ġ-> ĠUnit )? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Repository . fetch Episode s Next Page ( next Page Url ). on Result ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ?. invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess ?. invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetCurrent Episode ( ĊĠĠĠĠĠĠĠ ĠonError : ĠonError CallBack ?, ĊĠĠĠĠĠĠĠ ĠonSuccess : Ġ(( Episode ?) Ġ-> ĠUnit )? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Repository . fetch Current Live Stream (). on Result ( onError , ĠonSuccess ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetCurrent Episode ( ĊĠĠĠĠĠĠĠ Ġshow Id : ĠString , ĊĠĠĠĠĠĠĠ ĠonError : ĠonError CallBack ?, ĊĠĠĠĠĠĠĠ ĠonSuccess : Ġ(( Episode ?) Ġ-> ĠUnit )? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Repository . fetch Current Live Stream ( show Id ). on Result ( onError , ĠonSuccess ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Show Public ( ĊĠĠĠĠĠĠĠ Ġshow Id : ĠString , ĊĠĠĠĠĠĠĠ ĠonError : ĠonError CallBack ?, ĊĠĠĠĠĠĠĠ ĠonSuccess : Ġ(( Show ?) Ġ-> ĠUnit )? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Repository . fetch Show Public ( show Id ). on Result ( onError , ĠonSuccess ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġregister For Real Time Live Stream Updates ( ĊĠĠĠĠĠĠĠ Ġon Result : Ġ(( Episode Status Update ) Ġ-> ĠUnit )? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Repository . register For Real Time Live Stream Updates () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Result ?. invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġleave Real Time Live Stream Updates () Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Repository . leave Real Time Live Stream Updates () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Broadcast Url ( ĊĠĠĠĠĠĠĠ Ġepisode : ĠEp isode , ĊĠĠĠĠĠĠĠ ĠonError : Ġ(( Throwable ) Ġ-> ĠUnit )? , ĊĠĠĠĠĠĠĠ ĠonSuccess : Ġ(( Broadcast Url ?) Ġ-> ĠUnit )? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Repository . fetch Broadcast Url ( episode ). on Result ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ?. invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess ?. invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsubscribe To Notifications For ( ĊĠĠĠĠĠĠĠ Ġepisode : ĠEp isode , ĊĠĠĠĠĠĠĠ ĠonError : Ġ(( Throwable ) Ġ-> ĠUnit )? , ĊĠĠĠĠĠĠĠ ĠonSuccess : Ġ(() Ġ-> ĠUnit )? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Repository . subscribe To Notifications For ( episode ). on Result ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ?. invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġun Subscribe From Notifications For ( ĊĠĠĠĠĠĠĠ Ġepisode : ĠEp isode , ĊĠĠĠĠĠĠĠ ĠonError : Ġ(( Throwable ) Ġ-> ĠUnit )? , ĊĠĠĠĠĠĠĠ ĠonSuccess : Ġ(() Ġ-> ĠUnit )? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Repository . un Subscribe From Notifications For ( episode ). on Result ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ?. invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ