...

Text file src/github.com/google/flatbuffers/grpc/examples/swift/Greeter/Sources/server/main.swift

Documentation: github.com/google/flatbuffers/grpc/examples/swift/Greeter/Sources/server

     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