telegem 0.1.4 → 0.1.5
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 +130 -44
- data/lib/telegem.rb +1 -1
- data/telegem.gemspec +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: ef2b5f38feff65a39f75d3a4c338b7af141dfefcad6ab1ec4682230de001d813
|
|
4
|
+
data.tar.gz: 267450182f020d74bb51dc09672b82e4991986e63934e6e9841cf48a96bdc5f1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 85f049c0a1e7ba903382326594d4cc5e2b608cf881be048cd166b548540bebcc800682e13159bbd732778d869eed5438850dc229c7348ef11a2898c75fea8975
|
|
7
|
+
data.tar.gz: 7d6896cfbab526bf5155edcde237579e04728af33dd6e2778e79b5bd57a3d4681e72a73a4c6193166fa29aa5680f719de93bf7ac2296d473ef7b1876252c88bd
|
data/lib/session/memory_store.rb
CHANGED
|
@@ -1,52 +1,138 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
# lib/core/memory_store.rb - Generic in-memory store for caching/rate limiting
|
|
2
|
+
module Telegem
|
|
3
|
+
module Core
|
|
4
|
+
class MemoryStore
|
|
5
|
+
def initialize(default_ttl: 300) # 5 minutes default
|
|
6
|
+
@store = {}
|
|
7
|
+
@ttls = {}
|
|
8
|
+
@mutex = Mutex.new
|
|
9
|
+
@default_ttl = default_ttl
|
|
10
|
+
end
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
# Store with optional TTL (Time To Live in seconds)
|
|
13
|
+
def set(key, value, ttl: nil)
|
|
14
|
+
@mutex.synchronize do
|
|
15
|
+
@store[key.to_s] = value
|
|
16
|
+
@ttls[key.to_s] = Time.now + (ttl || @default_ttl)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
14
19
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
# Get value if not expired
|
|
21
|
+
def get(key)
|
|
22
|
+
@mutex.synchronize do
|
|
23
|
+
key_s = key.to_s
|
|
24
|
+
return nil unless @store.key?(key_s)
|
|
25
|
+
|
|
26
|
+
# Check if expired
|
|
27
|
+
if @ttls[key_s] && Time.now > @ttls[key_s]
|
|
28
|
+
delete(key_s)
|
|
29
|
+
return nil
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
@store[key_s]
|
|
33
|
+
end
|
|
34
|
+
end
|
|
20
35
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
36
|
+
# Check if key exists and not expired
|
|
37
|
+
def exist?(key)
|
|
38
|
+
@mutex.synchronize do
|
|
39
|
+
key_s = key.to_s
|
|
40
|
+
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
|
|
49
|
+
end
|
|
50
|
+
end
|
|
26
51
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
52
|
+
# Delete key
|
|
53
|
+
def delete(key)
|
|
54
|
+
@mutex.synchronize do
|
|
55
|
+
key_s = key.to_s
|
|
56
|
+
@store.delete(key_s)
|
|
57
|
+
@ttls.delete(key_s)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
32
60
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
61
|
+
# Increment counter (for rate limiting)
|
|
62
|
+
def increment(key, amount = 1, ttl: nil)
|
|
63
|
+
@mutex.synchronize do
|
|
64
|
+
key_s = key.to_s
|
|
65
|
+
current = get(key_s) || 0
|
|
66
|
+
new_value = current + amount
|
|
67
|
+
set(key_s, new_value, ttl: ttl)
|
|
68
|
+
new_value
|
|
69
|
+
end
|
|
70
|
+
end
|
|
38
71
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
72
|
+
# Decrement counter
|
|
73
|
+
def decrement(key, amount = 1)
|
|
74
|
+
increment(key, -amount)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Clear expired entries
|
|
78
|
+
def cleanup
|
|
79
|
+
@mutex.synchronize do
|
|
80
|
+
now = Time.now
|
|
81
|
+
@ttls.each do |key, expires|
|
|
82
|
+
if now > expires
|
|
83
|
+
@store.delete(key)
|
|
84
|
+
@ttls.delete(key)
|
|
43
85
|
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Clear everything
|
|
91
|
+
def clear
|
|
92
|
+
@mutex.synchronize do
|
|
93
|
+
@store.clear
|
|
94
|
+
@ttls.clear
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Get all keys (non-expired)
|
|
99
|
+
def keys
|
|
100
|
+
@mutex.synchronize do
|
|
101
|
+
cleanup # Remove expired first
|
|
102
|
+
@store.keys
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Get size (non-expired entries)
|
|
107
|
+
def size
|
|
108
|
+
keys.size
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def empty?
|
|
112
|
+
size == 0
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Get TTL remaining in seconds
|
|
116
|
+
def ttl(key)
|
|
117
|
+
@mutex.synchronize do
|
|
118
|
+
key_s = key.to_s
|
|
119
|
+
return -1 unless @ttls[key_s]
|
|
120
|
+
|
|
121
|
+
remaining = @ttls[key_s] - Time.now
|
|
122
|
+
remaining > 0 ? remaining.ceil : -1
|
|
123
|
+
end
|
|
124
|
+
end
|
|
44
125
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
126
|
+
# Set TTL for existing key
|
|
127
|
+
def expire(key, ttl)
|
|
128
|
+
@mutex.synchronize do
|
|
129
|
+
key_s = key.to_s
|
|
130
|
+
return false unless @store.key?(key_s)
|
|
131
|
+
|
|
132
|
+
@ttls[key_s] = Time.now + ttl
|
|
133
|
+
true
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end # class MemoryStore
|
|
137
|
+
end # module Core
|
|
138
|
+
end # module Telegem
|
data/lib/telegem.rb
CHANGED
data/telegem.gemspec
CHANGED
|
@@ -4,7 +4,7 @@ Gem::Specification.new do |spec|
|
|
|
4
4
|
|
|
5
5
|
# Read version from lib/telegem.rb
|
|
6
6
|
version_file = File.read('lib/telegem.rb').match(/VERSION\s*=\s*['"]([^'"]+)['"]/)
|
|
7
|
-
spec.version = version_file ? version_file[1] : "0.1.
|
|
7
|
+
spec.version = version_file ? version_file[1] : "0.1.5"
|
|
8
8
|
|
|
9
9
|
spec.authors = ["Phantom"]
|
|
10
10
|
spec.email = ["ynghosted@icloud.com"]
|