Skip to content

Commit 177687e

Browse files
committed
Add test for --separate-metadata
1 parent 3b7e379 commit 177687e

File tree

2 files changed

+55
-19
lines changed

2 files changed

+55
-19
lines changed

test/test_other.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3620,6 +3620,21 @@ def test_file_packager_separate_metadata(self):
36203620

36213621
self.assertEqual(metadata['package_uuid'], 'sha256-53ddc03623f867c7d4a631ded19c2613f2cb61d47b6aa214f47ff3cc15445bcd')
36223622

3623+
create_file('src.c', r'''
3624+
#include <assert.h>
3625+
#include <sys/stat.h>
3626+
#include <stdio.h>
3627+
3628+
int main() {
3629+
struct stat buf;
3630+
assert(stat("data1.txt", &buf) == 0);
3631+
assert(stat("subdir/data2.txt", &buf) == 0);
3632+
printf("done\n");
3633+
return 0;
3634+
}
3635+
''')
3636+
self.do_runf('src.c', emcc_args=['--pre-js=immutable.js', '-sFORCE_FILESYSTEM'])
3637+
36233638
def test_file_packager_unicode(self):
36243639
unicode_name = 'unicode…☃'
36253640
try:

tools/file_packager.py

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -616,8 +616,11 @@ def generate_js(data_target, data_files, metadata):
616616
// Do not attempt to redownload the virtual filesystem data when in a pthread or a Wasm Worker context.
617617
var isPthread = typeof ENVIRONMENT_IS_PTHREAD != 'undefined' && ENVIRONMENT_IS_PTHREAD;
618618
var isWasmWorker = typeof ENVIRONMENT_IS_WASM_WORKER != 'undefined' && ENVIRONMENT_IS_WASM_WORKER;
619-
if (isPthread || isWasmWorker) return;
620-
function loadPackage(metadata) {\n'''
619+
if (isPthread || isWasmWorker) return;\n'''
620+
621+
if options.support_node:
622+
ret += " var isNode = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string';\n"
623+
ret += ' function loadPackage(metadata) {\n'
621624

622625
code = '''
623626
function assert(check, msg) {
@@ -785,22 +788,25 @@ def generate_js(data_target, data_files, metadata):
785788

786789
code += r'''
787790
var PACKAGE_UUID = metadata['package_uuid'];
788-
var indexedDB;
789-
if (typeof window === 'object') {
790-
indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
791-
} else if (typeof location !== 'undefined') {
792-
// worker
793-
indexedDB = self.indexedDB;
794-
} else {
795-
throw 'using IndexedDB to cache data can only be done on a web page or in a web worker';
796-
}
797791
var IDB_RO = "readonly";
798792
var IDB_RW = "readwrite";
799793
var DB_NAME = "''' + options.indexeddb_name + '''";
800794
var DB_VERSION = 1;
801795
var METADATA_STORE_NAME = 'METADATA';
802796
var PACKAGE_STORE_NAME = 'PACKAGES';
803797
function openDatabase(callback, errback) {
798+
if (isNode) {
799+
return errback();
800+
}
801+
var indexedDB;
802+
if (typeof window === 'object') {
803+
indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
804+
} else if (typeof location !== 'undefined') {
805+
// worker
806+
indexedDB = self.indexedDB;
807+
} else {
808+
throw 'using IndexedDB to cache data can only be done on a web page or in a web worker';
809+
}
804810
try {
805811
var openRequest = indexedDB.open(DB_NAME, DB_VERSION);
806812
} catch (e) {
@@ -942,7 +948,7 @@ def generate_js(data_target, data_files, metadata):
942948
node_support_code = ''
943949
if options.support_node:
944950
node_support_code = '''
945-
if (typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string') {
951+
if (isNode) {
946952
require('fs').readFile(packageName, (err, contents) => {
947953
if (err) {
948954
errback(err);
@@ -1098,14 +1104,29 @@ def generate_js(data_target, data_files, metadata):
10981104
}\n'''
10991105

11001106
if options.separate_metadata:
1101-
_metadata_template = '''
1107+
node_support_code = ''
1108+
if options.support_node:
1109+
node_support_code = '''
1110+
if (isNode) {
1111+
require('fs').readFile(metadataUrl, 'utf8', (err, contents) => {
1112+
if (err) {
1113+
return Promise.reject(err);
1114+
} else {
1115+
loadPackage(JSON.parse(contents));
1116+
}
1117+
});
1118+
return;
1119+
}'''.strip()
1120+
1121+
ret += '''
11021122
Module['removeRunDependency']('%(metadata_file)s');
11031123
}
11041124
11051125
function runMetaWithFS() {
11061126
Module['addRunDependency']('%(metadata_file)s');
1107-
var REMOTE_METADATA_NAME = Module['locateFile'] ? Module['locateFile']('%(metadata_file)s', '') : '%(metadata_file)s';
1108-
fetch(REMOTE_METADATA_NAME)
1127+
var metadataUrl = Module['locateFile'] ? Module['locateFile']('%(metadata_file)s', '') : '%(metadata_file)s';
1128+
%(node_support_code)s
1129+
fetch(metadataUrl)
11091130
.then((response) => {
11101131
if (response.ok) {
11111132
return response.json();
@@ -1120,14 +1141,14 @@ def generate_js(data_target, data_files, metadata):
11201141
} else {
11211142
if (!Module['preRun']) Module['preRun'] = [];
11221143
Module["preRun"].push(runMetaWithFS);
1123-
}\n''' % {'metadata_file': os.path.basename(options.jsoutput + '.metadata')}
1144+
}\n''' % {'node_support_code': node_support_code, 'metadata_file': os.path.basename(options.jsoutput + '.metadata')}
11241145
else:
1125-
_metadata_template = '''
1146+
ret += '''
11261147
}
11271148
loadPackage(%s);\n''' % json.dumps(metadata)
11281149

1129-
ret += '''%s
1130-
})();\n''' % _metadata_template
1150+
ret += '''
1151+
})();\n'''
11311152

11321153
return ret
11331154

0 commit comments

Comments
 (0)