| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package router
- import (
- "sync"
- "time"
- )
- type RoutingEntry struct {
- tag string
- err error
- expire time.Time
- }
- func (v *RoutingEntry) Extend() {
- v.expire = time.Now().Add(time.Hour)
- }
- func (v *RoutingEntry) Expired() bool {
- return v.expire.Before(time.Now())
- }
- type RoutingTable struct {
- sync.RWMutex
- table map[string]*RoutingEntry
- }
- func NewRoutingTable() *RoutingTable {
- return &RoutingTable{
- table: make(map[string]*RoutingEntry),
- }
- }
- func (v *RoutingTable) Cleanup() {
- v.Lock()
- defer v.Unlock()
- for key, value := range v.table {
- if value.Expired() {
- delete(v.table, key)
- }
- }
- }
- func (v *RoutingTable) Set(destination string, tag string, err error) {
- v.Lock()
- defer v.Unlock()
- entry := &RoutingEntry{
- tag: tag,
- err: err,
- }
- entry.Extend()
- v.table[destination] = entry
- if len(v.table) > 1000 {
- go v.Cleanup()
- }
- }
- func (v *RoutingTable) Get(destination string) (bool, string, error) {
- v.RLock()
- defer v.RUnlock()
- entry, found := v.table[destination]
- if !found {
- return false, "", nil
- }
- entry.Extend()
- return true, entry.tag, entry.err
- }
|