{"version":3,"sources":["../src/providers/expoUtils.ts","../src/providers/expoArk.ts","../src/providers/expoIndexer.ts"],"names":["baseFetch","RestArkProvider","DEFAULT_ARKADE_SERVER_URL","ARKADE_VERSION_HEADERS","isFetchTimeoutError","RestIndexerProvider","convertVtxo"],"mappings":"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","file":"chunk-LASRYLMQ.cjs","sourcesContent":["import { baseFetch, fetch } from \"../utils/fetch\";\n\n/**\n * Dynamically imports expo/fetch, falling back to {@link baseFetch}.\n *\n * Adds no headers of its own: both Expo providers share this function but reach\n * different origins, so each passes its own per request.\n *\n * @returns A fetch function suitable for SSE streaming\n */\nexport async function getExpoFetch(options?: { requireExpo?: boolean }): Promise<typeof fetch> {\n    const requireExpo = options?.requireExpo ?? false;\n\n    try {\n        const expoFetchModule = await import(\"expo/fetch\");\n        console.debug(\"Using expo/fetch for streaming\");\n        return expoFetchModule.fetch as unknown as typeof fetch;\n    } catch (error) {\n        if (requireExpo) {\n            throw new Error(\n                \"expo/fetch is unavailable in this environment. \" +\n                    \"Please ensure expo/fetch is installed and properly configured.\",\n            );\n        }\n\n        console.warn(\n            \"Using standard fetch instead of expo/fetch. \" +\n                \"Streaming may not be fully supported in some environments.\",\n            error,\n        );\n        return baseFetch;\n    }\n}\n\n/**\n * Generic SSE stream processor using fetch API with ReadableStream.\n * Handles SSE format parsing, buffer management, and abort signals.\n *\n * @param url - The SSE endpoint URL\n * @param abortSignal - Signal to abort the stream\n * @param fetchFn - Fetch function to use (defaults to standard fetch)\n * @param headers - Additional headers to send\n * @param parseData - Function to parse and yield data from SSE events\n */\nexport async function* sseStreamIterator<T>(\n    url: string,\n    abortSignal: AbortSignal,\n    fetchFn: typeof fetch,\n    headers: Record<string, string>,\n    parseData: (data: any) => T | null,\n): AsyncGenerator<T, void, unknown> {\n    const fetchController = new AbortController();\n    const cleanup = () => fetchController.abort();\n    abortSignal?.addEventListener(\"abort\", cleanup, { once: true });\n\n    try {\n        const response = await fetchFn(url, {\n            headers: {\n                Accept: \"text/event-stream\",\n                ...headers,\n            },\n            // Required, not just for cancellation: `getExpoFetch` falls back to\n            // `baseFetch`, which bounds any read that brings no signal of its\n            // own. Drop this and the stream is truncated at READ_TIMEOUT_MS.\n            signal: fetchController.signal,\n        });\n\n        if (!response.ok) {\n            throw new Error(`Unexpected status ${response.status} when fetching SSE stream`);\n        }\n\n        if (!response.body) {\n            throw new Error(\"Response body is null\");\n        }\n\n        const reader = response.body.getReader();\n        const decoder = new TextDecoder();\n        let buffer = \"\";\n\n        while (!abortSignal?.aborted) {\n            const { done, value } = await reader.read();\n            if (done) {\n                break;\n            }\n\n            buffer += decoder.decode(value, { stream: true });\n            const lines = buffer.split(\"\\n\");\n\n            for (let i = 0; i < lines.length - 1; i++) {\n                const line = lines[i].trim();\n                if (!line) continue;\n\n                if (line.startsWith(\"data:\")) {\n                    const jsonStr = line.substring(5).trim();\n                    if (!jsonStr) continue;\n\n                    try {\n                        const data = JSON.parse(jsonStr);\n                        const parsed = parseData(data);\n                        if (parsed !== null) {\n                            yield parsed;\n                        }\n                    } catch (parseError) {\n                        console.error(\"Failed to parse SSE data:\", parseError);\n                        throw parseError;\n                    }\n                }\n            }\n\n            buffer = lines[lines.length - 1];\n        }\n    } finally {\n        abortSignal?.removeEventListener(\"abort\", cleanup);\n    }\n}\n","import { DEFAULT_ARKADE_SERVER_URL } from \"../networks\";\nimport { RestArkProvider, SettlementEvent, TxNotificationEvent, isFetchTimeoutError } from \"./ark\";\nimport { getExpoFetch, sseStreamIterator } from \"./expoUtils\";\nimport { ARKADE_VERSION_HEADERS } from \"../utils/fetch\";\n\n/**\n * Expo-compatible Arkade provider implementation using expo/fetch for SSE support.\n * This provider works specifically in React Native/Expo environments where\n * standard EventSource is not available but expo/fetch provides SSE capabilities.\n *\n * @example\n * ```typescript\n * import { ExpoArkProvider } from '@arkade-os/sdk/providers/expo';\n *\n * const provider = new ExpoArkProvider('https://arkade.computer');\n * const info = await provider.getInfo();\n * ```\n */\nexport class ExpoArkProvider extends RestArkProvider {\n    constructor(serverUrl: string = DEFAULT_ARKADE_SERVER_URL) {\n        super(serverUrl);\n    }\n\n    override async *getEventStream(\n        signal: AbortSignal,\n        topics: string[],\n    ): AsyncIterableIterator<SettlementEvent> {\n        const expoFetch = await getExpoFetch();\n        const url = `${this.serverUrl}/v1/batch/events`;\n        const queryParams =\n            topics.length > 0\n                ? `?${topics.map((topic) => `topics=${encodeURIComponent(topic)}`).join(\"&\")}`\n                : \"\";\n\n        while (!signal?.aborted) {\n            try {\n                yield* sseStreamIterator(\n                    url + queryParams,\n                    signal,\n                    expoFetch,\n                    ARKADE_VERSION_HEADERS,\n                    (data) => {\n                        // Handle different response structures\n                        // v8 mesh API might wrap in {result: ...} or send directly\n                        const eventData = data.result || data;\n\n                        // Skip heartbeat messages\n                        if (eventData.heartbeat !== undefined) {\n                            return null;\n                        }\n\n                        return this.parseSettlementEvent(eventData);\n                    },\n                );\n            } catch (error) {\n                if (error instanceof Error && error.name === \"AbortError\") {\n                    break;\n                }\n\n                // ignore timeout errors, they're expected when the server is not sending anything for 5 min\n                // these timeouts are set by expo/fetch function\n                if (isFetchTimeoutError(error)) {\n                    console.debug(\"Timeout error ignored\");\n                    continue;\n                }\n\n                console.error(\"Event stream error:\", error);\n                throw error;\n            }\n        }\n    }\n\n    override async *getTransactionsStream(\n        signal: AbortSignal,\n    ): AsyncIterableIterator<TxNotificationEvent> {\n        const expoFetch = await getExpoFetch();\n        const url = `${this.serverUrl}/v1/txs`;\n\n        while (!signal?.aborted) {\n            try {\n                yield* sseStreamIterator(url, signal, expoFetch, ARKADE_VERSION_HEADERS, (data) => {\n                    return this.parseTransactionNotification(data.result);\n                });\n            } catch (error) {\n                if (error instanceof Error && error.name === \"AbortError\") {\n                    break;\n                }\n\n                // ignore timeout errors, they're expected when the server is not sending anything for 5 min\n                // these timeouts are set by expo/fetch function\n                if (isFetchTimeoutError(error)) {\n                    console.debug(\"Timeout error ignored\");\n                    continue;\n                }\n\n                console.error(\"Transaction stream error:\", error);\n                throw error;\n            }\n        }\n    }\n}\n","import { RestIndexerProvider, SubscriptionResponse } from \"./indexer\";\nimport { isFetchTimeoutError } from \"./ark\";\nimport { convertVtxo } from \"../wallet/vtxo\";\nimport { getExpoFetch, sseStreamIterator } from \"./expoUtils\";\nimport { DEFAULT_ARKADE_SERVER_URL } from \"../networks\";\n\n/**\n * Expo-compatible Indexer provider implementation using expo/fetch for streaming support.\n * This provider works specifically in React Native/Expo environments where\n * standard fetch streaming may not work properly but expo/fetch provides streaming capabilities.\n *\n * @example\n * ```typescript\n * import { ExpoIndexerProvider } from '@arkade-os/sdk/adapters/expo';\n *\n * const provider = new ExpoIndexerProvider('https://indexer.example.com');\n * const vtxos = await provider.getVtxos({ scripts: ['script1'] });\n * ```\n */\nexport class ExpoIndexerProvider extends RestIndexerProvider {\n    constructor(serverUrl: string = DEFAULT_ARKADE_SERVER_URL) {\n        super(serverUrl);\n    }\n\n    override async *getSubscription(\n        subscriptionId: string,\n        abortSignal: AbortSignal,\n    ): AsyncIterableIterator<SubscriptionResponse> {\n        // Detect if we're running in React Native/Expo environment\n        const isReactNative =\n            typeof navigator !== \"undefined\" && navigator.product === \"ReactNative\";\n\n        const expoFetch = await getExpoFetch().catch((error) => {\n            // In React Native/Expo, expo/fetch is required for proper streaming support\n            if (isReactNative) {\n                throw new Error(\n                    \"expo/fetch is unavailable in React Native environment. \" +\n                        \"Please ensure expo/fetch is installed and properly configured. \" +\n                        \"Streaming support may not work with standard fetch in React Native.\",\n                );\n            }\n            throw error;\n        });\n\n        const url = `${this.serverUrl}/v1/indexer/script/subscription/${subscriptionId}`;\n\n        while (!abortSignal.aborted) {\n            try {\n                yield* sseStreamIterator(\n                    url,\n                    abortSignal,\n                    expoFetch,\n                    { \"Content-Type\": \"application/json\" },\n                    (data): SubscriptionResponse | null => {\n                        // Handle new v8 proto format with heartbeat or event\n                        if (data.heartbeat !== undefined) {\n                            // Skip heartbeat messages\n                            return null;\n                        }\n                        // Process event messages\n                        if (data.event) {\n                            return {\n                                txid: data.event.txid,\n                                scripts: data.event.scripts || [],\n                                newVtxos: (data.event.newVtxos || []).map(convertVtxo),\n                                spentVtxos: (data.event.spentVtxos || []).map(convertVtxo),\n                                sweptVtxos: (data.event.sweptVtxos || []).map(convertVtxo),\n                                tx: data.event.tx,\n                                checkpointTxs: data.event.checkpointTxs,\n                            };\n                        }\n                        return null;\n                    },\n                );\n            } catch (error) {\n                if (error instanceof Error && error.name === \"AbortError\") {\n                    break;\n                }\n\n                // ignore timeout errors, they're expected when the server is not sending anything for 5 min\n                // these timeouts are set by expo/fetch function\n                if (isFetchTimeoutError(error)) {\n                    console.debug(\"Timeout error ignored\");\n                    continue;\n                }\n\n                console.error(\"Subscription error:\", error);\n                throw error;\n            }\n        }\n    }\n}\n"]}