Class: Mxrb::Runtime::MemorySharedStore

Inherits:
Object
  • Object
show all
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

Constructor Details

#initializeMemorySharedStore

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

#closeObject



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