/* The reach loader's host under Node, in ECMAScript 5 so that it runs on every Node line * the conformance proxies use (0.12 onward). * * var H = require('./node-host.js'); * H.host { loadScript(file, cb), fetchBytes(file, cb), importModule(file, cb) } * H.loadLoader(dist) evaluates dist/wai-load.js as a classic script; returns WaiLoad * H.bytes(file) the file as a Uint8Array */ 'use strict'; var fs = require('fs'), vm = require('vm'), path = require('path'); function toBytes(buf) { var u; try { u = new Uint8Array(buf); if (u.length === buf.length) return u; } catch (e) { /* engines without array-like construction */ } u = new Uint8Array(buf.length); for (var i = 0; i < buf.length; i++) u[i] = buf[i]; return u; } function bytes(file) { return toBytes(fs.readFileSync(file)); } function runScript(file) { vm.runInThisContext(fs.readFileSync(file, 'utf8'), file); } var host = { loadScript: function (file, cb) { try { runScript(file); } catch (e) { cb(e); return; } cb(null); }, fetchBytes: function (file, cb) { var u; try { u = bytes(file); } catch (e) { cb(e); return; } cb(null, u); }, importModule: function (file, cb) { var dyn; try { dyn = new Function('u', 'return import(u)'); } catch (e) { cb(new Error('no dynamic import on this engine: ' + e.message)); return; } var url = 'file://' + path.resolve(file).split(path.sep).join('/'); dyn(url).then(function (m) { cb(null, m); }, function (e) { cb(e); }); } }; function loadLoader(dist) { runScript(path.join(dist, 'wai-load.js')); return global.WaiLoad; } module.exports = { host: host, loadLoader: loadLoader, bytes: bytes, toBytes: toBytes, runScript: runScript };