api_meta.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package clashapi
  2. import (
  3. "bytes"
  4. "net/http"
  5. "time"
  6. "github.com/sagernet/sing-box/common/json"
  7. "github.com/sagernet/sing-box/experimental/clashapi/trafficontrol"
  8. "github.com/sagernet/websocket"
  9. "github.com/go-chi/chi/v5"
  10. "github.com/go-chi/render"
  11. )
  12. // API created by Clash.Meta
  13. func (s *Server) setupMetaAPI(r chi.Router) {
  14. r.Get("/memory", memory(s.trafficManager))
  15. r.Mount("/group", groupRouter(s))
  16. }
  17. type Memory struct {
  18. Inuse uint64 `json:"inuse"`
  19. OSLimit uint64 `json:"oslimit"` // maybe we need it in the future
  20. }
  21. func memory(trafficManager *trafficontrol.Manager) func(w http.ResponseWriter, r *http.Request) {
  22. return func(w http.ResponseWriter, r *http.Request) {
  23. var wsConn *websocket.Conn
  24. if websocket.IsWebSocketUpgrade(r) {
  25. var err error
  26. wsConn, err = upgrader.Upgrade(w, r, nil)
  27. if err != nil {
  28. return
  29. }
  30. }
  31. if wsConn == nil {
  32. w.Header().Set("Content-Type", "application/json")
  33. render.Status(r, http.StatusOK)
  34. }
  35. tick := time.NewTicker(time.Second)
  36. defer tick.Stop()
  37. buf := &bytes.Buffer{}
  38. var err error
  39. first := true
  40. for range tick.C {
  41. buf.Reset()
  42. inuse := trafficManager.Snapshot().Memory
  43. // make chat.js begin with zero
  44. // this is shit var,but we need output 0 for first time
  45. if first {
  46. first = false
  47. inuse = 0
  48. }
  49. if err := json.NewEncoder(buf).Encode(Memory{
  50. Inuse: inuse,
  51. OSLimit: 0,
  52. }); err != nil {
  53. break
  54. }
  55. if wsConn == nil {
  56. _, err = w.Write(buf.Bytes())
  57. w.(http.Flusher).Flush()
  58. } else {
  59. err = wsConn.WriteMessage(websocket.TextMessage, buf.Bytes())
  60. }
  61. if err != nil {
  62. break
  63. }
  64. }
  65. }
  66. }