reprogl

Форк
0
/
codec.go 
57 строк · 1.2 Кб
1
package session
2

3
import (
4
	"bytes"
5
	"encoding/json"
6

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

10
type serializer interface {
11
	serialize(src internalData) ([]byte, error)
12
	deserialize(src []byte) (internalData, error)
13
}
14

15
type jsonEncoder struct{}
16

17
func (e jsonEncoder) serialize(src internalData) ([]byte, error) {
18
	aux := struct {
19
		Identity security.Identity `json:"a"`
20
		Values   map[string]any    `json:"v,omitempty"`
21
		Deadline deadline          `json:"d"`
22
	}{
23
		Identity: src.identity,
24
		Values:   src.values,
25
		Deadline: src.deadline,
26
	}
27

28
	buf := new(bytes.Buffer)
29
	if err := json.NewEncoder(buf).Encode(&aux); err != nil {
30
		return nil, err
31
	}
32

33
	return buf.Bytes(), nil
34
}
35

36
func (e jsonEncoder) deserialize(src []byte) (internalData, error) {
37
	aux := struct {
38
		Identity security.Identity `json:"a"`
39
		Values   map[string]any    `json:"v,omitempty"`
40
		Deadline deadline          `json:"d"`
41
	}{}
42

43
	if err := json.NewDecoder(bytes.NewReader(src)).Decode(&aux); err != nil {
44
		return internalData{}, DecodeError
45
	}
46

47
	var values = aux.Values
48
	if aux.Values == nil {
49
		values = make(map[string]any)
50
	}
51

52
	return internalData{
53
		identity: aux.Identity,
54
		values:   values,
55
		deadline: aux.Deadline,
56
	}, nil
57
}
58

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

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

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

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