{"record":{"id":"31f6e9fc40219451","repo":"jackwener/OpenCLI","slug":"midjourney-browser-context-media-fetch-failed-e","errorCode":null,"errorMessage":"Midjourney browser-context media fetch failed: ${errorMessage(error)}","messagePattern":"Midjourney browser-context media fetch failed: (.+?)","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/midjourney/utils.js","lineNumber":554,"sourceCode":"    let payload;\n    try {\n      payload = unwrapEvaluateResult(await page.evaluate(async (mediaUrl, key) => {\n        // CDN is public but Cloudflare-protected. Browser-origin fetch succeeds\n        // with default same-origin credential mode; forcing cross-origin cookies\n        // turns it into a credentialed CORS request and Midjourney rejects it.\n        const response = await fetch(mediaUrl);\n        if (!response.ok) return { ok: false, status: response.status, type: response.headers.get('content-type') || '' };\n        const bytes = new Uint8Array(await response.arrayBuffer());\n        window[key] = bytes;\n        return {\n          ok: true,\n          status: response.status,\n          type: response.headers.get('content-type') || '',\n          size: bytes.length,\n        };\n      }, url, transferKey));\n    } catch (error) {\n      throw new CommandExecutionError(`Midjourney browser-context media fetch failed: ${errorMessage(error)}`);\n    }\n    if (!payload || typeof payload !== 'object' || !payload.ok) {\n      throw new CommandExecutionError(`Midjourney media download failed: HTTP ${payload?.status ?? 0} from ${url}`);\n    }\n    if (!String(payload.type || '').startsWith(expectedMimePrefix)) {\n      throw new CommandExecutionError(`Midjourney media download returned unexpected content type \"${payload.type || 'unknown'}\"`);\n    }\n    const size = Number(payload.size);\n    if (!Number.isInteger(size) || size <= 0) {\n      throw new CommandExecutionError(`Midjourney media download returned an empty file from ${url}`);\n    }\n\n    // Returning a complete base64 file in one Browser Bridge response can\n    // exceed the daemon message limit. Pull it out in bounded chunks instead.\n    const parts = [];\n    const chunkSize = 96 * 1024;\n    for (let offset = 0; offset < size; offset += chunkSize) {\n      const base64 = unwrapEvaluateResult(await page.evaluate((key, start, length) => {","sourceCodeStart":536,"sourceCodeEnd":572,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/midjourney/utils.js#L536-L572","documentation":"This error wraps any failure that occurs while executing an in-page fetch inside the Midjourney browser context (page.evaluate) to download media into a window buffer. If the browser-side fetch itself throws (navigation, execution context destroyed, page closed, or fetch rejection), the raw error is rethrown as a CommandExecutionError with a normalized message via errorMessage(error).","triggerScenarios":"The browser page navigates away or its execution context is destroyed mid-fetch; the in-page fetch to the CDN URL throws (network error, CORS/blocked request, invalid URL); the browser bridge page is closed before the transfer completes.","commonSituations":"Fetching media right after the job page was closed; CDN URLs that have expired; proxy or network interruptions inside the headless browser; automation races where the page is reused concurrently.","solutions":["Retry the command; transient browser/network failures usually resolve.","Verify the media URL is still valid (CDN links can expire).","Ensure the browser page/browser bridge stays open for the duration of the download.","Check proxy/firewall settings affecting the headless browser."],"exampleFix":"// before\ndownloadMedia(page, expiredUrl);\n// after\nconst freshUrl = await resolveFreshMediaUrl(jobId);\ndownloadMedia(page, freshUrl);","handlingStrategy":"try-catch","validationCode":"if (page.isClosed()) throw new Error('Browser page closed; reopen before downloading');","typeGuard":null,"tryCatchPattern":"try {\n  await downloadMedia(page, url);\n} catch (err) {\n  if (/browser-context media fetch failed/.test(err.message)) {\n    page = await newPage(browser); // reopen page and retry once\n    await downloadMedia(page, url);\n  } else throw err;\n}","preventionTips":["Keep the browser page open and idle during the whole download.","Avoid navigating the page while transfers are in flight.","Re-resolve CDN URLs before downloading (they expire).","Download sequentially on a dedicated page to avoid races."],"tags":["network","browser","fetch","midjourney"],"backgroundTag":"browser-context-fetch-failed","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}