in FishyTransport/Sources/FishyActorTransport/FishyTransport+Server.swift [87:129]
func onMessageComplete(context: ChannelHandlerContext, messageBytes: ByteBuffer) {
let decoder = JSONDecoder()
decoder.userInfo[.actorTransportKey] = transport
let envelope: Envelope
do {
envelope = try decoder.decode(Envelope.self, from: messageBytes)
} catch {
// TODO: log the error
return
}
let promise = context.eventLoop.makePromise(of: Data.self)
promise.completeWithTask {
try await self.transport.deliver(envelope: envelope)
}
promise.futureResult.whenComplete { result in
var headers = HTTPHeaders()
headers.add(name: "Content-Type", value: "application/json")
let responseHead: HTTPResponseHead
let responseBody: ByteBuffer
switch result {
case .failure(let error):
responseHead = HTTPResponseHead(version: .init(major: 1, minor: 1),
status: .internalServerError,
headers: headers)
responseBody = ByteBuffer(string: "Error: \(error)")
case .success(let data):
responseHead = HTTPResponseHead(version: .init(major: 1, minor: 1),
status: .ok,
headers: headers)
responseBody = ByteBuffer(data: data)
}
headers.add(name: "Content-Length", value: String(responseBody.readableBytes))
headers.add(name: "Connection", value: "close")
context.write(self.wrapOutboundOut(.head(responseHead)), promise: nil)
context.write(self.wrapOutboundOut(.body(.byteBuffer(responseBody))), promise: nil)
context.write(self.wrapOutboundOut(.end(nil))).whenComplete { (_: Result<Void, Error>) in
context.close(promise: nil)
}
context.flush()
}
}