summaryrefslogtreecommitdiff
path: root/vendor/github.com/pion/datachannel
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/pion/datachannel')
-rw-r--r--vendor/github.com/pion/datachannel/.gitignore2
-rw-r--r--vendor/github.com/pion/datachannel/.golangci.yml8
-rw-r--r--vendor/github.com/pion/datachannel/DESIGN.md20
-rw-r--r--vendor/github.com/pion/datachannel/LICENSE21
-rw-r--r--vendor/github.com/pion/datachannel/README.md45
-rw-r--r--vendor/github.com/pion/datachannel/codecov.yml20
-rw-r--r--vendor/github.com/pion/datachannel/datachannel.go378
-rw-r--r--vendor/github.com/pion/datachannel/go.mod11
-rw-r--r--vendor/github.com/pion/datachannel/go.sum38
-rw-r--r--vendor/github.com/pion/datachannel/message.go94
-rw-r--r--vendor/github.com/pion/datachannel/message_channel_ack.go22
-rw-r--r--vendor/github.com/pion/datachannel/message_channel_open.go123
-rw-r--r--vendor/github.com/pion/datachannel/renovate.json15
13 files changed, 797 insertions, 0 deletions
diff --git a/vendor/github.com/pion/datachannel/.gitignore b/vendor/github.com/pion/datachannel/.gitignore
new file mode 100644
index 0000000..23501a3
--- /dev/null
+++ b/vendor/github.com/pion/datachannel/.gitignore
@@ -0,0 +1,2 @@
+# vim temporary files
+*.sw[poe]
diff --git a/vendor/github.com/pion/datachannel/.golangci.yml b/vendor/github.com/pion/datachannel/.golangci.yml
new file mode 100644
index 0000000..570f17b
--- /dev/null
+++ b/vendor/github.com/pion/datachannel/.golangci.yml
@@ -0,0 +1,8 @@
+linters-settings:
+ govet:
+ check-shadowing: true
+ misspell:
+ locale: US
+
+run:
+ skip-dirs-use-default: false
diff --git a/vendor/github.com/pion/datachannel/DESIGN.md b/vendor/github.com/pion/datachannel/DESIGN.md
new file mode 100644
index 0000000..55d6c8f
--- /dev/null
+++ b/vendor/github.com/pion/datachannel/DESIGN.md
@@ -0,0 +1,20 @@
+<h1 align="center">
+ Design
+</h1>
+
+### Portable
+Pion Data Channels is written in Go and extremely portable. Anywhere Golang runs, Pion Data Channels should work as well! Instead of dealing with complicated
+cross-compiling of multiple libraries, you now can run anywhere with one `go build`
+
+### Simple API
+The API is based on an io.ReadWriteCloser.
+
+### Readable
+If code comes from an RFC we try to make sure everything is commented with a link to the spec.
+This makes learning and debugging easier, this library was written to also serve as a guide for others.
+
+### Tested
+Every commit is tested via travis-ci Go provides fantastic facilities for testing, and more will be added as time goes on.
+
+### Shared libraries
+Every pion product is built using shared libraries, allowing others to review and reuse our libraries.
diff --git a/vendor/github.com/pion/datachannel/LICENSE b/vendor/github.com/pion/datachannel/LICENSE
new file mode 100644
index 0000000..ab60297
--- /dev/null
+++ b/vendor/github.com/pion/datachannel/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/pion/datachannel/README.md b/vendor/github.com/pion/datachannel/README.md
new file mode 100644
index 0000000..1132f62
--- /dev/null
+++ b/vendor/github.com/pion/datachannel/README.md
@@ -0,0 +1,45 @@
+<h1 align="center">
+ <br>
+ Pion Data Channels
+ <br>
+</h1>
+<h4 align="center">A Go implementation of WebRTC Data Channels</h4>
+<p align="center">
+ <a href="https://pion.ly"><img src="https://img.shields.io/badge/pion-datachannel-gray.svg?longCache=true&colorB=brightgreen" alt="Pion Data Channels"></a>
+ <!--<a href="https://sourcegraph.com/github.com/pion/webrtc?badge"><img src="https://sourcegraph.com/github.com/pion/webrtc/-/badge.svg" alt="Sourcegraph Widget"></a>-->
+ <a href="https://pion.ly/slack"><img src="https://img.shields.io/badge/join-us%20on%20slack-gray.svg?longCache=true&logo=slack&colorB=brightgreen" alt="Slack Widget"></a>
+ <br>
+ <a href="https://travis-ci.org/pion/datachannel"><img src="https://travis-ci.org/pion/datachannel.svg?branch=master" alt="Build Status"></a>
+ <a href="https://pkg.go.dev/github.com/pion/datachannel"><img src="https://godoc.org/github.com/pion/datachannel?status.svg" alt="GoDoc"></a>
+ <a href="https://codecov.io/gh/pion/datachannel"><img src="https://codecov.io/gh/pion/datachannel/branch/master/graph/badge.svg" alt="Coverage Status"></a>
+ <a href="https://goreportcard.com/report/github.com/pion/datachannel"><img src="https://goreportcard.com/badge/github.com/pion/datachannel" alt="Go Report Card"></a>
+ <!--<a href="https://www.codacy.com/app/Sean-Der/webrtc"><img src="https://api.codacy.com/project/badge/Grade/18f4aec384894e6aac0b94effe51961d" alt="Codacy Badge"></a>-->
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
+</p>
+<br>
+
+See [DESIGN.md](DESIGN.md) for an overview of features and future goals.
+
+### Roadmap
+The library is used as a part of our WebRTC implementation. Please refer to that [roadmap](https://github.com/pion/webrtc/issues/9) to track our major milestones.
+
+### Community
+Pion has an active community on the [Golang Slack](https://invite.slack.golangbridge.org/). Sign up and join the **#pion** channel for discussions and support. You can also use [Pion mailing list](https://groups.google.com/forum/#!forum/pion).
+
+We are always looking to support **your projects**. Please reach out if you have something to build!
+
+If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly)
+
+### Contributing
+Check out the **[contributing wiki](https://github.com/pion/webrtc/wiki/Contributing)** to join the group of amazing people making this project possible:
+
+* [John Bradley](https://github.com/kc5nra) - *Original Author*
+* [Sean DuBois](https://github.com/Sean-Der) - *Original Author*
+* [Michiel De Backker](https://github.com/backkem) - *Public API*
+* [Yutaka Takeda](https://github.com/enobufs) - *PR-SCTP*
+* [Hugo Arregui](https://github.com/hugoArregui)
+* [Atsushi Watanabe](https://github.com/at-wat)
+* [Norman Rasmussen](https://github.com/normanr) - *Fix Empty DataChannel messages*
+
+### License
+MIT License - see [LICENSE](LICENSE) for full text
diff --git a/vendor/github.com/pion/datachannel/codecov.yml b/vendor/github.com/pion/datachannel/codecov.yml
new file mode 100644
index 0000000..085200a
--- /dev/null
+++ b/vendor/github.com/pion/datachannel/codecov.yml
@@ -0,0 +1,20 @@
+#
+# DO NOT EDIT THIS FILE
+#
+# It is automatically copied from https://github.com/pion/.goassets repository.
+#
+
+coverage:
+ status:
+ project:
+ default:
+ # Allow decreasing 2% of total coverage to avoid noise.
+ threshold: 2%
+ patch:
+ default:
+ target: 70%
+ only_pulls: true
+
+ignore:
+ - "examples/*"
+ - "examples/**/*"
diff --git a/vendor/github.com/pion/datachannel/datachannel.go b/vendor/github.com/pion/datachannel/datachannel.go
new file mode 100644
index 0000000..237ad72
--- /dev/null
+++ b/vendor/github.com/pion/datachannel/datachannel.go
@@ -0,0 +1,378 @@
+// Package datachannel implements WebRTC Data Channels
+package datachannel
+
+import (
+ "fmt"
+ "io"
+ "sync/atomic"
+
+ "github.com/pion/logging"
+ "github.com/pion/sctp"
+ "github.com/pkg/errors"
+)
+
+const receiveMTU = 8192
+
+// Reader is an extended io.Reader
+// that also returns if the message is text.
+type Reader interface {
+ ReadDataChannel([]byte) (int, bool, error)
+}
+
+// Writer is an extended io.Writer
+// that also allows indicating if a message is text.
+type Writer interface {
+ WriteDataChannel([]byte, bool) (int, error)
+}
+
+// ReadWriteCloser is an extended io.ReadWriteCloser
+// that also implements our Reader and Writer.
+type ReadWriteCloser interface {
+ io.Reader
+ io.Writer
+ Reader
+ Writer
+ io.Closer
+}
+
+// DataChannel represents a data channel
+type DataChannel struct {
+ Config
+
+ // stats
+ messagesSent uint32
+ messagesReceived uint32
+ bytesSent uint64
+ bytesReceived uint64
+
+ stream *sctp.Stream
+ log logging.LeveledLogger
+}
+
+// Config is used to configure the data channel.
+type Config struct {
+ ChannelType ChannelType
+ Negotiated bool
+ Priority uint16
+ ReliabilityParameter uint32
+ Label string
+ Protocol string
+ LoggerFactory logging.LoggerFactory
+}
+
+func newDataChannel(stream *sctp.Stream, config *Config) (*DataChannel, error) {
+ return &DataChannel{
+ Config: *config,
+ stream: stream,
+ log: config.LoggerFactory.NewLogger("datachannel"),
+ }, nil
+}
+
+// Dial opens a data channels over SCTP
+func Dial(a *sctp.Association, id uint16, config *Config) (*DataChannel, error) {
+ stream, err := a.OpenStream(id, sctp.PayloadTypeWebRTCBinary)
+ if err != nil {
+ return nil, err
+ }
+
+ dc, err := Client(stream, config)
+ if err != nil {
+ return nil, err
+ }
+
+ return dc, nil
+}
+
+// Client opens a data channel over an SCTP stream
+func Client(stream *sctp.Stream, config *Config) (*DataChannel, error) {
+ msg := &channelOpen{
+ ChannelType: config.ChannelType,
+ Priority: config.Priority,
+ ReliabilityParameter: config.ReliabilityParameter,
+
+ Label: []byte(config.Label),
+ Protocol: []byte(config.Protocol),
+ }
+
+ if !config.Negotiated {
+ rawMsg, err := msg.Marshal()
+ if err != nil {
+ return nil, fmt.Errorf("failed to marshal ChannelOpen %v", err)
+ }
+
+ if _, err = stream.WriteSCTP(rawMsg, sctp.PayloadTypeWebRTCDCEP); err != nil {
+ return nil, fmt.Errorf("failed to send ChannelOpen %v", err)
+ }
+ }
+ return newDataChannel(stream, config)
+}
+
+// Accept is used to accept incoming data channels over SCTP
+func Accept(a *sctp.Association, config *Config) (*DataChannel, error) {
+ stream, err := a.AcceptStream()
+ if err != nil {
+ return nil, err
+ }
+
+ stream.SetDefaultPayloadType(sctp.PayloadTypeWebRTCBinary)
+
+ dc, err := Server(stream, config)
+ if err != nil {
+ return nil, err
+ }
+
+ return dc, nil
+}
+
+// Server accepts a data channel over an SCTP stream
+func Server(stream *sctp.Stream, config *Config) (*DataChannel, error) {
+ buffer := make([]byte, receiveMTU) // TODO: Can probably be smaller
+ n, ppi, err := stream.ReadSCTP(buffer)
+ if err != nil {
+ return nil, err
+ }
+
+ if ppi != sctp.PayloadTypeWebRTCDCEP {
+ return nil, fmt.Errorf("unexpected packet type: %s", ppi)
+ }
+
+ openMsg, err := parseExpectDataChannelOpen(buffer[:n])
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to parse DataChannelOpen packet")
+ }
+
+ config.ChannelType = openMsg.ChannelType
+ config.Priority = openMsg.Priority
+ config.ReliabilityParameter = openMsg.ReliabilityParameter
+ config.Label = string(openMsg.Label)
+ config.Protocol = string(openMsg.Protocol)
+
+ dataChannel, err := newDataChannel(stream, config)
+ if err != nil {
+ return nil, err
+ }
+
+ err = dataChannel.writeDataChannelAck()
+ if err != nil {
+ return nil, err
+ }
+
+ err = dataChannel.commitReliabilityParams()
+ if err != nil {
+ return nil, err
+ }
+ return dataChannel, nil
+}
+
+// Read reads a packet of len(p) bytes as binary data
+func (c *DataChannel) Read(p []byte) (int, error) {
+ n, _, err := c.ReadDataChannel(p)
+ return n, err
+}
+
+// ReadDataChannel reads a packet of len(p) bytes
+func (c *DataChannel) ReadDataChannel(p []byte) (int, bool, error) {
+ for {
+ n, ppi, err := c.stream.ReadSCTP(p)
+ if err == io.EOF {
+ // When the peer sees that an incoming stream was
+ // reset, it also resets its corresponding outgoing stream.
+ closeErr := c.stream.Close()
+ if closeErr != nil {
+ return 0, false, closeErr
+ }
+ }
+ if err != nil {
+ return 0, false, err
+ }
+
+ var isString bool
+ switch ppi {
+ case sctp.PayloadTypeWebRTCDCEP:
+ err = c.handleDCEP(p[:n])
+ if err != nil {
+ c.log.Errorf("Failed to handle DCEP: %s", err.Error())
+ continue
+ }
+ continue
+ case sctp.PayloadTypeWebRTCString, sctp.PayloadTypeWebRTCStringEmpty:
+ isString = true
+ }
+ switch ppi {
+ case sctp.PayloadTypeWebRTCBinaryEmpty, sctp.PayloadTypeWebRTCStringEmpty:
+ n = 0
+ }
+
+ atomic.AddUint32(&c.messagesReceived, 1)
+ atomic.AddUint64(&c.bytesReceived, uint64(n))
+
+ return n, isString, err
+ }
+}
+
+// MessagesSent returns the number of messages sent
+func (c *DataChannel) MessagesSent() uint32 {
+ return atomic.LoadUint32(&c.messagesSent)
+}
+
+// MessagesReceived returns the number of messages received
+func (c *DataChannel) MessagesReceived() uint32 {
+ return atomic.LoadUint32(&c.messagesReceived)
+}
+
+// BytesSent returns the number of bytes sent
+func (c *DataChannel) BytesSent() uint64 {
+ return atomic.LoadUint64(&c.bytesSent)
+}
+
+// BytesReceived returns the number of bytes received
+func (c *DataChannel) BytesReceived() uint64 {
+ return atomic.LoadUint64(&c.bytesReceived)
+}
+
+// StreamIdentifier returns the Stream identifier associated to the stream.
+func (c *DataChannel) StreamIdentifier() uint16 {
+ return c.stream.StreamIdentifier()
+}
+
+func (c *DataChannel) handleDCEP(data []byte) error {
+ msg, err := parse(data)
+ if err != nil {
+ return errors.Wrap(err, "Failed to parse DataChannel packet")
+ }
+
+ switch msg := msg.(type) {
+ case *channelOpen:
+ c.log.Debug("Received DATA_CHANNEL_OPEN")
+ err = c.writeDataChannelAck()
+ if err != nil {
+ return fmt.Errorf("failed to ACK channel open: %v", err)
+ }
+ // Note: DATA_CHANNEL_OPEN message is handled inside Server() method.
+ // Therefore, the message will not reach here.
+
+ case *channelAck:
+ c.log.Debug("Received DATA_CHANNEL_ACK")
+ err = c.commitReliabilityParams()
+ if err != nil {
+ return err
+ }
+ // TODO: handle ChannelAck (https://tools.ietf.org/html/draft-ietf-rtcweb-data-protocol-09#section-5.2)
+
+ default:
+ return fmt.Errorf("unhandled DataChannel message %v", msg)
+ }
+
+ return nil
+}
+
+// Write writes len(p) bytes from p as binary data
+func (c *DataChannel) Write(p []byte) (n int, err error) {
+ return c.WriteDataChannel(p, false)
+}
+
+// WriteDataChannel writes len(p) bytes from p
+func (c *DataChannel) WriteDataChannel(p []byte, isString bool) (n int, err error) {
+ // https://tools.ietf.org/html/draft-ietf-rtcweb-data-channel-12#section-6.6
+ // SCTP does not support the sending of empty user messages. Therefore,
+ // if an empty message has to be sent, the appropriate PPID (WebRTC
+ // String Empty or WebRTC Binary Empty) is used and the SCTP user
+ // message of one zero byte is sent. When receiving an SCTP user
+ // message with one of these PPIDs, the receiver MUST ignore the SCTP
+ // user message and process it as an empty message.
+ var ppi sctp.PayloadProtocolIdentifier
+ switch {
+ case !isString && len(p) > 0:
+ ppi = sctp.PayloadTypeWebRTCBinary
+ case !isString && len(p) == 0:
+ ppi = sctp.PayloadTypeWebRTCBinaryEmpty
+ case isString && len(p) > 0:
+ ppi = sctp.PayloadTypeWebRTCString
+ case isString && len(p) == 0:
+ ppi = sctp.PayloadTypeWebRTCStringEmpty
+ }
+
+ atomic.AddUint32(&c.messagesSent, 1)
+ atomic.AddUint64(&c.bytesSent, uint64(len(p)))
+
+ if len(p) == 0 {
+ _, err := c.stream.WriteSCTP([]byte{0}, ppi)
+ return 0, err
+ }
+ return c.stream.WriteSCTP(p, ppi)
+}
+
+func (c *DataChannel) writeDataChannelAck() error {
+ ack := channelAck{}
+ ackMsg, err := ack.Marshal()
+ if err != nil {
+ return fmt.Errorf("failed to marshal ChannelOpen ACK: %v", err)
+ }
+
+ _, err = c.stream.WriteSCTP(ackMsg, sctp.PayloadTypeWebRTCDCEP)
+ if err != nil {
+ return fmt.Errorf("failed to send ChannelOpen ACK: %v", err)
+ }
+
+ return err
+}
+
+// Close closes the DataChannel and the underlying SCTP stream.
+func (c *DataChannel) Close() error {
+ // https://tools.ietf.org/html/draft-ietf-rtcweb-data-channel-13#section-6.7
+ // Closing of a data channel MUST be signaled by resetting the
+ // corresponding outgoing streams [RFC6525]. This means that if one
+ // side decides to close the data channel, it resets the corresponding
+ // outgoing stream. When the peer sees that an incoming stream was
+ // reset, it also resets its corresponding outgoing stream. Once this
+ // is completed, the data channel is closed. Resetting a stream sets
+ // the Stream Sequence Numbers (SSNs) of the stream back to 'zero' with
+ // a corresponding notification to the application layer that the reset
+ // has been performed. Streams are available for reuse after a reset
+ // has been performed.
+ return c.stream.Close()
+}
+
+// BufferedAmount returns the number of bytes of data currently queued to be
+// sent over this stream.
+func (c *DataChannel) BufferedAmount() uint64 {
+ return c.stream.BufferedAmount()
+}
+
+// BufferedAmountLowThreshold returns the number of bytes of buffered outgoing
+// data that is considered "low." Defaults to 0.
+func (c *DataChannel) BufferedAmountLowThreshold() uint64 {
+ return c.stream.BufferedAmountLowThreshold()
+}
+
+// SetBufferedAmountLowThreshold is used to update the threshold.
+// See BufferedAmountLowThreshold().
+func (c *DataChannel) SetBufferedAmountLowThreshold(th uint64) {
+ c.stream.SetBufferedAmountLowThreshold(th)
+}
+
+// OnBufferedAmountLow sets the callback handler which would be called when the
+// number of bytes of outgoing data buffered is lower than the threshold.
+func (c *DataChannel) OnBufferedAmountLow(f func()) {
+ c.stream.OnBufferedAmountLow(f)
+}
+
+func (c *DataChannel) commitReliabilityParams() error {
+ switch c.Config.ChannelType {
+ case ChannelTypeReliable:
+ c.stream.SetReliabilityParams(false, sctp.ReliabilityTypeReliable, c.Config.ReliabilityParameter)
+ case ChannelTypeReliableUnordered:
+ c.stream.SetReliabilityParams(true, sctp.ReliabilityTypeReliable, c.Config.ReliabilityParameter)
+ case ChannelTypePartialReliableRexmit:
+ c.stream.SetReliabilityParams(false, sctp.ReliabilityTypeRexmit, c.Config.ReliabilityParameter)
+ case ChannelTypePartialReliableRexmitUnordered:
+ c.stream.SetReliabilityParams(true, sctp.ReliabilityTypeRexmit, c.Config.ReliabilityParameter)
+ case ChannelTypePartialReliableTimed:
+ c.stream.SetReliabilityParams(false, sctp.ReliabilityTypeTimed, c.Config.ReliabilityParameter)
+ case ChannelTypePartialReliableTimedUnordered:
+ c.stream.SetReliabilityParams(true, sctp.ReliabilityTypeTimed, c.Config.ReliabilityParameter)
+ default:
+ return fmt.Errorf("invalid ChannelType: %v ", c.Config.ChannelType)
+ }
+ return nil
+}
diff --git a/vendor/github.com/pion/datachannel/go.mod b/vendor/github.com/pion/datachannel/go.mod
new file mode 100644
index 0000000..e635596
--- /dev/null
+++ b/vendor/github.com/pion/datachannel/go.mod
@@ -0,0 +1,11 @@
+module github.com/pion/datachannel
+
+require (
+ github.com/pion/logging v0.2.2
+ github.com/pion/sctp v1.7.10
+ github.com/pion/transport v0.10.1
+ github.com/pkg/errors v0.9.1
+ github.com/stretchr/testify v1.6.1
+)
+
+go 1.13
diff --git a/vendor/github.com/pion/datachannel/go.sum b/vendor/github.com/pion/datachannel/go.sum
new file mode 100644
index 0000000..f9ede08
--- /dev/null
+++ b/vendor/github.com/pion/datachannel/go.sum
@@ -0,0 +1,38 @@
+github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
+github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
+github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
+github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
+github.com/pion/sctp v1.7.10 h1:o3p3/hZB5Cx12RMGyWmItevJtZ6o2cpuxaw6GOS4x+8=
+github.com/pion/sctp v1.7.10/go.mod h1:EhpTUQu1/lcK3xI+eriS6/96fWetHGCvBi9MSsnaBN0=
+github.com/pion/transport v0.10.1 h1:2W+yJT+0mOQ160ThZYUx5Zp2skzshiNgxrNE9GUfhJM=
+github.com/pion/transport v0.10.1/go.mod h1:PBis1stIILMiis0PewDw91WJeLJkyIMcEk+DwKOzf4A=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/vendor/github.com/pion/datachannel/message.go b/vendor/github.com/pion/datachannel/message.go
new file mode 100644
index 0000000..84665cb
--- /dev/null
+++ b/vendor/github.com/pion/datachannel/message.go
@@ -0,0 +1,94 @@
+package datachannel
+
+import (
+ "fmt"
+
+ "github.com/pkg/errors"
+)
+
+// message is a parsed DataChannel message
+type message interface {
+ Marshal() ([]byte, error)
+ Unmarshal([]byte) error
+}
+
+// messageType is the first byte in a DataChannel message that specifies type
+type messageType byte
+
+// DataChannel Message Types
+const (
+ dataChannelAck messageType = 0x02
+ dataChannelOpen messageType = 0x03
+)
+
+func (t messageType) String() string {
+ switch t {
+ case dataChannelAck:
+ return "DataChannelAck"
+ case dataChannelOpen:
+ return "DataChannelOpen"
+ default:
+ return fmt.Sprintf("Unknown MessageType: %d", t)
+ }
+}
+
+// parse accepts raw input and returns a DataChannel message
+func parse(raw []byte) (message, error) {
+ if len(raw) == 0 {
+ return nil, errors.Errorf("DataChannel message is not long enough to determine type ")
+ }
+
+ var msg message
+ switch messageType(raw[0]) {
+ case dataChannelOpen:
+ msg = &channelOpen{}
+ case dataChannelAck:
+ msg = &channelAck{}
+ default:
+ return nil, errors.Errorf("Unknown MessageType %v", messageType(raw[0]))
+ }
+
+ if err := msg.Unmarshal(raw); err != nil {
+ return nil, err
+ }
+
+ return msg, nil
+}
+
+// parseExpectDataChannelOpen parses a DataChannelOpen message
+// or throws an error
+func parseExpectDataChannelOpen(raw []byte) (*channelOpen, error) {
+ if len(raw) == 0 {
+ return nil, errors.Errorf("the DataChannel message is not long enough to determine type")
+ }
+
+ if actualTyp := messageType(raw[0]); actualTyp != dataChannelOpen {
+ return nil, errors.Errorf("expected DataChannelOpen but got %s", actualTyp)
+ }
+
+ msg := &channelOpen{}
+ if err := msg.Unmarshal(raw); err != nil {
+ return nil, err
+ }
+
+ return msg, nil
+}
+
+// parseExpectDataChannelAck parses a DataChannelAck message
+// or throws an error
+// func parseExpectDataChannelAck(raw []byte) (*channelAck, error) {
+// if len(raw) == 0 {
+// return nil, errors.Errorf("the DataChannel message is not long enough to determine type")
+// }
+//
+// if actualTyp := messageType(raw[0]); actualTyp != dataChannelAck {
+// return nil, errors.Errorf("expected DataChannelAck but got %s", actualTyp)
+// }
+//
+// msg := &channelAck{}
+// if err := msg.Unmarshal(raw); err != nil {
+// return nil, err
+// }
+//
+// return msg, nil
+// }
diff --git a/vendor/github.com/pion/datachannel/message_channel_ack.go b/vendor/github.com/pion/datachannel/message_channel_ack.go
new file mode 100644
index 0000000..fd20757
--- /dev/null
+++ b/vendor/github.com/pion/datachannel/message_channel_ack.go
@@ -0,0 +1,22 @@
+package datachannel
+
+// channelAck is used to ACK a DataChannel open
+type channelAck struct{}
+
+const (
+ channelOpenAckLength = 4
+)
+
+// Marshal returns raw bytes for the given message
+func (c *channelAck) Marshal() ([]byte, error) {
+ raw := make([]byte, channelOpenAckLength)
+ raw[0] = uint8(dataChannelAck)
+
+ return raw, nil
+}
+
+// Unmarshal populates the struct with the given raw data
+func (c *channelAck) Unmarshal(raw []byte) error {
+ // Message type already checked in Parse and there is no further data
+ return nil
+}
diff --git a/vendor/github.com/pion/datachannel/message_channel_open.go b/vendor/github.com/pion/datachannel/message_channel_open.go
new file mode 100644
index 0000000..9dce036
--- /dev/null
+++ b/vendor/github.com/pion/datachannel/message_channel_open.go
@@ -0,0 +1,123 @@
+package datachannel
+
+import (
+ "encoding/binary"
+
+ "github.com/pkg/errors"
+)
+
+/*
+channelOpen represents a DATA_CHANNEL_OPEN Message
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+| Message Type | Channel Type | Priority |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+| Reliability Parameter |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+| Label Length | Protocol Length |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+| |
+| Label |
+| |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+| |
+| Protocol |
+| |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+*/
+type channelOpen struct {
+ ChannelType ChannelType
+ Priority uint16
+ ReliabilityParameter uint32
+
+ Label []byte
+ Protocol []byte
+}
+
+const (
+ channelOpenHeaderLength = 12
+)
+
+// ChannelType determines the reliability of the WebRTC DataChannel
+type ChannelType byte
+
+// ChannelType enums
+const (
+ // ChannelTypeReliable determines the Data Channel provides a
+ // reliable in-order bi-directional communication.
+ ChannelTypeReliable ChannelType = 0x00
+ // ChannelTypeReliableUnordered determines the Data Channel
+ // provides a reliable unordered bi-directional communication.
+ ChannelTypeReliableUnordered ChannelType = 0x80
+ // ChannelTypePartialReliableRexmit determines the Data Channel
+ // provides a partially-reliable in-order bi-directional communication.
+ // User messages will not be retransmitted more times than specified in the Reliability Parameter.
+ ChannelTypePartialReliableRexmit ChannelType = 0x01
+ // ChannelTypePartialReliableRexmitUnordered determines
+ // the Data Channel provides a partial reliable unordered bi-directional communication.
+ // User messages will not be retransmitted more times than specified in the Reliability Parameter.
+ ChannelTypePartialReliableRexmitUnordered ChannelType = 0x81
+ // ChannelTypePartialReliableTimed determines the Data Channel
+ // provides a partial reliable in-order bi-directional communication.
+ // User messages might not be transmitted or retransmitted after
+ // a specified life-time given in milli- seconds in the Reliability Parameter.
+ // This life-time starts when providing the user message to the protocol stack.
+ ChannelTypePartialReliableTimed ChannelType = 0x02
+ // The Data Channel provides a partial reliable unordered bi-directional
+ // communication. User messages might not be transmitted or retransmitted
+ // after a specified life-time given in milli- seconds in the Reliability Parameter.
+ // This life-time starts when providing the user message to the protocol stack.
+ ChannelTypePartialReliableTimedUnordered ChannelType = 0x82
+)
+
+// ChannelPriority enums
+const (
+ ChannelPriorityBelowNormal uint16 = 128
+ ChannelPriorityNormal uint16 = 256
+ ChannelPriorityHigh uint16 = 512
+ ChannelPriorityExtraHigh uint16 = 1024
+)
+
+// Marshal returns raw bytes for the given message
+func (c *channelOpen) Marshal() ([]byte, error) {
+ labelLength := len(c.Label)
+ protocolLength := len(c.Protocol)
+
+ totalLen := channelOpenHeaderLength + labelLength + protocolLength
+ raw := make([]byte, totalLen)
+
+ raw[0] = uint8(dataChannelOpen)
+ raw[1] = byte(c.ChannelType)
+ binary.BigEndian.PutUint16(raw[2:], c.Priority)
+ binary.BigEndian.PutUint32(raw[4:], c.ReliabilityParameter)
+ binary.BigEndian.PutUint16(raw[8:], uint16(labelLength))
+ binary.BigEndian.PutUint16(raw[10:], uint16(protocolLength))
+ endLabel := channelOpenHeaderLength + labelLength
+ copy(raw[channelOpenHeaderLength:endLabel], c.Label)
+ copy(raw[endLabel:endLabel+protocolLength], c.Protocol)
+
+ return raw, nil
+}
+
+// Unmarshal populates the struct with the given raw data
+func (c *channelOpen) Unmarshal(raw []byte) error {
+ if len(raw) < channelOpenHeaderLength {
+ return errors.Errorf("Length of input is not long enough to satisfy header %d", len(raw))
+ }
+ c.ChannelType = ChannelType(raw[1])
+ c.Priority = binary.BigEndian.Uint16(raw[2:])
+ c.ReliabilityParameter = binary.BigEndian.Uint32(raw[4:])
+
+ labelLength := binary.BigEndian.Uint16(raw[8:])
+ protocolLength := binary.BigEndian.Uint16(raw[10:])
+
+ if len(raw) != int(channelOpenHeaderLength+labelLength+protocolLength) {
+ return errors.Errorf("Label + Protocol length don't match full packet length")
+ }
+
+ c.Label = raw[channelOpenHeaderLength : channelOpenHeaderLength+labelLength]
+ c.Protocol = raw[channelOpenHeaderLength+labelLength : channelOpenHeaderLength+labelLength+protocolLength]
+ return nil
+}
diff --git a/vendor/github.com/pion/datachannel/renovate.json b/vendor/github.com/pion/datachannel/renovate.json
new file mode 100644
index 0000000..4400fd9
--- /dev/null
+++ b/vendor/github.com/pion/datachannel/renovate.json
@@ -0,0 +1,15 @@
+{
+ "extends": [
+ "config:base"
+ ],
+ "postUpdateOptions": [
+ "gomodTidy"
+ ],
+ "commitBody": "Generated by renovateBot",
+ "packageRules": [
+ {
+ "packagePatterns": ["^golang.org/x/"],
+ "schedule": ["on the first day of the month"]
+ }
+ ]
+}