You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

197 lines
5.8 KiB

  1. package types
  2. import (
  3. // for registering TMEventData as events.EventData
  4. . "github.com/tendermint/go-common"
  5. "github.com/tendermint/go-events"
  6. "github.com/tendermint/go-wire"
  7. tmsp "github.com/tendermint/tmsp/types"
  8. )
  9. // Functions to generate eventId strings
  10. // Reserved
  11. func EventStringBond() string { return "Bond" }
  12. func EventStringUnbond() string { return "Unbond" }
  13. func EventStringRebond() string { return "Rebond" }
  14. func EventStringDupeout() string { return "Dupeout" }
  15. func EventStringFork() string { return "Fork" }
  16. func EventStringTx(tx Tx) string { return Fmt("Tx:%X", tx.Hash()) }
  17. func EventStringNewBlock() string { return "NewBlock" }
  18. func EventStringNewBlockHeader() string { return "NewBlockHeader" }
  19. func EventStringNewRound() string { return "NewRound" }
  20. func EventStringNewRoundStep() string { return "NewRoundStep" }
  21. func EventStringTimeoutPropose() string { return "TimeoutPropose" }
  22. func EventStringCompleteProposal() string { return "CompleteProposal" }
  23. func EventStringPolka() string { return "Polka" }
  24. func EventStringUnlock() string { return "Unlock" }
  25. func EventStringLock() string { return "Lock" }
  26. func EventStringRelock() string { return "Relock" }
  27. func EventStringTimeoutWait() string { return "TimeoutWait" }
  28. func EventStringVote() string { return "Vote" }
  29. //----------------------------------------
  30. // implements events.EventData
  31. type TMEventData interface {
  32. events.EventData
  33. AssertIsTMEventData()
  34. }
  35. const (
  36. EventDataTypeNewBlock = byte(0x01)
  37. EventDataTypeFork = byte(0x02)
  38. EventDataTypeTx = byte(0x03)
  39. EventDataTypeNewBlockHeader = byte(0x04)
  40. EventDataTypeRoundState = byte(0x11)
  41. EventDataTypeVote = byte(0x12)
  42. )
  43. var _ = wire.RegisterInterface(
  44. struct{ TMEventData }{},
  45. wire.ConcreteType{EventDataNewBlock{}, EventDataTypeNewBlock},
  46. wire.ConcreteType{EventDataNewBlockHeader{}, EventDataTypeNewBlockHeader},
  47. // wire.ConcreteType{EventDataFork{}, EventDataTypeFork },
  48. wire.ConcreteType{EventDataTx{}, EventDataTypeTx},
  49. wire.ConcreteType{EventDataRoundState{}, EventDataTypeRoundState},
  50. wire.ConcreteType{EventDataVote{}, EventDataTypeVote},
  51. )
  52. // Most event messages are basic types (a block, a transaction)
  53. // but some (an input to a call tx or a receive) are more exotic
  54. type EventDataNewBlock struct {
  55. Block *Block `json:"block"`
  56. }
  57. // light weight event for benchmarking
  58. type EventDataNewBlockHeader struct {
  59. Header *Header `json:"header"`
  60. }
  61. // All txs fire EventDataTx
  62. type EventDataTx struct {
  63. Tx Tx `json:"tx"`
  64. Result []byte `json:"result"`
  65. Log string `json:"log"`
  66. Code tmsp.CodeType `json:"code"`
  67. Error string `json:"error"`
  68. }
  69. // NOTE: This goes into the replay WAL
  70. type EventDataRoundState struct {
  71. Height int `json:"height"`
  72. Round int `json:"round"`
  73. Step string `json:"step"`
  74. // private, not exposed to websockets
  75. RoundState interface{} `json:"-"`
  76. }
  77. type EventDataVote struct {
  78. Vote *Vote
  79. }
  80. func (_ EventDataNewBlock) AssertIsTMEventData() {}
  81. func (_ EventDataNewBlockHeader) AssertIsTMEventData() {}
  82. func (_ EventDataTx) AssertIsTMEventData() {}
  83. func (_ EventDataRoundState) AssertIsTMEventData() {}
  84. func (_ EventDataVote) AssertIsTMEventData() {}
  85. //----------------------------------------
  86. // Wrappers for type safety
  87. type Fireable interface {
  88. events.Fireable
  89. }
  90. type Eventable interface {
  91. SetEventSwitch(EventSwitch)
  92. }
  93. type EventSwitch interface {
  94. events.EventSwitch
  95. }
  96. type EventCache interface {
  97. Fireable
  98. Flush()
  99. }
  100. func NewEventSwitch() EventSwitch {
  101. return events.NewEventSwitch()
  102. }
  103. func NewEventCache(evsw EventSwitch) EventCache {
  104. return events.NewEventCache(evsw)
  105. }
  106. // All events should be based on this FireEvent to ensure they are TMEventData
  107. func fireEvent(fireable events.Fireable, event string, data TMEventData) {
  108. fireable.FireEvent(event, data)
  109. }
  110. func AddListenerForEvent(evsw EventSwitch, id, event string, cb func(data TMEventData)) {
  111. evsw.AddListenerForEvent(id, event, func(data events.EventData) {
  112. cb(data.(TMEventData))
  113. })
  114. }
  115. //--- block, tx, and vote events
  116. func FireEventNewBlock(fireable events.Fireable, block EventDataNewBlock) {
  117. fireEvent(fireable, EventStringNewBlock(), block)
  118. }
  119. func FireEventNewBlockHeader(fireable events.Fireable, header EventDataNewBlockHeader) {
  120. fireEvent(fireable, EventStringNewBlockHeader(), header)
  121. }
  122. func FireEventVote(fireable events.Fireable, vote EventDataVote) {
  123. fireEvent(fireable, EventStringVote(), vote)
  124. }
  125. func FireEventTx(fireable events.Fireable, tx EventDataTx) {
  126. fireEvent(fireable, EventStringTx(tx.Tx), tx)
  127. }
  128. //--- EventDataRoundState events
  129. func FireEventNewRoundStep(fireable events.Fireable, rs EventDataRoundState) {
  130. fireEvent(fireable, EventStringNewRoundStep(), rs)
  131. }
  132. func FireEventTimeoutPropose(fireable events.Fireable, rs EventDataRoundState) {
  133. fireEvent(fireable, EventStringTimeoutPropose(), rs)
  134. }
  135. func FireEventTimeoutWait(fireable events.Fireable, rs EventDataRoundState) {
  136. fireEvent(fireable, EventStringTimeoutWait(), rs)
  137. }
  138. func FireEventNewRound(fireable events.Fireable, rs EventDataRoundState) {
  139. fireEvent(fireable, EventStringNewRound(), rs)
  140. }
  141. func FireEventCompleteProposal(fireable events.Fireable, rs EventDataRoundState) {
  142. fireEvent(fireable, EventStringCompleteProposal(), rs)
  143. }
  144. func FireEventPolka(fireable events.Fireable, rs EventDataRoundState) {
  145. fireEvent(fireable, EventStringPolka(), rs)
  146. }
  147. func FireEventUnlock(fireable events.Fireable, rs EventDataRoundState) {
  148. fireEvent(fireable, EventStringUnlock(), rs)
  149. }
  150. func FireEventRelock(fireable events.Fireable, rs EventDataRoundState) {
  151. fireEvent(fireable, EventStringRelock(), rs)
  152. }
  153. func FireEventLock(fireable events.Fireable, rs EventDataRoundState) {
  154. fireEvent(fireable, EventStringLock(), rs)
  155. }