@audd/sdk 1.5.7 → 1.5.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -2
- package/dist/index.cjs +11 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +23 -3
- package/dist/index.d.ts +23 -3
- package/dist/index.js +11 -9
- package/dist/index.js.map +1 -1
- package/dist/longpoll.cjs +1 -1
- package/dist/longpoll.cjs.map +1 -1
- package/dist/longpoll.js +1 -1
- package/dist/longpoll.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/errors.ts","../src/userAgent.ts","../src/http.ts","../src/models.ts","../src/retry.ts","../src/source.ts","../src/helpers.ts","../src/longpollCore.ts","../src/streams.ts","../src/customCatalog.ts","../src/advanced.ts","../src/client.ts"],"names":["fsPromises","path","decodeSuccess","runRetried","API_BASE","HTTP_CLIENT_ERROR_FLOOR"],"mappings":"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","file":"index.js","sourcesContent":["export const VERSION = \"1.4.6\";\n","/** Exception hierarchy for AudD API errors. */\n\nexport interface AudDApiErrorFields {\n errorCode: number;\n message: string;\n httpStatus: number;\n requestId: string | null;\n requestedParams: Record<string, unknown>;\n requestMethod: string | null;\n brandedMessage: string | null;\n rawResponse: unknown;\n}\n\nexport type AudDApiErrorInit = Partial<AudDApiErrorFields> &\n Pick<AudDApiErrorFields, \"errorCode\" | \"message\" | \"httpStatus\">;\n\n/** Base for everything thrown by this SDK. */\nexport class AudDError extends Error {\n override name = \"AudDError\";\n}\n\n/** Server returned `status: error`. Carries the AudD error code + the full echo. */\nexport class AudDAPIError extends AudDError {\n override name = \"AudDAPIError\";\n errorCode: number;\n httpStatus: number;\n requestId: string | null;\n requestedParams: Record<string, unknown>;\n requestMethod: string | null;\n brandedMessage: string | null;\n rawResponse: unknown;\n /** Original `error_message` from the server. (`Error.message` may be overridden by subclasses.) */\n serverMessage: string;\n\n constructor(init: AudDApiErrorInit) {\n super(`[#${init.errorCode}] ${init.message}`);\n this.errorCode = init.errorCode;\n this.serverMessage = init.message;\n this.httpStatus = init.httpStatus;\n this.requestId = init.requestId ?? null;\n this.requestedParams = init.requestedParams ?? {};\n this.requestMethod = init.requestMethod ?? null;\n this.brandedMessage = init.brandedMessage ?? null;\n this.rawResponse = init.rawResponse ?? null;\n }\n}\n\nexport class AudDAuthenticationError extends AudDAPIError {\n override name = \"AudDAuthenticationError\";\n}\nexport class AudDQuotaError extends AudDAPIError {\n override name = \"AudDQuotaError\";\n}\nexport class AudDSubscriptionError extends AudDAPIError {\n override name = \"AudDSubscriptionError\";\n}\nexport class AudDCustomCatalogAccessError extends AudDSubscriptionError {\n override name = \"AudDCustomCatalogAccessError\";\n}\nexport class AudDInvalidRequestError extends AudDAPIError {\n override name = \"AudDInvalidRequestError\";\n}\nexport class AudDInvalidAudioError extends AudDAPIError {\n override name = \"AudDInvalidAudioError\";\n}\nexport class AudDRateLimitError extends AudDAPIError {\n override name = \"AudDRateLimitError\";\n}\nexport class AudDStreamLimitError extends AudDAPIError {\n override name = \"AudDStreamLimitError\";\n}\nexport class AudDNotReleasedError extends AudDAPIError {\n override name = \"AudDNotReleasedError\";\n}\nexport class AudDBlockedError extends AudDAPIError {\n override name = \"AudDBlockedError\";\n}\nexport class AudDNeedsUpdateError extends AudDAPIError {\n override name = \"AudDNeedsUpdateError\";\n}\nexport class AudDServerError extends AudDAPIError {\n override name = \"AudDServerError\";\n}\n\nexport class AudDConnectionError extends AudDError {\n override name = \"AudDConnectionError\";\n override cause?: unknown;\n constructor(message: string, cause?: unknown) {\n super(message);\n this.cause = cause;\n }\n}\n\nexport class AudDSerializationError extends AudDError {\n override name = \"AudDSerializationError\";\n rawText: string;\n constructor(message: string, rawText = \"\") {\n super(message);\n this.rawText = rawText;\n }\n}\n\nexport type AudDAPIErrorCtor = new (init: AudDApiErrorInit) => AudDAPIError;\n\nconst CODE_MAP: Record<number, AudDAPIErrorCtor> = {\n 900: AudDAuthenticationError,\n 901: AudDAuthenticationError,\n 903: AudDAuthenticationError,\n 902: AudDQuotaError,\n 904: AudDSubscriptionError,\n 905: AudDSubscriptionError,\n 50: AudDInvalidRequestError,\n 51: AudDInvalidRequestError,\n 600: AudDInvalidRequestError,\n 601: AudDInvalidRequestError,\n 602: AudDInvalidRequestError,\n 700: AudDInvalidRequestError,\n 701: AudDInvalidRequestError,\n 702: AudDInvalidRequestError,\n 906: AudDInvalidRequestError,\n 300: AudDInvalidAudioError,\n 400: AudDInvalidAudioError,\n 500: AudDInvalidAudioError,\n 610: AudDStreamLimitError,\n 611: AudDRateLimitError,\n 907: AudDNotReleasedError,\n 19: AudDBlockedError,\n 31337: AudDBlockedError,\n 20: AudDNeedsUpdateError,\n 100: AudDServerError,\n 1000: AudDServerError,\n};\n\nexport function errorClassForCode(code: number): AudDAPIErrorCtor {\n return CODE_MAP[code] ?? AudDServerError;\n}\n\nfunction brandedMessageOf(result: unknown): string | null {\n if (typeof result !== \"object\" || result === null) return null;\n const r = result as { artist?: unknown; title?: unknown };\n const parts: string[] = [];\n if (typeof r.artist === \"string\" && r.artist.length > 0) parts.push(r.artist);\n if (typeof r.title === \"string\" && r.title.length > 0) parts.push(r.title);\n return parts.length === 0 ? null : parts.join(\" — \");\n}\n\nexport interface ServerErrorBody {\n error?: { error_code?: number | undefined; error_message?: string | undefined } | undefined;\n result?: unknown;\n request_params?: Record<string, unknown> | undefined;\n requested_params?: Record<string, unknown> | undefined;\n request_api_method?: string | undefined;\n}\n\nexport interface RaiseFromErrorOpts {\n httpStatus: number;\n requestId: string | null;\n customCatalogContext?: boolean;\n}\n\nconst CUSTOM_CATALOG_PREFIX =\n \"Adding songs to your custom catalog requires enterprise access that isn't enabled on your account.\\n\\n\" +\n \"Note: the custom-catalog endpoint is for adding songs to your private fingerprint database, not for music recognition. \" +\n \"If you intended to identify music, use recognize(...) (or recognizeEnterprise(...) for files longer than 25 seconds) instead.\\n\\n\" +\n \"To request custom-catalog access, contact api@audd.io.\\n\\n\";\n\nexport function raiseFromErrorResponse(body: ServerErrorBody, opts: RaiseFromErrorOpts): never {\n const code = body.error?.error_code ?? 0;\n const message = body.error?.error_message ?? \"\";\n const requestedParams = body.request_params ?? body.requested_params ?? {};\n const requestMethod = body.request_api_method ?? null;\n const branded = brandedMessageOf(body.result);\n\n const fields: AudDApiErrorFields = {\n errorCode: code,\n message,\n httpStatus: opts.httpStatus,\n requestId: opts.requestId,\n requestedParams,\n requestMethod,\n brandedMessage: branded,\n rawResponse: body,\n };\n\n const Cls = errorClassForCode(code);\n if (opts.customCatalogContext === true && Cls === AudDSubscriptionError) {\n const overridden = `${CUSTOM_CATALOG_PREFIX}[Server message: ${message}]`;\n throw new AudDCustomCatalogAccessError({ ...fields, message: overridden });\n }\n throw new Cls(fields);\n}\n","import { VERSION } from \"./version.js\";\n\nexport function userAgent(): string {\n const node =\n typeof process !== \"undefined\" && process.version\n ? process.version.replace(/^v/, \"\")\n : \"unknown\";\n const platform =\n typeof process !== \"undefined\" && process.platform ? process.platform : \"browser\";\n return `audd-node/${VERSION} node/${node} (${platform})`;\n}\n","import { userAgent } from \"./userAgent.js\";\n\nexport interface HttpResponse {\n jsonBody: unknown;\n httpStatus: number;\n requestId: string | null;\n rawText: string;\n}\n\nexport type FetchLike = typeof globalThis.fetch;\n\nexport interface HttpClientOptions {\n apiToken: string;\n fetch?: FetchLike;\n /** Per-call timeout in ms. Defaults: 60_000 standard, 3_600_000 enterprise. */\n defaultTimeoutMs?: number;\n}\n\nexport const STANDARD_TIMEOUT_MS = 60_000;\nexport const ENTERPRISE_TIMEOUT_MS = 3_600_000;\n\n/**\n * Form-data field value. Strings go through directly; Blob carries binary\n * payloads with a filename when constructed via `new File()`.\n */\nexport type FormFieldValue = string | Blob | undefined;\n\nexport class HttpClient {\n private apiToken: string;\n private readonly fetchImpl: FetchLike;\n private readonly defaultTimeoutMs: number;\n\n constructor(opts: HttpClientOptions) {\n this.apiToken = opts.apiToken;\n this.fetchImpl = opts.fetch ?? ((globalThis.fetch as FetchLike).bind(globalThis));\n this.defaultTimeoutMs = opts.defaultTimeoutMs ?? STANDARD_TIMEOUT_MS;\n }\n\n /** Atomically swap the token used for subsequent requests. */\n setApiToken(newToken: string): void {\n this.apiToken = newToken;\n }\n\n async postForm(\n url: string,\n fields: Record<string, FormFieldValue>,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n ): Promise<HttpResponse> {\n const form = new FormData();\n form.set(\"api_token\", this.apiToken);\n for (const [k, v] of Object.entries(fields)) {\n if (v === undefined) continue;\n form.set(k, v);\n }\n return this.send(url, { method: \"POST\", body: form }, opts);\n }\n\n async get(\n url: string,\n params: Record<string, string | undefined>,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n ): Promise<HttpResponse> {\n const u = new URL(url);\n if (!u.searchParams.has(\"api_token\")) u.searchParams.set(\"api_token\", this.apiToken);\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined) continue;\n u.searchParams.set(k, v);\n }\n return this.send(u.toString(), { method: \"GET\" }, opts);\n }\n\n private async send(\n url: string,\n init: RequestInit,\n { timeoutMs, signal: userSignal }: { timeoutMs?: number; signal?: AbortSignal },\n ): Promise<HttpResponse> {\n const controller = new AbortController();\n const timer = setTimeout(() => {\n controller.abort();\n }, timeoutMs ?? this.defaultTimeoutMs);\n // If user passed a signal, abort our controller when theirs fires.\n const userAbortHandler = (): void => controller.abort();\n if (userSignal !== undefined) {\n if (userSignal.aborted) {\n controller.abort();\n } else {\n userSignal.addEventListener(\"abort\", userAbortHandler, { once: true });\n }\n }\n try {\n const headers = new Headers(init.headers);\n headers.set(\"User-Agent\", userAgent());\n const response = await this.fetchImpl(url, {\n ...init,\n headers,\n signal: controller.signal,\n });\n const text = await response.text();\n let json: unknown = null;\n if (text !== \"\") {\n try {\n json = JSON.parse(text);\n } catch {\n json = null;\n }\n }\n return {\n jsonBody: json,\n httpStatus: response.status,\n requestId: response.headers.get(\"x-request-id\"),\n rawText: text,\n };\n } finally {\n clearTimeout(timer);\n if (userSignal !== undefined) {\n userSignal.removeEventListener(\"abort\", userAbortHandler);\n }\n }\n }\n}\n","/**\n * Typed models. Forward-compatible: each model captures unknown keys into\n * `extras`, mirroring audd-python's Pydantic `extra=\"allow\"` pattern.\n */\n\nfunction pickExtras(\n raw: Record<string, unknown>,\n knownKeys: ReadonlyArray<string>,\n): Record<string, unknown> {\n const known = new Set(knownKeys);\n const extras: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (!known.has(k)) extras[k] = v;\n }\n return extras;\n}\n\nfunction asObject(raw: unknown): Record<string, unknown> | undefined {\n if (typeof raw === \"object\" && raw !== null && !Array.isArray(raw)) {\n return raw as Record<string, unknown>;\n }\n return undefined;\n}\n\nfunction requireObject(raw: unknown, what: string): Record<string, unknown> {\n const o = asObject(raw);\n if (o === undefined) throw new TypeError(`${what}: expected object`);\n return o;\n}\n\nfunction asString(v: unknown): string | undefined {\n return typeof v === \"string\" ? v : undefined;\n}\nfunction asNumber(v: unknown): number | undefined {\n return typeof v === \"number\" ? v : undefined;\n}\nfunction asBoolean(v: unknown): boolean | undefined {\n return typeof v === \"boolean\" ? v : undefined;\n}\n\n/** Streaming providers supported by the lis.tn redirect helper. */\nexport type StreamingProvider =\n | \"spotify\"\n | \"apple_music\"\n | \"deezer\"\n | \"napster\"\n | \"youtube\";\n\nconst STREAMING_PROVIDERS: readonly StreamingProvider[] = [\n \"spotify\",\n \"apple_music\",\n \"deezer\",\n \"napster\",\n \"youtube\",\n] as const;\n\nfunction lisTnStreamingUrl(songLink: string | undefined, provider: string): string | null {\n if (songLink === undefined || songLink === \"\") return null;\n let parsed: URL;\n try {\n parsed = new URL(songLink);\n } catch {\n return null;\n }\n if (parsed.hostname !== \"lis.tn\") return null;\n const sep = parsed.search ? \"&\" : \"?\";\n return `${songLink}${sep}${provider}`;\n}\n\nexport interface RecognitionResult {\n /** Always present on a match. */\n timecode: string;\n /** Set on custom-catalog matches. */\n audioId?: number | undefined;\n artist?: string | undefined;\n title?: string | undefined;\n album?: string | undefined;\n releaseDate?: string | undefined;\n label?: string | undefined;\n songLink?: string | undefined;\n isrc?: string | undefined;\n upc?: string | undefined;\n appleMusic?: Record<string, unknown> | undefined;\n spotify?: Record<string, unknown> | undefined;\n deezer?: Record<string, unknown> | undefined;\n napster?: Record<string, unknown> | undefined;\n musicbrainz?: ReadonlyArray<Record<string, unknown>> | undefined;\n /** Forward-compat: any unknown keys from the server. */\n extras: Record<string, unknown>;\n /** Full unparsed payload for the caller's own inspection. */\n rawResponse: Record<string, unknown>;\n /** True when `audioId` is set (custom-catalog match). */\n readonly isCustomMatch: boolean;\n /** True when `audioId` is unset and `artist` or `title` are present. */\n readonly isPublicMatch: boolean;\n /** Cover-art URL for `lis.tn`-hosted song_links, else `null`. */\n readonly thumbnailUrl: string | null;\n /**\n * Direct or redirect URL for a streaming provider, with smart fallback.\n *\n * Resolution order:\n * 1. Direct URL from the metadata block (e.g. `apple_music.url`,\n * `spotify.external_urls.spotify`, `deezer.link`, `napster.href`) when\n * the user requested that provider via `return=`.\n * 2. lis.tn redirect (`{songLink}?{provider}`) when `songLink` is on lis.tn.\n * 3. `null` otherwise. YouTube has only the lis.tn-redirect path.\n */\n streamingUrl(provider: StreamingProvider): string | null;\n /** Map of every provider with a resolvable URL — direct or via lis.tn redirect. */\n streamingUrls(): Partial<Record<StreamingProvider, string>>;\n /**\n * First available 30-second preview URL across providers, in priority order:\n * `apple_music.previews[0].url` → `spotify.preview_url` → `deezer.preview`.\n *\n * **Note:** previews are governed by the respective providers' terms of use.\n * The SDK consumer is responsible for honoring those terms (caching limits,\n * attribution, redistribution constraints).\n */\n previewUrl(): string | null;\n}\n\nfunction directStreamingUrl(\n result: Pick<RecognitionResult, \"appleMusic\" | \"spotify\" | \"deezer\" | \"napster\">,\n provider: string,\n): string | null {\n if (provider === \"apple_music\" && result.appleMusic !== undefined) {\n const url = result.appleMusic[\"url\"];\n if (typeof url === \"string\" && url.length > 0) return url;\n } else if (provider === \"spotify\" && result.spotify !== undefined) {\n const ext = result.spotify[\"external_urls\"];\n if (typeof ext === \"object\" && ext !== null) {\n const sp = (ext as Record<string, unknown>)[\"spotify\"];\n if (typeof sp === \"string\" && sp.length > 0) return sp;\n }\n const uri = result.spotify[\"uri\"];\n if (typeof uri === \"string\" && uri.length > 0) return uri;\n } else if (provider === \"deezer\" && result.deezer !== undefined) {\n const link = result.deezer[\"link\"];\n if (typeof link === \"string\" && link.length > 0) return link;\n } else if (provider === \"napster\" && result.napster !== undefined) {\n const href = result.napster[\"href\"];\n if (typeof href === \"string\" && href.length > 0) return href;\n }\n return null;\n}\n\nfunction previewFrom(result: Pick<RecognitionResult, \"appleMusic\" | \"spotify\" | \"deezer\">): string | null {\n if (result.appleMusic !== undefined) {\n const previews = result.appleMusic[\"previews\"];\n if (Array.isArray(previews) && previews.length > 0) {\n const first = previews[0];\n if (typeof first === \"object\" && first !== null) {\n const url = (first as Record<string, unknown>)[\"url\"];\n if (typeof url === \"string\" && url.length > 0) return url;\n }\n }\n }\n if (result.spotify !== undefined) {\n const url = result.spotify[\"preview_url\"];\n if (typeof url === \"string\" && url.length > 0) return url;\n }\n if (result.deezer !== undefined) {\n const url = result.deezer[\"preview\"];\n if (typeof url === \"string\" && url.length > 0) return url;\n }\n return null;\n}\n\nconst RECOGNITION_KEYS = [\n \"timecode\",\n \"audio_id\",\n \"artist\",\n \"title\",\n \"album\",\n \"release_date\",\n \"label\",\n \"song_link\",\n \"isrc\",\n \"upc\",\n \"apple_music\",\n \"spotify\",\n \"deezer\",\n \"napster\",\n \"musicbrainz\",\n] as const;\n\nexport function parseRecognitionResult(raw: unknown): RecognitionResult {\n const r = requireObject(raw, \"RecognitionResult\");\n const timecode = asString(r.timecode);\n if (timecode === undefined) {\n throw new TypeError(\"RecognitionResult: timecode missing or not string\");\n }\n const audioId = asNumber(r.audio_id);\n const artist = asString(r.artist);\n const title = asString(r.title);\n const songLink = asString(r.song_link);\n const musicbrainz = Array.isArray(r.musicbrainz)\n ? (r.musicbrainz.filter((x): x is Record<string, unknown> => asObject(x) !== undefined) as\n | Record<string, unknown>[]\n | undefined)\n : undefined;\n\n const result: RecognitionResult = {\n timecode,\n audioId,\n artist,\n title,\n album: asString(r.album),\n releaseDate: asString(r.release_date),\n label: asString(r.label),\n songLink,\n isrc: asString(r.isrc),\n upc: asString(r.upc),\n appleMusic: asObject(r.apple_music),\n spotify: asObject(r.spotify),\n deezer: asObject(r.deezer),\n napster: asObject(r.napster),\n musicbrainz,\n extras: pickExtras(r, RECOGNITION_KEYS),\n rawResponse: r,\n get isCustomMatch() {\n return audioId !== undefined;\n },\n get isPublicMatch() {\n return audioId === undefined && (artist !== undefined || title !== undefined);\n },\n get thumbnailUrl() {\n return lisTnStreamingUrl(songLink, \"thumb\");\n },\n streamingUrl(provider: StreamingProvider): string | null {\n if (!STREAMING_PROVIDERS.includes(provider)) {\n throw new TypeError(\n `Unknown streaming provider: ${String(provider)}. ` +\n `Valid: ${STREAMING_PROVIDERS.join(\", \")}`,\n );\n }\n const direct = directStreamingUrl(result, provider);\n if (direct !== null) return direct;\n return lisTnStreamingUrl(songLink, provider);\n },\n streamingUrls(): Partial<Record<StreamingProvider, string>> {\n const out: Partial<Record<StreamingProvider, string>> = {};\n for (const p of STREAMING_PROVIDERS) {\n const url = result.streamingUrl(p);\n if (url !== null) out[p] = url;\n }\n return out;\n },\n previewUrl(): string | null {\n return previewFrom(result);\n },\n };\n return result;\n}\n\nexport interface EnterpriseMatch {\n score: number;\n timecode: string;\n artist?: string | undefined;\n title?: string | undefined;\n album?: string | undefined;\n releaseDate?: string | undefined;\n label?: string | undefined;\n isrc?: string | undefined;\n upc?: string | undefined;\n songLink?: string | undefined;\n startOffset?: number | undefined;\n endOffset?: number | undefined;\n extras: Record<string, unknown>;\n rawResponse: Record<string, unknown>;\n readonly thumbnailUrl: string | null;\n /** lis.tn redirect URL for the given streaming provider, or null if `songLink` is non-lis.tn. */\n streamingUrl(provider: StreamingProvider): string | null;\n /** All providers with a resolvable lis.tn redirect URL (or empty when `songLink` is off lis.tn). */\n streamingUrls(): Partial<Record<StreamingProvider, string>>;\n}\n\nconst ENTERPRISE_MATCH_KEYS = [\n \"score\",\n \"timecode\",\n \"artist\",\n \"title\",\n \"album\",\n \"release_date\",\n \"label\",\n \"isrc\",\n \"upc\",\n \"song_link\",\n \"start_offset\",\n \"end_offset\",\n] as const;\n\nexport function parseEnterpriseMatch(raw: unknown): EnterpriseMatch {\n const r = requireObject(raw, \"EnterpriseMatch\");\n const score = asNumber(r.score);\n const timecode = asString(r.timecode);\n if (score === undefined) throw new TypeError(\"EnterpriseMatch: score not number\");\n if (timecode === undefined) throw new TypeError(\"EnterpriseMatch: timecode not string\");\n const songLink = asString(r.song_link);\n return {\n score,\n timecode,\n artist: asString(r.artist),\n title: asString(r.title),\n album: asString(r.album),\n releaseDate: asString(r.release_date),\n label: asString(r.label),\n isrc: asString(r.isrc),\n upc: asString(r.upc),\n songLink,\n startOffset: asNumber(r.start_offset),\n endOffset: asNumber(r.end_offset),\n extras: pickExtras(r, ENTERPRISE_MATCH_KEYS),\n rawResponse: r,\n streamingUrl(provider: StreamingProvider): string | null {\n if (!STREAMING_PROVIDERS.includes(provider)) {\n throw new TypeError(`Unknown streaming provider: ${String(provider)}`);\n }\n return lisTnStreamingUrl(songLink, provider);\n },\n streamingUrls(): Partial<Record<StreamingProvider, string>> {\n const out: Partial<Record<StreamingProvider, string>> = {};\n for (const p of STREAMING_PROVIDERS) {\n const url = lisTnStreamingUrl(songLink, p);\n if (url !== null) out[p] = url;\n }\n return out;\n },\n get thumbnailUrl() {\n if (songLink === undefined || songLink === \"\") return null;\n try {\n const parsed = new URL(songLink);\n if (parsed.hostname !== \"lis.tn\") return null;\n const sep = parsed.search ? \"&\" : \"?\";\n return `${songLink}${sep}thumb`;\n } catch {\n return null;\n }\n },\n };\n}\n\nexport interface EnterpriseChunkResult {\n songs: EnterpriseMatch[];\n offset: string;\n extras: Record<string, unknown>;\n rawResponse: Record<string, unknown>;\n}\n\nconst ENTERPRISE_CHUNK_KEYS = [\"songs\", \"offset\"] as const;\n\nexport function parseEnterpriseChunkResult(raw: unknown): EnterpriseChunkResult {\n const r = requireObject(raw, \"EnterpriseChunkResult\");\n const songsRaw = r.songs;\n if (!Array.isArray(songsRaw)) {\n throw new TypeError(\"EnterpriseChunkResult: songs not array\");\n }\n const offset = asString(r.offset);\n if (offset === undefined) throw new TypeError(\"EnterpriseChunkResult: offset not string\");\n return {\n songs: songsRaw.map(parseEnterpriseMatch),\n offset,\n extras: pickExtras(r, ENTERPRISE_CHUNK_KEYS),\n rawResponse: r,\n };\n}\n\nexport interface Stream {\n radioId: number;\n url: string;\n streamRunning: boolean;\n longpollCategory?: string | undefined;\n extras: Record<string, unknown>;\n rawResponse: Record<string, unknown>;\n}\n\nconst STREAM_KEYS = [\"radio_id\", \"url\", \"stream_running\", \"longpoll_category\"] as const;\n\nexport function parseStream(raw: unknown): Stream {\n const r = requireObject(raw, \"Stream\");\n const radioId = asNumber(r.radio_id);\n const url = asString(r.url);\n const streamRunning = asBoolean(r.stream_running);\n if (radioId === undefined) throw new TypeError(\"Stream: radio_id not number\");\n if (url === undefined) throw new TypeError(\"Stream: url not string\");\n if (streamRunning === undefined) throw new TypeError(\"Stream: stream_running not boolean\");\n return {\n radioId,\n url,\n streamRunning,\n longpollCategory: asString(r.longpoll_category),\n extras: pickExtras(r, STREAM_KEYS),\n rawResponse: r,\n };\n}\n\n/**\n * One candidate song in a recognition match.\n *\n * Almost every match has exactly one Song; the rare extra candidates that\n * appear under {@link StreamCallbackMatch.alternatives} may have a *different*\n * artist or title from the top song — they're variant catalog releases of the\n * same recording (e.g. a \"feat.\" credit vs. the bare-artist re-release, or\n * regional edits with different titles), not lower-confidence guesses at the\n * same track.\n */\nexport interface StreamCallbackSong {\n artist: string;\n title: string;\n score: number;\n album?: string | undefined;\n releaseDate?: string | undefined;\n label?: string | undefined;\n songLink?: string | undefined;\n isrc?: string | undefined;\n upc?: string | undefined;\n appleMusic?: Record<string, unknown> | undefined;\n spotify?: Record<string, unknown> | undefined;\n deezer?: Record<string, unknown> | undefined;\n napster?: Record<string, unknown> | undefined;\n musicbrainz?: ReadonlyArray<Record<string, unknown>> | undefined;\n extras: Record<string, unknown>;\n}\n\nconst STREAM_CALLBACK_SONG_KEYS = [\n \"artist\",\n \"title\",\n \"score\",\n \"album\",\n \"release_date\",\n \"label\",\n \"song_link\",\n \"isrc\",\n \"upc\",\n \"apple_music\",\n \"spotify\",\n \"deezer\",\n \"napster\",\n \"musicbrainz\",\n] as const;\n\nfunction parseStreamCallbackSong(raw: unknown): StreamCallbackSong {\n const r = requireObject(raw, \"StreamCallbackSong\");\n const artist = asString(r.artist);\n const title = asString(r.title);\n const score = asNumber(r.score);\n if (artist === undefined) throw new TypeError(\"StreamCallbackSong: artist not string\");\n if (title === undefined) throw new TypeError(\"StreamCallbackSong: title not string\");\n if (score === undefined) throw new TypeError(\"StreamCallbackSong: score not number\");\n const musicbrainz = Array.isArray(r.musicbrainz)\n ? (r.musicbrainz.filter((x): x is Record<string, unknown> => asObject(x) !== undefined) as\n | Record<string, unknown>[]\n | undefined)\n : undefined;\n return {\n artist,\n title,\n score,\n album: asString(r.album),\n releaseDate: asString(r.release_date),\n label: asString(r.label),\n songLink: asString(r.song_link),\n isrc: asString(r.isrc),\n upc: asString(r.upc),\n appleMusic: asObject(r.apple_music),\n spotify: asObject(r.spotify),\n deezer: asObject(r.deezer),\n napster: asObject(r.napster),\n musicbrainz,\n extras: pickExtras(r, STREAM_CALLBACK_SONG_KEYS),\n };\n}\n\n/**\n * One recognition event from a stream callback or longpoll.\n *\n * The top match lives in {@link song}; rare extra candidates live in\n * {@link alternatives}. Alternatives entries may have a different artist or\n * title from the top song — they're variant catalog releases of the same\n * recording, not lower-confidence guesses at the same track.\n */\nexport interface StreamCallbackMatch {\n radioId: number;\n timestamp?: string | undefined;\n playLength?: number | undefined;\n /** Top match — always present. */\n song: StreamCallbackSong;\n /** Variant catalog releases (may have different artist/title); empty array when only one match. */\n alternatives: StreamCallbackSong[];\n extras: Record<string, unknown>;\n rawResponse: Record<string, unknown>;\n}\n\nconst STREAM_CALLBACK_MATCH_KEYS = [\n \"radio_id\",\n \"timestamp\",\n \"play_length\",\n \"results\",\n] as const;\n\nexport function parseStreamCallbackMatch(raw: unknown): StreamCallbackMatch {\n const r = requireObject(raw, \"StreamCallbackMatch\");\n const radioId = asNumber(r.radio_id);\n if (radioId === undefined) throw new TypeError(\"StreamCallbackMatch: radio_id not number\");\n const resultsRaw = r.results;\n if (!Array.isArray(resultsRaw)) throw new TypeError(\"StreamCallbackMatch: results not array\");\n if (resultsRaw.length === 0) throw new TypeError(\"StreamCallbackMatch: results is empty\");\n const songs = resultsRaw.map(parseStreamCallbackSong);\n const [first, ...rest] = songs;\n if (first === undefined) throw new TypeError(\"StreamCallbackMatch: results is empty\");\n return {\n radioId,\n timestamp: asString(r.timestamp),\n playLength: asNumber(r.play_length),\n song: first,\n alternatives: rest,\n extras: pickExtras(r, STREAM_CALLBACK_MATCH_KEYS),\n rawResponse: r,\n };\n}\n\nexport interface StreamCallbackNotification {\n radioId: number;\n streamRunning?: boolean | undefined;\n notificationCode: number;\n notificationMessage: string;\n /** Outer `time` field on the callback envelope (epoch seconds). */\n time?: number | undefined;\n extras: Record<string, unknown>;\n rawResponse: Record<string, unknown>;\n}\n\nconst STREAM_CALLBACK_NOTIFICATION_KEYS = [\n \"radio_id\",\n \"stream_running\",\n \"notification_code\",\n \"notification_message\",\n] as const;\n\nexport function parseStreamCallbackNotification(raw: unknown): StreamCallbackNotification {\n const r = requireObject(raw, \"StreamCallbackNotification\");\n const radioId = asNumber(r.radio_id);\n if (radioId === undefined)\n throw new TypeError(\"StreamCallbackNotification: radio_id not number\");\n const code = asNumber(r.notification_code);\n if (code === undefined)\n throw new TypeError(\"StreamCallbackNotification: notification_code not number\");\n const message = asString(r.notification_message);\n if (message === undefined)\n throw new TypeError(\"StreamCallbackNotification: notification_message not string\");\n return {\n radioId,\n streamRunning: asBoolean(r.stream_running),\n notificationCode: code,\n notificationMessage: message,\n extras: pickExtras(r, STREAM_CALLBACK_NOTIFICATION_KEYS),\n rawResponse: r,\n };\n}\n\nexport interface LyricsResult {\n artist: string;\n title: string;\n lyrics?: string | undefined;\n songId?: number | undefined;\n fullTitle?: string | undefined;\n artistId?: number | undefined;\n songLink?: string | undefined;\n media?: string | undefined;\n extras: Record<string, unknown>;\n rawResponse: Record<string, unknown>;\n}\n\nconst LYRICS_KEYS = [\n \"artist\",\n \"title\",\n \"lyrics\",\n \"song_id\",\n \"full_title\",\n \"artist_id\",\n \"song_link\",\n \"media\",\n] as const;\n\nexport function parseLyricsResult(raw: unknown): LyricsResult {\n const r = requireObject(raw, \"LyricsResult\");\n const artist = asString(r.artist);\n const title = asString(r.title);\n if (artist === undefined) throw new TypeError(\"LyricsResult: artist not string\");\n if (title === undefined) throw new TypeError(\"LyricsResult: title not string\");\n return {\n artist,\n title,\n lyrics: asString(r.lyrics),\n songId: asNumber(r.song_id),\n fullTitle: asString(r.full_title),\n artistId: asNumber(r.artist_id),\n songLink: asString(r.song_link),\n media: asString(r.media),\n extras: pickExtras(r, LYRICS_KEYS),\n rawResponse: r,\n };\n}\n","import type { HttpResponse } from \"./http.js\";\n\n/**\n * Cost-aware retry classes.\n *\n * - READ — idempotent reads (`streams.list`, `streams.getCallbackUrl`):\n * retry on 408/429/5xx + any connection error.\n * - RECOGNITION — `recognize`, `recognizeEnterprise`, `advanced.findLyrics`:\n * retry on pre-upload connection failures + 5xx.\n * DO NOT retry on read-timeout-after-upload (cost protection).\n * - MUTATING — `streams.add`, `streams.delete`, etc.:\n * retry only on pre-upload connection failures. DO NOT retry\n * 5xx (the side effect may have happened).\n * - NONE — `customCatalog.add`: never retry. Custom-catalog upload is\n * metered; auto-retry on transport failure could double-charge\n * for the same audio fingerprinting. Surface a clean error and\n * let the caller decide.\n */\nexport type RetryClass = \"read\" | \"recognition\" | \"mutating\" | \"none\";\n\nexport interface RetryPolicy {\n retryClass: RetryClass;\n maxAttempts: number;\n backoffFactorMs: number;\n backoffMaxMs: number;\n}\n\nexport const DEFAULT_BACKOFF_FACTOR_MS = 500;\nexport const DEFAULT_BACKOFF_MAX_MS = 30_000;\nexport const DEFAULT_MAX_ATTEMPTS = 3;\n\nconst HTTP_REQUEST_TIMEOUT = 408;\nconst HTTP_TOO_MANY_REQUESTS = 429;\nconst HTTP_SERVER_ERROR_FLOOR = 500;\n\nexport function defaultPolicy(retryClass: RetryClass): RetryPolicy {\n return {\n retryClass,\n maxAttempts: DEFAULT_MAX_ATTEMPTS,\n backoffFactorMs: DEFAULT_BACKOFF_FACTOR_MS,\n backoffMaxMs: DEFAULT_BACKOFF_MAX_MS,\n };\n}\n\nfunction backoffDelayMs(attempt: number, policy: RetryPolicy): number {\n const base = Math.min(policy.backoffFactorMs * 2 ** attempt, policy.backoffMaxMs);\n return base * (0.5 + Math.random());\n}\n\n/**\n * `fetch()` raises `TypeError(\"fetch failed\")` when DNS/TCP/TLS failed before\n * the request body finished. AbortError (or DOMException/AbortError) means the\n * caller's AbortSignal fired — could be pre- or post-upload, treated as\n * post-upload conservatively for cost-protection.\n */\nfunction isAbortError(err: unknown): boolean {\n if (err === null || typeof err !== \"object\") return false;\n const e = err as { name?: unknown };\n return e.name === \"AbortError\";\n}\n\nfunction isPreUploadConnectionError(err: unknown): boolean {\n if (isAbortError(err)) return false;\n // Node fetch wraps DNS/TCP/TLS errors as TypeError. Browsers do too.\n return err instanceof TypeError;\n}\n\nfunction shouldRetryResponse(resp: HttpResponse, retryClass: RetryClass): boolean {\n const s = resp.httpStatus;\n switch (retryClass) {\n case \"read\":\n return (\n s === HTTP_REQUEST_TIMEOUT ||\n s === HTTP_TOO_MANY_REQUESTS ||\n s >= HTTP_SERVER_ERROR_FLOOR\n );\n case \"recognition\":\n return s >= HTTP_SERVER_ERROR_FLOOR;\n case \"mutating\":\n return false;\n case \"none\":\n return false;\n }\n}\n\nfunction shouldRetryError(err: unknown, retryClass: RetryClass): boolean {\n switch (retryClass) {\n case \"read\":\n // Pre-upload connection errors and post-upload read timeouts are both\n // safe-ish: idempotent reads can be retried freely.\n return isPreUploadConnectionError(err) || isAbortError(err);\n case \"recognition\":\n // Pre-upload only — explicitly NOT post-upload AbortError (cost protection).\n return isPreUploadConnectionError(err);\n case \"mutating\":\n // Pre-upload only — server-side side-effect may have happened.\n return isPreUploadConnectionError(err);\n case \"none\":\n // Metered upload — never retry on transport failure (could double-charge).\n return false;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function retry<T extends HttpResponse>(\n fn: () => Promise<T>,\n policy: RetryPolicy,\n): Promise<T> {\n let lastError: unknown;\n let lastResp: T | undefined;\n let haveResp = false;\n for (let attempt = 0; attempt < policy.maxAttempts; attempt++) {\n try {\n const resp = await fn();\n if (!shouldRetryResponse(resp, policy.retryClass)) return resp;\n lastResp = resp;\n haveResp = true;\n lastError = undefined;\n } catch (err) {\n if (!shouldRetryError(err, policy.retryClass)) throw err;\n lastError = err;\n haveResp = false;\n if (attempt + 1 >= policy.maxAttempts) throw err;\n }\n if (attempt + 1 >= policy.maxAttempts) break;\n await sleep(backoffDelayMs(attempt, policy));\n }\n if (haveResp && lastResp !== undefined) return lastResp;\n throw lastError;\n}\n","/**\n * Auto-detect what kind of audio source the caller passed and convert to\n * the right multipart fields.\n *\n * Returns a *re-opener* — a 0-arg callable that yields fresh form fields\n * on each call. The HTTP layer invokes it inside the retry-wrapped request\n * closure, so retried attempts get fresh body content rather than an\n * exhausted stream / spent buffer.\n *\n * Specifically: `fetch()` does NOT auto-rewind a `Blob` constructed over a\n * stream once the body is consumed; the re-opener pattern is mandatory in\n * Node/browsers (the audd-python C1 review note discusses this — Python's\n * httpx auto-seeks; ours doesn't always).\n */\n\nimport { promises as fsPromises, statSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { FormFieldValue } from \"./http.js\";\n\n/**\n * Audio source the caller passes to `recognize` / `recognizeEnterprise` /\n * `customCatalog.add`. Auto-detected:\n *\n * - `string` starting with `http://` or `https://` → URL parameter\n * - `string` other → resolved as a filesystem path on Node (TypeError in browsers)\n * - `URL` → URL parameter\n * - `Blob` / `File` → multipart upload\n * - `Uint8Array` / `Buffer` → multipart upload\n */\nexport type Source = string | URL | Blob | Uint8Array;\n\nexport interface PreparedRequest {\n fields: Record<string, FormFieldValue>;\n /** True for multipart uploads (file body sent), false when only URL passed. */\n isMultipart: boolean;\n}\n\nexport type SourceReopener = () => Promise<PreparedRequest>;\n\nfunction looksLikeUrl(s: string): boolean {\n return s.startsWith(\"http://\") || s.startsWith(\"https://\");\n}\n\nfunction isNodeRuntime(): boolean {\n return (\n typeof process !== \"undefined\" &&\n process.versions !== undefined &&\n typeof process.versions.node === \"string\"\n );\n}\n\n/**\n * Inspect a source and return a re-opener.\n *\n * URLs go via `data.url`; bytes/blobs/paths go via `data.file` (multipart).\n * Each call to the returned re-opener yields a fresh body so retry doesn't\n * see an empty/exhausted buffer.\n */\nexport function prepareSource(source: Source): SourceReopener {\n if (typeof source === \"string\") {\n if (looksLikeUrl(source)) {\n const url = source;\n return () => Promise.resolve({ fields: { url }, isMultipart: false });\n }\n if (!isNodeRuntime()) {\n throw new TypeError(\n `Source string ${JSON.stringify(source)} is not an HTTP URL (must start with ` +\n `http:// or https://). Filesystem paths are only supported on Node. In a ` +\n `browser, pass a Blob/File or Uint8Array instead.`,\n );\n }\n // Filesystem path. Verify existence eagerly so a typo'd URL doesn't get\n // treated as a path that fails much later with a less-actionable error.\n let exists = false;\n try {\n exists = statSync(source).isFile();\n } catch {\n exists = false;\n }\n if (!exists) {\n throw new TypeError(\n `${JSON.stringify(source)} is not an HTTP URL (must start with http:// or ` +\n `https://) and is not an existing file path. Pass a URL, a path, a Blob, or ` +\n `bytes.`,\n );\n }\n const filePath = source;\n const filename = path.basename(filePath);\n return async () => {\n const buf = await fsPromises.readFile(filePath);\n const blob = new Blob([new Uint8Array(buf)], {\n type: \"application/octet-stream\",\n });\n const file = new File([blob], filename, { type: \"application/octet-stream\" });\n return { fields: { file }, isMultipart: true };\n };\n }\n\n if (source instanceof URL) {\n const url = source.toString();\n return () => Promise.resolve({ fields: { url }, isMultipart: false });\n }\n\n if (typeof Blob !== \"undefined\" && source instanceof Blob) {\n // Blob is fundamentally re-readable — fetch will re-stream it.\n const blob = source;\n const filename = \"name\" in blob && typeof blob.name === \"string\" ? blob.name : \"upload.bin\";\n return () => {\n const file = new File([blob], filename, { type: blob.type || \"application/octet-stream\" });\n return Promise.resolve({ fields: { file }, isMultipart: true });\n };\n }\n\n if (source instanceof Uint8Array) {\n // Snapshot the bytes once (defensive copy) and produce a fresh Blob each\n // attempt so concurrent retries can't trample each other's bodies.\n const buf = new Uint8Array(source);\n return () => {\n const blob = new Blob([buf], { type: \"application/octet-stream\" });\n const file = new File([blob], \"upload.bin\", { type: \"application/octet-stream\" });\n return Promise.resolve({ fields: { file }, isMultipart: true });\n };\n }\n\n throw new TypeError(\n `Unsupported source type ${typeof source}; pass a URL string, URL, Blob/File, ` +\n `Uint8Array, or Buffer.`,\n );\n}\n","import { createHash } from \"node:crypto\";\nimport { AudDInvalidRequestError, AudDSerializationError } from \"./errors.js\";\nimport {\n parseStreamCallbackMatch,\n parseStreamCallbackNotification,\n type StreamCallbackMatch,\n type StreamCallbackNotification,\n} from \"./models.js\";\n\n/**\n * Raised by `addReturnToUrl` (and therefore by `streams.setCallbackUrl`)\n * when the URL already contains a `return` query parameter and a\n * `returnMetadata` argument is also passed — conflicting intent.\n */\nexport class DuplicateReturnParameterError extends AudDInvalidRequestError {\n override name = \"DuplicateReturnParameterError\";\n constructor() {\n super({\n errorCode: 0,\n message:\n \"URL already contains a `return` query parameter; pass returnMetadata: undefined \" +\n \"or remove the parameter from the URL — refusing to silently overwrite.\",\n httpStatus: 0,\n requestId: null,\n requestedParams: {},\n requestMethod: null,\n brandedMessage: null,\n rawResponse: null,\n });\n }\n}\n\n/**\n * Compute the 9-char longpoll category locally from the API token + radio_id.\n *\n * Formula (per docs.audd.io/streams.md): hex-MD5 of (hex-MD5 of api_token,\n * concatenated with the radio_id rendered as a decimal string), truncated\n * to the first 9 hex chars.\n *\n * Pure function — no network call. Lets servers share a longpoll category\n * with browser/mobile clients without leaking the api_token.\n */\nexport function deriveLongpollCategory(apiToken: string, radioId: number): string {\n const inner = createHash(\"md5\").update(apiToken, \"utf8\").digest(\"hex\");\n const full = createHash(\"md5\").update(inner + String(radioId), \"utf8\").digest(\"hex\");\n return full.slice(0, 9);\n}\n\n/**\n * Append `?return=<metadata>` (or merge as `&return=`) to the callback URL.\n *\n * - If `returnMetadata` is `undefined`, returns the URL unchanged.\n * - If the URL already has a `return` query parameter, raises rather than\n * silently overwriting.\n */\nexport function addReturnToUrl(\n url: string,\n returnMetadata: string | string[] | undefined,\n): string {\n if (returnMetadata === undefined) return url;\n const value = Array.isArray(returnMetadata) ? returnMetadata.join(\",\") : returnMetadata;\n const u = new URL(url);\n if (u.searchParams.has(\"return\")) {\n throw new DuplicateReturnParameterError();\n }\n u.searchParams.set(\"return\", value);\n return u.toString();\n}\n\n/**\n * Result of {@link parseCallback} / {@link handleCallback}.\n *\n * Exactly one of `match` or `notification` is non-null on success.\n * Recognition callbacks populate `match`; lifecycle/error callbacks (e.g.\n * \"stream stopped\", \"can't connect\") populate `notification`.\n */\nexport interface ParsedCallback {\n match: StreamCallbackMatch | null;\n notification: StreamCallbackNotification | null;\n}\n\n/**\n * Parse a callback POST body into a typed match or notification.\n *\n * Accepts either a parsed JSON object or a string (serialized JSON). Throws\n * {@link AudDSerializationError} when the body is unparseable JSON, isn't an\n * object, or carries neither a `result` nor a `notification` block.\n *\n * Prefer {@link handleCallback} when you have a Node `http.IncomingMessage`,\n * a Web `Request`, or anything with a streamed body — that helper reads the\n * body for you.\n */\nexport function parseCallback(body: unknown): ParsedCallback {\n let raw: unknown = body;\n if (typeof body === \"string\") {\n try {\n raw = JSON.parse(body);\n } catch (err) {\n throw new AudDSerializationError(\n `callback body is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,\n body,\n );\n }\n }\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new AudDSerializationError(\n \"callback body is not a JSON object\",\n typeof body === \"string\" ? body : \"\",\n );\n }\n const r = raw as Record<string, unknown>;\n\n if (\"notification\" in r) {\n let notification: StreamCallbackNotification;\n try {\n notification = parseStreamCallbackNotification(r.notification);\n } catch (err) {\n throw new AudDSerializationError(\n `callback notification: ${err instanceof Error ? err.message : String(err)}`,\n typeof body === \"string\" ? body : JSON.stringify(r),\n );\n }\n const t = r.time;\n if (typeof t === \"number\") notification.time = t;\n return { match: null, notification };\n }\n\n if (\"result\" in r) {\n let match: StreamCallbackMatch;\n try {\n match = parseStreamCallbackMatch(r.result);\n } catch (err) {\n throw new AudDSerializationError(\n `callback result: ${err instanceof Error ? err.message : String(err)}`,\n typeof body === \"string\" ? body : JSON.stringify(r),\n );\n }\n return { match, notification: null };\n }\n\n throw new AudDSerializationError(\n \"callback body has neither result nor notification\",\n typeof body === \"string\" ? body : JSON.stringify(r),\n );\n}\n\n/**\n * Minimum shape we accept from a \"request-like\" object: anything that exposes\n * a `body` (already-parsed-or-stringified JSON), or that is itself a stream we\n * can drain.\n *\n * Concretely supports:\n * - Node `http.IncomingMessage` (async-iterable of `Buffer | string`)\n * - Web `Request` / `fetch` `Body` (has `.text()`)\n * - Express/Fastify/Hono request (has a `.body` already populated by a JSON parser)\n * - Plain `{ body: <parsed-json | string> }` shapes\n */\ntype CallbackRequestLike =\n | { text(): Promise<string> }\n | { body?: unknown; [k: string]: unknown }\n | AsyncIterable<unknown>;\n\n/**\n * Read and parse a callback POST body off a Node, Web, or framework-style\n * request. Picks the right strategy by duck-typing:\n *\n * 1. If the request exposes a `text()` method (Web `Request`, `fetch` body),\n * awaits it and parses the resulting string.\n * 2. Otherwise, if the request has a `body` property that's already an object\n * (Express/Fastify/Hono with a JSON middleware) or string, parses that\n * directly without touching the underlying stream.\n * 3. Otherwise, treats the request as an async-iterable of chunks\n * (`http.IncomingMessage`) and concatenates the body before parsing.\n *\n * Throws {@link AudDSerializationError} on any parse failure.\n */\nexport async function handleCallback(req: CallbackRequestLike): Promise<ParsedCallback> {\n // 1. Web Request / Response-like — has a text() method.\n if (typeof (req as { text?: unknown }).text === \"function\") {\n const text = await (req as { text: () => Promise<string> }).text();\n return parseCallback(text);\n }\n\n // 2. Framework request — body already populated.\n const reqRecord = req as { body?: unknown };\n if (\"body\" in reqRecord && reqRecord.body !== undefined && reqRecord.body !== null) {\n const body = reqRecord.body;\n // If body is itself a readable stream (e.g. raw express without\n // express.json()), fall through to the streaming path below.\n if (\n typeof body === \"object\" &&\n body !== null &&\n Symbol.asyncIterator in (body as object) &&\n // Plain Buffer/Uint8Array also has Symbol.iterator — accept those by value.\n !(body instanceof Uint8Array)\n ) {\n // Streamed body — drain it.\n return parseCallback(await drainAsyncIterable(body as AsyncIterable<unknown>));\n }\n if (body instanceof Uint8Array) {\n return parseCallback(new TextDecoder().decode(body));\n }\n return parseCallback(body);\n }\n\n // 3. The request is itself an async-iterable (http.IncomingMessage).\n if (typeof req === \"object\" && req !== null && Symbol.asyncIterator in req) {\n return parseCallback(await drainAsyncIterable(req as AsyncIterable<unknown>));\n }\n\n throw new AudDSerializationError(\n \"handleCallback: request has no body, no text() method, and is not async-iterable\",\n );\n}\n\nasync function drainAsyncIterable(it: AsyncIterable<unknown>): Promise<string> {\n const chunks: Uint8Array[] = [];\n let stringBuf = \"\";\n for await (const chunk of it) {\n if (typeof chunk === \"string\") {\n stringBuf += chunk;\n } else if (chunk instanceof Uint8Array) {\n chunks.push(chunk);\n } else if (chunk !== null && chunk !== undefined) {\n // Best-effort fallback — Node's stream/consumers can yield Buffer-likes.\n stringBuf += String(chunk);\n }\n }\n if (chunks.length > 0) {\n let total = 0;\n for (const c of chunks) total += c.byteLength;\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n merged.set(c, offset);\n offset += c.byteLength;\n }\n stringBuf = new TextDecoder().decode(merged) + stringBuf;\n }\n return stringBuf;\n}\n","/**\n * Shared longpoll loop + handle, used by both the authenticated `Streams`\n * namespace (token in URL via `HttpClient.get`) and the tokenless\n * `LongpollConsumer` exported from `audd/longpoll`.\n *\n * Browser-safe: no node:crypto, no node:fs, no node:http imports. The whole\n * file relies on `fetch`-style I/O the caller injects.\n */\n\nimport {\n AudDConnectionError,\n AudDSerializationError,\n AudDServerError,\n} from \"./errors.js\";\nimport type { HttpResponse } from \"./http.js\";\nimport type {\n StreamCallbackMatch,\n StreamCallbackNotification,\n} from \"./models.js\";\nimport {\n parseStreamCallbackMatch,\n parseStreamCallbackNotification,\n} from \"./models.js\";\n\nconst HTTP_CLIENT_ERROR_FLOOR = 400;\n\n/**\n * Active long-poll subscription. Two typed `AsyncIterable`s carry the\n * happy-path output and a third carries any terminal error.\n *\n * Consume `matches` and `notifications` independently or in parallel:\n *\n * ```ts\n * const poll = await audd.streams.longpoll(category);\n * for await (const m of poll.matches) {\n * console.log(m.song.artist, m.song.title);\n * }\n * ```\n *\n * Concurrent consumption:\n *\n * ```ts\n * await Promise.all([\n * (async () => { for await (const m of poll.matches) {} })(),\n * (async () => { for await (const n of poll.notifications) {} })(),\n * (async () => { for await (const e of poll.errors) console.error(e); })(),\n * ]);\n * ```\n *\n * `close()` (or the `await using` resource-management form) tears down the\n * background loop and closes all three iterables.\n */\nexport interface LongpollPoll {\n /** Recognition events. */\n readonly matches: AsyncIterable<StreamCallbackMatch>;\n /** Stream-lifecycle events (\"stream stopped\", \"can't connect\", ...). */\n readonly notifications: AsyncIterable<StreamCallbackNotification>;\n /**\n * Terminal errors. The poll keeps polling on transient HTTP/JSON failures\n * (subject to the retry policy); errors that surface here are the ones the\n * loop gives up on. Each fired error is followed by closure of all three\n * iterables.\n */\n readonly errors: AsyncIterable<Error>;\n /** Stop the background loop. Idempotent. */\n close(): void;\n /** `await using` support — calls `close()`. */\n [Symbol.asyncDispose](): Promise<void>;\n}\n\n/**\n * Caller-supplied bits the loop needs:\n * - `fetchOnce` — performs a single longpoll HTTP GET, with caller-managed\n * auth (token in URL, Bearer header, etc.) and retry policy.\n * - `getInitialSince` — initial `since_time` to send (often `undefined`).\n * - `timeout` — server-side longpoll timeout in seconds.\n * - `category` — the longpoll category derived from `(token, radio_id)`.\n * - `signal` — aborts the in-flight HTTP when the poll is closed.\n */\nexport interface LongpollLoopConfig {\n category: string;\n timeout: number;\n sinceTime: number | undefined;\n fetchOnce: (\n params: Record<string, string | undefined>,\n signal: AbortSignal,\n ) => Promise<HttpResponse>;\n}\n\n/**\n * Internal: a single-consumer-friendly bounded queue used to demultiplex\n * the loop output onto separate AsyncIterables.\n */\nclass AsyncQueue<T> {\n private readonly items: T[] = [];\n private readonly waiters: ((v: IteratorResult<T>) => void)[] = [];\n private done = false;\n\n push(value: T): void {\n if (this.done) return;\n const w = this.waiters.shift();\n if (w !== undefined) {\n w({ value, done: false });\n return;\n }\n this.items.push(value);\n }\n\n finish(): void {\n if (this.done) return;\n this.done = true;\n while (this.waiters.length > 0) {\n const w = this.waiters.shift();\n if (w !== undefined) w({ value: undefined as never, done: true });\n }\n }\n\n next(): Promise<IteratorResult<T>> {\n const item = this.items.shift();\n if (item !== undefined) return Promise.resolve({ value: item, done: false });\n if (this.done) return Promise.resolve({ value: undefined as never, done: true });\n return new Promise((resolve) => {\n this.waiters.push(resolve);\n });\n }\n\n toIterable(): AsyncIterable<T> {\n const next = (): Promise<IteratorResult<T>> => this.next();\n return {\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return { next };\n },\n };\n }\n}\n\n/**\n * Decode one longpoll HTTP response into a Match | Notification | null\n * (null = keep-alive `{timeout, timestamp}` or any non-event body — caller\n * keeps polling). Throws on HTTP non-2xx and JSON-shape errors.\n */\nfunction decodeOne(\n resp: HttpResponse,\n): { kind: \"match\"; match: StreamCallbackMatch } | { kind: \"notification\"; notification: StreamCallbackNotification } | { kind: \"keepalive\" } {\n if (resp.httpStatus >= HTTP_CLIENT_ERROR_FLOOR) {\n throw new AudDServerError({\n errorCode: 0,\n message: `Longpoll endpoint returned HTTP ${String(resp.httpStatus)}`,\n httpStatus: resp.httpStatus,\n requestId: resp.requestId,\n rawResponse: resp.jsonBody ?? resp.rawText,\n });\n }\n const body = resp.jsonBody;\n if (typeof body !== \"object\" || body === null || Array.isArray(body)) {\n throw new AudDSerializationError(\n \"Longpoll response was not a JSON object\",\n resp.rawText,\n );\n }\n const dict = body as Record<string, unknown>;\n if (\"notification\" in dict) {\n const notification = parseStreamCallbackNotification(dict.notification);\n const t = dict[\"time\"];\n if (typeof t === \"number\") notification.time = t;\n return { kind: \"notification\", notification };\n }\n if (\"result\" in dict) {\n return { kind: \"match\", match: parseStreamCallbackMatch(dict.result) };\n }\n // Either a `{timeout, timestamp}` keep-alive or an empty/unknown body —\n // skip silently and keep polling.\n return { kind: \"keepalive\" };\n}\n\n/**\n * Start the longpoll loop on a background async task. Returns a\n * {@link LongpollPoll} handle whose iterables are filled as events arrive.\n * The caller's `fetchOnce` is responsible for retries and auth.\n */\nexport function startLongpoll(cfg: LongpollLoopConfig): LongpollPoll {\n const matches = new AsyncQueue<StreamCallbackMatch>();\n const notifications = new AsyncQueue<StreamCallbackNotification>();\n const errors = new AsyncQueue<Error>();\n\n const controller = new AbortController();\n let closed = false;\n\n const finishAll = (): void => {\n matches.finish();\n notifications.finish();\n errors.finish();\n };\n\n const close = (): void => {\n if (closed) return;\n closed = true;\n controller.abort();\n finishAll();\n };\n\n const run = async (): Promise<void> => {\n let curSince = cfg.sinceTime;\n while (!closed) {\n const params: Record<string, string | undefined> = {\n category: cfg.category,\n timeout: String(cfg.timeout),\n };\n if (curSince !== undefined) params[\"since_time\"] = String(curSince);\n\n let resp: HttpResponse;\n try {\n resp = await cfg.fetchOnce(params, controller.signal);\n } catch (err) {\n if (closed) return;\n if (err instanceof TypeError) {\n errors.push(new AudDConnectionError(`Network error: ${err.message}`, err));\n } else if (\n err !== null &&\n typeof err === \"object\" &&\n (err as { name?: string }).name === \"AbortError\"\n ) {\n // Closed-from-outside path — drop quietly.\n if (closed) return;\n errors.push(new AudDConnectionError(\"Request was aborted (timeout)\", err));\n } else if (err instanceof Error) {\n errors.push(err);\n } else {\n errors.push(new Error(String(err)));\n }\n finishAll();\n return;\n }\n\n try {\n const decoded = decodeOne(resp);\n if (decoded.kind === \"match\") matches.push(decoded.match);\n else if (decoded.kind === \"notification\") notifications.push(decoded.notification);\n // else keep-alive: skip.\n } catch (err) {\n errors.push(err instanceof Error ? err : new Error(String(err)));\n finishAll();\n return;\n }\n\n // Bump since_time off the response body's timestamp, as the audd-go\n // reference does — keeps reconnects from re-replaying old events.\n const dict = resp.jsonBody;\n if (typeof dict === \"object\" && dict !== null && !Array.isArray(dict)) {\n const ts = (dict as Record<string, unknown>)[\"timestamp\"];\n if (typeof ts === \"number\") curSince = ts;\n }\n }\n };\n\n // Fire-and-forget. Failures land on the `errors` iterable.\n void run();\n\n return {\n matches: matches.toIterable(),\n notifications: notifications.toIterable(),\n errors: errors.toIterable(),\n close,\n async [Symbol.asyncDispose](): Promise<void> {\n close();\n await Promise.resolve();\n },\n };\n}\n","/** Streams namespace — setCallbackUrl, addStream, longpoll with preflight, etc. */\nimport { addReturnToUrl, deriveLongpollCategory, parseCallback } from \"./helpers.js\";\nimport {\n AudDAPIError,\n AudDConnectionError,\n AudDInvalidRequestError,\n AudDSerializationError,\n AudDServerError,\n raiseFromErrorResponse,\n} from \"./errors.js\";\nimport type { HttpClient, HttpResponse } from \"./http.js\";\nimport { startLongpoll, type LongpollPoll } from \"./longpollCore.js\";\nimport { parseStream, type Stream } from \"./models.js\";\nimport { retry, type RetryPolicy } from \"./retry.js\";\nimport type { ParsedCallback } from \"./helpers.js\";\n\nconst API_BASE = \"https://api.audd.io\";\n\n/** Server signals \"no callback URL configured\" with code 19 from getCallbackUrl. */\nconst NO_CALLBACK_ERROR_CODE = 19;\n\nconst PREFLIGHT_NO_CALLBACK_HINT =\n \"Longpoll won't deliver events because no callback URL is configured for this \" +\n \"account. Set one first via streams.setCallbackUrl(...) — `https://audd.tech/empty/` \" +\n \"is fine if you only want longpolling and don't need a real receiver. To skip this \" +\n \"check, pass skipCallbackCheck: true.\";\n\nexport interface SetCallbackUrlOptions {\n returnMetadata?: string | string[];\n}\n\nexport interface AddStreamOptions {\n url: string;\n radioId: number;\n /** \"before\" delivers callbacks at song start; default delivers at song end. */\n callbacks?: \"before\" | string;\n}\n\nexport interface LongpollOptions {\n sinceTime?: number;\n /** Server-side timeout in seconds (default 50). */\n timeout?: number;\n /** Bypass the default-on `getCallbackUrl` preflight. */\n skipCallbackCheck?: boolean;\n /**\n * Radio id to subscribe to — the SDK derives the 9-char category locally\n * from `(api_token, radio_id)`. Mutually exclusive with `category`. Only\n * meaningful on the object-form call site (`longpoll({ radioId: 42 })`).\n */\n radioId?: number;\n /**\n * Pre-derived 9-char longpoll category. Mutually exclusive with `radioId`.\n * Only meaningful on the object-form call site\n * (`longpoll({ category: \"abc123def\" })`); the positional string form\n * `longpoll(\"abc123def\")` is the more common way to pass a category.\n */\n category?: string;\n}\n\nfunction decodeSuccess(\n body: unknown,\n httpStatus: number,\n requestId: string | null,\n): unknown {\n if (typeof body !== \"object\" || body === null || Array.isArray(body)) {\n throw new AudDSerializationError(\"Unparseable response\");\n }\n const obj = body as Record<string, unknown> & {\n status?: unknown;\n error?: unknown;\n result?: unknown;\n };\n if (obj.status === \"error\") {\n raiseFromErrorResponse(obj as Parameters<typeof raiseFromErrorResponse>[0], {\n httpStatus,\n requestId,\n });\n }\n if (obj.status === \"success\") {\n return obj.result;\n }\n throw new AudDServerError({\n errorCode: 0,\n message: `Unexpected response status: ${JSON.stringify(obj.status)}`,\n httpStatus,\n requestId,\n rawResponse: obj,\n });\n}\n\nasync function runRetried<T extends HttpResponse>(\n fn: () => Promise<T>,\n policy: RetryPolicy,\n): Promise<T> {\n try {\n return await retry(fn, policy);\n } catch (err) {\n if (err instanceof TypeError) {\n throw new AudDConnectionError(`Network error: ${err.message}`, err);\n }\n if (err !== null && typeof err === \"object\" && (err as { name?: string }).name === \"AbortError\") {\n throw new AudDConnectionError(\"Request was aborted (timeout)\", err);\n }\n throw err;\n }\n}\n\nexport class Streams {\n constructor(\n private readonly http: HttpClient,\n private readonly readPolicy: RetryPolicy,\n private readonly mutatingPolicy: RetryPolicy,\n private readonly apiToken: string,\n ) {}\n\n private async post(\n path: string,\n fields: Record<string, string | undefined>,\n policy: RetryPolicy,\n ): Promise<unknown> {\n const resp = await runRetried(\n () => this.http.postForm(`${API_BASE}/${path}/`, fields),\n policy,\n );\n return decodeSuccess(resp.jsonBody, resp.httpStatus, resp.requestId);\n }\n\n /**\n * Set the callback URL where AudD will POST recognition events.\n *\n * @param url The URL to register.\n * @param opts.returnMetadata Optional metadata block list — appended as\n * `?return=...` to the URL. Raises `DuplicateReturnParameterError` if the\n * URL already contains a `?return=` parameter.\n */\n async setCallbackUrl(url: string, opts: SetCallbackUrlOptions = {}): Promise<void> {\n const finalUrl = addReturnToUrl(url, opts.returnMetadata);\n await this.post(\"setCallbackUrl\", { url: finalUrl }, this.mutatingPolicy);\n }\n\n /** Get the currently registered callback URL. */\n async getCallbackUrl(): Promise<string> {\n const result = await this.post(\"getCallbackUrl\", {}, this.readPolicy);\n return String(result);\n }\n\n /** Register a new stream for real-time recognition. */\n async add(opts: AddStreamOptions): Promise<void> {\n const fields: Record<string, string | undefined> = {\n url: opts.url,\n radio_id: String(opts.radioId),\n };\n if (opts.callbacks !== undefined) fields[\"callbacks\"] = opts.callbacks;\n await this.post(\"addStream\", fields, this.mutatingPolicy);\n }\n\n /** Update the upstream URL of an existing stream. */\n async setUrl(radioId: number, url: string): Promise<void> {\n await this.post(\n \"setStreamUrl\",\n { radio_id: String(radioId), url },\n this.mutatingPolicy,\n );\n }\n\n /** Delete an existing stream. */\n async delete(radioId: number): Promise<void> {\n await this.post(\"deleteStream\", { radio_id: String(radioId) }, this.mutatingPolicy);\n }\n\n /** List all streams on this account. */\n async list(): Promise<Stream[]> {\n const result = await this.post(\"getStreams\", {}, this.readPolicy);\n if (!Array.isArray(result)) return [];\n return result.map(parseStream);\n }\n\n /** Compute the 9-char longpoll category locally — pure, no network. */\n deriveLongpollCategory(radioId: number): string {\n return deriveLongpollCategory(this.apiToken, radioId);\n }\n\n /**\n * Parse a callback POST body into `{ match, notification }`. Pass an\n * already-parsed JSON value or a string. Exactly one field is non-null on\n * success. See {@link parseCallback} for details.\n */\n parseCallback(body: unknown): ParsedCallback {\n return parseCallback(body);\n }\n\n /**\n * Long-poll the AudD subscription endpoint.\n *\n * Two call shapes:\n *\n * - **Common case** — pass an options object with `radioId`; the SDK\n * derives the 9-char category locally from `(api_token, radio_id)`:\n * `longpoll({ radioId: 42 })`.\n * - **Tokenless / pre-derived category** — pass the category as a positional\n * string (`longpoll(\"abc123def\")`) or via the object form\n * (`longpoll({ category: \"abc123def\" })`). Useful when the category was\n * shared with you (e.g. a browser/mobile client running without the\n * api_token).\n *\n * Returns a {@link LongpollPoll} handle with three async-iterables —\n * `matches`, `notifications`, `errors` — that are filled by a background\n * loop. Iterate them independently or in parallel via `Promise.all([...])`.\n *\n * Before the first request the SDK runs a one-time `getCallbackUrl`\n * preflight: AudD silently discards events for accounts that haven't set a\n * callback URL, and the preflight surfaces that misconfiguration as an\n * actionable {@link AudDInvalidRequestError}. Pass `skipCallbackCheck: true`\n * to bypass.\n *\n * Throws {@link AudDInvalidRequestError} if the object form supplies both\n * `radioId` and `category`, or neither.\n */\n async longpoll(category: string, opts?: LongpollOptions): Promise<LongpollPoll>;\n async longpoll(\n opts: LongpollOptions & ({ radioId: number } | { category: string }),\n ): Promise<LongpollPoll>;\n async longpoll(\n arg1: string | (LongpollOptions & { radioId?: number; category?: string }),\n opts: LongpollOptions = {},\n ): Promise<LongpollPoll> {\n let category: string;\n let effectiveOpts: LongpollOptions;\n if (typeof arg1 === \"string\") {\n category = arg1;\n effectiveOpts = opts;\n } else {\n effectiveOpts = arg1;\n const hasRadioId = arg1.radioId !== undefined;\n const hasCategory = arg1.category !== undefined;\n if (hasRadioId && hasCategory) {\n throw new AudDInvalidRequestError({\n errorCode: 0,\n message:\n \"longpoll(): pass exactly one of `radioId` or `category` — got both.\",\n httpStatus: 0,\n });\n }\n if (!hasRadioId && !hasCategory) {\n throw new AudDInvalidRequestError({\n errorCode: 0,\n message:\n \"longpoll(): pass exactly one of `radioId` or `category` — got neither.\",\n httpStatus: 0,\n });\n }\n category = hasRadioId\n ? this.deriveLongpollCategory(arg1.radioId as number)\n : (arg1.category as string);\n }\n if (effectiveOpts.skipCallbackCheck !== true) {\n await this.preflightCallbackUrl();\n }\n const timeoutSec = effectiveOpts.timeout ?? 50;\n const httpClient = this.http;\n const readPolicy = this.readPolicy;\n return startLongpoll({\n category,\n timeout: timeoutSec,\n sinceTime: effectiveOpts.sinceTime,\n fetchOnce: (params, signal) =>\n runRetried(\n () => httpClient.get(`${API_BASE}/longpoll/`, params, { signal }),\n readPolicy,\n ),\n });\n }\n\n private async preflightCallbackUrl(): Promise<void> {\n try {\n await this.getCallbackUrl();\n } catch (err) {\n if (err instanceof AudDAPIError && err.errorCode === NO_CALLBACK_ERROR_CODE) {\n throw new AudDInvalidRequestError({\n errorCode: 0,\n message: PREFLIGHT_NO_CALLBACK_HINT,\n httpStatus: err.httpStatus,\n requestId: err.requestId,\n });\n }\n throw err;\n }\n }\n}\n","/**\n * Custom-catalog endpoint. NOT for music recognition — see method JSDoc.\n */\nimport {\n AudDConnectionError,\n AudDSerializationError,\n AudDServerError,\n raiseFromErrorResponse,\n} from \"./errors.js\";\nimport type { FormFieldValue, HttpClient, HttpResponse } from \"./http.js\";\nimport { retry, type RetryPolicy } from \"./retry.js\";\nimport { prepareSource, type Source } from \"./source.js\";\n\nconst UPLOAD_URL = \"https://api.audd.io/upload/\";\n\nexport interface CustomCatalogAddOptions {\n audioId: number;\n source: Source;\n}\n\nfunction decodeSuccess(body: unknown, httpStatus: number, requestId: string | null): void {\n if (typeof body !== \"object\" || body === null || Array.isArray(body)) {\n throw new AudDSerializationError(\"Unparseable response\");\n }\n const obj = body as Record<string, unknown> & { status?: unknown };\n if (obj.status === \"error\") {\n raiseFromErrorResponse(obj as Parameters<typeof raiseFromErrorResponse>[0], {\n httpStatus,\n requestId,\n customCatalogContext: true,\n });\n }\n if (obj.status !== \"success\") {\n throw new AudDServerError({\n errorCode: 0,\n message: `Unexpected status: ${JSON.stringify(obj.status)}`,\n httpStatus,\n requestId,\n rawResponse: obj,\n });\n }\n}\n\nasync function runRetried<T extends HttpResponse>(\n fn: () => Promise<T>,\n policy: RetryPolicy,\n): Promise<T> {\n try {\n return await retry(fn, policy);\n } catch (err) {\n if (err instanceof TypeError) {\n throw new AudDConnectionError(`Network error: ${err.message}`, err);\n }\n if (err !== null && typeof err === \"object\" && (err as { name?: string }).name === \"AbortError\") {\n throw new AudDConnectionError(\"Request was aborted (timeout)\", err);\n }\n throw err;\n }\n}\n\nexport class CustomCatalog {\n constructor(\n private readonly http: HttpClient,\n private readonly noRetryPolicy: RetryPolicy,\n ) {}\n\n /**\n * **This is NOT how you submit audio for music recognition.** For\n * recognition, use `audd.recognize()` (or `audd.recognizeEnterprise()` for\n * files longer than 25 seconds). This method adds a song to your\n * **private fingerprint catalog** so AudD's recognition can later identify\n * *your own* tracks for *your account only*. Requires special access —\n * contact api@audd.io if you need it enabled.\n *\n * Calling this again with the same `audioId` re-fingerprints that slot.\n * There is no public list/delete endpoint; track `audioId` ↔ song\n * mappings on your side.\n *\n * **No automatic retry.** Custom-catalog upload is metered, and a transport\n * failure could otherwise cause a silent re-upload that double-charges. Any\n * 5xx or pre-upload connection error surfaces as a clean exception — the\n * caller decides whether to retry.\n */\n async add(opts: CustomCatalogAddOptions): Promise<void> {\n const reopen = prepareSource(opts.source);\n const audioId = String(opts.audioId);\n\n const resp = await runRetried(async () => {\n const prepared = await reopen();\n const fields: Record<string, FormFieldValue> = { ...prepared.fields, audio_id: audioId };\n return this.http.postForm(UPLOAD_URL, fields);\n }, this.noRetryPolicy);\n\n decodeSuccess(resp.jsonBody, resp.httpStatus, resp.requestId);\n }\n}\n","/**\n * Advanced namespace — lyrics search + raw escape hatch.\n *\n * Reach this only via `audd.advanced.*` — deliberately not on the main\n * client surface.\n */\nimport {\n AudDConnectionError,\n AudDSerializationError,\n raiseFromErrorResponse,\n} from \"./errors.js\";\nimport type { FormFieldValue, HttpClient, HttpResponse } from \"./http.js\";\nimport { parseLyricsResult, type LyricsResult } from \"./models.js\";\nimport { retry, type RetryPolicy } from \"./retry.js\";\n\nconst API_BASE = \"https://api.audd.io\";\n\nasync function runRetried<T extends HttpResponse>(\n fn: () => Promise<T>,\n policy: RetryPolicy,\n): Promise<T> {\n try {\n return await retry(fn, policy);\n } catch (err) {\n if (err instanceof TypeError) {\n throw new AudDConnectionError(`Network error: ${err.message}`, err);\n }\n if (err !== null && typeof err === \"object\" && (err as { name?: string }).name === \"AbortError\") {\n throw new AudDConnectionError(\"Request was aborted (timeout)\", err);\n }\n throw err;\n }\n}\n\nexport class Advanced {\n /**\n * @param recognitionPolicy The findLyrics endpoint is metered and shouldn't\n * double-bill on post-upload read timeout: Advanced uses RECOGNITION retry\n * policy, not READ.\n */\n constructor(\n private readonly http: HttpClient,\n private readonly recognitionPolicy: RetryPolicy,\n ) {}\n\n /** Find lyrics by free-text query. Returns a list of matches (possibly empty). */\n async findLyrics(query: string): Promise<LyricsResult[]> {\n const body = await this.rawRequest(\"findLyrics\", { q: query });\n if (body[\"status\"] === \"error\") {\n raiseFromErrorResponse(body as Parameters<typeof raiseFromErrorResponse>[0], {\n httpStatus: 200,\n requestId: null,\n });\n }\n const result = body[\"result\"];\n if (!Array.isArray(result)) return [];\n return result.map(parseLyricsResult);\n }\n\n /**\n * Hit any AudD endpoint by method name and return the raw JSON object.\n * Useful for endpoints not yet wrapped by typed methods on this SDK.\n */\n async rawRequest(\n method: string,\n params: Record<string, string | number | boolean | undefined> = {},\n ): Promise<Record<string, unknown>> {\n const fields: Record<string, FormFieldValue> = {};\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined) continue;\n fields[k] = String(v);\n }\n\n const resp = await runRetried(\n () => this.http.postForm(`${API_BASE}/${method}/`, fields),\n this.recognitionPolicy,\n );\n const body = resp.jsonBody;\n if (typeof body !== \"object\" || body === null || Array.isArray(body)) {\n throw new AudDSerializationError(\"Unparseable response\", resp.rawText);\n }\n return body as Record<string, unknown>;\n }\n}\n","/** Top-level AudD client. */\nimport {\n AudDConnectionError,\n AudDSerializationError,\n AudDServerError,\n raiseFromErrorResponse,\n} from \"./errors.js\";\nimport {\n ENTERPRISE_TIMEOUT_MS,\n HttpClient,\n type FetchLike,\n type FormFieldValue,\n type HttpResponse,\n} from \"./http.js\";\nimport {\n parseEnterpriseChunkResult,\n parseRecognitionResult,\n type EnterpriseMatch,\n type RecognitionResult,\n} from \"./models.js\";\nimport {\n defaultPolicy,\n retry,\n type RetryClass,\n type RetryPolicy,\n} from \"./retry.js\";\nimport { prepareSource, type Source } from \"./source.js\";\nimport { Streams } from \"./streams.js\";\nimport { CustomCatalog } from \"./customCatalog.js\";\nimport { Advanced } from \"./advanced.js\";\n\nconst API_BASE = \"https://api.audd.io\";\nconst ENTERPRISE_BASE = \"https://enterprise.audd.io\";\n\n/** Server-side soft-deprecation code. */\nconst DEPRECATED_PARAMS_CODE = 51;\nconst HTTP_CLIENT_ERROR_FLOOR = 400;\nconst TOKEN_ENV_VAR = \"AUDD_API_TOKEN\";\n\n/**\n * Inspection event kinds emitted by the SDK request lifecycle.\n * Hooks receive these via the `onEvent` callback.\n */\nexport type AudDEventKind = \"request\" | \"response\" | \"exception\";\n\n/**\n * Inspection event emitted by the SDK request lifecycle.\n * Frozen, plain-data; never includes the api_token or request body bytes.\n */\nexport interface AudDEvent {\n kind: AudDEventKind;\n /** AudD method name, e.g. \"recognize\", \"addStream\". */\n method: string;\n url: string;\n requestId: string | null;\n httpStatus: number | null;\n elapsedMs: number | null;\n errorCode: number | null;\n extras: Record<string, unknown>;\n}\n\nexport type OnEventHook = (event: AudDEvent) => void;\n\nfunction safeEmit(hook: OnEventHook | undefined, event: AudDEvent): void {\n if (hook === undefined) return;\n try {\n hook(event);\n } catch {\n // Observability hooks must never break the request path.\n }\n}\n\nfunction resolveToken(apiToken: string | undefined): string {\n if (apiToken !== undefined && apiToken !== \"\") return apiToken;\n const env = (typeof process !== \"undefined\" ? process.env[TOKEN_ENV_VAR] : undefined) ?? \"\";\n if (env !== \"\") return env;\n throw new Error(\n `AudD apiToken not supplied and ${TOKEN_ENV_VAR} env var is unset. ` +\n \"Get a token at https://dashboard.audd.io and pass it as \" +\n \"new AudD(\\\"<token>\\\") (or new AudD({ apiToken: \\\"<token>\\\" })), \" +\n \"or set AUDD_API_TOKEN.\",\n );\n}\n\nexport interface AudDOptions {\n /** Required, but may be omitted if `AUDD_API_TOKEN` is in the environment. */\n apiToken?: string;\n /** Maximum retry attempts (default 3). */\n maxRetries?: number;\n /** Initial backoff in ms (default 500), jittered, exponential. */\n backoffFactorMs?: number;\n /** Custom fetch (e.g., for proxy/mTLS). */\n fetch?: FetchLike;\n /** Inspection hook (see {@link AudDEvent}). Off by default. */\n onEvent?: OnEventHook;\n}\n\nexport type ReturnMetadata =\n | \"apple_music\"\n | \"spotify\"\n | \"deezer\"\n | \"napster\"\n | \"musicbrainz\"\n | string;\n\nexport interface RecognizeOptions {\n return?: ReturnMetadata | ReturnMetadata[];\n market?: string;\n /** Per-call timeout in ms; overrides the client default. */\n timeoutMs?: number;\n /**\n * User-supplied AbortSignal for cancellation.\n *\n * **Note:** cancellation aborts the local request. The server may have\n * already done metered work and the credit is consumed regardless.\n */\n signal?: AbortSignal;\n}\n\nexport interface RecognizeEnterpriseOptions {\n return?: ReturnMetadata | ReturnMetadata[];\n skip?: number;\n every?: number;\n limit?: number;\n skipFirstSeconds?: number;\n useTimecode?: boolean;\n accurateOffsets?: boolean;\n timeoutMs?: number;\n /**\n * User-supplied AbortSignal for cancellation. See {@link RecognizeOptions.signal}.\n * For multi-hour enterprise calls, this is the right way to cancel.\n */\n signal?: AbortSignal;\n}\n\nfunction formatReturn(value: ReturnMetadata | ReturnMetadata[] | undefined): string | undefined {\n if (value === undefined) return undefined;\n return Array.isArray(value) ? value.join(\",\") : value;\n}\n\nfunction buildEnterpriseFields(opts: RecognizeEnterpriseOptions): Record<string, string> {\n const fields: Record<string, string> = {};\n const ret = formatReturn(opts.return);\n if (ret !== undefined) fields[\"return\"] = ret;\n if (opts.skip !== undefined) fields[\"skip\"] = String(opts.skip);\n if (opts.every !== undefined) fields[\"every\"] = String(opts.every);\n if (opts.limit !== undefined) fields[\"limit\"] = String(opts.limit);\n if (opts.skipFirstSeconds !== undefined)\n fields[\"skip_first_seconds\"] = String(opts.skipFirstSeconds);\n if (opts.useTimecode !== undefined) fields[\"use_timecode\"] = opts.useTimecode ? \"true\" : \"false\";\n if (opts.accurateOffsets !== undefined)\n fields[\"accurate_offsets\"] = opts.accurateOffsets ? \"true\" : \"false\";\n return fields;\n}\n\ninterface MaybeError {\n status?: unknown;\n error?: { error_code?: number; error_message?: string } | undefined;\n result?: unknown;\n}\n\nfunction isDeprecationPassThrough(body: MaybeError): boolean {\n return body.error?.error_code === DEPRECATED_PARAMS_CODE && body.result != null;\n}\n\nfunction maybeWarnAndStrip(body: MaybeError): void {\n if (!isDeprecationPassThrough(body)) return;\n const msg = body.error?.error_message ?? \"Deprecated parameter used\";\n // Mirror audd-python behaviour: emit a warning, then look like a success.\n console.warn(`audd: deprecated parameter — ${msg}`);\n delete body.error;\n body.status = \"success\";\n}\n\n/**\n * Inspect a response, raise typed errors for obvious failures, else return\n * the body dict. Mirror of `audd-python` `_decode_or_raise`.\n *\n * Distinguishes:\n * - non-2xx HTTP with non-JSON body → AudDServerError (preserves status)\n * - 2xx with non-JSON body → AudDSerializationError\n * - status=error with code-51 + result → emit warning, strip, fall through\n * - status=error otherwise → raise typed exception\n * - status=success or stripped → return body\n */\nexport function decodeOrRaise(resp: HttpResponse): Record<string, unknown> {\n const body = resp.jsonBody;\n if (typeof body !== \"object\" || body === null || Array.isArray(body)) {\n if (resp.httpStatus >= HTTP_CLIENT_ERROR_FLOOR) {\n throw new AudDServerError({\n errorCode: 0,\n message: `HTTP ${String(resp.httpStatus)} with non-JSON response body`,\n httpStatus: resp.httpStatus,\n requestId: resp.requestId,\n rawResponse: resp.rawText,\n });\n }\n throw new AudDSerializationError(\"Unparseable response\", resp.rawText);\n }\n const obj = body as Record<string, unknown> & MaybeError;\n maybeWarnAndStrip(obj);\n\n if (obj.status === \"error\") {\n raiseFromErrorResponse(obj, {\n httpStatus: resp.httpStatus,\n requestId: resp.requestId,\n });\n }\n if (obj.status === \"success\") {\n return obj;\n }\n throw new AudDServerError({\n errorCode: 0,\n message: `Unexpected response status: ${JSON.stringify(obj.status)}`,\n httpStatus: resp.httpStatus,\n requestId: resp.requestId,\n rawResponse: obj,\n });\n}\n\nfunction decodeRecognize(resp: HttpResponse): RecognitionResult | null {\n const body = decodeOrRaise(resp);\n const result = body[\"result\"];\n if (result == null) return null;\n return parseRecognitionResult(result);\n}\n\nfunction decodeEnterprise(resp: HttpResponse): EnterpriseMatch[] {\n const body = decodeOrRaise(resp);\n const chunks = body[\"result\"];\n if (!Array.isArray(chunks)) return [];\n const out: EnterpriseMatch[] = [];\n for (const c of chunks) {\n const chunk = parseEnterpriseChunkResult(c);\n out.push(...chunk.songs);\n }\n return out;\n}\n\nasync function runRetried<T extends HttpResponse>(\n fn: () => Promise<T>,\n policy: RetryPolicy,\n): Promise<T> {\n try {\n return await retry(fn, policy);\n } catch (err) {\n if (err instanceof TypeError) {\n throw new AudDConnectionError(`Network error: ${err.message}`, err);\n }\n if (err !== null && typeof err === \"object\" && (err as { name?: string }).name === \"AbortError\") {\n throw new AudDConnectionError(\"Request was aborted (timeout)\", err);\n }\n throw err;\n }\n}\n\n/**\n * The AudD client. Async-only — every method returns a `Promise`.\n *\n * ```ts\n * const audd = new AudD({ apiToken: \"test\" });\n * const result = await audd.recognize(\"https://audd.tech/example.mp3\");\n * ```\n *\n * Closes underlying resources via `close()` (or `[Symbol.asyncDispose]` if\n * the runtime supports explicit-resource-management).\n */\nexport class AudD {\n private readonly _http: HttpClient;\n private readonly _enterpriseHttp: HttpClient;\n private readonly _maxRetries: number;\n private readonly _backoffFactorMs: number;\n private _apiToken: string;\n private _onEvent: OnEventHook | undefined;\n private _streams: Streams | undefined;\n private _customCatalog: CustomCatalog | undefined;\n private _advanced: Advanced | undefined;\n\n /** Construct with just an api_token. Falls back to AUDD_API_TOKEN env var if omitted. */\n constructor(apiToken?: string);\n /** Construct with an api_token and additional options (timeouts, retries, custom fetch, onEvent hook). */\n constructor(apiToken: string, opts: Omit<AudDOptions, \"apiToken\">);\n /** Construct with an options object (any combination of apiToken + extras). */\n constructor(opts: AudDOptions);\n constructor(arg?: string | AudDOptions, extra?: Omit<AudDOptions, \"apiToken\">) {\n const opts: AudDOptions =\n typeof arg === \"string\"\n ? { apiToken: arg, ...(extra ?? {}) }\n : (arg ?? {});\n const token = resolveToken(opts.apiToken);\n this._apiToken = token;\n this._onEvent = opts.onEvent;\n this._maxRetries = opts.maxRetries ?? 3;\n this._backoffFactorMs = (opts.backoffFactorMs ?? 500);\n this._http = new HttpClient({\n apiToken: token,\n ...(opts.fetch !== undefined ? { fetch: opts.fetch } : {}),\n });\n this._enterpriseHttp = new HttpClient({\n apiToken: token,\n ...(opts.fetch !== undefined ? { fetch: opts.fetch } : {}),\n defaultTimeoutMs: ENTERPRISE_TIMEOUT_MS,\n });\n }\n\n /** Current api_token. Returns the in-effect token after any rotations. */\n get apiToken(): string {\n return this._apiToken;\n }\n\n /**\n * Rotate the api_token used for subsequent requests. In-flight requests\n * continue with the old token (no abort).\n */\n setApiToken(newToken: string): void {\n if (typeof newToken !== \"string\" || newToken === \"\") {\n throw new Error(\"setApiToken requires a non-empty string\");\n }\n this._apiToken = newToken;\n this._http.setApiToken(newToken);\n this._enterpriseHttp.setApiToken(newToken);\n // Streams namespace caches the token via a getter; nothing to flush there.\n }\n\n private policyFor(retryClass: RetryClass): RetryPolicy {\n return {\n ...defaultPolicy(retryClass),\n maxAttempts: this._maxRetries,\n backoffFactorMs: this._backoffFactorMs,\n };\n }\n\n /** Sub-namespace for stream management + longpoll. Lazy-instantiated. */\n get streams(): Streams {\n if (this._streams === undefined) {\n this._streams = new Streams(\n this._http,\n this.policyFor(\"read\"),\n this.policyFor(\"mutating\"),\n this._apiToken,\n );\n }\n return this._streams;\n }\n\n /** Sub-namespace for the private fingerprint catalog. NOT for recognition. */\n get customCatalog(): CustomCatalog {\n if (this._customCatalog === undefined) {\n // \"none\" — custom-catalog upload is metered; never retry on transport\n // failure (could double-charge). Surface a clean error instead.\n this._customCatalog = new CustomCatalog(this._http, this.policyFor(\"none\"));\n }\n return this._customCatalog;\n }\n\n /** Lyrics search + raw-request escape hatch. */\n get advanced(): Advanced {\n if (this._advanced === undefined) {\n // RECOGNITION policy: findLyrics is metered.\n this._advanced = new Advanced(this._http, this.policyFor(\"recognition\"));\n }\n return this._advanced;\n }\n\n /**\n * Recognize a short audio clip (≤25s) from a URL, file path, Blob, or bytes.\n *\n * Returns `null` when the server returns `status=success` with `result=null`\n * (no match) — distinct from a thrown error.\n */\n async recognize(source: Source, opts: RecognizeOptions = {}): Promise<RecognitionResult | null> {\n const reopen = prepareSource(source);\n const ret = formatReturn(opts.return);\n const market = opts.market;\n\n const policy = this.policyFor(\"recognition\");\n const url = `${API_BASE}/`;\n const startedAt = Date.now();\n safeEmit(this._onEvent, {\n kind: \"request\", method: \"recognize\", url,\n requestId: null, httpStatus: null, elapsedMs: null, errorCode: null, extras: {},\n });\n\n let resp;\n try {\n resp = await runRetried(async () => {\n const prepared = await reopen();\n const fields: Record<string, FormFieldValue> = { ...prepared.fields };\n if (ret !== undefined) fields[\"return\"] = ret;\n if (market !== undefined) fields[\"market\"] = market;\n return this._http.postForm(url, fields, {\n ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}),\n ...(opts.signal !== undefined ? { signal: opts.signal } : {}),\n });\n }, policy);\n } catch (err) {\n safeEmit(this._onEvent, {\n kind: \"exception\", method: \"recognize\", url,\n requestId: null, httpStatus: null,\n elapsedMs: Date.now() - startedAt, errorCode: null,\n extras: { name: (err instanceof Error ? err.name : String(err)) },\n });\n throw err;\n }\n safeEmit(this._onEvent, {\n kind: \"response\", method: \"recognize\", url,\n requestId: resp.requestId, httpStatus: resp.httpStatus,\n elapsedMs: Date.now() - startedAt, errorCode: null, extras: {},\n });\n\n return decodeRecognize(resp);\n }\n\n /**\n * Enterprise recognition (long files). Returns a flat array of matches\n * across all chunks in the upstream response.\n *\n * Recommended: pass `limit: N` to cap result count when developing.\n */\n async recognizeEnterprise(\n source: Source,\n opts: RecognizeEnterpriseOptions = {},\n ): Promise<EnterpriseMatch[]> {\n const reopen = prepareSource(source);\n const extra = buildEnterpriseFields(opts);\n\n const policy = this.policyFor(\"recognition\");\n const resp = await runRetried(async () => {\n const prepared = await reopen();\n const fields: Record<string, FormFieldValue> = { ...prepared.fields, ...extra };\n return this._enterpriseHttp.postForm(`${ENTERPRISE_BASE}/`, fields, {\n ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}),\n ...(opts.signal !== undefined ? { signal: opts.signal } : {}),\n });\n }, policy);\n\n return decodeEnterprise(resp);\n }\n\n /** Release any underlying resources. (Currently a no-op for `fetch`-based transport.) */\n close(): void {\n /* fetch has no persistent connection pool to close */\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n this.close();\n await Promise.resolve();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/errors.ts","../src/userAgent.ts","../src/http.ts","../src/models.ts","../src/retry.ts","../src/source.ts","../src/helpers.ts","../src/longpollCore.ts","../src/streams.ts","../src/customCatalog.ts","../src/advanced.ts","../src/client.ts"],"names":["fsPromises","path","decodeSuccess","runRetried","API_BASE","HTTP_CLIENT_ERROR_FLOOR"],"mappings":"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","file":"index.js","sourcesContent":["export const VERSION = \"1.5.8\";\n","/** Exception hierarchy for AudD API errors. */\n\nexport interface AudDApiErrorFields {\n errorCode: number;\n message: string;\n httpStatus: number;\n requestId: string | null;\n requestedParams: Record<string, unknown>;\n requestMethod: string | null;\n brandedMessage: string | null;\n rawResponse: unknown;\n}\n\nexport type AudDApiErrorInit = Partial<AudDApiErrorFields> &\n Pick<AudDApiErrorFields, \"errorCode\" | \"message\" | \"httpStatus\">;\n\n/** Base for everything thrown by this SDK. */\nexport class AudDError extends Error {\n override name = \"AudDError\";\n}\n\n/** Server returned `status: error`. Carries the AudD error code + the full echo. */\nexport class AudDAPIError extends AudDError {\n override name = \"AudDAPIError\";\n errorCode: number;\n httpStatus: number;\n requestId: string | null;\n requestedParams: Record<string, unknown>;\n requestMethod: string | null;\n brandedMessage: string | null;\n rawResponse: unknown;\n /** Original `error_message` from the server. (`Error.message` may be overridden by subclasses.) */\n serverMessage: string;\n\n constructor(init: AudDApiErrorInit) {\n super(`[#${init.errorCode}] ${init.message}`);\n this.errorCode = init.errorCode;\n this.serverMessage = init.message;\n this.httpStatus = init.httpStatus;\n this.requestId = init.requestId ?? null;\n this.requestedParams = init.requestedParams ?? {};\n this.requestMethod = init.requestMethod ?? null;\n this.brandedMessage = init.brandedMessage ?? null;\n this.rawResponse = init.rawResponse ?? null;\n }\n}\n\nexport class AudDAuthenticationError extends AudDAPIError {\n override name = \"AudDAuthenticationError\";\n}\nexport class AudDQuotaError extends AudDAPIError {\n override name = \"AudDQuotaError\";\n}\nexport class AudDSubscriptionError extends AudDAPIError {\n override name = \"AudDSubscriptionError\";\n}\nexport class AudDCustomCatalogAccessError extends AudDSubscriptionError {\n override name = \"AudDCustomCatalogAccessError\";\n}\nexport class AudDInvalidRequestError extends AudDAPIError {\n override name = \"AudDInvalidRequestError\";\n}\nexport class AudDInvalidAudioError extends AudDAPIError {\n override name = \"AudDInvalidAudioError\";\n}\nexport class AudDRateLimitError extends AudDAPIError {\n override name = \"AudDRateLimitError\";\n}\nexport class AudDStreamLimitError extends AudDAPIError {\n override name = \"AudDStreamLimitError\";\n}\nexport class AudDNotReleasedError extends AudDAPIError {\n override name = \"AudDNotReleasedError\";\n}\nexport class AudDBlockedError extends AudDAPIError {\n override name = \"AudDBlockedError\";\n}\nexport class AudDNeedsUpdateError extends AudDAPIError {\n override name = \"AudDNeedsUpdateError\";\n}\nexport class AudDServerError extends AudDAPIError {\n override name = \"AudDServerError\";\n}\n\nexport class AudDConnectionError extends AudDError {\n override name = \"AudDConnectionError\";\n override cause?: unknown;\n constructor(message: string, cause?: unknown) {\n super(message);\n this.cause = cause;\n }\n}\n\nexport class AudDSerializationError extends AudDError {\n override name = \"AudDSerializationError\";\n rawText: string;\n constructor(message: string, rawText = \"\") {\n super(message);\n this.rawText = rawText;\n }\n}\n\nexport type AudDAPIErrorCtor = new (init: AudDApiErrorInit) => AudDAPIError;\n\nconst CODE_MAP: Record<number, AudDAPIErrorCtor> = {\n 900: AudDAuthenticationError,\n 901: AudDAuthenticationError,\n 903: AudDAuthenticationError,\n 902: AudDQuotaError,\n 904: AudDSubscriptionError,\n 905: AudDSubscriptionError,\n 50: AudDInvalidRequestError,\n 51: AudDInvalidRequestError,\n 600: AudDInvalidRequestError,\n 601: AudDInvalidRequestError,\n 602: AudDInvalidRequestError,\n 700: AudDInvalidRequestError,\n 701: AudDInvalidRequestError,\n 702: AudDInvalidRequestError,\n 906: AudDInvalidRequestError,\n 300: AudDInvalidAudioError,\n 400: AudDInvalidAudioError,\n 500: AudDInvalidAudioError,\n 610: AudDStreamLimitError,\n 611: AudDRateLimitError,\n 907: AudDNotReleasedError,\n 19: AudDBlockedError,\n 31337: AudDBlockedError,\n 20: AudDNeedsUpdateError,\n 100: AudDServerError,\n 1000: AudDServerError,\n};\n\nexport function errorClassForCode(code: number): AudDAPIErrorCtor {\n return CODE_MAP[code] ?? AudDServerError;\n}\n\nfunction brandedMessageOf(result: unknown): string | null {\n if (typeof result !== \"object\" || result === null) return null;\n const r = result as { artist?: unknown; title?: unknown };\n const parts: string[] = [];\n if (typeof r.artist === \"string\" && r.artist.length > 0) parts.push(r.artist);\n if (typeof r.title === \"string\" && r.title.length > 0) parts.push(r.title);\n return parts.length === 0 ? null : parts.join(\" — \");\n}\n\nexport interface ServerErrorBody {\n error?: { error_code?: number | undefined; error_message?: string | undefined } | undefined;\n result?: unknown;\n request_params?: Record<string, unknown> | undefined;\n requested_params?: Record<string, unknown> | undefined;\n request_api_method?: string | undefined;\n}\n\nexport interface RaiseFromErrorOpts {\n httpStatus: number;\n requestId: string | null;\n customCatalogContext?: boolean;\n}\n\nconst CUSTOM_CATALOG_PREFIX =\n \"Adding songs to your custom catalog requires enterprise access that isn't enabled on your account.\\n\\n\" +\n \"Note: the custom-catalog endpoint is for adding songs to your private fingerprint database, not for music recognition. \" +\n \"If you intended to identify music, use recognize(...) (or recognizeEnterprise(...) for files longer than 25 seconds) instead.\\n\\n\" +\n \"To request custom-catalog access, contact api@audd.io.\\n\\n\";\n\nexport function raiseFromErrorResponse(body: ServerErrorBody, opts: RaiseFromErrorOpts): never {\n const code = body.error?.error_code ?? 0;\n const message = body.error?.error_message ?? \"\";\n const requestedParams = body.request_params ?? body.requested_params ?? {};\n const requestMethod = body.request_api_method ?? null;\n const branded = brandedMessageOf(body.result);\n\n const fields: AudDApiErrorFields = {\n errorCode: code,\n message,\n httpStatus: opts.httpStatus,\n requestId: opts.requestId,\n requestedParams,\n requestMethod,\n brandedMessage: branded,\n rawResponse: body,\n };\n\n const Cls = errorClassForCode(code);\n if (opts.customCatalogContext === true && Cls === AudDSubscriptionError) {\n const overridden = `${CUSTOM_CATALOG_PREFIX}[Server message: ${message}]`;\n throw new AudDCustomCatalogAccessError({ ...fields, message: overridden });\n }\n throw new Cls(fields);\n}\n","import { VERSION } from \"./version.js\";\n\nexport function userAgent(): string {\n const node =\n typeof process !== \"undefined\" && process.version\n ? process.version.replace(/^v/, \"\")\n : \"unknown\";\n const platform =\n typeof process !== \"undefined\" && process.platform ? process.platform : \"browser\";\n return `audd-node/${VERSION} node/${node} (${platform})`;\n}\n","import { userAgent } from \"./userAgent.js\";\n\nexport interface HttpResponse {\n jsonBody: unknown;\n httpStatus: number;\n requestId: string | null;\n rawText: string;\n}\n\nexport type FetchLike = typeof globalThis.fetch;\n\nexport interface HttpClientOptions {\n apiToken: string;\n fetch?: FetchLike;\n /** Per-call timeout in ms. Defaults: 60_000 standard, 3_600_000 enterprise. */\n defaultTimeoutMs?: number;\n}\n\nexport const STANDARD_TIMEOUT_MS = 60_000;\nexport const ENTERPRISE_TIMEOUT_MS = 3_600_000;\n\n/**\n * Form-data field value. Strings go through directly; Blob carries binary\n * payloads with a filename when constructed via `new File()`.\n */\nexport type FormFieldValue = string | Blob | undefined;\n\nexport class HttpClient {\n private apiToken: string;\n private readonly fetchImpl: FetchLike;\n private readonly defaultTimeoutMs: number;\n\n constructor(opts: HttpClientOptions) {\n this.apiToken = opts.apiToken;\n this.fetchImpl = opts.fetch ?? ((globalThis.fetch as FetchLike).bind(globalThis));\n this.defaultTimeoutMs = opts.defaultTimeoutMs ?? STANDARD_TIMEOUT_MS;\n }\n\n /** Atomically swap the token used for subsequent requests. */\n setApiToken(newToken: string): void {\n this.apiToken = newToken;\n }\n\n async postForm(\n url: string,\n fields: Record<string, FormFieldValue>,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n ): Promise<HttpResponse> {\n const form = new FormData();\n form.set(\"api_token\", this.apiToken);\n for (const [k, v] of Object.entries(fields)) {\n if (v === undefined) continue;\n form.set(k, v);\n }\n return this.send(url, { method: \"POST\", body: form }, opts);\n }\n\n async get(\n url: string,\n params: Record<string, string | undefined>,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n ): Promise<HttpResponse> {\n const u = new URL(url);\n if (!u.searchParams.has(\"api_token\")) u.searchParams.set(\"api_token\", this.apiToken);\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined) continue;\n u.searchParams.set(k, v);\n }\n return this.send(u.toString(), { method: \"GET\" }, opts);\n }\n\n private async send(\n url: string,\n init: RequestInit,\n { timeoutMs, signal: userSignal }: { timeoutMs?: number; signal?: AbortSignal },\n ): Promise<HttpResponse> {\n const controller = new AbortController();\n const timer = setTimeout(() => {\n controller.abort();\n }, timeoutMs ?? this.defaultTimeoutMs);\n // If user passed a signal, abort our controller when theirs fires.\n const userAbortHandler = (): void => controller.abort();\n if (userSignal !== undefined) {\n if (userSignal.aborted) {\n controller.abort();\n } else {\n userSignal.addEventListener(\"abort\", userAbortHandler, { once: true });\n }\n }\n try {\n const headers = new Headers(init.headers);\n headers.set(\"User-Agent\", userAgent());\n const response = await this.fetchImpl(url, {\n ...init,\n headers,\n signal: controller.signal,\n });\n const text = await response.text();\n let json: unknown = null;\n if (text !== \"\") {\n try {\n json = JSON.parse(text);\n } catch {\n json = null;\n }\n }\n return {\n jsonBody: json,\n httpStatus: response.status,\n requestId: response.headers.get(\"x-request-id\"),\n rawText: text,\n };\n } finally {\n clearTimeout(timer);\n if (userSignal !== undefined) {\n userSignal.removeEventListener(\"abort\", userAbortHandler);\n }\n }\n }\n}\n","/**\n * Typed models. Forward-compatible: each model captures unknown keys into\n * `extras`, mirroring audd-python's Pydantic `extra=\"allow\"` pattern.\n */\n\nfunction pickExtras(\n raw: Record<string, unknown>,\n knownKeys: ReadonlyArray<string>,\n): Record<string, unknown> {\n const known = new Set(knownKeys);\n const extras: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (!known.has(k)) extras[k] = v;\n }\n return extras;\n}\n\nfunction asObject(raw: unknown): Record<string, unknown> | undefined {\n if (typeof raw === \"object\" && raw !== null && !Array.isArray(raw)) {\n return raw as Record<string, unknown>;\n }\n return undefined;\n}\n\nfunction requireObject(raw: unknown, what: string): Record<string, unknown> {\n const o = asObject(raw);\n if (o === undefined) throw new TypeError(`${what}: expected object`);\n return o;\n}\n\nfunction asString(v: unknown): string | undefined {\n return typeof v === \"string\" ? v : undefined;\n}\nfunction asNumber(v: unknown): number | undefined {\n return typeof v === \"number\" ? v : undefined;\n}\nfunction asBoolean(v: unknown): boolean | undefined {\n return typeof v === \"boolean\" ? v : undefined;\n}\n\n/** Streaming providers supported by the lis.tn redirect helper. */\nexport type StreamingProvider =\n | \"spotify\"\n | \"apple_music\"\n | \"deezer\"\n | \"napster\"\n | \"youtube\";\n\nconst STREAMING_PROVIDERS: readonly StreamingProvider[] = [\n \"spotify\",\n \"apple_music\",\n \"deezer\",\n \"napster\",\n \"youtube\",\n] as const;\n\nfunction lisTnStreamingUrl(songLink: string | undefined, provider: string): string | null {\n if (songLink === undefined || songLink === \"\") return null;\n let parsed: URL;\n try {\n parsed = new URL(songLink);\n } catch {\n return null;\n }\n if (parsed.hostname !== \"lis.tn\") return null;\n const sep = parsed.search ? \"&\" : \"?\";\n return `${songLink}${sep}${provider}`;\n}\n\nexport interface RecognitionResult {\n /** Always present on a match. */\n timecode: string;\n /** Set on custom-catalog matches. */\n audioId?: number | undefined;\n artist?: string | undefined;\n title?: string | undefined;\n album?: string | undefined;\n releaseDate?: string | undefined;\n label?: string | undefined;\n songLink?: string | undefined;\n isrc?: string | undefined;\n upc?: string | undefined;\n appleMusic?: Record<string, unknown> | undefined;\n spotify?: Record<string, unknown> | undefined;\n deezer?: Record<string, unknown> | undefined;\n napster?: Record<string, unknown> | undefined;\n musicbrainz?: ReadonlyArray<Record<string, unknown>> | undefined;\n /** Forward-compat: any unknown keys from the server. */\n extras: Record<string, unknown>;\n /** Full unparsed payload for the caller's own inspection. */\n rawResponse: Record<string, unknown>;\n /** True when `audioId` is set (custom-catalog match). */\n readonly isCustomMatch: boolean;\n /** True when `audioId` is unset and `artist` or `title` are present. */\n readonly isPublicMatch: boolean;\n /** Cover-art URL for `lis.tn`-hosted song_links, else `null`. */\n readonly thumbnailUrl: string | null;\n /**\n * Direct or redirect URL for a streaming provider, with smart fallback.\n *\n * Resolution order:\n * 1. Direct URL from the metadata block (e.g. `apple_music.url`,\n * `spotify.external_urls.spotify`, `deezer.link`, `napster.href`) when\n * the user requested that provider via `return=`.\n * 2. lis.tn redirect (`{songLink}?{provider}`) when `songLink` is on lis.tn.\n * 3. `null` otherwise. YouTube has only the lis.tn-redirect path.\n */\n streamingUrl(provider: StreamingProvider): string | null;\n /** Map of every provider with a resolvable URL — direct or via lis.tn redirect. */\n streamingUrls(): Partial<Record<StreamingProvider, string>>;\n /**\n * First available 30-second preview URL across providers, in priority order:\n * `apple_music.previews[0].url` → `spotify.preview_url` → `deezer.preview`.\n *\n * **Note:** previews are governed by the respective providers' terms of use.\n * The SDK consumer is responsible for honoring those terms (caching limits,\n * attribution, redistribution constraints).\n */\n previewUrl(): string | null;\n}\n\nfunction directStreamingUrl(\n result: Pick<RecognitionResult, \"appleMusic\" | \"spotify\" | \"deezer\" | \"napster\">,\n provider: string,\n): string | null {\n if (provider === \"apple_music\" && result.appleMusic !== undefined) {\n const url = result.appleMusic[\"url\"];\n if (typeof url === \"string\" && url.length > 0) return url;\n } else if (provider === \"spotify\" && result.spotify !== undefined) {\n const ext = result.spotify[\"external_urls\"];\n if (typeof ext === \"object\" && ext !== null) {\n const sp = (ext as Record<string, unknown>)[\"spotify\"];\n if (typeof sp === \"string\" && sp.length > 0) return sp;\n }\n const uri = result.spotify[\"uri\"];\n if (typeof uri === \"string\" && uri.length > 0) return uri;\n } else if (provider === \"deezer\" && result.deezer !== undefined) {\n const link = result.deezer[\"link\"];\n if (typeof link === \"string\" && link.length > 0) return link;\n } else if (provider === \"napster\" && result.napster !== undefined) {\n const href = result.napster[\"href\"];\n if (typeof href === \"string\" && href.length > 0) return href;\n }\n return null;\n}\n\nfunction previewFrom(result: Pick<RecognitionResult, \"appleMusic\" | \"spotify\" | \"deezer\">): string | null {\n if (result.appleMusic !== undefined) {\n const previews = result.appleMusic[\"previews\"];\n if (Array.isArray(previews) && previews.length > 0) {\n const first = previews[0];\n if (typeof first === \"object\" && first !== null) {\n const url = (first as Record<string, unknown>)[\"url\"];\n if (typeof url === \"string\" && url.length > 0) return url;\n }\n }\n }\n if (result.spotify !== undefined) {\n const url = result.spotify[\"preview_url\"];\n if (typeof url === \"string\" && url.length > 0) return url;\n }\n if (result.deezer !== undefined) {\n const url = result.deezer[\"preview\"];\n if (typeof url === \"string\" && url.length > 0) return url;\n }\n return null;\n}\n\nconst RECOGNITION_KEYS = [\n \"timecode\",\n \"audio_id\",\n \"artist\",\n \"title\",\n \"album\",\n \"release_date\",\n \"label\",\n \"song_link\",\n \"isrc\",\n \"upc\",\n \"apple_music\",\n \"spotify\",\n \"deezer\",\n \"napster\",\n \"musicbrainz\",\n] as const;\n\nexport function parseRecognitionResult(raw: unknown): RecognitionResult {\n const r = requireObject(raw, \"RecognitionResult\");\n const timecode = asString(r.timecode);\n if (timecode === undefined) {\n throw new TypeError(\"RecognitionResult: timecode missing or not string\");\n }\n const audioId = asNumber(r.audio_id);\n const artist = asString(r.artist);\n const title = asString(r.title);\n const songLink = asString(r.song_link);\n const musicbrainz = Array.isArray(r.musicbrainz)\n ? (r.musicbrainz.filter((x): x is Record<string, unknown> => asObject(x) !== undefined) as\n | Record<string, unknown>[]\n | undefined)\n : undefined;\n\n const result: RecognitionResult = {\n timecode,\n audioId,\n artist,\n title,\n album: asString(r.album),\n releaseDate: asString(r.release_date),\n label: asString(r.label),\n songLink,\n isrc: asString(r.isrc),\n upc: asString(r.upc),\n appleMusic: asObject(r.apple_music),\n spotify: asObject(r.spotify),\n deezer: asObject(r.deezer),\n napster: asObject(r.napster),\n musicbrainz,\n extras: pickExtras(r, RECOGNITION_KEYS),\n rawResponse: r,\n get isCustomMatch() {\n return audioId !== undefined;\n },\n get isPublicMatch() {\n return audioId === undefined && (artist !== undefined || title !== undefined);\n },\n get thumbnailUrl() {\n return lisTnStreamingUrl(songLink, \"thumb\");\n },\n streamingUrl(provider: StreamingProvider): string | null {\n if (!STREAMING_PROVIDERS.includes(provider)) {\n throw new TypeError(\n `Unknown streaming provider: ${String(provider)}. ` +\n `Valid: ${STREAMING_PROVIDERS.join(\", \")}`,\n );\n }\n const direct = directStreamingUrl(result, provider);\n if (direct !== null) return direct;\n return lisTnStreamingUrl(songLink, provider);\n },\n streamingUrls(): Partial<Record<StreamingProvider, string>> {\n const out: Partial<Record<StreamingProvider, string>> = {};\n for (const p of STREAMING_PROVIDERS) {\n const url = result.streamingUrl(p);\n if (url !== null) out[p] = url;\n }\n return out;\n },\n previewUrl(): string | null {\n return previewFrom(result);\n },\n };\n return result;\n}\n\nexport interface EnterpriseMatch {\n score: number;\n timecode: string;\n artist?: string | undefined;\n title?: string | undefined;\n album?: string | undefined;\n releaseDate?: string | undefined;\n label?: string | undefined;\n isrc?: string | undefined;\n upc?: string | undefined;\n songLink?: string | undefined;\n startOffset?: number | undefined;\n endOffset?: number | undefined;\n extras: Record<string, unknown>;\n rawResponse: Record<string, unknown>;\n readonly thumbnailUrl: string | null;\n /** lis.tn redirect URL for the given streaming provider, or null if `songLink` is non-lis.tn. */\n streamingUrl(provider: StreamingProvider): string | null;\n /** All providers with a resolvable lis.tn redirect URL (or empty when `songLink` is off lis.tn). */\n streamingUrls(): Partial<Record<StreamingProvider, string>>;\n}\n\nconst ENTERPRISE_MATCH_KEYS = [\n \"score\",\n \"timecode\",\n \"artist\",\n \"title\",\n \"album\",\n \"release_date\",\n \"label\",\n \"isrc\",\n \"upc\",\n \"song_link\",\n \"start_offset\",\n \"end_offset\",\n] as const;\n\nexport function parseEnterpriseMatch(raw: unknown): EnterpriseMatch {\n const r = requireObject(raw, \"EnterpriseMatch\");\n const score = asNumber(r.score);\n const timecode = asString(r.timecode);\n if (score === undefined) throw new TypeError(\"EnterpriseMatch: score not number\");\n if (timecode === undefined) throw new TypeError(\"EnterpriseMatch: timecode not string\");\n const songLink = asString(r.song_link);\n return {\n score,\n timecode,\n artist: asString(r.artist),\n title: asString(r.title),\n album: asString(r.album),\n releaseDate: asString(r.release_date),\n label: asString(r.label),\n isrc: asString(r.isrc),\n upc: asString(r.upc),\n songLink,\n startOffset: asNumber(r.start_offset),\n endOffset: asNumber(r.end_offset),\n extras: pickExtras(r, ENTERPRISE_MATCH_KEYS),\n rawResponse: r,\n streamingUrl(provider: StreamingProvider): string | null {\n if (!STREAMING_PROVIDERS.includes(provider)) {\n throw new TypeError(`Unknown streaming provider: ${String(provider)}`);\n }\n return lisTnStreamingUrl(songLink, provider);\n },\n streamingUrls(): Partial<Record<StreamingProvider, string>> {\n const out: Partial<Record<StreamingProvider, string>> = {};\n for (const p of STREAMING_PROVIDERS) {\n const url = lisTnStreamingUrl(songLink, p);\n if (url !== null) out[p] = url;\n }\n return out;\n },\n get thumbnailUrl() {\n if (songLink === undefined || songLink === \"\") return null;\n try {\n const parsed = new URL(songLink);\n if (parsed.hostname !== \"lis.tn\") return null;\n const sep = parsed.search ? \"&\" : \"?\";\n return `${songLink}${sep}thumb`;\n } catch {\n return null;\n }\n },\n };\n}\n\nexport interface EnterpriseChunkResult {\n songs: EnterpriseMatch[];\n offset: string;\n extras: Record<string, unknown>;\n rawResponse: Record<string, unknown>;\n}\n\nconst ENTERPRISE_CHUNK_KEYS = [\"songs\", \"offset\"] as const;\n\nexport function parseEnterpriseChunkResult(raw: unknown): EnterpriseChunkResult {\n const r = requireObject(raw, \"EnterpriseChunkResult\");\n const songsRaw = r.songs;\n if (!Array.isArray(songsRaw)) {\n throw new TypeError(\"EnterpriseChunkResult: songs not array\");\n }\n const offset = asString(r.offset);\n if (offset === undefined) throw new TypeError(\"EnterpriseChunkResult: offset not string\");\n return {\n songs: songsRaw.map(parseEnterpriseMatch),\n offset,\n extras: pickExtras(r, ENTERPRISE_CHUNK_KEYS),\n rawResponse: r,\n };\n}\n\nexport interface Stream {\n radioId: number;\n url: string;\n streamRunning: boolean;\n longpollCategory?: string | undefined;\n extras: Record<string, unknown>;\n rawResponse: Record<string, unknown>;\n}\n\nconst STREAM_KEYS = [\"radio_id\", \"url\", \"stream_running\", \"longpoll_category\"] as const;\n\nexport function parseStream(raw: unknown): Stream {\n const r = requireObject(raw, \"Stream\");\n const radioId = asNumber(r.radio_id);\n const url = asString(r.url);\n const streamRunning = asBoolean(r.stream_running);\n if (radioId === undefined) throw new TypeError(\"Stream: radio_id not number\");\n if (url === undefined) throw new TypeError(\"Stream: url not string\");\n if (streamRunning === undefined) throw new TypeError(\"Stream: stream_running not boolean\");\n return {\n radioId,\n url,\n streamRunning,\n longpollCategory: asString(r.longpoll_category),\n extras: pickExtras(r, STREAM_KEYS),\n rawResponse: r,\n };\n}\n\n/**\n * One candidate song in a recognition match.\n *\n * Almost every match has exactly one Song; the rare extra candidates that\n * appear under {@link StreamCallbackMatch.alternatives} may have a *different*\n * artist or title from the top song — they're variant catalog releases of the\n * same recording (e.g. a \"feat.\" credit vs. the bare-artist re-release, or\n * regional edits with different titles), not lower-confidence guesses at the\n * same track.\n */\nexport interface StreamCallbackSong {\n artist: string;\n title: string;\n score: number;\n album?: string | undefined;\n releaseDate?: string | undefined;\n label?: string | undefined;\n songLink?: string | undefined;\n isrc?: string | undefined;\n upc?: string | undefined;\n appleMusic?: Record<string, unknown> | undefined;\n spotify?: Record<string, unknown> | undefined;\n deezer?: Record<string, unknown> | undefined;\n napster?: Record<string, unknown> | undefined;\n musicbrainz?: ReadonlyArray<Record<string, unknown>> | undefined;\n extras: Record<string, unknown>;\n}\n\nconst STREAM_CALLBACK_SONG_KEYS = [\n \"artist\",\n \"title\",\n \"score\",\n \"album\",\n \"release_date\",\n \"label\",\n \"song_link\",\n \"isrc\",\n \"upc\",\n \"apple_music\",\n \"spotify\",\n \"deezer\",\n \"napster\",\n \"musicbrainz\",\n] as const;\n\nfunction parseStreamCallbackSong(raw: unknown): StreamCallbackSong {\n const r = requireObject(raw, \"StreamCallbackSong\");\n const artist = asString(r.artist);\n const title = asString(r.title);\n const score = asNumber(r.score);\n if (artist === undefined) throw new TypeError(\"StreamCallbackSong: artist not string\");\n if (title === undefined) throw new TypeError(\"StreamCallbackSong: title not string\");\n if (score === undefined) throw new TypeError(\"StreamCallbackSong: score not number\");\n const musicbrainz = Array.isArray(r.musicbrainz)\n ? (r.musicbrainz.filter((x): x is Record<string, unknown> => asObject(x) !== undefined) as\n | Record<string, unknown>[]\n | undefined)\n : undefined;\n return {\n artist,\n title,\n score,\n album: asString(r.album),\n releaseDate: asString(r.release_date),\n label: asString(r.label),\n songLink: asString(r.song_link),\n isrc: asString(r.isrc),\n upc: asString(r.upc),\n appleMusic: asObject(r.apple_music),\n spotify: asObject(r.spotify),\n deezer: asObject(r.deezer),\n napster: asObject(r.napster),\n musicbrainz,\n extras: pickExtras(r, STREAM_CALLBACK_SONG_KEYS),\n };\n}\n\n/**\n * One recognition event from a stream callback or longpoll.\n *\n * The top match lives in {@link song}; rare extra candidates live in\n * {@link alternatives}. Alternatives entries may have a different artist or\n * title from the top song — they're variant catalog releases of the same\n * recording, not lower-confidence guesses at the same track.\n */\nexport interface StreamCallbackMatch {\n radioId: number;\n timestamp?: string | undefined;\n playLength?: number | undefined;\n /** Top match — always present. */\n song: StreamCallbackSong;\n /** Variant catalog releases (may have different artist/title); empty array when only one match. */\n alternatives: StreamCallbackSong[];\n extras: Record<string, unknown>;\n rawResponse: Record<string, unknown>;\n}\n\nconst STREAM_CALLBACK_MATCH_KEYS = [\n \"radio_id\",\n \"timestamp\",\n \"play_length\",\n \"results\",\n] as const;\n\nexport function parseStreamCallbackMatch(raw: unknown): StreamCallbackMatch {\n const r = requireObject(raw, \"StreamCallbackMatch\");\n const radioId = asNumber(r.radio_id);\n if (radioId === undefined) throw new TypeError(\"StreamCallbackMatch: radio_id not number\");\n const resultsRaw = r.results;\n if (!Array.isArray(resultsRaw)) throw new TypeError(\"StreamCallbackMatch: results not array\");\n if (resultsRaw.length === 0) throw new TypeError(\"StreamCallbackMatch: results is empty\");\n const songs = resultsRaw.map(parseStreamCallbackSong);\n const [first, ...rest] = songs;\n if (first === undefined) throw new TypeError(\"StreamCallbackMatch: results is empty\");\n return {\n radioId,\n timestamp: asString(r.timestamp),\n playLength: asNumber(r.play_length),\n song: first,\n alternatives: rest,\n extras: pickExtras(r, STREAM_CALLBACK_MATCH_KEYS),\n rawResponse: r,\n };\n}\n\nexport interface StreamCallbackNotification {\n radioId: number;\n streamRunning?: boolean | undefined;\n notificationCode: number;\n notificationMessage: string;\n /** Outer `time` field on the callback envelope (epoch seconds). */\n time?: number | undefined;\n extras: Record<string, unknown>;\n rawResponse: Record<string, unknown>;\n}\n\nconst STREAM_CALLBACK_NOTIFICATION_KEYS = [\n \"radio_id\",\n \"stream_running\",\n \"notification_code\",\n \"notification_message\",\n] as const;\n\nexport function parseStreamCallbackNotification(raw: unknown): StreamCallbackNotification {\n const r = requireObject(raw, \"StreamCallbackNotification\");\n const radioId = asNumber(r.radio_id);\n if (radioId === undefined)\n throw new TypeError(\"StreamCallbackNotification: radio_id not number\");\n const code = asNumber(r.notification_code);\n if (code === undefined)\n throw new TypeError(\"StreamCallbackNotification: notification_code not number\");\n const message = asString(r.notification_message);\n if (message === undefined)\n throw new TypeError(\"StreamCallbackNotification: notification_message not string\");\n return {\n radioId,\n streamRunning: asBoolean(r.stream_running),\n notificationCode: code,\n notificationMessage: message,\n extras: pickExtras(r, STREAM_CALLBACK_NOTIFICATION_KEYS),\n rawResponse: r,\n };\n}\n\nexport interface LyricsResult {\n artist: string;\n title: string;\n lyrics?: string | undefined;\n songId?: number | undefined;\n fullTitle?: string | undefined;\n artistId?: number | undefined;\n songLink?: string | undefined;\n media?: string | undefined;\n extras: Record<string, unknown>;\n rawResponse: Record<string, unknown>;\n}\n\nconst LYRICS_KEYS = [\n \"artist\",\n \"title\",\n \"lyrics\",\n \"song_id\",\n \"full_title\",\n \"artist_id\",\n \"song_link\",\n \"media\",\n] as const;\n\nexport function parseLyricsResult(raw: unknown): LyricsResult {\n const r = requireObject(raw, \"LyricsResult\");\n const artist = asString(r.artist);\n const title = asString(r.title);\n if (artist === undefined) throw new TypeError(\"LyricsResult: artist not string\");\n if (title === undefined) throw new TypeError(\"LyricsResult: title not string\");\n return {\n artist,\n title,\n lyrics: asString(r.lyrics),\n songId: asNumber(r.song_id),\n fullTitle: asString(r.full_title),\n artistId: asNumber(r.artist_id),\n songLink: asString(r.song_link),\n media: asString(r.media),\n extras: pickExtras(r, LYRICS_KEYS),\n rawResponse: r,\n };\n}\n","import type { HttpResponse } from \"./http.js\";\n\n/**\n * Cost-aware retry classes.\n *\n * - READ — idempotent reads (`streams.list`, `streams.getCallbackUrl`):\n * retry on 408/429/5xx + any connection error.\n * - RECOGNITION — `recognize`, `recognizeEnterprise`, `advanced.findLyrics`:\n * retry on pre-upload connection failures + 5xx.\n * DO NOT retry on read-timeout-after-upload (cost protection).\n * - MUTATING — `streams.add`, `streams.delete`, etc.:\n * retry only on pre-upload connection failures. DO NOT retry\n * 5xx (the side effect may have happened).\n * - NONE — `customCatalog.add`: never retry. Custom-catalog upload is\n * metered; auto-retry on transport failure could double-charge\n * for the same audio fingerprinting. Surface a clean error and\n * let the caller decide.\n */\nexport type RetryClass = \"read\" | \"recognition\" | \"mutating\" | \"none\";\n\nexport interface RetryPolicy {\n retryClass: RetryClass;\n maxAttempts: number;\n backoffFactorMs: number;\n backoffMaxMs: number;\n}\n\nexport const DEFAULT_BACKOFF_FACTOR_MS = 500;\nexport const DEFAULT_BACKOFF_MAX_MS = 30_000;\nexport const DEFAULT_MAX_ATTEMPTS = 3;\n\nconst HTTP_REQUEST_TIMEOUT = 408;\nconst HTTP_TOO_MANY_REQUESTS = 429;\nconst HTTP_SERVER_ERROR_FLOOR = 500;\n\nexport function defaultPolicy(retryClass: RetryClass): RetryPolicy {\n return {\n retryClass,\n maxAttempts: DEFAULT_MAX_ATTEMPTS,\n backoffFactorMs: DEFAULT_BACKOFF_FACTOR_MS,\n backoffMaxMs: DEFAULT_BACKOFF_MAX_MS,\n };\n}\n\nfunction backoffDelayMs(attempt: number, policy: RetryPolicy): number {\n const base = Math.min(policy.backoffFactorMs * 2 ** attempt, policy.backoffMaxMs);\n return base * (0.5 + Math.random());\n}\n\n/**\n * `fetch()` raises `TypeError(\"fetch failed\")` when DNS/TCP/TLS failed before\n * the request body finished. AbortError (or DOMException/AbortError) means the\n * caller's AbortSignal fired — could be pre- or post-upload, treated as\n * post-upload conservatively for cost-protection.\n */\nfunction isAbortError(err: unknown): boolean {\n if (err === null || typeof err !== \"object\") return false;\n const e = err as { name?: unknown };\n return e.name === \"AbortError\";\n}\n\nfunction isPreUploadConnectionError(err: unknown): boolean {\n if (isAbortError(err)) return false;\n // Node fetch wraps DNS/TCP/TLS errors as TypeError. Browsers do too.\n return err instanceof TypeError;\n}\n\nfunction shouldRetryResponse(resp: HttpResponse, retryClass: RetryClass): boolean {\n const s = resp.httpStatus;\n switch (retryClass) {\n case \"read\":\n return (\n s === HTTP_REQUEST_TIMEOUT ||\n s === HTTP_TOO_MANY_REQUESTS ||\n s >= HTTP_SERVER_ERROR_FLOOR\n );\n case \"recognition\":\n return s >= HTTP_SERVER_ERROR_FLOOR;\n case \"mutating\":\n return false;\n case \"none\":\n return false;\n }\n}\n\nfunction shouldRetryError(err: unknown, retryClass: RetryClass): boolean {\n switch (retryClass) {\n case \"read\":\n // Pre-upload connection errors and post-upload read timeouts are both\n // safe-ish: idempotent reads can be retried freely.\n return isPreUploadConnectionError(err) || isAbortError(err);\n case \"recognition\":\n // Pre-upload only — explicitly NOT post-upload AbortError (cost protection).\n return isPreUploadConnectionError(err);\n case \"mutating\":\n // Pre-upload only — server-side side-effect may have happened.\n return isPreUploadConnectionError(err);\n case \"none\":\n // Metered upload — never retry on transport failure (could double-charge).\n return false;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function retry<T extends HttpResponse>(\n fn: () => Promise<T>,\n policy: RetryPolicy,\n): Promise<T> {\n let lastError: unknown;\n let lastResp: T | undefined;\n let haveResp = false;\n for (let attempt = 0; attempt < policy.maxAttempts; attempt++) {\n try {\n const resp = await fn();\n if (!shouldRetryResponse(resp, policy.retryClass)) return resp;\n lastResp = resp;\n haveResp = true;\n lastError = undefined;\n } catch (err) {\n if (!shouldRetryError(err, policy.retryClass)) throw err;\n lastError = err;\n haveResp = false;\n if (attempt + 1 >= policy.maxAttempts) throw err;\n }\n if (attempt + 1 >= policy.maxAttempts) break;\n await sleep(backoffDelayMs(attempt, policy));\n }\n if (haveResp && lastResp !== undefined) return lastResp;\n throw lastError;\n}\n","/**\n * Auto-detect what kind of audio source the caller passed and convert to\n * the right multipart fields.\n *\n * Returns a *re-opener* — a 0-arg callable that yields fresh form fields\n * on each call. The HTTP layer invokes it inside the retry-wrapped request\n * closure, so retried attempts get fresh body content rather than an\n * exhausted stream / spent buffer.\n *\n * Specifically: `fetch()` does NOT auto-rewind a `Blob` constructed over a\n * stream once the body is consumed; the re-opener pattern is mandatory in\n * Node/browsers (the audd-python C1 review note discusses this — Python's\n * httpx auto-seeks; ours doesn't always).\n */\n\nimport { promises as fsPromises, statSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { FormFieldValue } from \"./http.js\";\n\n/**\n * Audio source the caller passes to `recognize` / `recognizeEnterprise` /\n * `customCatalog.add`. Auto-detected:\n *\n * - `string` starting with `http://` or `https://` → URL parameter\n * - `string` other → resolved as a filesystem path on Node (TypeError in browsers)\n * - `URL` → URL parameter\n * - `Blob` / `File` → multipart upload\n * - `Uint8Array` / `Buffer` → multipart upload\n */\nexport type Source = string | URL | Blob | Uint8Array;\n\nexport interface PreparedRequest {\n fields: Record<string, FormFieldValue>;\n /** True for multipart uploads (file body sent), false when only URL passed. */\n isMultipart: boolean;\n}\n\nexport type SourceReopener = () => Promise<PreparedRequest>;\n\nfunction looksLikeUrl(s: string): boolean {\n return s.startsWith(\"http://\") || s.startsWith(\"https://\");\n}\n\nfunction isNodeRuntime(): boolean {\n return (\n typeof process !== \"undefined\" &&\n process.versions !== undefined &&\n typeof process.versions.node === \"string\"\n );\n}\n\n/**\n * Inspect a source and return a re-opener.\n *\n * URLs go via `data.url`; bytes/blobs/paths go via `data.file` (multipart).\n * Each call to the returned re-opener yields a fresh body so retry doesn't\n * see an empty/exhausted buffer.\n */\nexport function prepareSource(source: Source): SourceReopener {\n if (typeof source === \"string\") {\n if (looksLikeUrl(source)) {\n const url = source;\n return () => Promise.resolve({ fields: { url }, isMultipart: false });\n }\n if (!isNodeRuntime()) {\n throw new TypeError(\n `Source string ${JSON.stringify(source)} is not an HTTP URL (must start with ` +\n `http:// or https://). Filesystem paths are only supported on Node. In a ` +\n `browser, pass a Blob/File or Uint8Array instead.`,\n );\n }\n // Filesystem path. Verify existence eagerly so a typo'd URL doesn't get\n // treated as a path that fails much later with a less-actionable error.\n let exists = false;\n try {\n exists = statSync(source).isFile();\n } catch {\n exists = false;\n }\n if (!exists) {\n throw new TypeError(\n `${JSON.stringify(source)} is not an HTTP URL (must start with http:// or ` +\n `https://) and is not an existing file path. Pass a URL, a path, a Blob, or ` +\n `bytes.`,\n );\n }\n const filePath = source;\n const filename = path.basename(filePath);\n return async () => {\n const buf = await fsPromises.readFile(filePath);\n const blob = new Blob([new Uint8Array(buf)], {\n type: \"application/octet-stream\",\n });\n const file = new File([blob], filename, { type: \"application/octet-stream\" });\n return { fields: { file }, isMultipart: true };\n };\n }\n\n if (source instanceof URL) {\n const url = source.toString();\n return () => Promise.resolve({ fields: { url }, isMultipart: false });\n }\n\n if (typeof Blob !== \"undefined\" && source instanceof Blob) {\n // Blob is fundamentally re-readable — fetch will re-stream it.\n const blob = source;\n const filename = \"name\" in blob && typeof blob.name === \"string\" ? blob.name : \"upload.bin\";\n return () => {\n const file = new File([blob], filename, { type: blob.type || \"application/octet-stream\" });\n return Promise.resolve({ fields: { file }, isMultipart: true });\n };\n }\n\n if (source instanceof Uint8Array) {\n // Snapshot the bytes once (defensive copy) and produce a fresh Blob each\n // attempt so concurrent retries can't trample each other's bodies.\n const buf = new Uint8Array(source);\n return () => {\n const blob = new Blob([buf], { type: \"application/octet-stream\" });\n const file = new File([blob], \"upload.bin\", { type: \"application/octet-stream\" });\n return Promise.resolve({ fields: { file }, isMultipart: true });\n };\n }\n\n throw new TypeError(\n `Unsupported source type ${typeof source}; pass a URL string, URL, Blob/File, ` +\n `Uint8Array, or Buffer.`,\n );\n}\n","import { createHash } from \"node:crypto\";\nimport { AudDInvalidRequestError, AudDSerializationError } from \"./errors.js\";\nimport {\n parseStreamCallbackMatch,\n parseStreamCallbackNotification,\n type StreamCallbackMatch,\n type StreamCallbackNotification,\n} from \"./models.js\";\n\n/**\n * Raised by `addReturnToUrl` (and therefore by `streams.setCallbackUrl`)\n * when the URL already contains a `return` query parameter and a\n * `returnMetadata` argument is also passed — conflicting intent.\n */\nexport class DuplicateReturnParameterError extends AudDInvalidRequestError {\n override name = \"DuplicateReturnParameterError\";\n constructor() {\n super({\n errorCode: 0,\n message:\n \"URL already contains a `return` query parameter; pass returnMetadata: undefined \" +\n \"or remove the parameter from the URL — refusing to silently overwrite.\",\n httpStatus: 0,\n requestId: null,\n requestedParams: {},\n requestMethod: null,\n brandedMessage: null,\n rawResponse: null,\n });\n }\n}\n\n/**\n * Compute the 9-char longpoll category locally from the API token + radio_id.\n *\n * Formula (per docs.audd.io/streams.md): hex-MD5 of (hex-MD5 of api_token,\n * concatenated with the radio_id rendered as a decimal string), truncated\n * to the first 9 hex chars.\n *\n * Pure function — no network call. Lets servers share a longpoll category\n * with browser/mobile clients without leaking the api_token.\n */\nexport function deriveLongpollCategory(apiToken: string, radioId: number): string {\n const inner = createHash(\"md5\").update(apiToken, \"utf8\").digest(\"hex\");\n const full = createHash(\"md5\").update(inner + String(radioId), \"utf8\").digest(\"hex\");\n return full.slice(0, 9);\n}\n\n/**\n * Append `?return=<metadata>` (or merge as `&return=`) to the callback URL.\n *\n * - If `returnMetadata` is `undefined`, returns the URL unchanged.\n * - If the URL already has a `return` query parameter, raises rather than\n * silently overwriting.\n */\nexport function addReturnToUrl(\n url: string,\n returnMetadata: string | string[] | undefined,\n): string {\n if (returnMetadata === undefined) return url;\n const value = Array.isArray(returnMetadata) ? returnMetadata.join(\",\") : returnMetadata;\n const u = new URL(url);\n if (u.searchParams.has(\"return\")) {\n throw new DuplicateReturnParameterError();\n }\n u.searchParams.set(\"return\", value);\n return u.toString();\n}\n\n/**\n * Result of {@link parseCallback} / {@link handleCallback}.\n *\n * Exactly one of `match` or `notification` is non-null on success.\n * Recognition callbacks populate `match`; lifecycle/error callbacks (e.g.\n * \"stream stopped\", \"can't connect\") populate `notification`.\n */\nexport interface ParsedCallback {\n match: StreamCallbackMatch | null;\n notification: StreamCallbackNotification | null;\n}\n\n/**\n * Parse a callback POST body into a typed match or notification.\n *\n * Accepts either a parsed JSON object or a string (serialized JSON). Throws\n * {@link AudDSerializationError} when the body is unparseable JSON, isn't an\n * object, or carries neither a `result` nor a `notification` block.\n *\n * Prefer {@link handleCallback} when you have a Node `http.IncomingMessage`,\n * a Web `Request`, or anything with a streamed body — that helper reads the\n * body for you.\n */\nexport function parseCallback(body: unknown): ParsedCallback {\n let raw: unknown = body;\n if (typeof body === \"string\") {\n try {\n raw = JSON.parse(body);\n } catch (err) {\n throw new AudDSerializationError(\n `callback body is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,\n body,\n );\n }\n }\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new AudDSerializationError(\n \"callback body is not a JSON object\",\n typeof body === \"string\" ? body : \"\",\n );\n }\n const r = raw as Record<string, unknown>;\n\n if (\"notification\" in r) {\n let notification: StreamCallbackNotification;\n try {\n notification = parseStreamCallbackNotification(r.notification);\n } catch (err) {\n throw new AudDSerializationError(\n `callback notification: ${err instanceof Error ? err.message : String(err)}`,\n typeof body === \"string\" ? body : JSON.stringify(r),\n );\n }\n const t = r.time;\n if (typeof t === \"number\") notification.time = t;\n return { match: null, notification };\n }\n\n if (\"result\" in r) {\n let match: StreamCallbackMatch;\n try {\n match = parseStreamCallbackMatch(r.result);\n } catch (err) {\n throw new AudDSerializationError(\n `callback result: ${err instanceof Error ? err.message : String(err)}`,\n typeof body === \"string\" ? body : JSON.stringify(r),\n );\n }\n return { match, notification: null };\n }\n\n throw new AudDSerializationError(\n \"callback body has neither result nor notification\",\n typeof body === \"string\" ? body : JSON.stringify(r),\n );\n}\n\n/**\n * Minimum shape we accept from a \"request-like\" object: anything that exposes\n * a `body` (already-parsed-or-stringified JSON), or that is itself a stream we\n * can drain.\n *\n * Concretely supports:\n * - Node `http.IncomingMessage` (async-iterable of `Buffer | string`)\n * - Web `Request` / `fetch` `Body` (has `.text()`)\n * - Express/Fastify/Hono request (has a `.body` already populated by a JSON parser)\n * - Plain `{ body: <parsed-json | string> }` shapes\n */\ntype CallbackRequestLike =\n | { text(): Promise<string> }\n | { body?: unknown; [k: string]: unknown }\n | AsyncIterable<unknown>;\n\n/**\n * Read and parse a callback POST body off a Node, Web, or framework-style\n * request. Picks the right strategy by duck-typing:\n *\n * 1. If the request exposes a `text()` method (Web `Request`, `fetch` body),\n * awaits it and parses the resulting string.\n * 2. Otherwise, if the request has a `body` property that's already an object\n * (Express/Fastify/Hono with a JSON middleware) or string, parses that\n * directly without touching the underlying stream.\n * 3. Otherwise, treats the request as an async-iterable of chunks\n * (`http.IncomingMessage`) and concatenates the body before parsing.\n *\n * Throws {@link AudDSerializationError} on any parse failure.\n */\nexport async function handleCallback(req: CallbackRequestLike): Promise<ParsedCallback> {\n // 1. Web Request / Response-like — has a text() method.\n if (typeof (req as { text?: unknown }).text === \"function\") {\n const text = await (req as { text: () => Promise<string> }).text();\n return parseCallback(text);\n }\n\n // 2. Framework request — body already populated.\n const reqRecord = req as { body?: unknown };\n if (\"body\" in reqRecord && reqRecord.body !== undefined && reqRecord.body !== null) {\n const body = reqRecord.body;\n // If body is itself a readable stream (e.g. raw express without\n // express.json()), fall through to the streaming path below.\n if (\n typeof body === \"object\" &&\n body !== null &&\n Symbol.asyncIterator in (body as object) &&\n // Plain Buffer/Uint8Array also has Symbol.iterator — accept those by value.\n !(body instanceof Uint8Array)\n ) {\n // Streamed body — drain it.\n return parseCallback(await drainAsyncIterable(body as AsyncIterable<unknown>));\n }\n if (body instanceof Uint8Array) {\n return parseCallback(new TextDecoder().decode(body));\n }\n return parseCallback(body);\n }\n\n // 3. The request is itself an async-iterable (http.IncomingMessage).\n if (typeof req === \"object\" && req !== null && Symbol.asyncIterator in req) {\n return parseCallback(await drainAsyncIterable(req as AsyncIterable<unknown>));\n }\n\n throw new AudDSerializationError(\n \"handleCallback: request has no body, no text() method, and is not async-iterable\",\n );\n}\n\nasync function drainAsyncIterable(it: AsyncIterable<unknown>): Promise<string> {\n const chunks: Uint8Array[] = [];\n let stringBuf = \"\";\n for await (const chunk of it) {\n if (typeof chunk === \"string\") {\n stringBuf += chunk;\n } else if (chunk instanceof Uint8Array) {\n chunks.push(chunk);\n } else if (chunk !== null && chunk !== undefined) {\n // Best-effort fallback — Node's stream/consumers can yield Buffer-likes.\n stringBuf += String(chunk);\n }\n }\n if (chunks.length > 0) {\n let total = 0;\n for (const c of chunks) total += c.byteLength;\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n merged.set(c, offset);\n offset += c.byteLength;\n }\n stringBuf = new TextDecoder().decode(merged) + stringBuf;\n }\n return stringBuf;\n}\n","/**\n * Shared longpoll loop + handle, used by both the authenticated `Streams`\n * namespace (token in URL via `HttpClient.get`) and the tokenless\n * `LongpollConsumer` exported from `audd/longpoll`.\n *\n * Browser-safe: no node:crypto, no node:fs, no node:http imports. The whole\n * file relies on `fetch`-style I/O the caller injects.\n */\n\nimport {\n AudDConnectionError,\n AudDSerializationError,\n AudDServerError,\n} from \"./errors.js\";\nimport type { HttpResponse } from \"./http.js\";\nimport type {\n StreamCallbackMatch,\n StreamCallbackNotification,\n} from \"./models.js\";\nimport {\n parseStreamCallbackMatch,\n parseStreamCallbackNotification,\n} from \"./models.js\";\n\nconst HTTP_CLIENT_ERROR_FLOOR = 400;\n\n/**\n * Active long-poll subscription. Two typed `AsyncIterable`s carry the\n * happy-path output and a third carries any terminal error.\n *\n * Consume `matches` and `notifications` independently or in parallel:\n *\n * ```ts\n * const poll = await audd.streams.longpoll(category);\n * for await (const m of poll.matches) {\n * console.log(m.song.artist, m.song.title);\n * }\n * ```\n *\n * Concurrent consumption:\n *\n * ```ts\n * await Promise.all([\n * (async () => { for await (const m of poll.matches) {} })(),\n * (async () => { for await (const n of poll.notifications) {} })(),\n * (async () => { for await (const e of poll.errors) console.error(e); })(),\n * ]);\n * ```\n *\n * `close()` (or the `await using` resource-management form) tears down the\n * background loop and closes all three iterables.\n */\nexport interface LongpollPoll {\n /** Recognition events. */\n readonly matches: AsyncIterable<StreamCallbackMatch>;\n /** Stream-lifecycle events (\"stream stopped\", \"can't connect\", ...). */\n readonly notifications: AsyncIterable<StreamCallbackNotification>;\n /**\n * Terminal errors. The poll keeps polling on transient HTTP/JSON failures\n * (subject to the retry policy); errors that surface here are the ones the\n * loop gives up on. Each fired error is followed by closure of all three\n * iterables.\n */\n readonly errors: AsyncIterable<Error>;\n /** Stop the background loop. Idempotent. */\n close(): void;\n /** `await using` support — calls `close()`. */\n [Symbol.asyncDispose](): Promise<void>;\n}\n\n/**\n * Caller-supplied bits the loop needs:\n * - `fetchOnce` — performs a single longpoll HTTP GET, with caller-managed\n * auth (token in URL, Bearer header, etc.) and retry policy.\n * - `getInitialSince` — initial `since_time` to send (often `undefined`).\n * - `timeout` — server-side longpoll timeout in seconds.\n * - `category` — the longpoll category derived from `(token, radio_id)`.\n * - `signal` — aborts the in-flight HTTP when the poll is closed.\n */\nexport interface LongpollLoopConfig {\n category: string;\n timeout: number;\n sinceTime: number | undefined;\n fetchOnce: (\n params: Record<string, string | undefined>,\n signal: AbortSignal,\n ) => Promise<HttpResponse>;\n}\n\n/**\n * Internal: a single-consumer-friendly bounded queue used to demultiplex\n * the loop output onto separate AsyncIterables.\n */\nclass AsyncQueue<T> {\n private readonly items: T[] = [];\n private readonly waiters: ((v: IteratorResult<T>) => void)[] = [];\n private done = false;\n\n push(value: T): void {\n if (this.done) return;\n const w = this.waiters.shift();\n if (w !== undefined) {\n w({ value, done: false });\n return;\n }\n this.items.push(value);\n }\n\n finish(): void {\n if (this.done) return;\n this.done = true;\n while (this.waiters.length > 0) {\n const w = this.waiters.shift();\n if (w !== undefined) w({ value: undefined as never, done: true });\n }\n }\n\n next(): Promise<IteratorResult<T>> {\n const item = this.items.shift();\n if (item !== undefined) return Promise.resolve({ value: item, done: false });\n if (this.done) return Promise.resolve({ value: undefined as never, done: true });\n return new Promise((resolve) => {\n this.waiters.push(resolve);\n });\n }\n\n toIterable(): AsyncIterable<T> {\n const next = (): Promise<IteratorResult<T>> => this.next();\n return {\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return { next };\n },\n };\n }\n}\n\n/**\n * Decode one longpoll HTTP response into a Match | Notification | null\n * (null = keep-alive `{timeout, timestamp}` or any non-event body — caller\n * keeps polling). Throws on HTTP non-2xx and JSON-shape errors.\n */\nfunction decodeOne(\n resp: HttpResponse,\n): { kind: \"match\"; match: StreamCallbackMatch } | { kind: \"notification\"; notification: StreamCallbackNotification } | { kind: \"keepalive\" } {\n if (resp.httpStatus >= HTTP_CLIENT_ERROR_FLOOR) {\n throw new AudDServerError({\n errorCode: 0,\n message: `Longpoll endpoint returned HTTP ${String(resp.httpStatus)}`,\n httpStatus: resp.httpStatus,\n requestId: resp.requestId,\n rawResponse: resp.jsonBody ?? resp.rawText,\n });\n }\n const body = resp.jsonBody;\n if (typeof body !== \"object\" || body === null || Array.isArray(body)) {\n throw new AudDSerializationError(\n \"Longpoll response was not a JSON object\",\n resp.rawText,\n );\n }\n const dict = body as Record<string, unknown>;\n if (\"notification\" in dict) {\n const notification = parseStreamCallbackNotification(dict.notification);\n const t = dict[\"time\"];\n if (typeof t === \"number\") notification.time = t;\n return { kind: \"notification\", notification };\n }\n if (\"result\" in dict) {\n return { kind: \"match\", match: parseStreamCallbackMatch(dict.result) };\n }\n // Either a `{timeout, timestamp}` keep-alive or an empty/unknown body —\n // skip silently and keep polling.\n return { kind: \"keepalive\" };\n}\n\n/**\n * Start the longpoll loop on a background async task. Returns a\n * {@link LongpollPoll} handle whose iterables are filled as events arrive.\n * The caller's `fetchOnce` is responsible for retries and auth.\n */\nexport function startLongpoll(cfg: LongpollLoopConfig): LongpollPoll {\n const matches = new AsyncQueue<StreamCallbackMatch>();\n const notifications = new AsyncQueue<StreamCallbackNotification>();\n const errors = new AsyncQueue<Error>();\n\n const controller = new AbortController();\n let closed = false;\n\n const finishAll = (): void => {\n matches.finish();\n notifications.finish();\n errors.finish();\n };\n\n const close = (): void => {\n if (closed) return;\n closed = true;\n controller.abort();\n finishAll();\n };\n\n const run = async (): Promise<void> => {\n let curSince = cfg.sinceTime;\n while (!closed) {\n const params: Record<string, string | undefined> = {\n category: cfg.category,\n timeout: String(cfg.timeout),\n };\n if (curSince !== undefined) params[\"since_time\"] = String(curSince);\n\n let resp: HttpResponse;\n try {\n resp = await cfg.fetchOnce(params, controller.signal);\n } catch (err) {\n if (closed) return;\n if (err instanceof TypeError) {\n errors.push(new AudDConnectionError(`Network error: ${err.message}`, err));\n } else if (\n err !== null &&\n typeof err === \"object\" &&\n (err as { name?: string }).name === \"AbortError\"\n ) {\n // Closed-from-outside path — drop quietly.\n if (closed) return;\n errors.push(new AudDConnectionError(\"Request was aborted (timeout)\", err));\n } else if (err instanceof Error) {\n errors.push(err);\n } else {\n errors.push(new Error(String(err)));\n }\n finishAll();\n return;\n }\n\n try {\n const decoded = decodeOne(resp);\n if (decoded.kind === \"match\") matches.push(decoded.match);\n else if (decoded.kind === \"notification\") notifications.push(decoded.notification);\n // else keep-alive: skip.\n } catch (err) {\n errors.push(err instanceof Error ? err : new Error(String(err)));\n finishAll();\n return;\n }\n\n // Bump since_time off the response body's timestamp, as the audd-go\n // reference does — keeps reconnects from re-replaying old events.\n const dict = resp.jsonBody;\n if (typeof dict === \"object\" && dict !== null && !Array.isArray(dict)) {\n const ts = (dict as Record<string, unknown>)[\"timestamp\"];\n if (typeof ts === \"number\") curSince = ts;\n }\n }\n };\n\n // Fire-and-forget. Failures land on the `errors` iterable.\n void run();\n\n return {\n matches: matches.toIterable(),\n notifications: notifications.toIterable(),\n errors: errors.toIterable(),\n close,\n async [Symbol.asyncDispose](): Promise<void> {\n close();\n await Promise.resolve();\n },\n };\n}\n","/** Streams namespace — setCallbackUrl, addStream, longpoll with preflight, etc. */\nimport { addReturnToUrl, deriveLongpollCategory, parseCallback } from \"./helpers.js\";\nimport {\n AudDAPIError,\n AudDConnectionError,\n AudDInvalidRequestError,\n AudDSerializationError,\n AudDServerError,\n raiseFromErrorResponse,\n} from \"./errors.js\";\nimport type { HttpClient, HttpResponse } from \"./http.js\";\nimport { startLongpoll, type LongpollPoll } from \"./longpollCore.js\";\nimport { parseStream, type Stream } from \"./models.js\";\nimport { retry, type RetryPolicy } from \"./retry.js\";\nimport type { ParsedCallback } from \"./helpers.js\";\n\nconst API_BASE = \"https://api.audd.io\";\n\n/** Server signals \"no callback URL configured\" with code 19 from getCallbackUrl. */\nconst NO_CALLBACK_ERROR_CODE = 19;\n\nconst PREFLIGHT_NO_CALLBACK_HINT =\n \"Longpoll won't deliver events because no callback URL is configured for this \" +\n \"account. Set one first via streams.setCallbackUrl(...) — `https://audd.tech/empty/` \" +\n \"is fine if you only want longpolling and don't need a real receiver. To skip this \" +\n \"check, pass skipCallbackCheck: true.\";\n\nexport interface SetCallbackUrlOptions {\n returnMetadata?: string | string[];\n /**\n * Additional form fields the typed options don't cover. Typed options\n * (`url`) win on collision.\n */\n extraParameters?: Record<string, string>;\n}\n\nexport interface AddStreamOptions {\n url: string;\n radioId: number;\n /** \"before\" delivers callbacks at song start; default delivers at song end. */\n callbacks?: \"before\" | string;\n /**\n * Additional form fields the typed options don't cover. Typed options\n * (`url`, `radioId`, `callbacks`) win on collision.\n */\n extraParameters?: Record<string, string>;\n}\n\nexport interface LongpollOptions {\n sinceTime?: number;\n /** Server-side timeout in seconds (default 50). */\n timeout?: number;\n /** Bypass the default-on `getCallbackUrl` preflight. */\n skipCallbackCheck?: boolean;\n /**\n * Radio id to subscribe to — the SDK derives the 9-char category locally\n * from `(api_token, radio_id)`. Mutually exclusive with `category`. Only\n * meaningful on the object-form call site (`longpoll({ radioId: 42 })`).\n */\n radioId?: number;\n /**\n * Pre-derived 9-char longpoll category. Mutually exclusive with `radioId`.\n * Only meaningful on the object-form call site\n * (`longpoll({ category: \"abc123def\" })`); the positional string form\n * `longpoll(\"abc123def\")` is the more common way to pass a category.\n */\n category?: string;\n}\n\nfunction decodeSuccess(\n body: unknown,\n httpStatus: number,\n requestId: string | null,\n): unknown {\n if (typeof body !== \"object\" || body === null || Array.isArray(body)) {\n throw new AudDSerializationError(\"Unparseable response\");\n }\n const obj = body as Record<string, unknown> & {\n status?: unknown;\n error?: unknown;\n result?: unknown;\n };\n if (obj.status === \"error\") {\n raiseFromErrorResponse(obj as Parameters<typeof raiseFromErrorResponse>[0], {\n httpStatus,\n requestId,\n });\n }\n if (obj.status === \"success\") {\n return obj.result;\n }\n throw new AudDServerError({\n errorCode: 0,\n message: `Unexpected response status: ${JSON.stringify(obj.status)}`,\n httpStatus,\n requestId,\n rawResponse: obj,\n });\n}\n\nasync function runRetried<T extends HttpResponse>(\n fn: () => Promise<T>,\n policy: RetryPolicy,\n): Promise<T> {\n try {\n return await retry(fn, policy);\n } catch (err) {\n if (err instanceof TypeError) {\n throw new AudDConnectionError(`Network error: ${err.message}`, err);\n }\n if (err !== null && typeof err === \"object\" && (err as { name?: string }).name === \"AbortError\") {\n throw new AudDConnectionError(\"Request was aborted (timeout)\", err);\n }\n throw err;\n }\n}\n\nexport class Streams {\n constructor(\n private readonly http: HttpClient,\n private readonly readPolicy: RetryPolicy,\n private readonly mutatingPolicy: RetryPolicy,\n private readonly apiToken: string,\n ) {}\n\n private async post(\n path: string,\n fields: Record<string, string | undefined>,\n policy: RetryPolicy,\n ): Promise<unknown> {\n const resp = await runRetried(\n () => this.http.postForm(`${API_BASE}/${path}/`, fields),\n policy,\n );\n return decodeSuccess(resp.jsonBody, resp.httpStatus, resp.requestId);\n }\n\n /**\n * Set the callback URL where AudD will POST recognition events.\n *\n * @param url The URL to register.\n * @param opts.returnMetadata Optional metadata block list — appended as\n * `?return=...` to the URL. Raises `DuplicateReturnParameterError` if the\n * URL already contains a `?return=` parameter.\n */\n async setCallbackUrl(url: string, opts: SetCallbackUrlOptions = {}): Promise<void> {\n const finalUrl = addReturnToUrl(url, opts.returnMetadata);\n // extraParameters first; typed fields (`url`) win on collision.\n const fields: Record<string, string> = opts.extraParameters\n ? { ...opts.extraParameters }\n : {};\n fields[\"url\"] = finalUrl;\n await this.post(\"setCallbackUrl\", fields, this.mutatingPolicy);\n }\n\n /** Get the currently registered callback URL. */\n async getCallbackUrl(): Promise<string> {\n const result = await this.post(\"getCallbackUrl\", {}, this.readPolicy);\n return String(result);\n }\n\n /** Register a new stream for real-time recognition. */\n async add(opts: AddStreamOptions): Promise<void> {\n // extraParameters first; typed fields win on collision.\n const fields: Record<string, string | undefined> = opts.extraParameters\n ? { ...opts.extraParameters }\n : {};\n fields[\"url\"] = opts.url;\n fields[\"radio_id\"] = String(opts.radioId);\n if (opts.callbacks !== undefined) fields[\"callbacks\"] = opts.callbacks;\n await this.post(\"addStream\", fields, this.mutatingPolicy);\n }\n\n /** Update the upstream URL of an existing stream. */\n async setUrl(radioId: number, url: string): Promise<void> {\n await this.post(\n \"setStreamUrl\",\n { radio_id: String(radioId), url },\n this.mutatingPolicy,\n );\n }\n\n /** Delete an existing stream. */\n async delete(radioId: number): Promise<void> {\n await this.post(\"deleteStream\", { radio_id: String(radioId) }, this.mutatingPolicy);\n }\n\n /** List all streams on this account. */\n async list(): Promise<Stream[]> {\n const result = await this.post(\"getStreams\", {}, this.readPolicy);\n if (!Array.isArray(result)) return [];\n return result.map(parseStream);\n }\n\n /** Compute the 9-char longpoll category locally — pure, no network. */\n deriveLongpollCategory(radioId: number): string {\n return deriveLongpollCategory(this.apiToken, radioId);\n }\n\n /**\n * Parse a callback POST body into `{ match, notification }`. Pass an\n * already-parsed JSON value or a string. Exactly one field is non-null on\n * success. See {@link parseCallback} for details.\n */\n parseCallback(body: unknown): ParsedCallback {\n return parseCallback(body);\n }\n\n /**\n * Long-poll the AudD subscription endpoint.\n *\n * Two call shapes:\n *\n * - **Common case** — pass an options object with `radioId`; the SDK\n * derives the 9-char category locally from `(api_token, radio_id)`:\n * `longpoll({ radioId: 42 })`.\n * - **Tokenless / pre-derived category** — pass the category as a positional\n * string (`longpoll(\"abc123def\")`) or via the object form\n * (`longpoll({ category: \"abc123def\" })`). Useful when the category was\n * shared with you (e.g. a browser/mobile client running without the\n * api_token).\n *\n * Returns a {@link LongpollPoll} handle with three async-iterables —\n * `matches`, `notifications`, `errors` — that are filled by a background\n * loop. Iterate them independently or in parallel via `Promise.all([...])`.\n *\n * Before the first request the SDK runs a one-time `getCallbackUrl`\n * preflight: AudD silently discards events for accounts that haven't set a\n * callback URL, and the preflight surfaces that misconfiguration as an\n * actionable {@link AudDInvalidRequestError}. Pass `skipCallbackCheck: true`\n * to bypass.\n *\n * Throws {@link AudDInvalidRequestError} if the object form supplies both\n * `radioId` and `category`, or neither.\n */\n async longpoll(category: string, opts?: LongpollOptions): Promise<LongpollPoll>;\n async longpoll(\n opts: LongpollOptions & ({ radioId: number } | { category: string }),\n ): Promise<LongpollPoll>;\n async longpoll(\n arg1: string | (LongpollOptions & { radioId?: number; category?: string }),\n opts: LongpollOptions = {},\n ): Promise<LongpollPoll> {\n let category: string;\n let effectiveOpts: LongpollOptions;\n if (typeof arg1 === \"string\") {\n category = arg1;\n effectiveOpts = opts;\n } else {\n effectiveOpts = arg1;\n const hasRadioId = arg1.radioId !== undefined;\n const hasCategory = arg1.category !== undefined;\n if (hasRadioId && hasCategory) {\n throw new AudDInvalidRequestError({\n errorCode: 0,\n message:\n \"longpoll(): pass exactly one of `radioId` or `category` — got both.\",\n httpStatus: 0,\n });\n }\n if (!hasRadioId && !hasCategory) {\n throw new AudDInvalidRequestError({\n errorCode: 0,\n message:\n \"longpoll(): pass exactly one of `radioId` or `category` — got neither.\",\n httpStatus: 0,\n });\n }\n category = hasRadioId\n ? this.deriveLongpollCategory(arg1.radioId as number)\n : (arg1.category as string);\n }\n if (effectiveOpts.skipCallbackCheck !== true) {\n await this.preflightCallbackUrl();\n }\n const timeoutSec = effectiveOpts.timeout ?? 50;\n const httpClient = this.http;\n const readPolicy = this.readPolicy;\n return startLongpoll({\n category,\n timeout: timeoutSec,\n sinceTime: effectiveOpts.sinceTime,\n fetchOnce: (params, signal) =>\n runRetried(\n () => httpClient.get(`${API_BASE}/longpoll/`, params, { signal }),\n readPolicy,\n ),\n });\n }\n\n private async preflightCallbackUrl(): Promise<void> {\n try {\n await this.getCallbackUrl();\n } catch (err) {\n if (err instanceof AudDAPIError && err.errorCode === NO_CALLBACK_ERROR_CODE) {\n throw new AudDInvalidRequestError({\n errorCode: 0,\n message: PREFLIGHT_NO_CALLBACK_HINT,\n httpStatus: err.httpStatus,\n requestId: err.requestId,\n });\n }\n throw err;\n }\n }\n}\n","/**\n * Custom-catalog endpoint. NOT for music recognition — see method JSDoc.\n */\nimport {\n AudDConnectionError,\n AudDSerializationError,\n AudDServerError,\n raiseFromErrorResponse,\n} from \"./errors.js\";\nimport type { FormFieldValue, HttpClient, HttpResponse } from \"./http.js\";\nimport { retry, type RetryPolicy } from \"./retry.js\";\nimport { prepareSource, type Source } from \"./source.js\";\n\nconst UPLOAD_URL = \"https://api.audd.io/upload/\";\n\nexport interface CustomCatalogAddOptions {\n audioId: number;\n source: Source;\n}\n\nfunction decodeSuccess(body: unknown, httpStatus: number, requestId: string | null): void {\n if (typeof body !== \"object\" || body === null || Array.isArray(body)) {\n throw new AudDSerializationError(\"Unparseable response\");\n }\n const obj = body as Record<string, unknown> & { status?: unknown };\n if (obj.status === \"error\") {\n raiseFromErrorResponse(obj as Parameters<typeof raiseFromErrorResponse>[0], {\n httpStatus,\n requestId,\n customCatalogContext: true,\n });\n }\n if (obj.status !== \"success\") {\n throw new AudDServerError({\n errorCode: 0,\n message: `Unexpected status: ${JSON.stringify(obj.status)}`,\n httpStatus,\n requestId,\n rawResponse: obj,\n });\n }\n}\n\nasync function runRetried<T extends HttpResponse>(\n fn: () => Promise<T>,\n policy: RetryPolicy,\n): Promise<T> {\n try {\n return await retry(fn, policy);\n } catch (err) {\n if (err instanceof TypeError) {\n throw new AudDConnectionError(`Network error: ${err.message}`, err);\n }\n if (err !== null && typeof err === \"object\" && (err as { name?: string }).name === \"AbortError\") {\n throw new AudDConnectionError(\"Request was aborted (timeout)\", err);\n }\n throw err;\n }\n}\n\nexport class CustomCatalog {\n constructor(\n private readonly http: HttpClient,\n private readonly noRetryPolicy: RetryPolicy,\n ) {}\n\n /**\n * **This is NOT how you submit audio for music recognition.** For\n * recognition, use `audd.recognize()` (or `audd.recognizeEnterprise()` for\n * files longer than 25 seconds). This method adds a song to your\n * **private fingerprint catalog** so AudD's recognition can later identify\n * *your own* tracks for *your account only*. Requires special access —\n * contact api@audd.io if you need it enabled.\n *\n * Calling this again with the same `audioId` re-fingerprints that slot.\n * There is no public list/delete endpoint; track `audioId` ↔ song\n * mappings on your side.\n *\n * **No automatic retry.** Custom-catalog upload is metered, and a transport\n * failure could otherwise cause a silent re-upload that double-charges. Any\n * 5xx or pre-upload connection error surfaces as a clean exception — the\n * caller decides whether to retry.\n */\n async add(opts: CustomCatalogAddOptions): Promise<void> {\n const reopen = prepareSource(opts.source);\n const audioId = String(opts.audioId);\n\n const resp = await runRetried(async () => {\n const prepared = await reopen();\n const fields: Record<string, FormFieldValue> = { ...prepared.fields, audio_id: audioId };\n return this.http.postForm(UPLOAD_URL, fields);\n }, this.noRetryPolicy);\n\n decodeSuccess(resp.jsonBody, resp.httpStatus, resp.requestId);\n }\n}\n","/**\n * Advanced namespace — lyrics search + raw escape hatch.\n *\n * Reach this only via `audd.advanced.*` — deliberately not on the main\n * client surface.\n */\nimport {\n AudDConnectionError,\n AudDSerializationError,\n raiseFromErrorResponse,\n} from \"./errors.js\";\nimport type { FormFieldValue, HttpClient, HttpResponse } from \"./http.js\";\nimport { parseLyricsResult, type LyricsResult } from \"./models.js\";\nimport { retry, type RetryPolicy } from \"./retry.js\";\n\nconst API_BASE = \"https://api.audd.io\";\n\nasync function runRetried<T extends HttpResponse>(\n fn: () => Promise<T>,\n policy: RetryPolicy,\n): Promise<T> {\n try {\n return await retry(fn, policy);\n } catch (err) {\n if (err instanceof TypeError) {\n throw new AudDConnectionError(`Network error: ${err.message}`, err);\n }\n if (err !== null && typeof err === \"object\" && (err as { name?: string }).name === \"AbortError\") {\n throw new AudDConnectionError(\"Request was aborted (timeout)\", err);\n }\n throw err;\n }\n}\n\nexport class Advanced {\n /**\n * @param recognitionPolicy The findLyrics endpoint is metered and shouldn't\n * double-bill on post-upload read timeout: Advanced uses RECOGNITION retry\n * policy, not READ.\n */\n constructor(\n private readonly http: HttpClient,\n private readonly recognitionPolicy: RetryPolicy,\n ) {}\n\n /** Find lyrics by free-text query. Returns a list of matches (possibly empty). */\n async findLyrics(query: string): Promise<LyricsResult[]> {\n const body = await this.rawRequest(\"findLyrics\", { q: query });\n if (body[\"status\"] === \"error\") {\n raiseFromErrorResponse(body as Parameters<typeof raiseFromErrorResponse>[0], {\n httpStatus: 200,\n requestId: null,\n });\n }\n const result = body[\"result\"];\n if (!Array.isArray(result)) return [];\n return result.map(parseLyricsResult);\n }\n\n /**\n * Hit any AudD endpoint by method name and return the raw JSON object.\n * Useful for endpoints not yet wrapped by typed methods on this SDK.\n */\n async rawRequest(\n method: string,\n params: Record<string, string | number | boolean | undefined> = {},\n ): Promise<Record<string, unknown>> {\n const fields: Record<string, FormFieldValue> = {};\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined) continue;\n fields[k] = String(v);\n }\n\n const resp = await runRetried(\n () => this.http.postForm(`${API_BASE}/${method}/`, fields),\n this.recognitionPolicy,\n );\n const body = resp.jsonBody;\n if (typeof body !== \"object\" || body === null || Array.isArray(body)) {\n throw new AudDSerializationError(\"Unparseable response\", resp.rawText);\n }\n return body as Record<string, unknown>;\n }\n}\n","/** Top-level AudD client. */\nimport {\n AudDConnectionError,\n AudDSerializationError,\n AudDServerError,\n raiseFromErrorResponse,\n} from \"./errors.js\";\nimport {\n ENTERPRISE_TIMEOUT_MS,\n HttpClient,\n type FetchLike,\n type FormFieldValue,\n type HttpResponse,\n} from \"./http.js\";\nimport {\n parseEnterpriseChunkResult,\n parseRecognitionResult,\n type EnterpriseMatch,\n type RecognitionResult,\n} from \"./models.js\";\nimport {\n defaultPolicy,\n retry,\n type RetryClass,\n type RetryPolicy,\n} from \"./retry.js\";\nimport { prepareSource, type Source } from \"./source.js\";\nimport { Streams } from \"./streams.js\";\nimport { CustomCatalog } from \"./customCatalog.js\";\nimport { Advanced } from \"./advanced.js\";\n\nconst API_BASE = \"https://api.audd.io\";\nconst ENTERPRISE_BASE = \"https://enterprise.audd.io\";\n\n/** Server-side soft-deprecation code. */\nconst DEPRECATED_PARAMS_CODE = 51;\nconst HTTP_CLIENT_ERROR_FLOOR = 400;\nconst TOKEN_ENV_VAR = \"AUDD_API_TOKEN\";\n\n/**\n * Inspection event kinds emitted by the SDK request lifecycle.\n * Hooks receive these via the `onEvent` callback.\n */\nexport type AudDEventKind = \"request\" | \"response\" | \"exception\";\n\n/**\n * Inspection event emitted by the SDK request lifecycle.\n * Frozen, plain-data; never includes the api_token or request body bytes.\n */\nexport interface AudDEvent {\n kind: AudDEventKind;\n /** AudD method name, e.g. \"recognize\", \"addStream\". */\n method: string;\n url: string;\n requestId: string | null;\n httpStatus: number | null;\n elapsedMs: number | null;\n errorCode: number | null;\n extras: Record<string, unknown>;\n}\n\nexport type OnEventHook = (event: AudDEvent) => void;\n\nfunction safeEmit(hook: OnEventHook | undefined, event: AudDEvent): void {\n if (hook === undefined) return;\n try {\n hook(event);\n } catch {\n // Observability hooks must never break the request path.\n }\n}\n\nfunction resolveToken(apiToken: string | undefined): string {\n if (apiToken !== undefined && apiToken !== \"\") return apiToken;\n const env = (typeof process !== \"undefined\" ? process.env[TOKEN_ENV_VAR] : undefined) ?? \"\";\n if (env !== \"\") return env;\n throw new Error(\n `AudD apiToken not supplied and ${TOKEN_ENV_VAR} env var is unset. ` +\n \"Get a token at https://dashboard.audd.io and pass it as \" +\n \"new AudD(\\\"<token>\\\") (or new AudD({ apiToken: \\\"<token>\\\" })), \" +\n \"or set AUDD_API_TOKEN.\",\n );\n}\n\nexport interface AudDOptions {\n /** Required, but may be omitted if `AUDD_API_TOKEN` is in the environment. */\n apiToken?: string;\n /** Maximum retry attempts (default 3). */\n maxRetries?: number;\n /** Initial backoff in ms (default 500), jittered, exponential. */\n backoffFactorMs?: number;\n /** Custom fetch (e.g., for proxy/mTLS). */\n fetch?: FetchLike;\n /** Inspection hook (see {@link AudDEvent}). Off by default. */\n onEvent?: OnEventHook;\n}\n\nexport type ReturnMetadata =\n | \"apple_music\"\n | \"spotify\"\n | \"deezer\"\n | \"napster\"\n | \"musicbrainz\"\n | string;\n\nexport interface RecognizeOptions {\n returnMetadata?: ReturnMetadata | ReturnMetadata[];\n market?: string;\n /** Per-call timeout in ms; overrides the client default. */\n timeoutMs?: number;\n /**\n * User-supplied AbortSignal for cancellation.\n *\n * **Note:** cancellation aborts the local request. The server may have\n * already done metered work and the credit is consumed regardless.\n */\n signal?: AbortSignal;\n /**\n * Additional form fields the typed options don't cover — undocumented\n * parameters, beta features. Typed options win on collision.\n */\n extraParameters?: Record<string, string>;\n}\n\nexport interface RecognizeEnterpriseOptions {\n returnMetadata?: ReturnMetadata | ReturnMetadata[];\n skip?: number;\n every?: number;\n limit?: number;\n skipFirstSeconds?: number;\n useTimecode?: boolean;\n accurateOffsets?: boolean;\n timeoutMs?: number;\n /**\n * User-supplied AbortSignal for cancellation. See {@link RecognizeOptions.signal}.\n * For multi-hour enterprise calls, this is the right way to cancel.\n */\n signal?: AbortSignal;\n /**\n * Additional form fields the typed options don't cover. Typed options\n * win on collision.\n */\n extraParameters?: Record<string, string>;\n}\n\nfunction formatReturn(value: ReturnMetadata | ReturnMetadata[] | undefined): string | undefined {\n if (value === undefined) return undefined;\n return Array.isArray(value) ? value.join(\",\") : value;\n}\n\nfunction buildEnterpriseFields(opts: RecognizeEnterpriseOptions): Record<string, string> {\n // extraParameters first; typed fields override on collision.\n const fields: Record<string, string> = opts.extraParameters\n ? { ...opts.extraParameters }\n : {};\n const ret = formatReturn(opts.returnMetadata);\n if (ret !== undefined) fields[\"return\"] = ret;\n if (opts.skip !== undefined) fields[\"skip\"] = String(opts.skip);\n if (opts.every !== undefined) fields[\"every\"] = String(opts.every);\n if (opts.limit !== undefined) fields[\"limit\"] = String(opts.limit);\n if (opts.skipFirstSeconds !== undefined)\n fields[\"skip_first_seconds\"] = String(opts.skipFirstSeconds);\n if (opts.useTimecode !== undefined) fields[\"use_timecode\"] = opts.useTimecode ? \"true\" : \"false\";\n if (opts.accurateOffsets !== undefined)\n fields[\"accurate_offsets\"] = opts.accurateOffsets ? \"true\" : \"false\";\n return fields;\n}\n\ninterface MaybeError {\n status?: unknown;\n error?: { error_code?: number; error_message?: string } | undefined;\n result?: unknown;\n}\n\nfunction isDeprecationPassThrough(body: MaybeError): boolean {\n return body.error?.error_code === DEPRECATED_PARAMS_CODE && body.result != null;\n}\n\nfunction maybeWarnAndStrip(body: MaybeError): void {\n if (!isDeprecationPassThrough(body)) return;\n const msg = body.error?.error_message ?? \"Deprecated parameter used\";\n // Mirror audd-python behaviour: emit a warning, then look like a success.\n console.warn(`audd: deprecated parameter — ${msg}`);\n delete body.error;\n body.status = \"success\";\n}\n\n/**\n * Inspect a response, raise typed errors for obvious failures, else return\n * the body dict. Mirror of `audd-python` `_decode_or_raise`.\n *\n * Distinguishes:\n * - non-2xx HTTP with non-JSON body → AudDServerError (preserves status)\n * - 2xx with non-JSON body → AudDSerializationError\n * - status=error with code-51 + result → emit warning, strip, fall through\n * - status=error otherwise → raise typed exception\n * - status=success or stripped → return body\n */\nexport function decodeOrRaise(resp: HttpResponse): Record<string, unknown> {\n const body = resp.jsonBody;\n if (typeof body !== \"object\" || body === null || Array.isArray(body)) {\n if (resp.httpStatus >= HTTP_CLIENT_ERROR_FLOOR) {\n throw new AudDServerError({\n errorCode: 0,\n message: `HTTP ${String(resp.httpStatus)} with non-JSON response body`,\n httpStatus: resp.httpStatus,\n requestId: resp.requestId,\n rawResponse: resp.rawText,\n });\n }\n throw new AudDSerializationError(\"Unparseable response\", resp.rawText);\n }\n const obj = body as Record<string, unknown> & MaybeError;\n maybeWarnAndStrip(obj);\n\n if (obj.status === \"error\") {\n raiseFromErrorResponse(obj, {\n httpStatus: resp.httpStatus,\n requestId: resp.requestId,\n });\n }\n if (obj.status === \"success\") {\n return obj;\n }\n throw new AudDServerError({\n errorCode: 0,\n message: `Unexpected response status: ${JSON.stringify(obj.status)}`,\n httpStatus: resp.httpStatus,\n requestId: resp.requestId,\n rawResponse: obj,\n });\n}\n\nfunction decodeRecognize(resp: HttpResponse): RecognitionResult | null {\n const body = decodeOrRaise(resp);\n const result = body[\"result\"];\n if (result == null) return null;\n return parseRecognitionResult(result);\n}\n\nfunction decodeEnterprise(resp: HttpResponse): EnterpriseMatch[] {\n const body = decodeOrRaise(resp);\n const chunks = body[\"result\"];\n if (!Array.isArray(chunks)) return [];\n const out: EnterpriseMatch[] = [];\n for (const c of chunks) {\n const chunk = parseEnterpriseChunkResult(c);\n out.push(...chunk.songs);\n }\n return out;\n}\n\nasync function runRetried<T extends HttpResponse>(\n fn: () => Promise<T>,\n policy: RetryPolicy,\n): Promise<T> {\n try {\n return await retry(fn, policy);\n } catch (err) {\n if (err instanceof TypeError) {\n throw new AudDConnectionError(`Network error: ${err.message}`, err);\n }\n if (err !== null && typeof err === \"object\" && (err as { name?: string }).name === \"AbortError\") {\n throw new AudDConnectionError(\"Request was aborted (timeout)\", err);\n }\n throw err;\n }\n}\n\n/**\n * The AudD client. Async-only — every method returns a `Promise`.\n *\n * ```ts\n * const audd = new AudD({ apiToken: \"test\" });\n * const result = await audd.recognize(\"https://audd.tech/example.mp3\");\n * ```\n *\n * Closes underlying resources via `close()` (or `[Symbol.asyncDispose]` if\n * the runtime supports explicit-resource-management).\n */\nexport class AudD {\n private readonly _http: HttpClient;\n private readonly _enterpriseHttp: HttpClient;\n private readonly _maxRetries: number;\n private readonly _backoffFactorMs: number;\n private _apiToken: string;\n private _onEvent: OnEventHook | undefined;\n private _streams: Streams | undefined;\n private _customCatalog: CustomCatalog | undefined;\n private _advanced: Advanced | undefined;\n\n /** Construct with just an api_token. Falls back to AUDD_API_TOKEN env var if omitted. */\n constructor(apiToken?: string);\n /** Construct with an api_token and additional options (timeouts, retries, custom fetch, onEvent hook). */\n constructor(apiToken: string, opts: Omit<AudDOptions, \"apiToken\">);\n /** Construct with an options object (any combination of apiToken + extras). */\n constructor(opts: AudDOptions);\n constructor(arg?: string | AudDOptions, extra?: Omit<AudDOptions, \"apiToken\">) {\n const opts: AudDOptions =\n typeof arg === \"string\"\n ? { apiToken: arg, ...(extra ?? {}) }\n : (arg ?? {});\n const token = resolveToken(opts.apiToken);\n this._apiToken = token;\n this._onEvent = opts.onEvent;\n this._maxRetries = opts.maxRetries ?? 3;\n this._backoffFactorMs = (opts.backoffFactorMs ?? 500);\n this._http = new HttpClient({\n apiToken: token,\n ...(opts.fetch !== undefined ? { fetch: opts.fetch } : {}),\n });\n this._enterpriseHttp = new HttpClient({\n apiToken: token,\n ...(opts.fetch !== undefined ? { fetch: opts.fetch } : {}),\n defaultTimeoutMs: ENTERPRISE_TIMEOUT_MS,\n });\n }\n\n /** Current api_token. Returns the in-effect token after any rotations. */\n get apiToken(): string {\n return this._apiToken;\n }\n\n /**\n * Rotate the api_token used for subsequent requests. In-flight requests\n * continue with the old token (no abort).\n */\n setApiToken(newToken: string): void {\n if (typeof newToken !== \"string\" || newToken === \"\") {\n throw new Error(\"setApiToken requires a non-empty string\");\n }\n this._apiToken = newToken;\n this._http.setApiToken(newToken);\n this._enterpriseHttp.setApiToken(newToken);\n // Streams namespace caches the token via a getter; nothing to flush there.\n }\n\n private policyFor(retryClass: RetryClass): RetryPolicy {\n return {\n ...defaultPolicy(retryClass),\n maxAttempts: this._maxRetries,\n backoffFactorMs: this._backoffFactorMs,\n };\n }\n\n /** Sub-namespace for stream management + longpoll. Lazy-instantiated. */\n get streams(): Streams {\n if (this._streams === undefined) {\n this._streams = new Streams(\n this._http,\n this.policyFor(\"read\"),\n this.policyFor(\"mutating\"),\n this._apiToken,\n );\n }\n return this._streams;\n }\n\n /** Sub-namespace for the private fingerprint catalog. NOT for recognition. */\n get customCatalog(): CustomCatalog {\n if (this._customCatalog === undefined) {\n // \"none\" — custom-catalog upload is metered; never retry on transport\n // failure (could double-charge). Surface a clean error instead.\n this._customCatalog = new CustomCatalog(this._http, this.policyFor(\"none\"));\n }\n return this._customCatalog;\n }\n\n /** Lyrics search + raw-request escape hatch. */\n get advanced(): Advanced {\n if (this._advanced === undefined) {\n // RECOGNITION policy: findLyrics is metered.\n this._advanced = new Advanced(this._http, this.policyFor(\"recognition\"));\n }\n return this._advanced;\n }\n\n /**\n * Recognize a short audio clip (≤25s) from a URL, file path, Blob, or bytes.\n *\n * Returns `null` when the server returns `status=success` with `result=null`\n * (no match) — distinct from a thrown error.\n */\n async recognize(source: Source, opts: RecognizeOptions = {}): Promise<RecognitionResult | null> {\n const reopen = prepareSource(source);\n const ret = formatReturn(opts.returnMetadata);\n const market = opts.market;\n\n const policy = this.policyFor(\"recognition\");\n const url = `${API_BASE}/`;\n const startedAt = Date.now();\n safeEmit(this._onEvent, {\n kind: \"request\", method: \"recognize\", url,\n requestId: null, httpStatus: null, elapsedMs: null, errorCode: null, extras: {},\n });\n\n let resp;\n try {\n resp = await runRetried(async () => {\n const prepared = await reopen();\n const fields: Record<string, FormFieldValue> = { ...prepared.fields };\n // extraParameters first; typed fields override on collision.\n if (opts.extraParameters) Object.assign(fields, opts.extraParameters);\n if (ret !== undefined) fields[\"return\"] = ret;\n if (market !== undefined) fields[\"market\"] = market;\n return this._http.postForm(url, fields, {\n ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}),\n ...(opts.signal !== undefined ? { signal: opts.signal } : {}),\n });\n }, policy);\n } catch (err) {\n safeEmit(this._onEvent, {\n kind: \"exception\", method: \"recognize\", url,\n requestId: null, httpStatus: null,\n elapsedMs: Date.now() - startedAt, errorCode: null,\n extras: { name: (err instanceof Error ? err.name : String(err)) },\n });\n throw err;\n }\n safeEmit(this._onEvent, {\n kind: \"response\", method: \"recognize\", url,\n requestId: resp.requestId, httpStatus: resp.httpStatus,\n elapsedMs: Date.now() - startedAt, errorCode: null, extras: {},\n });\n\n return decodeRecognize(resp);\n }\n\n /**\n * Enterprise recognition (long files). Returns a flat array of matches\n * across all chunks in the upstream response.\n *\n * Recommended: pass `limit: N` to cap result count when developing.\n */\n async recognizeEnterprise(\n source: Source,\n opts: RecognizeEnterpriseOptions = {},\n ): Promise<EnterpriseMatch[]> {\n const reopen = prepareSource(source);\n const extra = buildEnterpriseFields(opts);\n\n const policy = this.policyFor(\"recognition\");\n const resp = await runRetried(async () => {\n const prepared = await reopen();\n const fields: Record<string, FormFieldValue> = { ...prepared.fields, ...extra };\n return this._enterpriseHttp.postForm(`${ENTERPRISE_BASE}/`, fields, {\n ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}),\n ...(opts.signal !== undefined ? { signal: opts.signal } : {}),\n });\n }, policy);\n\n return decodeEnterprise(resp);\n }\n\n /** Release any underlying resources. (Currently a no-op for `fetch`-based transport.) */\n close(): void {\n /* fetch has no persistent connection pool to close */\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n this.close();\n await Promise.resolve();\n }\n}\n"]}
|