stdio_holder.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package plugin_manager
  2. import (
  3. "io"
  4. "sync"
  5. "github.com/google/uuid"
  6. )
  7. var (
  8. stdio_holder sync.Map = sync.Map{}
  9. listeners []func(string, []byte) = []func(string, []byte){}
  10. )
  11. type stdioHolder struct {
  12. id string
  13. writer io.WriteCloser
  14. reader io.ReadCloser
  15. listener []func(data []byte)
  16. started bool
  17. alive bool
  18. }
  19. func (s *stdioHolder) Stop() {
  20. s.alive = false
  21. s.writer.Close()
  22. s.reader.Close()
  23. }
  24. func (s *stdioHolder) Start() {
  25. s.started = true
  26. go func() {
  27. s.alive = true
  28. for s.alive {
  29. buf := make([]byte, 1024)
  30. n, err := s.reader.Read(buf)
  31. if err != nil {
  32. s.Stop()
  33. break
  34. }
  35. for _, listener := range listeners {
  36. listener(s.id, buf[:n])
  37. }
  38. for _, listener := range s.listener {
  39. listener(buf[:n])
  40. }
  41. }
  42. }()
  43. }
  44. func PutStdio(writer io.WriteCloser, reader io.ReadCloser) string {
  45. id := uuid.New().String()
  46. holder := &stdioHolder{
  47. writer: writer,
  48. reader: reader,
  49. id: id,
  50. }
  51. stdio_holder.Store(id, holder)
  52. holder.Start()
  53. return id
  54. }
  55. /*
  56. * @param id: string
  57. */
  58. func RemoveStdio(id string) {
  59. stdio_holder.Delete(id)
  60. }
  61. /*
  62. * @param listener: func(data []byte)
  63. */
  64. func OnStdioEvent(id string, listener func([]byte)) {
  65. if v, ok := stdio_holder.Load(id); ok {
  66. if holder, ok := v.(*stdioHolder); ok {
  67. holder.listener = append(holder.listener, listener)
  68. }
  69. }
  70. }
  71. /*
  72. * @param listener: func(id string, data []byte)
  73. */
  74. func OnStdioEventGlobal(listener func(string, []byte)) {
  75. listeners = append(listeners, listener)
  76. }
  77. /*
  78. * @param id: string
  79. * @param data: []byte
  80. */
  81. func Write(id string, data []byte) error {
  82. if v, ok := stdio_holder.Load(id); ok {
  83. if holder, ok := v.(*stdioHolder); ok {
  84. _, err := holder.writer.Write(data)
  85. return err
  86. }
  87. }
  88. return nil
  89. }