Something went wrong. Try again.
Monorepo for Tangled tangled.org
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586import { ok } from "@atcute/client";import { ClientResponseError, createBobbinClient, type BobbinContext } from "$lib/api/client";import { atUriOf, cidOf, type RawCid, type RawResourceUri } from "$lib/api/syntax";import { orNull } from "$lib/api/load";import { mainSchema as awaitRecordSchema } from "$lib/api/lexicons/types/sh/tangled/bobbin/awaitRecord";
export interface RecordRevision { uri: RawResourceUri; cid?: RawCid;}
export const awaitRecord = async (ctx: BobbinContext, revision: RecordRevision) => { return ok( ctx.xrpc.call(awaitRecordSchema, { params: { uri: revision.uri, ...(revision.cid ? { cid: revision.cid } : {}) } }) );};
export const awaitIndexedRecord = async ( ctx: BobbinContext, revision: RecordRevision): Promise<void> => { const result = await awaitRecord(ctx, revision); if (result.status !== "indexed") { throw new Error(result.detail || result.reason || "Bobbin rejected the record."); }};
export const awaitIndexedOrSaved = async ( ctx: BobbinContext, revision: RecordRevision): Promise<void> => { try { await awaitIndexedRecord(ctx, revision); } catch (cause) { if (cause instanceof ClientResponseError) { throw new Error(`Saved, but the appview has not caught up yet (${cause.message}).`, { cause }); } throw cause; }};
const DELETION_BUDGET_MS = 5000;const DELETION_POLL_MS = 150;
export const awaitDeletedRecord = async ( ctx: BobbinContext, uri: RawResourceUri, { budgetMs = DELETION_BUDGET_MS, pollMs = DELETION_POLL_MS } = {}): Promise<boolean> => { const deadline = Date.now() + budgetMs; for (;;) { const result = await orNull(awaitRecord(ctx, { uri })); if (result === null) return false; if (result.status !== "indexed") return true; if (Date.now() >= deadline) return false; const { promise, resolve } = Promise.withResolvers<void>(); setTimeout(resolve, pollMs); await promise; }};
export const awaitReadable = async ( bobbinUrl: string | undefined, saved: { uri: RawResourceUri; cid?: RawCid }): Promise<void> => { if (!bobbinUrl) return; await awaitIndexedOrSaved(createBobbinClient({ serviceUrl: bobbinUrl }), { uri: atUriOf(saved.uri), ...(saved.cid ? { cid: cidOf(saved.cid) } : {}) });};
export const awaitRemoved = async ( bobbinUrl: string | undefined, uri: RawResourceUri): Promise<void> => { if (bobbinUrl) await awaitDeletedRecord(createBobbinClient({ serviceUrl: bobbinUrl }), uri);};