diff --git a/services/instance.go b/services/instance.go index 6b3c8f6..fa4cd7c 100644 --- a/services/instance.go +++ b/services/instance.go @@ -63,9 +63,7 @@ func NewInstance(session *Session) (*Instance, error) { go instance.Attach() - rw.Lock() err = saveSessionsToDisk() - rw.Unlock() if err != nil { return nil, err } diff --git a/services/session.go b/services/session.go index c2db13a..6ac4c55 100644 --- a/services/session.go +++ b/services/session.go @@ -62,6 +62,12 @@ func CreateWSServer() *socketio.Server { return server } +func CloseSessionAfter(s *Session, d time.Duration) { + time.AfterFunc(d, func() { + CloseSession(s) + }) +} + func CloseSession(s *Session) error { s.rw.Lock() defer s.rw.Unlock() @@ -96,14 +102,17 @@ func NewSession() (*Session, error) { sessions[s.Id] = s // Schedule cleanup of the session - time.AfterFunc(4*time.Hour, func() { - CloseSession(s) - }) + CloseSessionAfter(s, 4*time.Hour) if err := CreateNetwork(s.Id); err != nil { log.Println("ERROR NETWORKING") return nil, err } + + // We store sessions as soon as we create one so we don't delete new sessions on an api restart + if err := saveSessionsToDisk(); err != nil { + return nil, err + } return s, nil } @@ -126,12 +135,24 @@ func LoadSessionsFromDisk() error { if err == nil { decoder := gob.NewDecoder(file) err = decoder.Decode(&sessions) + + if err != nil { + return err + } + + // schedule session expiration + for _, s := range sessions { + timeLeft := s.ExpiresAt.Sub(time.Now()) + CloseSessionAfter(s, timeLeft) + } } file.Close() return err } func saveSessionsToDisk() error { + rw.Lock() + defer rw.Unlock() file, err := os.Create("./pwd/sessions.gob") if err == nil { encoder := gob.NewEncoder(file)