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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b89b31830df40400ae8b85614ea7e1dd3695ecea3530f5cf6814379141b97af0
4
- data.tar.gz: d4fdac63a75efec29de802492c2156dce7440cbac8c9e4aa75717b89717c391c
3
+ metadata.gz: ef2b5f38feff65a39f75d3a4c338b7af141dfefcad6ab1ec4682230de001d813
4
+ data.tar.gz: 267450182f020d74bb51dc09672b82e4991986e63934e6e9841cf48a96bdc5f1
5
5
  SHA512:
6
- metadata.gz: 69102b0fce7f039808e9ec7645a9af8b1ad4273023943a7d92374ab804e2a64fa0bca50ea27e314be34d1af5d794ed646ca07993a3887ff1c3309db1544c114f
7
- data.tar.gz: 359c454912cebdb5bec61418391da05f437aed12aab7d294b60f7fe764ac3ec4b27cfa4e05852cc27de49eaa8b03ce0c25d2171aa2c1b88772e31ccd1ae113ce
6
+ metadata.gz: 85f049c0a1e7ba903382326594d4cc5e2b608cf881be048cd166b548540bebcc800682e13159bbd732778d869eed5438850dc229c7348ef11a2898c75fea8975
7
+ data.tar.gz: 7d6896cfbab526bf5155edcde237579e04728af33dd6e2778e79b5bd57a3d4681e72a73a4c6193166fa29aa5680f719de93bf7ac2296d473ef7b1876252c88bd
@@ -1,52 +1,138 @@
1
- module Telegem
2
- module Session
3
- class MemoryStore
4
- def initialize
5
- @store = {}
6
- @mutex = Mutex.new
7
- end
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
- def get(key)
10
- @mutex.synchronize do
11
- @store[key.to_s]
12
- end
13
- end
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
- def set(key, value)
16
- @mutex.synchronize do
17
- @store[key.to_s] = value
18
- end
19
- end
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
- def delete(key)
22
- @mutex.synchronize do
23
- @store.delete(key.to_s)
24
- end
25
- end
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
- def clear
28
- @mutex.synchronize do
29
- @store.clear
30
- end
31
- end
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
- def keys
34
- @mutex.synchronize do
35
- @store.keys
36
- end
37
- end
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
- def size
40
- @mutex.synchronize do
41
- @store.size
42
- end
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
- def empty?
46
- @mutex.synchronize do
47
- @store.empty?
48
- end
49
- end
50
- end
51
- end
52
- end
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
@@ -1,6 +1,6 @@
1
1
  # lib/telegem.rb
2
2
  module Telegem
3
- VERSION = '0.1.4'.freeze
3
+ VERSION = '0.1.5'.freeze
4
4
 
5
5
  # Define module structure
6
6
  module API; end
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.4"
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"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: telegem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phantom