State
A driver should be built to represent the state of the device or service it is abstracting.
User interfaces can bind to state to provide visual feedback
Logic can query state and subscribe to state changes to trigger further actions
Driver state is should always be considered public and as such, should never contain any sensitive information (auth details, access tokens etc).
Any authenticated user can read the state
Do not store sensitive material in state
Exposing State
A driver quacks like a hash
Setting state
self[:state_key] = 'value'Reading state
self[:stafe_key] # => 'value'
Logic can access driver state in the same way
Reading state
system[:Display][:power] # => trueSetting state
system[:Display][:not_recommended] = true
Logic might trigger a useful action by changing the state of other drivers directly, however generally it is recommended to use a mutator method.
All state values should be limited to objects that can be converted to JSON for transmitting over the API.
JSON compatible classes:
nil, true, false, Hash, String, Integer, Array, Float, SymbolObjects that respond to:
#to_jsonor failing that#to_swill be called when sending over the APIObjects that don’t meet these requirements can be used server side and are sent as
nilover the API
Subscribing to State
All drivers can subscribe to their own state.
Logic can additionally subscribe to state of other drivers.
Change detection
When state is applied it is checked against the existing value and subscribers are only notified if the value has changed.
Change detection doesn’t work if you mutate a variable.
Mutating complex status variables is not recommended as the variables might be being acted upon on another thread. This can lead to race conditions or worse.
The recommended method for updating complex state is:
Duplicate
my_array = ['my', 'array'].dupor{complex:['hash']}.deep_dup.deep_dupwhen in doubt
Update
my_array << 8Apply
self[:my_array] = my_array
This can be achieved by using operations that create a new object
Last updated
Was this helpful?