datachannel_js_detach.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. //go:build js && wasm
  2. // +build js,wasm
  3. package webrtc
  4. import (
  5. "errors"
  6. )
  7. type detachedDataChannel struct {
  8. dc *DataChannel
  9. read chan DataChannelMessage
  10. done chan struct{}
  11. }
  12. func newDetachedDataChannel(dc *DataChannel) *detachedDataChannel {
  13. read := make(chan DataChannelMessage)
  14. done := make(chan struct{})
  15. // Wire up callbacks
  16. dc.OnMessage(func(msg DataChannelMessage) {
  17. read <- msg // pion/webrtc/projects/15
  18. })
  19. // pion/webrtc/projects/15
  20. return &detachedDataChannel{
  21. dc: dc,
  22. read: read,
  23. done: done,
  24. }
  25. }
  26. func (c *detachedDataChannel) Read(p []byte) (int, error) {
  27. n, _, err := c.ReadDataChannel(p)
  28. return n, err
  29. }
  30. func (c *detachedDataChannel) ReadDataChannel(p []byte) (int, bool, error) {
  31. select {
  32. case <-c.done:
  33. return 0, false, errors.New("Reader closed")
  34. case msg := <-c.read:
  35. n := copy(p, msg.Data)
  36. if n < len(msg.Data) {
  37. return n, msg.IsString, errors.New("Read buffer to small")
  38. }
  39. return n, msg.IsString, nil
  40. }
  41. }
  42. func (c *detachedDataChannel) Write(p []byte) (n int, err error) {
  43. return c.WriteDataChannel(p, false)
  44. }
  45. func (c *detachedDataChannel) WriteDataChannel(p []byte, isString bool) (n int, err error) {
  46. if isString {
  47. err = c.dc.SendText(string(p))
  48. return len(p), err
  49. }
  50. err = c.dc.Send(p)
  51. return len(p), err
  52. }
  53. func (c *detachedDataChannel) Close() error {
  54. close(c.done)
  55. return c.dc.Close()
  56. }