/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "). Ċ Ġ* ĠYou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠLicense Ġis Ġlocated Ġat Ċ Ġ* Ċ Ġ* Ġ Ġhttp :// aws . amazon . com / apache 2 . 0 Ċ Ġ* Ċ Ġ* Ġor Ġin Ġthe Ġ" license " Ġfile Ġaccompanying Ġthis Ġfile . ĠThis Ġfile Ġis Ġdistributed Ċ Ġ* Ġon Ġan Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ċ Ġ* Ġexpress Ġor Ġimplied . ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ċ Ġ* Ġpermissions Ġand Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . amazonaws . amplify . amplify _ api . auth Ċ Ċ import Ġandroid . os . Looper Ċ import Ġcom . amazonaws . amplify . amplify _ core . exception . Exception Messages Ċ import Ġcom . amplify framework . api . ApiException Ċ import Ġcom . amplify framework . api . aws . Api Auth Providers Ċ import Ġcom . amplify framework . api . aws . Authorization Type Ċ import Ġcom . amplify framework . api . aws . sig v 4 . Function Auth Provider Ċ import Ġcom . amplify framework . api . aws . sig v 4 . Oid c Auth Provider Ċ import Ġio . flutter . Log Ċ import Ġio . flutter . plugin . common . Method Channel Ċ import Ġkotlinx . coroutines .* Ċ Ċ /** Ċ Ġ* ĠMan ages Ġthe Ġshared Ġstate Ġof Ġall Ġ[ Flutter Auth Provider ] Ġinstances . Ċ Ġ*/ Ċ class ĠFlutter Auth Providers ( ĊĠĠĠ Ġprivate Ġval Ġauth Providers : ĠList < Authorization Type >, ĊĠĠĠ Ġprivate Ġval Ġmethod Channel : ĠMethod Channel Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠTimeout Ġon Ġa Ġsingle Ġ[ getToken ] Ġcall . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠgetToken Timeout Millis Ġ= Ġ 2 0 0 0 L ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLogger Ġtag . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġtag Ġ= Ġ" Flutter Auth Providers " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠName Ġfor Ġsus pending Ġblock Ġin Ġ[ getToken ]. ĠUsed Ġfor Ġdebugging ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġcoroutine Name Ġ= ĠCor outine Name ( tag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġfactory Ġof Ġ[ Flutter Auth Provider ] Ġinstances . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġfactory : ĠApi Auth Providers Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauth Providers Ġ= Ġthis . auth Providers . toSet () ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠApi Auth Providers . Builder () ĊĠĠĠĠĠĠĠ Ġif Ġ( auth Providers . contains ( Authorization Type . AWS _ L AMBDA )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . function Auth Provider ( Flutter Auth Provider ( this , ĠAuthorization Type . AWS _ L AMBDA )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( auth Providers . contains ( Authorization Type . OPEN ID _ CONNECT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . oidc Auth Provider ( Flutter Auth Provider ( this , ĠAuthorization Type . OPEN ID _ CONNECT )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġthe Ġtoken Ġfor Ġ[ auth Type ] Ġor Ġ` null `, Ġif Ġunavailable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġis Ġtypically Ġcalled Ġfrom Ġwithin Ġthe ĠAmp lify Ġlibrary Ġand Ġfrom Ġa Ġthread Ġbes ides ĊĠĠĠĠ Ġ* Ġthe Ġmain Ġone , Ġwhere Ġit Ġis Ġsafe Ġto Ġblock . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetToken ( auth Type : ĠAuthorization Type ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNot Ġblocking Ġthe Ġmain Ġthread Ġis Ġrequired Ġfor Ġmaking Ġplatform Ġchannel Ġcalls Ġwithout ĊĠĠĠĠĠĠĠ Ġ// Ġdead lock . ĊĠĠĠĠĠĠĠ Ġif Ġ( Thread . currentThread () Ġ== ĠL ooper . get Main Looper (). thread ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( tag , ĠException Messages . create Github Issue String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrun Blocking ( coroutine Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomp leter Ġ= ĠJob () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġobject Ġ: ĠMethod Channel . Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtoken : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsuccess ( result : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġresult Ġas ? ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomp leter . complete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġerror ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Details : ĠAny ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomp leter . complete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnot Implemented () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomp leter . complete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Channel . invoke Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" get Latest AuthToken ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Type . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Timeout ( getToken Timeout Millis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomp leter . join () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Blocking Ġresult . token ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( tag , Ġ" Exception Ġin ĠgetToken ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġprovider Ġwhich Ġmanages Ġtoken Ġretrieval Ġfor Ġits Ġ[ Authorization Type ]. Ċ Ġ*/ Ċ class ĠFlutter Auth Provider ( ĊĠĠĠ Ġprivate Ġval Ġprovider : ĠFlutter Auth Providers , ĊĠĠĠ Ġprivate Ġval Ġtype : ĠAuthorization Type Ċ ) Ġ: ĠFunction Auth Provider , ĊĠĠĠ ĠO id c Auth Provider Ġ{ ĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThrow n Ġwhen Ġthere Ġis Ġno Ġtoken Ġavailable Ġfor Ġ[ type ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġno Token Available ( type : ĠAuthorization Type ) Ġ= ĠApiException . Api Auth Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġretrieve Ġtoken Ġfor Ġ$ type ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMake Ġsure Ġyou Ġregister Ġyour Ġauth Ġproviders Ġin Ġthe Ġadd Plugin Ġcall Ġand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthat Ġget Latest AuthToken Ġreturns Ġa Ġvalue . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Latest AuthToken (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġprovider . getToken ( type ) Ġ?: Ġthrow Ġno Token Available ( type ) Ċ }