-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodule.go
More file actions
283 lines (218 loc) · 7.84 KB
/
Copy pathmodule.go
File metadata and controls
283 lines (218 loc) · 7.84 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
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
// Package voidbus provides module abstraction for VoidBus v3.0.
package voidbus
import (
"time"
"github.com/Script-OS/VoidBus/channel"
"github.com/Script-OS/VoidBus/codec"
"github.com/Script-OS/VoidBus/fragment"
"github.com/Script-OS/VoidBus/session"
)
// Module is the base interface for all VoidBus modules.
type Module interface {
// Name returns the module name.
Name() string
// Stop stops the module and releases resources.
Stop() error
// ModuleStats returns module statistics.
ModuleStats() interface{}
}
// CodecModule is the abstraction for codec management module.
// Type-safe interface (v3.0 improvement).
type CodecModule interface {
Module
// === Codec Registration ===
// AddCodec registers a codec with user-defined code.
// Type-safe: requires codec.Codec interface.
AddCodec(codec codec.Codec, code string) error
// SetMaxDepth sets maximum codec chain depth.
SetMaxDepth(depth int) error
// SetSalt sets salt for hash computation.
SetSalt(salt []byte)
// === Codec Selection ===
// RandomSelect randomly selects codec chain.
// Type-safe: returns codec.CodecChain interface.
RandomSelect() (codes []string, chain codec.CodecChain, err error)
// MatchByHash matches codec chain by hash.
// Type-safe: returns codec.CodecChain interface.
MatchByHash(hash [32]byte) (codes []string, chain codec.CodecChain, err error)
// ComputeHash computes hash for codec codes.
ComputeHash(codes []string) [32]byte
// === Negotiation ===
// Negotiate performs capability negotiation.
Negotiate(remoteCodes []string, remoteMaxDepth int, salt []byte) ([]string, error)
// GetSupportedCodes returns supported codec codes.
GetSupportedCodes() []string
// GetMaxDepth returns maximum depth.
GetMaxDepth() int
// IsNegotiated returns negotiation status.
IsNegotiated() bool
}
// ChannelModule is the abstraction for channel management module.
// Type-safe interface (v3.0 improvement).
type ChannelModule interface {
Module
// === Channel Registration ===
// AddChannel adds a channel to the pool.
// Type-safe: requires channel.Channel interface.
AddChannel(channel channel.Channel, id string) error
// RemoveChannel removes a channel from the pool.
RemoveChannel(id string) error
// SetMTUOverride sets custom MTU for a channel.
SetMTUOverride(id string, mtu int) error
// SetDefaultMTU sets default MTU for all channels.
SetDefaultMTU(mtu int)
// === Channel Selection ===
// RandomSelect randomly selects a channel.
// Type-safe: returns channel.Channel interface.
RandomSelect() (channel.Channel, error)
// SelectHealthy selects the healthiest channel.
// Type-safe: returns channel.Channel interface.
SelectHealthy() (channel.Channel, error)
// SelectForMTU selects channel suitable for given data size.
// Type-safe: returns channel.Channel interface.
SelectForMTU(dataSize int) (channel.Channel, error)
// GetAdaptiveMTU returns adaptive MTU based on all channels.
GetAdaptiveMTU() int
// === Health Tracking ===
// RecordSend records successful send operation.
// Type-safe: latency parameter uses time.Duration.
RecordSend(id string, latency time.Duration)
// RecordError records send error.
RecordError(id string)
// GetHealthScore returns health score for a channel.
GetHealthScore(id string) (float64, error)
// === Management ===
// Count returns number of channels.
Count() int
// GetChannelIDs returns all channel IDs.
GetChannelIDs() []string
// CloseAll closes all channels.
CloseAll() error
}
// FragmentModule is the abstraction for fragment management module.
// Type-safe interface (v3.0 improvement).
type FragmentModule interface {
Module
// === Send Buffer ===
// CreateSendBuffer creates send buffer for a session.
// Type-safe: returns fragment.SendBuffer pointer.
CreateSendBuffer(sessionID string, data []byte) *fragment.SendBuffer
// GetSendBuffer retrieves send buffer.
// Type-safe: returns fragment.SendBuffer pointer.
GetSendBuffer(sessionID string) (*fragment.SendBuffer, error)
// RemoveSendBuffer removes send buffer.
RemoveSendBuffer(sessionID string) error
// === Receive Buffer ===
// CreateRecvBuffer creates receive buffer for a session.
// Type-safe: returns fragment.RecvBuffer pointer.
CreateRecvBuffer(sessionID string, total uint16, codecDepth uint8, codecHash [32]byte, dataHash [32]byte) *fragment.RecvBuffer
// GetRecvBuffer retrieves receive buffer.
// Type-safe: returns fragment.RecvBuffer pointer.
GetRecvBuffer(sessionID string) (*fragment.RecvBuffer, error)
// RemoveRecvBuffer removes receive buffer.
RemoveRecvBuffer(sessionID string) error
// === Fragmentation ===
// AdaptiveSplit splits data adaptively based on MTU.
AdaptiveSplit(data []byte, mtu int) ([][]byte, []uint32, error)
// Reassemble reassembles fragments.
Reassemble(sessionID string) ([]byte, error)
// === NAK Handling ===
// GetMissingFragments returns missing fragment indices.
GetMissingFragments(sessionID string) ([]uint16, error)
// === Cleanup ===
// CleanupExpired removes expired buffers.
CleanupExpired() int
// ClearAll clears all buffers.
ClearAll() error
}
// SessionModule is the abstraction for session management module.
// Type-safe interface (v3.0 improvement).
type SessionModule interface {
Module
// === Send Session ===
// CreateSendSession creates send session.
// Type-safe: returns session.Session pointer.
CreateSendSession(codecCodes []string, codecHash [32]byte, codecDepth int, dataHash [32]byte) *session.Session
// GetSendSession retrieves send session.
// Type-safe: returns session.Session pointer.
GetSendSession(sessionID string) (*session.Session, error)
// CompleteSendSession marks send session as completed.
CompleteSendSession(sessionID string) error
// RemoveSendSession removes send session.
RemoveSendSession(sessionID string) error
// === Receive Session ===
// CreateRecvSession creates receive session.
// Type-safe: returns session.Session pointer.
CreateRecvSession(sessionID string, codecCodes []string, codecHash [32]byte, codecDepth int, dataHash [32]byte) *session.Session
// GetRecvSession retrieves receive session.
// Type-safe: returns session.Session pointer.
GetRecvSession(sessionID string) (*session.Session, error)
// CompleteRecvSession marks receive session as completed.
CompleteRecvSession(sessionID string) error
// === Lookup ===
// Exists checks if session exists.
Exists(sessionID string) bool
// === Cleanup ===
// CleanupExpired removes expired sessions.
CleanupExpired() int
// ClearAll clears all sessions.
ClearAll() error
}
// ModuleConfig holds configuration for module initialization.
type ModuleConfig struct {
// Module name
Name string
// Module-specific configuration
Config interface{}
}
// ModuleRegistry manages module registration and lifecycle.
type ModuleRegistry struct {
modules map[string]Module
}
// NewModuleRegistry creates a new module registry.
func NewModuleRegistry() *ModuleRegistry {
return &ModuleRegistry{
modules: make(map[string]Module),
}
}
// Register registers a module.
func (r *ModuleRegistry) Register(module Module) error {
if module == nil {
return ErrModuleNotSet
}
name := module.Name()
if name == "" {
return ErrBusConfig
}
if _, exists := r.modules[name]; exists {
return ErrModuleNotSet
}
r.modules[name] = module
return nil
}
// Get retrieves a module by name.
func (r *ModuleRegistry) Get(name string) (Module, error) {
module, exists := r.modules[name]
if !exists {
return nil, ErrModuleNotSet
}
return module, nil
}
// StopAll stops all registered modules.
func (r *ModuleRegistry) StopAll() error {
var lastErr error
for _, module := range r.modules {
if err := module.Stop(); err != nil {
lastErr = err
}
}
return lastErr
}
// List returns all registered module names.
func (r *ModuleRegistry) List() []string {
names := make([]string, 0, len(r.modules))
for name := range r.modules {
names = append(names, name)
}
return names
}