reprogl

Форк
0
/
data.go 
80 строк · 1.1 Кб
1
package session
2

3
import (
4
	"encoding/json"
5
	"sync"
6
	"time"
7

8
	"xelbot.com/reprogl/security"
9
)
10

11
type Status uint8
12

13
const (
14
	Unmodified Status = iota
15
	Modified
16
	Destroyed
17
)
18

19
type deadline time.Time
20

21
type Store struct {
22
	status Status
23
	data   internalData
24
	mu     sync.RWMutex
25
}
26

27
type internalData struct {
28
	values   map[string]interface{}
29
	identity security.Identity
30
	deadline deadline
31
}
32

33
func newStore() *Store {
34
	return &Store{
35
		status: Unmodified,
36
		data: internalData{
37
			values: make(map[string]interface{}),
38
		},
39
	}
40
}
41

42
func newStoreWithData(d internalData) *Store {
43
	return &Store{
44
		status: Unmodified,
45
		data:   d,
46
	}
47
}
48

49
func (d *deadline) UnmarshalJSON(b []byte) error {
50
	var s string
51
	if err := json.Unmarshal(b, &s); err != nil {
52
		return err
53
	}
54

55
	t, err := time.Parse(time.RFC3339, s)
56
	if err != nil {
57
		return err
58
	}
59
	*d = deadline(t)
60

61
	return nil
62
}
63

64
func (d deadline) MarshalJSON() ([]byte, error) {
65
	t := time.Time(d)
66

67
	return json.Marshal(t.Format(time.RFC3339))
68
}
69

70
func (s *Store) setModified() {
71
	if s.status != Destroyed {
72
		s.status = Modified
73
	}
74
}
75

76
func (d deadline) IsExpired() bool {
77
	t := time.Time(d)
78

79
	return t.Before(time.Now())
80
}
81

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.