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 5f248f28..0bbde482 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt @@ -42,6 +42,7 @@ class AccessHandler( "SubscribeTxStatus" -> processSubscribeTxStatus(call, headers, next) "GetBalance" -> processSubscribeBalance(call, headers, next, false) "NativeCall" -> processNativeCall(call, headers, next) + "Describe" -> processDescribe(call, headers, next) else -> { log.trace("unsupported method `{}`", method) next.startCall(call, headers) @@ -117,6 +118,25 @@ class AccessHandler( } as ServerCall.Listener } + @Suppress("UNCHECKED_CAST") + private fun processDescribe( + call: ServerCall, + headers: Metadata, + next: ServerCallHandler + ): ServerCall.Listener { + val builder = EventsBuilder.Describe() + .start(headers, call.attributes) + + val callWrapper: ServerCall = OnDescribeResponse( + call as ServerCall, + builder, + accessLogWriter + ) as ServerCall + return OnDescribeRequest( + next.startCall(callWrapper, headers) as ServerCall.Listener, + builder) as ServerCall.Listener + } + class OnSubscribeHead( val next: ServerCall.Listener, val builder: EventsBuilder.SubscribeHead @@ -193,6 +213,20 @@ class AccessHandler( } } + class OnDescribeRequest( + val next: ServerCall.Listener, + val builder: EventsBuilder.Describe + ) : ForwardingServerCallListener() { + + override fun onMessage(message: BlockchainOuterClass.DescribeRequest) { + super.onMessage(message) + } + + override fun delegate(): ServerCall.Listener { + return next + } + } + abstract class BaseCallResponse( val next: ServerCall ) : ForwardingServerCall() { @@ -258,4 +292,17 @@ class AccessHandler( super.sendMessage(message) } } + + class OnDescribeResponse( + next: ServerCall, + val builder: EventsBuilder.Describe, + val accessLogWriter: AccessLogWriter + ) : BaseCallResponse(next) { + + override fun sendMessage(message: BlockchainOuterClass.DescribeResponse) { + val event = builder.onReply() + 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 dd757c25..5a38ae05 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/Events.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/Events.kt @@ -28,14 +28,15 @@ class Events { } abstract class Base( - val id: UUID + val id: UUID, + val method: String ) { val ts = Instant.now() } abstract class ChainBase( - val blockchain: Chain, val method: String, id: UUID - ) : Base(id) + val blockchain: Chain, method: String, id: UUID + ) : Base(id, method) @JsonInclude(JsonInclude.Include.NON_NULL) class SubscribeHead( @@ -95,6 +96,12 @@ class Events { val nativeCall: NativeCallItemDetails ) : ChainBase(blockchain, "NativeCall", id) + @JsonInclude(JsonInclude.Include.NON_NULL) + class Describe( + id: UUID, + val request: StreamRequestDetails + ) : Base(id, "Describe") + data class StreamRequestDetails( val id: UUID, val start: Instant, 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 e3a88991..d29218ee 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt @@ -227,4 +227,19 @@ class EventsBuilder { } } } + + class Describe : Base() { + + override fun getT(): Describe { + return this + } + + fun onReply(): Events.Describe { + return Events.Describe( + id = UUID.randomUUID(), + request = requestDetails + ) + } + } + } \ No newline at end of file