Client side atproto account migrator in your web browser, along with services for backups and adversarial migrations.
at next 83 lines 2.2 kB view raw
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};