xref: /aosp_15_r20/external/flatbuffers/grpc/examples/swift/Greeter/Sources/server/main.swift (revision 890232f25432b36107d06881e0a25aaa6b473652)
1 /*
2  * Copyright 2021 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 
17 import FlatBuffers
18 import GRPC
19 import Logging
20 import Model
21 import NIO
22 
23 class 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.
68 LoggingSystem.bootstrap {
69   var handler = StreamLogHandler.standardOutput(label: $0)
70   handler.logLevel = .critical
71   return handler
72 }
73 
74 let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
75 defer {
76   try! group.syncShutdownGracefully()
77 }
78 
79 // Create some configuration for the server:
80 let 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.
86 let server = Server.start(configuration: configuration)
87 server.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()
97