import type {
CanonicalResourceUri,
Did,
ParsedCanonicalResourceUri,
ParsedResourceUri,
ResourceUri
} from '@atcute/lexicons';
import type { Backlink, BacklinksSource } from './at/constellation';
import { parse as parseTid } from '@atcute/tid';
export const toResourceUri = (parsed: ParsedResourceUri): ResourceUri => {
return `at://${parsed.repo}${parsed.collection ? `/${parsed.collection}${parsed.rkey ? `/${parsed.rkey}` : ''}` : ''}`;
};
export const toCanonicalUri = (
parsed: ParsedCanonicalResourceUri | Backlink
): CanonicalResourceUri => {
if ('did' in parsed) return `at://${parsed.did}/${parsed.collection}/${parsed.rkey}`;
return `at://${parsed.repo}/${parsed.collection}/${parsed.rkey}${parsed.fragment ? `#${parsed.fragment}` : ''}`;
};
export const extractDidFromUri = (uri: string): Did | null => {
if (!uri.startsWith('at://')) return null;
const idx = uri.indexOf('/', 5);
if (idx === -1) return uri.slice(5) as Did;
return uri.slice(5, idx) as Did;
};
export const likeSource: BacklinksSource = 'app.bsky.feed.like:subject.uri';
export const repostSource: BacklinksSource = 'app.bsky.feed.repost:subject.uri';
export const replySource: BacklinksSource = 'app.bsky.feed.post:reply.parent.uri';
export const replyRootSource: BacklinksSource = 'app.bsky.feed.post:reply.root.uri';
export const blockSource: BacklinksSource = 'app.bsky.graph.block:subject';
// returns nanos
export const timestampFromCursor = (cursor: string | undefined) => {
if (!cursor) return undefined;
try {
return parseTid(cursor).timestamp;
} catch {
return undefined;
}
};