Skip to content

Commit 16de204

Browse files
authored
Adopt NIOAsyncWriter (#1493)
Motivation This change adds support for using `swift-nio`’s new `NIOAsyncWriter` instead of the custom `AsyncWriter` we used to have. Modifications * Deleted `AsyncWriter` and replaced its usages with `NIOAsyncWriter` Result `grpc-swift` now uses `NIOAsyncWriter `
1 parent 07233c5 commit 16de204

15 files changed

+309
-914
lines changed

Sources/GRPC/AsyncAwaitSupport/AsyncWriter.swift

Lines changed: 0 additions & 332 deletions
This file was deleted.

Sources/GRPC/AsyncAwaitSupport/Call+AsyncRequestStreamWriter.swift

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,35 @@
1414
* limitations under the License.
1515
*/
1616
#if compiler(>=5.6)
17+
import NIOCore
1718

1819
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
1920
extension Call where Request: Sendable, Response: Sendable {
20-
internal func makeRequestStreamWriter() -> GRPCAsyncRequestStreamWriter<Request> {
21-
let delegate = GRPCAsyncRequestStreamWriter<Request>.Delegate(
22-
compressionEnabled: self.options.messageEncoding.enabledForRequests
23-
) { request, metadata in
24-
self.send(.message(request, metadata), promise: nil)
25-
} finish: {
26-
self.send(.end, promise: nil)
27-
}
21+
typealias AsyncWriter = NIOAsyncWriter<
22+
(Request, Compression),
23+
GRPCAsyncWriterSinkDelegate<(Request, Compression)>
24+
>
25+
internal func makeRequestStreamWriter()
26+
-> (GRPCAsyncRequestStreamWriter<Request>, AsyncWriter.Sink) {
27+
let delegate = GRPCAsyncWriterSinkDelegate<(Request, Compression)>(
28+
didYield: { requests in
29+
for (request, compression) in requests {
30+
let compress = compression
31+
.isEnabled(callDefault: self.options.messageEncoding.enabledForRequests)
32+
33+
// TODO: be smarter about inserting flushes.
34+
// We currently always flush after every write which may trigger more syscalls than necessary.
35+
let metadata = MessageMetadata(compress: compress, flush: true)
36+
self.send(.message(request, metadata), promise: nil)
37+
}
38+
},
39+
didTerminate: { _ in self.send(.end, promise: nil) }
40+
)
41+
42+
let writer = NIOAsyncWriter.makeWriter(isWritable: false, delegate: delegate)
2843

2944
// Start as not-writable; writability will be toggled when the stream comes up.
30-
return GRPCAsyncRequestStreamWriter(asyncWriter: .init(isWritable: false, delegate: delegate))
45+
return (GRPCAsyncRequestStreamWriter<Request>(asyncWriter: writer.writer), writer.sink)
3146
}
3247
}
3348

0 commit comments

Comments
 (0)