...
1/*
2 * Copyright 2023 Google Inc. All rights reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17import FlatBuffers
18import GRPC
19import Logging
20import Model
21import NIO
22
23class Greeter: models_GreeterProvider {
24
25 var interceptors: models_GreeterServerInterceptorFactoryProtocol?
26
27 let greetings: [String]
28
29 init() {
30 greetings = ["Hi", "Hallo", "Ciao"]
31 }
32
33 func SayHello(
34 request: Message<models_HelloRequest>,
35 context: StatusOnlyCallContext)
36 -> EventLoopFuture<Message<models_HelloReply>>
37 {
38 let recipient = request.object.name ?? "Stranger"
39
40 var builder = FlatBufferBuilder()
41 let off = builder.create(string: "Hello \(recipient)")
42 let root = models_HelloReply.createHelloReply(&builder, messageOffset: off)
43 builder.finish(offset: root)
44 return context.eventLoop
45 .makeSucceededFuture(Message<models_HelloReply>(builder: &builder))
46 }
47
48 func SayManyHellos(
49 request: Message<models_HelloRequest>,
50 context: StreamingResponseCallContext<Message<models_HelloReply>>)
51 -> EventLoopFuture<GRPCStatus>
52 {
53 for name in greetings {
54 var builder = FlatBufferBuilder()
55 let off = builder
56 .create(string: "\(name) \(request.object.name ?? "Unknown")")
57 let root = models_HelloReply.createHelloReply(
58 &builder,
59 messageOffset: off)
60 builder.finish(offset: root)
61 _ = context.sendResponse(Message<models_HelloReply>(builder: &builder))
62 }
63 return context.eventLoop.makeSucceededFuture(.ok)
64 }
65}
66
67// Quieten the logs.
68LoggingSystem.bootstrap {
69 var handler = StreamLogHandler.standardOutput(label: $0)
70 handler.logLevel = .critical
71 return handler
72}
73
74let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
75defer {
76 try! group.syncShutdownGracefully()
77}
78
79// Create some configuration for the server:
80let configuration = Server.Configuration(
81 target: .hostAndPort("localhost", 0),
82 eventLoopGroup: group,
83 serviceProviders: [Greeter()])
84
85// Start the server and print its address once it has started.
86let server = Server.start(configuration: configuration)
87server.map {
88 $0.channel.localAddress
89}.whenSuccess { address in
90 print("server started on port \(address!.port!)")
91}
92
93// Wait on the server's `onClose` future to stop the program from exiting.
94_ = try server.flatMap {
95 $0.onClose
96}.wait()
View as plain text