summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Buchanan <jonathan.russ.buchanan@gmail.com>2021-06-22 21:03:13 -0400
committerJonathan Buchanan <jonathan.russ.buchanan@gmail.com>2021-06-22 21:03:13 -0400
commit029315b48c8837b48e156f70a2362157716c8d32 (patch)
treeb624964f87b239b7f4bf1fad90f22fd396686d49
parente046b4133c98e830c445f36554030a0656567bcf (diff)
downloadios-node-v8-029315b48c8837b48e156f70a2362157716c8d32.tar.gz
ios-node-v8-029315b48c8837b48e156f70a2362157716c8d32.tar.bz2
ios-node-v8-029315b48c8837b48e156f70a2362157716c8d32.zip
add dynamic module loader
-rw-r--r--lib/iono.js68
-rw-r--r--node.gyp1
2 files changed, 69 insertions, 0 deletions
diff --git a/lib/iono.js b/lib/iono.js
new file mode 100644
index 0000000000..e9178b8eec
--- /dev/null
+++ b/lib/iono.js
@@ -0,0 +1,68 @@
+// Copyright (C) 2021 Taler Systems SA
+//
+// This file is part of GNU Taler.
+//
+// GNU Taler is free software: you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License as published by the Free
+// Software Foundation, either version 3 of the License, or (at your option)
+// any later version.
+//
+// GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
+// more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with GNU. If not, see <https://www.gnu.org/licenses/>.
+
+
+'use strict';
+
+const iono = internalBinding("iono");
+
+const mod = require('module');
+mod._saved_findPath = mod._findPath;
+mod._ionoMods = {};
+mod._findPath = (request, paths, isMain) => {
+ const res = mod._saved_findPath(request, paths, isMain);
+ if (res !== false) return res;
+ const loadResult = iono.getModuleCode(request);
+ if (!loadResult) return false;
+ const p = `/vmod/${request}`;
+ mod._ionoMods[p] = loadResult;
+ return p;
+};
+
+function stripBOM(content) {
+ if (content.charCodeAt(0) === 0xFEFF) {
+ content = content.slice(1);
+ }
+ return content;
+}
+
+mod._saved_js_extension = mod._extensions[".js"];
+mod._extensions[".js"] = (module, filename) => {
+ if (mod._ionoMods.hasOwnProperty(filename)) {
+ const imod = mod._ionoMods[filename];
+ const content = imod;
+ module._compile(stripBOM(content), filename);
+ return;
+ }
+ return mod._saved_js_extension(module, filename);
+};
+
+mod._saved_json_extension = mod._extensions[".json"];
+mod._extensions[".json"] = (module, filename) => {
+ if (mod._ionoMods.hasOwnProperty(filename)) {
+ const imod = mod._ionoMods[filename];
+ const content = imod;
+ try {
+ module.exports = JSON.parse(stripBOM(content));
+ return;
+ } catch (err) {
+ err.message = filename + ': ' + err.message;
+ throw err;
+ }
+ }
+ return mod._saved_json_extension(module, filename);
+};
diff --git a/node.gyp b/node.gyp
index 2dd743331c..26a3097384 100644
--- a/node.gyp
+++ b/node.gyp
@@ -69,6 +69,7 @@
'lib/_http_server.js',
'lib/https.js',
'lib/inspector.js',
+ 'lib/iono.js',
'lib/module.js',
'lib/net.js',
'lib/os.js',