Skip to content

Commit 82edb04

Browse files
authored
feat(signal): modularize server (#223)
1 parent 12fe885 commit 82edb04

19 files changed

+324
-311
lines changed

.github/workflows/docker-dev.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ jobs:
3333
- uses: actions/checkout@v2
3434

3535
- name: build
36-
run: docker build --tag pionwebrtc/ion-sfu:latest-protoc -f cmd/server/grpc/proto/Dockerfile .
36+
run: docker build --tag pionwebrtc/ion-sfu:latest-protoc -f cmd/signal/grpc/proto/Dockerfile .
3737

3838
- name: login
3939
if: github.event_name == 'push'

.github/workflows/docker-grpc.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
- uses: actions/checkout@v2
1818

1919
- name: build
20-
run: docker build --tag pionwebrtc/ion-sfu:latest-grpc -f cmd/server/grpc/Dockerfile .
20+
run: docker build --tag pionwebrtc/ion-sfu:latest-grpc -f cmd/signal/grpc/Dockerfile .
2121

2222
- name: login
2323
if: github.event_name == 'release'

.github/workflows/docker-jsonrpc.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
- uses: actions/checkout@v2
1818

1919
- name: build
20-
run: docker build --tag pionwebrtc/ion-sfu:latest-jsonrpc -f cmd/server/json-rpc/Dockerfile .
20+
run: docker build --tag pionwebrtc/ion-sfu:latest-jsonrpc -f cmd/signal/json-rpc/Dockerfile .
2121

2222
- name: login
2323
if: github.event_name == 'release'

Makefile

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ clean:
1212
rm -rf bin
1313

1414
build_proto:
15-
docker run -v $(CURDIR):/workspace pionwebrtc/ion-sfu:latest-protoc protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative cmd/server/grpc/proto/sfu.proto
15+
docker run -v $(CURDIR):/workspace pionwebrtc/ion-sfu:latest-protoc protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative cmd/signal/grpc/proto/sfu.proto
1616

1717

1818
build_grpc: go_init
19-
go build -o bin/sfu $(GO_LDFLAGS) ./cmd/server/grpc/main.go
19+
go build -o bin/sfu $(GO_LDFLAGS) ./cmd/signal/grpc/main.go
2020

2121
build_jsonrpc: go_init
22-
go build -o bin/sfu $(GO_LDFLAGS) ./cmd/server/json-rpc/main.go
22+
go build -o bin/sfu $(GO_LDFLAGS) ./cmd/signal/json-rpc/main.go
2323

2424
test: go_init
2525
go test \

README.md

+7-7
Original file line numberDiff line numberDiff line change
@@ -14,36 +14,36 @@
1414
</p>
1515
<br>
1616

17-
A [selective forwarding unit](https://webrtcglossary.com/sfu/) is a video routing service which allows webrtc sessions to scale more efficiently. This package provides a simple, flexible, high performance Go implementation of a WebRTC SFU. It can be called directly or through a [gRPC](cmd/server/grpc) or [json-rpc](cmd/server/json-rpc) interface.
17+
A [selective forwarding unit](https://webrtcglossary.com/sfu/) is a video routing service which allows webrtc sessions to scale more efficiently. This package provides a simple, flexible, high performance Go implementation of a WebRTC SFU. It can be called directly or through a [gRPC](cmd/signal/grpc) or [json-rpc](cmd/signal/json-rpc) interface.
1818

1919
## Getting Started
2020

21-
### Running the json-rpc server
21+
### Running the json-rpc signaling server
2222

2323
If you have a local golang environment already setup, simply run
2424

2525
```
26-
go build ./cmd/server/json-rpc/main.go && ./main -c config.toml
26+
go build ./cmd/signal/json-rpc/main.go && ./main -c config.toml
2727
```
2828

2929
If you prefer a containerized environment, you can use the included Docker image
3030

3131
```
32-
docker run -p 50051:50051 -p 5000-5020:5000-5020/udp pionwebrtc/ion-sfu:v1.0.6-jsonrpc
32+
docker run -p 50051:50051 -p 5000-5020:5000-5020/udp pionwebrtc/ion-sfu:latest-jsonrpc
3333
```
3434

35-
### Running the grpc server
35+
### Running the grpc signaling server
3636

3737
If you have a local golang environment already setup, simply run
3838

3939
```
40-
go build ./cmd/server/grpc/main.go && ./main -c config.toml
40+
go build ./cmd/signal/grpc/main.go && ./main -c config.toml
4141
```
4242

4343
If you prefer a containerized environment, you can use the included Docker image
4444

4545
```
46-
docker run -p 50051:50051 -p 5000-5020:5000-5020/udp pionwebrtc/ion-sfu:v1.0.6-grpc
46+
docker run -p 50051:50051 -p 5000-5020:5000-5020/udp pionwebrtc/ion-sfu:latest-grpc
4747
```
4848

4949
### Interacting with the server

cmd/server/grpc/Dockerfile renamed to cmd/signal/grpc/Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ RUN cd $GOPATH/src/github.com/pion/ion-sfu && go mod download
1010
COPY pkg/ $GOPATH/src/github.com/pion/ion-sfu/pkg
1111
COPY cmd/ $GOPATH/src/github.com/pion/ion-sfu/cmd
1212

13-
WORKDIR $GOPATH/src/github.com/pion/ion-sfu/cmd/server/grpc
13+
WORKDIR $GOPATH/src/github.com/pion/ion-sfu/cmd/signal/grpc
1414
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o /sfu .
1515

1616
FROM alpine:3.12.0

cmd/server/grpc/README.md renamed to cmd/signal/grpc/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
## Quick Start
66
```
7-
go build cmd/server/grpc/main.go
7+
go build cmd/signal/grpc/main.go
88
./main -c config.toml
9-
```
9+
```

cmd/signal/grpc/main.go

+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
// Package cmd contains an entrypoint for running an ion-sfu instance.
2+
package main
3+
4+
import (
5+
"flag"
6+
"fmt"
7+
"net"
8+
"os"
9+
10+
sfu "github.com/pion/ion-sfu/pkg"
11+
"github.com/pion/ion-sfu/pkg/log"
12+
"github.com/spf13/viper"
13+
"google.golang.org/grpc"
14+
15+
pb "github.com/pion/ion-sfu/cmd/signal/grpc/proto"
16+
"github.com/pion/ion-sfu/cmd/signal/grpc/server"
17+
)
18+
19+
type grpcConfig struct {
20+
Port string `mapstructure:"port"`
21+
}
22+
23+
// Config defines parameters for configuring the sfu instance
24+
type Config struct {
25+
sfu.Config `mapstructure:",squash"`
26+
GRPC grpcConfig `mapstructure:"grpc"`
27+
}
28+
29+
var (
30+
conf = Config{}
31+
file string
32+
addr string
33+
)
34+
35+
const (
36+
portRangeLimit = 100
37+
)
38+
39+
func showHelp() {
40+
fmt.Printf("Usage:%s {params}\n", os.Args[0])
41+
fmt.Println(" -c {config file}")
42+
fmt.Println(" -a {listen addr}")
43+
fmt.Println(" -h (show help info)")
44+
}
45+
46+
func load() bool {
47+
_, err := os.Stat(file)
48+
if err != nil {
49+
return false
50+
}
51+
52+
viper.SetConfigFile(file)
53+
viper.SetConfigType("toml")
54+
55+
err = viper.ReadInConfig()
56+
if err != nil {
57+
fmt.Printf("config file %s read failed. %v\n", file, err)
58+
return false
59+
}
60+
err = viper.GetViper().Unmarshal(&conf)
61+
if err != nil {
62+
fmt.Printf("sfu config file %s loaded failed. %v\n", file, err)
63+
return false
64+
}
65+
66+
if len(conf.WebRTC.ICEPortRange) > 2 {
67+
fmt.Printf("config file %s loaded failed. range port must be [min,max]\n", file)
68+
return false
69+
}
70+
71+
if len(conf.WebRTC.ICEPortRange) != 0 && conf.WebRTC.ICEPortRange[1]-conf.WebRTC.ICEPortRange[0] < portRangeLimit {
72+
fmt.Printf("config file %s loaded failed. range port must be [min, max] and max - min >= %d\n", file, portRangeLimit)
73+
return false
74+
}
75+
76+
fmt.Printf("config %s load ok!\n", file)
77+
return true
78+
}
79+
80+
func parse() bool {
81+
flag.StringVar(&file, "c", "config.toml", "config file")
82+
flag.StringVar(&addr, "a", ":50051", "address to use")
83+
help := flag.Bool("h", false, "help info")
84+
flag.Parse()
85+
if !load() {
86+
return false
87+
}
88+
89+
if *help {
90+
showHelp()
91+
return false
92+
}
93+
return true
94+
}
95+
96+
func main() {
97+
if !parse() {
98+
showHelp()
99+
os.Exit(-1)
100+
}
101+
102+
log.Init(conf.Log.Level, conf.Log.Fix)
103+
104+
log.Infof("--- Starting SFU Node ---")
105+
lis, err := net.Listen("tcp", addr)
106+
if err != nil {
107+
log.Panicf("failed to listen: %v", err)
108+
}
109+
log.Infof("SFU Listening at %s", addr)
110+
s := grpc.NewServer()
111+
inst := server.GRPCSignal{SFU: sfu.NewSFU(conf.Config)}
112+
pb.RegisterSFUService(s, &pb.SFUService{
113+
Signal: inst.Signal,
114+
})
115+
if err := s.Serve(lis); err != nil {
116+
log.Panicf("failed to serve: %v", err)
117+
}
118+
select {}
119+
}
File renamed without changes.

0 commit comments

Comments
 (0)