tangle_indexer


git clone https://radroots.dev/git/tangle_indexer.git
Log | Files | Refs | Submodules | LICENSE

commit e8413220dc0320132e8d5c9d3a8d5279ef5e5ac7
parent ac01d23e01513a9c36e350477a71c3f81cd03422
Author: triesap <triesap@radroots.dev>
Date:   Sun, 26 Oct 2025 22:39:37 +0000

Add profile loader for indexed metadata and listings, deriving keys and npub. Refactor profile pages to use the shared loader with simplified entry generation, consolidating fetch logic and removing debug logging.

Diffstat:
Aapp/src/lib/utils/profile/index.ts | 39+++++++++++++++++++++++++++++++++++++++
Mapp/src/routes/(market)/(profile)/[0=nip05]/+page.svelte | 4----
Mapp/src/routes/(market)/(profile)/[0=nip05]/+page.ts | 63++++++++-------------------------------------------------------
Mapp/src/routes/(market)/(profile)/profile/[0=npub]/+page.ts | 46++++++++--------------------------------------
Mapp/src/routes/(market)/(profile)/profile/[0=public_key]/+page.ts | 48++++++++----------------------------------------
5 files changed, 63 insertions(+), 137 deletions(-)

diff --git a/app/src/lib/utils/profile/index.ts b/app/src/lib/utils/profile/index.ts @@ -0,0 +1,39 @@ +import { _env } from "$lib/utils/_env"; +import { type HttpFetch, fetch_json } from "@radroots/apps-lib"; +import type { PageLoadProfileData } from "@radroots/apps-lib-market"; +import type { RadrootsListingEventMetadata, RadrootsProfileEventMetadata } from "@radroots/events-bindings"; +import type { RadrootsEventsIndexedManifest as radroots_events_indexed_manifest } from "@radroots/events-indexed-bindings"; +import { lib_nostr_npub_encode } from "@radroots/utils-nostr"; + +type ProfileRoutesKind = "author" | "npub" | "nip05"; + +const { RADROOTS_MARKET_RELAY_INDEXES_URL: idx_url } = _env; + +async function fetch_listings(fetch_fn: HttpFetch, kind: ProfileRoutesKind, key: string): Promise<RadrootsListingEventMetadata[]> { + const manifest = await fetch_json<radroots_events_indexed_manifest>( + fetch_fn, + `${idx_url}/events/30402/${kind}/${key}/manifest.json` + ); + if (!manifest.shards.length) return []; + const shard = manifest.shards[0]; + const shard_url = `${idx_url}/events/30402/${kind}/${key}/${shard.file}?v=${shard.sha256}`; + return fetch_json<RadrootsListingEventMetadata[]>(fetch_fn, shard_url); +} + +export async function load_profile_indexed(fetch_fn: HttpFetch, kind: ProfileRoutesKind, key: string): Promise<PageLoadProfileData> { + const profile = await fetch_json<RadrootsProfileEventMetadata>( + fetch_fn, + `${idx_url}/events/0/${kind}/${key}/metadata.json` + ); + const listings = await fetch_listings(fetch_fn, kind, key); + const public_key = profile.author; + const npub = lib_nostr_npub_encode(public_key); + return { + public_key, + npub, + events: { + profile, + listings + } + }; +} diff --git a/app/src/routes/(market)/(profile)/[0=nip05]/+page.svelte b/app/src/routes/(market)/(profile)/[0=nip05]/+page.svelte @@ -3,10 +3,6 @@ import type { PageProps } from "./$types"; let { data }: PageProps = $props(); - - $effect(() => { - console.log(JSON.stringify(data, null, 4), `data`); - }); </script> <Profile basis={{ indexed: data }} /> diff --git a/app/src/routes/(market)/(profile)/[0=nip05]/+page.ts b/app/src/routes/(market)/(profile)/[0=nip05]/+page.ts @@ -1,64 +1,17 @@ import { _env } from "$lib/utils/_env"; -import type { PageLoadProfileData } from "@radroots/apps-lib-market"; -import type { RadrootsListingEventMetadata, RadrootsProfileEventMetadata } from "@radroots/events-bindings"; -import type { RadrootsEventsIndexedManifest } from "@radroots/events-indexed-bindings"; -import { lib_nostr_npub_encode } from "@radroots/utils-nostr"; -import { error } from "@sveltejs/kit"; -import type { EntryGenerator, PageLoad } from "./$types"; +import { load_profile_indexed } from "$lib/utils/profile"; +import type { EntryGenerator as entry_generator, PageLoad as page_load } from "./$types"; const { RADROOTS_MARKET_RELAY_INDEXES_URL: idx_url } = _env; -export const entries: EntryGenerator = async () => { - const [ - events_0_author_indexes, - ]: [ - string[] - ] = await Promise.all([ - fetch(`${idx_url}/events/0/nip05/indexes.json`).then(r => r.json()) - ]); - return events_0_author_indexes.map(i => ({ 0: i })) +export const entries: entry_generator = async () => { + const indexes: string[] = await fetch(`${idx_url}/events/0/nip05/indexes.json`).then(r => r.json()); + return indexes.map(i => ({ 0: i })); }; -type PageLoadData = PageLoadProfileData; - -export const load: PageLoad<PageLoadData> = async ({ fetch, params }) => { +export const load: page_load = async ({ fetch, params }) => { const { 0: nip05 } = params; - - const [ - res_nip05_metadata, - res_nip05_listings_manifest, - ] = await Promise.all([ - fetch(`${idx_url}/events/0/nip05/${nip05}/metadata.json`), - fetch(`${idx_url}/events/30402/nip05/${nip05}/manifest.json`) - ]); - - if (!res_nip05_metadata.ok) error(404, { message: `nip05:${nip05}`, }); - if (!res_nip05_listings_manifest.ok) error(404, { message: `nip05:listing:manifest:${nip05}`, }); - - const profile_event: RadrootsProfileEventMetadata = await res_nip05_metadata.json(); - const listings_manifest: RadrootsEventsIndexedManifest = await res_nip05_listings_manifest.json(); - - let listings_events: RadrootsListingEventMetadata[] = []; - if (listings_manifest.shards.length > 0) { - const shard = listings_manifest.shards[0]; - const res_country_shard = await fetch(`${idx_url}/events/30402/nip05/${nip05}/${shard.file}?v=${shard.sha256}`); - if (!res_country_shard.ok) error(500, { message: `nip05:listing:shard:${nip05}:${shard.file}` }); - listings_events = await res_country_shard.json(); - } - - const public_key = profile_event.author; - const npub = lib_nostr_npub_encode(public_key); - - const data: PageLoadProfileData = { - public_key, - npub, - events: { - profile: profile_event, - listings: listings_events - } - } - - return data; -} + return load_profile_indexed(fetch, "nip05", nip05); +}; export const prerender = true; diff --git a/app/src/routes/(market)/(profile)/profile/[0=npub]/+page.ts b/app/src/routes/(market)/(profile)/profile/[0=npub]/+page.ts @@ -1,47 +1,17 @@ import { _env } from "$lib/utils/_env"; -import type { PageLoadProfileData } from "@radroots/apps-lib-market"; -import type { RadrootsProfileEventMetadata } from "@radroots/events-bindings"; -import { error } from "@sveltejs/kit"; -import type { EntryGenerator, PageLoad } from "./$types"; +import { load_profile_indexed } from "$lib/utils/profile"; +import type { EntryGenerator as entry_generator, PageLoad as page_load } from "./$types"; const { RADROOTS_MARKET_RELAY_INDEXES_URL: idx_url } = _env; -export const entries: EntryGenerator = async () => { - const [ - events_0_author_indexes, - ]: [ - string[] - ] = await Promise.all([ - fetch(`${idx_url}/events/0/npub/indexes.json`).then(r => r.json()) - ]); - return events_0_author_indexes.map(i => ({ 0: i })) +export const entries: entry_generator = async () => { + const indexes: string[] = await fetch(`${idx_url}/events/0/npub/indexes.json`).then(r => r.json()); + return indexes.map(i => ({ 0: i })); }; -type PageLoadData = PageLoadProfileData; - -export const load: PageLoad<PageLoadData> = async ({ fetch, params }) => { +export const load: page_load = async ({ fetch, params }) => { const { 0: npub } = params; - - const [ - res_npub_metadata, - ] = await Promise.all([ - fetch(`${idx_url}/events/0/npub/${npub}/metadata.json`) - ]); - - if (!res_npub_metadata.ok) error(404, { message: `npub:${npub}` }); - - const profile_event: RadrootsProfileEventMetadata = await res_npub_metadata.json(); - - const public_key = profile_event.author; - - const data: PageLoadData = { - public_key, - npub, - events: { - profile: profile_event - } - } - return data; -} + return load_profile_indexed(fetch, "npub", npub); +}; export const prerender = true; diff --git a/app/src/routes/(market)/(profile)/profile/[0=public_key]/+page.ts b/app/src/routes/(market)/(profile)/profile/[0=public_key]/+page.ts @@ -1,49 +1,17 @@ import { _env } from "$lib/utils/_env"; -import type { PageLoadProfileData } from "@radroots/apps-lib-market"; -import type { RadrootsProfileEventMetadata } from "@radroots/events-bindings"; -import { lib_nostr_npub_encode } from "@radroots/utils-nostr"; -import { error } from "@sveltejs/kit"; -import type { EntryGenerator, PageLoad } from "./$types"; +import { load_profile_indexed } from "$lib/utils/profile"; +import type { EntryGenerator as entry_generator, PageLoad as page_load } from "./$types"; const { RADROOTS_MARKET_RELAY_INDEXES_URL: idx_url } = _env; -export const entries: EntryGenerator = async () => { - const [ - events_0_author_indexes, - ]: [ - string[] - ] = await Promise.all([ - fetch(`${idx_url}/events/0/author/indexes.json`).then(r => r.json()) - ]); - return events_0_author_indexes.map(i => ({ 0: i })) +export const entries: entry_generator = async () => { + const indexes: string[] = await fetch(`${idx_url}/events/0/author/indexes.json`).then(r => r.json()); + return indexes.map(i => ({ 0: i })); }; -type PageLoadData = PageLoadProfileData; - -export const load: PageLoad<PageLoadData> = async ({ fetch, params }) => { +export const load: page_load = async ({ fetch, params }) => { const { 0: public_key } = params; - - const [ - res_author_metadata, - ] = await Promise.all([ - fetch(`${idx_url}/events/0/author/${public_key}/metadata.json`), - ]); - - if (!res_author_metadata.ok) error(404, { message: `public_key:${public_key}` }); - - const profile_event: RadrootsProfileEventMetadata = await res_author_metadata.json(); - - const npub = lib_nostr_npub_encode(public_key); - - const data: PageLoadData = { - public_key, - npub, - events: { - profile: profile_event - } - } - - return data; -} + return load_profile_indexed(fetch, "author", public_key); +}; export const prerender = true;