fix: pre-fetch bincio wheel via RN networking to avoid ATS blocking HTTP in WKWebView
WKWebView blocks HTTP requests (ATS) even when NSAllowsLocalNetworking is set for the app's own networking — so fetch(http://192.168.x.x/api/wheel/download) inside the WebView always fails with 'Load failed' on iOS. - extractActivity.ts: rename wheelUrl param to wheelBase64; WebView now receives the wheel as pre-fetched base64 bytes rather than a URL to fetch itself - PyodideWebView.tsx: decode wheelBase64 → Uint8Array → Blob → blob URL for micropip.install; fix baseUrl '' → 'https://localhost' (null origin blocks fetch on iOS) - import.tsx: add fetchWheelBase64() that resolves the wheel URL via /api/wheel/version then fetches with native networking (HTTP works); caches result in memory so repeated imports in one session don't re-download
This commit is contained in:
@@ -54,10 +54,12 @@ export function handleWebViewMessage(e: WebViewMessageEvent): void {
|
||||
}
|
||||
}
|
||||
|
||||
// wheelBase64 is the bincio .whl file pre-fetched by the React Native side
|
||||
// (native networking supports HTTP on local network; WKWebView does not).
|
||||
export function extractFile(
|
||||
filename: string,
|
||||
base64: string,
|
||||
wheelUrl: string,
|
||||
wheelBase64: string,
|
||||
onStatus: (msg: string) => void = () => {},
|
||||
): Promise<ExtractionResult> {
|
||||
if (isExtracting) return Promise.reject(new Error('Another extraction is already in progress'));
|
||||
@@ -67,7 +69,7 @@ export function extractFile(
|
||||
|
||||
isExtracting = true;
|
||||
const reqId = String(++reqCounter);
|
||||
const args = JSON.stringify({ reqId, filename, base64, wheelUrl });
|
||||
const args = JSON.stringify({ reqId, filename, base64, wheelBase64 });
|
||||
|
||||
return new Promise<ExtractionResult>((resolve, reject) => {
|
||||
pending.set(reqId, {
|
||||
|
||||
Reference in New Issue
Block a user