# `manifest` — single-entry `IrManifest` for the outdoor-swimming-pool IR _(no submodules)_ ## Purpose Declares the lone `IrManifestEntry` shipped by `@suaveplan/audio-ir-room-plugin-pool`. The entry's `uri` is a `fallback://?u=&u=` URI built at module load by `buildFallbackUri` from `@suaveplan/storage-uri-plugin-fallback` — when the consuming resolver has both a `bundle://` plugin and an `https://` plugin wired, the shipped `fallback://` walk hits the in-package WAV first and only reaches for the CDN copy when the local file is absent. The manifest also pins the **decoded** `channels` and `sampleRate` of the bundled WAV (`channels = 1`, `sampleRate = 48000`) so the loader's `validateAndFinalize` step can reject any subsequent re-encode that drifts from those values. Both numbers were obtained by feeding `files/outdoor-swimming-pool.wav` through `decodeWav` once at manifest-authoring time. ## Features - Round-trips through `IrManifestSchema` at module load — any drift in the schema fails the build before `dist/` is emitted. - `BUNDLE_PACKAGE_SLUG`, `BUNDLE_URI`, `CDN_URI`, `ENTRY_ID`, `CHANNELS`, `SAMPLE_RATE` exported as named `const` literals so consumers can refer to them without re-deriving from `manifest.entries[0]`. - Frozen at runtime (`IrManifestSchema` applies `Object.freeze` to the parsed manifest + every entry). ## Usage: Basic ```ts import { manifest } from "@suaveplan/audio-ir-room-plugin-pool/manifest"; console.log(manifest.packageSlug); // "pool" console.log(manifest.entries[0].id); // "pool-outdoor-swimming-pool" ``` ## Usage: Advanced ```ts import { BUNDLE_URI, CDN_URI, ENTRY_ID, manifest, } from "@suaveplan/audio-ir-room-plugin-pool/manifest"; import { parseFallbackUri } from "@suaveplan/storage-uri-plugin-fallback"; const entry = manifest.entries[0]; const parsed = parseFallbackUri(entry.uri); console.log(parsed.candidates); // [BUNDLE_URI, CDN_URI] console.log(entry.id === ENTRY_ID); // true ``` ## API Reference | Symbol | Kind | Description | | --- | --- | --- | | `manifest` | `IrManifest` | Frozen single-entry manifest. | | `BUNDLE_PACKAGE_SLUG` | `"audio-ir-room-plugin-pool"` | Slug expected by the bundle plugin. | | `BUNDLE_URI` | string literal | Bundle-local URI for the WAV. | | `CDN_URI` | string literal | HTTPS CDN URI for the WAV. | | `ENTRY_ID` | `"pool-outdoor-swimming-pool"` | Entry id within the registry. | | `CHANNELS` | `1` | Decoded channel count of the WAV. | | `SAMPLE_RATE` | `48000` | Decoded sample rate of the WAV (Hz). | ## Implementation Notes The manifest constants are NOT optional — the spec for this package requires them to equal the values measured by decoding `files/outdoor-swimming-pool.wav` at authoring time. If the bundled WAV is ever re-mastered, both `CHANNELS` and `SAMPLE_RATE` MUST be updated to match the new decode result, and the file-presence integration test SHOULD re-run as part of that change to assert the new constants. `buildFallbackUri([BUNDLE_URI, CDN_URI])` runs at module load. The ordering of candidates IS the failover policy — bundle wins when present, CDN wins when bundle reports `BUNDLE_URI.NOT_FOUND`. Reversing the array would silently flip that policy without a separate spec change, so the constants are kept verbose and explicit rather than inlined. The `license` field intentionally says "All Rights Reserved — Suaveplan internal media library" because the source media library has no public license attached. Consumers SHOULD NOT redistribute the bundled WAV outside the Suaveplan distribution.