// kindly borrowed from https://github.com/usounds/Skyblur/blob/303793148a6373b313d3354a453876cad864eae2/backend/src/logic/JWTTokenHandler.ts#L2 // MIT License import * as didJWT from "npm:did-jwt" import { DIDDocument, DIDResolutionOptions, ParsedDID, Resolver, } from 'npm:did-resolver'; import { DIDResolver, ResolverRegistry } from 'npm:did-resolver'; import { getResolver as getWebResolver } from 'npm:web-did-resolver'; export function getResolver() { async function resolve( did: string, parsed: ParsedDID, didResolver: Resolver, options: DIDResolutionOptions ): Promise { const encodedDid = encodeURIComponent(did); const didUrl = `https://plc.directory/${encodedDid}`; const response = await fetch(didUrl); const didDoc = await response.json() as DIDDocument return didDoc } return { DidPlcResolver: resolve } } const myResolver = getResolver() const webResolver = getWebResolver() const resolver: ResolverRegistry = { 'plc': myResolver.DidPlcResolver as unknown as DIDResolver, ...webResolver } export const resolverInstance = new Resolver(resolver) export type Service = { id: string; type: string; serviceEndpoint: string | Record | Array>; } export const verifyJWT = async (auth: string, audience:string) => { const authorization = auth.replace('Bearer ', '').trim() const decodedJWT = authorization.replace('Bearer ', '').trim() console.log("audience is: ", audience) const result = await didJWT.verifyJWT(decodedJWT, { resolver: resolverInstance, audience: audience }) return result } export const fetchDiDDocument = async (did: string) => { try { const didDocument = await resolverInstance.resolve(did) return didDocument } catch (error) { console.error('Error fetching service endpoint:', error); } }; export const fetchServiceEndpoint = async (did: string) => { try { const response = await fetchDiDDocument(did); if (!response) { throw new Error('Invalid DID document response'); } const didDocument = response as unknown as DIDDocument; // didDocument.serviceが存在するかチェック const service = didDocument.service?.find((s: Service) => s.id === '#atproto_pds'); if (service && service.serviceEndpoint) { return service.serviceEndpoint; } else { throw new Error('Service with id #atproto_pds not found or no service endpoint available'); } } catch (error) { console.error('Error fetching service endpoint:', error); } };