forked from
baileytownsend.dev/pds-moover
Client side atproto account migrator in your web browser, along with services for backups and adversarial migrations.
1import {
2 CompositeDidDocumentResolver, CompositeHandleResolver,
3 DohJsonHandleResolver,
4 PlcDidDocumentResolver, WebDidDocumentResolver,
5 WellKnownHandleResolver
6} from '@atcute/identity-resolver';
7import {Client, simpleFetchHandler} from '@atcute/client';
8
9const handleResolver = new CompositeHandleResolver({
10 strategy: 'race',
11 methods: {
12 dns: new DohJsonHandleResolver({
13 dohUrl: 'https://mozilla.cloudflare-dns.com/dns-query',
14 }),
15 http: new WellKnownHandleResolver(),
16 },
17});
18
19const docResolver = new CompositeDidDocumentResolver({
20 methods: {
21 plc: new PlcDidDocumentResolver(),
22 web: new WebDidDocumentResolver(),
23 },
24});
25
26const cleanHandle = (handle) =>
27 handle.replace('@', '').trim().replace(
28 /[\u202A\u202C\u200E\u200F\u2066-\u2069]/g,
29 '',
30 );
31
32
33async function handleAndPDSResolver(handle) {
34 let usersDid = null;
35 if (handle.startsWith('did:')) {
36 usersDid = handle;
37 } else {
38 const cleanedHandle = cleanHandle(handle);
39 usersDid = await handleResolver.resolve(cleanedHandle);
40 }
41 const didDoc = await docResolver.resolve(usersDid);
42
43 let pds;
44 try {
45 pds = didDoc.service?.filter((s) =>
46 s.type === 'AtprotoPersonalDataServer'
47 )[0].serviceEndpoint;
48 } catch (error) {
49 console.error(error);
50 throw new Error('Could not find a PDS in the DID document.');
51 }
52 return {usersDid, pds};
53}
54
55
56async function fetchPDSMooverDIDWeb(baseUrl) {
57 const response = await fetch(`${baseUrl}/.well-known/did.json`);
58 if (!response.ok) {
59 throw new Error(`Failed to fetch DID document: ${response.status}`);
60 }
61 const didDoc = await response.json();
62 return didDoc.id;
63}
64
65async function describeServer() {
66 const baseUrl = window.location.origin;
67 const handler = simpleFetchHandler({service: baseUrl});
68 const rpc = new Client({
69 handler
70 });
71
72 let describeServerResponse = await rpc.get('com.pdsmoover.backup.describeServer');
73 if (describeServerResponse.ok) {
74 return describeServerResponse.data;
75 } else {
76 throw new Error('Could not describe server');
77 }
78
79
80}
81
82
83export {handleResolver, docResolver, cleanHandle, handleAndPDSResolver, fetchPDSMooverDIDWeb, describeServer};