/
collection.go
129 lines (105 loc) · 2.4 KB
/
collection.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package event
import (
"sync"
"github.com/the-anna-project/storage"
)
// CollectionConfig represents the configuration used to create a new event
// collection.
type CollectionConfig struct {
// Dependencies.
StorageCollection *storage.Collection
}
// DefaultCollectionConfig provides a default configuration to create a new
// event collection by best effort.
func DefaultCollectionConfig() CollectionConfig {
var err error
var storageCollection *storage.Collection
{
storageConfig := storage.DefaultCollectionConfig()
storageCollection, err = storage.NewCollection(storageConfig)
if err != nil {
panic(err)
}
}
config := CollectionConfig{
// Dependencies.
StorageCollection: storageCollection,
}
return config
}
// NewCollection creates a new configured event Collection.
func NewCollection(config CollectionConfig) (*Collection, error) {
// Dependencies.
if config.StorageCollection == nil {
return nil, maskAnyf(invalidConfigError, "storage collection must not be empty")
}
var err error
var activatorService Service
{
activatorConfig := DefaultServiceConfig()
activatorConfig.Kind = KindActivator
activatorConfig.StorageCollection = config.StorageCollection
activatorService, err = NewService(activatorConfig)
if err != nil {
return nil, maskAny(err)
}
}
var networkService Service
{
networkConfig := DefaultServiceConfig()
networkConfig.Kind = KindNetwork
networkConfig.StorageCollection = config.StorageCollection
networkService, err = NewService(networkConfig)
if err != nil {
return nil, maskAny(err)
}
}
newCollection := &Collection{
// Internals.
bootOnce: sync.Once{},
shutdownOnce: sync.Once{},
Activator: activatorService,
Network: networkService,
}
return newCollection, nil
}
// Collection is the object bundling all services.
type Collection struct {
// Internals.
bootOnce sync.Once
shutdownOnce sync.Once
Activator Service
Network Service
}
func (c *Collection) Boot() {
c.bootOnce.Do(func() {
var wg sync.WaitGroup
wg.Add(1)
go func() {
c.Activator.Boot()
wg.Done()
}()
wg.Add(1)
go func() {
c.Network.Boot()
wg.Done()
}()
wg.Wait()
})
}
func (c *Collection) Shutdown() {
c.shutdownOnce.Do(func() {
var wg sync.WaitGroup
wg.Add(1)
go func() {
c.Activator.Shutdown()
wg.Done()
}()
wg.Add(1)
go func() {
c.Network.Shutdown()
wg.Done()
}()
wg.Wait()
})
}