telegem 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/session/memory_store.rb +52 -23
- data/lib/session/middleware.rb +8 -11
- data/lib/telegem.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 30803f9ebb55570bae838e9db45dd199763fe54878341d5fed9c32cc204b169c
|
|
4
|
+
data.tar.gz: 1e87a27402e8b205d2fefc1fb1ac85aa161a7138166391d5d7cd9804188215d7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 57ddfbe1edd755e30be1e854fda4c390ea25b3976655de59f0b5e6befa5e2ace3ed135aa463a7b897a179f12f40c10d644e877baf8f4966a7deac99de7ec6d85
|
|
7
|
+
data.tar.gz: d3aaab61e1faddc352f8702f7c85c5d7db5ef28a72c2ce70c73b08202b7245429deb9ed2b167f9bfb467172fcd69215ea3ede5907c84b090837f8cad13339536
|
data/lib/session/memory_store.rb
CHANGED
|
@@ -1,19 +1,24 @@
|
|
|
1
|
-
# lib/
|
|
1
|
+
# lib/session/memory_store.rb - PRODUCTION READY
|
|
2
2
|
module Telegem
|
|
3
|
-
module
|
|
3
|
+
module Session
|
|
4
4
|
class MemoryStore
|
|
5
|
-
def initialize
|
|
5
|
+
def initialize
|
|
6
6
|
@store = {}
|
|
7
7
|
@ttls = {}
|
|
8
8
|
@mutex = Mutex.new
|
|
9
|
-
@default_ttl =
|
|
9
|
+
@default_ttl = 300 # 5 minutes
|
|
10
|
+
@cleanup_interval = 60 # Clean expired every minute
|
|
11
|
+
@last_cleanup = Time.now
|
|
10
12
|
end
|
|
11
13
|
|
|
12
|
-
# Store with optional TTL
|
|
14
|
+
# Store with optional TTL
|
|
13
15
|
def set(key, value, ttl: nil)
|
|
14
16
|
@mutex.synchronize do
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
auto_cleanup
|
|
18
|
+
key_s = key.to_s
|
|
19
|
+
@store[key_s] = value
|
|
20
|
+
@ttls[key_s] = Time.now + (ttl || @default_ttl)
|
|
21
|
+
value
|
|
17
22
|
end
|
|
18
23
|
end
|
|
19
24
|
|
|
@@ -23,8 +28,8 @@ module Telegem
|
|
|
23
28
|
key_s = key.to_s
|
|
24
29
|
return nil unless @store.key?(key_s)
|
|
25
30
|
|
|
26
|
-
#
|
|
27
|
-
if
|
|
31
|
+
# Auto-clean if expired
|
|
32
|
+
if expired?(key_s)
|
|
28
33
|
delete(key_s)
|
|
29
34
|
return nil
|
|
30
35
|
end
|
|
@@ -38,14 +43,7 @@ module Telegem
|
|
|
38
43
|
@mutex.synchronize do
|
|
39
44
|
key_s = key.to_s
|
|
40
45
|
return false unless @store.key?(key_s)
|
|
41
|
-
|
|
42
|
-
# Check if expired
|
|
43
|
-
if @ttls[key_s] && Time.now > @ttls[key_s]
|
|
44
|
-
delete(key_s)
|
|
45
|
-
return false
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
true
|
|
46
|
+
!expired?(key_s)
|
|
49
47
|
end
|
|
50
48
|
end
|
|
51
49
|
|
|
@@ -55,6 +53,7 @@ module Telegem
|
|
|
55
53
|
key_s = key.to_s
|
|
56
54
|
@store.delete(key_s)
|
|
57
55
|
@ttls.delete(key_s)
|
|
56
|
+
true
|
|
58
57
|
end
|
|
59
58
|
end
|
|
60
59
|
|
|
@@ -74,7 +73,7 @@ module Telegem
|
|
|
74
73
|
increment(key, -amount)
|
|
75
74
|
end
|
|
76
75
|
|
|
77
|
-
# Clear expired entries
|
|
76
|
+
# Clear expired entries (auto-called)
|
|
78
77
|
def cleanup
|
|
79
78
|
@mutex.synchronize do
|
|
80
79
|
now = Time.now
|
|
@@ -84,6 +83,7 @@ module Telegem
|
|
|
84
83
|
@ttls.delete(key)
|
|
85
84
|
end
|
|
86
85
|
end
|
|
86
|
+
@last_cleanup = now
|
|
87
87
|
end
|
|
88
88
|
end
|
|
89
89
|
|
|
@@ -92,14 +92,15 @@ module Telegem
|
|
|
92
92
|
@mutex.synchronize do
|
|
93
93
|
@store.clear
|
|
94
94
|
@ttls.clear
|
|
95
|
+
@last_cleanup = Time.now
|
|
95
96
|
end
|
|
96
97
|
end
|
|
97
98
|
|
|
98
99
|
# Get all keys (non-expired)
|
|
99
100
|
def keys
|
|
100
101
|
@mutex.synchronize do
|
|
101
|
-
|
|
102
|
-
@store.keys
|
|
102
|
+
auto_cleanup
|
|
103
|
+
@store.keys.select { |k| !expired?(k) }
|
|
103
104
|
end
|
|
104
105
|
end
|
|
105
106
|
|
|
@@ -133,6 +134,34 @@ module Telegem
|
|
|
133
134
|
true
|
|
134
135
|
end
|
|
135
136
|
end
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
137
|
+
|
|
138
|
+
# Redis-like scan for pattern matching
|
|
139
|
+
def scan(pattern = "*", count: 10)
|
|
140
|
+
@mutex.synchronize do
|
|
141
|
+
auto_cleanup
|
|
142
|
+
regex = pattern_to_regex(pattern)
|
|
143
|
+
matching_keys = @store.keys.select { |k| k.match?(regex) && !expired?(k) }
|
|
144
|
+
matching_keys.first(count)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
private
|
|
149
|
+
|
|
150
|
+
def expired?(key)
|
|
151
|
+
@ttls[key] && Time.now > @ttls[key]
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def auto_cleanup
|
|
155
|
+
if Time.now - @last_cleanup > @cleanup_interval
|
|
156
|
+
cleanup
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def pattern_to_regex(pattern)
|
|
161
|
+
# Convert Redis-style pattern to Ruby regex
|
|
162
|
+
regex_str = pattern.gsub('*', '.*').gsub('?', '.')
|
|
163
|
+
Regexp.new("^#{regex_str}$")
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
data/lib/session/middleware.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# lib/session/middleware.rb
|
|
1
|
+
# lib/session/middleware.rb
|
|
2
2
|
module Telegem
|
|
3
3
|
module Session
|
|
4
4
|
class Middleware
|
|
@@ -13,18 +13,15 @@ module Telegem
|
|
|
13
13
|
# Load session
|
|
14
14
|
ctx.session = @store.get(user_id) || {}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
begin
|
|
17
|
+
# Execute the rest of the chain
|
|
18
|
+
result = next_middleware.call(ctx)
|
|
19
|
+
ensure
|
|
20
|
+
# Always save session, even if error
|
|
21
|
+
@store.set(user_id, ctx.session)
|
|
22
|
+
end
|
|
18
23
|
|
|
19
|
-
# Save session (regardless of result)
|
|
20
|
-
@store.set(user_id, ctx.session)
|
|
21
|
-
|
|
22
|
-
# Return whatever the chain returned
|
|
23
24
|
result
|
|
24
|
-
rescue => e
|
|
25
|
-
# Save session even on error
|
|
26
|
-
@store.set(user_id, ctx.session) if user_id && ctx.session
|
|
27
|
-
raise e
|
|
28
25
|
end
|
|
29
26
|
|
|
30
27
|
private
|
data/lib/telegem.rb
CHANGED