/** * Builds the key that answers "is this the same manifest?" for decision-reload throttling. * Android parity: `plugin-android` `internal/balancer-impl/.../ManifestKeyNormalizer.kt`. * * The throttle keys on the manifest URL, so a stream whose URL carries rotating non-content query * parameters looks like a brand-new manifest on every poll and the per-URL interval never engages. * Low-Latency HLS is the clearest case: a blocking reload appends delivery directives that change * every request while the content is identical. * * Scope note, measured rather than assumed (devs-committee task * cdn-balancer/2026-08-17_plugin-js-ll-hls-midstream-switch-smarttv, measurement M1): unlike * Android, plugin-js does NOT churn on its own intercept path — it strips the query before keying * there, and 40 rotating blocking reloads produced 2 decisions. The path that does churn is an * integrator calling `setManifestResource()` with the full low-latency URL: 12 such calls produced * 12 decisions. That is what this normalizer closes. * * It never touches the URL sent on the wire: the backend signs from the complete query-bearing * resource and matches customer URL rules against it, so the decision request keeps the raw URL. * * Parsing is string-based and order-preserving, so two URLs that genuinely differ can never * collapse onto one key through re-encoding or reordering. A parameter name is everything before * the FIRST `=` — credential values embed further `=` signs (`hdnts=st=1777985338~hmac=...`) and * splitting on each one would truncate the name. Matching is case-insensitive. * * Not ported from Android: `learnFromDecision`, which adds each provider's credential parameter * name from the decision payload. That belongs with per-CDN token management and is tracked * separately; the directives below are spec-fixed and need no learning. */ /** * LL-HLS blocking-reload delivery directives (RFC 8216bis 6.2.5). Fixed by the spec and meaningless * as content identifiers, so these are stripped unconditionally and cannot be configured away. */ export declare const ALWAYS_STRIPPED: string[]; /** * Default value of `BalancerOptions.ephemeralQueryParams`: common cache-busters, which rotate by * definition. Overridable — unlike {@link ALWAYS_STRIPPED} — because they are short generic words * an origin could legitimately use to select content. */ export declare const DEFAULT_EPHEMERAL_QUERY_PARAMS: string[]; /** * The manifest URL with ephemeral parameters removed, for use as a comparison key only. * Returns the input unchanged when there is nothing to strip. */ export declare function manifestKey(manifestUrl: string, configured?: string[]): string; declare const _default: { manifestKey: typeof manifestKey; ALWAYS_STRIPPED: string[]; DEFAULT_EPHEMERAL_QUERY_PARAMS: string[]; }; export default _default;