Skip to content

Commit c68cc1a

Browse files
committed
RPCCompanion convenience abstract class designed for good ScalaJS DCE
1 parent 5d7a072 commit c68cc1a

File tree

16 files changed

+483
-360
lines changed

16 files changed

+483
-360
lines changed

commons-akka/src/main/scala/com/avsystem/commons/rpc/akka/AkkaRPCFramework.scala

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ import com.avsystem.commons.serialization.GenCodec
1717
object AkkaRPCFramework extends GetterRPCFramework with ProcedureRPCFramework with FunctionRPCFramework with MonixRPCFramework {
1818
trait RawRPC extends GetterRawRPC with ProcedureRawRPC with FunctionRawRPC with MonixRawRPC
1919

20-
override type RawValue = ByteString
20+
type RawValue = ByteString
2121

22-
override type Reader[T] = GenCodec[T]
23-
override type Writer[T] = GenCodec[T]
22+
type Reader[T] = GenCodec[T]
23+
type Writer[T] = GenCodec[T]
24+
type ParamTypeMetadata[T] = DummyImplicit
25+
type ResultTypeMetadata[T] = DummyImplicit
2426

25-
override def read[T: Reader](raw: RawValue): T = GenCodec.read[T](new ByteStringLinearInput(raw))
26-
override def write[T: Writer](value: T): RawValue = {
27+
def read[T: Reader](raw: RawValue): T = GenCodec.read[T](new ByteStringLinearInput(raw))
28+
def write[T: Writer](value: T): RawValue = {
2729
val output = new ByteStringLinearOutput(ByteString.newBuilder)
2830
GenCodec.write[T](output, value)
2931
output.result

commons-akka/src/test/scala/com/avsystem/commons/rpc/akka/TestRPC.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.avsystem.commons
22
package rpc.akka
33

44
import com.avsystem.commons.rpc.RPC
5+
import com.avsystem.commons.rpc.akka.AkkaRPCFramework._
56
import monix.reactive.Observable
67

78

@@ -15,8 +16,14 @@ trait TestRPC {
1516
def stream: Observable[Int]
1617
def inner: InnerRPC
1718
}
19+
object TestRPC {
20+
implicit val fullRPCInfo: BaseFullRPCInfo[TestRPC] = materializeFullInfo
21+
}
1822

1923
@RPC
2024
trait InnerRPC {
2125
def innerFire(): Unit
22-
}
26+
}
27+
object InnerRPC {
28+
implicit val fullRPCInfo: BaseFullRPCInfo[InnerRPC] = materializeFullInfo
29+
}

commons-benchmark/src/main/scala/com/avsystem/commons/rpc/akka/AkkaRPCFrameworkBenchmark.scala

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ import java.util.concurrent.atomic.AtomicInteger
55

66
import akka.actor.{ActorPath, ActorSystem}
77
import com.avsystem.commons.rpc.RPC
8+
import com.avsystem.commons.rpc.akka.AkkaRPCFramework._
89
import com.typesafe.config.{Config, ConfigFactory}
910
import monix.reactive.Observable
1011
import org.openjdk.jmh.annotations.{Benchmark, BenchmarkMode, Fork, Measurement, Mode, Scope, Setup, State, TearDown, Warmup}
1112
import org.openjdk.jmh.infra.Blackhole
1213

14+
import scala.concurrent.Await
1315
import scala.concurrent.ExecutionContext.Implicits.global
1416
import scala.concurrent.duration._
15-
import scala.concurrent.Await
1617

1718
/**
1819
* @author Wojciech Milewski
@@ -128,8 +129,14 @@ trait TestRPC {
128129
def stream: Observable[Int]
129130
def inner: InnerRPC
130131
}
132+
object TestRPC {
133+
implicit val fullRPCInfo: BaseFullRPCInfo[TestRPC] = materializeFullInfo
134+
}
131135

132136
@RPC
133137
trait InnerRPC {
134138
def innerFire(): Unit
135-
}
139+
}
140+
object InnerRPC {
141+
implicit val fullRPCInfo: BaseFullRPCInfo[InnerRPC] = materializeFullInfo
142+
}

commons-jetty/src/test/scala/com/avsystem/commons/jetty/rpc/RPCMain.scala

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,54 @@ import upickle.Js
1010
* @author MKej
1111
*/
1212
object RPCMain {
13+
object jettyFramework extends JettyRPCFramework {
14+
type RawValue = Js.Value
15+
type Reader[T] = upickle.default.Reader[T]
16+
type Writer[T] = upickle.default.Writer[T]
17+
type ResultTypeMetadata[T] = DummyImplicit
18+
type ParamTypeMetadata[T] = DummyImplicit
19+
20+
def valueToJson(value: RawValue) = upickle.json.write(value)
21+
def jsonToValue(json: String) = upickle.json.read(json)
22+
def argsToJson(args: List[List[RawValue]]) = upickle.json.write(argsToJsArr(args))
23+
def jsonToArgs(json: String) = jsArrToArgs(upickle.json.read(json))
24+
25+
def read[T: Reader](raw: RawValue): T = upickle.default.readJs[T](raw)
26+
def write[T: Writer](value: T): RawValue = upickle.default.writeJs[T](value)
27+
28+
def argsToJsArr(argLists: List[List[Js.Value]]): Js.Value = {
29+
Js.Arr(argLists map { args => Js.Arr(args: _*) }: _*)
30+
}
31+
32+
def jsArrToArgs(value: Js.Value): List[List[Js.Value]] = {
33+
value match {
34+
case array: Js.Arr =>
35+
(array.value map {
36+
case nestedArray: Js.Arr => nestedArray.value.toList
37+
case _ => List()
38+
}).toList
39+
case _ => List()
40+
}
41+
}
42+
}
43+
import jettyFramework._
44+
1345
@RPC trait SomeApi {
1446
def keks: Future[Int]
1547
def isTop(keks: Int): Future[Boolean]
1648
def topper: Topper
1749
}
50+
object SomeApi {
51+
implicit val fullRPCInfo: BaseFullRPCInfo[SomeApi] = materializeFullInfo
52+
}
1853

1954
@RPC trait Topper {
2055
def initialize: Future[Unit]
2156
def topKeks: Future[Int]
2257
}
58+
object Topper {
59+
implicit val fullRPCInfo: BaseFullRPCInfo[Topper] = materializeFullInfo
60+
}
2361

2462
def main(args: Array[String]): Unit = {
2563
import scala.concurrent.ExecutionContext.Implicits.global
@@ -33,35 +71,6 @@ object RPCMain {
3371
}
3472
}
3573

36-
object jettyFramework extends JettyRPCFramework {
37-
type RawValue = Js.Value
38-
type Reader[T] = upickle.default.Reader[T]
39-
type Writer[T] = upickle.default.Writer[T]
40-
41-
def valueToJson(value: RawValue) = upickle.json.write(value)
42-
def jsonToValue(json: String) = upickle.json.read(json)
43-
def argsToJson(args: List[List[RawValue]]) = upickle.json.write(argsToJsArr(args))
44-
def jsonToArgs(json: String) = jsArrToArgs(upickle.json.read(json))
45-
46-
def read[T: Reader](raw: RawValue): T = upickle.default.readJs[T](raw)
47-
def write[T: Writer](value: T): RawValue = upickle.default.writeJs[T](value)
48-
49-
def argsToJsArr(argLists: List[List[Js.Value]]): Js.Value = {
50-
Js.Arr(argLists map { args => Js.Arr(args: _*) }: _*)
51-
}
52-
53-
def jsArrToArgs(value: Js.Value): List[List[Js.Value]] = {
54-
value match {
55-
case array: Js.Arr =>
56-
(array.value map {
57-
case nestedArray: Js.Arr => nestedArray.value.toList
58-
case _ => List()
59-
}).toList
60-
case _ => List()
61-
}
62-
}
63-
}
64-
6574
val port = 1337
6675

6776
val server = new Server(port)

commons-macros/src/main/scala/com/avsystem/commons/macros/MacroCommons.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ trait MacroCommons {
3131
final val ImplicitsObj = q"$CommonsPackage.misc.Implicits"
3232
final val AnnotationAggregateType = getType(tq"$CommonsPackage.annotation.AnnotationAggregate")
3333

34+
final lazy val isScalaJs =
35+
definitions.ScalaPackageClass.toType.member(TermName("scalajs")) != NoSymbol
36+
3437
final lazy val ownerChain = {
3538
val sym = c.typecheck(q"val ${c.freshName(TermName(""))} = null").symbol
3639
Iterator.iterate(sym)(_.owner).takeWhile(_ != NoSymbol).drop(1).toList
@@ -49,6 +52,11 @@ trait MacroCommons {
4952
c.echo(c.enclosingPosition, show(t))
5053
t
5154
}
55+
56+
def asStatList: List[Tree] = t match {
57+
case Block(stats, expr) => stats :+ expr
58+
case _ => List(t)
59+
}
5260
}
5361

5462
def superSymbols(s: Symbol): List[Symbol] = s match {
@@ -486,14 +494,6 @@ trait MacroCommons {
486494
}
487495
}
488496

489-
def inferOrMaterialize(typeClass: Type)(materialize: => Tree): Tree =
490-
if (c.macroApplication.symbol.isImplicit)
491-
c.inferImplicitValue(typeClass, withMacrosDisabled = true) match {
492-
case EmptyTree => materialize
493-
case tree => tree
494-
}
495-
else materialize
496-
497497
def abortOnTypecheckException[T](expr: => T): T =
498498
try expr catch {
499499
case TypecheckException(pos, msg) => abort(msg)

commons-macros/src/main/scala/com/avsystem/commons/macros/misc/MiscMacros.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,7 @@ class MiscMacros(ctx: blackbox.Context) extends AbstractMacroCommons(ctx) {
4848
)
4949
"""
5050
}
51+
52+
def crossImpl(forJvm: Tree, forJs: Tree): Tree =
53+
if (isScalaJs) forJs else forJvm
5154
}

0 commit comments

Comments
 (0)