From 50a7177e6a81f817f23074b6295dcaddc786f35c Mon Sep 17 00:00:00 2001 From: Igor Artamonov Date: Sat, 3 Jul 2021 22:32:46 -0400 Subject: [PATCH] solution: access logging for SubscribeTxStatus method --- .../monitoring/accesslog/AccessHandler.kt | 45 +++++++++++++++++++ .../dshackle/monitoring/accesslog/Events.kt | 18 ++++++++ .../monitoring/accesslog/EventsBuilder.kt | 23 ++++++++++ 3 files changed, 86 insertions(+) diff --git a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt index 19df1a9e..5f248f28 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt @@ -39,6 +39,7 @@ class AccessHandler( return when (val method = call.methodDescriptor.bareMethodName) { "SubscribeHead" -> processSubscribeHead(call, headers, next) "SubscribeBalance" -> processSubscribeBalance(call, headers, next, true) + "SubscribeTxStatus" -> processSubscribeTxStatus(call, headers, next) "GetBalance" -> processSubscribeBalance(call, headers, next, false) "NativeCall" -> processNativeCall(call, headers, next) else -> { @@ -81,6 +82,22 @@ class AccessHandler( ) as ServerCall.Listener } + @Suppress("UNCHECKED_CAST") + private fun processSubscribeTxStatus( + call: ServerCall, + headers: Metadata, + next: ServerCallHandler + ): ServerCall.Listener { + val builder = EventsBuilder.TxStatus() + .start(headers, call.attributes) + val callWrapper: ServerCall = OnTxStatusResponse( + call as ServerCall, builder, accessLogWriter) as ServerCall + return OnSubscribeTxStatus( + next.startCall(callWrapper, headers) as ServerCall.Listener, + builder + ) as ServerCall.Listener + } + @Suppress("UNCHECKED_CAST") private fun processNativeCall( call: ServerCall, @@ -131,6 +148,21 @@ class AccessHandler( } } + class OnSubscribeTxStatus( + val next: ServerCall.Listener, + val builder: EventsBuilder.TxStatus + ) : ForwardingServerCallListener() { + + override fun onMessage(message: BlockchainOuterClass.TxStatusRequest) { + builder.withRequest(message) + super.onMessage(message) + } + + override fun delegate(): ServerCall.Listener { + return next + } + } + class OnNativeCall( val next: ServerCall.Listener, val builder: EventsBuilder.NativeCall, @@ -213,4 +245,17 @@ class AccessHandler( super.sendMessage(message) } } + + class OnTxStatusResponse( + next: ServerCall, + val builder: EventsBuilder.TxStatus, + val accessLogWriter: AccessLogWriter + ) : BaseCallResponse(next) { + + override fun sendMessage(message: BlockchainOuterClass.TxStatus) { + val event = builder.onReply(message) + accessLogWriter.submit(event) + super.sendMessage(message) + } + } } \ No newline at end of file diff --git a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/Events.kt b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/Events.kt index 40daaf83..dd757c25 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/Events.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/Events.kt @@ -57,6 +57,24 @@ class Events { val index: Int ) : ChainBase(blockchain, if (subscribe) "SubscribeBalance" else "GetBalance", id) + @JsonInclude(JsonInclude.Include.NON_NULL) + class TxStatus( + blockchain: Chain, id: UUID, + val request: StreamRequestDetails, + val txStatusRequest: TxStatusRequest, + val txStatus: TxStatusResponse, + // index of the current response + val index: Int + ) : ChainBase(blockchain, "SubscribeTxStatus", id) + + data class TxStatusRequest( + val txId: String + ) + + data class TxStatusResponse( + val confirmations: Int + ) + @JsonInclude(JsonInclude.Include.NON_NULL) class NativeCall( blockchain: Chain, id: UUID, diff --git a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt index b0d7d309..e3a88991 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt @@ -160,6 +160,29 @@ class EventsBuilder { } } + class TxStatus() : Base() { + private var index = 0 + private var txStatusRequest: Events.TxStatusRequest? = null + + fun withRequest(req: BlockchainOuterClass.TxStatusRequest): TxStatus { + this.txStatusRequest = Events.TxStatusRequest(req.txId) + return withChain(req.chainValue) + } + + fun onReply(resp: BlockchainOuterClass.TxStatus): Events.TxStatus { + return Events.TxStatus( + chain, UUID.randomUUID(), requestDetails, txStatusRequest!!, + Events.TxStatusResponse(resp.confirmations), + index++ + ) + } + + override fun getT(): TxStatus { + return this + } + + } + class NativeCall : Base() { val items = ArrayList() val replies = HashMap()