-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.go
More file actions
100 lines (84 loc) · 1.88 KB
/
server.go
File metadata and controls
100 lines (84 loc) · 1.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package sio
import (
"github.com/funcards/engine.io"
"go.uber.org/zap"
"sync"
"time"
)
var _ Server = (*server)(nil)
type Config struct {
ConnectionTimeout time.Duration `yaml:"connection_timeout" env-default:"90s" env:"SIO_CONNECTION_TIMEOUT"`
}
type Server interface {
Cfg() Config
Shutdown()
AdapterFactory() AdapterFactory
HasNamespace(nsp string) bool
Namespace(nsp string) Namespace
}
type server struct {
cfg Config
eServer eio.Server
adapterFactory AdapterFactory
log *zap.Logger
namespaces *sync.Map
stop chan struct{}
}
func NewServer(cfg Config, eServer eio.Server, adapterFactory AdapterFactory, logger *zap.Logger) *server {
s := &server{
cfg: cfg,
eServer: eServer,
adapterFactory: adapterFactory,
log: logger,
namespaces: new(sync.Map),
stop: make(chan struct{}, 1),
}
s.setup()
return s
}
func (s *server) Cfg() Config {
return s.cfg
}
func (s *server) Shutdown() {
close(s.stop)
}
func (s *server) AdapterFactory() AdapterFactory {
return s.adapterFactory
}
func (s *server) HasNamespace(nsp string) bool {
_, ok := s.namespaces.Load(norm(nsp))
return ok
}
func (s *server) Namespace(nsp string) Namespace {
nsp = norm(nsp)
if value, ok := s.namespaces.Load(nsp); ok {
return value.(Namespace)
}
s.log.Debug("create new namespace", zap.String("nsp", nsp))
n := NewNamespace(nsp, s, s.log)
s.namespaces.Store(nsp, n)
return n
}
func (s *server) setup() {
_ = s.Namespace("/")
go s.run()
}
func (s *server) run() {
onConnection := s.eServer.On(eio.TopicConnection)
defer s.eServer.Off(eio.TopicConnection, onConnection)
for {
select {
case <-s.stop:
return
case event := <-onConnection:
sck := event.Args[0].(eio.Socket)
NewClient(s, sck, s.log)
}
}
}
func norm(nsp string) string {
if nsp[0] != '/' {
return "/" + nsp
}
return nsp
}