api_meta.go 1.6 KB

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