diff --git a/avatar/readme.md b/avatar/readme.md index c78d622e..5502ac82 100644 --- a/avatar/readme.md +++ b/avatar/readme.md @@ -3,6 +3,9 @@ avatar is a small service that fetches your pretty Bluesky avatar and caches it on Cloudflare. It uses a shared secret `AVATAR_SHARED_SECRET` to ensure requests only originate from the trusted appview. +Set `PLC_DIRECTORY_URL` to resolve DIDs somewhere other than , +which a self-hosted network needs. + It's deployed using `wrangler` like so: ``` diff --git a/avatar/src/index.js b/avatar/src/index.js index ad13f764..0b6fb3f8 100644 --- a/avatar/src/index.js +++ b/avatar/src/index.js @@ -19,17 +19,27 @@ const handleResolver = new CompositeHandleResolver({ }, }); -const didDocumentResolver = new CompositeDidDocumentResolver({ - methods: { - plc: new PlcDidDocumentResolver(), - web: new WebDidDocumentResolver(), - }, -}); - -const actorResolver = new LocalActorResolver({ - handleResolver, - didDocumentResolver, -}); +// env only reaches us inside fetch, so the resolver is built on the first +// request and kept after that +let actorResolver; +let resolverApiUrl; + +const getActorResolver = (env) => { + const apiUrl = env.PLC_DIRECTORY_URL || undefined; + if (!actorResolver || resolverApiUrl !== apiUrl) { + resolverApiUrl = apiUrl; + actorResolver = new LocalActorResolver({ + handleResolver, + didDocumentResolver: new CompositeDidDocumentResolver({ + methods: { + plc: new PlcDidDocumentResolver(apiUrl ? { apiUrl } : {}), + web: new WebDidDocumentResolver(), + }, + }), + }); + } + return actorResolver; +}; export default { async fetch(request, env) { @@ -51,7 +61,7 @@ export default { const getTangledAvatarFromPDS = async (actor) => { try { // Resolve the identity - const identity = await actorResolver.resolve(actor); + const identity = await getActorResolver(env).resolve(actor); if (!identity) { console.log({ level: "debug",