From 65b99a00475b52259c4bf547b6797e4f64aa5da9 Mon Sep 17 00:00:00 2001 From: dawn Date: Fri, 11 Sep 2026 04:19:59 +0300 Subject: [PATCH] web: wrap awaitRecord for writes that are stored but not visible Signed-off-by: dawn --- web/src/lib/api/awaitRecord.ts | 18 +++++++++++++++++- web/src/lib/api/strings.ts | 15 +++------------ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/web/src/lib/api/awaitRecord.ts b/web/src/lib/api/awaitRecord.ts index f796a9424..f48d69bde 100644 --- a/web/src/lib/api/awaitRecord.ts +++ b/web/src/lib/api/awaitRecord.ts @@ -1,6 +1,6 @@ import { ok } from "@atcute/client"; import type { Cid, ResourceUri } from "@atcute/lexicons/syntax"; -import type { BobbinContext } from "$lib/api/client"; +import { ClientResponseError, type BobbinContext } from "$lib/api/client"; import { orNull } from "$lib/api/load"; import { mainSchema as awaitRecordSchema } from "$lib/api/lexicons/types/sh/tangled/bobbin/awaitRecord"; @@ -30,6 +30,22 @@ export const awaitIndexedRecord = async ( } }; +export const awaitIndexedOrSaved = async ( + ctx: BobbinContext, + revision: { uri: string; cid?: string } +): Promise => { + try { + await awaitIndexedRecord(ctx, revision as RecordRevision); + } 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; diff --git a/web/src/lib/api/strings.ts b/web/src/lib/api/strings.ts index 61dcfb198..3b7075ded 100644 --- a/web/src/lib/api/strings.ts +++ b/web/src/lib/api/strings.ts @@ -1,8 +1,8 @@ import { error } from "@sveltejs/kit"; import type { Did, Nsid, ResourceUri } from "@atcute/lexicons/syntax"; import type { OAuthUserAgent } from "@atcute/oauth-browser-client"; -import { awaitDeletedRecord, awaitIndexedRecord } from "$lib/api/awaitRecord"; -import { ClientResponseError, type BobbinContext } from "$lib/api/client"; +import { awaitDeletedRecord, awaitIndexedOrSaved } from "$lib/api/awaitRecord"; +import type { BobbinContext } from "$lib/api/client"; import { resolveMiniDoc } from "$lib/api/identity"; import { orNull } from "$lib/api/load"; import { getString, type RecordView, type StringRecord } from "$lib/api/records"; @@ -41,16 +41,7 @@ export const putString = async ( swapRecord?: string ): Promise => { const written = await putRecord(agent, STRING_COLLECTION, rkey, record, swapRecord); - try { - await awaitIndexedRecord(bobbin, written); - } catch (cause) { - if (cause instanceof ClientResponseError) { - throw new Error(`Saved, but the appview has not caught up yet (${cause.message}).`, { - cause - }); - } - throw cause; - } + await awaitIndexedOrSaved(bobbin, written); return written; }; -- 2.51.2