1
0
Fork 0
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:
pm47 2016-01-25 19:53:36 +01:00
parent 11f482779b
commit f1645c678f
4 changed files with 83 additions and 56 deletions

View file

@ -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>

View file

@ -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>

View 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)
))))
}
}
}
}
}

View file

@ -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>