@@ -53,7 +53,7 @@ extension HTTP2ToRawGRPCStateMachine {
53
53
var reader : LengthPrefixedMessageReader
54
54
55
55
/// A length prefixed message writer for response messages.
56
- var writer : LengthPrefixedMessageWriter
56
+ var writer : CoalescingLengthPrefixedMessageWriter
57
57
58
58
/// The content type of the RPC.
59
59
var contentType : ContentType
@@ -78,7 +78,7 @@ extension HTTP2ToRawGRPCStateMachine {
78
78
var reader : LengthPrefixedMessageReader
79
79
80
80
/// A length prefixed message writer for response messages.
81
- var writer : LengthPrefixedMessageWriter
81
+ var writer : CoalescingLengthPrefixedMessageWriter
82
82
83
83
/// The content type of the RPC.
84
84
var contentType : ContentType
@@ -113,7 +113,7 @@ extension HTTP2ToRawGRPCStateMachine {
113
113
var reader : LengthPrefixedMessageReader
114
114
115
115
/// A length prefixed message writer for response messages.
116
- var writer : LengthPrefixedMessageWriter
116
+ var writer : CoalescingLengthPrefixedMessageWriter
117
117
118
118
/// Whether to normalize user-provided metadata.
119
119
var normalizeHeaders : Bool
@@ -130,7 +130,7 @@ extension HTTP2ToRawGRPCStateMachine {
130
130
var reader : LengthPrefixedMessageReader
131
131
132
132
/// A length prefixed message writer for response messages.
133
- var writer : LengthPrefixedMessageWriter
133
+ var writer : CoalescingLengthPrefixedMessageWriter
134
134
135
135
/// Whether to normalize user-provided metadata.
136
136
var normalizeHeaders : Bool
@@ -502,8 +502,8 @@ extension HTTP2ToRawGRPCStateMachine.State {
502
502
from headers: HPACKHeaders ,
503
503
encoding: ServerMessageEncoding ,
504
504
allocator: ByteBufferAllocator
505
- ) -> ( LengthPrefixedMessageWriter , String ? ) {
506
- let writer : LengthPrefixedMessageWriter
505
+ ) -> ( CoalescingLengthPrefixedMessageWriter , String ? ) {
506
+ let writer : CoalescingLengthPrefixedMessageWriter
507
507
let responseEncoding : String ?
508
508
509
509
switch encoding {
@@ -519,12 +519,12 @@ extension HTTP2ToRawGRPCStateMachine.State {
519
519
configuration. enabledAlgorithms. contains ( $0)
520
520
}
521
521
522
- writer = LengthPrefixedMessageWriter ( compression: algorithm, allocator: allocator)
522
+ writer = . init ( compression: algorithm, allocator: allocator)
523
523
responseEncoding = algorithm? . name
524
524
525
525
case . disabled:
526
526
// The server doesn't have compression enabled.
527
- writer = LengthPrefixedMessageWriter ( compression: . none, allocator: allocator)
527
+ writer = . init ( compression: . none, allocator: allocator)
528
528
responseEncoding = nil
529
529
}
530
530
@@ -623,44 +623,23 @@ extension HTTP2ToRawGRPCStateMachine.RequestClosedResponseIdleState {
623
623
624
624
// MARK: - Send Data
625
625
626
- extension HTTP2ToRawGRPCStateMachine {
627
- static func writeGRPCFramedMessage(
628
- _ buffer: ByteBuffer ,
629
- compress: Bool ,
630
- writer: inout LengthPrefixedMessageWriter
631
- ) -> Result < ( ByteBuffer , ByteBuffer ? ) , Error > {
632
- do {
633
- let buffers = try writer. write ( buffer: buffer, compressed: compress)
634
- return . success( buffers)
635
- } catch {
636
- return . failure( error)
637
- }
638
- }
639
- }
640
-
641
626
extension HTTP2ToRawGRPCStateMachine . RequestOpenResponseOpenState {
642
627
mutating func send(
643
628
buffer: ByteBuffer ,
644
- compress: Bool
645
- ) -> Result < ( ByteBuffer , ByteBuffer ? ) , Error > {
646
- return HTTP2ToRawGRPCStateMachine . writeGRPCFramedMessage (
647
- buffer,
648
- compress: compress,
649
- writer: & self . writer
650
- )
629
+ compress: Bool ,
630
+ promise: EventLoopPromise < Void > ?
631
+ ) {
632
+ self . writer. append ( buffer: buffer, compress: compress, promise: promise)
651
633
}
652
634
}
653
635
654
636
extension HTTP2ToRawGRPCStateMachine . RequestClosedResponseOpenState {
655
637
mutating func send(
656
638
buffer: ByteBuffer ,
657
- compress: Bool
658
- ) -> Result < ( ByteBuffer , ByteBuffer ? ) , Error > {
659
- return HTTP2ToRawGRPCStateMachine . writeGRPCFramedMessage (
660
- buffer,
661
- compress: compress,
662
- writer: & self . writer
663
- )
639
+ compress: Bool ,
640
+ promise: EventLoopPromise < Void > ?
641
+ ) {
642
+ self . writer. append ( buffer: buffer, compress: compress, promise: promise)
664
643
}
665
644
}
666
645
@@ -879,10 +858,14 @@ extension HTTP2ToRawGRPCStateMachine {
879
858
/// Send a response buffer.
880
859
mutating func send(
881
860
buffer: ByteBuffer ,
882
- allocator: ByteBufferAllocator ,
883
- compress: Bool
884
- ) -> Result < ( ByteBuffer , ByteBuffer ? ) , Error > {
885
- self . state. send ( buffer: buffer, allocator: allocator, compress: compress)
861
+ compress: Bool ,
862
+ promise: EventLoopPromise < Void > ?
863
+ ) -> Result < Void , Error > {
864
+ self . state. send ( buffer: buffer, compress: compress, promise: promise)
865
+ }
866
+
867
+ mutating func nextResponse( ) -> ( Result < ByteBuffer , Error > , EventLoopPromise < Void > ? ) ? {
868
+ self . state. nextResponse ( )
886
869
}
887
870
888
871
/// Send status and trailers.
@@ -1070,9 +1053,9 @@ extension HTTP2ToRawGRPCStateMachine.State {
1070
1053
1071
1054
mutating func send(
1072
1055
buffer: ByteBuffer ,
1073
- allocator : ByteBufferAllocator ,
1074
- compress : Bool
1075
- ) -> Result < ( ByteBuffer , ByteBuffer ? ) , Error > {
1056
+ compress : Bool ,
1057
+ promise : EventLoopPromise < Void > ?
1058
+ ) -> Result < Void , Error > {
1076
1059
switch self {
1077
1060
case . requestIdleResponseIdle:
1078
1061
preconditionFailure ( " Invalid state: the request stream is still closed " )
@@ -1083,24 +1066,47 @@ extension HTTP2ToRawGRPCStateMachine.State {
1083
1066
return . failure( error)
1084
1067
1085
1068
case var . requestOpenResponseOpen( state) :
1086
- let result = state. send (
1087
- buffer: buffer,
1088
- compress: compress
1089
- )
1069
+ self = . requestClosedResponseClosed
1070
+ state. send ( buffer: buffer, compress: compress, promise: promise)
1071
+ self = . requestOpenResponseOpen( state)
1072
+ return . success( ( ) )
1073
+
1074
+ case var . requestClosedResponseOpen( state) :
1075
+ self = . requestClosedResponseClosed
1076
+ state. send ( buffer: buffer, compress: compress, promise: promise)
1077
+ self = . requestClosedResponseOpen( state)
1078
+ return . success( ( ) )
1079
+
1080
+ case . requestOpenResponseClosed,
1081
+ . requestClosedResponseClosed:
1082
+ return . failure( GRPCError . AlreadyComplete ( ) )
1083
+ }
1084
+ }
1085
+
1086
+ mutating func nextResponse( ) -> ( Result < ByteBuffer , Error > , EventLoopPromise < Void > ? ) ? {
1087
+ switch self {
1088
+ case . requestIdleResponseIdle:
1089
+ preconditionFailure ( " Invalid state: the request stream is still closed " )
1090
+
1091
+ case . requestOpenResponseIdle,
1092
+ . requestClosedResponseIdle:
1093
+ return nil
1094
+
1095
+ case var . requestOpenResponseOpen( state) :
1096
+ self = . requestClosedResponseClosed
1097
+ let result = state. writer. next ( )
1090
1098
self = . requestOpenResponseOpen( state)
1091
1099
return result
1092
1100
1093
1101
case var . requestClosedResponseOpen( state) :
1094
- let result = state. send (
1095
- buffer: buffer,
1096
- compress: compress
1097
- )
1102
+ self = . requestClosedResponseClosed
1103
+ let result = state. writer. next ( )
1098
1104
self = . requestClosedResponseOpen( state)
1099
1105
return result
1100
1106
1101
1107
case . requestOpenResponseClosed,
1102
1108
. requestClosedResponseClosed:
1103
- return . failure ( GRPCError . AlreadyComplete ( ) )
1109
+ return nil
1104
1110
}
1105
1111
}
1106
1112
0 commit comments