var Module = typeof Module != 'undefined' ? Module : {}; Module['expectedDataFileDownloads'] ??= 0; Module['expectedDataFileDownloads']++; (() => { // Do not attempt to redownload the virtual filesystem data when in a pthread or a Wasm Worker context. var isPthread = typeof ENVIRONMENT_IS_PTHREAD != 'undefined' && ENVIRONMENT_IS_PTHREAD; var isWasmWorker = typeof ENVIRONMENT_IS_WASM_WORKER != 'undefined' && ENVIRONMENT_IS_WASM_WORKER; if (isPthread || isWasmWorker) return; var isNode = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string'; function loadPackage(metadata) { var PACKAGE_PATH = ''; if (typeof window === 'object') { PACKAGE_PATH = window['encodeURIComponent'](window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/')) + '/'); } else if (typeof process === 'undefined' && typeof location !== 'undefined') { // web worker PACKAGE_PATH = encodeURIComponent(location.pathname.substring(0, location.pathname.lastIndexOf('/')) + '/'); } var PACKAGE_NAME = 'model.data'; var REMOTE_PACKAGE_BASE = 'model.data'; var REMOTE_PACKAGE_NAME = Module['locateFile'] ? Module['locateFile'](REMOTE_PACKAGE_BASE, '') : REMOTE_PACKAGE_BASE; var REMOTE_PACKAGE_SIZE = metadata['remote_package_size']; function fetchRemotePackage(packageName, packageSize, callback, errback) { if (isNode) { require('fs').readFile(packageName, (err, contents) => { if (err) { errback(err); } else { callback(contents.buffer); } }); return; } Module['dataFileDownloads'] ??= {}; fetch(packageName) .catch((cause) => Promise.reject(new Error(`Network Error: ${packageName}`, {cause}))) // If fetch fails, rewrite the error to include the failing URL & the cause. .then((response) => { if (!response.ok) { return Promise.reject(new Error(`${response.status}: ${response.url}`)); } if (!response.body && response.arrayBuffer) { // If we're using the polyfill, readers won't be available... return response.arrayBuffer().then(callback); } const reader = response.body.getReader(); const iterate = () => reader.read().then(handleChunk).catch((cause) => { return Promise.reject(new Error(`Unexpected error while handling : ${response.url} ${cause}`, {cause})); }); const chunks = []; const headers = response.headers; const total = Number(headers.get('Content-Length') ?? packageSize); let loaded = 0; const handleChunk = ({done, value}) => { if (!done) { chunks.push(value); loaded += value.length; Module['dataFileDownloads'][packageName] = {loaded, total}; let totalLoaded = 0; let totalSize = 0; for (const download of Object.values(Module['dataFileDownloads'])) { totalLoaded += download.loaded; totalSize += download.total; } Module['setStatus']?.(`Downloading data... (${totalLoaded}/${totalSize})`); return iterate(); } else { const packageData = new Uint8Array(chunks.map((c) => c.length).reduce((a, b) => a + b, 0)); let offset = 0; for (const chunk of chunks) { packageData.set(chunk, offset); offset += chunk.length; } callback(packageData.buffer); } }; Module['setStatus']?.('Downloading data...'); return iterate(); }); }; function handleError(error) { console.error('package error:', error); }; var fetchedCallback = null; var fetched = Module['getPreloadedPackage'] ? Module['getPreloadedPackage'](REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE) : null; if (!fetched) fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE, (data) => { if (fetchedCallback) { fetchedCallback(data); fetchedCallback = null; } else { fetched = data; } }, handleError); function runWithFS(Module) { function assert(check, msg) { if (!check) throw msg + new Error().stack; } /** @constructor */ function DataRequest(start, end, audio) { this.start = start; this.end = end; this.audio = audio; } DataRequest.prototype = { requests: {}, open: function(mode, name) { this.name = name; this.requests[name] = this; Module['addRunDependency'](`fp ${this.name}`); }, send: function() {}, onload: function() { var byteArray = this.byteArray.subarray(this.start, this.end); this.finish(byteArray); }, finish: function(byteArray) { var that = this; // canOwn this data in the filesystem, it is a slide into the heap that will never change Module['FS_createDataFile'](this.name, null, byteArray, true, true, true); Module['removeRunDependency'](`fp ${that.name}`); this.requests[this.name] = null; } }; var files = metadata['files']; for (var i = 0; i < files.length; ++i) { new DataRequest(files[i]['start'], files[i]['end'], files[i]['audio'] || 0).open('GET', files[i]['filename']); } function processPackageData(arrayBuffer) { assert(arrayBuffer, 'Loading data file failed.'); assert(arrayBuffer.constructor.name === ArrayBuffer.name, 'bad input to processPackageData'); var byteArray = new Uint8Array(arrayBuffer); var curr; // Reuse the bytearray from the XHR as the source for file reads. DataRequest.prototype.byteArray = byteArray; var files = metadata['files']; for (var i = 0; i < files.length; ++i) { DataRequest.prototype.requests[files[i].filename].onload(); } Module['removeRunDependency']('datafile_model.data'); }; Module['addRunDependency']('datafile_model.data'); Module['preloadResults'] ??= {}; Module['preloadResults'][PACKAGE_NAME] = {fromCache: false}; if (fetched) { processPackageData(fetched); fetched = null; } else { fetchedCallback = processPackageData; } } if (Module['calledRun']) { runWithFS(Module); } else { (Module['preRun'] ??= []).push(runWithFS); // FS is not initialized yet, wait for it } Module['removeRunDependency']('model.js.metadata'); } function runMetaWithFS() { Module['addRunDependency']('model.js.metadata'); var metadataUrl = Module['locateFile'] ? Module['locateFile']('model.js.metadata', '') : 'model.js.metadata'; if (isNode) { require('fs').readFile(metadataUrl, 'utf8', (err, contents) => { if (err) { return Promise.reject(err); } else { loadPackage(JSON.parse(contents)); } }); return; } fetch(metadataUrl) .then((response) => { if (response.ok) { return response.json(); } return Promise.reject(new Error(`${response.status}: ${response.url}`)); }) .then(loadPackage); } if (Module['calledRun']) { runMetaWithFS(); } else { (Module['preRun'] ??= []).push(runMetaWithFS); } })();