iso-did
Version:
Isomorphic did core and did key tooling
72 lines (62 loc) • 1.76 kB
JavaScript
import { resolve } from 'iso-web/doh'
import { parse } from './index.js'
/** @type {import('did-resolver').DIDResolver} */
export async function didFissionResolver(did, parsedDid) {
const hostname = parsedDid.id.replaceAll('%3A', ':') // replace encoded colon with colon
const server = hostname.includes('localhost')
? `http://${hostname}/dns-query`
: `https://${hostname}/dns-query`
const parsed = new URL(`http://${hostname}`)
const records = await resolve(`_did.${parsed.hostname}`, 'TXT', {
server,
})
if (records.result && records.result.length === 1) {
const didKey = parse(records.result[0])
const id = `${did}#${parsedDid.id}`
return {
didDocumentMetadata: {},
didResolutionMetadata: {
contentType: 'application/did+ld+json',
},
didDocument: {
'@context': [
'https://www.w3.org/ns/did/v1',
'https://w3id.org/security/multikey/v1',
],
id: did,
verificationMethod: [
{
id,
type: 'MultiKey',
controller: did,
publicKeyMultibase: didKey.id,
},
],
authentication: [id],
assertionMethod: [id],
capabilityDelegation: [id],
capabilityInvocation: [id],
},
}
}
return {
didDocumentMetadata: {},
didResolutionMetadata: {
error: 'notFound',
message: records.error?.message,
},
didDocument: null,
}
}
/** @type {import('did-resolver').ResolverRegistry} */
export const resolver = {
fission: didFissionResolver,
}
/**
* @param {string} url
*/
export function format(url) {
const parsed = new URL(url)
const _host = encodeURIComponent(parsed.host)
return `did:fission:${_host}`
}