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