announcedReleases

tcmts.cli.announce.announcedReleases · #3djf2vrt · term · runs anywhere

The releases an account has announced: its codes.tcm.release records, read from the PDS its DID document names. A record that isn't one, or isn't at its own key (<package>:<version>), is left out.

import { getJson } from "#codebase/tcmts/atproto";
import type { Identity } from "#codebase/tcmts/atproto";
import { parseReleaseRecord, recordKey, RELEASE_COLLECTION } from "#codebase/tcmts/records";
import type { ReleaseRecord } from "#codebase/tcmts/records";

export async function announcedReleases(id: Identity): Promise<ReleaseRecord[]> {
  const out: ReleaseRecord[] = [];
  let cursor: string | undefined;
  // (so many pages of 100, however many a PDS says there are)
  let pages = 0;
  do {
    const q = new URLSearchParams({
      repo: id.did,
      collection: RELEASE_COLLECTION,
      limit: "100",
      ...(cursor ? { cursor } : {}),
    });
    const page = await getJson<{ records: { uri: string; value: unknown }[]; cursor?: string }>(
      `${id.pds}/xrpc/com.atproto.repo.listRecords?${q}`,
    );
    for (const { uri, value } of page.records) {
      const r = parseReleaseRecord(value);
      if (r && uri.endsWith(`/${recordKey(r)}`)) out.push(r);
    }
    cursor = page.records.length && ++pages < 50 ? page.cursor : undefined;
  } while (cursor);
  return out;
}

uses

used by