@@ -37,10 +37,12 @@
37 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Channels []string `json:"channels"` // convenience: same as Config.Channels
38 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Permissions []string `json:"permissions"` // convenience: same as Config.Permissions
39 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Config EngagementConfig `json:"config"`
40 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
CreatedAt time.Time `json:"created_at"`
41 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Revoked bool `json:"revoked"`
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ LastSeen *time.Time `json:"last_seen,omitempty"`
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Online bool `json:"online"`
42 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
43 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
44 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Credentials are the SASL credentials an agent uses to connect to Ergo.
45 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
type Credentials struct {
46 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Nick string `json:"nick"`
@@ -369,19 +371,34 @@
369 371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
r.mu.RLock()
370 372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
defer r.mu.RUnlock()
371 373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return r.get(nick)
372 374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
373 375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // List returns all registered, non-revoked agents.
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // Touch updates the last-seen timestamp for an agent.
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func (r *Registry) Touch(nick string) {
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r.mu.Lock()
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ defer r.mu.Unlock()
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a, ok := r.agents[nick]
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !ok || a.Revoked {
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ now := time.Now()
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a.LastSeen = &now
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // Don't persist every heartbeat — just keep in memory.
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const onlineThreshold = 2 * time.Minute
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // List returns all registered agents with computed online status.
375 392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
func (r *Registry) List() []*Agent {
376 393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
r.mu.RLock()
377 394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
defer r.mu.RUnlock()
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ now := time.Now()
378 396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var out []*Agent
379 397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for _, a := range r.agents {
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if !a.Revoked {
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- out = append(out, a)
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a.Online = a.LastSeen != nil && now.Sub(*a.LastSeen) < onlineThreshold
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ out = append(out, a)
383 400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
384 401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return out
385 402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
386 403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
387 404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
func (r *Registry) get(nick string) (*Agent, error) {
388 405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!