1
0

demo3.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "encoding/json"
  6. "github.com/gopherjs/gopherjs/js"
  7. _ "github.com/kpmy/odf/model/stub" //don't forget pimpl
  8. "github.com/kpmy/ypk/assert"
  9. "github.com/kpmy/ypk/halt"
  10. "io"
  11. "log"
  12. "sync"
  13. )
  14. type Msg struct {
  15. Type string
  16. Param string
  17. Data string
  18. }
  19. type Handler func(m *Msg)
  20. var wg *sync.WaitGroup = &sync.WaitGroup{}
  21. var busChan chan *Msg
  22. //этот хэндлер только пишет сообщения в канал главной горутины
  23. func busHandler(m *Msg) {
  24. busChan <- m
  25. }
  26. //этот хэндлер обрабатывает сообщения в рамках главной горутины
  27. func handle(m *Msg) {
  28. switch m.Type {
  29. case "init":
  30. log.Println("message bus connected")
  31. case "get":
  32. var rd io.Reader
  33. if m.Param == "demo" {
  34. rd, _ = demo()
  35. } else if m.Param == "report" {
  36. rd, _ = report()
  37. }
  38. buf := bytes.NewBuffer(nil)
  39. io.Copy(buf, rd)
  40. m := &Msg{Type: "data"}
  41. m.Data = base64.StdEncoding.EncodeToString(buf.Bytes())
  42. Process(m)
  43. default:
  44. halt.As(100, "not implemented", m.Type)
  45. }
  46. }
  47. func Process(m *Msg) {
  48. assert.For(m != nil, 20)
  49. s, _ := json.Marshal(m)
  50. js.Global.Call("postMessage", string(s))
  51. }
  52. func Init(handler Handler) {
  53. js.Global.Set("onmessage", func(oEvent *js.Object) {
  54. _data := oEvent.Get("data").Interface().(string)
  55. log.Println(_data)
  56. m := &Msg{}
  57. err := json.Unmarshal([]byte(_data), m)
  58. log.Println(m)
  59. assert.For(err == nil, 40)
  60. handler(m)
  61. })
  62. }
  63. func main() {
  64. log.Println("odf loading... ")
  65. Init(busHandler)
  66. busChan = make(chan *Msg)
  67. wg.Add(1)
  68. go func(wg *sync.WaitGroup, c chan *Msg) {
  69. log.Println("done")
  70. Process(&Msg{Type: "init"})
  71. for {
  72. select {
  73. case m := <-c:
  74. handle(m)
  75. }
  76. }
  77. }(wg, busChan)
  78. wg.Wait()
  79. log.Println("odf closed")
  80. }