Skip to content

Commit bc96e8c

Browse files
authored
Add a closeOutbound func to GRPCStreamStateMachine and remove endStream param from send(message:) (#1837)
1 parent 1acd575 commit bc96e8c

File tree

3 files changed

+82
-70
lines changed

3 files changed

+82
-70
lines changed

Sources/GRPCHTTP2Core/GRPCStreamStateMachine.swift

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -325,20 +325,24 @@ struct GRPCStreamStateMachine {
325325
}
326326
}
327327

328-
mutating func send(message: [UInt8], endStream: Bool) throws {
328+
mutating func send(message: [UInt8]) throws {
329329
switch self.configuration {
330330
case .client:
331-
try self.clientSend(message: message, endStream: endStream)
331+
try self.clientSend(message: message)
332332
case .server:
333-
if endStream {
334-
try self.invalidState(
335-
"Can't end response stream by sending a message - send(status:metadata:) must be called"
336-
)
337-
}
338333
try self.serverSend(message: message)
339334
}
340335
}
341336

337+
mutating func closeOutbound() throws {
338+
switch self.configuration {
339+
case .client:
340+
try self.clientCloseOutbound()
341+
case .server:
342+
try self.invalidState("Server cannot call close: it must send status and trailers.")
343+
}
344+
}
345+
342346
mutating func send(
343347
status: Status,
344348
metadata: Metadata
@@ -532,31 +536,36 @@ extension GRPCStreamStateMachine {
532536
}
533537
}
534538

535-
private mutating func clientSend(message: [UInt8], endStream: Bool) throws {
536-
// Client sends message.
539+
private mutating func clientSend(message: [UInt8]) throws {
537540
switch self.state {
538541
case .clientIdleServerIdle:
539542
try self.invalidState("Client not yet open.")
540543
case .clientOpenServerIdle(var state):
541544
state.framer.append(message)
542-
if endStream {
543-
self.state = .clientClosedServerIdle(.init(previousState: state))
544-
} else {
545-
self.state = .clientOpenServerIdle(state)
546-
}
545+
self.state = .clientOpenServerIdle(state)
547546
case .clientOpenServerOpen(var state):
548547
state.framer.append(message)
549-
if endStream {
550-
self.state = .clientClosedServerOpen(.init(previousState: state))
551-
} else {
552-
self.state = .clientOpenServerOpen(state)
553-
}
554-
case .clientOpenServerClosed(let state):
548+
self.state = .clientOpenServerOpen(state)
549+
case .clientOpenServerClosed:
555550
// The server has closed, so it makes no sense to send the rest of the request.
556-
// However, do close if endStream is set.
557-
if endStream {
558-
self.state = .clientClosedServerClosed(.init(previousState: state))
559-
}
551+
()
552+
case .clientClosedServerIdle, .clientClosedServerOpen, .clientClosedServerClosed:
553+
try self.invalidState(
554+
"Client is closed, cannot send a message."
555+
)
556+
}
557+
}
558+
559+
private mutating func clientCloseOutbound() throws {
560+
switch self.state {
561+
case .clientIdleServerIdle:
562+
try self.invalidState("Client not yet open.")
563+
case .clientOpenServerIdle(let state):
564+
self.state = .clientClosedServerIdle(.init(previousState: state))
565+
case .clientOpenServerOpen(let state):
566+
self.state = .clientClosedServerOpen(.init(previousState: state))
567+
case .clientOpenServerClosed(let state):
568+
self.state = .clientClosedServerClosed(.init(previousState: state))
560569
case .clientClosedServerIdle, .clientClosedServerOpen, .clientClosedServerClosed:
561570
try self.invalidState(
562571
"Client is closed, cannot send a message."

Sources/GRPCHTTP2Core/Server/GRPCServerStreamHandler.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ extension GRPCServerStreamHandler {
153153

154154
case .message(let message):
155155
do {
156-
try self.stateMachine.send(message: message, endStream: false)
156+
try self.stateMachine.send(message: message)
157157
// TODO: move the promise handling into the state machine
158158
promise?.succeed()
159159
} catch {

0 commit comments

Comments
 (0)