@seedprotocol/arweave 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/relationSeedRef.ts","../src/mediaRef.ts","../src/ArweaveClient/selectReadGateway.ts","../src/ArweaveClient/uploadApiVerification.ts","../src/ArweaveClient/arweaveL1UploadApi.ts","../src/gateway/gatewayState.ts","../src/gateway/resolveSeedGatewayEndpoints.ts","../src/gateway/seedGatewayConfig.ts"],"sourcesContent":["/** Same rules as getCorrectId in helpers/index (avoid barrel circular import). */\nfunction parseLocalIdOrUid(localIdOrUid: string): { localId?: string; uid?: string } {\n const id = { localId: undefined as string | undefined, uid: undefined as string | undefined }\n if (!localIdOrUid) return id\n if (localIdOrUid.length === 10) {\n id.localId = localIdOrUid\n }\n if (localIdOrUid.startsWith('0x') && localIdOrUid.length === 66) {\n id.uid = localIdOrUid\n }\n return id\n}\n\nexport function normalizeRelationPropertyValue(value: unknown): string | undefined {\n if (value == null) return undefined\n if (typeof value === 'string') {\n const t = value.trim()\n return t !== '' ? t : undefined\n }\n if (typeof value === 'object' && value !== null) {\n const o = value as { seedLocalId?: string; seedUid?: string }\n if (typeof o.seedLocalId === 'string' && o.seedLocalId.trim() !== '') {\n return o.seedLocalId.trim()\n }\n if (typeof o.seedUid === 'string' && o.seedUid.trim() !== '') {\n return o.seedUid.trim()\n }\n }\n return undefined\n}\n\nconst LOCAL_SEED_REF = /^[a-zA-Z0-9_-]{10,21}$/\n\nexport function resolveSeedIdsFromRefString(s: string): {\n seedLocalId?: string\n seedUid?: string\n} {\n const fromCorrect = parseLocalIdOrUid(s)\n if (fromCorrect.localId || fromCorrect.uid) {\n return { seedLocalId: fromCorrect.localId, seedUid: fromCorrect.uid }\n }\n if (LOCAL_SEED_REF.test(s) && !s.startsWith('0x')) {\n return { seedLocalId: s }\n }\n return {}\n}\n","import { BaseArweaveClient } from './ArweaveClient/BaseArweaveClient.js'\nimport {\n normalizeRelationPropertyValue,\n resolveSeedIdsFromRefString,\n} from './relationSeedRef.js'\n\nexport type FeedFieldRole = 'image' | 'file' | 'html' | 'text'\n\nexport type FeedFieldDescriptor = {\n role: FeedFieldRole\n treatAs?: 'arweaveTx' | 'seedUid' | 'url'\n}\n\nexport type FeedFieldManifest = Record<string, FeedFieldDescriptor>\n\nexport type ClassifyMediaRefOptions = {\n treatAs?: FeedFieldDescriptor['treatAs']\n}\n\nexport type MediaRefClassification =\n | { kind: 'empty' }\n | { kind: 'url'; href: string }\n | { kind: 'seedUid'; uid: string }\n | { kind: 'seedLocalId'; localId: string }\n | { kind: 'arweaveTxId'; txId: string }\n | { kind: 'unknown'; raw: string }\n\nexport type ResolveMediaRefResult =\n | { status: 'ready'; href: string; source: 'direct' | 'gateway' | 'localBlob' }\n | { status: 'empty' }\n | {\n status: 'unresolved'\n reason: string\n classification: MediaRefClassification\n }\n\nexport type ResolveMediaRefOptions = ClassifyMediaRefOptions\n\nconst ARWEAVE_TX_ID = /^[a-zA-Z0-9_-]{43}$/\n\nfunction trimOrEmpty(raw: string | undefined | null): string {\n if (raw == null) return ''\n return typeof raw === 'string' ? raw.trim() : String(raw).trim()\n}\n\nfunction coalesceStringField(item: Record<string, unknown>, key: string): string {\n const v = item[key]\n if (v == null) return ''\n if (typeof v === 'string') return v.trim()\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n return ''\n}\n\nfunction unwrapRelationString(raw: string): string {\n const t = raw.trim()\n if (!t) return t\n try {\n const parsed = JSON.parse(t) as unknown\n const fromObj = normalizeRelationPropertyValue(parsed)\n if (fromObj) return fromObj\n } catch {\n // not JSON\n }\n return t\n}\n\nexport function classifyMediaRef(\n raw: string,\n options?: ClassifyMediaRefOptions,\n): MediaRefClassification {\n const s = trimOrEmpty(raw)\n if (!s) {\n return { kind: 'empty' }\n }\n\n const treatAs = options?.treatAs\n if (treatAs === 'url') {\n return { kind: 'url', href: s }\n }\n if (treatAs === 'arweaveTx') {\n return { kind: 'arweaveTxId', txId: s }\n }\n if (treatAs === 'seedUid') {\n if (s.startsWith('0x') && s.length === 66) {\n return { kind: 'seedUid', uid: s }\n }\n return { kind: 'unknown', raw: s }\n }\n\n if (\n s.startsWith('http://') ||\n s.startsWith('https://') ||\n s.startsWith('blob:') ||\n s.startsWith('data:')\n ) {\n return { kind: 'url', href: s }\n }\n\n const unwrapped = unwrapRelationString(s)\n const ids = resolveSeedIdsFromRefString(unwrapped)\n if (ids.seedUid) {\n return { kind: 'seedUid', uid: ids.seedUid }\n }\n if (ids.seedLocalId) {\n return { kind: 'seedLocalId', localId: ids.seedLocalId }\n }\n\n if (unwrapped.startsWith('0x') && unwrapped.length === 66) {\n return { kind: 'seedUid', uid: unwrapped }\n }\n\n if (ARWEAVE_TX_ID.test(unwrapped) && !unwrapped.startsWith('0x')) {\n return { kind: 'arweaveTxId', txId: unwrapped }\n }\n\n return { kind: 'unknown', raw: s }\n}\n\nexport type NormalizedMediaField = {\n role: 'image' | 'file'\n raw: string\n classification: MediaRefClassification\n}\n\nexport type NormalizedHtmlField = {\n role: 'html'\n raw: string\n}\n\nexport type NormalizedTextField = {\n role: 'text'\n raw: string\n}\n\nexport type NormalizedFeedFieldValue =\n | NormalizedMediaField\n | NormalizedHtmlField\n | NormalizedTextField\n\nexport function getFeedItemStringField(item: Record<string, unknown>, key: string): string {\n const direct = coalesceStringField(item, key)\n if (direct) return direct\n const snake = key.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`)\n if (snake !== key) {\n const alt = coalesceStringField(item, snake)\n if (alt) return alt\n }\n const parts = key.split('_')\n if (parts.length > 1) {\n const camel =\n parts[0] + parts.slice(1).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('')\n const alt2 = coalesceStringField(item, camel)\n if (alt2) return alt2\n }\n return ''\n}\n\nexport function normalizeFeedItemFields(\n item: Record<string, unknown>,\n manifest: FeedFieldManifest,\n): Record<string, NormalizedFeedFieldValue | undefined> {\n const out: Record<string, NormalizedFeedFieldValue | undefined> = {}\n for (const [fieldKey, descriptor] of Object.entries(manifest)) {\n const raw = getFeedItemStringField(item, fieldKey)\n if (!raw) {\n out[fieldKey] = undefined\n continue\n }\n if (descriptor.role === 'html') {\n out[fieldKey] = { role: 'html', raw }\n continue\n }\n if (descriptor.role === 'text') {\n out[fieldKey] = { role: 'text', raw }\n continue\n }\n const classification = classifyMediaRef(raw, { treatAs: descriptor.treatAs })\n out[fieldKey] = {\n role: descriptor.role,\n raw,\n classification,\n }\n }\n return out\n}\n\nexport function getArweaveUrlForTransaction(transactionId: string): string {\n return `${BaseArweaveClient.getBaseUrl()}/${transactionId}`\n}\n","import { BaseArweaveClient } from './BaseArweaveClient.js'\nimport {\n DEFAULT_ARWEAVE_HOST,\n getArweaveReadGatewayHostsForPrimary,\n} from '../constants.js'\n\nconst READ_GATEWAY_CACHE_TTL_MS = 3 * 60 * 1000\nconst PROBE_TIMEOUT_MS = 5000\n\nlet readGatewayCache: { host: string; expiresAt: number } | null = null\nlet ensureInFlight: Promise<string> | null = null\n\n/** Clears cached read gateway (e.g. after tests or to force a fresh probe). */\nexport function invalidateReadGatewayCache(): void {\n readGatewayCache = null\n ensureInFlight = null\n}\n\n/** Clears probe cache, env override suppression, and preferred host (for tests). */\nexport function resetArweaveReadGatewayForTests(): void {\n invalidateReadGatewayCache()\n BaseArweaveClient.resetReadGatewaySelectionStateForTests()\n if (!BaseArweaveClient.isReadGatewayLocked()) {\n BaseArweaveClient.setPreferredReadGateway(DEFAULT_ARWEAVE_HOST)\n }\n}\n\n/**\n * GET /info with timeout. Treat 2xx + JSON object as healthy.\n */\nexport async function probeGateway(baseUrl: string, signal?: AbortSignal): Promise<boolean> {\n const url = `${baseUrl.replace(/\\/$/, '')}/info`\n let timer: ReturnType<typeof setTimeout> | undefined\n const controller = new AbortController()\n const effectiveSignal = signal ?? controller.signal\n if (!signal) {\n timer = setTimeout(() => controller.abort(), PROBE_TIMEOUT_MS)\n }\n try {\n const response = await fetch(url, {\n method: 'GET',\n signal: effectiveSignal,\n headers: { Accept: 'application/json' },\n })\n if (!response.ok) return false\n const text = await response.text()\n if (!text.trim()) return false\n try {\n const json = JSON.parse(text) as unknown\n return typeof json === 'object' && json !== null\n } catch {\n return false\n }\n } catch {\n return false\n } finally {\n if (timer) clearTimeout(timer)\n }\n}\n\nexport async function selectFirstHealthyReadGateway(\n hosts: string[],\n protocol: 'http' | 'https' = 'https',\n signal?: AbortSignal,\n): Promise<string | null> {\n for (const host of hosts) {\n const h = host.trim().replace(/\\/$/, '')\n if (!h) continue\n const baseUrl = `${protocol}://${h}`\n if (await probeGateway(baseUrl, signal)) {\n return h\n }\n }\n return null\n}\n\nfunction buildOrderedHostsForProbe(): string[] {\n return getArweaveReadGatewayHostsForPrimary(BaseArweaveClient.getHost())\n}\n\n/**\n * Probes gateways in order and applies the first healthy host via {@link BaseArweaveClient.applyProbedReadGateway}.\n * No-op when the read gateway is locked ({@link BaseArweaveClient.setHost}).\n * Uses a short TTL cache to avoid probing on every read.\n */\nexport async function ensureReadGatewaySelected(signal?: AbortSignal): Promise<string> {\n if (BaseArweaveClient.isReadGatewayLocked()) {\n return BaseArweaveClient.getHost()\n }\n\n const now = Date.now()\n if (readGatewayCache && now < readGatewayCache.expiresAt) {\n return readGatewayCache.host\n }\n\n if (ensureInFlight) {\n return ensureInFlight\n }\n\n ensureInFlight = (async () => {\n const ordered = buildOrderedHostsForProbe()\n const protocol = BaseArweaveClient.getProtocol()\n const picked = await selectFirstHealthyReadGateway(ordered, protocol, signal)\n\n if (!BaseArweaveClient.isReadGatewayLocked()) {\n if (picked) {\n BaseArweaveClient.applyProbedReadGateway(picked)\n }\n }\n\n readGatewayCache = {\n host: BaseArweaveClient.getHost(),\n expiresAt: Date.now() + READ_GATEWAY_CACHE_TTL_MS,\n }\n return readGatewayCache.host\n })()\n\n try {\n return await ensureInFlight\n } finally {\n ensureInFlight = null\n }\n}\n","import type { TransactionStatus } from '../types/arweave.js'\n\n/**\n * Trim and strip a trailing slash from an upload API base URL.\n */\nexport function normalizeUploadApiBaseUrl(baseUrl: string): string {\n return baseUrl.trim().replace(/\\/+$/, '')\n}\n\n/**\n * URL used to verify that an upload is available via the Seed upload API\n * (`GET` → HTTP 200 when present). Works for L1 transaction ids and ANS-104 data item ids.\n *\n * @param baseUrl - Upload API origin (e.g. from `ARWEAVE_UPLOAD_API_BASE_URL` / `uploadApiBaseUrl`)\n * @param txOrDataItemId - Arweave tx id or bundler data item id\n */\nexport function getUploadApiArweaveDataUrl(baseUrl: string, txOrDataItemId: string): string {\n const base = normalizeUploadApiBaseUrl(baseUrl)\n const id = encodeURIComponent(txOrDataItemId)\n return `${base}/api/upload/arweave/data/${id}`\n}\n\nconst DEFAULT_UPLOAD_STATUS_TIMEOUT_MS = 45_000\n\nexport type GetUploadPipelineTransactionStatusOptions = {\n /** Abort the request after this many ms (upload API hung / unreachable). Default 45s. */\n timeoutMs?: number\n}\n\n/**\n * Presence check against the upload API data route (same semantics as\n * {@link BaseArweaveClient.getTransactionStatus} for gateways: 200 = present, 404 = missing).\n */\nexport async function getUploadPipelineTransactionStatus(\n uploadApiBaseUrl: string,\n txOrDataItemId: string,\n options?: GetUploadPipelineTransactionStatusOptions,\n): Promise<TransactionStatus> {\n const url = getUploadApiArweaveDataUrl(uploadApiBaseUrl, txOrDataItemId)\n const timeoutMs = options?.timeoutMs ?? DEFAULT_UPLOAD_STATUS_TIMEOUT_MS\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs)\n\n try {\n const response = await fetch(url, { signal: controller.signal })\n clearTimeout(timeoutId)\n\n if (response.status === 404) {\n return { status: 404, confirmed: null }\n }\n\n if (!response.ok) {\n return { status: response.status, confirmed: null }\n }\n\n if (response.body) {\n await response.body.cancel()\n }\n\n return { status: 200, confirmed: null }\n } catch (err) {\n clearTimeout(timeoutId)\n if (err instanceof Error && err.name === 'AbortError') {\n return { status: 504, confirmed: null }\n }\n return { status: 500, confirmed: null }\n }\n}\n","import {\n getDefaultArweaveReadGatewayHostsOrdered,\n getArweaveReadGatewayHostsForPrimary,\n} from '../constants.js'\nimport { normalizeUploadApiBaseUrl } from './uploadApiVerification.js'\nimport { probeGateway } from './selectReadGateway.js'\n\n/** Response shape from `GET /api/upload/arweave/status/{dataItemId}`. */\nexport interface ArweaveUploadStatusResponse {\n dataItemId?: string\n phase?: string\n bundleId?: string\n turboStatus?: string\n turboInfo?: string\n winc?: string\n turbo?: {\n status?: string\n bundleId?: string\n info?: string\n winc?: string\n }\n l1?: {\n checked?: boolean\n httpStatus?: number\n confirmed?: boolean\n numberOfConfirmations?: number\n minConfirmationsRequired?: number\n meetsMinConfirmations?: boolean\n }\n}\n\nexport interface ArweaveGatewayTransactionQueryResult {\n /** GraphQL `transaction.id` (often same as data item id for ANS-104 items). */\n transactionId: string | null\n /** L1 bundle transaction id when the item is indexed as bundled. */\n bundledInId: string | null\n blockHeight?: number | null\n blockTimestamp?: number | null\n}\n\nconst GATEWAY_TX_QUERY = `\n query ArweaveGatewayTransaction($id: String!) {\n transaction(id: $id) {\n id\n bundledIn {\n id\n }\n block {\n height\n timestamp\n }\n }\n }\n`\n\nexport function getUploadApiArweaveStatusUrl(baseUrl: string, dataItemId: string): string {\n const base = normalizeUploadApiBaseUrl(baseUrl)\n const id = encodeURIComponent(dataItemId)\n return `${base}/api/upload/arweave/status/${id}`\n}\n\n/**\n * Whether L1 anchoring is complete per upload API status JSON.\n */\nexport function isArweaveL1AnchoringComplete(status: ArweaveUploadStatusResponse): boolean {\n const l1 = status.l1\n if (!l1) return false\n if (l1.meetsMinConfirmations === true) return true\n if (l1.confirmed === true) return true\n return false\n}\n\n/**\n * Fetches JSON from `GET /api/upload/arweave/status/{dataItemId}`.\n * Returns `null` if the response is not OK or body is not JSON.\n */\nexport async function getArweaveUploadStatus(\n uploadApiBaseUrl: string,\n dataItemId: string,\n): Promise<ArweaveUploadStatusResponse | null> {\n const url = getUploadApiArweaveStatusUrl(uploadApiBaseUrl, dataItemId)\n try {\n const response = await fetch(url)\n if (!response.ok) {\n return null\n }\n const body = (await response.json()) as ArweaveUploadStatusResponse\n return body && typeof body === 'object' ? body : null\n } catch {\n return null\n }\n}\n\n/**\n * Queries an Arweave gateway GraphQL API for transaction + bundle info.\n */\nexport async function queryArweaveGatewayTransaction(\n graphqlUrl: string,\n dataItemId: string,\n init?: Pick<RequestInit, 'signal'>,\n): Promise<ArweaveGatewayTransactionQueryResult | null> {\n const url = graphqlUrl.trim()\n if (!url) return null\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query: GATEWAY_TX_QUERY,\n variables: { id: dataItemId },\n }),\n signal: init?.signal,\n })\n\n if (!response.ok) {\n return null\n }\n\n const json = (await response.json()) as {\n data?: {\n transaction?: {\n id?: string\n bundledIn?: { id?: string } | null\n block?: { height?: number; timestamp?: number } | null\n } | null\n }\n errors?: unknown\n }\n\n if (json.errors) {\n return null\n }\n\n const tx = json.data?.transaction\n if (!tx) {\n return {\n transactionId: null,\n bundledInId: null,\n blockHeight: null,\n blockTimestamp: null,\n }\n }\n\n return {\n transactionId: typeof tx.id === 'string' ? tx.id : null,\n bundledInId: tx.bundledIn?.id != null ? String(tx.bundledIn.id) : null,\n blockHeight: tx.block?.height ?? null,\n blockTimestamp: tx.block?.timestamp ?? null,\n }\n } catch {\n return null\n }\n}\n\n/**\n * Resolves GraphQL against the first healthy gateway (GET /info probe per host), then runs\n * {@link queryArweaveGatewayTransaction}. Host order: optional `graphqlUrl` hostname first, then\n * {@link getDefaultArweaveReadGatewayHostsOrdered}.\n */\nexport async function queryArweaveGatewayTransactionWithFallback(\n graphqlUrl: string | undefined,\n dataItemId: string,\n init?: Pick<RequestInit, 'signal'>,\n): Promise<ArweaveGatewayTransactionQueryResult | null> {\n const defaults = getDefaultArweaveReadGatewayHostsOrdered()\n const trimmed = graphqlUrl?.trim()\n let protocol: 'http' | 'https' = 'https'\n let preferredHost: string | null = null\n if (trimmed) {\n try {\n const u = new URL(trimmed)\n protocol = u.protocol === 'http:' ? 'http' : 'https'\n preferredHost = u.hostname || null\n } catch {\n preferredHost = null\n }\n }\n\n const ordered =\n preferredHost && preferredHost.length > 0\n ? getArweaveReadGatewayHostsForPrimary(preferredHost)\n : [...defaults]\n\n const signal = init?.signal\n for (const host of ordered) {\n const base = `${protocol}://${host}`\n if (!(await probeGateway(base, signal ?? undefined))) continue\n const gqlUrl = `${protocol}://${host}/graphql`\n const result = await queryArweaveGatewayTransaction(gqlUrl, dataItemId, init)\n if (result !== null) {\n return result\n }\n }\n return null\n}\n","import type { ResolvedSeedGatewayEndpoints } from '../types/gateway.js'\n\nlet resolvedGatewayEndpoints: ResolvedSeedGatewayEndpoints | null = null\n\n/** Last endpoints applied during client init (for read-path helpers). */\nexport function getResolvedSeedGatewayEndpoints(): ResolvedSeedGatewayEndpoints | null {\n return resolvedGatewayEndpoints\n}\n\nexport function setResolvedSeedGatewayEndpoints(\n value: ResolvedSeedGatewayEndpoints | null,\n): void {\n resolvedGatewayEndpoints = value\n}\n","import { probeGateway } from '../ArweaveClient/selectReadGateway.js'\nimport {\n DEFAULT_ARWEAVE_HOST,\n DEFAULT_GATEWAY_SIDECAR_HOST,\n DEFAULT_GATEWAY_SIDECAR_PORT,\n getArweaveReadGatewayHostsForPrimary,\n} from '../constants.js'\nimport type {\n ResolvedSeedGatewayEndpoints,\n SeedGatewayConfig,\n SeedGatewayTransportMode,\n} from '../types/gateway.js'\n\nconst SIDECAR_PROBE_TTL_MS = 3 * 60 * 1000\n\nlet sidecarProbeCache: { healthy: boolean; expiresAt: number } | null = null\n\n/** Clears cached sidecar probe (tests / forced re-probe). */\nexport function invalidateSidecarProbeCache(): void {\n sidecarProbeCache = null\n}\n\nfunction parseGatewayHost(input: string | undefined): { host: string; protocol: 'http' | 'https' } {\n const raw = (input ?? DEFAULT_ARWEAVE_HOST).trim()\n if (raw.startsWith('http://')) {\n return { protocol: 'http', host: raw.slice(7).replace(/\\/$/, '') }\n }\n if (raw.startsWith('https://')) {\n return { protocol: 'https', host: raw.slice(8).replace(/\\/$/, '') }\n }\n return { protocol: 'https', host: raw.replace(/\\/$/, '') }\n}\n\nfunction sidecarOrigin(config: SeedGatewayConfig): {\n host: string\n port: number\n baseUrl: string\n} {\n const host = config.hyper?.localSidecarHost?.trim() || DEFAULT_GATEWAY_SIDECAR_HOST\n const port = config.hyper?.localSidecarPort ?? DEFAULT_GATEWAY_SIDECAR_PORT\n const hostWithPort = port === 80 || port === 443 ? host : `${host}:${port}`\n return {\n host: hostWithPort,\n port,\n baseUrl: `http://${host}:${port}`,\n }\n}\n\nasync function probeSidecarHealthy(baseUrl: string, signal?: AbortSignal): Promise<boolean> {\n const now = Date.now()\n if (sidecarProbeCache && now < sidecarProbeCache.expiresAt) {\n return sidecarProbeCache.healthy\n }\n\n const healthy = await probeGateway(baseUrl, signal)\n sidecarProbeCache = {\n healthy,\n expiresAt: now + SIDECAR_PROBE_TTL_MS,\n }\n return healthy\n}\n\nfunction buildHttpEndpoints(config: SeedGatewayConfig): ResolvedSeedGatewayEndpoints {\n const { host, protocol } = parseGatewayHost(config.arweaveDomain)\n const baseUrl = `${protocol}://${host}`\n const uploadApiBaseUrl = config.uploadApiBaseUrl?.trim() || baseUrl\n return {\n mode: config.transport ?? 'http-gateway',\n arweaveHost: host,\n arweaveProtocol: protocol,\n arweaveBaseUrl: baseUrl,\n arweaveGraphqlUrl: `${protocol}://${host}/graphql`,\n uploadApiBaseUrl,\n activePath: 'http',\n gatewayHyperKey: config.hyper?.gatewayHyperKey?.trim() || undefined,\n }\n}\n\nfunction buildHyperEndpoints(config: SeedGatewayConfig): ResolvedSeedGatewayEndpoints {\n const sidecar = sidecarOrigin(config)\n const key = config.hyper?.gatewayHyperKey?.trim()\n return {\n mode: 'hyper',\n arweaveHost: sidecar.host,\n arweaveProtocol: 'http',\n arweaveBaseUrl: sidecar.baseUrl,\n arweaveGraphqlUrl: `${sidecar.baseUrl}/graphql`,\n uploadApiBaseUrl: sidecar.baseUrl,\n activePath: 'hyper-sidecar',\n gatewayHyperKey: key || undefined,\n }\n}\n\nexport type ResolveSeedGatewayEndpointsOptions = {\n signal?: AbortSignal\n /** Skip cache and probe sidecar again (hybrid). */\n forceSidecarProbe?: boolean\n}\n\n/**\n * Resolve effective gateway + upload API URLs for the configured transport mode.\n */\nexport async function resolveSeedGatewayEndpoints(\n config: SeedGatewayConfig,\n options?: ResolveSeedGatewayEndpointsOptions,\n): Promise<ResolvedSeedGatewayEndpoints> {\n if (options?.forceSidecarProbe) {\n invalidateSidecarProbeCache()\n }\n\n const mode: SeedGatewayTransportMode = config.transport ?? 'http-gateway'\n\n if (mode === 'http-gateway') {\n return buildHttpEndpoints({ ...config, transport: mode })\n }\n\n if (mode === 'hyper') {\n const hyperEndpoints = buildHyperEndpoints(config)\n const shouldProbe = config.hyper?.probeSidecar !== false\n if (shouldProbe) {\n const ok = await probeSidecarHealthy(hyperEndpoints.arweaveBaseUrl, options?.signal)\n if (!ok) {\n throw new Error(\n `Gateway Hyper sidecar not reachable at ${hyperEndpoints.arweaveBaseUrl}. ` +\n 'Run: seed gateway tunnel connect <operator-z32-key>',\n )\n }\n }\n return hyperEndpoints\n }\n\n // hybrid\n const sidecar = sidecarOrigin(config)\n const shouldProbe = config.hyper?.probeSidecar !== false\n if (shouldProbe && (await probeSidecarHealthy(sidecar.baseUrl, options?.signal))) {\n return buildHyperEndpoints({ ...config, transport: 'hyper' })\n }\n\n const http = buildHttpEndpoints({ ...config, transport: 'http-gateway' })\n return {\n ...http,\n mode: 'hybrid',\n activePath: 'hybrid-fallback-http',\n }\n}\n\n/** Build ordered gateway host list for read fallback (sidecar first in hybrid when active). */\nexport function getReadGatewayHostsForConfig(\n resolved: ResolvedSeedGatewayEndpoints,\n _defaults?: readonly string[],\n): string[] {\n if (resolved.activePath === 'hyper-sidecar') {\n return [resolved.arweaveHost]\n }\n return getArweaveReadGatewayHostsForPrimary(resolved.arweaveHost)\n}\n","import type {\n ClientGatewayContextInput,\n SeedConfigGatewayInput,\n SeedGatewayConfig,\n} from '../types/seedConfig.js'\nimport { DEFAULT_SEED_GATEWAY_HYPER_KEY } from '../constants.js'\n\n/** Merge seed.config gateway fields into {@link SeedGatewayConfig}. */\nexport function seedGatewayConfigFromSeedConfig(\n config: SeedConfigGatewayInput,\n): SeedGatewayConfig {\n const gateway = config.gateway ?? {}\n return {\n transport: gateway.transport,\n arweaveDomain: config.arweaveDomain ?? gateway.arweaveDomain,\n uploadApiBaseUrl: config.uploadApiBaseUrl ?? gateway.uploadApiBaseUrl,\n hyper: {\n gatewayHyperKey:\n gateway.hyper?.gatewayHyperKey?.trim() ||\n gateway.gatewayHyperKey?.trim() ||\n DEFAULT_SEED_GATEWAY_HYPER_KEY ||\n undefined,\n localSidecarHost: gateway.hyper?.localSidecarHost ?? gateway.localSidecarHost,\n localSidecarPort: gateway.hyper?.localSidecarPort ?? gateway.localSidecarPort,\n probeSidecar: gateway.hyper?.probeSidecar ?? gateway.probeSidecar,\n },\n }\n}\n\nexport function seedGatewayConfigFromClientContext(\n context: ClientGatewayContextInput,\n): SeedGatewayConfig {\n return {\n transport: context.gatewayTransport,\n arweaveDomain: context.arweaveDomain,\n uploadApiBaseUrl: context.uploadApiBaseUrl,\n hyper: {\n gatewayHyperKey:\n context.gatewayHyperKey?.trim() || DEFAULT_SEED_GATEWAY_HYPER_KEY || undefined,\n localSidecarHost: context.gatewaySidecarHost,\n localSidecarPort: context.gatewaySidecarPort,\n },\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/easAttestationUrl.ts","../src/relationSeedRef.ts","../src/mediaRef.ts","../src/resolveSeedRssImageRelationRef.ts","../src/ArweaveClient/selectReadGateway.ts","../src/ArweaveClient/uploadApiVerification.ts","../src/ArweaveClient/arweaveL1UploadApi.ts","../src/gateway/gatewayState.ts","../src/gateway/resolveSeedGatewayEndpoints.ts","../src/gateway/seedGatewayConfig.ts"],"sourcesContent":["const EAS_ATTESTATION_EXPLORER_HOST = /(^|\\.)easscan\\.(org|xyz)$/i\n\n/**\n * True when `url` points at an EAS attestation explorer HTML page (not fetchable media).\n */\nexport function isEasAttestationExplorerUrl(url: string): boolean {\n const trimmed = url.trim()\n if (!trimmed) return false\n try {\n const parsed = new URL(trimmed)\n if (!EAS_ATTESTATION_EXPLORER_HOST.test(parsed.hostname)) {\n return false\n }\n return /\\/attestation\\/view\\//i.test(parsed.pathname)\n } catch {\n return false\n }\n}\n","/** Same rules as getCorrectId in helpers/index (avoid barrel circular import). */\nfunction parseLocalIdOrUid(localIdOrUid: string): { localId?: string; uid?: string } {\n const id = { localId: undefined as string | undefined, uid: undefined as string | undefined }\n if (!localIdOrUid) return id\n if (localIdOrUid.length === 10) {\n id.localId = localIdOrUid\n }\n if (localIdOrUid.startsWith('0x') && localIdOrUid.length === 66) {\n id.uid = localIdOrUid\n }\n return id\n}\n\nexport function normalizeRelationPropertyValue(value: unknown): string | undefined {\n if (value == null) return undefined\n if (typeof value === 'string') {\n const t = value.trim()\n return t !== '' ? t : undefined\n }\n if (typeof value === 'object' && value !== null) {\n const o = value as { seedLocalId?: string; seedUid?: string }\n if (typeof o.seedLocalId === 'string' && o.seedLocalId.trim() !== '') {\n return o.seedLocalId.trim()\n }\n if (typeof o.seedUid === 'string' && o.seedUid.trim() !== '') {\n return o.seedUid.trim()\n }\n }\n return undefined\n}\n\nconst LOCAL_SEED_REF = /^[a-zA-Z0-9_-]{10,21}$/\n\nexport function resolveSeedIdsFromRefString(s: string): {\n seedLocalId?: string\n seedUid?: string\n} {\n const fromCorrect = parseLocalIdOrUid(s)\n if (fromCorrect.localId || fromCorrect.uid) {\n return { seedLocalId: fromCorrect.localId, seedUid: fromCorrect.uid }\n }\n if (LOCAL_SEED_REF.test(s) && !s.startsWith('0x')) {\n return { seedLocalId: s }\n }\n return {}\n}\n","import { BaseArweaveClient } from './ArweaveClient/BaseArweaveClient.js'\nimport { isEasAttestationExplorerUrl } from './easAttestationUrl.js'\nimport {\n normalizeRelationPropertyValue,\n resolveSeedIdsFromRefString,\n} from './relationSeedRef.js'\n\nexport type FeedFieldRole = 'image' | 'file' | 'html' | 'text'\n\nexport type FeedFieldDescriptor = {\n role: FeedFieldRole\n treatAs?: 'arweaveTx' | 'seedUid' | 'url'\n}\n\nexport type FeedFieldManifest = Record<string, FeedFieldDescriptor>\n\nexport type ClassifyMediaRefOptions = {\n treatAs?: FeedFieldDescriptor['treatAs']\n}\n\nexport type MediaRefClassification =\n | { kind: 'empty' }\n | { kind: 'url'; href: string }\n | { kind: 'nonMediaUrl'; href: string }\n | { kind: 'seedUid'; uid: string }\n | { kind: 'seedLocalId'; localId: string }\n | { kind: 'arweaveTxId'; txId: string }\n | { kind: 'unknown'; raw: string }\n\nexport type ResolveMediaRefResult =\n | { status: 'ready'; href: string; source: 'direct' | 'gateway' | 'localBlob' }\n | { status: 'empty' }\n | {\n status: 'unresolved'\n reason: string\n classification: MediaRefClassification\n }\n\nexport type ResolveMediaRefOptions = ClassifyMediaRefOptions\n\nconst ARWEAVE_TX_ID = /^[a-zA-Z0-9_-]{43}$/\n\nfunction trimOrEmpty(raw: string | undefined | null): string {\n if (raw == null) return ''\n return typeof raw === 'string' ? raw.trim() : String(raw).trim()\n}\n\nfunction coalesceStringField(item: Record<string, unknown>, key: string): string {\n const v = item[key]\n if (v == null) return ''\n if (typeof v === 'string') return v.trim()\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n return ''\n}\n\nfunction unwrapRelationString(raw: string): string {\n const t = raw.trim()\n if (!t) return t\n try {\n const parsed = JSON.parse(t) as unknown\n const fromObj = normalizeRelationPropertyValue(parsed)\n if (fromObj) return fromObj\n } catch {\n // not JSON\n }\n return t\n}\n\nexport function classifyMediaRef(\n raw: string,\n options?: ClassifyMediaRefOptions,\n): MediaRefClassification {\n const s = trimOrEmpty(raw)\n if (!s) {\n return { kind: 'empty' }\n }\n\n const treatAs = options?.treatAs\n if (treatAs === 'url') {\n return { kind: 'url', href: s }\n }\n if (treatAs === 'arweaveTx') {\n return { kind: 'arweaveTxId', txId: s }\n }\n if (treatAs === 'seedUid') {\n if (s.startsWith('0x') && s.length === 66) {\n return { kind: 'seedUid', uid: s }\n }\n return { kind: 'unknown', raw: s }\n }\n\n if (\n s.startsWith('http://') ||\n s.startsWith('https://') ||\n s.startsWith('blob:') ||\n s.startsWith('data:')\n ) {\n if (isEasAttestationExplorerUrl(s)) {\n return { kind: 'nonMediaUrl', href: s }\n }\n return { kind: 'url', href: s }\n }\n\n const unwrapped = unwrapRelationString(s)\n const ids = resolveSeedIdsFromRefString(unwrapped)\n if (ids.seedUid) {\n return { kind: 'seedUid', uid: ids.seedUid }\n }\n if (ids.seedLocalId) {\n return { kind: 'seedLocalId', localId: ids.seedLocalId }\n }\n\n if (unwrapped.startsWith('0x') && unwrapped.length === 66) {\n return { kind: 'seedUid', uid: unwrapped }\n }\n\n if (ARWEAVE_TX_ID.test(unwrapped) && !unwrapped.startsWith('0x')) {\n return { kind: 'arweaveTxId', txId: unwrapped }\n }\n\n return { kind: 'unknown', raw: s }\n}\n\nexport type NormalizedMediaField = {\n role: 'image' | 'file'\n raw: string\n classification: MediaRefClassification\n}\n\nexport type NormalizedHtmlField = {\n role: 'html'\n raw: string\n}\n\nexport type NormalizedTextField = {\n role: 'text'\n raw: string\n}\n\nexport type NormalizedFeedFieldValue =\n | NormalizedMediaField\n | NormalizedHtmlField\n | NormalizedTextField\n\nexport function getFeedItemStringField(item: Record<string, unknown>, key: string): string {\n const direct = coalesceStringField(item, key)\n if (direct) return direct\n const snake = key.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`)\n if (snake !== key) {\n const alt = coalesceStringField(item, snake)\n if (alt) return alt\n }\n const parts = key.split('_')\n if (parts.length > 1) {\n const camel =\n parts[0] + parts.slice(1).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('')\n const alt2 = coalesceStringField(item, camel)\n if (alt2) return alt2\n }\n return ''\n}\n\nexport function normalizeFeedItemFields(\n item: Record<string, unknown>,\n manifest: FeedFieldManifest,\n): Record<string, NormalizedFeedFieldValue | undefined> {\n const out: Record<string, NormalizedFeedFieldValue | undefined> = {}\n for (const [fieldKey, descriptor] of Object.entries(manifest)) {\n const raw = getFeedItemStringField(item, fieldKey)\n if (!raw) {\n out[fieldKey] = undefined\n continue\n }\n if (descriptor.role === 'html') {\n out[fieldKey] = { role: 'html', raw }\n continue\n }\n if (descriptor.role === 'text') {\n out[fieldKey] = { role: 'text', raw }\n continue\n }\n const classification = classifyMediaRef(raw, { treatAs: descriptor.treatAs })\n out[fieldKey] = {\n role: descriptor.role,\n raw,\n classification,\n }\n }\n return out\n}\n\nexport function getArweaveUrlForTransaction(transactionId: string): string {\n return `${BaseArweaveClient.getBaseUrl()}/${transactionId}`\n}\n","import { BaseArweaveClient } from './ArweaveClient/BaseArweaveClient.js'\nimport { isEasAttestationExplorerUrl } from './easAttestationUrl.js'\nimport { classifyMediaRef } from './mediaRef.js'\n\nexport type SeedRssImageRelationRef = {\n storageTransactionId?: string\n arweaveUrl?: string\n seedUid?: string\n /** Gateway/raw URL suitable for image fetch; never an EAS attestation explorer page. */\n mediaUrl?: string\n}\n\nexport const SEED_RSS_IMAGE_RELATION_FIELD_KEYS = [\n 'featureImage',\n 'feature_image',\n 'image',\n 'images',\n 'coverImage',\n 'cover_image',\n 'thumbnail',\n 'thumbnail_image',\n 'thumbnailImage',\n] as const\n\nfunction trimOrEmpty(value: unknown): string {\n if (value == null) return ''\n if (typeof value === 'string') return value.trim()\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n return ''\n}\n\nfunction readObjectStringField(obj: Record<string, unknown>, ...keys: string[]): string {\n for (const key of keys) {\n const direct = trimOrEmpty(obj[key])\n if (direct) return direct\n }\n\n const suffixes = keys.map((key) => key.split(':').pop()!.toLowerCase())\n for (const [rawKey, rawValue] of Object.entries(obj)) {\n const normalizedKey = rawKey.includes(':') ? rawKey.split(':').pop()! : rawKey\n const normalizedLower = normalizedKey.toLowerCase()\n if (suffixes.some((suffix) => normalizedLower === suffix.toLowerCase())) {\n const value = trimOrEmpty(rawValue)\n if (value) return value\n }\n }\n\n return ''\n}\n\nfunction tryGatewayUrlForTxId(txId: string): string | undefined {\n const trimmed = txId.trim()\n if (!trimmed || trimmed.startsWith('0x')) return undefined\n try {\n return `${BaseArweaveClient.getBaseUrl()}/${trimmed}`\n } catch {\n return undefined\n }\n}\n\nfunction resolveMediaUrlFromParts(parts: {\n storageTransactionId?: string\n arweaveUrl?: string\n}): string | undefined {\n const txId = parts.storageTransactionId?.trim()\n if (txId) {\n const fromTx = tryGatewayUrlForTxId(txId)\n if (fromTx) return fromTx\n }\n\n const arweaveUrl = parts.arweaveUrl?.trim()\n if (arweaveUrl && !isEasAttestationExplorerUrl(arweaveUrl)) {\n return arweaveUrl\n }\n\n return undefined\n}\n\nfunction resolveFromString(value: string): SeedRssImageRelationRef | undefined {\n const trimmed = value.trim()\n if (!trimmed) return undefined\n\n if (isEasAttestationExplorerUrl(trimmed)) {\n return undefined\n }\n\n const classification = classifyMediaRef(trimmed)\n switch (classification.kind) {\n case 'url':\n return { mediaUrl: classification.href }\n case 'arweaveTxId': {\n const mediaUrl = tryGatewayUrlForTxId(classification.txId)\n return {\n storageTransactionId: classification.txId,\n ...(mediaUrl ? { mediaUrl } : {}),\n }\n }\n case 'seedUid':\n return { seedUid: classification.uid }\n default: {\n const mediaUrl = tryGatewayUrlForTxId(trimmed)\n if (mediaUrl) {\n return {\n storageTransactionId: trimmed,\n mediaUrl,\n }\n }\n return undefined\n }\n }\n}\n\nfunction resolveFromObject(obj: Record<string, unknown>): SeedRssImageRelationRef | undefined {\n const storageTransactionId = readObjectStringField(\n obj,\n 'storageTransactionId',\n 'storage_transaction_id',\n )\n const arweaveUrl = readObjectStringField(obj, 'arweaveUrl', 'arweave_url')\n const seedUid = readObjectStringField(obj, 'seedUid', 'SeedUid', 'seed_uid')\n const link = readObjectStringField(obj, 'link', 'Link')\n\n const mediaUrl =\n resolveMediaUrlFromParts({ storageTransactionId, arweaveUrl }) ??\n (link && !isEasAttestationExplorerUrl(link) ? link : undefined)\n\n if (!storageTransactionId && !arweaveUrl && !seedUid && !mediaUrl) {\n return undefined\n }\n\n return {\n ...(storageTransactionId ? { storageTransactionId } : {}),\n ...(arweaveUrl && !isEasAttestationExplorerUrl(arweaveUrl) ? { arweaveUrl } : {}),\n ...(seedUid ? { seedUid } : {}),\n ...(mediaUrl ? { mediaUrl } : {}),\n }\n}\n\n/**\n * Resolve a Seed RSS image relation value (plain string or expanded relation object)\n * using field priority: storageTransactionId → arweaveUrl/gateway URL → seedUid.\n * EAS attestation explorer URLs are never returned as media.\n */\nexport function resolveSeedRssImageRelationRef(value: unknown): SeedRssImageRelationRef | undefined {\n if (value == null) return undefined\n\n if (typeof value === 'string') {\n return resolveFromString(value)\n }\n\n if (Array.isArray(value)) {\n for (const entry of value) {\n const resolved = resolveSeedRssImageRelationRef(entry)\n if (resolved?.mediaUrl || resolved?.storageTransactionId || resolved?.seedUid) {\n return resolved\n }\n }\n return undefined\n }\n\n if (typeof value === 'object') {\n return resolveFromObject(value as Record<string, unknown>)\n }\n\n return undefined\n}\n\n/**\n * Read the first configured image-relation field from a parsed RSS item record.\n */\nexport function resolveSeedRssImageRelationFromItem(\n item: Record<string, unknown>,\n fieldKeys: readonly string[] = SEED_RSS_IMAGE_RELATION_FIELD_KEYS,\n): SeedRssImageRelationRef | undefined {\n for (const key of fieldKeys) {\n if (!(key in item)) continue\n const resolved = resolveSeedRssImageRelationRef(item[key])\n if (resolved) return resolved\n }\n return undefined\n}\n","import { BaseArweaveClient } from './BaseArweaveClient.js'\nimport {\n DEFAULT_ARWEAVE_HOST,\n getArweaveReadGatewayHostsForPrimary,\n} from '../constants.js'\n\nconst READ_GATEWAY_CACHE_TTL_MS = 3 * 60 * 1000\nconst PROBE_TIMEOUT_MS = 5000\n\nlet readGatewayCache: { host: string; expiresAt: number } | null = null\nlet ensureInFlight: Promise<string> | null = null\n\n/** Clears cached read gateway (e.g. after tests or to force a fresh probe). */\nexport function invalidateReadGatewayCache(): void {\n readGatewayCache = null\n ensureInFlight = null\n}\n\n/** Clears probe cache, env override suppression, and preferred host (for tests). */\nexport function resetArweaveReadGatewayForTests(): void {\n invalidateReadGatewayCache()\n BaseArweaveClient.resetReadGatewaySelectionStateForTests()\n if (!BaseArweaveClient.isReadGatewayLocked()) {\n BaseArweaveClient.setPreferredReadGateway(DEFAULT_ARWEAVE_HOST)\n }\n}\n\n/**\n * GET /info with timeout. Treat 2xx + JSON object as healthy.\n */\nexport async function probeGateway(baseUrl: string, signal?: AbortSignal): Promise<boolean> {\n const url = `${baseUrl.replace(/\\/$/, '')}/info`\n let timer: ReturnType<typeof setTimeout> | undefined\n const controller = new AbortController()\n const effectiveSignal = signal ?? controller.signal\n if (!signal) {\n timer = setTimeout(() => controller.abort(), PROBE_TIMEOUT_MS)\n }\n try {\n const response = await fetch(url, {\n method: 'GET',\n signal: effectiveSignal,\n headers: { Accept: 'application/json' },\n })\n if (!response.ok) return false\n const text = await response.text()\n if (!text.trim()) return false\n try {\n const json = JSON.parse(text) as unknown\n return typeof json === 'object' && json !== null\n } catch {\n return false\n }\n } catch {\n return false\n } finally {\n if (timer) clearTimeout(timer)\n }\n}\n\nexport async function selectFirstHealthyReadGateway(\n hosts: string[],\n protocol: 'http' | 'https' = 'https',\n signal?: AbortSignal,\n): Promise<string | null> {\n for (const host of hosts) {\n const h = host.trim().replace(/\\/$/, '')\n if (!h) continue\n const baseUrl = `${protocol}://${h}`\n if (await probeGateway(baseUrl, signal)) {\n return h\n }\n }\n return null\n}\n\nfunction buildOrderedHostsForProbe(): string[] {\n return getArweaveReadGatewayHostsForPrimary(BaseArweaveClient.getHost())\n}\n\n/**\n * Probes gateways in order and applies the first healthy host via {@link BaseArweaveClient.applyProbedReadGateway}.\n * No-op when the read gateway is locked ({@link BaseArweaveClient.setHost}).\n * Uses a short TTL cache to avoid probing on every read.\n */\nexport async function ensureReadGatewaySelected(signal?: AbortSignal): Promise<string> {\n if (BaseArweaveClient.isReadGatewayLocked()) {\n return BaseArweaveClient.getHost()\n }\n\n const now = Date.now()\n if (readGatewayCache && now < readGatewayCache.expiresAt) {\n return readGatewayCache.host\n }\n\n if (ensureInFlight) {\n return ensureInFlight\n }\n\n ensureInFlight = (async () => {\n const ordered = buildOrderedHostsForProbe()\n const protocol = BaseArweaveClient.getProtocol()\n const picked = await selectFirstHealthyReadGateway(ordered, protocol, signal)\n\n if (!BaseArweaveClient.isReadGatewayLocked()) {\n if (picked) {\n BaseArweaveClient.applyProbedReadGateway(picked)\n }\n }\n\n readGatewayCache = {\n host: BaseArweaveClient.getHost(),\n expiresAt: Date.now() + READ_GATEWAY_CACHE_TTL_MS,\n }\n return readGatewayCache.host\n })()\n\n try {\n return await ensureInFlight\n } finally {\n ensureInFlight = null\n }\n}\n","import type { TransactionStatus } from '../types/arweave.js'\n\n/**\n * Trim and strip a trailing slash from an upload API base URL.\n */\nexport function normalizeUploadApiBaseUrl(baseUrl: string): string {\n return baseUrl.trim().replace(/\\/+$/, '')\n}\n\n/**\n * URL used to verify that an upload is available via the Seed upload API\n * (`GET` → HTTP 200 when present). Works for L1 transaction ids and ANS-104 data item ids.\n *\n * @param baseUrl - Upload API origin (e.g. from `ARWEAVE_UPLOAD_API_BASE_URL` / `uploadApiBaseUrl`)\n * @param txOrDataItemId - Arweave tx id or bundler data item id\n */\nexport function getUploadApiArweaveDataUrl(baseUrl: string, txOrDataItemId: string): string {\n const base = normalizeUploadApiBaseUrl(baseUrl)\n const id = encodeURIComponent(txOrDataItemId)\n return `${base}/api/upload/arweave/data/${id}`\n}\n\nconst DEFAULT_UPLOAD_STATUS_TIMEOUT_MS = 45_000\n\nexport type GetUploadPipelineTransactionStatusOptions = {\n /** Abort the request after this many ms (upload API hung / unreachable). Default 45s. */\n timeoutMs?: number\n}\n\n/**\n * Presence check against the upload API data route (same semantics as\n * {@link BaseArweaveClient.getTransactionStatus} for gateways: 200 = present, 404 = missing).\n */\nexport async function getUploadPipelineTransactionStatus(\n uploadApiBaseUrl: string,\n txOrDataItemId: string,\n options?: GetUploadPipelineTransactionStatusOptions,\n): Promise<TransactionStatus> {\n const url = getUploadApiArweaveDataUrl(uploadApiBaseUrl, txOrDataItemId)\n const timeoutMs = options?.timeoutMs ?? DEFAULT_UPLOAD_STATUS_TIMEOUT_MS\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs)\n\n try {\n const response = await fetch(url, { signal: controller.signal })\n clearTimeout(timeoutId)\n\n if (response.status === 404) {\n return { status: 404, confirmed: null }\n }\n\n if (!response.ok) {\n return { status: response.status, confirmed: null }\n }\n\n if (response.body) {\n await response.body.cancel()\n }\n\n return { status: 200, confirmed: null }\n } catch (err) {\n clearTimeout(timeoutId)\n if (err instanceof Error && err.name === 'AbortError') {\n return { status: 504, confirmed: null }\n }\n return { status: 500, confirmed: null }\n }\n}\n","import {\n getDefaultArweaveReadGatewayHostsOrdered,\n getArweaveReadGatewayHostsForPrimary,\n} from '../constants.js'\nimport { normalizeUploadApiBaseUrl } from './uploadApiVerification.js'\nimport { probeGateway } from './selectReadGateway.js'\n\n/** Response shape from `GET /api/upload/arweave/status/{dataItemId}`. */\nexport interface ArweaveUploadStatusResponse {\n dataItemId?: string\n phase?: string\n bundleId?: string\n turboStatus?: string\n turboInfo?: string\n winc?: string\n turbo?: {\n status?: string\n bundleId?: string\n info?: string\n winc?: string\n }\n l1?: {\n checked?: boolean\n httpStatus?: number\n confirmed?: boolean\n numberOfConfirmations?: number\n minConfirmationsRequired?: number\n meetsMinConfirmations?: boolean\n }\n}\n\nexport interface ArweaveGatewayTransactionQueryResult {\n /** GraphQL `transaction.id` (often same as data item id for ANS-104 items). */\n transactionId: string | null\n /** L1 bundle transaction id when the item is indexed as bundled. */\n bundledInId: string | null\n blockHeight?: number | null\n blockTimestamp?: number | null\n}\n\nconst GATEWAY_TX_QUERY = `\n query ArweaveGatewayTransaction($id: String!) {\n transaction(id: $id) {\n id\n bundledIn {\n id\n }\n block {\n height\n timestamp\n }\n }\n }\n`\n\nexport function getUploadApiArweaveStatusUrl(baseUrl: string, dataItemId: string): string {\n const base = normalizeUploadApiBaseUrl(baseUrl)\n const id = encodeURIComponent(dataItemId)\n return `${base}/api/upload/arweave/status/${id}`\n}\n\n/**\n * Whether L1 anchoring is complete per upload API status JSON.\n */\nexport function isArweaveL1AnchoringComplete(status: ArweaveUploadStatusResponse): boolean {\n const l1 = status.l1\n if (!l1) return false\n if (l1.meetsMinConfirmations === true) return true\n if (l1.confirmed === true) return true\n return false\n}\n\n/**\n * Fetches JSON from `GET /api/upload/arweave/status/{dataItemId}`.\n * Returns `null` if the response is not OK or body is not JSON.\n */\nexport async function getArweaveUploadStatus(\n uploadApiBaseUrl: string,\n dataItemId: string,\n): Promise<ArweaveUploadStatusResponse | null> {\n const url = getUploadApiArweaveStatusUrl(uploadApiBaseUrl, dataItemId)\n try {\n const response = await fetch(url)\n if (!response.ok) {\n return null\n }\n const body = (await response.json()) as ArweaveUploadStatusResponse\n return body && typeof body === 'object' ? body : null\n } catch {\n return null\n }\n}\n\n/**\n * Queries an Arweave gateway GraphQL API for transaction + bundle info.\n */\nexport async function queryArweaveGatewayTransaction(\n graphqlUrl: string,\n dataItemId: string,\n init?: Pick<RequestInit, 'signal'>,\n): Promise<ArweaveGatewayTransactionQueryResult | null> {\n const url = graphqlUrl.trim()\n if (!url) return null\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query: GATEWAY_TX_QUERY,\n variables: { id: dataItemId },\n }),\n signal: init?.signal,\n })\n\n if (!response.ok) {\n return null\n }\n\n const json = (await response.json()) as {\n data?: {\n transaction?: {\n id?: string\n bundledIn?: { id?: string } | null\n block?: { height?: number; timestamp?: number } | null\n } | null\n }\n errors?: unknown\n }\n\n if (json.errors) {\n return null\n }\n\n const tx = json.data?.transaction\n if (!tx) {\n return {\n transactionId: null,\n bundledInId: null,\n blockHeight: null,\n blockTimestamp: null,\n }\n }\n\n return {\n transactionId: typeof tx.id === 'string' ? tx.id : null,\n bundledInId: tx.bundledIn?.id != null ? String(tx.bundledIn.id) : null,\n blockHeight: tx.block?.height ?? null,\n blockTimestamp: tx.block?.timestamp ?? null,\n }\n } catch {\n return null\n }\n}\n\n/**\n * Resolves GraphQL against the first healthy gateway (GET /info probe per host), then runs\n * {@link queryArweaveGatewayTransaction}. Host order: optional `graphqlUrl` hostname first, then\n * {@link getDefaultArweaveReadGatewayHostsOrdered}.\n */\nexport async function queryArweaveGatewayTransactionWithFallback(\n graphqlUrl: string | undefined,\n dataItemId: string,\n init?: Pick<RequestInit, 'signal'>,\n): Promise<ArweaveGatewayTransactionQueryResult | null> {\n const defaults = getDefaultArweaveReadGatewayHostsOrdered()\n const trimmed = graphqlUrl?.trim()\n let protocol: 'http' | 'https' = 'https'\n let preferredHost: string | null = null\n if (trimmed) {\n try {\n const u = new URL(trimmed)\n protocol = u.protocol === 'http:' ? 'http' : 'https'\n preferredHost = u.hostname || null\n } catch {\n preferredHost = null\n }\n }\n\n const ordered =\n preferredHost && preferredHost.length > 0\n ? getArweaveReadGatewayHostsForPrimary(preferredHost)\n : [...defaults]\n\n const signal = init?.signal\n for (const host of ordered) {\n const base = `${protocol}://${host}`\n if (!(await probeGateway(base, signal ?? undefined))) continue\n const gqlUrl = `${protocol}://${host}/graphql`\n const result = await queryArweaveGatewayTransaction(gqlUrl, dataItemId, init)\n if (result !== null) {\n return result\n }\n }\n return null\n}\n","import type { ResolvedSeedGatewayEndpoints } from '../types/gateway.js'\n\nlet resolvedGatewayEndpoints: ResolvedSeedGatewayEndpoints | null = null\n\n/** Last endpoints applied during client init (for read-path helpers). */\nexport function getResolvedSeedGatewayEndpoints(): ResolvedSeedGatewayEndpoints | null {\n return resolvedGatewayEndpoints\n}\n\nexport function setResolvedSeedGatewayEndpoints(\n value: ResolvedSeedGatewayEndpoints | null,\n): void {\n resolvedGatewayEndpoints = value\n}\n","import { probeGateway } from '../ArweaveClient/selectReadGateway.js'\nimport {\n DEFAULT_ARWEAVE_HOST,\n DEFAULT_GATEWAY_SIDECAR_HOST,\n DEFAULT_GATEWAY_SIDECAR_PORT,\n getArweaveReadGatewayHostsForPrimary,\n} from '../constants.js'\nimport type {\n ResolvedSeedGatewayEndpoints,\n SeedGatewayConfig,\n SeedGatewayTransportMode,\n} from '../types/gateway.js'\n\nconst PROBE_TTL_MS = 3 * 60 * 1000\n\nlet sidecarProbeCache: { healthy: boolean; expiresAt: number } | null = null\nconst proxyProbeCache = new Map<string, { healthy: boolean; expiresAt: number }>()\n\n/** Clears cached sidecar / proxy probes (tests / forced re-probe). */\nexport function invalidateSidecarProbeCache(): void {\n sidecarProbeCache = null\n proxyProbeCache.clear()\n}\n\nfunction parseGatewayHost(input: string | undefined): { host: string; protocol: 'http' | 'https' } {\n const raw = (input ?? DEFAULT_ARWEAVE_HOST).trim()\n if (raw.startsWith('http://')) {\n return { protocol: 'http', host: raw.slice(7).replace(/\\/$/, '') }\n }\n if (raw.startsWith('https://')) {\n return { protocol: 'https', host: raw.slice(8).replace(/\\/$/, '') }\n }\n return { protocol: 'https', host: raw.replace(/\\/$/, '') }\n}\n\nfunction sidecarOrigin(config: SeedGatewayConfig): {\n host: string\n port: number\n baseUrl: string\n} {\n const host = config.hyper?.localSidecarHost?.trim() || DEFAULT_GATEWAY_SIDECAR_HOST\n const port = config.hyper?.localSidecarPort ?? DEFAULT_GATEWAY_SIDECAR_PORT\n const hostWithPort = port === 80 || port === 443 ? host : `${host}:${port}`\n return {\n host: hostWithPort,\n port,\n baseUrl: `http://${host}:${port}`,\n }\n}\n\nfunction browserOrigin(): string | undefined {\n try {\n const g = globalThis as { window?: { location?: { origin?: string } } }\n const origin = g.window?.location?.origin\n return typeof origin === 'string' && origin.length > 0 ? origin.replace(/\\/$/, '') : undefined\n } catch {\n return undefined\n }\n}\n\n/**\n * Resolve `proxyBaseUrl` to an absolute origin+path (no trailing slash).\n * Relative paths require a browser `window.location.origin` or {@link ResolveSeedGatewayEndpointsOptions.origin}.\n */\nexport function resolveProxyBaseUrl(\n proxyBaseUrl: string,\n options?: { origin?: string },\n): string {\n const raw = proxyBaseUrl.trim()\n if (!raw) {\n throw new Error('proxyBaseUrl is empty')\n }\n if (raw.startsWith('http://') || raw.startsWith('https://')) {\n return raw.replace(/\\/$/, '')\n }\n if (raw.startsWith('/')) {\n const origin = (options?.origin?.trim() || browserOrigin() || '').replace(/\\/$/, '')\n if (!origin) {\n throw new Error(\n `Relative proxyBaseUrl \"${proxyBaseUrl}\" requires a browser origin or resolve options.origin`,\n )\n }\n return `${origin}${raw.replace(/\\/$/, '')}`\n }\n return `https://${raw.replace(/\\/$/, '')}`\n}\n\nasync function probeUrlHealthy(\n baseUrl: string,\n cacheKey: 'sidecar' | string,\n signal?: AbortSignal,\n): Promise<boolean> {\n const now = Date.now()\n if (cacheKey === 'sidecar') {\n if (sidecarProbeCache && now < sidecarProbeCache.expiresAt) {\n return sidecarProbeCache.healthy\n }\n const healthy = await probeGateway(baseUrl, signal)\n sidecarProbeCache = { healthy, expiresAt: now + PROBE_TTL_MS }\n return healthy\n }\n\n const cached = proxyProbeCache.get(cacheKey)\n if (cached && now < cached.expiresAt) {\n return cached.healthy\n }\n const healthy = await probeGateway(baseUrl, signal)\n proxyProbeCache.set(cacheKey, { healthy, expiresAt: now + PROBE_TTL_MS })\n return healthy\n}\n\nfunction buildHttpEndpoints(config: SeedGatewayConfig): ResolvedSeedGatewayEndpoints {\n const { host, protocol } = parseGatewayHost(config.arweaveDomain)\n const baseUrl = `${protocol}://${host}`\n const uploadApiBaseUrl = config.uploadApiBaseUrl?.trim() || baseUrl\n return {\n mode: config.transport ?? 'http-gateway',\n arweaveHost: host,\n arweaveProtocol: protocol,\n arweaveBaseUrl: baseUrl,\n arweaveGraphqlUrl: `${protocol}://${host}/graphql`,\n uploadApiBaseUrl,\n activePath: 'http',\n gatewayHyperKey: config.hyper?.gatewayHyperKey?.trim() || undefined,\n }\n}\n\nfunction buildHyperEndpoints(config: SeedGatewayConfig): ResolvedSeedGatewayEndpoints {\n const sidecar = sidecarOrigin(config)\n const key = config.hyper?.gatewayHyperKey?.trim()\n return {\n mode: 'hyper',\n arweaveHost: sidecar.host,\n arweaveProtocol: 'http',\n arweaveBaseUrl: sidecar.baseUrl,\n arweaveGraphqlUrl: `${sidecar.baseUrl}/graphql`,\n uploadApiBaseUrl: sidecar.baseUrl,\n activePath: 'hyper-sidecar',\n gatewayHyperKey: key || undefined,\n }\n}\n\nfunction buildProxyEndpoints(\n config: SeedGatewayConfig,\n absoluteProxyBaseUrl: string,\n): ResolvedSeedGatewayEndpoints {\n const parsed = new URL(absoluteProxyBaseUrl)\n const protocol: 'http' | 'https' = parsed.protocol === 'http:' ? 'http' : 'https'\n const path = parsed.pathname.replace(/\\/$/, '')\n const hostWithPath = path ? `${parsed.host}${path}` : parsed.host\n const baseUrl = `${protocol}://${hostWithPath}`\n return {\n mode: config.transport ?? 'http-gateway',\n arweaveHost: hostWithPath,\n arweaveProtocol: protocol,\n arweaveBaseUrl: baseUrl,\n arweaveGraphqlUrl: `${baseUrl}/graphql`,\n uploadApiBaseUrl: baseUrl,\n activePath: 'http-proxy',\n gatewayHyperKey: config.hyper?.gatewayHyperKey?.trim() || undefined,\n proxyBaseUrl: absoluteProxyBaseUrl,\n }\n}\n\nexport type ResolveSeedGatewayEndpointsOptions = {\n signal?: AbortSignal\n /** Skip cache and probe sidecar / proxy again. */\n forceSidecarProbe?: boolean\n /**\n * Origin used to resolve relative `proxyBaseUrl` (e.g. `https://app.example.com`).\n * Defaults to `window.location.origin` in browsers.\n */\n origin?: string\n}\n\nasync function tryProxyEndpoints(\n config: SeedGatewayConfig,\n options?: ResolveSeedGatewayEndpointsOptions,\n): Promise<ResolvedSeedGatewayEndpoints | null> {\n const raw = config.proxyBaseUrl?.trim()\n if (!raw) return null\n\n const absolute = resolveProxyBaseUrl(raw, { origin: options?.origin })\n const shouldProbe = config.hyper?.probeSidecar !== false\n if (shouldProbe) {\n const ok = await probeUrlHealthy(absolute, `proxy:${absolute}`, options?.signal)\n if (!ok) return null\n }\n return buildProxyEndpoints(config, absolute)\n}\n\n/**\n * Resolve effective gateway + upload API URLs for the configured transport mode.\n *\n * Preference when a proxy and/or sidecar may apply:\n * configured + healthy `proxyBaseUrl` → local Hyper sidecar → public HTTP gateway.\n */\nexport async function resolveSeedGatewayEndpoints(\n config: SeedGatewayConfig,\n options?: ResolveSeedGatewayEndpointsOptions,\n): Promise<ResolvedSeedGatewayEndpoints> {\n if (options?.forceSidecarProbe) {\n invalidateSidecarProbeCache()\n }\n\n const mode: SeedGatewayTransportMode = config.transport ?? 'http-gateway'\n const shouldProbe = config.hyper?.probeSidecar !== false\n\n if (mode === 'http-gateway') {\n if (config.proxyBaseUrl?.trim()) {\n const absolute = resolveProxyBaseUrl(config.proxyBaseUrl, { origin: options?.origin })\n if (shouldProbe) {\n const ok = await probeUrlHealthy(absolute, `proxy:${absolute}`, options?.signal)\n if (!ok) {\n throw new Error(\n `Gateway HTTP proxy not reachable at ${absolute}. ` +\n 'Ensure your Node route runs createGatewayProxy (or equivalent) and mounts at proxyBaseUrl.',\n )\n }\n }\n return buildProxyEndpoints({ ...config, transport: mode }, absolute)\n }\n return buildHttpEndpoints({ ...config, transport: mode })\n }\n\n if (mode === 'hyper') {\n const proxy = await tryProxyEndpoints({ ...config, transport: mode }, options)\n if (proxy) return proxy\n\n const hyperEndpoints = buildHyperEndpoints({ ...config, transport: mode })\n if (shouldProbe) {\n const ok = await probeUrlHealthy(hyperEndpoints.arweaveBaseUrl, 'sidecar', options?.signal)\n if (!ok) {\n throw new Error(\n `Gateway Hyper sidecar not reachable at ${hyperEndpoints.arweaveBaseUrl}. ` +\n 'Run: seed gateway tunnel connect <operator-z32-key> — or configure gateway.proxyBaseUrl for an app-server proxy.',\n )\n }\n }\n return hyperEndpoints\n }\n\n // hybrid: proxy → sidecar → public HTTP\n const proxy = await tryProxyEndpoints({ ...config, transport: mode }, options)\n if (proxy) return proxy\n\n const sidecar = sidecarOrigin(config)\n if (shouldProbe && (await probeUrlHealthy(sidecar.baseUrl, 'sidecar', options?.signal))) {\n return buildHyperEndpoints({ ...config, transport: 'hyper' })\n }\n\n const http = buildHttpEndpoints({ ...config, transport: 'http-gateway' })\n return {\n ...http,\n mode: 'hybrid',\n activePath: 'hybrid-fallback-http',\n }\n}\n\n/** Build ordered gateway host list for read fallback (sidecar/proxy first when active). */\nexport function getReadGatewayHostsForConfig(\n resolved: ResolvedSeedGatewayEndpoints,\n _defaults?: readonly string[],\n): string[] {\n if (resolved.activePath === 'hyper-sidecar' || resolved.activePath === 'http-proxy') {\n return [resolved.arweaveHost]\n }\n return getArweaveReadGatewayHostsForPrimary(resolved.arweaveHost)\n}\n","import type {\n ClientGatewayContextInput,\n SeedConfigGatewayInput,\n SeedGatewayConfig,\n} from '../types/seedConfig.js'\nimport { DEFAULT_SEED_GATEWAY_HYPER_KEY } from '../constants.js'\n\n/** Merge seed.config gateway fields into {@link SeedGatewayConfig}. */\nexport function seedGatewayConfigFromSeedConfig(\n config: SeedConfigGatewayInput,\n): SeedGatewayConfig {\n const gateway = config.gateway ?? {}\n return {\n transport: gateway.transport,\n arweaveDomain: config.arweaveDomain ?? gateway.arweaveDomain,\n uploadApiBaseUrl: config.uploadApiBaseUrl ?? gateway.uploadApiBaseUrl,\n proxyBaseUrl: gateway.proxyBaseUrl?.trim() || undefined,\n hyper: {\n gatewayHyperKey:\n gateway.hyper?.gatewayHyperKey?.trim() ||\n gateway.gatewayHyperKey?.trim() ||\n DEFAULT_SEED_GATEWAY_HYPER_KEY ||\n undefined,\n localSidecarHost: gateway.hyper?.localSidecarHost ?? gateway.localSidecarHost,\n localSidecarPort: gateway.hyper?.localSidecarPort ?? gateway.localSidecarPort,\n probeSidecar: gateway.hyper?.probeSidecar ?? gateway.probeSidecar,\n },\n }\n}\n\nexport function seedGatewayConfigFromClientContext(\n context: ClientGatewayContextInput,\n): SeedGatewayConfig {\n return {\n transport: context.gatewayTransport,\n arweaveDomain: context.arweaveDomain,\n uploadApiBaseUrl: context.uploadApiBaseUrl,\n proxyBaseUrl: context.gatewayProxyBaseUrl?.trim() || undefined,\n hyper: {\n gatewayHyperKey:\n context.gatewayHyperKey?.trim() || DEFAULT_SEED_GATEWAY_HYPER_KEY || undefined,\n localSidecarHost: context.gatewaySidecarHost,\n localSidecarPort: context.gatewaySidecarPort,\n },\n }\n}\n"],"mappings":"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"}
@@ -12,6 +12,9 @@ export type MediaRefClassification = {
12
12
  } | {
13
13
  kind: 'url';
14
14
  href: string;
15
+ } | {
16
+ kind: 'nonMediaUrl';
17
+ href: string;
15
18
  } | {
16
19
  kind: 'seedUid';
17
20
  uid: string;
@@ -1 +1 @@
1
- {"version":3,"file":"mediaRef.d.ts","sourceRoot":"","sources":["../src/mediaRef.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAE9D,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,aAAa,CAAA;IACnB,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,KAAK,CAAA;CAC1C,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;AAEnE,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpC,MAAM,MAAM,qBAAqB,GAC7B;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAA;CAAE,GAC7E;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IACE,MAAM,EAAE,YAAY,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,sBAAsB,CAAA;CACvC,CAAA;AAEL,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,CAAA;AA8B5D,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,uBAAuB,GAChC,sBAAsB,CA+CxB;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,sBAAsB,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,wBAAwB,GAChC,oBAAoB,GACpB,mBAAmB,GACnB,mBAAmB,CAAA;AAEvB,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBzF;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,QAAQ,EAAE,iBAAiB,GAC1B,MAAM,CAAC,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC,CAwBtD;AAED,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEzE"}
1
+ {"version":3,"file":"mediaRef.d.ts","sourceRoot":"","sources":["../src/mediaRef.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAE9D,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,aAAa,CAAA;IACnB,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,KAAK,CAAA;CAC1C,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;AAEnE,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpC,MAAM,MAAM,qBAAqB,GAC7B;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAA;CAAE,GAC7E;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IACE,MAAM,EAAE,YAAY,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,sBAAsB,CAAA;CACvC,CAAA;AAEL,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,CAAA;AA8B5D,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,uBAAuB,GAChC,sBAAsB,CAkDxB;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,sBAAsB,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,wBAAwB,GAChC,oBAAoB,GACpB,mBAAmB,GACnB,mBAAmB,CAAA;AAEvB,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBzF;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,QAAQ,EAAE,iBAAiB,GAC1B,MAAM,CAAC,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC,CAwBtD;AAED,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"ArweaveClient.d.ts","sourceRoot":"","sources":["../../src/node/ArweaveClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAwC7B,qBAAa,iBAAkB,YAAW,cAAc;IACtD,gBAAgB,IAAI,aAAa;IAI3B,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqCvE,kBAAkB,CACtB,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC;IA8BzB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAoBpE,iBAAiB,CACrB,IAAI,EAAE,MAAM,GAAG,UAAU,EACzB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,GAAG,CAAC;IAiBT,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAgD5E;AAED,2CAA2C;AAC3C,eAAO,MAAM,aAAa,0BAAoB,CAAC"}
1
+ {"version":3,"file":"ArweaveClient.d.ts","sourceRoot":"","sources":["../../src/node/ArweaveClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAwC7B,qBAAa,iBAAkB,YAAW,cAAc;IACtD,gBAAgB,IAAI,aAAa;IAI3B,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqCvE,kBAAkB,CACtB,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC;IA0CzB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAoBpE,iBAAiB,CACrB,IAAI,EAAE,MAAM,GAAG,UAAU,EACzB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,GAAG,CAAC;IAiBT,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAgD5E;AAED,2CAA2C;AAC3C,eAAO,MAAM,aAAa,0BAAoB,CAAC"}
package/dist/node.js CHANGED
@@ -1,4 +1,4 @@
1
- import { n as e, r as t } from "./queries-DgB0O5RC.js";
1
+ import { n as e, r as t } from "./queries-BLXr3teJ.js";
2
2
  import { GraphQLClient as n } from "graphql-request";
3
3
  import r from "arweave";
4
4
  import i from "debug";
@@ -7,7 +7,7 @@ var a = i("seedArweave:node:ArweaveClient"), o = null, s = null, c = () => {
7
7
  let e = `${t.getProtocol()}://${t.getHost()}`;
8
8
  if (o && s === e) return o;
9
9
  s = e;
10
- let n = t.getHost(), i = t.getProtocol();
10
+ let n = t.getArweaveSdkHost(), i = t.getProtocol();
11
11
  return o = "default" in r && typeof r.default?.init == "function" ? r.default.init({
12
12
  host: n,
13
13
  protocol: i
@@ -40,14 +40,19 @@ var a = i("seedArweave:node:ArweaveClient"), o = null, s = null, c = () => {
40
40
  };
41
41
  }
42
42
  }
43
- async getTransactionData(e, t) {
44
- let n = c();
43
+ async getTransactionData(e, n) {
44
+ if (t.getGatewayPath()) {
45
+ let r = await fetch(t.getRawUrl(e));
46
+ if (!r.ok) throw Error(`Failed to fetch transaction data: HTTP ${r.status}`);
47
+ return n?.string ? r.text() : new Uint8Array(await r.arrayBuffer());
48
+ }
49
+ let r = c();
45
50
  try {
46
- let r = await n.transactions.getData(e, {
47
- decode: t?.decode ?? !0,
48
- string: t?.string ?? !1
51
+ let t = await r.transactions.getData(e, {
52
+ decode: n?.decode ?? !0,
53
+ string: n?.string ?? !1
49
54
  });
50
- return t?.string && typeof r == "string" || r instanceof Uint8Array ? r : typeof r == "string" ? new TextEncoder().encode(r) : r;
55
+ return n?.string && typeof t == "string" || t instanceof Uint8Array ? t : typeof t == "string" ? new TextEncoder().encode(t) : t;
51
56
  } catch (e) {
52
57
  throw a("Error fetching transaction data:", e), e;
53
58
  }
package/dist/node.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","names":[],"sources":["../src/node/ArweaveClient.ts","../src/node/index.ts"],"sourcesContent":["import { BaseArweaveClient } from '../ArweaveClient/BaseArweaveClient.js';\nimport type { IArweaveClient } from '../ArweaveClient/IArweaveClient.js';\nimport { GraphQLClient } from 'graphql-request';\nimport Arweave from 'arweave';\nimport type {\n TransactionStatus,\n TransactionTag,\n GetDataOptions,\n DownloadFilesParams,\n DownloadResult,\n CreateTransactionOptions,\n} from '../types/arweave.js';\nimport { GET_TRANSACTION_TAGS } from '../ArweaveClient/queries.js';\nimport debug from 'debug';\n\nconst logger = debug('seedArweave:node:ArweaveClient');\n\n// Cached Arweave instance (keyed by gateway so setHost / protocol changes apply)\nlet _arweaveInstance: Arweave | null = null;\nlet _arweaveGatewayKey: string | null = null;\n\n/**\n * Get or create the Arweave instance for Node.js\n */\nconst getArweaveInstance = (): Arweave => {\n const gatewayKey = `${BaseArweaveClient.getProtocol()}://${BaseArweaveClient.getHost()}`;\n if (_arweaveInstance && _arweaveGatewayKey === gatewayKey) {\n return _arweaveInstance;\n }\n\n _arweaveGatewayKey = gatewayKey;\n\n const host = BaseArweaveClient.getHost();\n const protocol = BaseArweaveClient.getProtocol();\n\n // Handle both ES modules and CommonJS exports from arweave package\n if ('default' in Arweave && typeof (Arweave as any).default?.init === 'function') {\n _arweaveInstance = (Arweave as any).default.init({\n host,\n protocol,\n });\n } else {\n _arweaveInstance = Arweave.init({\n host,\n protocol,\n });\n }\n\n return _arweaveInstance!;\n};\n\nexport class NodeArweaveClient implements IArweaveClient {\n getArweaveClient(): GraphQLClient {\n return new GraphQLClient(BaseArweaveClient.getEndpoint());\n }\n\n async getTransactionStatus(transactionId: string): Promise<TransactionStatus> {\n const url = BaseArweaveClient.getStatusUrl(transactionId);\n\n try {\n const response = await fetch(url);\n\n if (response.status === 404) {\n return {\n status: 404,\n confirmed: null,\n };\n }\n\n if (!response.ok) {\n return {\n status: response.status,\n confirmed: null,\n };\n }\n\n if (response.body) {\n await response.body.cancel();\n }\n\n return {\n status: 200,\n confirmed: null,\n };\n } catch (error) {\n logger('Error fetching transaction status:', error);\n return {\n status: 500,\n confirmed: null,\n };\n }\n }\n\n async getTransactionData(\n transactionId: string,\n options?: GetDataOptions\n ): Promise<Uint8Array | string> {\n const arweave = getArweaveInstance();\n\n try {\n const data = await arweave.transactions.getData(transactionId, {\n decode: options?.decode ?? true,\n string: options?.string ?? false,\n });\n\n if (options?.string && typeof data === 'string') {\n return data;\n }\n\n // Ensure we return Uint8Array\n if (data instanceof Uint8Array) {\n return data;\n }\n\n // Handle string data when not requesting string\n if (typeof data === 'string') {\n return new TextEncoder().encode(data);\n }\n\n return data as Uint8Array;\n } catch (error) {\n logger('Error fetching transaction data:', error);\n throw error;\n }\n }\n\n async getTransactionTags(transactionId: string): Promise<TransactionTag[]> {\n const client = this.getArweaveClient();\n \n try {\n const result = await client.request(GET_TRANSACTION_TAGS, { transactionId });\n \n if (!result.tags?.tags) {\n return [];\n }\n\n return result.tags.tags.map((tag: { name: string; value: string }) => ({\n name: tag.name,\n value: tag.value,\n }));\n } catch (error) {\n logger('Error fetching transaction tags:', error);\n return [];\n }\n }\n\n async createTransaction(\n data: string | Uint8Array,\n options?: CreateTransactionOptions\n ): Promise<any> {\n const arweave = getArweaveInstance();\n\n const tx = await arweave.createTransaction({\n data,\n });\n\n // Add tags if provided\n if (options?.tags) {\n for (const tag of options.tags) {\n tx.addTag(tag.name, tag.value);\n }\n }\n\n return tx;\n }\n\n async downloadFiles(params: DownloadFilesParams): Promise<DownloadResult[]> {\n const { transactionIds, excludedTransactions } = params;\n const results: DownloadResult[] = [];\n const baseUrl = BaseArweaveClient.getBaseUrl();\n\n for (const transactionId of transactionIds) {\n // Skip excluded transactions\n if (excludedTransactions?.has(transactionId)) {\n continue;\n }\n\n try {\n const url = `${baseUrl}/raw/${transactionId}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n results.push({\n transactionId,\n success: false,\n error: `HTTP ${response.status}: ${response.statusText}`,\n });\n continue;\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n // Detect content type\n const contentType = response.headers.get('content-type') || undefined;\n\n results.push({\n transactionId,\n success: true,\n contentType,\n data,\n });\n } catch (error) {\n logger(`Error downloading transaction ${transactionId}:`, error);\n results.push({\n transactionId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return results;\n }\n}\n\n/** @deprecated Prefer NodeArweaveClient */\nexport const ArweaveClient = NodeArweaveClient;\n\nBaseArweaveClient.configure(new NodeArweaveClient());\n\nconst _check: IArweaveClient = new NodeArweaveClient();\nvoid _check;\n","import './ArweaveClient.js'\nimport { DEFAULT_ARWEAVE_HOST } from '../constants.js'\nimport { BaseArweaveClient } from '../ArweaveClient/BaseArweaveClient.js'\nimport { NodeArweaveClient } from './ArweaveClient.js'\n\nexport { ArweaveClient, NodeArweaveClient } from './ArweaveClient.js'\n\n/** Register Node.js Arweave client and set default read gateway host. */\nexport function registerNodeArweavePlatform(options?: { arweaveDomain?: string }): void {\n BaseArweaveClient.configure(new NodeArweaveClient())\n BaseArweaveClient.setPreferredReadGateway(options?.arweaveDomain ?? DEFAULT_ARWEAVE_HOST)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"node.js","names":[],"sources":["../src/node/ArweaveClient.ts","../src/node/index.ts"],"sourcesContent":["import { BaseArweaveClient } from '../ArweaveClient/BaseArweaveClient.js';\nimport type { IArweaveClient } from '../ArweaveClient/IArweaveClient.js';\nimport { GraphQLClient } from 'graphql-request';\nimport Arweave from 'arweave';\nimport type {\n TransactionStatus,\n TransactionTag,\n GetDataOptions,\n DownloadFilesParams,\n DownloadResult,\n CreateTransactionOptions,\n} from '../types/arweave.js';\nimport { GET_TRANSACTION_TAGS } from '../ArweaveClient/queries.js';\nimport debug from 'debug';\n\nconst logger = debug('seedArweave:node:ArweaveClient');\n\n// Cached Arweave instance (keyed by gateway so setHost / protocol changes apply)\nlet _arweaveInstance: Arweave | null = null;\nlet _arweaveGatewayKey: string | null = null;\n\n/**\n * Get or create the Arweave instance for Node.js\n */\nconst getArweaveInstance = (): Arweave => {\n const gatewayKey = `${BaseArweaveClient.getProtocol()}://${BaseArweaveClient.getHost()}`;\n if (_arweaveInstance && _arweaveGatewayKey === gatewayKey) {\n return _arweaveInstance;\n }\n\n _arweaveGatewayKey = gatewayKey;\n\n const host = BaseArweaveClient.getArweaveSdkHost();\n const protocol = BaseArweaveClient.getProtocol();\n\n // Handle both ES modules and CommonJS exports from arweave package\n if ('default' in Arweave && typeof (Arweave as any).default?.init === 'function') {\n _arweaveInstance = (Arweave as any).default.init({\n host,\n protocol,\n });\n } else {\n _arweaveInstance = Arweave.init({\n host,\n protocol,\n });\n }\n\n return _arweaveInstance!;\n};\n\nexport class NodeArweaveClient implements IArweaveClient {\n getArweaveClient(): GraphQLClient {\n return new GraphQLClient(BaseArweaveClient.getEndpoint());\n }\n\n async getTransactionStatus(transactionId: string): Promise<TransactionStatus> {\n const url = BaseArweaveClient.getStatusUrl(transactionId);\n\n try {\n const response = await fetch(url);\n\n if (response.status === 404) {\n return {\n status: 404,\n confirmed: null,\n };\n }\n\n if (!response.ok) {\n return {\n status: response.status,\n confirmed: null,\n };\n }\n\n if (response.body) {\n await response.body.cancel();\n }\n\n return {\n status: 200,\n confirmed: null,\n };\n } catch (error) {\n logger('Error fetching transaction status:', error);\n return {\n status: 500,\n confirmed: null,\n };\n }\n }\n\n async getTransactionData(\n transactionId: string,\n options?: GetDataOptions\n ): Promise<Uint8Array | string> {\n // Path-prefixed proxies are not supported by arweave.init host; fetch via getRawUrl.\n if (BaseArweaveClient.getGatewayPath()) {\n const response = await fetch(BaseArweaveClient.getRawUrl(transactionId));\n if (!response.ok) {\n throw new Error(`Failed to fetch transaction data: HTTP ${response.status}`);\n }\n if (options?.string) {\n return response.text();\n }\n return new Uint8Array(await response.arrayBuffer());\n }\n\n const arweave = getArweaveInstance();\n\n try {\n const data = await arweave.transactions.getData(transactionId, {\n decode: options?.decode ?? true,\n string: options?.string ?? false,\n });\n\n if (options?.string && typeof data === 'string') {\n return data;\n }\n\n // Ensure we return Uint8Array\n if (data instanceof Uint8Array) {\n return data;\n }\n\n // Handle string data when not requesting string\n if (typeof data === 'string') {\n return new TextEncoder().encode(data);\n }\n\n return data as Uint8Array;\n } catch (error) {\n logger('Error fetching transaction data:', error);\n throw error;\n }\n }\n\n async getTransactionTags(transactionId: string): Promise<TransactionTag[]> {\n const client = this.getArweaveClient();\n \n try {\n const result = await client.request(GET_TRANSACTION_TAGS, { transactionId });\n \n if (!result.tags?.tags) {\n return [];\n }\n\n return result.tags.tags.map((tag: { name: string; value: string }) => ({\n name: tag.name,\n value: tag.value,\n }));\n } catch (error) {\n logger('Error fetching transaction tags:', error);\n return [];\n }\n }\n\n async createTransaction(\n data: string | Uint8Array,\n options?: CreateTransactionOptions\n ): Promise<any> {\n const arweave = getArweaveInstance();\n\n const tx = await arweave.createTransaction({\n data,\n });\n\n // Add tags if provided\n if (options?.tags) {\n for (const tag of options.tags) {\n tx.addTag(tag.name, tag.value);\n }\n }\n\n return tx;\n }\n\n async downloadFiles(params: DownloadFilesParams): Promise<DownloadResult[]> {\n const { transactionIds, excludedTransactions } = params;\n const results: DownloadResult[] = [];\n const baseUrl = BaseArweaveClient.getBaseUrl();\n\n for (const transactionId of transactionIds) {\n // Skip excluded transactions\n if (excludedTransactions?.has(transactionId)) {\n continue;\n }\n\n try {\n const url = `${baseUrl}/raw/${transactionId}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n results.push({\n transactionId,\n success: false,\n error: `HTTP ${response.status}: ${response.statusText}`,\n });\n continue;\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n // Detect content type\n const contentType = response.headers.get('content-type') || undefined;\n\n results.push({\n transactionId,\n success: true,\n contentType,\n data,\n });\n } catch (error) {\n logger(`Error downloading transaction ${transactionId}:`, error);\n results.push({\n transactionId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return results;\n }\n}\n\n/** @deprecated Prefer NodeArweaveClient */\nexport const ArweaveClient = NodeArweaveClient;\n\nBaseArweaveClient.configure(new NodeArweaveClient());\n\nconst _check: IArweaveClient = new NodeArweaveClient();\nvoid _check;\n","import './ArweaveClient.js'\nimport { DEFAULT_ARWEAVE_HOST } from '../constants.js'\nimport { BaseArweaveClient } from '../ArweaveClient/BaseArweaveClient.js'\nimport { NodeArweaveClient } from './ArweaveClient.js'\n\nexport { ArweaveClient, NodeArweaveClient } from './ArweaveClient.js'\n\n/** Register Node.js Arweave client and set default read gateway host. */\nexport function registerNodeArweavePlatform(options?: { arweaveDomain?: string }): void {\n BaseArweaveClient.configure(new NodeArweaveClient())\n BaseArweaveClient.setPreferredReadGateway(options?.arweaveDomain ?? DEFAULT_ARWEAVE_HOST)\n}\n"],"mappings":"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"}
@@ -94,6 +94,14 @@ var _ = e, v = "https", y = !1, b = !1, x = class e {
94
94
  static getHost() {
95
95
  return this.resolveGateway().host;
96
96
  }
97
+ static getArweaveSdkHost() {
98
+ let e = this.getHost(), t = e.indexOf("/");
99
+ return t === -1 ? e : e.slice(0, t);
100
+ }
101
+ static getGatewayPath() {
102
+ let e = this.getHost(), t = e.indexOf("/");
103
+ return t === -1 ? "" : e.slice(t).replace(/\/$/, "") || "";
104
+ }
97
105
  static getProtocol() {
98
106
  return this.resolveGateway().protocol;
99
107
  }
@@ -509,4 +517,4 @@ var w = C("\n query GetTransactionTags($transactionId: ID!) {\n tags: transa
509
517
  //#endregion
510
518
  export { o as a, r as c, n as d, f, u as g, m as h, c as i, i as l, h as m, w as n, a as o, p, x as r, e as s, T as t, t as u };
511
519
 
512
- //# sourceMappingURL=queries-DgB0O5RC.js.map
520
+ //# sourceMappingURL=queries-BLXr3teJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries-BLXr3teJ.js","names":[],"sources":["../src/constants.ts","../src/ArweaveClient/BaseArweaveClient.ts","../src/graphql/gql/graphql.ts","../src/graphql/gql/gql.ts","../src/ArweaveClient/queries.ts"],"sourcesContent":["/** Default Arweave gateway host used across all packages (first in {@link DEFAULT_ARWEAVE_GATEWAYS}) */\nexport const DEFAULT_ARWEAVE_HOST = 'ar.seedprotocol.io'\n\n/**\n * Official Seed Protocol public feed Hyperdrive key (z32).\n * Empty until the first official publisher keypair is generated and backed up by ops.\n */\nexport const DEFAULT_SEED_FEED_HYPER_KEY = ''\n\n/**\n * Official Seed Protocol gateway Hyper tunnel operator key (z32).\n * Empty until ops generate and back up the first operator keypair.\n */\nexport const DEFAULT_SEED_GATEWAY_HYPER_KEY = ''\n\n/** Default localhost sidecar bind for Gateway Hyper client mode. */\nexport const DEFAULT_GATEWAY_SIDECAR_HOST = '127.0.0.1'\nexport const DEFAULT_GATEWAY_SIDECAR_PORT = 1984\n\n/** Default Arweave gateway GraphQL endpoint (transaction / block queries). */\nexport const DEFAULT_ARWEAVE_GRAPHQL_URL = `https://${DEFAULT_ARWEAVE_HOST}/graphql`\n\n/**\n * Default Arweave gateways for read fallback / metadata fetching (ordered by preference).\n * Override order with `ARWEAVE_READ_GATEWAYS` or `NEXT_PUBLIC_ARWEAVE_READ_GATEWAYS` (comma-separated hosts).\n */\nexport const DEFAULT_ARWEAVE_GATEWAYS = [\n 'ar.seedprotocol.io',\n 'arweave.net',\n 'arweave.dev',\n 'g8way.io',\n 'permagate.io',\n 'zigza.xyz',\n] as const\n\nconst READ_GATEWAYS_ENV_KEYS = ['ARWEAVE_READ_GATEWAYS', 'NEXT_PUBLIC_ARWEAVE_READ_GATEWAYS'] as const\n\n/** Env keys checked for primary Arweave gateway host (first match wins). */\nexport const ARWEAVE_HOST_ENV_KEYS = [\n 'NEXT_PUBLIC_ARWEAVE_HOST',\n 'ARWEAVE_HOST',\n 'VITE_ARWEAVE_HOST',\n] as const\n\nfunction normalizeGatewayHostInput(input: string): string {\n const t = input.trim()\n if (t.startsWith('http://')) return t.slice(7).replace(/\\/$/, '')\n if (t.startsWith('https://')) return t.slice(8).replace(/\\/$/, '')\n return t.replace(/\\/$/, '')\n}\n\n/**\n * Primary gateway host from env (`NEXT_PUBLIC_ARWEAVE_HOST`, `ARWEAVE_HOST`, or `VITE_ARWEAVE_HOST`).\n * Scheme prefixes (`http://`, `https://`) are stripped.\n */\nexport function resolveArweaveHostFromEnv(): string | undefined {\n if (typeof process === 'undefined' || !process.env) return undefined\n for (const key of ARWEAVE_HOST_ENV_KEYS) {\n const raw = process.env[key]?.trim()\n if (raw) return normalizeGatewayHostInput(raw)\n }\n return undefined\n}\n\nfunction filterDefaultsForPrimary(primary: string, defaults: readonly string[]): string[] {\n const primaryNorm = primary.trim().toLowerCase().replace(/\\/$/, '')\n const seedNorm = DEFAULT_ARWEAVE_HOST.toLowerCase()\n if (primaryNorm === seedNorm) return [...defaults]\n return defaults.filter((g) => g.toLowerCase() !== seedNorm)\n}\n\n/**\n * Ordered read gateways: `primary` first, then fallbacks.\n * When `primary` is not {@link DEFAULT_ARWEAVE_HOST}, `ar.seedprotocol.io` is omitted from fallbacks\n * unless it appears in an explicit `ARWEAVE_READ_GATEWAYS` env list.\n */\nexport function getArweaveReadGatewayHostsForPrimary(primary: string): string[] {\n const defaults = getDefaultArweaveReadGatewayHostsOrdered()\n return mergePrimaryHostWithDefaults(primary, filterDefaultsForPrimary(primary, defaults))\n}\n\n/** Ordered gateway hostnames for reads: env list if set, otherwise {@link DEFAULT_ARWEAVE_GATEWAYS}. */\nexport function getDefaultArweaveReadGatewayHostsOrdered(): string[] {\n if (typeof process === 'undefined' || !process.env) {\n return [...DEFAULT_ARWEAVE_GATEWAYS]\n }\n for (const key of READ_GATEWAYS_ENV_KEYS) {\n const raw = process.env[key]?.trim()\n if (raw) {\n return raw.split(',').map((s) => s.trim()).filter(Boolean)\n }\n }\n return [...DEFAULT_ARWEAVE_GATEWAYS]\n}\n\n/**\n * Deduped host list: primary first, then each default not already present (case-insensitive).\n */\nexport function mergePrimaryHostWithDefaults(\n primary: string,\n defaults: readonly string[],\n): string[] {\n const seen = new Set<string>()\n const out: string[] = []\n const keyOf = (h: string) => h.trim().toLowerCase().replace(/\\/$/, '')\n const add = (h: string) => {\n const t = h.trim().replace(/\\/$/, '')\n if (!t) return\n const k = keyOf(t)\n if (seen.has(k)) return\n seen.add(k)\n out.push(t)\n }\n add(primary)\n for (const d of defaults) add(d)\n return out\n}\n\n/**\n * True if `hostname` looks like a public Arweave gateway used in stored URLs (hydration / RSS).\n */\nexport function isKnownArweaveGatewayHostname(hostname: string): boolean {\n const h = hostname.trim().toLowerCase()\n if (!h) return false\n if (h.endsWith('arweave.net')) return true\n if (h.endsWith('ar-io.net')) return true\n for (const g of DEFAULT_ARWEAVE_GATEWAYS) {\n const gl = g.toLowerCase()\n if (h === gl || h.endsWith(`.${gl}`)) return true\n }\n return false\n}\n","import { GraphQLClient } from 'graphql-request'\nimport type {\n TransactionStatus,\n TransactionTag,\n GetDataOptions,\n DownloadFilesParams,\n DownloadResult,\n CreateTransactionOptions,\n} from '../types/arweave.js'\nimport { DEFAULT_ARWEAVE_HOST, resolveArweaveHostFromEnv } from '../constants.js'\nimport type { IArweaveClient } from './IArweaveClient.js'\n\nfunction parseGateway(input: string): { protocol: 'http' | 'https'; host: string } {\n const t = input.trim()\n if (t.startsWith('http://')) {\n return { protocol: 'http', host: t.slice(7).replace(/\\/$/, '') }\n }\n if (t.startsWith('https://')) {\n return { protocol: 'https', host: t.slice(8).replace(/\\/$/, '') }\n }\n return { protocol: 'https', host: t.replace(/\\/$/, '') }\n}\n\n// Internal gateway state (process-wide; stays on the facade)\nlet _host = DEFAULT_ARWEAVE_HOST\nlet _protocol: 'http' | 'https' = 'https'\nlet _hostExplicitlySet = false\n/** When true, env gateway host does not override `_host` (after a successful read-gateway probe). */\nlet _suppressEnvGatewayOverride = false\n\nexport abstract class BaseArweaveClient {\n private static _impl: IArweaveClient | null = null\n\n static configure(impl: IArweaveClient): void {\n if (!impl) {\n throw new Error(\n 'Cannot configure ArweaveClient with undefined or null. Ensure the platform-specific ArweaveClient is properly created.',\n )\n }\n BaseArweaveClient._impl = impl\n }\n\n private static requireImpl(): IArweaveClient {\n if (!BaseArweaveClient._impl) {\n throw new Error(\n 'ArweaveClient not configured. Import from @seedprotocol/arweave/node to register the Node.js implementation, or ensure SDK platform init has run.',\n )\n }\n return BaseArweaveClient._impl\n }\n\n /**\n * Resolved gateway host (no scheme) and protocol from env override or setHost().\n */\n static resolveGateway(): { protocol: 'http' | 'https'; host: string } {\n const envHost = resolveArweaveHostFromEnv()\n if (envHost && !_hostExplicitlySet && !_suppressEnvGatewayOverride) {\n return parseGateway(envHost)\n }\n return { protocol: _protocol, host: _host }\n }\n\n // ============================================\n // Configuration Methods (facade / process-wide)\n // ============================================\n\n /**\n * Get the current Arweave host (hostname, optionally with port and path prefix — no URL scheme)\n * @returns The Arweave host (e.g. 'arweave.net', 'localhost:1984', or 'app.example.com/api/seed-gateway')\n */\n static getHost(): string {\n return this.resolveGateway().host\n }\n\n /**\n * Hostname (+ optional port) without a path prefix — safe for the `arweave` npm client's `init({ host })`.\n */\n static getArweaveSdkHost(): string {\n const host = this.getHost()\n const slash = host.indexOf('/')\n return slash === -1 ? host : host.slice(0, slash)\n }\n\n /**\n * Path prefix on the gateway origin (e.g. `/api/seed-gateway`), or empty.\n */\n static getGatewayPath(): string {\n const host = this.getHost()\n const slash = host.indexOf('/')\n if (slash === -1) return ''\n return host.slice(slash).replace(/\\/$/, '') || ''\n }\n\n /**\n * Get whether requests use http or https\n */\n static getProtocol(): 'http' | 'https' {\n return this.resolveGateway().protocol\n }\n\n /**\n * Base URL for the configured gateway (e.g. https://arweave.net, http://localhost:1984,\n * or https://app.example.com/api/seed-gateway)\n */\n static getBaseUrl(): string {\n const { protocol, host } = this.resolveGateway()\n return `${protocol}://${host}`\n }\n\n /**\n * Set the Arweave gateway. Plain host defaults to https; prefix with http:// for local HTTP gateways.\n * @param host - e.g. 'arweave.net', 'https://arweave.net', or 'http://localhost:1984'\n */\n static setHost(host: string): void {\n const parsed = parseGateway(host)\n _host = parsed.host\n _protocol = parsed.protocol\n _hostExplicitlySet = true\n _suppressEnvGatewayOverride = false\n }\n\n /**\n * When true, read-path gateway probing does not change the host ({@link setHost}).\n */\n static isReadGatewayLocked(): boolean {\n return _hostExplicitlySet\n }\n\n /**\n * @internal Clears env override suppression after probing (for test isolation).\n */\n static resetReadGatewaySelectionStateForTests(): void {\n _suppressEnvGatewayOverride = false\n }\n\n /**\n * Sets the preferred read gateway without locking. Env host still takes precedence until a probe applies a host.\n * Used for seed `arweaveDomain`.\n */\n static setPreferredReadGateway(host: string): void {\n const parsed = parseGateway(host)\n _host = parsed.host\n _protocol = parsed.protocol\n _hostExplicitlySet = false\n }\n\n /**\n * Applies a gateway chosen by read-path health probing so {@link getHost} uses it instead of env override.\n */\n static applyProbedReadGateway(host: string): void {\n const parsed = parseGateway(host)\n _host = parsed.host\n _protocol = parsed.protocol\n _hostExplicitlySet = false\n _suppressEnvGatewayOverride = true\n }\n\n /**\n * Get the GraphQL endpoint URL\n * @returns The full GraphQL endpoint URL\n */\n static getEndpoint(): string {\n return `${this.getBaseUrl()}/graphql`\n }\n\n /**\n * Get the raw data URL for a transaction\n * @param transactionId - The Arweave transaction ID\n * @returns The full URL to access raw transaction data\n */\n static getRawUrl(transactionId: string): string {\n return `${this.getBaseUrl()}/raw/${transactionId}`\n }\n\n /**\n * URL used to verify that a transaction is available on the gateway (HTTP 200 = present).\n * @param transactionId - The Arweave transaction ID\n */\n static getStatusUrl(transactionId: string): string {\n return `${this.getBaseUrl()}/${transactionId}`\n }\n\n // ============================================\n // Delegated to platform instance\n // ============================================\n\n static getArweaveClient(): GraphQLClient {\n return BaseArweaveClient.requireImpl().getArweaveClient()\n }\n\n static getTransactionStatus(transactionId: string): Promise<TransactionStatus> {\n return BaseArweaveClient.requireImpl().getTransactionStatus(transactionId)\n }\n\n static getTransactionData(\n transactionId: string,\n options?: GetDataOptions\n ): Promise<Uint8Array | string> {\n return BaseArweaveClient.requireImpl().getTransactionData(transactionId, options)\n }\n\n static getTransactionTags(transactionId: string): Promise<TransactionTag[]> {\n return BaseArweaveClient.requireImpl().getTransactionTags(transactionId)\n }\n\n static createTransaction(\n data: string | Uint8Array,\n options?: CreateTransactionOptions\n ): Promise<any> {\n return BaseArweaveClient.requireImpl().createTransaction(data, options)\n }\n\n static downloadFiles(params: DownloadFilesParams): Promise<DownloadResult[]> {\n return BaseArweaveClient.requireImpl().downloadFiles(params)\n }\n}\n","/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n ID: { input: string; output: string; }\n String: { input: string; output: string; }\n Boolean: { input: boolean; output: boolean; }\n Int: { input: number; output: number; }\n Float: { input: number; output: number; }\n};\n\n/** Representation of a value transfer between wallets, in both winson and ar. */\nexport type Amount = {\n __typename?: 'Amount';\n /** Amount as an AR string e.g. \\`\"0.000000000001\"\\`. */\n ar: Scalars['String']['output'];\n /** Amount as a winston string e.g. \\`\"1000000000000\"\\`. */\n winston: Scalars['String']['output'];\n};\n\n/** Block Schema */\nexport type Block = {\n __typename?: 'Block';\n /** The block height. */\n height: Scalars['Int']['output'];\n /** The block ID. */\n id?: Maybe<Scalars['ID']['output']>;\n /** The previous block ID. */\n previous?: Maybe<Scalars['ID']['output']>;\n /** The block timestamp (UTC). */\n timestamp?: Maybe<Scalars['Int']['output']>;\n};\n\n/**\n * Paginated result set using the GraphQL cursor spec,\n * see: https://relay.dev/graphql/connections.htm.\n */\nexport type BlockConnection = {\n __typename?: 'BlockConnection';\n edges: Array<BlockEdge>;\n pageInfo: PageInfo;\n};\n\n/** Paginated result set using the GraphQL cursor spec. */\nexport type BlockEdge = {\n __typename?: 'BlockEdge';\n /**\n * The cursor value for fetching the next page.\n *\n * Pass this to the after parameter in blocks(after: $cursor), the next page will start from the next item after this.\n */\n cursor: Scalars['String']['output'];\n /** A block object. */\n node: Block;\n};\n\n/**\n * The data bundle containing the current data item.\n * See: https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-104.md.\n */\nexport type Bundle = {\n __typename?: 'Bundle';\n /** ID of the containing data bundle. */\n id: Scalars['ID']['output'];\n};\n\nexport enum CacheControlScope {\n Private = 'PRIVATE',\n Public = 'PUBLIC'\n}\n\n/** Basic metadata about the transaction data payload. */\nexport type MetaData = {\n __typename?: 'MetaData';\n /** Size of the associated data in bytes. */\n size: Scalars['String']['output'];\n /** Type is derived from the \\`content-type\\` tag on a transaction. */\n type?: Maybe<Scalars['String']['output']>;\n};\n\n/** Representation of a transaction owner. */\nexport type Owner = {\n __typename?: 'Owner';\n /** The owner's wallet address. */\n address: Scalars['String']['output'];\n /** The owner's public key as a base64url encoded string. */\n key: Scalars['String']['output'];\n};\n\n/** Paginated page info using the GraphQL cursor spec. */\nexport type PageInfo = {\n __typename?: 'PageInfo';\n hasNextPage: Scalars['Boolean']['output'];\n};\n\n/**\n * The parent transaction for bundled transactions,\n * see: https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-102.md.\n */\nexport type Parent = {\n __typename?: 'Parent';\n id: Scalars['ID']['output'];\n};\n\nexport type Query = {\n __typename?: 'Query';\n block?: Maybe<Block>;\n blocks: BlockConnection;\n /** Get a transaction by its id */\n transaction?: Maybe<Transaction>;\n /** Get a paginated set of matching transactions using filters. */\n transactions: TransactionConnection;\n};\n\n\nexport type QueryBlockArgs = {\n id?: InputMaybe<Scalars['String']['input']>;\n};\n\n\nexport type QueryBlocksArgs = {\n after?: InputMaybe<Scalars['String']['input']>;\n first?: InputMaybe<Scalars['Int']['input']>;\n height?: InputMaybe<RangeFilter>;\n ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n sort?: InputMaybe<SortOrder>;\n};\n\n\nexport type QueryTransactionArgs = {\n id: Scalars['ID']['input'];\n};\n\n\nexport type QueryTransactionsArgs = {\n after?: InputMaybe<Scalars['String']['input']>;\n block?: InputMaybe<RangeFilter>;\n bundledIn?: InputMaybe<Array<Scalars['ID']['input']>>;\n first?: InputMaybe<Scalars['Int']['input']>;\n ids?: InputMaybe<Array<Scalars['ID']['input']>>;\n ingested_at?: InputMaybe<RangeFilter>;\n owners?: InputMaybe<Array<Scalars['String']['input']>>;\n recipients?: InputMaybe<Array<Scalars['String']['input']>>;\n sort?: InputMaybe<SortOrder>;\n tags?: InputMaybe<Array<TagFilter>>;\n};\n\n/** Filter with a min and max */\nexport type RangeFilter = {\n /** Maximum integer to filter to */\n max?: InputMaybe<Scalars['Int']['input']>;\n /** Minimum integer to filter from */\n min?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** Optionally reverse the result sort order from `HEIGHT_DESC` (default) to `HEIGHT_ASC`. */\nexport enum SortOrder {\n /** Results are sorted by the transaction block height in ascending order, with the oldest transactions appearing first, and the most recent and pending/unconfirmed appearing last. */\n HeightAsc = 'HEIGHT_ASC',\n /** Results are sorted by the transaction block height in descending order, with the most recent and unconfirmed/pending transactions appearing first. */\n HeightDesc = 'HEIGHT_DESC',\n /** Results are sorted by the transaction ingestion time in ascending order, with the oldest ingested transactions appearing first. */\n IngestedAtAsc = 'INGESTED_AT_ASC',\n /** Results are sorted by the transaction ingestion time in descending order, with the most recently ingested transactions appearing first. */\n IngestedAtDesc = 'INGESTED_AT_DESC'\n}\n\n/** Tag Schema */\nexport type Tag = {\n __typename?: 'Tag';\n /** UTF-8 tag name */\n name: Scalars['String']['output'];\n /** UTF-8 tag value */\n value: Scalars['String']['output'];\n};\n\n/** Find transactions with the following tag name and value */\nexport type TagFilter = {\n /** How tag names and values are matched. Defaults to EXACT. */\n match?: TagMatch;\n /** The tag name */\n name?: InputMaybe<Scalars['String']['input']>;\n /** The operator to apply to to the tag filter. Defaults to EQ (equal). */\n op?: TagOperator;\n /**\n * An array of values to match against. If multiple values are passed then transactions with _any_ matching tag value from the set will be returned.\n *\n * e.g.\n *\n * `{name: \"app-name\", values: [\"app-1\"]}`\n *\n * Returns all transactions where the `app-name` tag has a value of `app-1`.\n *\n * `{name: \"app-name\", values: [\"app-1\", \"app-2\", \"app-3\"]}`\n *\n * Returns all transactions where the `app-name` tag has a value of either `app-1` _or_ `app-2` _or_ `app-3`.\n */\n values?: InputMaybe<Array<Scalars['String']['input']>>;\n};\n\n/** The method used to determine if tags match. */\nexport enum TagMatch {\n /** An exact match */\n Exact = 'EXACT',\n /** Fuzzy match containing all search terms */\n FuzzyAnd = 'FUZZY_AND',\n /** Fuzzy match containing at least one search term */\n FuzzyOr = 'FUZZY_OR',\n /** A wildcard match */\n Wildcard = 'WILDCARD'\n}\n\n/** The operator to apply to a tag value. */\nexport enum TagOperator {\n /** Equal */\n Eq = 'EQ',\n /** Not equal */\n Neq = 'NEQ'\n}\n\n/** Transaction Structure */\nexport type Transaction = {\n __typename?: 'Transaction';\n anchor: Scalars['String']['output'];\n /** Transactions with a null block are recent and unconfirmed, if they aren't mined into a block within 60 minutes they will be removed from results. */\n block?: Maybe<Block>;\n /**\n * For bundled data items this references the containing bundle ID.\n * See: https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-104.md\n */\n bundledIn?: Maybe<Bundle>;\n data: MetaData;\n fee: Amount;\n id: Scalars['ID']['output'];\n /** When this transaction was made available for querying */\n ingested_at?: Maybe<Scalars['Int']['output']>;\n owner: Owner;\n /**\n * @deprecated Don't use, kept for backwards compatability only!\n * @deprecated Use `bundledIn`\n */\n parent?: Maybe<Parent>;\n quantity: Amount;\n recipient: Scalars['String']['output'];\n signature: Scalars['String']['output'];\n tags: Array<Tag>;\n};\n\n/**\n * Paginated result set using the GraphQL cursor spec,\n * see: https://relay.dev/graphql/connections.htm.\n */\nexport type TransactionConnection = {\n __typename?: 'TransactionConnection';\n /** The number of transactions that match this query. */\n count?: Maybe<Scalars['String']['output']>;\n edges: Array<TransactionEdge>;\n pageInfo: PageInfo;\n};\n\n/** Paginated result set using the GraphQL cursor spec. */\nexport type TransactionEdge = {\n __typename?: 'TransactionEdge';\n /**\n * The cursor value for fetching the next page.\n *\n * Pass this to the `after` parameter in ` transactions(after: $cursor)`, the next page will start from the next item after this.\n */\n cursor: Scalars['String']['output'];\n /** A transaction object. */\n node: Transaction;\n};\n\nexport type GetTransactionTagsQueryVariables = Exact<{\n transactionId: Scalars['ID']['input'];\n}>;\n\n\nexport type GetTransactionTagsQuery = { __typename?: 'Query', tags?: { __typename?: 'Transaction', id: string, tags: Array<{ __typename?: 'Tag', name: string, value: string }> } | null };\n\nexport type GetArweaveTransactionsQueryVariables = Exact<{\n owners?: InputMaybe<Array<Scalars['String']['input']> | Scalars['String']['input']>;\n first?: InputMaybe<Scalars['Int']['input']>;\n after?: InputMaybe<Scalars['String']['input']>;\n}>;\n\n\nexport type GetArweaveTransactionsQuery = { __typename?: 'Query', transactions: { __typename?: 'TransactionConnection', edges: Array<{ __typename?: 'TransactionEdge', cursor: string, node: { __typename?: 'Transaction', id: string, anchor: string, signature: string, block?: { __typename?: 'Block', id?: string | null, height: number } | null, data: { __typename?: 'MetaData', size: string, type?: string | null }, tags: Array<{ __typename?: 'Tag', name: string, value: string }> } }>, pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean } } };\n\n\nexport const GetTransactionTagsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"GetTransactionTags\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"transactionId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"tags\"},\"name\":{\"kind\":\"Name\",\"value\":\"transaction\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"transactionId\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"}}]}}]}}]}}]} as unknown as DocumentNode<GetTransactionTagsQuery, GetTransactionTagsQueryVariables>;\nexport const GetArweaveTransactionsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"GetArweaveTransactions\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"owners\"}},\"type\":{\"kind\":\"ListType\",\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"first\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"after\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"transactions\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"owners\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"owners\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"first\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"first\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"after\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"after\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"edges\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cursor\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"node\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"anchor\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"signature\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"block\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"data\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"type\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"}}]}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"pageInfo\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hasNextPage\"}}]}}]}}]}}]} as unknown as DocumentNode<GetArweaveTransactionsQuery, GetArweaveTransactionsQueryVariables>;","/* eslint-disable */\nimport * as types from './graphql';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n \"\\n query GetTransactionTags($transactionId: ID!) {\\n tags: transaction(id: $transactionId) {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n\": typeof types.GetTransactionTagsDocument,\n \"\\n query GetArweaveTransactions(\\n $owners: [String!]\\n $first: Int\\n $after: String\\n ) {\\n transactions(owners: $owners, first: $first, after: $after) {\\n edges {\\n cursor\\n node {\\n id\\n anchor\\n signature\\n block {\\n id\\n height\\n }\\n data {\\n size\\n type\\n }\\n tags {\\n name\\n value\\n }\\n }\\n }\\n pageInfo {\\n hasNextPage\\n }\\n }\\n }\\n\": typeof types.GetArweaveTransactionsDocument,\n};\nconst documents: Documents = {\n \"\\n query GetTransactionTags($transactionId: ID!) {\\n tags: transaction(id: $transactionId) {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n\": types.GetTransactionTagsDocument,\n \"\\n query GetArweaveTransactions(\\n $owners: [String!]\\n $first: Int\\n $after: String\\n ) {\\n transactions(owners: $owners, first: $first, after: $after) {\\n edges {\\n cursor\\n node {\\n id\\n anchor\\n signature\\n block {\\n id\\n height\\n }\\n data {\\n size\\n type\\n }\\n tags {\\n name\\n value\\n }\\n }\\n }\\n pageInfo {\\n hasNextPage\\n }\\n }\\n }\\n\": types.GetArweaveTransactionsDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(source: \"\\n query GetTransactionTags($transactionId: ID!) {\\n tags: transaction(id: $transactionId) {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n\"): (typeof documents)[\"\\n query GetTransactionTags($transactionId: ID!) {\\n tags: transaction(id: $transactionId) {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n\"];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(source: \"\\n query GetArweaveTransactions(\\n $owners: [String!]\\n $first: Int\\n $after: String\\n ) {\\n transactions(owners: $owners, first: $first, after: $after) {\\n edges {\\n cursor\\n node {\\n id\\n anchor\\n signature\\n block {\\n id\\n height\\n }\\n data {\\n size\\n type\\n }\\n tags {\\n name\\n value\\n }\\n }\\n }\\n pageInfo {\\n hasNextPage\\n }\\n }\\n }\\n\"): (typeof documents)[\"\\n query GetArweaveTransactions(\\n $owners: [String!]\\n $first: Int\\n $after: String\\n ) {\\n transactions(owners: $owners, first: $first, after: $after) {\\n edges {\\n cursor\\n node {\\n id\\n anchor\\n signature\\n block {\\n id\\n height\\n }\\n data {\\n size\\n type\\n }\\n tags {\\n name\\n value\\n }\\n }\\n }\\n pageInfo {\\n hasNextPage\\n }\\n }\\n }\\n\"];\n\nexport function graphql(source: string) {\n return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode< infer TType, any> ? TType : never;","import { graphql } from '../graphql/gql/index.js'\nimport { TypedDocumentNode } from '@graphql-typed-document-node/core'\n\nexport const GET_TRANSACTION_TAGS = graphql(/* GraphQL */ `\n query GetTransactionTags($transactionId: ID!) {\n tags: transaction(id: $transactionId) {\n id\n tags {\n name\n value\n }\n }\n }\n`) as unknown as TypedDocumentNode<{ tags: { id: string; tags: { name: string; value: string }[] } | null }, { transactionId: string }>\n\nexport const GET_ARWEAVE_TRANSACTIONS = graphql(/* GraphQL */ `\n query GetArweaveTransactions(\n $owners: [String!]\n $first: Int\n $after: String\n ) {\n transactions(owners: $owners, first: $first, after: $after) {\n edges {\n cursor\n node {\n id\n anchor\n signature\n block {\n id\n height\n }\n data {\n size\n type\n }\n tags {\n name\n value\n }\n }\n }\n pageInfo {\n hasNextPage\n }\n }\n }\n`) as unknown as TypedDocumentNode<\n {\n transactions: {\n edges: Array<{\n cursor: string\n node: {\n id: string\n anchor: string\n signature: string\n block: { id: string; height: number }\n data: { size: number; type: string }\n tags: Array<{ name: string; value: string }>\n }\n }>\n pageInfo: { hasNextPage: boolean }\n }\n },\n { owners?: string[]; first?: number; after?: string }\n>\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type SeedRssImageRelationRef = {
2
+ storageTransactionId?: string;
3
+ arweaveUrl?: string;
4
+ seedUid?: string;
5
+ /** Gateway/raw URL suitable for image fetch; never an EAS attestation explorer page. */
6
+ mediaUrl?: string;
7
+ };
8
+ export declare const SEED_RSS_IMAGE_RELATION_FIELD_KEYS: readonly ["featureImage", "feature_image", "image", "images", "coverImage", "cover_image", "thumbnail", "thumbnail_image", "thumbnailImage"];
9
+ /**
10
+ * Resolve a Seed RSS image relation value (plain string or expanded relation object)
11
+ * using field priority: storageTransactionId → arweaveUrl/gateway URL → seedUid.
12
+ * EAS attestation explorer URLs are never returned as media.
13
+ */
14
+ export declare function resolveSeedRssImageRelationRef(value: unknown): SeedRssImageRelationRef | undefined;
15
+ /**
16
+ * Read the first configured image-relation field from a parsed RSS item record.
17
+ */
18
+ export declare function resolveSeedRssImageRelationFromItem(item: Record<string, unknown>, fieldKeys?: readonly string[]): SeedRssImageRelationRef | undefined;
19
+ //# sourceMappingURL=resolveSeedRssImageRelationRef.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveSeedRssImageRelationRef.d.ts","sourceRoot":"","sources":["../src/resolveSeedRssImageRelationRef.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,uBAAuB,GAAG;IACpC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,kCAAkC,8IAUrC,CAAA;AAoHV;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,GAAG,SAAS,CAsBlG;AAED;;GAEG;AACH,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,GAAE,SAAS,MAAM,EAAuC,GAChE,uBAAuB,GAAG,SAAS,CAOrC"}
@@ -1,7 +1,7 @@
1
1
  /** How Arweave / upload infrastructure is reached. */
2
2
  export type SeedGatewayTransportMode = 'http-gateway' | 'hyper' | 'hybrid';
3
3
  /** Which path {@link ResolvedSeedGatewayEndpoints} selected. */
4
- export type SeedGatewayActivePath = 'http' | 'hyper-sidecar' | 'hybrid-fallback-http';
4
+ export type SeedGatewayActivePath = 'http' | 'http-proxy' | 'hyper-sidecar' | 'hybrid-fallback-http';
5
5
  export interface SeedGatewayHyperConfig {
6
6
  /** Operator infrastructure identity (z32). Empty = unset. */
7
7
  gatewayHyperKey?: string;
@@ -9,7 +9,7 @@ export interface SeedGatewayHyperConfig {
9
9
  localSidecarHost?: string;
10
10
  /** Local sidecar bind port (client). Default 1984 */
11
11
  localSidecarPort?: number;
12
- /** Probe sidecar before use in hybrid mode. Default true */
12
+ /** Probe sidecar / proxy before use. Default true */
13
13
  probeSidecar?: boolean;
14
14
  }
15
15
  export interface SeedGatewayConfig {
@@ -19,6 +19,12 @@ export interface SeedGatewayConfig {
19
19
  arweaveDomain?: string;
20
20
  /** Upload API origin for publish apps (HTTP mode / hybrid fallback) */
21
21
  uploadApiBaseUrl?: string;
22
+ /**
23
+ * App-server proxy base URL for browser / web apps (Path B).
24
+ * Absolute (`https://app.example.com/api/seed-gateway`) or same-origin relative (`/api/seed-gateway`).
25
+ * Relative URLs resolve against `window.location.origin` or {@link ResolveSeedGatewayEndpointsOptions.origin}.
26
+ */
27
+ proxyBaseUrl?: string;
22
28
  hyper?: SeedGatewayHyperConfig;
23
29
  /** Shorthand for `hyper.gatewayHyperKey` in seed.config */
24
30
  gatewayHyperKey?: string;
@@ -31,7 +37,10 @@ export interface SeedGatewayConfig {
31
37
  }
32
38
  export interface ResolvedSeedGatewayEndpoints {
33
39
  mode: SeedGatewayTransportMode;
34
- /** Effective host for BaseArweaveClient (hostname:port, no scheme) */
40
+ /**
41
+ * Effective host for BaseArweaveClient (hostname:port, optionally with path prefix, no scheme).
42
+ * Path prefixes are used for app-server proxies (e.g. `app.example.com/api/seed-gateway`).
43
+ */
35
44
  arweaveHost: string;
36
45
  arweaveProtocol: 'http' | 'https';
37
46
  arweaveBaseUrl: string;
@@ -40,5 +49,7 @@ export interface ResolvedSeedGatewayEndpoints {
40
49
  activePath: SeedGatewayActivePath;
41
50
  /** Operator Hyper key when configured */
42
51
  gatewayHyperKey?: string;
52
+ /** Resolved absolute proxy base when activePath is http-proxy */
53
+ proxyBaseUrl?: string;
43
54
  }
44
55
  //# sourceMappingURL=gateway.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/types/gateway.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,MAAM,MAAM,wBAAwB,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAA;AAE1E,gEAAgE;AAChE,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,eAAe,GAAG,sBAAsB,CAAA;AAErF,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,wBAAwB,CAAA;IACpC,4FAA4F;IAC5F,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,KAAK,CAAC,EAAE,sBAAsB,CAAA;IAC9B,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,yCAAyC;IACzC,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,wBAAwB,CAAA;IAC9B,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,GAAG,OAAO,CAAA;IACjC,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,qBAAqB,CAAA;IACjC,yCAAyC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB"}
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/types/gateway.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,MAAM,MAAM,wBAAwB,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAA;AAE1E,gEAAgE;AAChE,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN,YAAY,GACZ,eAAe,GACf,sBAAsB,CAAA;AAE1B,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,qDAAqD;IACrD,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,wBAAwB,CAAA;IACpC,4FAA4F;IAC5F,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,sBAAsB,CAAA;IAC9B,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,yCAAyC;IACzC,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,wBAAwB,CAAA;IAC9B;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,GAAG,OAAO,CAAA;IACjC,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,qBAAqB,CAAA;IACjC,yCAAyC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB"}
@@ -7,6 +7,7 @@ export type SeedConfigGatewayInput = {
7
7
  transport?: SeedGatewayTransportMode;
8
8
  arweaveDomain?: string;
9
9
  uploadApiBaseUrl?: string;
10
+ proxyBaseUrl?: string;
10
11
  gatewayHyperKey?: string;
11
12
  localSidecarHost?: string;
12
13
  localSidecarPort?: number;
@@ -21,6 +22,7 @@ export type ClientGatewayContextInput = {
21
22
  gatewayHyperKey?: string;
22
23
  gatewaySidecarHost?: string;
23
24
  gatewaySidecarPort?: number;
25
+ gatewayProxyBaseUrl?: string;
24
26
  };
25
27
  export type { SeedGatewayConfig };
26
28
  //# sourceMappingURL=seedConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"seedConfig.d.ts","sourceRoot":"","sources":["../../src/types/seedConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAEvG,mFAAmF;AACnF,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,wBAAwB,CAAA;QACpC,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,eAAe,CAAC,EAAE,MAAM,CAAA;QACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,KAAK,CAAC,EAAE,sBAAsB,CAAA;KAC/B,CAAA;CACF,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,wBAAwB,CAAA;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED,YAAY,EAAE,iBAAiB,EAAE,CAAA"}
1
+ {"version":3,"file":"seedConfig.d.ts","sourceRoot":"","sources":["../../src/types/seedConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAEvG,mFAAmF;AACnF,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,wBAAwB,CAAA;QACpC,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,eAAe,CAAC,EAAE,MAAM,CAAA;QACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,KAAK,CAAC,EAAE,sBAAsB,CAAA;KAC/B,CAAA;CACF,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,wBAAwB,CAAA;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED,YAAY,EAAE,iBAAiB,EAAE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seedprotocol/arweave",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "description": "Arweave gateway client and helpers for Seed Protocol",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",