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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ea53e017f3e5f0ff481d9f640bf82c5681d9b3dabd68ee49337c34b5ea0aea66
4
- data.tar.gz: 1b03ff5505a56bb8f162551e5b0cc9581c8a768392f9e4bcf2ac18498e674df9
3
+ metadata.gz: 30803f9ebb55570bae838e9db45dd199763fe54878341d5fed9c32cc204b169c
4
+ data.tar.gz: 1e87a27402e8b205d2fefc1fb1ac85aa161a7138166391d5d7cd9804188215d7
5
5
  SHA512:
6
- metadata.gz: d64bc2fc39a48c2841a6556b293db447a35bc23763037698a2e8e102679569df83fcb1d81c764d7a337920de8af27b09dc2393ef4bff897694edfb5c4cf8b006
7
- data.tar.gz: 1a59d2eb28883e015048400c7951f1281fe85cc9d665875c81112239ba8ceeb4287d78cc2c6a1effe3fd127257fb67b3a0a571d4a50881ad5557f7d1a17d6bbe
6
+ metadata.gz: 57ddfbe1edd755e30be1e854fda4c390ea25b3976655de59f0b5e6befa5e2ace3ed135aa463a7b897a179f12f40c10d644e877baf8f4966a7deac99de7ec6d85
7
+ data.tar.gz: d3aaab61e1faddc352f8702f7c85c5d7db5ef28a72c2ce70c73b08202b7245429deb9ed2b167f9bfb467172fcd69215ea3ede5907c84b090837f8cad13339536
@@ -1,19 +1,24 @@
1
- # lib/core/memory_store.rb - Generic in-memory store for caching/rate limiting
1
+ # lib/session/memory_store.rb - PRODUCTION READY
2
2
  module Telegem
3
- module Core
3
+ module Session
4
4
  class MemoryStore
5
- def initialize(default_ttl: 300) # 5 minutes default
5
+ def initialize
6
6
  @store = {}
7
7
  @ttls = {}
8
8
  @mutex = Mutex.new
9
- @default_ttl = 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 (Time To Live in seconds)
14
+ # Store with optional TTL
13
15
  def set(key, value, ttl: nil)
14
16
  @mutex.synchronize do
15
- @store[key.to_s] = value
16
- @ttls[key.to_s] = Time.now + (ttl || @default_ttl)
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
- # Check if expired
27
- if @ttls[key_s] && Time.now > @ttls[key_s]
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
- cleanup # Remove expired first
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
- end # class MemoryStore
137
- end # module Core
138
- end # module Telegem
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
@@ -1,4 +1,4 @@
1
- # lib/session/middleware.rb - UPDATED
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
- # Run the chain
17
- result = next_middleware.call(ctx)
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
@@ -2,7 +2,7 @@
2
2
  require 'logger'
3
3
  require 'json'
4
4
  module Telegem
5
- VERSION = "1.0.3".freeze
5
+ VERSION = "1.0.4".freeze
6
6
  end
7
7
 
8
8
  # Load core components
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: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Your Name