Associate data records to a DID.
Purpose¶
The did-datastore module exports a DIDDataStore class allowing to associate Ceramic tiles to a DID in a deterministic way by implementing the Identity Index (IDX) protocol described in the CIP-11 specification.
Installation¶
npm install @glazed/did-datastore
Common use-cases¶
Read the contents of a record¶
The DIDDataStore instance uses a DataModel instance to support aliases for definitions.
import { CeramicClient } from '@ceramicnetwork/http-client' import { DataModel } from '@glazed/datamodel' import { DIDDataStore } from '@glazed/did-datastore' const ceramic = new CeramicClient() const aliases = { schemas: { MySchema: 'ceramic://k2...ab', }, definitions: { myDefinition: 'k2...ef', }, tiles: {}, } const model = new DataModel({ ceramic, aliases }) const dataStore = new DIDDataStore({ ceramic, model }) async function getMyDefinitionRecord(did) { return await dataStore.get('myDefinition', did) }
Use a deployed model aliases object¶
Instead of using a DataModel instance, it is possible to provide a deployed model aliases object directly.
import { CeramicClient } from '@ceramicnetwork/http-client' import { DIDDataStore } from '@glazed/did-datastore' const ceramic = new CeramicClient() const aliases = { schemas: { MySchema: 'ceramic://k2...ab', }, definitions: { myDefinition: 'k2...ef', }, tiles: {}, } const dataStore = new DIDDataStore({ ceramic, model: aliases }) async function getMyDefinitionRecord(did) { return await dataStore.get('myDefinition', did) }
Use a TileLoader instance¶
The DIDDataStore instance uses a TileLoader instance internally to batch queries. It is possible to provide an instance to use instead, for example to share it with other functions.
import { CeramicClient } from '@ceramicnetwork/http-client' import { DIDDataStore } from '@glazed/did-datastore' import { TileLoader } from '@glazed/tile-loader' const ceramic = new CeramicClient() const loader = new TileLoader({ ceramic }) const aliases = { schemas: { MySchema: 'ceramic://k2...ab', }, definitions: { myDefinition: 'k2...ef', }, tiles: {}, } const dataStore = new DIDDataStore({ ceramic, loader, model: aliases }) async function getMyDefinitionRecord(did) { return await dataStore.get('myDefinition', did) }
Set the contents of a record¶
It is possible to set the contents of a record when the Ceramic instance is authenticated using the set method.
import { CeramicClient } from '@ceramicnetwork/http-client' import { DIDDataStore } from '@glazed/did-datastore' const ceramic = new CeramicClient() const aliases = { schemas: { MySchema: 'ceramic://k2...ab', }, definitions: { myDefinition: 'k2...ef', }, tiles: {}, } const dataStore = new DIDDataStore({ ceramic, model: aliases }) async function setMyDefinitionRecord(content) { // This will throw an error if the Ceramic instance is not authenticated return await dataStore.set('myDefinition', content) }
Merge the contents of a record¶
Rather than completely replacing the contents of a record using the set method, the merge method can be used to only replace the specified fields.
The merge method only applies a shallow (one level) replacement, if you need a deep merge or more complex logic, you should implement it directly using the get and set methods.
import { CeramicClient } from '@ceramicnetwork/http-client' import { DIDDataStore } from '@glazed/did-datastore' const ceramic = new CeramicClient() const aliases = { schemas: { MySchema: 'ceramic://k2...ab', }, definitions: { myDefinition: 'k2...ef', }, tiles: {}, } const dataStore = new DIDDataStore({ ceramic, model: aliases }) async function setMyDefinitionRecord(content) { // This will only replace the fields present in the input `content` object, other fields // already present in the record will not be affected return await dataStore.merge('myDefinition', content) }
Classes¶
Type aliases¶
CreateOptions¶
Ƭ CreateOptions: Object
Type declaration¶
Name
Type
Description
controller?
string
Optional controller for the record
pin?
boolean
Pin the created record stream (default)
DIDDataStoreParams¶
Ƭ DIDDataStoreParams<ModelTypes>: Object
Type parameters¶
Name
Type
ModelTypes
extends ModelTypeAliases = ModelTypeAliases
Type declaration¶
Name
Type
Description
cache?
TileCache |
boolean |
TileLoader cache parameter, only used if loader is not provided
ceramic
CeramicApi
A Ceramic client instance
id?
string
Fallback DID to use when not explicitly set in method calls
loader?
TileLoader
An optional TileLoader instance to use
model
DataModel<ModelTypes> |
ModelTypesToAliases<ModelTypes> |
A DataModel instance or runtime model aliases to use
DefinitionContentType¶
Ƭ DefinitionContentType<ModelTypes, Alias>: ModelTypes["schemas"][ModelTypes["definitions"][Alias]]
Type parameters¶
Name
Type
ModelTypes
extends ModelTypeAliases
Alias
extends keyof ModelTypes["definitions"]
DefinitionWithID¶
Ƭ DefinitionWithID<Config>: Definition<Config> & { id: StreamID }
Type parameters¶
Name
Type
Config
extends Record<string, unknown> = Record<string, unknown>
DefinitionsContentTypes¶
Ƭ DefinitionsContentTypes<ModelTypes, Fallback>: Object
Type parameters¶
Name
Type
ModelTypes
extends ModelTypeAliases
Fallback
Record<string, unknown>
Index signature¶
▪ [Key: string]: typeof Key extends keyof ModelTypes["definitions"] ? DefinitionContentType<ModelTypes, typeof Key> : Fallback
Entry¶
Ƭ Entry: Object
Type declaration¶
Name
Type
Description
id
string
Record ID (Ceramic StreamID)
key
string
Key (definition ID) identifying the record ID in the index
record
unknown
Record contents