File tree Expand file tree Collapse file tree 12 files changed +38
-21
lines changed
airframe-di/src/main/scala-3/wvlet/airframe
main/scala/wvlet/airframe/http/grpc
test/scala/wvlet/airframe/http/grpc
airframe-http-router/src/main/scala-3/wvlet/airframe/http/router Expand file tree Collapse file tree 12 files changed +38
-21
lines changed Original file line number Diff line number Diff line change @@ -37,6 +37,7 @@ package object airframe {
37
37
def newSilentDesign : Design = newDesign.noLifeCycleLogging
38
38
39
39
import scala .jdk .CollectionConverters ._
40
+
40
41
// This will not be used in Scala 3, but left for the compatibility with Scala 2
41
42
val traitFactoryCache = new ConcurrentHashMap [Surface , Session => Any ].asScala
42
43
def getOrElseUpdateTraitFactoryCache (s : Surface , factory : Session => Any ): Session => Any = {
Original file line number Diff line number Diff line change @@ -38,7 +38,7 @@ case class GrpcServerConfig(
38
38
executorProvider : GrpcServerConfig => ExecutorService = GrpcServer .newAsyncExecutorFactory,
39
39
maxThreads : Int = (Runtime .getRuntime.availableProcessors() * 2 ).max(2 ),
40
40
codecFactory : MessageCodecFactory = MessageCodecFactory .defaultFactoryForMapOutput,
41
- requestLoggerProvider : GrpcServerConfig => GrpcRequestLogger = { config : GrpcServerConfig =>
41
+ requestLoggerProvider : GrpcServerConfig => GrpcRequestLogger = { ( config : GrpcServerConfig ) =>
42
42
GrpcRequestLogger
43
43
.newLogger(config.name)
44
44
}
@@ -85,7 +85,9 @@ case class GrpcServerConfig(
85
85
def withRequestLoggerProvider (provider : GrpcServerConfig => GrpcRequestLogger ) = this
86
86
.copy(requestLoggerProvider = provider)
87
87
// Disable RPC logging
88
- def noRequestLogging = this .copy(requestLoggerProvider = { config : GrpcServerConfig => GrpcRequestLogger .nullLogger })
88
+ def noRequestLogging = this .copy(requestLoggerProvider = { (config : GrpcServerConfig ) =>
89
+ GrpcRequestLogger .nullLogger
90
+ })
89
91
90
92
/**
91
93
* Create and start a new server based on this config.
@@ -123,7 +125,7 @@ case class GrpcServerConfig(
123
125
*/
124
126
def designWithChannel : Design = {
125
127
design
126
- .bind[Channel ].toProvider { server : GrpcServer =>
128
+ .bind[Channel ].toProvider { ( server : GrpcServer ) =>
127
129
ManagedChannelBuilder .forTarget(server.localAddress).usePlaintext().build()
128
130
}
129
131
.onShutdown {
Original file line number Diff line number Diff line change @@ -23,12 +23,11 @@ import wvlet.airframe.rx.Rx
23
23
import wvlet .airspec .AirSpec
24
24
import wvlet .log .{LogSupport , Logger }
25
25
26
- import scala .concurrent .Promise
26
+ import scala .concurrent .{ ExecutionContext , Promise }
27
27
28
28
class GrpcClientTest extends AirSpec {
29
29
30
- // TODO Use AirSpec's defaultExecutionContext
31
- private implicit val sc = scala.concurrent.ExecutionContext .global
30
+ private implicit val sc : ExecutionContext = defaultExecutionContext
32
31
33
32
override def design : Design = DemoApiV2 .design
34
33
Original file line number Diff line number Diff line change @@ -22,7 +22,7 @@ object GrpcContextTest extends AirSpec {
22
22
23
23
override protected def design : Design = DemoApi .design
24
24
25
- test(" get context" ) { client : DemoApiClient =>
25
+ test(" get context" ) { ( client : DemoApiClient ) =>
26
26
val ret = client.getContext
27
27
info(ret)
28
28
client.getContext
Original file line number Diff line number Diff line change @@ -47,7 +47,7 @@ object GrpcErrorLogTest extends AirSpec {
47
47
gRPC.server
48
48
.withName(" demo-api-debug" )
49
49
.withRouter(Router .add[DemoApiDebug ])
50
- .withRequestLoggerProvider { config : GrpcServerConfig =>
50
+ .withRequestLoggerProvider { ( config : GrpcServerConfig ) =>
51
51
GrpcRequestLogger
52
52
.newLogger(config.name, inMemoryLogWriter)
53
53
}
@@ -64,7 +64,7 @@ object GrpcErrorLogTest extends AirSpec {
64
64
inMemoryLogWriter.getLogs
65
65
}
66
66
67
- test(" request logger test" ) { client : DemoApiClient =>
67
+ test(" request logger test" ) { ( client : DemoApiClient ) =>
68
68
test(" unary method error log" ) {
69
69
val logs = captureAll {
70
70
client.hello(" gRPC" )
Original file line number Diff line number Diff line change @@ -27,7 +27,7 @@ class GrpcJsonTest extends AirSpec {
27
27
28
28
protected override def design = gRPC.server.withRouter(router).designWithChannel
29
29
30
- test(" json encoding" ) { c : DemoApiClient =>
30
+ test(" json encoding" ) { ( c : DemoApiClient ) =>
31
31
val client = c.withEncoding(RPCEncoding .JSON )
32
32
33
33
test(" unary" ) {
Original file line number Diff line number Diff line change @@ -33,7 +33,7 @@ class GrpcRequestLoggerTest extends AirSpec {
33
33
gRPC.server
34
34
.withName(" demo-api" )
35
35
.withRouter(DemoApi .router)
36
- .withRequestLoggerProvider { config : GrpcServerConfig =>
36
+ .withRequestLoggerProvider { ( config : GrpcServerConfig ) =>
37
37
GrpcRequestLogger .newLogger(config.name, inMemoryLogWriter)
38
38
}
39
39
.designWithChannel
@@ -45,7 +45,7 @@ class GrpcRequestLoggerTest extends AirSpec {
45
45
inMemoryLogWriter.getLogs
46
46
}
47
47
48
- test(" request logger test" ) { client : DemoApiClient =>
48
+ test(" request logger test" ) { ( client : DemoApiClient ) =>
49
49
test(" unary method log" ) {
50
50
val logs = captureAll {
51
51
client.hello(" gRPC" )
Original file line number Diff line number Diff line change @@ -21,7 +21,7 @@ object GrpcServerFactoryTest extends AirSpec {
21
21
22
22
private val r = Router .add[Greeter ]
23
23
24
- test(" Build multiple gRPC servers" ) { f : GrpcServerFactory =>
24
+ test(" Build multiple gRPC servers" ) { ( f : GrpcServerFactory ) =>
25
25
val s1 = f.newServer(gRPC.server.withName(" grpc1" ).withRouter(r))
26
26
val s2 = f.newServer(gRPC.server.withName(" grpc2" ).withRouter(r))
27
27
}
Original file line number Diff line number Diff line change @@ -23,14 +23,14 @@ import wvlet.airspec.AirSpec
23
23
*/
24
24
object GrpcStreamingTest extends AirSpec {
25
25
26
- private def router = Router .add[DemoApi ]
27
- debug(router)
28
-
29
- protected override def design = gRPC.server.withRouter(router).designWithChannel
26
+ private lazy val router : Router = Router .add[DemoApi ]
27
+ protected override def design = {
28
+ gRPC.server.withRouter(router).designWithChannel
29
+ }
30
30
31
31
// launching a gRPC server first
32
- test(" Launch a standalone gRPC server" ) { server : GrpcServer =>
33
- test(" Test gRPC client methods" ) { stub : DemoApiClient =>
32
+ test(" Launch a standalone gRPC server" ) { ( server : GrpcServer ) =>
33
+ test(" Test gRPC client methods" ) { ( stub : DemoApiClient ) =>
34
34
val N = 10
35
35
36
36
test(" unary" ) {
Original file line number Diff line number Diff line change @@ -89,7 +89,7 @@ object GrpcTest extends AirSpec {
89
89
info(s " Shutting down gRPC server localhost: ${port}" )
90
90
server.shutdownNow()
91
91
}
92
- .bind[ManagedChannel ].toProvider { server : Server =>
92
+ .bind[ManagedChannel ].toProvider { ( server : Server ) =>
93
93
ManagedChannelBuilder .forTarget(s " localhost: ${server.getPort}" ).usePlaintext().build()
94
94
}
95
95
.onShutdown { channel =>
Original file line number Diff line number Diff line change @@ -94,7 +94,7 @@ object DemoApi {
94
94
.withRouter(router)
95
95
.withName(" DemoApi" )
96
96
.designWithChannel
97
- .bind[DemoApiClient ].toProvider { channel : Channel => new DemoApiClient (channel) }
97
+ .bind[DemoApiClient ].toProvider { ( channel : Channel ) => new DemoApiClient (channel) }
98
98
99
99
val router = Router .add[DemoApi ]
100
100
Original file line number Diff line number Diff line change @@ -16,9 +16,11 @@ package wvlet.airframe.http.router
16
16
import wvlet .airframe .http .Router
17
17
import wvlet .airframe .http .HttpFilterType
18
18
import wvlet .airframe .surface .Surface
19
+ import wvlet .airframe .Session
19
20
20
21
trait RouterBase { self : Router =>
21
22
inline def add [Controller ]: Router = {
23
+ // TODO registerTraitFactory
22
24
self.addInternal(Surface .of[Controller ], Surface .methodsOf[Controller ])
23
25
}
24
26
@@ -41,9 +43,22 @@ private[router] object RouterObjectMacros {
41
43
import quotes .reflect ._
42
44
43
45
if (TypeRepr .of[Controller ] <:< TypeRepr .of[HttpFilterType ]) {
46
+ // TODO registerTraitFactory
44
47
' { Router (filterSurface = Some (Surface .of[Controller ])) }
45
48
} else {
49
+ // TODO registerTraitFactory
46
50
' { Router .empty.add[Controller ] }
47
51
}
48
52
}
53
+
54
+ // def registerTraitFactory[T: Type](using quotes: Quotes): Expr[Unit] = {
55
+ // // TODO implement simlar thing method like AirframeMacros.shouldGenerateTrait
56
+ // // TODO instantiate an arbitrary trait https://github.com/lampepfl/dotty/issues/11685
57
+ // val t = Type.of[T].info
58
+ // '{ wvlet.airframe.getOrElseUpdateTraitFactoryCache(
59
+ // Surface.of[T],
60
+ // { (ss: Session) => (new ${t} {}).asInstanceOf[Any] }
61
+ // )
62
+ // }
63
+ // }
49
64
}
You can’t perform that action at this time.
0 commit comments