solution: access logging for SubscribeStatus method
This commit is contained in:
@@ -43,8 +43,9 @@ class AccessHandler(
|
||||
"GetBalance" -> processSubscribeBalance(call, headers, next, false)
|
||||
"NativeCall" -> processNativeCall(call, headers, next)
|
||||
"Describe" -> processDescribe(call, headers, next)
|
||||
"SubscribeStatus" -> processStatus(call, headers, next)
|
||||
else -> {
|
||||
log.trace("unsupported method `{}`", method)
|
||||
log.warn("unsupported method `{}`", method)
|
||||
next.startCall(call, headers)
|
||||
}
|
||||
}
|
||||
@@ -137,6 +138,25 @@ class AccessHandler(
|
||||
builder) as ServerCall.Listener<ReqT>
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
private fun <ReqT : Any, RespT : Any> processStatus(
|
||||
call: ServerCall<ReqT, RespT>,
|
||||
headers: Metadata,
|
||||
next: ServerCallHandler<ReqT, RespT>
|
||||
): ServerCall.Listener<ReqT> {
|
||||
val builder = EventsBuilder.Status()
|
||||
.start(headers, call.attributes)
|
||||
|
||||
val callWrapper: ServerCall<ReqT, RespT> = OnStatusResponse(
|
||||
call as ServerCall<BlockchainOuterClass.StatusRequest, BlockchainOuterClass.ChainStatus>,
|
||||
builder,
|
||||
accessLogWriter
|
||||
) as ServerCall<ReqT, RespT>
|
||||
return OnStatusRequest(
|
||||
next.startCall(callWrapper, headers) as ServerCall.Listener<BlockchainOuterClass.StatusRequest>,
|
||||
builder) as ServerCall.Listener<ReqT>
|
||||
}
|
||||
|
||||
class OnSubscribeHead(
|
||||
val next: ServerCall.Listener<Common.Chain>,
|
||||
val builder: EventsBuilder.SubscribeHead
|
||||
@@ -227,6 +247,20 @@ class AccessHandler(
|
||||
}
|
||||
}
|
||||
|
||||
class OnStatusRequest(
|
||||
val next: ServerCall.Listener<BlockchainOuterClass.StatusRequest>,
|
||||
val builder: EventsBuilder.Status
|
||||
) : ForwardingServerCallListener<BlockchainOuterClass.StatusRequest>() {
|
||||
|
||||
override fun onMessage(message: BlockchainOuterClass.StatusRequest) {
|
||||
super.onMessage(message)
|
||||
}
|
||||
|
||||
override fun delegate(): ServerCall.Listener<BlockchainOuterClass.StatusRequest> {
|
||||
return next
|
||||
}
|
||||
}
|
||||
|
||||
abstract class BaseCallResponse<ReqT : Any, RespT : Any>(
|
||||
val next: ServerCall<ReqT, RespT>
|
||||
) : ForwardingServerCall<ReqT, RespT>() {
|
||||
@@ -305,4 +339,17 @@ class AccessHandler(
|
||||
super.sendMessage(message)
|
||||
}
|
||||
}
|
||||
|
||||
class OnStatusResponse(
|
||||
next: ServerCall<BlockchainOuterClass.StatusRequest, BlockchainOuterClass.ChainStatus>,
|
||||
val builder: EventsBuilder.Status,
|
||||
val accessLogWriter: AccessLogWriter
|
||||
) : BaseCallResponse<BlockchainOuterClass.StatusRequest, BlockchainOuterClass.ChainStatus>(next) {
|
||||
|
||||
override fun sendMessage(message: BlockchainOuterClass.ChainStatus) {
|
||||
val event = builder.onReply(message)
|
||||
accessLogWriter.submit(event)
|
||||
super.sendMessage(message)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -102,6 +102,12 @@ class Events {
|
||||
val request: StreamRequestDetails
|
||||
) : Base(id, "Describe")
|
||||
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
class Status(
|
||||
blockchain: Chain, id: UUID,
|
||||
val request: StreamRequestDetails
|
||||
) : ChainBase(blockchain, "Status", id)
|
||||
|
||||
data class StreamRequestDetails(
|
||||
val id: UUID,
|
||||
val start: Instant,
|
||||
|
||||
@@ -242,4 +242,19 @@ class EventsBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
class Status : Base<Status>() {
|
||||
override fun getT(): Status {
|
||||
return this
|
||||
}
|
||||
|
||||
fun onReply(message: BlockchainOuterClass.ChainStatus): Events.Status {
|
||||
val chain = Chain.byId(message.chainValue)
|
||||
return Events.Status(
|
||||
blockchain = chain,
|
||||
request = requestDetails,
|
||||
id = UUID.randomUUID()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user