packagenet.postchain.somethignimportnet.postchain.base.SpecialTransactionPositionimportnet.postchain.common.BlockchainRidimportnet.postchain.core.BlockEContextimportnet.postchain.crypto.CryptoSystemimportnet.postchain.gtv.GtvDictionaryimportnet.postchain.gtv.GtvFactory.gtvimportnet.postchain.gtv.GtvNullimportnet.postchain.gtx.GTXModuleimportnet.postchain.gtx.GTXSpecialTxExtensionimportnet.postchain.gtx.OpDataimportnl.komponents.kovenant.Promiseimportnl.komponents.kovenant.taskimportorg.web3j.abi.datatypes.Boolimportjava.lang.Exceptionimportjava.lang.Thread.sleepclassExternalAuth:GTXSpecialTxExtension{overridefungetRelevantOps():Set<String>{returnsetOf("__auth")}lateinitvarmodule:GTXModuledataclassResponse(varresolved:Boolean,varauthorized:Booleanvartask:Promise<Unit,Exception>?)valpendingRequests=mutableMapOf<String,Response>()overridefuninit(module:GTXModule,blockchainRID:BlockchainRid,cs:CryptoSystem){this.module=module}overridefunneedsSpecialTransaction(position:SpecialTransactionPosition):Boolean{returnposition==SpecialTransactionPosition.Begin}funcallExternalService(id:String):Boolean{sleep(1000)returntrue}overridefuncreateSpecialOperations(position:SpecialTransactionPosition,bctx:BlockEContext):List<OpData>{if(position==SpecialTransactionPosition.Begin){valretval=mutableListOf<OpData>()valrqs=this.module.query(bctx,"get_auth_requests",GtvDictionary.build(mapOf()))for(rinrqs.asArray()){valrString=r.asString()valres=pendingRequests[rString]if(res!=null){if(res.resolved){retval.add(OpData("__auth",arrayOf(r,gtv(if(res.authorized)1else0))))}else{// otherwise we are waiting till it resolves}}else{valres=Response(false,false,null)pendingRequests[rString]=resres.task=task{valexternalResponse=callExternalService(rString)res.resolved=trueres.authorized=externalResponse}}}returnretval}elsereturnlistOf()}overridefunvalidateSpecialOperations(position:SpecialTransactionPosition,bctx:BlockEContext,ops:List<OpData>):Boolean{if(position==SpecialTransactionPosition.Begin){for(opinops){if(op.opName!="__auth")returnfalsevalrString=op.args[0].toString()valauthorized=op.args[1].asInteger()==1Lvalres=pendingRequests[rString]if(res!=null){if(!res.resolved)res.task!!.get()if(!res.resolved)returnfalse// ok it probably crashed, do something reasonable?if(res.authorized!=authorized)returnfalse}else{valext_authorized=callExternalService(rString)if(authorized!=ext_authorized)returnfalse}}}returntrue}}
Comments (0)
HTTPSSSH
You can clone a snippet to your computer for local editing.
Learn more.