def encode()

in management-cluster-http/src/main/scala/org/apache/pekko/management/cluster/ClusterDomainEventServerSentEventEncoder.scala [27:108]


  def encode(event: ClusterEvent.ClusterDomainEvent): Option[ServerSentEvent] = {
    def sse(eventType: String, value: JsObject): Some[ServerSentEvent] =
      Some(
        ServerSentEvent(
          data = value.copy(fields = value.fields.updated("type", JsString(eventType))).compactPrint,
          eventType = Some(eventType)))

    event match {
      case memberEvent: ClusterEvent.MemberEvent =>
        memberEvent match {
          case ClusterEvent.MemberJoined(member) =>
            sse("MemberJoined", JsObject("member" -> encode(member)))

          case ClusterEvent.MemberWeaklyUp(member) =>
            sse("MemberWeaklyUp", JsObject("member" -> encode(member)))

          case ClusterEvent.MemberUp(member) =>
            sse("MemberUp", JsObject("member" -> encode(member)))

          case ClusterEvent.MemberLeft(member) =>
            sse("MemberLeft", JsObject("member" -> encode(member)))

          case ClusterEvent.MemberExited(member) =>
            sse("MemberExited", JsObject("member" -> encode(member)))

          case ClusterEvent.MemberDowned(member) =>
            sse("MemberDowned", JsObject("member" -> encode(member)))

          case ClusterEvent.MemberRemoved(member, previousStatus) =>
            sse("MemberRemoved", JsObject("member" -> encode(member), "previousStatus" -> encode(previousStatus)))

          case _ =>
            None
        }

      case leaderChanged: ClusterEvent.LeaderChanged =>
        leaderChanged.leader match {
          case Some(address) =>
            sse("LeaderChanged", JsObject("address" -> encode(address)))

          case None =>
            sse("LeaderChanged", JsObject.empty)
        }

      case roleLeaderChanged: ClusterEvent.RoleLeaderChanged =>
        roleLeaderChanged.leader match {
          case Some(address) =>
            sse(
              "RoleLeaderChanged",
              JsObject("role" -> JsString(roleLeaderChanged.role), "address" -> encode(address)))

          case None =>
            sse("RoleLeaderChanged", JsObject("role" -> JsString(roleLeaderChanged.role)))
        }

      case ClusterEvent.ClusterShuttingDown =>
        sse("ClusterShuttingDown", JsObject.empty)

      case reachabilityEvent: ClusterEvent.ReachabilityEvent =>
        reachabilityEvent match {
          case ClusterEvent.UnreachableMember(member) =>
            sse("UnreachableMember", JsObject("member" -> encode(member)))

          case ClusterEvent.ReachableMember(member) =>
            sse("ReachableMember", JsObject("member" -> encode(member)))
        }

      case dataCenterReachabilityEvent: ClusterEvent.DataCenterReachabilityEvent =>
        dataCenterReachabilityEvent match {
          case ClusterEvent.UnreachableDataCenter(dataCenter) =>
            sse("UnreachableDataCenter", JsObject("dataCenter" -> JsString(dataCenter)))
          case ClusterEvent.ReachableDataCenter(dataCenter) =>
            sse("ReachableDataCenter", JsObject("dataCenter" -> JsString(dataCenter)))
        }

      case _ =>
        // these are either internal events we don't want to expose, or new events
        // that this code is unaware of. either way, let's ignore them

        None
    }
  }