/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġ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 . squareup . workflow Ċ Ċ import Ġcom . squareup . workflow . Workflow Interceptor . Workflow Session Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ Ċ /** Ċ Ġ* ĠProvides Ġhooks Ġinto Ġthe Ġworkflow Ġruntime Ġthat Ġcan Ġbe Ġused Ġto Ġinstrument Ġor Ġmodify Ġthe Ġbehavior Ċ Ġ* Ġof Ġworkflows . Ċ Ġ* Ċ Ġ* ĠThis Ġinterface 's Ġmethods Ġmirror Ġthe Ġmethods Ġof Ġ[ State ful Workflow ]. ĠIt Ġalso Ġhas Ġone Ġadditional Ċ Ġ* Ġmethod , Ġ[ on Session Started ], Ġthat Ġis Ġnotified Ġwhen Ġa Ġworkflow Ġis Ġstarted . ĠEach Ġmethod Ġreturns Ġthe Ċ Ġ* Ġsame Ġthing Ġas Ġthe Ġcorresponding Ġmethod Ġon Ġ[ State ful Workflow ], Ġand Ġreceives Ġthe Ġsame Ġparameters Ċ Ġ* Ġas Ġwell Ġas Ġtwo Ġextra Ġparameters : Ċ Ġ* Ċ Ġ* Ġ Ġ- Ġ**` proceed `** ĠâĢĵ ĠA Ġfunction Ġthat Ġ_ exact ly _ Ġmir rors Ġthe Ġcorresponding Ġfunction Ġon Ċ Ġ* ĠĠĠ Ġ[ State ful Workflow ], Ġaccepting Ġthe Ġsame Ġparameters Ġand Ġreturning Ġthe Ġsame Ġthing . ĠAn Ġinterceptor Ċ Ġ* ĠĠĠ Ġcan Ġcall Ġthis Ġfunction Ġto Ġrun Ġthe Ġactual Ġworkflow , Ġbut Ġit Ġmay Ġalso Ġdecide Ġto Ġnot Ġcall Ġit Ġat Ċ Ġ* ĠĠĠ Ġall , Ġor Ġcall Ġit Ġmultiple Ġtimes . Ċ Ġ* Ġ Ġ- Ġ**` session `** ĠâĢĵ ĠA Ġ[ Workflow Session ] Ġobject Ġthat Ġcan Ġbe Ġqueried Ġfor Ġinformation Ġabout Ġthe Ċ Ġ* ĠĠĠ Ġworkflow Ġbeing Ġintercept ed . Ċ Ġ* Ċ Ġ* ĠAll Ġmethods Ġhave Ġdefault Ġno - op Ġimplementations . Ċ Ġ* Ċ Ġ* Ġ## ĠWorkflow Ġsessions Ċ Ġ* Ċ Ġ* ĠA Ġsingle Ġworkflow Ġmay Ġbe Ġrendered Ġby Ġdifferent Ġparents Ġat Ġthe Ġsame Ġtime , Ġor Ġthe Ġsame Ġparent Ġat Ċ Ġ* Ġdifferent , Ġdis joint Ġtimes . ĠEach Ġcontinuous Ġsequence Ġof Ġrender ings Ġof Ġa Ġparticular Ġworkflow Ġtype , Ċ Ġ* Ġwith Ġthe Ġsame Ġkey Ġpassed Ġto Ġ[ Render Context . render Child ], Ġis Ġcalled Ġan Ġ" session " Ġof Ġthat Ċ Ġ* Ġworkflow . ĠThe Ġworkflow 's Ġ[ State ful Workflow . initialState ] Ġmethod Ġwill Ġbe Ġcalled Ġat Ġthe Ġstart Ġof Ċ Ġ* Ġthe Ġsession , Ġand Ġits Ġstate Ġwill Ġbe Ġmaintained Ġby Ġthe Ġruntime Ġuntil Ġthe Ġsession Ġis Ġfinished . Ċ Ġ* ĠEach Ġsession Ġis Ġidentified Ġby Ġthe Ġ[ Workflow Session ] Ġobject Ġpassed Ġinto Ġthe Ġcorresponding Ġmethod Ċ Ġ* Ġin Ġa Ġ[ Workflow Interceptor ]. Ċ Ġ* Ċ Ġ* ĠIn Ġaddition Ġto Ġthe Ġ[ Workflow Identifier ] Ġof Ġthe Ġtype Ġof Ġthe Ġworkflow Ġbeing Ġrendered , Ġthis Ġobject Ċ Ġ* Ġalso Ġknows Ġthe Ġ[ key ][ Workflow Session . render Key ] Ġused Ġto Ġrender Ġthe Ġworkflow Ġand Ġthe Ċ Ġ* Ġ[ Workflow Session ] Ġof Ġthe Ġ[ parent ][ Workflow Session . parent ] Ġworkflow Ġthat Ġis Ġrendering Ġit . Ċ Ġ* Ċ Ġ* ĠEach Ġsession Ġis Ġalso Ġassigned Ġa Ġnumerical ĠID Ġthat Ġuniquely Ġidentifies Ġthe Ġsession Ġover Ġthe Ċ Ġ* Ġlife Ġof Ġthe Ġentire Ġruntime . ĠThis Ġvalue Ġwill Ġremain Ġconstant Ġas Ġlong Ġas Ġthe Ġworkflow 's Ġparent Ġis Ċ Ġ* Ġrendering Ġit , Ġand Ġthen Ġit Ġwill Ġnever Ġbe Ġused Ġagain . ĠIf Ġthis Ġworkflow Ġstops Ġbeing Ġrendered , Ġand Ċ Ġ* Ġthen Ġstarts Ġagain , Ġthe Ġvalue Ġwill Ġbe Ġdifferent . Ċ Ġ*/ Ċ @ Experimental Workflow Api Ċ interface ĠWorkflow Interceptor Ġ{ ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġsession Ġis Ġstarting , Ġbefore Ġ[ on InitialState ]. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġworkflow Scope ĠThe Ġ[ Coroutine Scope ] Ġthat Ġwill Ġbe Ġused Ġfor Ġany Ġside Ġeffects Ġthe Ġworkflow ĊĠĠ Ġ* Ġruns , Ġas Ġwell Ġas Ġthe Ġparent Ġfor Ġany Ġworkflows Ġit Ġrenders . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġon Session Started ( ĊĠĠĠ Ġworkflow Scope : ĠCor outine Scope , ĊĠĠĠ Ġsession : ĠWorkflow Session ĊĠ Ġ) Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠInter cept s Ġcalls Ġto Ġ[ State ful Workflow . initialState ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġ< P , ĠS > Ġon InitialState ( ĊĠĠĠ Ġprops : ĠP , ĊĠĠĠ Ġsnapshot : ĠSnapshot ?, ĊĠĠĠ Ġproceed : Ġ( P , ĠSnapshot ?) Ġ-> ĠS , ĊĠĠĠ Ġsession : ĠWorkflow Session ĊĠ Ġ): ĠS Ġ= Ġproceed ( props , Ġsnapshot ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠInter cept s Ġcalls Ġto Ġ[ State ful Workflow . on Props Changed ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġ< P , ĠS > Ġon Props Changed ( ĊĠĠĠ Ġold : ĠP , ĊĠĠĠ Ġnew : ĠP , ĊĠĠĠ Ġstate : ĠS , ĊĠĠĠ Ġproceed : Ġ( P , ĠP , ĠS ) Ġ-> ĠS , ĊĠĠĠ Ġsession : ĠWorkflow Session ĊĠ Ġ): ĠS Ġ= Ġproceed ( old , Ġnew , Ġstate ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠInter cept s Ġcalls Ġto Ġ[ State ful Workflow . render ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġ< P , ĠS , ĠO , ĠR > Ġon Render ( ĊĠĠĠ Ġprops : ĠP , ĊĠĠĠ Ġstate : ĠS , ĊĠĠĠ Ġcontext : ĠRender Context < P , ĠS , ĠO >, ĊĠĠĠ Ġproceed : Ġ( P , ĠS , ĠRender Context < P , ĠS , ĠO >) Ġ-> ĠR , ĊĠĠĠ Ġsession : ĠWorkflow Session ĊĠ Ġ): ĠR Ġ= Ġproceed ( props , Ġstate , Ġcontext ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠInter cept s Ġcalls Ġto Ġ[ State ful Workflow . snapshot State ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġ< S > Ġon Snapshot State ( ĊĠĠĠ Ġstate : ĠS , ĊĠĠĠ Ġproceed : Ġ( S ) Ġ-> ĠSnapshot ?, ĊĠĠĠ Ġsession : ĠWorkflow Session ĊĠ Ġ): ĠSnapshot ? Ġ= Ġproceed ( state ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠInformation Ġabout Ġthe Ġsession Ġof Ġa Ġworkflow Ġin Ġthe Ġruntime Ġthat Ġa Ġ[ Workflow Interceptor ] Ġmethod ĊĠĠ Ġ* Ġis Ġintercept ing . ĊĠĠ Ġ*/ ĊĠ Ġ@ Experimental Workflow Api ĊĠ Ġinterface ĠWorkflow Session Ġ{ ĊĠĠĠ Ġ/** ĠThe Ġ[ Workflow Identifier ] Ġthat Ġrepresents Ġthe Ġtype Ġof Ġthis Ġworkflow . Ġ*/ ĊĠĠĠ Ġval Ġidentifier : ĠWorkflow Identifier ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġstring Ġkey Ġargument Ġthat Ġwas Ġpassed Ġto Ġ[ Render Context . render Child ] Ġto Ġrender Ġthis ĊĠĠĠĠ Ġ* Ġworkflow . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġrender Key : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġunique Ġvalue Ġthat Ġidentifies Ġthe Ġcurrently - running Ġsession Ġof Ġthis Ġworkflow Ġin Ġthe ĊĠĠĠĠ Ġ* Ġruntime . ĠSee Ġthe Ġdocumentation Ġon Ġ[ Workflow Interceptor ] Ġfor Ġmore Ġinformation Ġabout Ġwhat Ġthis ĊĠĠĠĠ Ġ* Ġvalue Ġrepresents . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval ĠsessionId : ĠLong ĊĊĠĠĠ Ġ/** ĠThe Ġparent Ġ[ Workflow Session ] Ġof Ġthis Ġworkflow , Ġor Ġnull Ġif Ġthis Ġis Ġthe Ġroot Ġworkflow . Ġ*/ ĊĠĠĠ Ġval Ġparent : ĠWorkflow Session ? ĊĠ Ġ} Ċ } Ċ Ċ /** ĠA Ġ[ Workflow Interceptor ] Ġthat Ġdoes Ġnot Ġintercept Ġanything . Ġ*/ Ċ @ Experimental Workflow Api Ċ object ĠNo op Workflow Interceptor Ġ: ĠWorkflow Interceptor Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġ[ State ful Workflow ] Ġthat Ġwill Ġintercept Ġall Ġcalls Ġto Ġ[ workflow ] Ġvia Ġthis Ċ Ġ* Ġ[ Workflow Interceptor ]. Ċ Ġ*/ Ċ @ Opt In ( Experimental Workflow Api :: class ) Ċ internal Ġfun Ġ< P , ĠS , ĠO , ĠR > ĠWorkflow Interceptor . intercept ( ĊĠ Ġworkflow : ĠStateful Workflow < P , ĠS , ĠO , ĠR >, ĊĠ Ġworkflow Session : ĠWorkflow Session Ċ ): ĠStateful Workflow < P , ĠS , ĠO , ĠR > Ġ= Ġif Ġ( this Ġ=== ĠNo op Workflow Interceptor ) Ġ{ ĊĠ Ġworkflow Ċ } Ġelse Ġ{ ĊĠ Ġobject Ġ: ĠStateful Workflow < P , ĠS , ĠO , ĠR >() Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠinitialState ( ĊĠĠĠĠĠ Ġprops : ĠP , ĊĠĠĠĠĠ Ġsnapshot : ĠSnapshot ? ĊĠĠĠ Ġ): ĠS Ġ= Ġon InitialState ( props , Ġsnapshot , Ġworkflow :: initialState , Ġworkflow Session ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Props Changed ( ĊĠĠĠĠĠ Ġold : ĠP , ĊĠĠĠĠĠ Ġnew : ĠP , ĊĠĠĠĠĠ Ġstate : ĠS ĊĠĠĠ Ġ): ĠS Ġ= Ġon Props Changed ( old , Ġnew , Ġstate , Ġworkflow :: on Props Changed , Ġworkflow Session ) ĊĊĠĠĠ Ġoverride Ġfun Ġrender ( ĊĠĠĠĠĠ Ġprops : ĠP , ĊĠĠĠĠĠ Ġstate : ĠS , ĊĠĠĠĠĠ Ġcontext : ĠRender Context < P , ĠS , ĠO > ĊĠĠĠ Ġ): ĠR Ġ= Ġon Render ( props , Ġstate , Ġcontext , Ġworkflow :: render , Ġworkflow Session ) ĊĊĠĠĠ Ġoverride Ġfun Ġsnapshot State ( state : ĠS ) Ġ= ĊĠĠĠĠĠ Ġon Snapshot State ( state , Ġworkflow :: snapshot State , Ġworkflow Session ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Intercept ed Workflow ($ workflow , Ġ$ this @ intercept )" ĊĠ Ġ} Ċ } Ċ