mirror of
https://github.com/ACINQ/eclair.git
synced 2025-02-22 06:21:42 +01:00
added an http api
This commit is contained in:
parent
11f482779b
commit
f1645c678f
4 changed files with 83 additions and 56 deletions
|
@ -50,6 +50,16 @@
|
|||
<groupId>com.trueaccord.lenses</groupId>
|
||||
<artifactId>lenses_${scala.version.short}</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.spray</groupId>
|
||||
<artifactId>spray-routing_${scala.version.short}</artifactId>
|
||||
<version>${spray.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.spray</groupId>
|
||||
<artifactId>spray-can_${scala.version.short}</artifactId>
|
||||
<version>${spray.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
|
|
|
@ -4,67 +4,12 @@
|
|||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<target>System.out</target>
|
||||
<withJansi>false</withJansi>
|
||||
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
|
||||
<evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
|
||||
<expression>return logger.contains("Channel") || logger.contains("PollingWatcher");</expression>
|
||||
</evaluator>
|
||||
<OnMatch>DENY</OnMatch>
|
||||
<OnMismatch>ACCEPT</OnMismatch>
|
||||
</filter>
|
||||
<encoder>
|
||||
<pattern>%yellow(${HOSTNAME} %d) %highlight(%-5level) %logger{36} %X{akkaSource} - %msg%ex{12}%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<appender name="ALICE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<target>System.out</target>
|
||||
<withJansi>false</withJansi>
|
||||
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
|
||||
<evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
|
||||
<expression>return ((String) mdc.get("akkaSource")).contains("alice");</expression>
|
||||
</evaluator>
|
||||
<OnMismatch>DENY</OnMismatch>
|
||||
<OnMatch>ACCEPT</OnMatch>
|
||||
</filter>
|
||||
<encoder>
|
||||
<pattern>%yellow(${HOSTNAME} %d) %highlight(%-5level) %logger{36} %X{akkaSource} - %blue(%msg) %ex{12}%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<appender name="BOB" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<target>System.out</target>
|
||||
<withJansi>false</withJansi>
|
||||
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
|
||||
<evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
|
||||
<expression>return ((String) mdc.get("akkaSource")).contains("bob");</expression>
|
||||
</evaluator>
|
||||
<OnMismatch>DENY</OnMismatch>
|
||||
<OnMatch>ACCEPT</OnMatch>
|
||||
</filter>
|
||||
<encoder>
|
||||
<pattern>%yellow(${HOSTNAME} %d) %highlight(%-5level) %logger{36} %X{akkaSource} - %red(%msg) %ex{12}%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<appender name="BLOCKCHAIN" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<target>System.out</target>
|
||||
<withJansi>false</withJansi>
|
||||
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
|
||||
<evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
|
||||
<expression>return ((String) mdc.get("akkaSource")).contains("blockchain");</expression>
|
||||
</evaluator>
|
||||
<OnMismatch>DENY</OnMismatch>
|
||||
<OnMatch>ACCEPT</OnMatch>
|
||||
</filter>
|
||||
<encoder>
|
||||
<pattern>%yellow(${HOSTNAME} %d) %highlight(%-5level) %logger{36} %X{akkaSource} - %boldGreen(%msg) %ex{12}%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<root level="DEBUG">
|
||||
<appender-ref ref="ALICE"/>
|
||||
<appender-ref ref="BOB"/>
|
||||
<appender-ref ref="BLOCKCHAIN"/>
|
||||
<root level="INFO">
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
</root>
|
||||
|
||||
|
|
71
eclair-demo/src/main/scala/fr/acinq/eclair/api/Service.scala
Normal file
71
eclair-demo/src/main/scala/fr/acinq/eclair/api/Service.scala
Normal file
|
@ -0,0 +1,71 @@
|
|||
package fr.acinq.eclair.api
|
||||
|
||||
import java.net.InetSocketAddress
|
||||
|
||||
import akka.actor.{ActorSystem, Props, Actor}
|
||||
import com.google.common.util.concurrent.Service.State
|
||||
import fr.acinq.eclair.io.Client
|
||||
import fr.acinq.flipcoin.wallet.BitcoinJsonRPCBody
|
||||
import grizzled.slf4j.Logging
|
||||
import org.bitcoinj.params.TestNet3Params
|
||||
import org.json4s.JsonAST.{JString, JDouble, JBool, JObject}
|
||||
import org.json4s._
|
||||
import org.json4s.jackson.JsonMethods._
|
||||
import spray.http.{ContentTypes, HttpEntity, StatusCodes, HttpResponse}
|
||||
import spray.routing.HttpService
|
||||
import spray.routing.authentication.BasicAuth
|
||||
|
||||
import scala.concurrent.{Future, ExecutionContext}
|
||||
import scala.util.{Failure, Success}
|
||||
|
||||
/**
|
||||
* Created by PM on 25/01/2016.
|
||||
*/
|
||||
|
||||
// we don't implement our route structure directly in the service actor because
|
||||
// we want to be able to test it independently, without having to spin up an actor
|
||||
abstract class ServiceActor extends Actor with Service {
|
||||
|
||||
// the HttpService trait defines only one abstract member, which
|
||||
// connects the services environment to the enclosing actor or test
|
||||
def actorRefFactory = context
|
||||
|
||||
// this actor only runs our route, but you could add
|
||||
// other things here, like request stream processing,
|
||||
// timeout handling or alternative handler registration
|
||||
def receive = runRoute(route)
|
||||
}
|
||||
|
||||
case class JsonRPCBody(jsonrpc: String = "1.0", id: String = "scala-client", method: String, params: Seq[JValue])
|
||||
|
||||
trait Service extends HttpService with Logging {
|
||||
|
||||
implicit def ec: ExecutionContext = ExecutionContext.Implicits.global
|
||||
|
||||
implicit val formats = org.json4s.DefaultFormats
|
||||
|
||||
implicit val system: ActorSystem
|
||||
|
||||
val route =
|
||||
path(RestPath) { path =>
|
||||
post {
|
||||
entity(as[String]) {
|
||||
body =>
|
||||
val json = parse(body).extract[JsonRPCBody]
|
||||
val f_res: Future[JValue] = json match {
|
||||
case JsonRPCBody(_, _, "connect", JString(host) :: JInt(port) :: JInt(anchor_amount) :: Nil) =>
|
||||
val client = system.actorOf(Props(classOf[Client], new InetSocketAddress(host, port.toInt)), s"client-$host:$port")
|
||||
case _ => Future.failed(new RuntimeException("method not found"))
|
||||
}
|
||||
onComplete(f_res) {
|
||||
case Success(res) => complete(HttpResponse(StatusCodes.OK, entity = HttpEntity(ContentTypes.`application/json`, pretty(
|
||||
JObject(("result", res) ::("error", JNull) ::("id", JString(json.id)) :: Nil)
|
||||
))))
|
||||
case Failure(t) => complete(HttpResponse(StatusCodes.InternalServerError, entity = HttpEntity(ContentTypes.`application/json`, pretty(
|
||||
JObject(("result", JNull) ::("error", JObject(("code", JInt(-1)) ::("message", JString(t.getMessage)) :: Nil)) ::("id", JString(json.id)) :: Nil)
|
||||
))))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
1
pom.xml
1
pom.xml
|
@ -44,6 +44,7 @@
|
|||
<scala.version>2.11.7</scala.version>
|
||||
<scala.version.short>2.11</scala.version.short>
|
||||
<akka.version>2.4.1</akka.version>
|
||||
<spray.version>1.3.3</spray.version>
|
||||
<bitcoinlib.version>0.9.4</bitcoinlib.version>
|
||||
<acinqtools.version>1.2</acinqtools.version>
|
||||
</properties>
|
||||
|
|
Loading…
Add table
Reference in a new issue