Skip to content

Commit 1647d14

Browse files
authored
Add support for --preload-file in Node.js (#11785)
1 parent 3a48bbd commit 1647d14

File tree

3 files changed

+23
-10
lines changed

3 files changed

+23
-10
lines changed

ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ See docs/process.md for more on how version tagging works.
2020

2121
2.0.24
2222
------
23+
- Support `--preload-file` in Node.js. (#11785)
2324
- CMake projects (those that either use emcmake or use Emscripten.cmake
2425
directly) are new configured to install (by default) directly into the
2526
emscripten sysroot. This means that running `cmake --install` (or running the

tests/test_other.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,7 +1399,12 @@ def test_export_from_archive(self):
13991399
self.run_process([EMCC, 'main.c', '-L.', '-lexport', '-s', 'EXPORTED_FUNCTIONS=%s' % full_export_name])
14001400
self.assertTrue(self.is_exported_in_wasm(export_name, 'a.out.wasm'))
14011401

1402-
def test_embed_file(self):
1402+
@parameterized({
1403+
'embed': (['--embed-file', 'somefile.txt'],),
1404+
'embed-twice': (['--embed-file', 'somefile.txt', '--embed-file', 'somefile.txt'],),
1405+
'preload': (['--preload-file', 'somefile.txt'],)
1406+
})
1407+
def test_include_file(self, args):
14031408
create_file('somefile.txt', 'hello from a file with lots of data and stuff in it thank you very much')
14041409
create_file('main.cpp', r'''
14051410
#include <stdio.h>
@@ -1414,12 +1419,10 @@ def test_embed_file(self):
14141419
}
14151420
''')
14161421

1417-
self.run_process([EMXX, 'main.cpp', '--embed-file', 'somefile.txt'])
1418-
self.assertContained('|hello from a file wi|', self.run_js('a.out.js'))
1419-
1420-
# preload twice, should not err
1421-
self.run_process([EMXX, 'main.cpp', '--embed-file', 'somefile.txt', '--embed-file', 'somefile.txt'])
1422-
self.assertContained('|hello from a file wi|', self.run_js('a.out.js'))
1422+
self.run_process([EMXX, 'main.cpp'] + args)
1423+
# run in node.js to ensure we verify that file preloading works there
1424+
result = self.run_js('a.out.js', engine=config.NODE_JS)
1425+
self.assertContained('|hello from a file wi|', result)
14231426

14241427
def test_embed_file_dup(self):
14251428
ensure_dir(self.in_dir('tst', 'test1'))

tools/file_packager.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -521,14 +521,12 @@ def was_seen(name):
521521
remote_package_size = os.path.getsize(package_name)
522522
remote_package_name = os.path.basename(package_name)
523523
ret += r'''
524-
var PACKAGE_PATH;
524+
var PACKAGE_PATH = '';
525525
if (typeof window === 'object') {
526526
PACKAGE_PATH = window['encodeURIComponent'](window.location.pathname.toString().substring(0, window.location.pathname.toString().lastIndexOf('/')) + '/');
527527
} else if (typeof location !== 'undefined') {
528528
// worker
529529
PACKAGE_PATH = encodeURIComponent(location.pathname.toString().substring(0, location.pathname.toString().lastIndexOf('/')) + '/');
530-
} else {
531-
throw 'using preloaded data can only be done on a web page or in a web worker';
532530
}
533531
var PACKAGE_NAME = '%s';
534532
var REMOTE_PACKAGE_BASE = '%s';
@@ -712,6 +710,17 @@ def was_seen(name):
712710

713711
ret += r'''
714712
function fetchRemotePackage(packageName, packageSize, callback, errback) {
713+
if (typeof process === 'object') {
714+
fs = require('fs');
715+
fs.readFile(packageName, function(err, contents) {
716+
if (err) {
717+
errback(err);
718+
} else {
719+
callback(contents.buffer);
720+
}
721+
});
722+
return;
723+
}
715724
var xhr = new XMLHttpRequest();
716725
xhr.open('GET', packageName, true);
717726
xhr.responseType = 'arraybuffer';

0 commit comments

Comments
 (0)