d042afc7c78328a43221d8a4396351e1df6e96d35af43fa219a24c1cca0aa2c3.json 72 KB

1
  1. {"ast":null,"code":"/* eslint-disable @typescript-eslint/naming-convention */\nimport { WebRequest } from \"./webRequest.js\";\nimport { IsWindowObjectExist } from \"./domManagement.js\";\nimport { Observable } from \"./observable.js\";\nimport { FilesInputStore } from \"./filesInputStore.js\";\nimport { RetryStrategy } from \"./retryStrategy.js\";\nimport { BaseError, ErrorCodes, RuntimeError } from \"./error.js\";\nimport { DecodeBase64ToBinary, DecodeBase64ToString, EncodeArrayBufferToBase64 } from \"./stringTools.js\";\nimport { _functionContainer } from \"../Engines/Processors/shaderProcessor.js\";\nimport { EngineStore } from \"../Engines/engineStore.js\";\nimport { Logger } from \"./logger.js\";\nimport { TimingTools } from \"./timingTools.js\";\nimport { EngineFunctionContext } from \"../Engines/abstractEngine.functions.js\";\nimport { AbstractEngine } from \"../Engines/abstractEngine.js\";\nconst Base64DataUrlRegEx = new RegExp(/^data:([^,]+\\/[^,]+)?;base64,/i);\n/** @ignore */\nexport class LoadFileError extends RuntimeError {\n /**\n * Creates a new LoadFileError\n * @param message defines the message of the error\n * @param object defines the optional web request\n */\n constructor(message, object) {\n super(message, ErrorCodes.LoadFileError);\n this.name = \"LoadFileError\";\n BaseError._setPrototypeOf(this, LoadFileError.prototype);\n if (object instanceof WebRequest) {\n this.request = object;\n } else {\n this.file = object;\n }\n }\n}\n/** @ignore */\nexport class RequestFileError extends RuntimeError {\n /**\n * Creates a new LoadFileError\n * @param message defines the message of the error\n * @param request defines the optional web request\n */\n constructor(message, request) {\n super(message, ErrorCodes.RequestFileError);\n this.request = request;\n this.name = \"RequestFileError\";\n BaseError._setPrototypeOf(this, RequestFileError.prototype);\n }\n}\n/** @ignore */\nexport class ReadFileError extends RuntimeError {\n /**\n * Creates a new ReadFileError\n * @param message defines the message of the error\n * @param file defines the optional file\n */\n constructor(message, file) {\n super(message, ErrorCodes.ReadFileError);\n this.file = file;\n this.name = \"ReadFileError\";\n BaseError._setPrototypeOf(this, ReadFileError.prototype);\n }\n}\n/**\n * Removes unwanted characters from an url\n * @param url defines the url to clean\n * @returns the cleaned url\n */\nconst CleanUrl = url => {\n url = url.replace(/#/gm, \"%23\");\n return url;\n};\n/**\n * @internal\n */\nexport const FileToolsOptions = {\n /**\n * Gets or sets the retry strategy to apply when an error happens while loading an asset.\n * When defining this function, return the wait time before trying again or return -1 to\n * stop retrying and error out.\n */\n DefaultRetryStrategy: RetryStrategy.ExponentialBackoff(),\n /**\n * Gets or sets the base URL to use to load assets\n */\n BaseUrl: \"\",\n /**\n * Default behaviour for cors in the application.\n * It can be a string if the expected behavior is identical in the entire app.\n * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance)\n */\n CorsBehavior: \"anonymous\",\n /**\n * Gets or sets a function used to pre-process url before using them to load assets\n * @param url\n * @returns the processed url\n */\n PreprocessUrl: url => url,\n /**\n * Gets or sets the base URL to use to load scripts\n * Used for both JS and WASM\n */\n ScriptBaseUrl: \"\",\n /**\n * Gets or sets a function used to pre-process script url before using them to load.\n * Used for both JS and WASM\n * @param url defines the url to process\n * @returns the processed url\n */\n ScriptPreprocessUrl: url => url,\n /**\n * Gets or sets a function used to clean the url before using it to load assets\n * @param url defines the url to clean\n * @returns the cleaned url\n */\n CleanUrl\n};\n/**\n * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element.\n * @param url define the url we are trying\n * @param element define the dom element where to configure the cors policy\n * @internal\n */\nexport const SetCorsBehavior = (url, element) => {\n if (url && url.indexOf(\"data:\") === 0) {\n return;\n }\n if (FileToolsOptions.CorsBehavior) {\n if (typeof FileToolsOptions.CorsBehavior === \"string\" || FileToolsOptions.CorsBehavior instanceof String) {\n element.crossOrigin = FileToolsOptions.CorsBehavior;\n } else {\n const result = FileToolsOptions.CorsBehavior(url);\n if (result) {\n element.crossOrigin = result;\n }\n }\n }\n};\n/**\n * Configuration used to load images\n * @see #DKMEZK#2\n */\nexport const LoadImageConfiguration = {\n getRequiredSize: null\n};\n/**\n * Loads an image as an HTMLImageElement.\n * @param input url string, ArrayBuffer, or Blob to load\n * @param onLoad callback called when the image successfully loads\n * @param onError callback called when the image fails to load\n * @param offlineProvider offline provider for caching\n * @param mimeType optional mime type\n * @param imageBitmapOptions\n * @returns the HTMLImageElement of the loaded image\n * @internal\n */\nexport const LoadImage = (input, onLoad, onError, offlineProvider, mimeType = \"\", imageBitmapOptions) => {\n const engine = EngineStore.LastCreatedEngine;\n if (typeof HTMLImageElement === \"undefined\" && !(engine !== null && engine !== void 0 && engine._features.forceBitmapOverHTMLImageElement)) {\n onError(\"LoadImage is only supported in web or BabylonNative environments.\");\n return null;\n }\n let url;\n let usingObjectURL = false;\n if (input instanceof ArrayBuffer || ArrayBuffer.isView(input)) {\n if (typeof Blob !== \"undefined\" && typeof URL !== \"undefined\") {\n url = URL.createObjectURL(new Blob([input], {\n type: mimeType\n }));\n usingObjectURL = true;\n } else {\n url = `data:${mimeType};base64,` + EncodeArrayBufferToBase64(input);\n }\n } else if (input instanceof Blob) {\n url = URL.createObjectURL(input);\n usingObjectURL = true;\n } else {\n url = FileToolsOptions.CleanUrl(input);\n url = FileToolsOptions.PreprocessUrl(url);\n }\n const onErrorHandler = exception => {\n if (onError) {\n const inputText = url || input.toString();\n onError(`Error while trying to load image: ${inputText.indexOf(\"http\") === 0 || inputText.length <= 128 ? inputText : inputText.slice(0, 128) + \"...\"}`, exception);\n }\n };\n if (engine !== null && engine !== void 0 && engine._features.forceBitmapOverHTMLImageElement) {\n LoadFile(url, data => {\n engine.createImageBitmap(new Blob([data], {\n type: mimeType\n }), {\n premultiplyAlpha: \"none\",\n ...imageBitmapOptions\n }).then(imgBmp => {\n onLoad(imgBmp);\n if (usingObjectURL) {\n URL.revokeObjectURL(url);\n }\n }).catch(reason => {\n if (onError) {\n onError(\"Error while trying to load image: \" + input, reason);\n }\n });\n }, undefined, offlineProvider || undefined, true, (request, exception) => {\n onErrorHandler(exception);\n });\n return null;\n }\n const img = new Image();\n if (LoadImageConfiguration.getRequiredSize) {\n const size = LoadImageConfiguration.getRequiredSize(input);\n if (size.width) {\n img.width = size.width;\n }\n if (size.height) {\n img.height = size.height;\n }\n }\n SetCorsBehavior(url, img);\n const handlersList = [];\n const loadHandlersList = () => {\n handlersList.forEach(handler => {\n handler.target.addEventListener(handler.name, handler.handler);\n });\n };\n const unloadHandlersList = () => {\n handlersList.forEach(handler => {\n handler.target.removeEventListener(handler.name, handler.handler);\n });\n handlersList.length = 0;\n };\n const loadHandler = () => {\n unloadHandlersList();\n onLoad(img);\n // Must revoke the URL after calling onLoad to avoid security exceptions in\n // certain scenarios (e.g. when hosted in vscode).\n if (usingObjectURL && img.src) {\n URL.revokeObjectURL(img.src);\n }\n };\n const errorHandler = err => {\n unloadHandlersList();\n onErrorHandler(err);\n if (usingObjectURL && img.src) {\n URL.revokeObjectURL(img.src);\n }\n };\n const cspHandler = err => {\n if (err.blockedURI !== img.src || err.disposition === \"report\") {\n return;\n }\n unloadHandlersList();\n const cspException = new Error(`CSP violation of policy ${err.effectiveDirective} ${err.blockedURI}. Current policy is ${err.originalPolicy}`);\n EngineStore.UseFallbackTexture = false;\n onErrorHandler(cspException);\n if (usingObjectURL && img.src) {\n URL.revokeObjectURL(img.src);\n }\n img.src = \"\";\n };\n handlersList.push({\n target: img,\n name: \"load\",\n handler: loadHandler\n });\n handlersList.push({\n target: img,\n name: \"error\",\n handler: errorHandler\n });\n handlersList.push({\n target: document,\n name: \"securitypolicyviolation\",\n handler: cspHandler\n });\n loadHandlersList();\n const fromBlob = url.substring(0, 5) === \"blob:\";\n const fromData = url.substring(0, 5) === \"data:\";\n const noOfflineSupport = () => {\n if (fromBlob || fromData || !WebRequest.IsCustomRequestAvailable) {\n img.src = url;\n } else {\n LoadFile(url, (data, _, contentType) => {\n const type = !mimeType && contentType ? contentType : mimeType;\n const blob = new Blob([data], {\n type\n });\n const url = URL.createObjectURL(blob);\n usingObjectURL = true;\n img.src = url;\n }, undefined, offlineProvider || undefined, true, (_request, exception) => {\n onErrorHandler(exception);\n });\n }\n };\n const loadFromOfflineSupport = () => {\n if (offlineProvider) {\n offlineProvider.loadImage(url, img);\n }\n };\n if (!fromBlob && !fromData && offlineProvider && offlineProvider.enableTexturesOffline) {\n offlineProvider.open(loadFromOfflineSupport, noOfflineSupport);\n } else {\n if (url.indexOf(\"file:\") !== -1) {\n const textureName = decodeURIComponent(url.substring(5).toLowerCase());\n if (FilesInputStore.FilesToLoad[textureName] && typeof URL !== \"undefined\") {\n try {\n let blobURL;\n try {\n blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]);\n } catch (ex) {\n // Chrome doesn't support oneTimeOnly parameter\n blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]);\n }\n img.src = blobURL;\n usingObjectURL = true;\n } catch (e) {\n img.src = \"\";\n }\n return img;\n }\n }\n noOfflineSupport();\n }\n return img;\n};\n/**\n * Reads a file from a File object\n * @param file defines the file to load\n * @param onSuccess defines the callback to call when data is loaded\n * @param onProgress defines the callback to call during loading process\n * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer\n * @param onError defines the callback to call when an error occurs\n * @returns a file request object\n * @internal\n */\nexport const ReadFile = (file, onSuccess, onProgress, useArrayBuffer, onError) => {\n const reader = new FileReader();\n const fileRequest = {\n onCompleteObservable: new Observable(),\n abort: () => reader.abort()\n };\n reader.onloadend = () => fileRequest.onCompleteObservable.notifyObservers(fileRequest);\n if (onError) {\n reader.onerror = () => {\n onError(new ReadFileError(`Unable to read ${file.name}`, file));\n };\n }\n reader.onload = e => {\n //target doesn't have result from ts 1.3\n onSuccess(e.target[\"result\"]);\n };\n if (onProgress) {\n reader.onprogress = onProgress;\n }\n if (!useArrayBuffer) {\n // Asynchronous read\n reader.readAsText(file);\n } else {\n reader.readAsArrayBuffer(file);\n }\n return fileRequest;\n};\n/**\n * Loads a file from a url, a data url, or a file url\n * @param fileOrUrl file, url, data url, or file url to load\n * @param onSuccess callback called when the file successfully loads\n * @param onProgress callback called while file is loading (if the server supports this mode)\n * @param offlineProvider defines the offline provider for caching\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\n * @param onError callback called when the file fails to load\n * @param onOpened\n * @returns a file request object\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const LoadFile = (fileOrUrl, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError, onOpened) => {\n if (fileOrUrl.name) {\n return ReadFile(fileOrUrl, onSuccess, onProgress, useArrayBuffer, onError ? error => {\n onError(undefined, error);\n } : undefined);\n }\n const url = fileOrUrl;\n // If file and file input are set\n if (url.indexOf(\"file:\") !== -1) {\n let fileName = decodeURIComponent(url.substring(5).toLowerCase());\n if (fileName.indexOf(\"./\") === 0) {\n fileName = fileName.substring(2);\n }\n const file = FilesInputStore.FilesToLoad[fileName];\n if (file) {\n return ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError ? error => onError(undefined, new LoadFileError(error.message, error.file)) : undefined);\n }\n }\n // For a Base64 Data URL\n const {\n match,\n type\n } = TestBase64DataUrl(url);\n if (match) {\n const fileRequest = {\n onCompleteObservable: new Observable(),\n abort: () => () => {}\n };\n try {\n const data = useArrayBuffer ? DecodeBase64UrlToBinary(url) : DecodeBase64UrlToString(url);\n onSuccess(data, undefined, type);\n } catch (error) {\n if (onError) {\n onError(undefined, error);\n } else {\n Logger.Error(error.message || \"Failed to parse the Data URL\");\n }\n }\n TimingTools.SetImmediate(() => {\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\n });\n return fileRequest;\n }\n return RequestFile(url, (data, request) => {\n onSuccess(data, request === null || request === void 0 ? void 0 : request.responseURL, request === null || request === void 0 ? void 0 : request.getResponseHeader(\"content-type\"));\n }, onProgress, offlineProvider, useArrayBuffer, onError ? error => {\n onError(error.request, new LoadFileError(error.message, error.request));\n } : undefined, onOpened);\n};\n/**\n * Loads a file from a url\n * @param url url to load\n * @param onSuccess callback called when the file successfully loads\n * @param onProgress callback called while file is loading (if the server supports this mode)\n * @param offlineProvider defines the offline provider for caching\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\n * @param onError callback called when the file fails to load\n * @param onOpened callback called when the web request is opened\n * @returns a file request object\n * @internal\n */\nexport const RequestFile = (url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError, onOpened) => {\n url = FileToolsOptions.CleanUrl(url);\n url = FileToolsOptions.PreprocessUrl(url);\n const loadUrl = FileToolsOptions.BaseUrl + url;\n let aborted = false;\n const fileRequest = {\n onCompleteObservable: new Observable(),\n abort: () => aborted = true\n };\n const requestFile = () => {\n let request = new WebRequest();\n let retryHandle = null;\n let onReadyStateChange;\n const unbindEvents = () => {\n if (!request) {\n return;\n }\n if (onProgress) {\n request.removeEventListener(\"progress\", onProgress);\n }\n if (onReadyStateChange) {\n request.removeEventListener(\"readystatechange\", onReadyStateChange);\n }\n request.removeEventListener(\"loadend\", onLoadEnd);\n };\n let onLoadEnd = () => {\n unbindEvents();\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\n fileRequest.onCompleteObservable.clear();\n onProgress = undefined;\n onReadyStateChange = null;\n onLoadEnd = null;\n onError = undefined;\n onOpened = undefined;\n onSuccess = undefined;\n };\n fileRequest.abort = () => {\n aborted = true;\n if (onLoadEnd) {\n onLoadEnd();\n }\n if (request && request.readyState !== (XMLHttpRequest.DONE || 4)) {\n request.abort();\n }\n if (retryHandle !== null) {\n clearTimeout(retryHandle);\n retryHandle = null;\n }\n request = null;\n };\n const handleError = error => {\n const message = error.message || \"Unknown error\";\n if (onError && request) {\n onError(new RequestFileError(message, request));\n } else {\n Logger.Error(message);\n }\n };\n const retryLoop = retryIndex => {\n if (!request) {\n return;\n }\n request.open(\"GET\", loadUrl);\n if (onOpened) {\n try {\n onOpened(request);\n } catch (e) {\n handleError(e);\n return;\n }\n }\n if (useArrayBuffer) {\n request.responseType = \"arraybuffer\";\n }\n if (onProgress) {\n request.addEventListener(\"progress\", onProgress);\n }\n if (onLoadEnd) {\n request.addEventListener(\"loadend\", onLoadEnd);\n }\n onReadyStateChange = () => {\n if (aborted || !request) {\n return;\n }\n // In case of undefined state in some browsers.\n if (request.readyState === (XMLHttpRequest.DONE || 4)) {\n // Some browsers have issues where onreadystatechange can be called multiple times with the same value.\n if (onReadyStateChange) {\n request.removeEventListener(\"readystatechange\", onReadyStateChange);\n }\n if (request.status >= 200 && request.status < 300 || request.status === 0 && (!IsWindowObjectExist() || IsFileURL())) {\n try {\n if (onSuccess) {\n onSuccess(useArrayBuffer ? request.response : request.responseText, request);\n }\n } catch (e) {\n handleError(e);\n }\n return;\n }\n const retryStrategy = FileToolsOptions.DefaultRetryStrategy;\n if (retryStrategy) {\n const waitTime = retryStrategy(loadUrl, request, retryIndex);\n if (waitTime !== -1) {\n // Prevent the request from completing for retry.\n unbindEvents();\n request = new WebRequest();\n retryHandle = setTimeout(() => retryLoop(retryIndex + 1), waitTime);\n return;\n }\n }\n const error = new RequestFileError(\"Error status: \" + request.status + \" \" + request.statusText + \" - Unable to load \" + loadUrl, request);\n if (onError) {\n onError(error);\n }\n }\n };\n request.addEventListener(\"readystatechange\", onReadyStateChange);\n request.send();\n };\n retryLoop(0);\n };\n // Caching all files\n if (offlineProvider && offlineProvider.enableSceneOffline) {\n const noOfflineSupport = request => {\n if (request && request.status > 400) {\n if (onError) {\n onError(request);\n }\n } else {\n requestFile();\n }\n };\n const loadFromOfflineSupport = () => {\n // TODO: database needs to support aborting and should return a IFileRequest\n if (offlineProvider) {\n offlineProvider.loadFile(FileToolsOptions.BaseUrl + url, data => {\n if (!aborted && onSuccess) {\n onSuccess(data);\n }\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\n }, onProgress ? event => {\n if (!aborted && onProgress) {\n onProgress(event);\n }\n } : undefined, noOfflineSupport, useArrayBuffer);\n }\n };\n offlineProvider.open(loadFromOfflineSupport, noOfflineSupport);\n } else {\n requestFile();\n }\n return fileRequest;\n};\n/**\n * Checks if the loaded document was accessed via `file:`-Protocol.\n * @returns boolean\n * @internal\n */\nexport const IsFileURL = () => {\n return typeof location !== \"undefined\" && location.protocol === \"file:\";\n};\n/**\n * Test if the given uri is a valid base64 data url\n * @param uri The uri to test\n * @returns True if the uri is a base64 data url or false otherwise\n * @internal\n */\nexport const IsBase64DataUrl = uri => {\n return Base64DataUrlRegEx.test(uri);\n};\nexport const TestBase64DataUrl = uri => {\n const results = Base64DataUrlRegEx.exec(uri);\n if (results === null || results.length === 0) {\n return {\n match: false,\n type: \"\"\n };\n } else {\n const type = results[0].replace(\"data:\", \"\").replace(\"base64,\", \"\");\n return {\n match: true,\n type\n };\n }\n};\n/**\n * Decode the given base64 uri.\n * @param uri The uri to decode\n * @returns The decoded base64 data.\n * @internal\n */\nexport function DecodeBase64UrlToBinary(uri) {\n return DecodeBase64ToBinary(uri.split(\",\")[1]);\n}\n/**\n * Decode the given base64 uri into a UTF-8 encoded string.\n * @param uri The uri to decode\n * @returns The decoded base64 data.\n * @internal\n */\nexport const DecodeBase64UrlToString = uri => {\n return DecodeBase64ToString(uri.split(\",\")[1]);\n};\n/**\n * This will be executed automatically for UMD and es5.\n * If esm dev wants the side effects to execute they will have to run it manually\n * Once we build native modules those need to be exported.\n * @internal\n */\nconst initSideEffects = () => {\n AbstractEngine._FileToolsLoadImage = LoadImage;\n EngineFunctionContext.loadFile = LoadFile;\n _functionContainer.loadFile = LoadFile;\n};\ninitSideEffects();\n// deprecated\n/**\n * FileTools defined as any.\n * This should not be imported or used in future releases or in any module in the framework\n * @internal\n * @deprecated import the needed function from fileTools.ts\n */\nexport let FileTools;\n/**\n * @internal\n */\nexport const _injectLTSFileTools = (DecodeBase64UrlToBinary, DecodeBase64UrlToString, FileToolsOptions, IsBase64DataUrl, IsFileURL, LoadFile, LoadImage, ReadFile, RequestFile, SetCorsBehavior) => {\n /**\n * Backwards compatibility.\n * @internal\n * @deprecated\n */\n FileTools = {\n DecodeBase64UrlToBinary,\n DecodeBase64UrlToString,\n DefaultRetryStrategy: FileToolsOptions.DefaultRetryStrategy,\n BaseUrl: FileToolsOptions.BaseUrl,\n CorsBehavior: FileToolsOptions.CorsBehavior,\n PreprocessUrl: FileToolsOptions.PreprocessUrl,\n IsBase64DataUrl,\n IsFileURL,\n LoadFile,\n LoadImage,\n ReadFile,\n RequestFile,\n SetCorsBehavior\n };\n Object.defineProperty(FileTools, \"DefaultRetryStrategy\", {\n get: function () {\n return FileToolsOptions.DefaultRetryStrategy;\n },\n set: function (value) {\n FileToolsOptions.DefaultRetryStrategy = value;\n }\n });\n Object.defineProperty(FileTools, \"BaseUrl\", {\n get: function () {\n return FileToolsOptions.BaseUrl;\n },\n set: function (value) {\n FileToolsOptions.BaseUrl = value;\n }\n });\n Object.defineProperty(FileTools, \"PreprocessUrl\", {\n get: function () {\n return FileToolsOptions.PreprocessUrl;\n },\n set: function (value) {\n FileToolsOptions.PreprocessUrl = value;\n }\n });\n Object.defineProperty(FileTools, \"CorsBehavior\", {\n get: function () {\n return FileToolsOptions.CorsBehavior;\n },\n set: function (value) {\n FileToolsOptions.CorsBehavior = value;\n }\n });\n};\n_injectLTSFileTools(DecodeBase64UrlToBinary, DecodeBase64UrlToString, FileToolsOptions, IsBase64DataUrl, IsFileURL, LoadFile, LoadImage, ReadFile, RequestFile, SetCorsBehavior);","map":{"version":3,"names":["WebRequest","IsWindowObjectExist","Observable","FilesInputStore","RetryStrategy","BaseError","ErrorCodes","RuntimeError","DecodeBase64ToBinary","DecodeBase64ToString","EncodeArrayBufferToBase64","_functionContainer","EngineStore","Logger","TimingTools","EngineFunctionContext","AbstractEngine","Base64DataUrlRegEx","RegExp","LoadFileError","constructor","message","object","name","_setPrototypeOf","prototype","request","file","RequestFileError","ReadFileError","CleanUrl","url","replace","FileToolsOptions","DefaultRetryStrategy","ExponentialBackoff","BaseUrl","CorsBehavior","PreprocessUrl","ScriptBaseUrl","ScriptPreprocessUrl","SetCorsBehavior","element","indexOf","String","crossOrigin","result","LoadImageConfiguration","getRequiredSize","LoadImage","input","onLoad","onError","offlineProvider","mimeType","imageBitmapOptions","engine","LastCreatedEngine","HTMLImageElement","_features","forceBitmapOverHTMLImageElement","usingObjectURL","ArrayBuffer","isView","Blob","URL","createObjectURL","type","onErrorHandler","exception","inputText","toString","length","slice","LoadFile","data","createImageBitmap","premultiplyAlpha","then","imgBmp","revokeObjectURL","catch","reason","undefined","img","Image","size","width","height","handlersList","loadHandlersList","forEach","handler","target","addEventListener","unloadHandlersList","removeEventListener","loadHandler","src","errorHandler","err","cspHandler","blockedURI","disposition","cspException","Error","effectiveDirective","originalPolicy","UseFallbackTexture","push","document","fromBlob","substring","fromData","noOfflineSupport","IsCustomRequestAvailable","_","contentType","blob","_request","loadFromOfflineSupport","loadImage","enableTexturesOffline","open","textureName","decodeURIComponent","toLowerCase","FilesToLoad","blobURL","ex","e","ReadFile","onSuccess","onProgress","useArrayBuffer","reader","FileReader","fileRequest","onCompleteObservable","abort","onloadend","notifyObservers","onerror","onload","onprogress","readAsText","readAsArrayBuffer","fileOrUrl","onOpened","error","fileName","match","TestBase64DataUrl","DecodeBase64UrlToBinary","DecodeBase64UrlToString","SetImmediate","RequestFile","responseURL","getResponseHeader","loadUrl","aborted","requestFile","retryHandle","onReadyStateChange","unbindEvents","onLoadEnd","clear","readyState","XMLHttpRequest","DONE","clearTimeout","handleError","retryLoop","retryIndex","responseType","status","IsFileURL","response","responseText","retryStrategy","waitTime","setTimeout","statusText","send","enableSceneOffline","loadFile","event","location","protocol","IsBase64DataUrl","uri","test","results","exec","split","initSideEffects","_FileToolsLoadImage","FileTools","_injectLTSFileTools","Object","defineProperty","get","set","value"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/Misc/fileTools.js"],"sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\nimport { WebRequest } from \"./webRequest.js\";\nimport { IsWindowObjectExist } from \"./domManagement.js\";\nimport { Observable } from \"./observable.js\";\nimport { FilesInputStore } from \"./filesInputStore.js\";\nimport { RetryStrategy } from \"./retryStrategy.js\";\nimport { BaseError, ErrorCodes, RuntimeError } from \"./error.js\";\nimport { DecodeBase64ToBinary, DecodeBase64ToString, EncodeArrayBufferToBase64 } from \"./stringTools.js\";\nimport { _functionContainer } from \"../Engines/Processors/shaderProcessor.js\";\nimport { EngineStore } from \"../Engines/engineStore.js\";\nimport { Logger } from \"./logger.js\";\nimport { TimingTools } from \"./timingTools.js\";\nimport { EngineFunctionContext } from \"../Engines/abstractEngine.functions.js\";\nimport { AbstractEngine } from \"../Engines/abstractEngine.js\";\nconst Base64DataUrlRegEx = new RegExp(/^data:([^,]+\\/[^,]+)?;base64,/i);\n/** @ignore */\nexport class LoadFileError extends RuntimeError {\n /**\n * Creates a new LoadFileError\n * @param message defines the message of the error\n * @param object defines the optional web request\n */\n constructor(message, object) {\n super(message, ErrorCodes.LoadFileError);\n this.name = \"LoadFileError\";\n BaseError._setPrototypeOf(this, LoadFileError.prototype);\n if (object instanceof WebRequest) {\n this.request = object;\n }\n else {\n this.file = object;\n }\n }\n}\n/** @ignore */\nexport class RequestFileError extends RuntimeError {\n /**\n * Creates a new LoadFileError\n * @param message defines the message of the error\n * @param request defines the optional web request\n */\n constructor(message, request) {\n super(message, ErrorCodes.RequestFileError);\n this.request = request;\n this.name = \"RequestFileError\";\n BaseError._setPrototypeOf(this, RequestFileError.prototype);\n }\n}\n/** @ignore */\nexport class ReadFileError extends RuntimeError {\n /**\n * Creates a new ReadFileError\n * @param message defines the message of the error\n * @param file defines the optional file\n */\n constructor(message, file) {\n super(message, ErrorCodes.ReadFileError);\n this.file = file;\n this.name = \"ReadFileError\";\n BaseError._setPrototypeOf(this, ReadFileError.prototype);\n }\n}\n/**\n * Removes unwanted characters from an url\n * @param url defines the url to clean\n * @returns the cleaned url\n */\nconst CleanUrl = (url) => {\n url = url.replace(/#/gm, \"%23\");\n return url;\n};\n/**\n * @internal\n */\nexport const FileToolsOptions = {\n /**\n * Gets or sets the retry strategy to apply when an error happens while loading an asset.\n * When defining this function, return the wait time before trying again or return -1 to\n * stop retrying and error out.\n */\n DefaultRetryStrategy: RetryStrategy.ExponentialBackoff(),\n /**\n * Gets or sets the base URL to use to load assets\n */\n BaseUrl: \"\",\n /**\n * Default behaviour for cors in the application.\n * It can be a string if the expected behavior is identical in the entire app.\n * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance)\n */\n CorsBehavior: \"anonymous\",\n /**\n * Gets or sets a function used to pre-process url before using them to load assets\n * @param url\n * @returns the processed url\n */\n PreprocessUrl: (url) => url,\n /**\n * Gets or sets the base URL to use to load scripts\n * Used for both JS and WASM\n */\n ScriptBaseUrl: \"\",\n /**\n * Gets or sets a function used to pre-process script url before using them to load.\n * Used for both JS and WASM\n * @param url defines the url to process\n * @returns the processed url\n */\n ScriptPreprocessUrl: (url) => url,\n /**\n * Gets or sets a function used to clean the url before using it to load assets\n * @param url defines the url to clean\n * @returns the cleaned url\n */\n CleanUrl,\n};\n/**\n * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element.\n * @param url define the url we are trying\n * @param element define the dom element where to configure the cors policy\n * @internal\n */\nexport const SetCorsBehavior = (url, element) => {\n if (url && url.indexOf(\"data:\") === 0) {\n return;\n }\n if (FileToolsOptions.CorsBehavior) {\n if (typeof FileToolsOptions.CorsBehavior === \"string\" || FileToolsOptions.CorsBehavior instanceof String) {\n element.crossOrigin = FileToolsOptions.CorsBehavior;\n }\n else {\n const result = FileToolsOptions.CorsBehavior(url);\n if (result) {\n element.crossOrigin = result;\n }\n }\n }\n};\n/**\n * Configuration used to load images\n * @see #DKMEZK#2\n */\nexport const LoadImageConfiguration = {\n getRequiredSize: null,\n};\n/**\n * Loads an image as an HTMLImageElement.\n * @param input url string, ArrayBuffer, or Blob to load\n * @param onLoad callback called when the image successfully loads\n * @param onError callback called when the image fails to load\n * @param offlineProvider offline provider for caching\n * @param mimeType optional mime type\n * @param imageBitmapOptions\n * @returns the HTMLImageElement of the loaded image\n * @internal\n */\nexport const LoadImage = (input, onLoad, onError, offlineProvider, mimeType = \"\", imageBitmapOptions) => {\n const engine = EngineStore.LastCreatedEngine;\n if (typeof HTMLImageElement === \"undefined\" && !engine?._features.forceBitmapOverHTMLImageElement) {\n onError(\"LoadImage is only supported in web or BabylonNative environments.\");\n return null;\n }\n let url;\n let usingObjectURL = false;\n if (input instanceof ArrayBuffer || ArrayBuffer.isView(input)) {\n if (typeof Blob !== \"undefined\" && typeof URL !== \"undefined\") {\n url = URL.createObjectURL(new Blob([input], { type: mimeType }));\n usingObjectURL = true;\n }\n else {\n url = `data:${mimeType};base64,` + EncodeArrayBufferToBase64(input);\n }\n }\n else if (input instanceof Blob) {\n url = URL.createObjectURL(input);\n usingObjectURL = true;\n }\n else {\n url = FileToolsOptions.CleanUrl(input);\n url = FileToolsOptions.PreprocessUrl(url);\n }\n const onErrorHandler = (exception) => {\n if (onError) {\n const inputText = url || input.toString();\n onError(`Error while trying to load image: ${inputText.indexOf(\"http\") === 0 || inputText.length <= 128 ? inputText : inputText.slice(0, 128) + \"...\"}`, exception);\n }\n };\n if (engine?._features.forceBitmapOverHTMLImageElement) {\n LoadFile(url, (data) => {\n engine\n .createImageBitmap(new Blob([data], { type: mimeType }), { premultiplyAlpha: \"none\", ...imageBitmapOptions })\n .then((imgBmp) => {\n onLoad(imgBmp);\n if (usingObjectURL) {\n URL.revokeObjectURL(url);\n }\n })\n .catch((reason) => {\n if (onError) {\n onError(\"Error while trying to load image: \" + input, reason);\n }\n });\n }, undefined, offlineProvider || undefined, true, (request, exception) => {\n onErrorHandler(exception);\n });\n return null;\n }\n const img = new Image();\n if (LoadImageConfiguration.getRequiredSize) {\n const size = LoadImageConfiguration.getRequiredSize(input);\n if (size.width) {\n img.width = size.width;\n }\n if (size.height) {\n img.height = size.height;\n }\n }\n SetCorsBehavior(url, img);\n const handlersList = [];\n const loadHandlersList = () => {\n handlersList.forEach((handler) => {\n handler.target.addEventListener(handler.name, handler.handler);\n });\n };\n const unloadHandlersList = () => {\n handlersList.forEach((handler) => {\n handler.target.removeEventListener(handler.name, handler.handler);\n });\n handlersList.length = 0;\n };\n const loadHandler = () => {\n unloadHandlersList();\n onLoad(img);\n // Must revoke the URL after calling onLoad to avoid security exceptions in\n // certain scenarios (e.g. when hosted in vscode).\n if (usingObjectURL && img.src) {\n URL.revokeObjectURL(img.src);\n }\n };\n const errorHandler = (err) => {\n unloadHandlersList();\n onErrorHandler(err);\n if (usingObjectURL && img.src) {\n URL.revokeObjectURL(img.src);\n }\n };\n const cspHandler = (err) => {\n if (err.blockedURI !== img.src || err.disposition === \"report\") {\n return;\n }\n unloadHandlersList();\n const cspException = new Error(`CSP violation of policy ${err.effectiveDirective} ${err.blockedURI}. Current policy is ${err.originalPolicy}`);\n EngineStore.UseFallbackTexture = false;\n onErrorHandler(cspException);\n if (usingObjectURL && img.src) {\n URL.revokeObjectURL(img.src);\n }\n img.src = \"\";\n };\n handlersList.push({ target: img, name: \"load\", handler: loadHandler });\n handlersList.push({ target: img, name: \"error\", handler: errorHandler });\n handlersList.push({ target: document, name: \"securitypolicyviolation\", handler: cspHandler });\n loadHandlersList();\n const fromBlob = url.substring(0, 5) === \"blob:\";\n const fromData = url.substring(0, 5) === \"data:\";\n const noOfflineSupport = () => {\n if (fromBlob || fromData || !WebRequest.IsCustomRequestAvailable) {\n img.src = url;\n }\n else {\n LoadFile(url, (data, _, contentType) => {\n const type = !mimeType && contentType ? contentType : mimeType;\n const blob = new Blob([data], { type });\n const url = URL.createObjectURL(blob);\n usingObjectURL = true;\n img.src = url;\n }, undefined, offlineProvider || undefined, true, (_request, exception) => {\n onErrorHandler(exception);\n });\n }\n };\n const loadFromOfflineSupport = () => {\n if (offlineProvider) {\n offlineProvider.loadImage(url, img);\n }\n };\n if (!fromBlob && !fromData && offlineProvider && offlineProvider.enableTexturesOffline) {\n offlineProvider.open(loadFromOfflineSupport, noOfflineSupport);\n }\n else {\n if (url.indexOf(\"file:\") !== -1) {\n const textureName = decodeURIComponent(url.substring(5).toLowerCase());\n if (FilesInputStore.FilesToLoad[textureName] && typeof URL !== \"undefined\") {\n try {\n let blobURL;\n try {\n blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]);\n }\n catch (ex) {\n // Chrome doesn't support oneTimeOnly parameter\n blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]);\n }\n img.src = blobURL;\n usingObjectURL = true;\n }\n catch (e) {\n img.src = \"\";\n }\n return img;\n }\n }\n noOfflineSupport();\n }\n return img;\n};\n/**\n * Reads a file from a File object\n * @param file defines the file to load\n * @param onSuccess defines the callback to call when data is loaded\n * @param onProgress defines the callback to call during loading process\n * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer\n * @param onError defines the callback to call when an error occurs\n * @returns a file request object\n * @internal\n */\nexport const ReadFile = (file, onSuccess, onProgress, useArrayBuffer, onError) => {\n const reader = new FileReader();\n const fileRequest = {\n onCompleteObservable: new Observable(),\n abort: () => reader.abort(),\n };\n reader.onloadend = () => fileRequest.onCompleteObservable.notifyObservers(fileRequest);\n if (onError) {\n reader.onerror = () => {\n onError(new ReadFileError(`Unable to read ${file.name}`, file));\n };\n }\n reader.onload = (e) => {\n //target doesn't have result from ts 1.3\n onSuccess(e.target[\"result\"]);\n };\n if (onProgress) {\n reader.onprogress = onProgress;\n }\n if (!useArrayBuffer) {\n // Asynchronous read\n reader.readAsText(file);\n }\n else {\n reader.readAsArrayBuffer(file);\n }\n return fileRequest;\n};\n/**\n * Loads a file from a url, a data url, or a file url\n * @param fileOrUrl file, url, data url, or file url to load\n * @param onSuccess callback called when the file successfully loads\n * @param onProgress callback called while file is loading (if the server supports this mode)\n * @param offlineProvider defines the offline provider for caching\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\n * @param onError callback called when the file fails to load\n * @param onOpened\n * @returns a file request object\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const LoadFile = (fileOrUrl, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError, onOpened) => {\n if (fileOrUrl.name) {\n return ReadFile(fileOrUrl, onSuccess, onProgress, useArrayBuffer, onError\n ? (error) => {\n onError(undefined, error);\n }\n : undefined);\n }\n const url = fileOrUrl;\n // If file and file input are set\n if (url.indexOf(\"file:\") !== -1) {\n let fileName = decodeURIComponent(url.substring(5).toLowerCase());\n if (fileName.indexOf(\"./\") === 0) {\n fileName = fileName.substring(2);\n }\n const file = FilesInputStore.FilesToLoad[fileName];\n if (file) {\n return ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError ? (error) => onError(undefined, new LoadFileError(error.message, error.file)) : undefined);\n }\n }\n // For a Base64 Data URL\n const { match, type } = TestBase64DataUrl(url);\n if (match) {\n const fileRequest = {\n onCompleteObservable: new Observable(),\n abort: () => () => { },\n };\n try {\n const data = useArrayBuffer ? DecodeBase64UrlToBinary(url) : DecodeBase64UrlToString(url);\n onSuccess(data, undefined, type);\n }\n catch (error) {\n if (onError) {\n onError(undefined, error);\n }\n else {\n Logger.Error(error.message || \"Failed to parse the Data URL\");\n }\n }\n TimingTools.SetImmediate(() => {\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\n });\n return fileRequest;\n }\n return RequestFile(url, (data, request) => {\n onSuccess(data, request?.responseURL, request?.getResponseHeader(\"content-type\"));\n }, onProgress, offlineProvider, useArrayBuffer, onError\n ? (error) => {\n onError(error.request, new LoadFileError(error.message, error.request));\n }\n : undefined, onOpened);\n};\n/**\n * Loads a file from a url\n * @param url url to load\n * @param onSuccess callback called when the file successfully loads\n * @param onProgress callback called while file is loading (if the server supports this mode)\n * @param offlineProvider defines the offline provider for caching\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\n * @param onError callback called when the file fails to load\n * @param onOpened callback called when the web request is opened\n * @returns a file request object\n * @internal\n */\nexport const RequestFile = (url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError, onOpened) => {\n url = FileToolsOptions.CleanUrl(url);\n url = FileToolsOptions.PreprocessUrl(url);\n const loadUrl = FileToolsOptions.BaseUrl + url;\n let aborted = false;\n const fileRequest = {\n onCompleteObservable: new Observable(),\n abort: () => (aborted = true),\n };\n const requestFile = () => {\n let request = new WebRequest();\n let retryHandle = null;\n let onReadyStateChange;\n const unbindEvents = () => {\n if (!request) {\n return;\n }\n if (onProgress) {\n request.removeEventListener(\"progress\", onProgress);\n }\n if (onReadyStateChange) {\n request.removeEventListener(\"readystatechange\", onReadyStateChange);\n }\n request.removeEventListener(\"loadend\", onLoadEnd);\n };\n let onLoadEnd = () => {\n unbindEvents();\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\n fileRequest.onCompleteObservable.clear();\n onProgress = undefined;\n onReadyStateChange = null;\n onLoadEnd = null;\n onError = undefined;\n onOpened = undefined;\n onSuccess = undefined;\n };\n fileRequest.abort = () => {\n aborted = true;\n if (onLoadEnd) {\n onLoadEnd();\n }\n if (request && request.readyState !== (XMLHttpRequest.DONE || 4)) {\n request.abort();\n }\n if (retryHandle !== null) {\n clearTimeout(retryHandle);\n retryHandle = null;\n }\n request = null;\n };\n const handleError = (error) => {\n const message = error.message || \"Unknown error\";\n if (onError && request) {\n onError(new RequestFileError(message, request));\n }\n else {\n Logger.Error(message);\n }\n };\n const retryLoop = (retryIndex) => {\n if (!request) {\n return;\n }\n request.open(\"GET\", loadUrl);\n if (onOpened) {\n try {\n onOpened(request);\n }\n catch (e) {\n handleError(e);\n return;\n }\n }\n if (useArrayBuffer) {\n request.responseType = \"arraybuffer\";\n }\n if (onProgress) {\n request.addEventListener(\"progress\", onProgress);\n }\n if (onLoadEnd) {\n request.addEventListener(\"loadend\", onLoadEnd);\n }\n onReadyStateChange = () => {\n if (aborted || !request) {\n return;\n }\n // In case of undefined state in some browsers.\n if (request.readyState === (XMLHttpRequest.DONE || 4)) {\n // Some browsers have issues where onreadystatechange can be called multiple times with the same value.\n if (onReadyStateChange) {\n request.removeEventListener(\"readystatechange\", onReadyStateChange);\n }\n if ((request.status >= 200 && request.status < 300) || (request.status === 0 && (!IsWindowObjectExist() || IsFileURL()))) {\n try {\n if (onSuccess) {\n onSuccess(useArrayBuffer ? request.response : request.responseText, request);\n }\n }\n catch (e) {\n handleError(e);\n }\n return;\n }\n const retryStrategy = FileToolsOptions.DefaultRetryStrategy;\n if (retryStrategy) {\n const waitTime = retryStrategy(loadUrl, request, retryIndex);\n if (waitTime !== -1) {\n // Prevent the request from completing for retry.\n unbindEvents();\n request = new WebRequest();\n retryHandle = setTimeout(() => retryLoop(retryIndex + 1), waitTime);\n return;\n }\n }\n const error = new RequestFileError(\"Error status: \" + request.status + \" \" + request.statusText + \" - Unable to load \" + loadUrl, request);\n if (onError) {\n onError(error);\n }\n }\n };\n request.addEventListener(\"readystatechange\", onReadyStateChange);\n request.send();\n };\n retryLoop(0);\n };\n // Caching all files\n if (offlineProvider && offlineProvider.enableSceneOffline) {\n const noOfflineSupport = (request) => {\n if (request && request.status > 400) {\n if (onError) {\n onError(request);\n }\n }\n else {\n requestFile();\n }\n };\n const loadFromOfflineSupport = () => {\n // TODO: database needs to support aborting and should return a IFileRequest\n if (offlineProvider) {\n offlineProvider.loadFile(FileToolsOptions.BaseUrl + url, (data) => {\n if (!aborted && onSuccess) {\n onSuccess(data);\n }\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\n }, onProgress\n ? (event) => {\n if (!aborted && onProgress) {\n onProgress(event);\n }\n }\n : undefined, noOfflineSupport, useArrayBuffer);\n }\n };\n offlineProvider.open(loadFromOfflineSupport, noOfflineSupport);\n }\n else {\n requestFile();\n }\n return fileRequest;\n};\n/**\n * Checks if the loaded document was accessed via `file:`-Protocol.\n * @returns boolean\n * @internal\n */\nexport const IsFileURL = () => {\n return typeof location !== \"undefined\" && location.protocol === \"file:\";\n};\n/**\n * Test if the given uri is a valid base64 data url\n * @param uri The uri to test\n * @returns True if the uri is a base64 data url or false otherwise\n * @internal\n */\nexport const IsBase64DataUrl = (uri) => {\n return Base64DataUrlRegEx.test(uri);\n};\nexport const TestBase64DataUrl = (uri) => {\n const results = Base64DataUrlRegEx.exec(uri);\n if (results === null || results.length === 0) {\n return { match: false, type: \"\" };\n }\n else {\n const type = results[0].replace(\"data:\", \"\").replace(\"base64,\", \"\");\n return { match: true, type };\n }\n};\n/**\n * Decode the given base64 uri.\n * @param uri The uri to decode\n * @returns The decoded base64 data.\n * @internal\n */\nexport function DecodeBase64UrlToBinary(uri) {\n return DecodeBase64ToBinary(uri.split(\",\")[1]);\n}\n/**\n * Decode the given base64 uri into a UTF-8 encoded string.\n * @param uri The uri to decode\n * @returns The decoded base64 data.\n * @internal\n */\nexport const DecodeBase64UrlToString = (uri) => {\n return DecodeBase64ToString(uri.split(\",\")[1]);\n};\n/**\n * This will be executed automatically for UMD and es5.\n * If esm dev wants the side effects to execute they will have to run it manually\n * Once we build native modules those need to be exported.\n * @internal\n */\nconst initSideEffects = () => {\n AbstractEngine._FileToolsLoadImage = LoadImage;\n EngineFunctionContext.loadFile = LoadFile;\n _functionContainer.loadFile = LoadFile;\n};\ninitSideEffects();\n// deprecated\n/**\n * FileTools defined as any.\n * This should not be imported or used in future releases or in any module in the framework\n * @internal\n * @deprecated import the needed function from fileTools.ts\n */\nexport let FileTools;\n/**\n * @internal\n */\nexport const _injectLTSFileTools = (DecodeBase64UrlToBinary, DecodeBase64UrlToString, FileToolsOptions, IsBase64DataUrl, IsFileURL, LoadFile, LoadImage, ReadFile, RequestFile, SetCorsBehavior) => {\n /**\n * Backwards compatibility.\n * @internal\n * @deprecated\n */\n FileTools = {\n DecodeBase64UrlToBinary,\n DecodeBase64UrlToString,\n DefaultRetryStrategy: FileToolsOptions.DefaultRetryStrategy,\n BaseUrl: FileToolsOptions.BaseUrl,\n CorsBehavior: FileToolsOptions.CorsBehavior,\n PreprocessUrl: FileToolsOptions.PreprocessUrl,\n IsBase64DataUrl,\n IsFileURL,\n LoadFile,\n LoadImage,\n ReadFile,\n RequestFile,\n SetCorsBehavior,\n };\n Object.defineProperty(FileTools, \"DefaultRetryStrategy\", {\n get: function () {\n return FileToolsOptions.DefaultRetryStrategy;\n },\n set: function (value) {\n FileToolsOptions.DefaultRetryStrategy = value;\n },\n });\n Object.defineProperty(FileTools, \"BaseUrl\", {\n get: function () {\n return FileToolsOptions.BaseUrl;\n },\n set: function (value) {\n FileToolsOptions.BaseUrl = value;\n },\n });\n Object.defineProperty(FileTools, \"PreprocessUrl\", {\n get: function () {\n return FileToolsOptions.PreprocessUrl;\n },\n set: function (value) {\n FileToolsOptions.PreprocessUrl = value;\n },\n });\n Object.defineProperty(FileTools, \"CorsBehavior\", {\n get: function () {\n return FileToolsOptions.CorsBehavior;\n },\n set: function (value) {\n FileToolsOptions.CorsBehavior = value;\n },\n });\n};\n_injectLTSFileTools(DecodeBase64UrlToBinary, DecodeBase64UrlToString, FileToolsOptions, IsBase64DataUrl, IsFileURL, LoadFile, LoadImage, ReadFile, RequestFile, SetCorsBehavior);\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}