Skip to content

Commit d437ea1

Browse files
Improve API plugin support (#1819)
Move `onKit` before `startApiServiceIfEnabled`. This allows plugins to properly initialize before providing their routes.
1 parent 9a20aad commit d437ea1

File tree

3 files changed

+7
-8
lines changed

3 files changed

+7
-8
lines changed

eclair-node/src/main/scala/fr/acinq/eclair/Boot.scala

+2-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import java.io.File
2020

2121
import akka.actor.ActorSystem
2222
import akka.http.scaladsl.Http
23-
import akka.http.scaladsl.server.Route
2423
import akka.stream.BindFailedException
2524
import fr.acinq.eclair.api.Service
2625
import grizzled.slf4j.Logging
@@ -51,9 +50,9 @@ object Boot extends App with Logging {
5150
plugins.foreach(_.onSetup(setup))
5251
setup.bootstrap onComplete {
5352
case Success(kit) =>
53+
plugins.foreach(_.onKit(kit))
5454
val routeProviderPlugins = plugins.collect { case plugin: RouteProvider => plugin }
5555
startApiServiceIfEnabled(kit, routeProviderPlugins)
56-
plugins.foreach(_.onKit(kit))
5756
case Failure(t) => onError(t)
5857
}
5958
} catch {
@@ -80,8 +79,7 @@ object Boot extends App with Logging {
8079
override val password: String = apiPassword
8180
override val eclairApi: Eclair = new EclairImpl(kit)
8281
}
83-
val pluginRoutes = providers.map(_.route(service))
84-
Http().bindAndHandle(service.finalRoutes(pluginRoutes), config.getString("api.binding-ip"), config.getInt("api.port")).recover {
82+
Http().newServerAt(config.getString("api.binding-ip"), config.getInt("api.port")).bindFlow(service.finalRoutes(providers)).recover {
8583
case _: BindFailedException => onError(TCPBindException(config.getInt("api.port")))
8684
}
8785
} else {

eclair-node/src/main/scala/fr/acinq/eclair/api/Service.scala

+4-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package fr.acinq.eclair.api
1818

1919
import akka.actor.ActorSystem
2020
import akka.http.scaladsl.server._
21-
import fr.acinq.eclair.Eclair
21+
import fr.acinq.eclair.{Eclair, RouteProvider}
2222
import fr.acinq.eclair.api.directives.EclairDirectives
2323
import fr.acinq.eclair.api.handlers._
2424
import grizzled.slf4j.Logging
@@ -45,7 +45,8 @@ trait Service extends EclairDirectives with WebSocket with Node with Channel wit
4545
* This is the main entrypoint for the global http request router of the API service.
4646
* This is where we handle errors to ensure all routes are correctly tried before rejecting.
4747
*/
48-
def finalRoutes(extraRoutes: Seq[Route]): Route = securedHandler {
49-
extraRoutes.foldLeft(nodeRoutes ~ channelRoutes ~ feeRoutes ~ pathFindingRoutes ~ invoiceRoutes ~ paymentRoutes ~ messageRoutes ~ onChainRoutes ~ webSocket)(_ ~ _)
48+
def finalRoutes(extraRouteProviders: Seq[RouteProvider] = Nil): Route = securedHandler {
49+
val baseRoutes = nodeRoutes ~ channelRoutes ~ feeRoutes ~ pathFindingRoutes ~ invoiceRoutes ~ paymentRoutes ~ messageRoutes ~ onChainRoutes ~ webSocket
50+
extraRouteProviders.map(_.route(this)).foldLeft(baseRoutes)(_ ~ _)
5051
}
5152
}

eclair-node/src/test/scala/fr/acinq/eclair/api/ApiServiceSpec.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class ApiServiceSpec extends AnyFunSuite with ScalatestRouteTest with IdiomaticM
9090

9191
override implicit val actorSystem: ActorSystem = system
9292

93-
val route: Route = finalRoutes(Seq(PluginApi.route(this)))
93+
val route: Route = finalRoutes(PluginApi :: Nil)
9494
}
9595

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

0 commit comments

Comments
 (0)