event.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package bus
  2. import (
  3. "encoding/json"
  4. "sync"
  5. "time"
  6. )
  7. var (
  8. eventPool = new(sync.Pool)
  9. )
  10. func applyEvent() *Event {
  11. if v := eventPool.Get(); v == nil {
  12. return &Event{
  13. Timestamp: time.Now().Unix(),
  14. }
  15. } else {
  16. e := v.(*Event)
  17. e.Timestamp = time.Now().Unix()
  18. e.Header = make(map[string]string)
  19. e.Body = nil
  20. return e
  21. }
  22. }
  23. func releaseEvent(e *Event) {
  24. eventPool.Put(e)
  25. }
  26. type Event struct {
  27. Name string `json:"name"`
  28. Domain string `json:"-"`
  29. Trigger string `json:"-"` //触发的用户,用于一些订阅者过滤数据
  30. Timestamp int64 `json:"ts"`
  31. Header map[string]string `json:"meta"`
  32. Body []byte `json:"body,omitempty"`
  33. }
  34. func (e *Event) WithTrigger(target string) *Event {
  35. e.Trigger = target
  36. return e
  37. }
  38. func (e *Event) Set(k, v string) *Event {
  39. if e.Header == nil {
  40. e.Header = make(map[string]string)
  41. }
  42. e.Header[k] = v
  43. return e
  44. }
  45. func (e *Event) MultiSet(ss ...string) *Event {
  46. if len(ss)%2 != 0 {
  47. return e
  48. }
  49. if e.Header == nil {
  50. e.Header = make(map[string]string)
  51. }
  52. for i := 0; i < len(ss); i += 2 {
  53. e.Header[ss[i]] = ss[i+1]
  54. }
  55. return e
  56. }
  57. func (e *Event) Get(k string) string {
  58. if e.Header == nil {
  59. return ""
  60. }
  61. return e.Header[k]
  62. }
  63. func (e *Event) Encode() (buf []byte) {
  64. buf, _ = json.Marshal(e)
  65. return
  66. }
  67. func NewEvent(name string, domain string) *Event {
  68. e := applyEvent()
  69. e.Name = name
  70. e.Domain = domain
  71. return e
  72. }