@audd/sdk 1.4.7
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/LICENSE +21 -0
- package/README.md +335 -0
- package/dist/http-y2YwjfAl.d.cts +37 -0
- package/dist/http-y2YwjfAl.d.ts +37 -0
- package/dist/index.cjs +1442 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +533 -0
- package/dist/index.d.ts +533 -0
- package/dist/index.js +1398 -0
- package/dist/index.js.map +1 -0
- package/dist/longpoll.cjs +246 -0
- package/dist/longpoll.cjs.map +1 -0
- package/dist/longpoll.d.cts +58 -0
- package/dist/longpoll.d.ts +58 -0
- package/dist/longpoll.js +244 -0
- package/dist/longpoll.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +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/streams.ts","../src/customCatalog.ts","../src/advanced.ts","../src/client.ts"],"names":["fsPromises","path","decodeSuccess","runRetried","API_BASE"],"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 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 \"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 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\nexport interface StreamCallbackResultEntry {\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 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 rawResponse: Record<string, unknown>;\n}\n\nconst STREAM_CALLBACK_RESULT_ENTRY_KEYS = [\n \"artist\",\n \"title\",\n \"score\",\n \"album\",\n \"release_date\",\n \"label\",\n \"song_link\",\n \"apple_music\",\n \"spotify\",\n \"deezer\",\n \"napster\",\n \"musicbrainz\",\n] as const;\n\nexport function parseStreamCallbackResultEntry(raw: unknown): StreamCallbackResultEntry {\n const r = requireObject(raw, \"StreamCallbackResultEntry\");\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(\"StreamCallbackResultEntry: artist not string\");\n if (title === undefined) throw new TypeError(\"StreamCallbackResultEntry: title not string\");\n if (score === undefined) throw new TypeError(\"StreamCallbackResultEntry: 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 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_RESULT_ENTRY_KEYS),\n rawResponse: r,\n };\n}\n\nexport interface StreamCallbackResult {\n radioId: number;\n timestamp?: string | undefined;\n playLength?: number | undefined;\n results: StreamCallbackResultEntry[];\n extras: Record<string, unknown>;\n rawResponse: Record<string, unknown>;\n}\n\nconst STREAM_CALLBACK_RESULT_KEYS = [\n \"radio_id\",\n \"timestamp\",\n \"play_length\",\n \"results\",\n] as const;\n\nexport function parseStreamCallbackResult(raw: unknown): StreamCallbackResult {\n const r = requireObject(raw, \"StreamCallbackResult\");\n const radioId = asNumber(r.radio_id);\n if (radioId === undefined) throw new TypeError(\"StreamCallbackResult: radio_id not number\");\n const resultsRaw = r.results;\n if (!Array.isArray(resultsRaw)) throw new TypeError(\"StreamCallbackResult: results not array\");\n return {\n radioId,\n timestamp: asString(r.timestamp),\n playLength: asNumber(r.play_length),\n results: resultsRaw.map(parseStreamCallbackResultEntry),\n extras: pickExtras(r, STREAM_CALLBACK_RESULT_KEYS),\n rawResponse: r,\n };\n}\n\nexport interface StreamCallbackNotification {\n radioId: number;\n streamRunning?: boolean | undefined;\n notificationCode: number;\n notificationMessage: string;\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\n/**\n * Discriminated union: a parsed callback payload is either a recognition\n * result or a notification.\n */\nexport interface StreamCallbackPayload {\n /** Set when this is a recognition result delivery. */\n result: StreamCallbackResult | null;\n /** Set when this is a stream-state notification. */\n notification: StreamCallbackNotification | null;\n /** Notification time (epoch seconds). */\n time: number | null;\n /** Original parsed JSON body. */\n rawPayload: Record<string, unknown>;\n readonly isResult: boolean;\n readonly isNotification: boolean;\n}\n\nexport function parseStreamCallback(raw: unknown): StreamCallbackPayload {\n const r = requireObject(raw, \"StreamCallbackPayload\");\n if (\"notification\" in r) {\n const notification = parseStreamCallbackNotification(r.notification);\n const time = asNumber(r.time) ?? null;\n return {\n result: null,\n notification,\n time,\n rawPayload: r,\n get isResult() {\n return false;\n },\n get isNotification() {\n return true;\n },\n };\n }\n const inner = requireObject(r.result, \"StreamCallbackPayload.result\");\n const result = parseStreamCallbackResult(inner);\n return {\n result,\n notification: null,\n time: null,\n rawPayload: r,\n get isResult() {\n return true;\n },\n get isNotification() {\n return false;\n },\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., `customCatalog.add`:\n * retry only on pre-upload connection failures. DO NOT retry\n * 5xx (the side effect may have happened).\n */\nexport type RetryClass = \"read\" | \"recognition\" | \"mutating\";\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 }\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 }\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 } from \"./errors.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\nexport { parseStreamCallback as parseCallback } from \"./models.js\";\n","/** Streams namespace — setCallbackUrl, addStream, longpoll with preflight, etc. */\nimport { addReturnToUrl, deriveLongpollCategory } 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 {\n parseStream,\n parseStreamCallback,\n type Stream,\n type StreamCallbackPayload,\n} from \"./models.js\";\nimport { retry, type RetryPolicy } from \"./retry.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\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 /** Parse a callback POST body into a typed `StreamCallbackPayload`. */\n parseCallback(body: unknown): StreamCallbackPayload {\n return parseStreamCallback(body);\n }\n\n /**\n * Longpoll the AudD subscription endpoint, yielding parsed JSON dicts\n * (recognition events, notifications, or `{ timeout: ... }` markers).\n *\n * By default, performs a one-time `getCallbackUrl` preflight. If the\n * server returns code 19 (no callback URL configured), throws\n * `AudDInvalidRequestError` with an actionable hint. Pass\n * `skipCallbackCheck: true` to bypass.\n */\n longpoll(category: string, opts: LongpollOptions = {}): AsyncIterable<Record<string, unknown>> {\n const skipCheck = opts.skipCallbackCheck ?? false;\n const timeoutSec = opts.timeout ?? 50;\n const initialSince = opts.sinceTime;\n const getCallbackUrl = (): Promise<string> => this.getCallbackUrl();\n const httpGet = (params: Record<string, string | undefined>): Promise<HttpResponse> =>\n this.http.get(`${API_BASE}/longpoll/`, params);\n const readPolicy = this.readPolicy;\n\n return {\n [Symbol.asyncIterator](): AsyncIterator<Record<string, unknown>> {\n let preflighted = skipCheck;\n let curSince = initialSince;\n\n return {\n async next(): Promise<IteratorResult<Record<string, unknown>>> {\n if (!preflighted) {\n try {\n await getCallbackUrl();\n } catch (err) {\n if (\n err instanceof AudDAPIError &&\n err.errorCode === NO_CALLBACK_ERROR_CODE\n ) {\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 preflighted = true;\n }\n\n const params: Record<string, string | undefined> = {\n category,\n timeout: String(timeoutSec),\n };\n if (curSince !== undefined) params[\"since_time\"] = String(curSince);\n\n const resp = await runRetried(() => httpGet(params), readPolicy);\n const body = resp.jsonBody;\n if (typeof body !== \"object\" || body === null || Array.isArray(body)) {\n throw new AudDSerializationError(\n \"Unparseable longpoll response\",\n resp.rawText,\n );\n }\n const dict = body as Record<string, unknown>;\n const ts = dict[\"timestamp\"];\n if (typeof ts === \"number\") curSince = ts;\n return { value: dict, done: false };\n },\n };\n },\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 mutatingPolicy: 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 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.mutatingPolicy);\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 this._customCatalog = new CustomCatalog(this._http, this.policyFor(\"mutating\"));\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"]}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/errors.ts
|
|
4
|
+
var AudDError = class extends Error {
|
|
5
|
+
name = "AudDError";
|
|
6
|
+
};
|
|
7
|
+
var AudDAPIError = class extends AudDError {
|
|
8
|
+
name = "AudDAPIError";
|
|
9
|
+
errorCode;
|
|
10
|
+
httpStatus;
|
|
11
|
+
requestId;
|
|
12
|
+
requestedParams;
|
|
13
|
+
requestMethod;
|
|
14
|
+
brandedMessage;
|
|
15
|
+
rawResponse;
|
|
16
|
+
/** Original `error_message` from the server. (`Error.message` may be overridden by subclasses.) */
|
|
17
|
+
serverMessage;
|
|
18
|
+
constructor(init) {
|
|
19
|
+
super(`[#${init.errorCode}] ${init.message}`);
|
|
20
|
+
this.errorCode = init.errorCode;
|
|
21
|
+
this.serverMessage = init.message;
|
|
22
|
+
this.httpStatus = init.httpStatus;
|
|
23
|
+
this.requestId = init.requestId ?? null;
|
|
24
|
+
this.requestedParams = init.requestedParams ?? {};
|
|
25
|
+
this.requestMethod = init.requestMethod ?? null;
|
|
26
|
+
this.brandedMessage = init.brandedMessage ?? null;
|
|
27
|
+
this.rawResponse = init.rawResponse ?? null;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var AudDServerError = class extends AudDAPIError {
|
|
31
|
+
name = "AudDServerError";
|
|
32
|
+
};
|
|
33
|
+
var AudDConnectionError = class extends AudDError {
|
|
34
|
+
name = "AudDConnectionError";
|
|
35
|
+
cause;
|
|
36
|
+
constructor(message, cause) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.cause = cause;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
var AudDSerializationError = class extends AudDError {
|
|
42
|
+
name = "AudDSerializationError";
|
|
43
|
+
rawText;
|
|
44
|
+
constructor(message, rawText = "") {
|
|
45
|
+
super(message);
|
|
46
|
+
this.rawText = rawText;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// src/retry.ts
|
|
51
|
+
var DEFAULT_BACKOFF_FACTOR_MS = 500;
|
|
52
|
+
var DEFAULT_BACKOFF_MAX_MS = 3e4;
|
|
53
|
+
var DEFAULT_MAX_ATTEMPTS = 3;
|
|
54
|
+
var HTTP_REQUEST_TIMEOUT = 408;
|
|
55
|
+
var HTTP_TOO_MANY_REQUESTS = 429;
|
|
56
|
+
var HTTP_SERVER_ERROR_FLOOR = 500;
|
|
57
|
+
function defaultPolicy(retryClass) {
|
|
58
|
+
return {
|
|
59
|
+
retryClass,
|
|
60
|
+
maxAttempts: DEFAULT_MAX_ATTEMPTS,
|
|
61
|
+
backoffFactorMs: DEFAULT_BACKOFF_FACTOR_MS,
|
|
62
|
+
backoffMaxMs: DEFAULT_BACKOFF_MAX_MS
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function backoffDelayMs(attempt, policy) {
|
|
66
|
+
const base = Math.min(policy.backoffFactorMs * 2 ** attempt, policy.backoffMaxMs);
|
|
67
|
+
return base * (0.5 + Math.random());
|
|
68
|
+
}
|
|
69
|
+
function isAbortError(err) {
|
|
70
|
+
if (err === null || typeof err !== "object") return false;
|
|
71
|
+
const e = err;
|
|
72
|
+
return e.name === "AbortError";
|
|
73
|
+
}
|
|
74
|
+
function isPreUploadConnectionError(err) {
|
|
75
|
+
if (isAbortError(err)) return false;
|
|
76
|
+
return err instanceof TypeError;
|
|
77
|
+
}
|
|
78
|
+
function shouldRetryResponse(resp, retryClass) {
|
|
79
|
+
const s = resp.httpStatus;
|
|
80
|
+
switch (retryClass) {
|
|
81
|
+
case "read":
|
|
82
|
+
return s === HTTP_REQUEST_TIMEOUT || s === HTTP_TOO_MANY_REQUESTS || s >= HTTP_SERVER_ERROR_FLOOR;
|
|
83
|
+
case "recognition":
|
|
84
|
+
return s >= HTTP_SERVER_ERROR_FLOOR;
|
|
85
|
+
case "mutating":
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function shouldRetryError(err, retryClass) {
|
|
90
|
+
switch (retryClass) {
|
|
91
|
+
case "read":
|
|
92
|
+
return isPreUploadConnectionError(err) || isAbortError(err);
|
|
93
|
+
case "recognition":
|
|
94
|
+
return isPreUploadConnectionError(err);
|
|
95
|
+
case "mutating":
|
|
96
|
+
return isPreUploadConnectionError(err);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function sleep(ms) {
|
|
100
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
101
|
+
}
|
|
102
|
+
async function retry(fn, policy) {
|
|
103
|
+
let lastError;
|
|
104
|
+
let lastResp;
|
|
105
|
+
let haveResp = false;
|
|
106
|
+
for (let attempt = 0; attempt < policy.maxAttempts; attempt++) {
|
|
107
|
+
try {
|
|
108
|
+
const resp = await fn();
|
|
109
|
+
if (!shouldRetryResponse(resp, policy.retryClass)) return resp;
|
|
110
|
+
lastResp = resp;
|
|
111
|
+
haveResp = true;
|
|
112
|
+
lastError = void 0;
|
|
113
|
+
} catch (err) {
|
|
114
|
+
if (!shouldRetryError(err, policy.retryClass)) throw err;
|
|
115
|
+
lastError = err;
|
|
116
|
+
haveResp = false;
|
|
117
|
+
if (attempt + 1 >= policy.maxAttempts) throw err;
|
|
118
|
+
}
|
|
119
|
+
if (attempt + 1 >= policy.maxAttempts) break;
|
|
120
|
+
await sleep(backoffDelayMs(attempt, policy));
|
|
121
|
+
}
|
|
122
|
+
if (haveResp && lastResp !== void 0) return lastResp;
|
|
123
|
+
throw lastError;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// src/version.ts
|
|
127
|
+
var VERSION = "1.4.6";
|
|
128
|
+
|
|
129
|
+
// src/userAgent.ts
|
|
130
|
+
function userAgent() {
|
|
131
|
+
const node = typeof process !== "undefined" && process.version ? process.version.replace(/^v/, "") : "unknown";
|
|
132
|
+
const platform = typeof process !== "undefined" && process.platform ? process.platform : "browser";
|
|
133
|
+
return `audd-node/${VERSION} node/${node} (${platform})`;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// src/longpoll.ts
|
|
137
|
+
var LONGPOLL_URL = "https://api.audd.io/longpoll/";
|
|
138
|
+
var HTTP_CLIENT_ERROR_FLOOR = 400;
|
|
139
|
+
var DEFAULT_TIMEOUT_MS = 12e4;
|
|
140
|
+
function decode(jsonBody, httpStatus, rawText) {
|
|
141
|
+
if (httpStatus >= HTTP_CLIENT_ERROR_FLOOR) {
|
|
142
|
+
throw new AudDServerError({
|
|
143
|
+
errorCode: 0,
|
|
144
|
+
message: `Longpoll endpoint returned HTTP ${String(httpStatus)}`,
|
|
145
|
+
httpStatus,
|
|
146
|
+
requestId: null,
|
|
147
|
+
rawResponse: jsonBody ?? rawText
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
if (typeof jsonBody !== "object" || jsonBody === null || Array.isArray(jsonBody)) {
|
|
151
|
+
throw new AudDSerializationError("Longpoll response was not a JSON object", rawText);
|
|
152
|
+
}
|
|
153
|
+
return jsonBody;
|
|
154
|
+
}
|
|
155
|
+
var LongpollConsumer = class {
|
|
156
|
+
constructor(category, opts = {}) {
|
|
157
|
+
this.category = category;
|
|
158
|
+
this.fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);
|
|
159
|
+
const base = defaultPolicy("read");
|
|
160
|
+
this.policy = {
|
|
161
|
+
...base,
|
|
162
|
+
maxAttempts: opts.maxRetries ?? base.maxAttempts,
|
|
163
|
+
backoffFactorMs: opts.backoffFactorMs ?? base.backoffFactorMs
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
category;
|
|
167
|
+
fetchImpl;
|
|
168
|
+
policy;
|
|
169
|
+
iterate(opts = {}) {
|
|
170
|
+
const category = this.category;
|
|
171
|
+
const policy = this.policy;
|
|
172
|
+
const fetchImpl = this.fetchImpl;
|
|
173
|
+
const initialSince = opts.sinceTime;
|
|
174
|
+
const timeoutSec = opts.timeout ?? 50;
|
|
175
|
+
async function fetchOnce(curSince) {
|
|
176
|
+
const u = new URL(LONGPOLL_URL);
|
|
177
|
+
u.searchParams.set("category", category);
|
|
178
|
+
u.searchParams.set("timeout", String(timeoutSec));
|
|
179
|
+
if (curSince !== void 0) u.searchParams.set("since_time", String(curSince));
|
|
180
|
+
const controller = new AbortController();
|
|
181
|
+
const timer = setTimeout(() => {
|
|
182
|
+
controller.abort();
|
|
183
|
+
}, DEFAULT_TIMEOUT_MS);
|
|
184
|
+
try {
|
|
185
|
+
const response = await fetchImpl(u.toString(), {
|
|
186
|
+
method: "GET",
|
|
187
|
+
headers: { "User-Agent": userAgent() },
|
|
188
|
+
signal: controller.signal
|
|
189
|
+
});
|
|
190
|
+
const text = await response.text();
|
|
191
|
+
let json = null;
|
|
192
|
+
if (text !== "") {
|
|
193
|
+
try {
|
|
194
|
+
json = JSON.parse(text);
|
|
195
|
+
} catch {
|
|
196
|
+
json = null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
jsonBody: json,
|
|
201
|
+
httpStatus: response.status,
|
|
202
|
+
requestId: response.headers.get("x-request-id"),
|
|
203
|
+
rawText: text
|
|
204
|
+
};
|
|
205
|
+
} finally {
|
|
206
|
+
clearTimeout(timer);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
[Symbol.asyncIterator]() {
|
|
211
|
+
let curSince = initialSince;
|
|
212
|
+
return {
|
|
213
|
+
async next() {
|
|
214
|
+
let resp;
|
|
215
|
+
try {
|
|
216
|
+
resp = await retry(() => fetchOnce(curSince), policy);
|
|
217
|
+
} catch (err) {
|
|
218
|
+
if (err instanceof TypeError) {
|
|
219
|
+
throw new AudDConnectionError(`Network error: ${err.message}`, err);
|
|
220
|
+
}
|
|
221
|
+
if (err !== null && typeof err === "object" && err.name === "AbortError") {
|
|
222
|
+
throw new AudDConnectionError("Request was aborted (timeout)", err);
|
|
223
|
+
}
|
|
224
|
+
throw err;
|
|
225
|
+
}
|
|
226
|
+
const body = decode(resp.jsonBody, resp.httpStatus, resp.rawText);
|
|
227
|
+
const ts = body["timestamp"];
|
|
228
|
+
if (typeof ts === "number") curSince = ts;
|
|
229
|
+
return { value: body, done: false };
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/** Release any underlying resources. */
|
|
236
|
+
close() {
|
|
237
|
+
}
|
|
238
|
+
async [Symbol.asyncDispose]() {
|
|
239
|
+
this.close();
|
|
240
|
+
await Promise.resolve();
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
exports.LongpollConsumer = LongpollConsumer;
|
|
245
|
+
//# sourceMappingURL=longpoll.cjs.map
|
|
246
|
+
//# sourceMappingURL=longpoll.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/retry.ts","../src/version.ts","../src/userAgent.ts","../src/longpoll.ts"],"names":[],"mappings":"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","file":"longpoll.cjs","sourcesContent":["/** 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 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., `customCatalog.add`:\n * retry only on pre-upload connection failures. DO NOT retry\n * 5xx (the side effect may have happened).\n */\nexport type RetryClass = \"read\" | \"recognition\" | \"mutating\";\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 }\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 }\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","export const VERSION = \"1.4.6\";\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","/**\n * Tokenless longpoll consumer for browser/widget/extension use cases.\n *\n * Carries no api_token. The category alone authorizes the subscription. The\n * user/server who derived the category is responsible for ensuring a\n * callback URL is set on their account (we can't preflight that without a\n * token).\n *\n * Behavior:\n * - HTTP non-2xx → throws `AudDServerError` (no silent infinite loop)\n * - JSON decode failure on 2xx → throws `AudDSerializationError`\n * - READ-class retries on 5xx + connection failures, configurable via\n * `maxRetries` / `backoffFactorMs`\n * - `[Symbol.asyncDispose]()` + manual `close()` for resource cleanup\n *\n * Imported from `audd/longpoll` (browser-safe sub-entry, NOT the main\n * `audd` module — bundlers tree-shake the auth client out).\n */\n\nimport {\n AudDConnectionError,\n AudDSerializationError,\n AudDServerError,\n} from \"./errors.js\";\nimport type { FetchLike, HttpResponse } from \"./http.js\";\nimport { defaultPolicy, retry, type RetryPolicy } from \"./retry.js\";\nimport { userAgent } from \"./userAgent.js\";\n\nconst LONGPOLL_URL = \"https://api.audd.io/longpoll/\";\nconst HTTP_CLIENT_ERROR_FLOOR = 400;\nconst DEFAULT_TIMEOUT_MS = 120_000;\n\nexport interface LongpollConsumerOptions {\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}\n\nexport interface IterateOptions {\n sinceTime?: number;\n /** Server-side timeout in seconds (default 50). */\n timeout?: number;\n}\n\nfunction decode(\n jsonBody: unknown,\n httpStatus: number,\n rawText: string,\n): Record<string, unknown> {\n if (httpStatus >= HTTP_CLIENT_ERROR_FLOOR) {\n throw new AudDServerError({\n errorCode: 0,\n message: `Longpoll endpoint returned HTTP ${String(httpStatus)}`,\n httpStatus,\n requestId: null,\n rawResponse: jsonBody ?? rawText,\n });\n }\n if (typeof jsonBody !== \"object\" || jsonBody === null || Array.isArray(jsonBody)) {\n throw new AudDSerializationError(\"Longpoll response was not a JSON object\", rawText);\n }\n return jsonBody as Record<string, unknown>;\n}\n\n/**\n * Tokenless async longpoll consumer.\n *\n * ```ts\n * import { LongpollConsumer } from 'audd/longpoll';\n *\n * const consumer = new LongpollConsumer(\"abc123def\");\n * for await (const event of consumer.iterate({ timeout: 30 })) {\n * console.log(event);\n * }\n * ```\n */\nexport class LongpollConsumer {\n private readonly fetchImpl: FetchLike;\n private readonly policy: RetryPolicy;\n\n constructor(public readonly category: string, opts: LongpollConsumerOptions = {}) {\n this.fetchImpl = opts.fetch ?? ((globalThis.fetch as FetchLike).bind(globalThis));\n const base = defaultPolicy(\"read\");\n this.policy = {\n ...base,\n maxAttempts: opts.maxRetries ?? base.maxAttempts,\n backoffFactorMs: opts.backoffFactorMs ?? base.backoffFactorMs,\n };\n }\n\n iterate(opts: IterateOptions = {}): AsyncIterable<Record<string, unknown>> {\n const category = this.category;\n const policy = this.policy;\n const fetchImpl = this.fetchImpl;\n const initialSince = opts.sinceTime;\n const timeoutSec = opts.timeout ?? 50;\n\n async function fetchOnce(curSince: number | undefined): Promise<HttpResponse> {\n const u = new URL(LONGPOLL_URL);\n u.searchParams.set(\"category\", category);\n u.searchParams.set(\"timeout\", String(timeoutSec));\n if (curSince !== undefined) u.searchParams.set(\"since_time\", String(curSince));\n\n const controller = new AbortController();\n const timer = setTimeout(() => {\n controller.abort();\n }, DEFAULT_TIMEOUT_MS);\n try {\n const response = await fetchImpl(u.toString(), {\n method: \"GET\",\n headers: { \"User-Agent\": userAgent() },\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 }\n }\n\n return {\n [Symbol.asyncIterator](): AsyncIterator<Record<string, unknown>> {\n let curSince = initialSince;\n return {\n async next(): Promise<IteratorResult<Record<string, unknown>>> {\n let resp;\n try {\n resp = await retry(() => fetchOnce(curSince), policy);\n } catch (err) {\n if (err instanceof TypeError) {\n throw new AudDConnectionError(`Network error: ${err.message}`, err);\n }\n if (\n err !== null &&\n typeof err === \"object\" &&\n (err as { name?: string }).name === \"AbortError\"\n ) {\n throw new AudDConnectionError(\"Request was aborted (timeout)\", err);\n }\n throw err;\n }\n const body = decode(resp.jsonBody, resp.httpStatus, resp.rawText);\n const ts = body[\"timestamp\"];\n if (typeof ts === \"number\") curSince = ts;\n return { value: body, done: false };\n },\n };\n },\n };\n }\n\n /** Release any underlying resources. */\n close(): void {\n /* no persistent connections in fetch */\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n this.close();\n await Promise.resolve();\n }\n}\n"]}
|