message.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package main
  2. import (
  3. bridge "core/dart-bridge"
  4. "encoding/json"
  5. "github.com/metacubex/mihomo/constant"
  6. )
  7. var Port int64
  8. var ServicePort int64
  9. type MessageType string
  10. const (
  11. LogMessage MessageType = "log"
  12. ProtectMessage MessageType = "protect"
  13. DelayMessage MessageType = "delay"
  14. ProcessMessage MessageType = "process"
  15. RequestMessage MessageType = "request"
  16. StartedMessage MessageType = "started"
  17. LoadedMessage MessageType = "loaded"
  18. )
  19. type Delay struct {
  20. Name string `json:"name"`
  21. Value int32 `json:"value"`
  22. }
  23. type Process struct {
  24. Id int64 `json:"id"`
  25. Metadata *constant.Metadata `json:"metadata"`
  26. }
  27. type Message struct {
  28. Type MessageType `json:"type"`
  29. Data interface{} `json:"data"`
  30. }
  31. func (message *Message) Json() (string, error) {
  32. data, err := json.Marshal(message)
  33. return string(data), err
  34. }
  35. func SendMessage(message Message) {
  36. s, err := message.Json()
  37. if err != nil {
  38. return
  39. }
  40. if handler, ok := messageHandlers[message.Type]; ok {
  41. handler(s)
  42. } else {
  43. sendToPort(s)
  44. }
  45. }
  46. var messageHandlers = map[MessageType]func(string) bool{
  47. ProtectMessage: sendToServicePort,
  48. ProcessMessage: sendToServicePort,
  49. StartedMessage: conditionalSend,
  50. LoadedMessage: conditionalSend,
  51. }
  52. func sendToPort(s string) bool {
  53. return bridge.SendToPort(Port, s)
  54. }
  55. func sendToServicePort(s string) bool {
  56. return bridge.SendToPort(ServicePort, s)
  57. }
  58. func conditionalSend(s string) bool {
  59. isSuccess := sendToPort(s)
  60. if !isSuccess {
  61. return sendToServicePort(s)
  62. }
  63. return isSuccess
  64. }