diff --git a/src/auth/oauth-config.ts b/src/auth/oauth-config.ts index 779ca1a..22c01ad 100644 --- a/src/auth/oauth-config.ts +++ b/src/auth/oauth-config.ts @@ -1,13 +1,18 @@ -import { configureOAuth, defaultIdentityResolver } from "@atcute/oauth-browser-client"; +import { LocalActorResolver } from "@atcute/identity-resolver"; +import { configureOAuth } from "@atcute/oauth-browser-client"; import { didDocumentResolver, handleResolver } from "../utils/api"; +const reactiveDidDocumentResolver = { + resolve: async (did: string) => didDocumentResolver().resolve(did as any), +}; + configureOAuth({ metadata: { client_id: import.meta.env.VITE_OAUTH_CLIENT_ID, redirect_uri: import.meta.env.VITE_OAUTH_REDIRECT_URL, }, - identityResolver: defaultIdentityResolver({ + identityResolver: new LocalActorResolver({ handleResolver: handleResolver, - didDocumentResolver: didDocumentResolver, + didDocumentResolver: reactiveDidDocumentResolver, }), }); diff --git a/src/layout.tsx b/src/layout.tsx index f0e2215..0b61f19 100644 --- a/src/layout.tsx +++ b/src/layout.tsx @@ -12,6 +12,7 @@ import { NotificationContainer } from "./components/notification.jsx"; import { Search, SearchButton, showSearch } from "./components/search.jsx"; import { themeEvent } from "./components/theme.jsx"; import { resolveHandle } from "./utils/api.js"; +import { plcDirectory } from "./views/settings.jsx"; export const isTouchDevice = "ontouchstart" in window || navigator.maxTouchPoints > 1; @@ -187,12 +188,10 @@ const Layout = (props: RouteSectionProps) => { - +
- PLC directory: {localStorage.plcDirectory} + PLC directory: {plcDirectory()}
diff --git a/src/utils/api.ts b/src/utils/api.ts index 148a19e..e627039 100644 --- a/src/utils/api.ts +++ b/src/utils/api.ts @@ -16,17 +16,22 @@ import { import { DohJsonLexiconAuthorityResolver, LexiconSchemaResolver } from "@atcute/lexicon-resolver"; import { Did, Handle } from "@atcute/lexicons"; import { AtprotoDid, isHandle, Nsid } from "@atcute/lexicons/syntax"; +import { createMemo } from "solid-js"; import { createStore } from "solid-js/store"; import { setPDS } from "../components/navbar"; - -export const didDocumentResolver = new CompositeDidDocumentResolver({ - methods: { - plc: new PlcDidDocumentResolver({ - apiUrl: localStorage.getItem("plcDirectory") ?? "https://plc.directory", +import { plcDirectory } from "../views/settings"; + +export const didDocumentResolver = createMemo( + () => + new CompositeDidDocumentResolver({ + methods: { + plc: new PlcDidDocumentResolver({ + apiUrl: plcDirectory(), + }), + web: new AtprotoWebDidDocumentResolver(), + }, }), - web: new AtprotoWebDidDocumentResolver(), - }, -}); +); export const handleResolver = new CompositeHandleResolver({ strategy: "dns-first", @@ -40,9 +45,12 @@ const authorityResolver = new DohJsonLexiconAuthorityResolver({ dohUrl: "https://dns.google/resolve?", }); -const schemaResolver = new LexiconSchemaResolver({ - didDocumentResolver: didDocumentResolver, -}); +const schemaResolver = createMemo( + () => + new LexiconSchemaResolver({ + didDocumentResolver: didDocumentResolver(), + }), +); const didPDSCache: Record = {}; const [labelerCache, setLabelerCache] = createStore>({}); @@ -54,7 +62,7 @@ const getPDS = async (did: string) => { throw new Error("Not a valid DID identifier"); } - const doc = await didDocumentResolver.resolve(did); + const doc = await didDocumentResolver().resolve(did); didDocCache[did] = doc; const pds = getPdsEndpoint(doc); @@ -83,7 +91,7 @@ const resolveDidDoc = async (did: Did) => { if (!isAtprotoDid(did)) { throw new Error("Not a valid DID identifier"); } - return await didDocumentResolver.resolve(did); + return await didDocumentResolver().resolve(did); }; const validateHandle = async (handle: Handle, did: Did) => { @@ -145,7 +153,7 @@ const resolveLexiconAuthorityDirect = async (authority: string) => { }; const resolveLexiconSchema = async (authority: AtprotoDid, nsid: Nsid) => { - return await schemaResolver.resolve(authority, nsid); + return await schemaResolver().resolve(authority, nsid); }; interface LinkData { diff --git a/src/views/logs.tsx b/src/views/logs.tsx index 7e98b8a..97c4bbe 100644 --- a/src/views/logs.tsx +++ b/src/views/logs.tsx @@ -8,6 +8,7 @@ import { import { createEffect, createResource, createSignal, For, Show } from "solid-js"; import { localDateFromTimestamp } from "../utils/date.js"; import { createOperationHistory, DiffEntry, groupBy } from "../utils/plc-logs.js"; +import { plcDirectory } from "./settings.jsx"; type PlcEvent = "handle" | "rotation_key" | "service" | "verification_method"; @@ -23,9 +24,7 @@ export const PlcLogView = (props: { did: string }) => { !activePlcEvent() || diffs.some((d) => d.type.startsWith(activePlcEvent()!)); const fetchPlcLogs = async () => { - const res = await fetch( - `${localStorage.plcDirectory ?? "https://plc.directory"}/${props.did}/log/audit`, - ); + const res = await fetch(`${plcDirectory()}/${props.did}/log/audit`); const json = await res.json(); const logs = defs.indexedEntryLog.parse(json); setRawLogs(logs); diff --git a/src/views/record.tsx b/src/views/record.tsx index 2b103db..f657972 100644 --- a/src/views/record.tsx +++ b/src/views/record.tsx @@ -57,7 +57,7 @@ const resolveSchema = async (authority: AtprotoDid, nsid: Nsid): Promise { let didDocPromise = documentCache.get(authority); if (!didDocPromise) { - didDocPromise = didDocumentResolver.resolve(authority); + didDocPromise = didDocumentResolver().resolve(authority); documentCache.set(authority, didDocPromise); } diff --git a/src/views/repo.tsx b/src/views/repo.tsx index 3fc2ab0..ae67c9f 100644 --- a/src/views/repo.tsx +++ b/src/views/repo.tsx @@ -42,6 +42,7 @@ import { import { detectDidKeyType, detectKeyType } from "../utils/key.js"; import { BlobView } from "./blob.jsx"; import { PlcLogView } from "./logs.jsx"; +import { plcDirectory } from "./settings.jsx"; export const RepoView = () => { const params = useParams(); @@ -101,9 +102,7 @@ export const RepoView = () => { }; const getRotationKeys = async () => { - const res = await fetch( - `${localStorage.plcDirectory ?? "https://plc.directory"}/${did}/log/last`, - ); + const res = await fetch(`${plcDirectory()}/${did}/log/last`); const json = await res.json(); setRotationKeys(json.rotationKeys ?? []); }; @@ -364,7 +363,7 @@ export const RepoView = () => { { /> { return ( @@ -17,11 +20,16 @@ const Settings = () => { { - e.currentTarget.value.length ? - (localStorage.plcDirectory = e.currentTarget.value) - : localStorage.removeItem("plcDirectory"); + const value = e.currentTarget.value; + if (value.length) { + localStorage.plcDirectory = value; + setPlcDirectory(value); + } else { + localStorage.removeItem("plcDirectory"); + setPlcDirectory("https://plc.directory"); + } }} />