Class: Mxrb::Runtime::MemorySharedStore
- Inherits:
-
Object
- Object
- Mxrb::Runtime::MemorySharedStore
- Includes:
- SchedulerCoordinator, SessionStore
- Defined in:
- lib/mxrb/runtime/shared_store.rb
Overview
Process-local implementation of the shared runtime contracts. It keeps the standalone runtime dependency-free while exposing the same API as SQLiteSharedStore for injection in SessionManager and Scheduler.
Instance Method Summary collapse
- #claim_scheduled_event(event:, slot:, owner:, now:, lease_until:, skip_overlap:) ⇒ Object
- #close ⇒ Object
- #complete_scheduled_event(event:, slot:, owner:, now: Time.now.utc) ⇒ Object
- #delete_session(token) ⇒ Object
-
#initialize ⇒ MemorySharedStore
constructor
A new instance of MemorySharedStore.
- #read_session(token, now: Time.now.utc) ⇒ Object
- #renew_scheduled_event(event:, slot:, owner:, lease_until:) ⇒ Object
- #write_session(token:, identity:, expires_at:) ⇒ Object
Constructor Details
#initialize ⇒ MemorySharedStore
Returns a new instance of MemorySharedStore.
39 40 41 42 43 44 |
# File 'lib/mxrb/runtime/shared_store.rb', line 39 def initialize @sessions = {} @claims = {} @leases = {} @mutex = Mutex.new end |
Instance Method Details
#claim_scheduled_event(event:, slot:, owner:, now:, lease_until:, skip_overlap:) ⇒ Object
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/mxrb/runtime/shared_store.rb', line 67 def claim_scheduled_event(event:, slot:, owner:, now:, lease_until:, skip_overlap:) key = [event.to_s, slot.to_s] @mutex.synchronize do claim = @claims[key] return false if claim && (claim[:completed_at] || claim.fetch(:lease_expires_at) > now) lease = @leases[event.to_s] return false if skip_overlap && lease && lease.fetch(:expires_at) > now @claims[key] = { owner: owner.to_s, claimed_at: now, lease_expires_at: lease_until, completed_at: nil } if skip_overlap @leases[event.to_s] = { slot: slot.to_s, owner: owner.to_s, expires_at: lease_until } end true end end |
#close ⇒ Object
115 |
# File 'lib/mxrb/runtime/shared_store.rb', line 115 def close = nil |
#complete_scheduled_event(event:, slot:, owner:, now: Time.now.utc) ⇒ Object
89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/mxrb/runtime/shared_store.rb', line 89 def complete_scheduled_event(event:, slot:, owner:, now: Time.now.utc) key = [event.to_s, slot.to_s] @mutex.synchronize do claim = @claims[key] claim[:completed_at] = now if claim && claim.fetch(:owner) == owner.to_s lease = @leases[event.to_s] @leases.delete(event.to_s) \ if lease && lease.fetch(:owner) == owner.to_s && lease.fetch(:slot) == slot.to_s end true end |
#delete_session(token) ⇒ Object
63 64 65 |
# File 'lib/mxrb/runtime/shared_store.rb', line 63 def delete_session(token) @mutex.synchronize { !!@sessions.delete(token.to_s) } end |
#read_session(token, now: Time.now.utc) ⇒ Object
55 56 57 58 59 60 61 |
# File 'lib/mxrb/runtime/shared_store.rb', line 55 def read_session(token, now: Time.now.utc) @mutex.synchronize do prune_sessions(now) record = @sessions[token.to_s] record && SessionRecord.new(record.token, copy(record.identity), record.expires_at) end end |
#renew_scheduled_event(event:, slot:, owner:, lease_until:) ⇒ Object
101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/mxrb/runtime/shared_store.rb', line 101 def renew_scheduled_event(event:, slot:, owner:, lease_until:) key = [event.to_s, slot.to_s] @mutex.synchronize do claim = @claims[key] return false unless claim && claim.fetch(:owner) == owner.to_s && !claim[:completed_at] claim[:lease_expires_at] = lease_until lease = @leases[event.to_s] lease[:expires_at] = lease_until \ if lease && lease.fetch(:owner) == owner.to_s && lease.fetch(:slot) == slot.to_s true end end |
#write_session(token:, identity:, expires_at:) ⇒ Object
46 47 48 49 50 51 52 53 |
# File 'lib/mxrb/runtime/shared_store.rb', line 46 def write_session(token:, identity:, expires_at:) @mutex.synchronize do @sessions[token.to_s] = SessionRecord.new( token.to_s, copy(identity), expires_at.utc ) end token end |