Skip to content

Commit

Permalink
Set DataChannel SCTPTransport before OnDataChannel
Browse files Browse the repository at this point in the history
ORTC API would return a nil SCTPTransport for DataChannels returned via
Callback
  • Loading branch information
jerry-tao authored and Sean-Der committed Apr 24, 2023
1 parent 570b61a commit 16fea9e
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 4 deletions.
5 changes: 3 additions & 2 deletions datachannel.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ type DataChannel struct {
// This constructor is part of the ORTC API. It is not
// meant to be used together with the basic WebRTC API.
func (api *API) NewDataChannel(transport *SCTPTransport, params *DataChannelParameters) (*DataChannel, error) {
d, err := api.newDataChannel(params, api.settingEngine.LoggerFactory.NewLogger("ortc"))
d, err := api.newDataChannel(params, nil, api.settingEngine.LoggerFactory.NewLogger("ortc"))
if err != nil {
return nil, err
}
Expand All @@ -82,13 +82,14 @@ func (api *API) NewDataChannel(transport *SCTPTransport, params *DataChannelPara

// newDataChannel is an internal constructor for the data channel used to
// create the DataChannel object before the networking is set up.
func (api *API) newDataChannel(params *DataChannelParameters, log logging.LeveledLogger) (*DataChannel, error) {
func (api *API) newDataChannel(params *DataChannelParameters, sctpTransport *SCTPTransport, log logging.LeveledLogger) (*DataChannel, error) {
// https://w3c.github.io/webrtc-pc/#peer-to-peer-data-api (Step #5)
if len(params.Label) > 65535 {
return nil, &rtcerr.TypeError{Err: ErrStringSizeLimit}
}

d := &DataChannel{
sctpTransport: sctpTransport,
statsID: fmt.Sprintf("DataChannel-%d", time.Now().UnixNano()),
label: params.Label,
protocol: params.Protocol,
Expand Down
30 changes: 30 additions & 0 deletions ortc_datachannel_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,36 @@ import (
"github.com/stretchr/testify/assert"
)

func TestDataChannel_ORTC_SCTPTransport(t *testing.T) {
lim := test.TimeOut(time.Second * 20)
defer lim.Stop()

report := test.CheckRoutines(t)
defer report()

stackA, stackB, err := newORTCPair()
assert.NoError(t, err)

getSelectedCandidatePairErrChan := make(chan error)
stackB.sctp.OnDataChannel(func(d *DataChannel) {
_, getSelectedCandidatePairErr := d.Transport().Transport().ICETransport().GetSelectedCandidatePair()
getSelectedCandidatePairErrChan <- getSelectedCandidatePairErr
})

assert.NoError(t, signalORTCPair(stackA, stackB))

var id uint16 = 1
_, err = stackA.api.NewDataChannel(stackA.sctp, &DataChannelParameters{
Label: "Foo",
ID: &id,
})
assert.NoError(t, err)

assert.NoError(t, <-getSelectedCandidatePairErrChan)
assert.NoError(t, stackA.close())
assert.NoError(t, stackB.close())
}

func TestDataChannel_ORTCE2E(t *testing.T) {
lim := test.TimeOut(time.Second * 20)
defer lim.Stop()
Expand Down
2 changes: 1 addition & 1 deletion peerconnection.go
Original file line number Diff line number Diff line change
Expand Up @@ -1991,7 +1991,7 @@ func (pc *PeerConnection) CreateDataChannel(label string, options *DataChannelIn
}
}

d, err := pc.api.newDataChannel(params, pc.log)
d, err := pc.api.newDataChannel(params, nil, pc.log)
if err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion sctptransport.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ ACCEPT:
Ordered: ordered,
MaxPacketLifeTime: maxPacketLifeTime,
MaxRetransmits: maxRetransmits,
}, r.api.settingEngine.LoggerFactory.NewLogger("ortc"))
}, r, r.api.settingEngine.LoggerFactory.NewLogger("ortc"))
if err != nil {
r.log.Errorf("Failed to accept data channel: %v", err)
r.onError(err)
Expand Down

0 comments on commit 16fea9e

Please sign in to comment.