Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 15 additions & 8 deletions Sources/GRPC/Server.swift
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,14 @@ extension Server {
public var eventLoopGroup: EventLoopGroup

/// Providers the server should use to handle gRPC requests.
public var serviceProviders: [CallHandlerProvider]
public var serviceProviders: [CallHandlerProvider] {
get {
return Array(self.serviceProvidersByName.values)
}
set {
self.serviceProvidersByName = Dictionary(uniqueKeysWithValues: newValue.map { ($0.serviceName, $0) })
}
}

/// An error delegate which is called when errors are caught. Provided delegates **must not
/// maintain a strong reference to this `Server`**. Doing so will cause a retain cycle.
Expand Down Expand Up @@ -244,6 +251,12 @@ extension Server {
/// be invoked at most once per accepted connection.
public var debugChannelInitializer: ((Channel) -> EventLoopFuture<Void>)?

/// A calculated private cache of the service providers by name.
///
/// This is how gRPC consumes the service providers internally. Caching this as stored data avoids
/// the need to recalculate this dictionary each time we receive an rpc.
fileprivate private(set) var serviceProvidersByName: [Substring: CallHandlerProvider]

/// Create a `Configuration` with some pre-defined defaults.
///
/// - Parameters:
Expand Down Expand Up @@ -275,7 +288,7 @@ extension Server {
) {
self.target = target
self.eventLoopGroup = eventLoopGroup
self.serviceProviders = serviceProviders
self.serviceProvidersByName = Dictionary(uniqueKeysWithValues: serviceProviders.map { ($0.serviceName, $0) })
self.errorDelegate = errorDelegate
self.tls = tls
self.connectionKeepalive = connectionKeepalive
Expand All @@ -288,12 +301,6 @@ extension Server {
}
}

fileprivate extension Server.Configuration {
var serviceProvidersByName: [Substring: CallHandlerProvider] {
return Dictionary(uniqueKeysWithValues: self.serviceProviders.map { ($0.serviceName, $0) })
}
}

fileprivate extension Channel {
/// Configure an SSL handler on the channel.
///
Expand Down