v2 / vlib / x / sessions / memory_store.v
58 lines · 49 sloc · 1.28 KB · e2e5cf8db56f3562c7baa735061690be936bdf3e
Raw
1module sessions
2
3import time
4
5pub struct MemoryStoreSessions[T] {
6pub mut:
7 created_at time.Time
8 data T
9}
10
11// MemoryStore stores sessions in a `map` in memory only.
12pub struct MemoryStore[T] {
13pub mut:
14 data map[string]MemoryStoreSessions[T]
15}
16
17// get data from all sessions.
18pub fn (mut store MemoryStore[T]) all() ![]T {
19 return store.data.values().map(it.data)
20}
21
22// get session for session id `sid`. The session can be `max_age` old.
23// `max_age` will be ignored when set to `0`
24pub fn (mut store MemoryStore[T]) get(sid string, max_age time.Duration) !T {
25 if record := store.data[sid] {
26 // session is expired
27 if max_age != 0 && record.created_at.add(max_age) < time.now() {
28 store.destroy(sid)!
29 return error('session is expired')
30 }
31
32 return record.data
33 } else {
34 return error('session does not exist')
35 }
36}
37
38// destroy data for session id `sid`.
39pub fn (mut store MemoryStore[T]) destroy(sid string) ! {
40 store.data.delete(sid)
41}
42
43// clear all sessions.
44pub fn (mut store MemoryStore[T]) clear() ! {
45 store.data.clear()
46}
47
48// set session data for session id `sid`.
49pub fn (mut store MemoryStore[T]) set(sid string, val T) ! {
50 if sid in store.data {
51 store.data[sid].data = val
52 } else {
53 store.data[sid] = MemoryStoreSessions[T]{
54 created_at: time.now()
55 data: val
56 }
57 }
58}
59