-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathstack.go
105 lines (77 loc) · 1.81 KB
/
stack.go
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
101
102
103
104
105
package mqtt
import (
"crypto/tls"
)
////////////////////Interface//////////////////////////////
type Stack interface {
CreateTransport(network string, address string, port int, tlsc *tls.Config) Transport
GetTransports() []Transport
DeleteTransport(t Transport)
CreateProvider() Provider
GetProviders() []Provider
DeleteProvider(p Provider)
Run()
Stop()
}
////////////////////Implementation////////////////////////
var stackSingleton Stack
func GetStack() Stack {
if stackSingleton == nil {
stackSingleton = newStack()
}
return stackSingleton
}
type stack struct {
transports map[Transport]*transport
providers map[Provider]*provider
}
func newStack() Stack {
this := &stack{}
this.transports = make(map[Transport]*transport)
this.providers = make(map[Provider]*provider)
return this
}
func (this *stack) CreateTransport(network string, address string, port int, tlsc *tls.Config) Transport {
t := newTransport(network, address, port, tlsc)
this.transports[t] = t
return t
}
func (this *stack) GetTransports() []Transport {
transports := make([]Transport, len(this.transports))
l := 0
for _, value := range this.transports {
transports[l] = value
l++
}
return transports
}
func (this *stack) DeleteTransport(t Transport) {
delete(this.transports, t)
}
func (this *stack) CreateProvider() Provider {
p := newProvider()
this.providers[p] = p
return p
}
func (this *stack) GetProviders() []Provider {
providers := make([]Provider, len(this.providers))
l := 0
for _, value := range this.providers {
providers[l] = value
l++
}
return providers
}
func (this *stack) DeleteProvider(p Provider) {
delete(this.providers, p)
}
func (this *stack) Run() {
for _, p := range this.providers {
go p.Run()
}
}
func (this *stack) Stop() {
for _, p := range this.providers {
p.Stop()
}
}