~ knotless Search/
↑↓ move↵ open⇧↵ all results

grain.social/grain

photography-focused photo sharing platform

grain.social
1 collaborator
0
2
27 lines · 1.3 KB Raw History
// Whether the viewer's PDS serves permissioned spaces (proposal 0016).
//   GET /xrpc/social.grain.unspecced.getSpaceSupport
//
// The answer comes from a cached probe: community.lexicon.service.describe when
// the server offers it, and otherwise the methods themselves, judged against how
// that server answers for a method it does not have. See helpers/spaceSupport.ts.
//
// True today for pds.js with PDS_ENABLE_SPACES and for the alpha @atproto/pds
// build — which serves spaces but no describe, and so read as false until the
// fallback existed. False for bsky.social and everything else, so anything built
// on spaces stays gated behind this call.

import { defineQuery, InvalidRequestError } from "$hatk";
import { getSpaceSupport, pdsEndpointFor } from "../helpers/spaceSupport.ts";

export default defineQuery("social.grain.unspecced.getSpaceSupport", async (ctx) => {
  const { ok, db, viewer, params } = ctx;
  if (!viewer) throw new InvalidRequestError("Authentication required");

  const pds = await pdsEndpointFor(db, viewer.did);
  if (!pds) throw new InvalidRequestError("No PDS session for this account");

  // A query param arrives as a string, and "false" read plainly is true.
  const force = params.force === true || params.force === "true";

  return ok(await getSpaceSupport(db, pds, { force }));
});