1 line
14 KiB
Plaintext
1 line
14 KiB
Plaintext
{"version":3,"file":"Loader.mjs","sources":["../../../src/assets/loader/Loader.ts"],"sourcesContent":["import { warn } from '../../utils/logging/warn';\nimport { path } from '../../utils/path';\nimport { convertToList } from '../utils/convertToList';\nimport { isSingleItem } from '../utils/isSingleItem';\n\nimport type { ResolvedAsset } from '../types';\nimport type { LoaderParser } from './parsers/LoaderParser';\nimport type { PromiseAndParser } from './types';\n\n/**\n * The Loader is responsible for loading all assets, such as images, spritesheets, audio files, etc.\n * It does not do anything clever with URLs - it just loads stuff!\n * Behind the scenes all things are cached using promises. This means it's impossible to load an asset more than once.\n * Through the use of LoaderParsers, the loader can understand how to load any kind of file!\n *\n * It is not intended that this class is created by developers - its part of the Asset class\n * This is the second major system of PixiJS' main Assets class\n * @memberof assets\n */\nexport class Loader\n{\n private readonly _parsers: LoaderParser[] = [];\n private _parserHash: Record<string, LoaderParser>;\n\n private _parsersValidated = false;\n\n /**\n * All loader parsers registered\n * @type {assets.LoaderParser[]}\n */\n public parsers = new Proxy(this._parsers, {\n set: (target, key, value) =>\n {\n this._parsersValidated = false;\n\n target[key as any as number] = value;\n\n return true;\n }\n });\n\n /** Cache loading promises that ae currently active */\n public promiseCache: Record<string, PromiseAndParser> = {};\n\n /** function used for testing */\n public reset(): void\n {\n this._parsersValidated = false;\n this.promiseCache = {};\n }\n\n /**\n * Used internally to generate a promise for the asset to be loaded.\n * @param url - The URL to be loaded\n * @param data - any custom additional information relevant to the asset being loaded\n * @returns - a promise that will resolve to an Asset for example a Texture of a JSON object\n */\n private _getLoadPromiseAndParser(url: string, data?: ResolvedAsset): PromiseAndParser\n {\n const result: PromiseAndParser = {\n promise: null,\n parser: null\n };\n\n result.promise = (async () =>\n {\n let asset = null;\n\n let parser: LoaderParser = null;\n\n // first check to see if the user has specified a parser\n if (data.loadParser)\n {\n // they have? lovely, lets use it\n parser = this._parserHash[data.loadParser];\n\n if (!parser)\n {\n // #if _DEBUG\n // eslint-disable-next-line max-len\n warn(`[Assets] specified load parser \"${data.loadParser}\" not found while loading ${url}`);\n // #endif\n }\n }\n\n // no parser specified, so lets try and find one using the tests\n if (!parser)\n {\n for (let i = 0; i < this.parsers.length; i++)\n {\n const parserX = this.parsers[i];\n\n if (parserX.load && parserX.test?.(url, data, this))\n {\n parser = parserX;\n break;\n }\n }\n\n if (!parser)\n {\n // #if _DEBUG\n // eslint-disable-next-line max-len\n warn(`[Assets] ${url} could not be loaded as we don't know how to parse it, ensure the correct parser has been added`);\n // #endif\n\n return null;\n }\n }\n\n asset = await parser.load(url, data, this);\n result.parser = parser;\n\n for (let i = 0; i < this.parsers.length; i++)\n {\n const parser = this.parsers[i];\n\n if (parser.parse)\n {\n if (parser.parse && await parser.testParse?.(asset, data, this))\n {\n // transform the asset..\n asset = await parser.parse(asset, data, this) || asset;\n\n result.parser = parser;\n }\n }\n }\n\n return asset;\n })();\n\n return result;\n }\n\n /**\n * Loads one or more assets using the parsers added to the Loader.\n * @example\n * // Single asset:\n * const asset = await Loader.load('cool.png');\n * console.log(asset);\n *\n * // Multiple assets:\n * const assets = await Loader.load(['cool.png', 'cooler.png']);\n * console.log(assets);\n * @param assetsToLoadIn - urls that you want to load, or a single one!\n * @param onProgress - For multiple asset loading only, an optional function that is called\n * when progress on asset loading is made. The function is passed a single parameter, `progress`,\n * which represents the percentage (0.0 - 1.0) of the assets loaded. Do not use this function\n * to detect when assets are complete and available, instead use the Promise returned by this function.\n */\n public async load<T = any>(\n assetsToLoadIn: string | ResolvedAsset,\n onProgress?: (progress: number) => void,\n ): Promise<T>;\n public async load<T = any>(\n assetsToLoadIn: string[] | ResolvedAsset[],\n onProgress?: (progress: number) => void,\n ): Promise<Record<string, T>>;\n public async load<T = any>(\n assetsToLoadIn: string | string[] | ResolvedAsset | ResolvedAsset[],\n onProgress?: (progress: number) => void,\n ): Promise<T | Record<string, T>>\n {\n if (!this._parsersValidated)\n {\n this._validateParsers();\n }\n\n let count = 0;\n\n const assets: Record<string, Promise<any>> = {};\n\n const singleAsset = isSingleItem(assetsToLoadIn);\n\n const assetsToLoad = convertToList<ResolvedAsset>(assetsToLoadIn, (item) => ({\n alias: [item],\n src: item,\n data: {}\n }));\n\n const total = assetsToLoad.length;\n\n const promises: Promise<void>[] = assetsToLoad.map(async (asset: ResolvedAsset) =>\n {\n const url = path.toAbsolute(asset.src);\n\n if (!assets[asset.src])\n {\n try\n {\n if (!this.promiseCache[url])\n {\n this.promiseCache[url] = this._getLoadPromiseAndParser(url, asset);\n }\n\n assets[asset.src] = await this.promiseCache[url].promise;\n\n // Only progress if nothing goes wrong\n if (onProgress) onProgress(++count / total);\n }\n catch (e)\n {\n // Delete eventually registered file and promises from internal cache\n // so they can be eligible for another loading attempt\n delete this.promiseCache[url];\n delete assets[asset.src];\n\n // Stop further execution\n throw new Error(`[Loader.load] Failed to load ${url}.\\n${e}`);\n }\n }\n });\n\n await Promise.all(promises);\n\n return singleAsset ? assets[assetsToLoad[0].src] : assets;\n }\n\n /**\n * Unloads one or more assets. Any unloaded assets will be destroyed, freeing up memory for your app.\n * The parser that created the asset, will be the one that unloads it.\n * @example\n * // Single asset:\n * const asset = await Loader.load('cool.png');\n *\n * await Loader.unload('cool.png');\n *\n * console.log(asset.destroyed); // true\n * @param assetsToUnloadIn - urls that you want to unload, or a single one!\n */\n public async unload(\n assetsToUnloadIn: string | string[] | ResolvedAsset | ResolvedAsset[],\n ): Promise<void>\n {\n const assetsToUnload = convertToList<ResolvedAsset>(assetsToUnloadIn, (item) => ({\n alias: [item],\n src: item,\n }));\n\n const promises: Promise<void>[] = assetsToUnload.map(async (asset: ResolvedAsset) =>\n {\n const url = path.toAbsolute(asset.src);\n\n const loadPromise = this.promiseCache[url];\n\n if (loadPromise)\n {\n const loadedAsset = await loadPromise.promise;\n\n delete this.promiseCache[url];\n\n await loadPromise.parser?.unload?.(loadedAsset, asset, this);\n }\n });\n\n await Promise.all(promises);\n }\n\n /** validates our parsers, right now it only checks for name conflicts but we can add more here as required! */\n private _validateParsers()\n {\n this._parsersValidated = true;\n\n this._parserHash = this._parsers\n .filter((parser) => parser.name)\n .reduce((hash, parser) =>\n {\n if (!parser.name)\n {\n // #if _DEBUG\n warn(`[Assets] loadParser should have a name`);\n // #endif\n }\n else if (hash[parser.name])\n {\n // #if _DEBUG\n warn(`[Assets] loadParser name conflict \"${parser.name}\"`);\n // #endif\n }\n\n return { ...hash, [parser.name]: parser };\n }, {} as Record<string, LoaderParser>);\n }\n}\n"],"names":["parser"],"mappings":"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"} |