Introduces a state manager that buffers data until an observed dependency signals it should
overwrite another state manager with the buffered data. It can be used to implement
migrations of encrypted data, edit-apply loops (such as used for save operations), and to
map between encryption keys/formats.
* Specify user clear events for event upload
* Specify generator clear events
* Specify clear events for user send data
* Specify generic clear on logout for encrypted secret state
* Allow `clearOn`event to be passed into secret state
* Match current data persistence rules
* Clear ui memory on lock + logout
Unit tests trim vertical pipes when appear in the data packer's JSON data, but electron is not as forgiving. It throws errors in this situation. This fixes the error by trimming the pipes before b64 decoding the result.
* introduce `GeneratorHistoryService` abstraction
* implement generator history service with `LocalGeneratorHistoryService`
* cache decrypted data using `ReplaySubject` instead of `DerivedState`
* move Jsonification from `DataPacker` to `SecretClassifier` because the classifier
is the only component that has full type information. The data packer still handles
stringification.
Matt provided a ton of help on getting the state interactions right. Both he
and Justin collaborated with me to write the core of of the secret classifier.
Co-authored-by: Matt Gibson <mgibson@bitwarden.com>
Co-authored-by: Justin Baur <19896123+justindbaur@users.noreply.github.com>