| 619 | |
| 620 | |
| 621 | def generate_preload_js(data_target, data_files, metadata, js_file): |
| 622 | # emcc will add this to the output itself, so it is only needed for |
| 623 | # standalone calls |
| 624 | if options.from_emcc: |
| 625 | ret = '' |
| 626 | else: |
| 627 | if options.export_es6: |
| 628 | ret = 'export default async function loadDataFile(Module) {\n' |
| 629 | else: |
| 630 | ret = ''' |
| 631 | var Module = typeof %(EXPORT_NAME)s != 'undefined' ? %(EXPORT_NAME)s : {};\n''' % {"EXPORT_NAME": options.export_name} |
| 632 | |
| 633 | ret += ''' |
| 634 | if (!Module['expectedDataFileDownloads']) Module['expectedDataFileDownloads'] = 0; |
| 635 | Module['expectedDataFileDownloads']++;''' |
| 636 | |
| 637 | if not options.export_es6: |
| 638 | ret += ''' |
| 639 | (() => {''' |
| 640 | |
| 641 | ret += ''' |
| 642 | // Do not attempt to redownload the virtual filesystem data when in a pthread or a Wasm Worker context. |
| 643 | var isPthread = typeof ENVIRONMENT_IS_PTHREAD != 'undefined' && ENVIRONMENT_IS_PTHREAD; |
| 644 | var isWasmWorker = typeof ENVIRONMENT_IS_WASM_WORKER != 'undefined' && ENVIRONMENT_IS_WASM_WORKER; |
| 645 | if (isPthread || isWasmWorker) return;\n''' |
| 646 | |
| 647 | if options.support_node: |
| 648 | ret += " var isNode = globalThis.process && globalThis.process.versions && globalThis.process.versions.node && globalThis.process.type != 'renderer';\n" |
| 649 | |
| 650 | if options.support_node and options.export_es6: |
| 651 | ret += '''if (isNode) { |
| 652 | const { createRequire } = await import('node:module'); |
| 653 | /** @suppress{duplicate} */ |
| 654 | var require = createRequire(import.meta.url); |
| 655 | }\n''' |
| 656 | |
| 657 | if options.export_es6: |
| 658 | ret += 'return new Promise((loadDataResolve, loadDataReject) => {\n' |
| 659 | ret += ' async function loadPackage(metadata) {\n' |
| 660 | |
| 661 | code = ''' |
| 662 | function assert(check, msg) { |
| 663 | if (!check) throw new Error(msg); |
| 664 | }\n''' |
| 665 | |
| 666 | # Set up folders |
| 667 | partial_dirs = [] |
| 668 | for file_ in data_files: |
| 669 | assert file_.mode == 'preload' |
| 670 | dirname = os.path.dirname(file_.dstpath) |
| 671 | dirname = dirname.lstrip('/') # absolute paths start with '/', remove that |
| 672 | if dirname: |
| 673 | parts = dirname.split('/') |
| 674 | for i in range(len(parts)): |
| 675 | partial = '/'.join(parts[:i + 1]) |
| 676 | if partial not in partial_dirs: |
| 677 | code += ('''Module['FS_createPath'](%s, %s, true, true);\n''' |
| 678 | % (json.dumps('/' + '/'.join(parts[:i])), json.dumps(parts[i]))) |