Class: TurboReflex::State
- Inherits:
-
Object
- Object
- TurboReflex::State
- Defined in:
- lib/turbo_reflex/state.rb
Class Method Summary collapse
- .deserialize(string) ⇒ Object
- .deserialize_base64(string) ⇒ Object
- .key_for(*keys) ⇒ Object
- .serialize(data) ⇒ Object
- .serialize_base64(data) ⇒ Object
Instance Method Summary collapse
- #cache_key ⇒ Object
- #clear ⇒ Object
- #delete(*keys) ⇒ Object
-
#initialize(ordinal_payload = nil) ⇒ State
constructor
A new instance of State.
- #ordinal_payload ⇒ Object
- #payload ⇒ Object
- #prune!(max_bytesize: 2.kilobytes) ⇒ Object
- #read(*keys, default: nil) ⇒ Object
- #shrink! ⇒ Object
-
#to_h ⇒ Object
Returns a copy of the data as a Hash.
- #write(*keys, value) ⇒ Object
Constructor Details
#initialize(ordinal_payload = nil) ⇒ State
Returns a new instance of State.
36 37 38 39 40 41 42 43 |
# File 'lib/turbo_reflex/state.rb', line 36 def initialize(ordinal_payload = nil) @internal_data = {}.with_indifferent_access @internal_keys = [] deserialize(ordinal_payload).each do |(key, value)| write key, value end end |
Class Method Details
.deserialize(string) ⇒ Object
22 23 24 25 26 27 28 29 |
# File 'lib/turbo_reflex/state.rb', line 22 def deserialize(string) return {} if string.blank? decoded = Base64.urlsafe_decode64(string) inflated = Zlib::Inflate.inflate(decoded) Marshal.load inflated rescue => error raise TurboReflex::StateDeserializationError, "Unable to decode, inflate, and load Base64 string! \"#{string}\" #{error.message}" end |
.deserialize_base64(string) ⇒ Object
9 10 11 12 13 14 |
# File 'lib/turbo_reflex/state.rb', line 9 def deserialize_base64(string) return {} if string.blank? JSON.parse Base64.urlsafe_decode64(string) rescue => error raise TurboReflex::StateDeserializationError, "Unable to decode and parse Base64 string! \"#{string}\" #{error.message}" end |
.key_for(*keys) ⇒ Object
31 32 33 |
# File 'lib/turbo_reflex/state.rb', line 31 def key_for(*keys) keys.map { |key| key.try(:cache_key) || key.to_s }.join("/") end |
.serialize(data) ⇒ Object
16 17 18 19 20 |
# File 'lib/turbo_reflex/state.rb', line 16 def serialize(data) dump = Marshal.dump(data) deflated = Zlib::Deflate.deflate(dump, Zlib::BEST_COMPRESSION) Base64.urlsafe_encode64 deflated end |
.serialize_base64(data) ⇒ Object
5 6 7 |
# File 'lib/turbo_reflex/state.rb', line 5 def serialize_base64(data) Base64.urlsafe_encode64 data.to_json, padding: false end |
Instance Method Details
#cache_key ⇒ Object
49 50 51 |
# File 'lib/turbo_reflex/state.rb', line 49 def cache_key "turbo-reflex/ui-state/#{Digest::SHA2.base64digest(payload)}" end |
#clear ⇒ Object
81 82 83 84 |
# File 'lib/turbo_reflex/state.rb', line 81 def clear internal_keys.clear internal_data.clear end |
#delete(*keys) ⇒ Object
67 68 69 70 71 |
# File 'lib/turbo_reflex/state.rb', line 67 def delete(*keys) key = key_for(*keys) internal_keys.delete key internal_data.delete key end |
#ordinal_payload ⇒ Object
77 78 79 |
# File 'lib/turbo_reflex/state.rb', line 77 def ordinal_payload serialize internal_list end |
#payload ⇒ Object
73 74 75 |
# File 'lib/turbo_reflex/state.rb', line 73 def payload serialize_base64 internal_data end |
#prune!(max_bytesize: 2.kilobytes) ⇒ Object
91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/turbo_reflex/state.rb', line 91 def prune!(max_bytesize: 2.kilobytes) return if internal_keys.blank? return if internal_data.blank? percentage = (max_bytesize > 0) ? ordinal_payload.bytesize / max_bytesize.to_f : 0 while percentage > 1 keys_to_keep = internal_keys.slice((internal_keys.length - (internal_keys.length / percentage).floor)..-1) keys_to_remove = internal_keys - keys_to_keep @internal_keys = keys_to_keep keys_to_remove.each { |key| internal_data.delete key } percentage = (max_bytesize > 0) ? ordinal_payload.bytesize / max_bytesize.to_f : 0 end end |
#read(*keys, default: nil) ⇒ Object
53 54 55 56 57 |
# File 'lib/turbo_reflex/state.rb', line 53 def read(*keys, default: nil) value = internal_data[key_for(*keys)] value = write(*keys, default) if value.nil? && default value end |
#shrink! ⇒ Object
86 87 88 89 |
# File 'lib/turbo_reflex/state.rb', line 86 def shrink! @internal_data = shrink(internal_data).with_indifferent_access @internal_keys = internal_keys & internal_data.keys end |
#to_h ⇒ Object
Returns a copy of the data as a Hash
106 107 108 |
# File 'lib/turbo_reflex/state.rb', line 106 def to_h internal_data.deep_dup end |
#write(*keys, value) ⇒ Object
59 60 61 62 63 64 65 |
# File 'lib/turbo_reflex/state.rb', line 59 def write(*keys, value) key = key_for(*keys) internal_keys.delete key if internal_keys.include?(key) internal_keys << key internal_data[key] = value value end |