該庫旨在作為解決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 )