{"record":{"id":"7c548686349f4622","repo":"jackwener/OpenCLI","slug":"argument","errorCode":"ARGUMENT","errorMessage":"Unknown Bloomberg feed: ${name}","messagePattern":"Unknown Bloomberg feed: (.+?)","errorType":"error_code","errorClass":"CliError","httpStatus":null,"severity":"error","filePath":"clis/bloomberg/utils.js","lineNumber":24,"sourceCode":"    industries: 'https://feeds.bloomberg.com/industries/news.rss',\n    tech: 'https://feeds.bloomberg.com/technology/news.rss',\n    politics: 'https://feeds.bloomberg.com/politics/news.rss',\n    opinions: 'https://feeds.bloomberg.com/bview/news.rss',\n    green: 'https://feeds.bloomberg.com/green/news.rss',\n    crypto: 'https://feeds.bloomberg.com/crypto/news.rss',\n    pursuits: 'https://feeds.bloomberg.com/pursuits/news.rss',\n};\n// Note: the Businessweek RSS feed (feeds.bloomberg.com/businessweek/news.rss) is now served\n// empty by Bloomberg, so the `businessweek` command reads the section page instead (see\n// businessweek.js). Other sections still publish working RSS feeds.\nconst DEFAULT_USER_AGENT = 'Mozilla/5.0 (compatible; opencli)';\n// Bloomberg's edge occasionally serves a transient empty/non-OK RSS response under load; a\n// couple of quick retries turn those intermittent misses into a successful fetch instead of a\n// hard NOT_FOUND. A feed that is genuinely empty still surfaces NOT_FOUND after the retries.\nexport async function fetchBloombergFeed(name, limit = 1) {\n    const feedUrl = BLOOMBERG_FEEDS[name];\n    if (!feedUrl) {\n        throw new CliError('ARGUMENT', `Unknown Bloomberg feed: ${name}`);\n    }\n    let lastError;\n    for (let attempt = 0; attempt < 3; attempt += 1) {\n        if (attempt > 0) {\n            await new Promise((resolve) => setTimeout(resolve, 400 * attempt));\n        }\n        const resp = await fetch(feedUrl, {\n            headers: { 'User-Agent': DEFAULT_USER_AGENT },\n        });\n        if (!resp.ok) {\n            lastError = new CliError('FETCH_ERROR', `Bloomberg RSS HTTP ${resp.status}`, 'Bloomberg may be temporarily unavailable; try again later.');\n            continue;\n        }\n        const xml = await resp.text();\n        const items = parseBloombergRss(xml);\n        if (items.length) {\n            const count = Math.max(1, Math.min(Number(limit) || 1, 20));\n            return items.slice(0, count);","sourceCodeStart":6,"sourceCodeEnd":42,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/bloomberg/utils.js#L6-L42","documentation":"Thrown by fetchBloombergFeed when the feed name is not a key in BLOOMBERG_FEEDS. This is an immediate argument validation error (ARGUMENT) raised before any network request. It prevents wasted fetches against an unsupported feed identifier.","triggerScenarios":"Calling fetchBloombergFeed(name) with a typo, wrong casing, or a feed name not defined in BLOOMBERG_FEEDS.","commonSituations":"Hand-editing feed names in config; renaming feeds in an upgraded library version; passing user input without whitelisting against the known feed keys.","solutions":["Check the feed name against the BLOOMBERG_FEEDS keys for exact spelling/casing","Update the library version in case feed names changed","Whitelist user-supplied feed names before calling fetchBloombergFeed"],"exampleFix":"// before\nawait fetchBloombergFeed('markets-tech');\n// after\nawait fetchBloombergFeed('technology'); // exact key from BLOOMBERG_FEEDS","handlingStrategy":"validation","validationCode":"import { BLOOMBERG_FEEDS } from './clis/bloomberg/utils.js';\nfunction isValidFeed(name) {\n  return typeof name === 'string' && Object.prototype.hasOwnProperty.call(BLOOMBERG_FEEDS, name);\n}\nif (!isValidFeed(name)) throw new Error(`Unknown feed: ${name}`);","typeGuard":"null","tryCatchPattern":"try {\n  await fetchBloombergFeed(name);\n} catch (e) {\n  if (e.code === 'ARGUMENT' && /Unknown Bloomberg feed/.test(e.message)) {\n    // correct the feed name or list available feeds\n  }\n}","preventionTips":["Whitelist feed names against BLOOMBERG_FEEDS keys","Normalize user input casing before lookup","Pin library versions and re-check feed keys after upgrades"],"tags":["argument","validation","bloomberg"],"backgroundTag":"invalid-argument-value","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}