datachannel_js_detach.go 1.4 KB

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