24
vendor/github.com/pion/udp/.gitignore
generated
vendored
Normal file
24
vendor/github.com/pion/udp/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
### JetBrains IDE ###
|
||||
#####################
|
||||
.idea/
|
||||
|
||||
### Emacs Temporary Files ###
|
||||
#############################
|
||||
*~
|
||||
|
||||
### Folders ###
|
||||
###############
|
||||
bin/
|
||||
vendor/
|
||||
node_modules/
|
||||
|
||||
### Files ###
|
||||
#############
|
||||
*.ivf
|
||||
*.ogg
|
||||
tags
|
||||
cover.out
|
||||
*.sw[poe]
|
||||
*.wasm
|
||||
examples/sfu-ws/cert.pem
|
||||
examples/sfu-ws/key.pem
|
||||
89
vendor/github.com/pion/udp/.golangci.yml
generated
vendored
Normal file
89
vendor/github.com/pion/udp/.golangci.yml
generated
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
linters-settings:
|
||||
govet:
|
||||
check-shadowing: true
|
||||
misspell:
|
||||
locale: US
|
||||
exhaustive:
|
||||
default-signifies-exhaustive: true
|
||||
gomodguard:
|
||||
blocked:
|
||||
modules:
|
||||
- github.com/pkg/errors:
|
||||
recommendations:
|
||||
- errors
|
||||
|
||||
linters:
|
||||
enable:
|
||||
- asciicheck # Simple linter to check that your code does not contain non-ASCII identifiers
|
||||
- bodyclose # checks whether HTTP response body is closed successfully
|
||||
- deadcode # Finds unused code
|
||||
- depguard # Go linter that checks if package imports are in a list of acceptable packages
|
||||
- dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f())
|
||||
- dupl # Tool for code clone detection
|
||||
- errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases
|
||||
- exhaustive # check exhaustiveness of enum switch statements
|
||||
- exportloopref # checks for pointers to enclosing loop variables
|
||||
- gci # Gci control golang package import order and make it always deterministic.
|
||||
- gochecknoglobals # Checks that no globals are present in Go code
|
||||
- gochecknoinits # Checks that no init functions are present in Go code
|
||||
- gocognit # Computes and checks the cognitive complexity of functions
|
||||
- goconst # Finds repeated strings that could be replaced by a constant
|
||||
- gocritic # The most opinionated Go source code linter
|
||||
- godox # Tool for detection of FIXME, TODO and other comment keywords
|
||||
- goerr113 # Golang linter to check the errors handling expressions
|
||||
- gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification
|
||||
- gofumpt # Gofumpt checks whether code was gofumpt-ed.
|
||||
- goheader # Checks is file header matches to pattern
|
||||
- goimports # Goimports does everything that gofmt does. Additionally it checks unused imports
|
||||
- golint # Golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes
|
||||
- gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations.
|
||||
- goprintffuncname # Checks that printf-like functions are named with `f` at the end
|
||||
- gosec # Inspects source code for security problems
|
||||
- gosimple # Linter for Go source code that specializes in simplifying a code
|
||||
- govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string
|
||||
- ineffassign # Detects when assignments to existing variables are not used
|
||||
- misspell # Finds commonly misspelled English words in comments
|
||||
- nakedret # Finds naked returns in functions greater than a specified function length
|
||||
- noctx # noctx finds sending http request without context.Context
|
||||
- scopelint # Scopelint checks for unpinned variables in go programs
|
||||
- staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks
|
||||
- structcheck # Finds unused struct fields
|
||||
- stylecheck # Stylecheck is a replacement for golint
|
||||
- typecheck # Like the front-end of a Go compiler, parses and type-checks Go code
|
||||
- unconvert # Remove unnecessary type conversions
|
||||
- unparam # Reports unused function parameters
|
||||
- unused # Checks Go code for unused constants, variables, functions and types
|
||||
- varcheck # Finds unused global variables and constants
|
||||
- whitespace # Tool for detection of leading and trailing whitespace
|
||||
disable:
|
||||
- funlen # Tool for detection of long functions
|
||||
- gocyclo # Computes and checks the cyclomatic complexity of functions
|
||||
- godot # Check if comments end in a period
|
||||
- gomnd # An analyzer to detect magic numbers.
|
||||
- lll # Reports long lines
|
||||
- maligned # Tool to detect Go structs that would take less memory if their fields were sorted
|
||||
- nestif # Reports deeply nested if statements
|
||||
- nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity
|
||||
- nolintlint # Reports ill-formed or insufficient nolint directives
|
||||
- prealloc # Finds slice declarations that could potentially be preallocated
|
||||
- rowserrcheck # checks whether Err of rows is checked successfully
|
||||
- sqlclosecheck # Checks that sql.Rows and sql.Stmt are closed.
|
||||
- testpackage # linter that makes you use a separate _test package
|
||||
- wsl # Whitespace Linter - Forces you to use empty lines!
|
||||
|
||||
issues:
|
||||
exclude-use-default: false
|
||||
exclude-rules:
|
||||
# Allow complex tests, better to be self contained
|
||||
- path: _test\.go
|
||||
linters:
|
||||
- gocognit
|
||||
|
||||
# Allow complex main function in examples
|
||||
- path: examples
|
||||
text: "of func `main` is high"
|
||||
linters:
|
||||
- gocognit
|
||||
|
||||
run:
|
||||
skip-dirs-use-default: false
|
||||
21
vendor/github.com/pion/udp/LICENSE
generated
vendored
Normal file
21
vendor/github.com/pion/udp/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020
|
||||
|
||||
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.
|
||||
41
vendor/github.com/pion/udp/README.md
generated
vendored
Normal file
41
vendor/github.com/pion/udp/README.md
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
<h1 align="center">
|
||||
<br>
|
||||
Pion UDP
|
||||
<br>
|
||||
</h1>
|
||||
<h4 align="center">A connection-oriented listener over a UDP PacketConn</h4>
|
||||
<p align="center">
|
||||
<a href="https://pion.ly"><img src="https://img.shields.io/badge/pion-udp-gray.svg?longCache=true&colorB=brightgreen" alt="Pion UDP"></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/udp"><img src="https://travis-ci.org/pion/udp.svg?branch=master" alt="Build Status"></a>
|
||||
<a href="https://pkg.go.dev/github.com/pion/udp"><img src="https://godoc.org/github.com/pion/udp?status.svg" alt="GoDoc"></a>
|
||||
<a href="https://codecov.io/gh/pion/udp"><img src="https://codecov.io/gh/pion/udp/branch/master/graph/badge.svg" alt="Coverage Status"></a>
|
||||
<a href="https://goreportcard.com/report/github.com/pion/udp"><img src="https://goreportcard.com/badge/github.com/pion/udp" 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>
|
||||
|
||||
### Roadmap
|
||||
This package is used in the [DTLS](https://github.com/pion/dtls) and [SCTP](https://github.com/pion/sctp) transport to provide a connection-oriented listener over a UDP.
|
||||
|
||||
### Community
|
||||
Pion has an active community on the [Golang Slack](https://pion.ly/slack/). 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:
|
||||
|
||||
* [Sean DuBois](https://github.com/Sean-Der) - *Original Author*
|
||||
* [Michiel De Backker](https://github.com/backkem) - *Original Author*
|
||||
* [Atsushi Watanabe](https://github.com/at-wat) - *Original Author*
|
||||
* [ZHENK](https://github.com/scorpionknifes)
|
||||
* [Daniel Beseda](https://github.com/besedad)
|
||||
|
||||
### License
|
||||
MIT License - see [LICENSE](LICENSE) for full text
|
||||
20
vendor/github.com/pion/udp/codecov.yml
generated
vendored
Normal file
20
vendor/github.com/pion/udp/codecov.yml
generated
vendored
Normal file
@@ -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/**/*"
|
||||
302
vendor/github.com/pion/udp/conn.go
generated
vendored
Normal file
302
vendor/github.com/pion/udp/conn.go
generated
vendored
Normal file
@@ -0,0 +1,302 @@
|
||||
// Package udp provides a connection-oriented listener over a UDP PacketConn
|
||||
package udp
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"net"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/pion/transport/deadline"
|
||||
"github.com/pion/transport/packetio"
|
||||
)
|
||||
|
||||
const (
|
||||
receiveMTU = 8192
|
||||
defaultListenBacklog = 128 // same as Linux default
|
||||
)
|
||||
|
||||
// Typed errors
|
||||
var (
|
||||
ErrClosedListener = errors.New("udp: listener closed")
|
||||
ErrListenQueueExceeded = errors.New("udp: listen queue exceeded")
|
||||
)
|
||||
|
||||
// listener augments a connection-oriented Listener over a UDP PacketConn
|
||||
type listener struct {
|
||||
pConn *net.UDPConn
|
||||
|
||||
accepting atomic.Value // bool
|
||||
acceptCh chan *Conn
|
||||
doneCh chan struct{}
|
||||
doneOnce sync.Once
|
||||
acceptFilter func([]byte) bool
|
||||
readBufferPool *sync.Pool
|
||||
|
||||
connLock sync.Mutex
|
||||
conns map[string]*Conn
|
||||
connWG sync.WaitGroup
|
||||
|
||||
readWG sync.WaitGroup
|
||||
errClose atomic.Value // error
|
||||
}
|
||||
|
||||
// Accept waits for and returns the next connection to the listener.
|
||||
func (l *listener) Accept() (net.Conn, error) {
|
||||
select {
|
||||
case c := <-l.acceptCh:
|
||||
l.connWG.Add(1)
|
||||
return c, nil
|
||||
|
||||
case <-l.doneCh:
|
||||
return nil, ErrClosedListener
|
||||
}
|
||||
}
|
||||
|
||||
// Close closes the listener.
|
||||
// Any blocked Accept operations will be unblocked and return errors.
|
||||
func (l *listener) Close() error {
|
||||
var err error
|
||||
l.doneOnce.Do(func() {
|
||||
l.accepting.Store(false)
|
||||
close(l.doneCh)
|
||||
|
||||
l.connLock.Lock()
|
||||
// Close unaccepted connections
|
||||
L_CLOSE:
|
||||
for {
|
||||
select {
|
||||
case c := <-l.acceptCh:
|
||||
close(c.doneCh)
|
||||
delete(l.conns, c.rAddr.String())
|
||||
|
||||
default:
|
||||
break L_CLOSE
|
||||
}
|
||||
}
|
||||
nConns := len(l.conns)
|
||||
l.connLock.Unlock()
|
||||
|
||||
l.connWG.Done()
|
||||
|
||||
if nConns == 0 {
|
||||
// Wait if this is the final connection
|
||||
l.readWG.Wait()
|
||||
if errClose, ok := l.errClose.Load().(error); ok {
|
||||
err = errClose
|
||||
}
|
||||
} else {
|
||||
err = nil
|
||||
}
|
||||
})
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// Addr returns the listener's network address.
|
||||
func (l *listener) Addr() net.Addr {
|
||||
return l.pConn.LocalAddr()
|
||||
}
|
||||
|
||||
// ListenConfig stores options for listening to an address.
|
||||
type ListenConfig struct {
|
||||
// Backlog defines the maximum length of the queue of pending
|
||||
// connections. It is equivalent of the backlog argument of
|
||||
// POSIX listen function.
|
||||
// If a connection request arrives when the queue is full,
|
||||
// the request will be silently discarded, unlike TCP.
|
||||
// Set zero to use default value 128 which is same as Linux default.
|
||||
Backlog int
|
||||
|
||||
// AcceptFilter determines whether the new conn should be made for
|
||||
// the incoming packet. If not set, any packet creates new conn.
|
||||
AcceptFilter func([]byte) bool
|
||||
}
|
||||
|
||||
// Listen creates a new listener based on the ListenConfig.
|
||||
func (lc *ListenConfig) Listen(network string, laddr *net.UDPAddr) (net.Listener, error) {
|
||||
if lc.Backlog == 0 {
|
||||
lc.Backlog = defaultListenBacklog
|
||||
}
|
||||
|
||||
conn, err := net.ListenUDP(network, laddr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
l := &listener{
|
||||
pConn: conn,
|
||||
acceptCh: make(chan *Conn, lc.Backlog),
|
||||
conns: make(map[string]*Conn),
|
||||
doneCh: make(chan struct{}),
|
||||
acceptFilter: lc.AcceptFilter,
|
||||
readBufferPool: &sync.Pool{
|
||||
New: func() interface{} {
|
||||
buf := make([]byte, receiveMTU)
|
||||
return &buf
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
l.accepting.Store(true)
|
||||
l.connWG.Add(1)
|
||||
l.readWG.Add(2) // wait readLoop and Close execution routine
|
||||
|
||||
go l.readLoop()
|
||||
go func() {
|
||||
l.connWG.Wait()
|
||||
if err := l.pConn.Close(); err != nil {
|
||||
l.errClose.Store(err)
|
||||
}
|
||||
l.readWG.Done()
|
||||
}()
|
||||
|
||||
return l, nil
|
||||
}
|
||||
|
||||
// Listen creates a new listener using default ListenConfig.
|
||||
func Listen(network string, laddr *net.UDPAddr) (net.Listener, error) {
|
||||
return (&ListenConfig{}).Listen(network, laddr)
|
||||
}
|
||||
|
||||
// readLoop has to tasks:
|
||||
// 1. Dispatching incoming packets to the correct Conn.
|
||||
// It can therefore not be ended until all Conns are closed.
|
||||
// 2. Creating a new Conn when receiving from a new remote.
|
||||
func (l *listener) readLoop() {
|
||||
defer l.readWG.Done()
|
||||
|
||||
for {
|
||||
buf := *(l.readBufferPool.Get().(*[]byte))
|
||||
n, raddr, err := l.pConn.ReadFrom(buf)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
conn, ok, err := l.getConn(raddr, buf[:n])
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
if ok {
|
||||
_, _ = conn.buffer.Write(buf[:n])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (l *listener) getConn(raddr net.Addr, buf []byte) (*Conn, bool, error) {
|
||||
l.connLock.Lock()
|
||||
defer l.connLock.Unlock()
|
||||
conn, ok := l.conns[raddr.String()]
|
||||
if !ok {
|
||||
if !l.accepting.Load().(bool) {
|
||||
return nil, false, ErrClosedListener
|
||||
}
|
||||
if l.acceptFilter != nil {
|
||||
if !l.acceptFilter(buf) {
|
||||
return nil, false, nil
|
||||
}
|
||||
}
|
||||
conn = l.newConn(raddr)
|
||||
select {
|
||||
case l.acceptCh <- conn:
|
||||
l.conns[raddr.String()] = conn
|
||||
default:
|
||||
return nil, false, ErrListenQueueExceeded
|
||||
}
|
||||
}
|
||||
return conn, true, nil
|
||||
}
|
||||
|
||||
// Conn augments a connection-oriented connection over a UDP PacketConn
|
||||
type Conn struct {
|
||||
listener *listener
|
||||
|
||||
rAddr net.Addr
|
||||
|
||||
buffer *packetio.Buffer
|
||||
|
||||
doneCh chan struct{}
|
||||
doneOnce sync.Once
|
||||
|
||||
writeDeadline *deadline.Deadline
|
||||
}
|
||||
|
||||
func (l *listener) newConn(rAddr net.Addr) *Conn {
|
||||
return &Conn{
|
||||
listener: l,
|
||||
rAddr: rAddr,
|
||||
buffer: packetio.NewBuffer(),
|
||||
doneCh: make(chan struct{}),
|
||||
writeDeadline: deadline.New(),
|
||||
}
|
||||
}
|
||||
|
||||
// Read reads from c into p
|
||||
func (c *Conn) Read(p []byte) (int, error) {
|
||||
return c.buffer.Read(p)
|
||||
}
|
||||
|
||||
// Write writes len(p) bytes from p to the DTLS connection
|
||||
func (c *Conn) Write(p []byte) (n int, err error) {
|
||||
select {
|
||||
case <-c.writeDeadline.Done():
|
||||
return 0, context.DeadlineExceeded
|
||||
default:
|
||||
}
|
||||
return c.listener.pConn.WriteTo(p, c.rAddr)
|
||||
}
|
||||
|
||||
// Close closes the conn and releases any Read calls
|
||||
func (c *Conn) Close() error {
|
||||
var err error
|
||||
c.doneOnce.Do(func() {
|
||||
c.listener.connWG.Done()
|
||||
close(c.doneCh)
|
||||
c.listener.connLock.Lock()
|
||||
delete(c.listener.conns, c.rAddr.String())
|
||||
nConns := len(c.listener.conns)
|
||||
c.listener.connLock.Unlock()
|
||||
|
||||
if nConns == 0 && !c.listener.accepting.Load().(bool) {
|
||||
// Wait if this is the final connection
|
||||
c.listener.readWG.Wait()
|
||||
if errClose, ok := c.listener.errClose.Load().(error); ok {
|
||||
err = errClose
|
||||
}
|
||||
} else {
|
||||
err = nil
|
||||
}
|
||||
})
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// LocalAddr implements net.Conn.LocalAddr
|
||||
func (c *Conn) LocalAddr() net.Addr {
|
||||
return c.listener.pConn.LocalAddr()
|
||||
}
|
||||
|
||||
// RemoteAddr implements net.Conn.RemoteAddr
|
||||
func (c *Conn) RemoteAddr() net.Addr {
|
||||
return c.rAddr
|
||||
}
|
||||
|
||||
// SetDeadline implements net.Conn.SetDeadline
|
||||
func (c *Conn) SetDeadline(t time.Time) error {
|
||||
c.writeDeadline.Set(t)
|
||||
return c.SetReadDeadline(t)
|
||||
}
|
||||
|
||||
// SetReadDeadline implements net.Conn.SetDeadline
|
||||
func (c *Conn) SetReadDeadline(t time.Time) error {
|
||||
return c.buffer.SetReadDeadline(t)
|
||||
}
|
||||
|
||||
// SetWriteDeadline implements net.Conn.SetDeadline
|
||||
func (c *Conn) SetWriteDeadline(t time.Time) error {
|
||||
c.writeDeadline.Set(t)
|
||||
// Write deadline of underlying connection should not be changed
|
||||
// since the connection can be shared.
|
||||
return nil
|
||||
}
|
||||
15
vendor/github.com/pion/udp/renovate.json
generated
vendored
Normal file
15
vendor/github.com/pion/udp/renovate.json
generated
vendored
Normal file
@@ -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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user