func onMessageComplete()

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()
    }
  }