Skip to content

Commit

Permalink
Improve API plugin support (#1819)
Browse files Browse the repository at this point in the history
Move `onKit` before `startApiServiceIfEnabled`.
This allows plugins to properly initialize before providing their routes.
  • Loading branch information
akumaigorodski committed May 25, 2021
1 parent 9a20aad commit d437ea1
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 8 deletions.
6 changes: 2 additions & 4 deletions eclair-node/src/main/scala/fr/acinq/eclair/Boot.scala
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import java.io.File

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.server.Route
import akka.stream.BindFailedException
import fr.acinq.eclair.api.Service
import grizzled.slf4j.Logging
Expand Down Expand Up @@ -51,9 +50,9 @@ object Boot extends App with Logging {
plugins.foreach(_.onSetup(setup))
setup.bootstrap onComplete {
case Success(kit) =>
plugins.foreach(_.onKit(kit))
val routeProviderPlugins = plugins.collect { case plugin: RouteProvider => plugin }
startApiServiceIfEnabled(kit, routeProviderPlugins)
plugins.foreach(_.onKit(kit))
case Failure(t) => onError(t)
}
} catch {
Expand All @@ -80,8 +79,7 @@ object Boot extends App with Logging {
override val password: String = apiPassword
override val eclairApi: Eclair = new EclairImpl(kit)
}
val pluginRoutes = providers.map(_.route(service))
Http().bindAndHandle(service.finalRoutes(pluginRoutes), config.getString("api.binding-ip"), config.getInt("api.port")).recover {
Http().newServerAt(config.getString("api.binding-ip"), config.getInt("api.port")).bindFlow(service.finalRoutes(providers)).recover {
case _: BindFailedException => onError(TCPBindException(config.getInt("api.port")))
}
} else {
Expand Down
7 changes: 4 additions & 3 deletions eclair-node/src/main/scala/fr/acinq/eclair/api/Service.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ package fr.acinq.eclair.api

import akka.actor.ActorSystem
import akka.http.scaladsl.server._
import fr.acinq.eclair.Eclair
import fr.acinq.eclair.{Eclair, RouteProvider}
import fr.acinq.eclair.api.directives.EclairDirectives
import fr.acinq.eclair.api.handlers._
import grizzled.slf4j.Logging
Expand All @@ -45,7 +45,8 @@ trait Service extends EclairDirectives with WebSocket with Node with Channel wit
* This is the main entrypoint for the global http request router of the API service.
* This is where we handle errors to ensure all routes are correctly tried before rejecting.
*/
def finalRoutes(extraRoutes: Seq[Route]): Route = securedHandler {
extraRoutes.foldLeft(nodeRoutes ~ channelRoutes ~ feeRoutes ~ pathFindingRoutes ~ invoiceRoutes ~ paymentRoutes ~ messageRoutes ~ onChainRoutes ~ webSocket)(_ ~ _)
def finalRoutes(extraRouteProviders: Seq[RouteProvider] = Nil): Route = securedHandler {
val baseRoutes = nodeRoutes ~ channelRoutes ~ feeRoutes ~ pathFindingRoutes ~ invoiceRoutes ~ paymentRoutes ~ messageRoutes ~ onChainRoutes ~ webSocket
extraRouteProviders.map(_.route(this)).foldLeft(baseRoutes)(_ ~ _)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ class ApiServiceSpec extends AnyFunSuite with ScalatestRouteTest with IdiomaticM

override implicit val actorSystem: ActorSystem = system

val route: Route = finalRoutes(Seq(PluginApi.route(this)))
val route: Route = finalRoutes(PluginApi :: Nil)
}

def mockApi(eclair: Eclair = mock[Eclair]): MockService = {
Expand Down

0 comments on commit d437ea1

Please sign in to comment.