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