1 Snippets
mary edited this page 2025-04-21 10:24:14 +00:00

Resolving a handle to a DID

import { CompositeHandleResolver, WellKnownHandleResolver } from '@atcute/identity-resolver';
import { NodeDnsHandleResolver } from '@atcute/identity-resolver-node';

const handleResolver = new CompositeHandleResolver({
	strategy: 'race',
	methods: {
		dns: new NodeDnsHandleResolver(),
		http: new WellKnownHandleResolver(),
	},
});

const did = await handleResolver.resolve('bsky.app');
//    ^ 'did:plc:z72i7hdynmk6r22z27h6tvur'

Resolving a DID to a DID document

import { CompositeDidDocumentResolver, PlcDidDocumentResolver, WebDidDocumentResolver } from '@atcute/identity-resolver';

const docResolver = new CompositeDidDocumentResolver({
	methods: {
		plc: new PlcDidDocumentResolver(),
		web: new WebDidDocumentResolver(),
	},
});

const doc = await docResolver.resolve('did:plc:z72i7hdynmk6r22z27h6tvur');
//    ^? { '@context': [...], id: 'did:plc:z72i7hdynmk6r22z27h6tvur', ... }

Making requests to the user's personal data server

import { XRPC, simpleFetchHandler } from '@atcute/client';
import { getPdsEndpoint } from '@atcute/identity';

const pdsUrl = getPdsEndpoint(doc);
//    ^? 'https://puffball.us-east.host.bsky.network'

{
	const url = new URL('/xrpc/com.atproto.sync.getRepo', pdsUrl);
	url.searchParams.set('did', did);

	const res = await fetch(url);
	// ...
}

// Alternatively, use @atcute/client
{
	const rpc = new XRPC({ handler: simpleFetchHandler({ service: pdsUrl }) });

	const { data } = await rpc.get('com.atproto.server.describeServer', {});
	//      ^? { did: 'did:web:puffball.us-east.host.bsky.network', ... }
}