neko/server/internal/session/serialize.go

98 lines
2.1 KiB
Go
Raw Normal View History

2023-03-28 05:33:51 +13:00
package session
import (
"encoding/json"
"errors"
"os"
"github.com/demodesk/neko/pkg/types"
)
func (manager *SessionManagerCtx) save() {
if manager.config.File == "" {
return
}
// serialize sessions
sessions := make([]types.SessionProfile, 0, len(manager.sessions))
for _, session := range manager.sessions {
sessions = append(sessions, types.SessionProfile{
Id: session.id,
Token: session.token,
Profile: session.profile,
})
}
// convert to json
data, err := json.Marshal(sessions)
if err != nil {
manager.logger.Error().Err(err).Msg("failed to marshal sessions")
return
}
// write to file
err = os.WriteFile(manager.config.File, data, 0644)
if err != nil {
manager.logger.Error().Err(err).
Str("file", manager.config.File).
Msg("failed to write sessions to a file")
}
}
func (manager *SessionManagerCtx) load() {
if manager.config.File == "" {
return
}
// read file
data, err := os.ReadFile(manager.config.File)
if err != nil {
// if file does not exist
if errors.Is(err, os.ErrNotExist) {
manager.logger.Info().
Str("file", manager.config.File).
Msg("sessions file does not exist")
return
}
manager.logger.Error().Err(err).
Str("file", manager.config.File).
Msg("failed to read sessions from a file")
return
}
// if file is empty
if len(data) == 0 {
manager.logger.Info().
Str("file", manager.config.File).
Msg("sessions file is empty")
return
}
// deserialize sessions
sessions := make([]types.SessionProfile, 0)
err = json.Unmarshal(data, &sessions)
if err != nil {
manager.logger.Error().Err(err).Msg("failed to unmarshal sessions")
return
}
// create sessions
manager.sessionsMu.Lock()
for _, session := range sessions {
manager.tokens[session.Token] = session.Id
manager.sessions[session.Id] = &SessionCtx{
id: session.Id,
token: session.Token,
manager: manager,
logger: manager.logger.With().Str("session_id", session.Id).Logger(),
profile: session.Profile,
}
}
manager.sessionsMu.Unlock()
manager.logger.Info().
Int("sessions", len(sessions)).
Str("file", manager.config.File).
Msg("loaded sessions from a file")
}