my fork of the bluesky client
README.md

#/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):

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:

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).