Module: did-datastore¶
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 |