{"version":3,"file":"BackgroundLoader.mjs","sources":["../../src/assets/BackgroundLoader.ts"],"sourcesContent":["import type { Loader } from './loader/Loader';\nimport type { ResolvedAsset } from './types';\n\n/**\n * The BackgroundLoader handles loading assets passively in the background to prepare them for future use.\n * It loads one asset at a time to minimize impact on application performance.\n *\n * Key features:\n * - Sequential loading of assets\n * - Automatic pause when high-priority loads occur\n * - Configurable concurrency\n * @example\n * ```ts\n * import { Assets } from 'pixi.js';\n *\n * // Background load level assets while in menu\n * Assets.backgroundLoad([\n *     'level1/background.png',\n *     'level1/sprites.json',\n *     'level1/music.mp3'\n * ]);\n *\n * // Assets will be instantly available when needed\n * const assets = await Assets.load([\n *     'level1/background.png',\n *     'level1/sprites.json'\n * ]);\n *\n * // Background load bundles\n * Assets.backgroundLoadBundle('level2');\n *\n * // Later, instant access\n * const level2 = await Assets.loadBundle('level2');\n * ```\n * > [!NOTE] You typically do not need to use this class directly. Use the main {@link Assets.backgroundLoad} API instead.\n * @remarks\n * - Background loading is automatically paused when `Assets.load()` is called\n * - Assets are loaded sequentially to minimize performance impact\n * - Assets are cached as they complete loading\n * - No progress tracking is available for background loading\n * @see {@link Assets.backgroundLoad} For the main background loading API\n * @see {@link Assets.backgroundLoadBundle} For background loading bundles\n * @category assets\n * @advanced\n */\nexport class BackgroundLoader\n{\n    /** Whether or not the loader should continue loading. */\n    private _isActive: boolean;\n\n    /** Assets to load. */\n    private readonly _assetList: ResolvedAsset[];\n\n    /** Whether or not the loader is loading. */\n    private _isLoading: boolean;\n\n    /** Number of assets to load at a time. */\n    private readonly _maxConcurrent: number;\n\n    /**\n     * Should the loader log to the console.\n     * @advanced\n     */\n    public verbose: boolean;\n    private readonly _loader: Loader;\n\n    /**\n     * @param loader\n     * @param verbose - should the loader log to the console\n     */\n    constructor(loader: Loader, verbose = false)\n    {\n        this._loader = loader;\n        this._assetList = [];\n        this._isLoading = false;\n        this._maxConcurrent = 1;\n        this.verbose = verbose;\n    }\n\n    /**\n     * Adds assets to the background loading queue. Assets are loaded one at a time to minimize\n     * performance impact.\n     * @param assetUrls - Array of resolved assets to load in the background\n     * @example\n     * ```ts\n     * // Add assets to background load queue\n     * backgroundLoader.add([\n     *     { src: 'images/level1/bg.png' },\n     *     { src: 'images/level1/characters.json' }\n     * ]);\n     *\n     * // Assets will load sequentially in the background\n     * // The loader automatically pauses when high-priority loads occur\n     * // e.g. Assets.load() is called\n     * ```\n     * @remarks\n     * - Assets are loaded one at a time to minimize performance impact\n     * - Loading automatically pauses when Assets.load() is called\n     * - No progress tracking is available for background loading\n     * - Assets are cached as they complete loading\n     * @internal\n     */\n    public add(assetUrls: ResolvedAsset[]): void\n    {\n        assetUrls.forEach((a) =>\n        {\n            this._assetList.push(a);\n        });\n\n        if (this.verbose)\n        {\n            // eslint-disable-next-line no-console\n            console.log('[BackgroundLoader] assets: ', this._assetList);\n        }\n\n        if (this._isActive && !this._isLoading)\n        {\n            void this._next();\n        }\n    }\n\n    /**\n     * Loads the next set of assets. Will try to load as many assets as it can at the same time.\n     *\n     * The max assets it will try to load at one time will be 4.\n     */\n    private async _next(): Promise<void>\n    {\n        if (this._assetList.length && this._isActive)\n        {\n            this._isLoading = true;\n\n            const toLoad = [];\n\n            const toLoadAmount = Math.min(this._assetList.length, this._maxConcurrent);\n\n            for (let i = 0; i < toLoadAmount; i++)\n            {\n                toLoad.push(this._assetList.pop());\n            }\n\n            await this._loader.load(toLoad);\n\n            this._isLoading = false;\n\n            void this._next();\n        }\n    }\n\n    /**\n     * Controls the active state of the background loader. When active, the loader will\n     * continue processing its queue. When inactive, loading is paused.\n     * @returns Whether the background loader is currently active\n     * @example\n     * ```ts\n     * // Pause background loading\n     * backgroundLoader.active = false;\n     *\n     * // Resume background loading\n     * backgroundLoader.active = true;\n     *\n     * // Check current state\n     * console.log(backgroundLoader.active); // true/false\n     *\n     * // Common use case: Pause during intensive operations\n     * backgroundLoader.active = false;  // Pause background loading\n     * ... // Perform high-priority tasks\n     * backgroundLoader.active = true;   // Resume background loading\n     * ```\n     * @remarks\n     * - Setting to true resumes loading immediately\n     * - Setting to false pauses after current asset completes\n     * - Background loading is automatically paused during `Assets.load()`\n     * - Assets already being loaded will complete even when set to false\n     */\n    public get active(): boolean\n    {\n        return this._isActive;\n    }\n\n    set active(value: boolean)\n    {\n        if (this._isActive === value) return;\n\n        this._isActive = value;\n\n        if (value && !this._isLoading)\n        {\n            void this._next();\n        }\n    }\n}\n"],"names":[],"mappings":";AA6CO,MAAM,gBAAA,CACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBI,WAAA,CAAY,MAAA,EAAgB,OAAA,GAAU,KAAA,EACtC;AACI,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,aAAa,EAAC;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBO,IAAI,SAAA,EACX;AACI,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,KACnB;AACI,MAAA,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,IAAI,KAAK,OAAA,EACT;AAEI,MAAA,OAAA,CAAQ,GAAA,CAAI,6BAAA,EAA+B,IAAA,CAAK,UAAU,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,UAAA,EAC5B;AACI,MAAA,KAAK,KAAK,KAAA,EAAM;AAAA,IACpB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,KAAA,GACd;AACI,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,IAAU,IAAA,CAAK,SAAA,EACnC;AACI,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAElB,MAAA,MAAM,SAAS,EAAC;AAEhB,MAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,KAAK,UAAA,CAAW,MAAA,EAAQ,KAAK,cAAc,CAAA;AAEzE,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,EAAc,CAAA,EAAA,EAClC;AACI,QAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,GAAA,EAAK,CAAA;AAAA,MACrC;AAEA,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAE9B,MAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAElB,MAAA,KAAK,KAAK,KAAA,EAAM;AAAA,IACpB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BA,IAAW,MAAA,GACX;AACI,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA,EAEA,IAAI,OAAO,KAAA,EACX;AACI,IAAA,IAAI,IAAA,CAAK,cAAc,KAAA,EAAO;AAE9B,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAEjB,IAAA,IAAI,KAAA,IAAS,CAAC,IAAA,CAAK,UAAA,EACnB;AACI,MAAA,KAAK,KAAK,KAAA,EAAM;AAAA,IACpB;AAAA,EACJ;AACJ;;;;"}