forked from go-netty/go-netty
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoptions.go
131 lines (115 loc) · 3.65 KB
/
options.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
130
131
/*
* Copyright 2019 the go-netty project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package netty
import (
"context"
"sync/atomic"
"github.com/go-netty/go-netty/transport"
)
type (
// ChannelInitializer to init the pipeline of channel
ChannelInitializer func(Channel)
// ChannelFactory to create a channel
ChannelFactory func(id int64, ctx context.Context, pipeline Pipeline, transport transport.Transport, executor Executor) Channel
// PipelineFactory to create pipeline
PipelineFactory func() Pipeline
// TransportFactory tp create transport
TransportFactory transport.Factory
// ChannelIDFactory to create channel id
ChannelIDFactory func() int64
// ChannelHolder to manage channels
ChannelHolder interface {
ActiveHandler
InactiveHandler
// CloseAll close the all channels
CloseAll(err error)
}
// bootstrapOptions
bootstrapOptions struct {
bootstrapCtx context.Context
bootstrapCancel context.CancelFunc
clientInitializer ChannelInitializer
childInitializer ChannelInitializer
transportFactory TransportFactory
channelFactory ChannelFactory
pipelineFactory PipelineFactory
channelIDFactory ChannelIDFactory
executor Executor
holder ChannelHolder
}
)
// SequenceID to generate a sequence id
func SequenceID() ChannelIDFactory {
var id int64
return func() int64 {
return atomic.AddInt64(&id, 1)
}
}
type Option func(options *bootstrapOptions)
// WithContext fork child context with context.WithCancel
func WithContext(ctx context.Context) Option {
return func(options *bootstrapOptions) {
options.bootstrapCtx, options.bootstrapCancel = context.WithCancel(ctx)
}
}
// WithChannelID to set ChannelIDFactory
func WithChannelID(channelIDFactory ChannelIDFactory) Option {
return func(options *bootstrapOptions) {
options.channelIDFactory = channelIDFactory
}
}
// WithPipeline to set PipelineFactory
func WithPipeline(pipelineFactory PipelineFactory) Option {
return func(options *bootstrapOptions) {
options.pipelineFactory = pipelineFactory
}
}
// WithChannel to set ChannelFactory
func WithChannel(channelFactory ChannelFactory) Option {
return func(options *bootstrapOptions) {
options.channelFactory = channelFactory
}
}
// WithTransport to set TransportFactory
func WithTransport(transportFactory TransportFactory) Option {
return func(options *bootstrapOptions) {
options.transportFactory = transportFactory
}
}
// WithChildInitializer to set server side ChannelInitializer
func WithChildInitializer(initializer ChannelInitializer) Option {
return func(options *bootstrapOptions) {
options.childInitializer = initializer
}
}
// WithClientInitializer to set client side ChannelInitializer
func WithClientInitializer(initializer ChannelInitializer) Option {
return func(options *bootstrapOptions) {
options.clientInitializer = initializer
}
}
// WithExecutor use custom Executor
func WithExecutor(executor Executor) Option {
return func(options *bootstrapOptions) {
options.executor = executor
}
}
// WithChannelHolder use custom ChannelHolder
func WithChannelHolder(holder ChannelHolder) Option {
return func(options *bootstrapOptions) {
options.holder = holder
}
}