{"record":{"id":"dd5e17e0ee0f515d","repo":"oven-sh/bun","slug":"no-file-entry-in-url","errorCode":null,"errorMessage":"no file entry in ${url}","messagePattern":"no file entry in (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"scripts/binary-size.ts","lineNumber":354,"sourceCode":"      break;\n    }\n  }\n  if (eocd < 0) throw new Error(`no zip EOCD in ${url}`);\n\n  let p = dv.getUint32(eocd + 16, true) - (total - tail);\n  if (p < 0) throw new Error(`zip central directory not within tail for ${url}`);\n\n  let size = 0;\n  while (p + 46 <= eocd && dv.getUint32(p, true) === 0x02014b50) {\n    const uncompressed = dv.getUint32(p + 24, true);\n    const nameLen = dv.getUint16(p + 28, true);\n    const name = new TextDecoder().decode(buf.subarray(p + 46, p + 46 + nameLen));\n    // The binary is the only non-directory entry; take the largest in case the\n    // zip ever grows extra metadata files.\n    if (!name.endsWith(\"/\") && uncompressed > size) size = uncompressed;\n    p += 46 + nameLen + dv.getUint16(p + 30, true) + dv.getUint16(p + 32, true);\n  }\n  if (size === 0) throw new Error(`no file entry in ${url}`);\n  return size;\n}\n","sourceCodeStart":336,"sourceCodeEnd":357,"githubUrl":"https://github.com/oven-sh/bun/blob/8c5296ac459e8252d3cd702f3fbcbb0c249d95d5/scripts/binary-size.ts#L336-L357","documentation":"zipBinarySize() walked the central directory but every entry was either a directory (name ends with /) or reported uncompressed size 0, leaving size === 0. The zip contains no readable file entry for the binary-size probe.","triggerScenarios":"A zip whose only non-directory entries report 0 uncompressed size (malformed or partial central directory, genuinely empty artifact), or the entry walk terminating immediately because p + 46 exceeds the EOCD offset due to misalignment.","commonSituations":"Corrupted release asset uploads; zips produced by unusual packers whose central directory the minimal parser misreads; empty placeholder assets during publish.","solutions":["Download the zip and inspect with unzip -l — if it lists the binary, the parser needs adjusting for that layout","If the asset is genuinely empty or corrupt, re-publish the release asset","Check the walk condition (p + 46 <= eocd) is not ending early because of extra fields"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { return await zipBinarySize(url); }\ncatch (e) {\n  if (/no file entry/.test(e.message)) {\n    // verify with a real unzipper locally before declaring the asset corrupt\n    return sizeFromFullZip(new Uint8Array(await (await fetch(url)).arrayBuffer()));\n  }\n  throw e;\n}","preventionTips":["Cross-check one asset with a real unzipper whenever release zip layout changes","Treat parse failures as suspect-data signals, not crashes"],"tags":["zip","parsing","binary-size","data-corruption"],"backgroundTag":null,"analyzedSha":"8c5296ac459e8252d3cd702f3fbcbb0c249d95d5","analyzedAt":"2026-08-16T08:01:58.794Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}