Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- open class AsyncRoute<Request, Response> : Route<Request, Response>()
- {
- /**
- * Channel provided by client application while building routes. This is how application listens for any
- * responses generated by its routes.
- */
- protected open lateinit var responseChannel: SendChannel<Response>
- /**
- * Listens for any responses generated by this route's controller, then if they pass
- * any tests provided by this route, passes them back to client.
- */
- protected open val listener = actor<Response>(CommonPool)
- {
- for (response in channel) this@AsyncRoute.attemptRespondSuspend(response)
- }
- override fun getControllerInstance(): Controller<Response>
- {
- return super.getControllerInstance().apply { (this as? AsyncController<Response>)?.listen(listener) }
- }
- open suspend fun attemptRespondSuspend(response: Response)
- {
- if (canRespond(response)) responseChannel.send(response)
- }
- override fun attemptRespond(response: Response)
- {
- launch(CommonPool) { attemptRespondSuspend(response) }
- }
- /**
- * In case of application shut down, this method should be called to clean this route's listener.
- */
- open fun close()
- {
- listener.cancel()
- }
- override fun attemptTrigger(request: Request)
- {
- if (canTrigger(request))
- {
- callback(this, request)
- getCurrentControllerInstance().getResponses().forEach(this::attemptRespond)
- }
- else
- getCurrentControllerInstance().getResponses() // used to clean out and discard any responses if they were generated
- }
- /**
- * Returns an empty list, since it isn't necessary anymore.
- */
- override fun getResponses(): List<Response>
- {
- return listOf()
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement