该库旨在作为解决JavaScript应用程序解决的简单常见界面,确实来自分散的标识符(DIDS)的文档。
这旨在支持W3C凭证社区组的拟议分散标识符规范。
该库不会实现任何特定的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
版本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 )
解析器提出了一个简单的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' )
解决DID文件可能很昂贵。在大多数情况下,最好的缓存确实进行了文档。必须使用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
} )
每个DID方法都将拥有自己的方法,可以在其各自的区块链或其他分散存储机制上查找标识符。
为了避免进行错误的配置,方法实施程序应导出一个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 )