تهدف هذه المكتبة إلى واجهة مشتركة بسيطة لتطبيقات JavaScript لحل المستندات DID من المعرفات اللامركزية (DIDS).
يهدف هذا إلى دعم المواصفات المعرفية اللامركزية المقترحة من مجموعة مجتمعات اعتماد W3C.
لا تنفذ المكتبة أي طريقة محددة DID ، ولكنها تسمح لمنفذي DID Method بإصدار حزم 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
} )
سيكون لكل طريقة من طريقة DID طرقها الخاصة للبحث عن معرف على blockchain الخاصة به أو آلية التخزين اللامركزية الأخرى.
لتجنب سوء التكوين ، يجب على منفذي الأسلوب تصدير دالة 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 )