@@ -13,6 +13,7 @@ import (
13
13
)
14
14
15
15
type Session struct {
16
+ mu sync.RWMutex // Mutex to protect non-data fields
16
17
id string // session id
17
18
fresh bool // if new session
18
19
ctx fiber.Ctx // fiber context
@@ -56,11 +57,15 @@ func releaseSession(s *Session) {
56
57
57
58
// Fresh is true if the current session is new
58
59
func (s * Session ) Fresh () bool {
60
+ s .mu .RLock ()
61
+ defer s .mu .RUnlock ()
59
62
return s .fresh
60
63
}
61
64
62
65
// ID returns the session id
63
66
func (s * Session ) ID () string {
67
+ s .mu .RLock ()
68
+ defer s .mu .RUnlock ()
64
69
return s .id
65
70
}
66
71
@@ -101,6 +106,9 @@ func (s *Session) Destroy() error {
101
106
// Reset local data
102
107
s .data .Reset ()
103
108
109
+ s .mu .Lock ()
110
+ defer s .mu .Unlock ()
111
+
104
112
// Use external Storage if exist
105
113
if err := s .config .Storage .Delete (s .id ); err != nil {
106
114
return err
@@ -113,6 +121,9 @@ func (s *Session) Destroy() error {
113
121
114
122
// Regenerate generates a new session id and delete the old one from Storage
115
123
func (s * Session ) Regenerate () error {
124
+ s .mu .Lock ()
125
+ defer s .mu .Unlock ()
126
+
116
127
// Delete old id from storage
117
128
if err := s .config .Storage .Delete (s .id ); err != nil {
118
129
return err
@@ -137,6 +148,9 @@ func (s *Session) Reset() error {
137
148
// Reset expiration
138
149
s .exp = 0
139
150
151
+ s .mu .Lock ()
152
+ defer s .mu .Unlock ()
153
+
140
154
// Delete old id from storage
141
155
if err := s .config .Storage .Delete (s .id ); err != nil {
142
156
return err
@@ -153,10 +167,7 @@ func (s *Session) Reset() error {
153
167
154
168
// refresh generates a new session, and set session.fresh to be true
155
169
func (s * Session ) refresh () {
156
- // Create a new id
157
170
s .id = s .config .KeyGenerator ()
158
-
159
- // We assign a new id to the session, so the session must be fresh
160
171
s .fresh = true
161
172
}
162
173
@@ -167,6 +178,9 @@ func (s *Session) Save() error {
167
178
return nil
168
179
}
169
180
181
+ s .mu .Lock ()
182
+ defer s .mu .Unlock ()
183
+
170
184
// Check if session has your own expiration, otherwise use default value
171
185
if s .exp <= 0 {
172
186
s .exp = s .config .Expiration
@@ -176,25 +190,23 @@ func (s *Session) Save() error {
176
190
s .setSession ()
177
191
178
192
// Convert data to bytes
179
- mux .Lock ()
180
- defer mux .Unlock ()
181
193
encCache := gob .NewEncoder (s .byteBuffer )
182
194
err := encCache .Encode (& s .data .Data )
183
195
if err != nil {
184
196
return fmt .Errorf ("failed to encode data: %w" , err )
185
197
}
186
198
187
- // copy the data in buffer
199
+ // Copy the data in buffer
188
200
encodedBytes := make ([]byte , s .byteBuffer .Len ())
189
201
copy (encodedBytes , s .byteBuffer .Bytes ())
190
202
191
- // pass copied bytes with session id to provider
203
+ // Pass copied bytes with session id to provider
192
204
if err := s .config .Storage .Set (s .id , encodedBytes , s .exp ); err != nil {
193
205
return err
194
206
}
195
207
196
208
// Release session
197
- // TODO: It's not safe to use the Session after called Save()
209
+ // TODO: It's not safe to use the Session after calling Save()
198
210
releaseSession (s )
199
211
200
212
return nil
@@ -210,6 +222,8 @@ func (s *Session) Keys() []string {
210
222
211
223
// SetExpiry sets a specific expiration for this session
212
224
func (s * Session ) SetExpiry (exp time.Duration ) {
225
+ s .mu .Lock ()
226
+ defer s .mu .Unlock ()
213
227
s .exp = exp
214
228
}
215
229
@@ -275,3 +289,13 @@ func (s *Session) delSession() {
275
289
fasthttp .ReleaseCookie (fcookie )
276
290
}
277
291
}
292
+
293
+ // decodeSessionData decodes the session data from raw bytes.
294
+ func (s * Session ) decodeSessionData (rawData []byte ) error {
295
+ _ , _ = s .byteBuffer .Write (rawData )
296
+ encCache := gob .NewDecoder (s .byteBuffer )
297
+ if err := encCache .Decode (& s .data .Data ); err != nil {
298
+ return fmt .Errorf ("failed to decode session data: %w" , err )
299
+ }
300
+ return nil
301
+ }
0 commit comments