Add MMKV interface (#5169)
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
# `#/storage`
|
||||
|
||||
## Usage
|
||||
|
||||
Import the correctly scoped store from `#/storage`. Each instance of `Storage`
|
||||
(the base class, not to be used directly), has the following interface:
|
||||
|
||||
- `set([...scope, key], value)`
|
||||
- `get([...scope, key])`
|
||||
- `remove([...scope, key])`
|
||||
- `removeMany([...scope], [...keys])`
|
||||
|
||||
For example, using our `device` store looks like this, since it's scoped to the
|
||||
device (the most base level scope):
|
||||
|
||||
```typescript
|
||||
import { device } from '#/storage';
|
||||
|
||||
device.set(['foobar'], true);
|
||||
device.get(['foobar']);
|
||||
device.remove(['foobar']);
|
||||
device.removeMany([], ['foobar']);
|
||||
```
|
||||
|
||||
## TypeScript
|
||||
|
||||
Stores are strongly typed, and when setting a given value, it will need to
|
||||
conform to the schemas defined in `#/storage/schema`. When getting a value, it
|
||||
will be returned to you as the type defined in its schema.
|
||||
|
||||
## Scoped Stores
|
||||
|
||||
Some stores are (or might be) scoped to an account or other identifier. In this
|
||||
case, storage instances are created with type-guards, like this:
|
||||
|
||||
```typescript
|
||||
type AccountSchema = {
|
||||
language: `${string}-${string}`;
|
||||
};
|
||||
|
||||
type DID = `did:${string}`;
|
||||
|
||||
const account = new Storage<
|
||||
[DID],
|
||||
AccountSchema
|
||||
>({
|
||||
id: 'account',
|
||||
});
|
||||
|
||||
account.set(
|
||||
['did:plc:abc', 'language'],
|
||||
'en-US',
|
||||
);
|
||||
|
||||
const language = account.get([
|
||||
'did:plc:abc',
|
||||
'language',
|
||||
]);
|
||||
```
|
||||
|
||||
Here, if `['did:plc:abc']` is not supplied along with the key of
|
||||
`language`, the `get` will return undefined (and TS will yell at you).
|
||||
Reference in New Issue
Block a user