plugin_web_response.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package core
  2. import (
  3. "fmt"
  4. "net/http"
  5. "github.com/cdle/sillyplus/utils"
  6. "github.com/dop251/goja"
  7. "github.com/gin-gonic/gin"
  8. "github.com/goccy/go-json"
  9. )
  10. type Response struct {
  11. // Send func(goja.Value) `json:"send"`
  12. // SendStatus func(int) `json:"sendStatus"`
  13. // Json func(...interface{}) `json:"json"`
  14. // Header func(string, string) `json:"header"`
  15. // Render func(string, map[string]interface{}) `json:"render"`
  16. // Redirect func(...interface{}) `json:"redirect"`
  17. // Status func(int, ...string) goja.Value `json:"status"`
  18. // GetStatus func() int `json:"getStatus"`
  19. // IsComplete func() bool `json:"isComplete"`
  20. // SetCookie func(string, string, ...interface{}) `json:"setCookie"`
  21. c *gin.Context
  22. content string
  23. isJson bool
  24. status int
  25. isRedirect bool
  26. conn *WsConn
  27. vm *goja.Runtime
  28. }
  29. func (r *Response) Send(gv goja.Value) *Response {
  30. gve := gv.Export()
  31. switch gve := gve.(type) {
  32. case string:
  33. r.content += gve
  34. default:
  35. d, err := json.Marshal(gve)
  36. if err == nil {
  37. r.content += string(d)
  38. r.isJson = true
  39. } else {
  40. r.content += fmt.Sprint(gve)
  41. }
  42. }
  43. if r.conn != nil {
  44. r.conn.WriteMessage(1, []byte(r.content), nil)
  45. r.content = ""
  46. return r
  47. }
  48. return r
  49. }
  50. func (r *Response) SendStatus(st int) *Response {
  51. r.status = st
  52. return r
  53. }
  54. func (r *Response) Json(ps ...interface{}) interface{} {
  55. var status int64 = 200
  56. var data interface{}
  57. var pattern map[string]interface{}
  58. if len(ps) == 1 {
  59. data = ps[0]
  60. } else {
  61. if v, ok := ps[1].(map[string]interface{}); ok {
  62. data = ps[0]
  63. pattern = v
  64. } else {
  65. status = ps[0].(int64)
  66. data = ps[1]
  67. }
  68. }
  69. d, err := json.Marshal(data)
  70. f := string(d)
  71. r.status = int(status)
  72. if err == nil {
  73. r.content = f
  74. r.isJson = true
  75. } else {
  76. r.content += fmt.Sprint(data)
  77. }
  78. if r.conn != nil {
  79. err, result := r.conn.WriteMessage(1, d, pattern)
  80. if err != nil {
  81. panic(Error(r.vm, err))
  82. }
  83. r.content = ""
  84. return result
  85. }
  86. return r
  87. }
  88. func (r *Response) Close() {
  89. if r.conn != nil {
  90. r.conn.Close()
  91. }
  92. }
  93. func (r *Response) Header(str, value string) *Response {
  94. r.c.Header(str, value)
  95. return r
  96. }
  97. func (r *Response) Set(str, value string) *Response {
  98. r.c.Header(str, value)
  99. return r
  100. }
  101. func (r *Response) Render(path string, obj map[string]interface{}) *Response {
  102. r.c.HTML(http.StatusOK, path, obj)
  103. return r
  104. }
  105. func (r *Response) Redirect(is ...interface{}) {
  106. a := 302
  107. b := ""
  108. for _, i := range is {
  109. switch i := i.(type) {
  110. case string:
  111. b = i
  112. default:
  113. a = utils.Int(i)
  114. }
  115. }
  116. r.c.Redirect(a, b)
  117. r.isRedirect = true
  118. }
  119. func (r *Response) Status(i int, s ...string) *Response {
  120. r.status = i
  121. if len(s) != 0 {
  122. for _, v := range s {
  123. r.content += v
  124. }
  125. panic("stop")
  126. }
  127. return r
  128. }
  129. func (r *Response) SetCookie(name, value string, i ...interface{}) *Response {
  130. r.c.SetCookie(name, value, 8640000, "/", "", false, true)
  131. return r
  132. }
  133. func (r *Response) Stop() {
  134. panic("stop")
  135. }