Эта библиотека предназначена как простой общий интерфейс для приложений JavaScript для разрешения документов из децентрализованных идентификаторов (DIDS).
Это предназначено для поддержки предлагаемых децентрализованных спецификаций идентификаторов из сообщества W3C Crevity Group.
Библиотека не реализует какой -либо конкретный метод DID, но позволяет реализаторам метода DID выпускать пакеты NPM, которые могут добавить приложения.
Resolver
Теперь вы обязаны предварительно сконфигурировать резольвер во время экземпляра. Конструктор Resolver
ожидает реестра методов, отображаемых с функцией резолюра. Например:
{
ethr : resolve ,
web : resolve
}
Каждый резольвер метода должен выявить функцию, называемую getResolver
, которая вернет объект, содержащий одну из этих паров ключей/значения. Затем вы можете сгладить их в один объект, чтобы пройти в конструктор Resolver
.
import { Resolver } from 'did-resolver'
import ethr from 'ethr-did-resolver'
import web from 'web-did-resolver'
import sov from 'sov-did-resolver'
//returns an object of { methodName: resolveFunction}
ethrResolver = ethr . getResolver ( )
webResolver = web . getResolver ( )
//If you are using multiple methods you need to flatten them into one object
const resolver = new Resolver ( {
... ethrResolver ,
... webResolver ,
} )
//If you are using one method you can simply pass the result of getResolver( into the constructor
const resolver = new Resolver ( ethrResolver )
Создал ли метод резолюров, созданных до версии 3.0.0
этой библиотеки, можно было бы использовать в качестве устаревших резолюров.
import { Resolver } from 'did-resolver'
import web from 'web-did-resolver'
import sov from 'sov-did-resolver'
//returns an object of { methodName: resolveFunction}
webResolver = web . getResolver ( )
sovResolver = sov . getResolver ( )
//If you are using multiple methods you need to flatten them into one object
const resolver = new Resolver ( { } , {
legacyResolvers : {
... webResolver ,
... sovResolver ,
}
} )
//If you are using one method you can simply pass the result of getResolver( into the constructor
const resolver = new Resolver ( ethrResolver )
Resolver представляет простую функцию resolve()
, которая возвращает обещание ES6, возвращая документ DID.
resolver . resolve ( 'did:ethr:0xF3beAC30C498D9E26865F34fCAa57dBB935b0D74/some/path#fragment=123' ) . then ( doc => console . log )
// You can also use ES7 async/await syntax
const doc = await resolver . resolve ( 'did:ethr:0xF3beAC30C498D9E26865F34fCAa57dBB935b0D74/some/path#fragment=123' )
Разрешение документов может быть дорого. В большинстве случаев лучше всего кэш сделала документы. Кэширование должно быть специально включено с помощью параметра cache
Встроенный кэш использует карту, но не имеет автоматического TTL, поэтому записи не истекают. Это хорошо в большинстве веб -, мобильных и серверных контекстов. Если вы запускаете длительный процесс, вы можете использовать существующую настраиваемую систему кэширования.
Встроенный кэш может быть включен, передав true
значение конструктору:
const resolver = new DIDResolver ( {
ethr ,
web
} , {
cache : true
} )
Вот пример с использованием js-cache
, который не был протестирован.
var cache = require ( 'js-cache' )
const customCache : DIDCache = ( parsed , resolve ) => {
// DID spec requires to not cache if no-cache param is set
if ( parsed . params && parsed . params [ 'no-cache' ] === 'true' ) return await resolve ( )
const cached = cache . get ( parsed . didUrl )
if ( cached !== undefined ) return cached
const doc = await resolve ( )
cache . set ( parsed , doc , 60000 )
return doc
}
const resolver = new DIDResolver ( {
ethr ,
web
} , {
cache : customCache
} )
Каждый метод сделал свои собственные методы для поиска идентификатора на соответствующем блокчейне или другого децентрализованного механизма хранения.
Чтобы избежать неправильной конфигурации, реализаторы методов должны экспортировать функцию getResolver()
, которая возвращает объект, отображающий имя метода в resolve(did: string, parsed: ParsedDID, didResolver: DIDResolver, options: DIDResolutionOptions)
. Например, { ethr: resolve }
.
Функция разрешения должна принять строку DID и объект типа ParsedDid
export function getResolver ( ) {
async function resolve (
did : string ,
parsed : ParsedDID ,
didResolver : Resolver ,
options : DIDResolutionOptions
) : Promise < DIDDocument > {
console . log ( parsed )
// {method: 'mymethod', id: 'abcdefg', did: 'did:mymethod:abcdefg/some/path#fragment=123', path: '/some/path', fragment: 'fragment=123'}
const didDoc = ... // lookup doc
// If you need to lookup another did as part of resolving this did document, the primary DIDResolver object is passed in as well
const parentDID = await didResolver . resolve ( ... )
// Return the DIDResolutionResult object
return {
didResolutionMetadata : { contentType : 'application/did+ld+json' } ,
didDocument : didDoc
didDocumentMetadata : { ... }
}
}
return { myMethod : resolve }
}
Результат mymethod getResolver()
может быть передан в конструктор Didresolver. Обратите внимание, что он должен быть сплющен, если он используется с другими методами.
import { DIDResolver } from 'did-resolver'
import MyMethod from 'mymethod-did-resolver'
const myResolver = MyMethod . getResolver ( )
const resolver = new DIDResolver ( myResolver )