package Ġio . live kit . android . room . util Ċ Ċ import Ġio . live kit . android . util . Either Ċ import Ġorg . webrtc . Media Constraints Ċ import Ġorg . webrtc . Peer Connection Ċ import Ġorg . webrtc . S dp Observer Ċ import Ġorg . webrtc . Session Description Ċ import Ġkotlin . coroutines . Continuation Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ Ċ open Ġclass ĠCor outine S dp Observer Ġ: ĠS dp Observer Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcreate Outcome : ĠEither < Session Description , ĠString ?> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcont s Ġ= Ġpending Create . toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Create . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġpending Create Ġ= Ġmutable ListOf < Continuation < Either < Session Description , ĠString ? >> >() ĊĊĠĠĠ Ġprivate Ġvar Ġset Outcome : ĠEither < Unit , ĠString ?> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcont s Ġ= Ġpending Sets . toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Sets . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġpending Sets Ġ= Ġmutable ListOf < Continuation < Either < Unit , ĠString ? >> >() ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Success ( sdp : ĠSession Description ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Outcome Ġ= Ġif Ġ( sdp Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . Right (" empty Ġs dp ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . Left ( sdp ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Set Success () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Outcome Ġ= ĠEither . Left ( Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Failure ( message : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Outcome Ġ= ĠEither . Right ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Set Failure ( message : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Outcome Ġ= ĠEither . Right ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġawait Create () Ġ= Ġsuspend Coroutine < Either < Session Description , ĠString ? >> Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġcur Outcome Ġ= Ġcreate Outcome ĊĠĠĠĠĠĠĠ Ġif Ġ( cur Outcome Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( cur Outcome ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Create . add ( cont ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġawait Set () Ġ= Ġsuspend Coroutine < Either < Unit , ĠString ? >> Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġcur Outcome Ġ= Ġset Outcome ĊĠĠĠĠĠĠĠ Ġif Ġ( cur Outcome Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( cur Outcome ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Sets . add ( cont ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun ĠPeer Connection . create Offer ( constraints : ĠMedia Constraints ): ĠEither < Session Description , ĠString ?> Ġ{ ĊĠĠĠ Ġval Ġobserver Ġ= ĠCor outine S dp Observer () ĊĠĠĠ Ġthis . create Offer ( observer , Ġconstraints ) ĊĠĠĠ Ġreturn Ġobserver . await Create () Ċ } Ċ Ċ suspend Ġfun ĠPeer Connection . create Answer ( constraints : ĠMedia Constraints ): ĠEither < Session Description , ĠString ?> Ġ{ ĊĠĠĠ Ġval Ġobserver Ġ= ĠCor outine S dp Observer () ĊĠĠĠ Ġthis . create Answer ( observer , Ġconstraints ) ĊĠĠĠ Ġreturn Ġobserver . await Create () Ċ } Ċ Ċ suspend Ġfun ĠPeer Connection . set Remote Description ( description : ĠSession Description ): ĠEither < Unit , ĠString ?> Ġ{ ĊĠĠĠ Ġval Ġobserver Ġ= ĠCor outine S dp Observer () ĊĠĠĠ Ġthis . set Remote Description ( observer , Ġdescription ) ĊĠĠĠ Ġreturn Ġobserver . await Set () Ċ } Ċ Ċ suspend Ġfun ĠPeer Connection . set Local Description ( description : ĠSession Description ): ĠEither < Unit , ĠString ?> Ġ{ ĊĠĠĠ Ġval Ġobserver Ġ= ĠCor outine S dp Observer () ĊĠĠĠ Ġthis . set Local Description ( observer , Ġdescription ) ĊĠĠĠ Ġreturn Ġobserver . await Set () Ċ }