multiplexStorage source of truth
Describe the bug
The docs for multiplexStorage state
For the getItem operation, the first storage that returns a valid value will be the source of truth.
But I am able to reproduce a scenario where the first storage has no value, the second storage has a value, but the value from the second storage is not used as the source of truth.
Steps to repro:
- Navigate to https://playground.solidjs.com/anonymous/f998757e-6b08-4054-9e7a-87a0b20902a7
- Verify that the counter button is set to
1 - Click the counter button once, incrementing it to
2 - Verify that the count in
localStoragehas been set to2 - Verify that the count in
indexedDB/localForagehas been set to2 - Refresh the page
- Verify that the counter button is still correctly set to
2 - Delete the
localStoragerecord forcount - Refresh the page
- Verify that the counter button is incorrectly set back to
1 - Verify that the count in
indexedDB/localForageis still set to2
This seems to show that the localForage storage option is not being used, despite being the only storage option returning a valid value.
Minimal Reproduction Link
https://playground.solidjs.com/anonymous/f998757e-6b08-4054-9e7a-87a0b20902a7
Thanks for your feedback!
null is a valid return value for Storage.getItem, so this is technically specified behaviour, albeit not specifically documented. However, I understand the issue and want to introduce better control over what should be the source of truth especially in case of deletion. I still need to think about the patterns that I want to use for that.
Would undefined be considered an invalid return value? I could work around that issue by creating a new Storage wrapper around localStorage that returns undefined instead of null.
This is not yet implemented, but I intend to change it in any case.
Just to clarify, is there currently any way to return an invalid value? Would throwing an Error work?
Just tested it. Unfortunately, no. I'll push this higher up on my to-do list.
Just checking in - anything I can do to help get this going? @atk
This requires some careful planning. I do not want to break backwards compatibility, so I need a format that keeps the current behavior and at the same time enables different behaviors.