diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..cb8a79b79 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +js/deps/ +js/modules/inherits.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..d0094afd8 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,38 @@ +extends: + - airbnb-base + +globals: + debug: true + __SYSCALL: true + runtime: true + +env: + es6: true + node: true + +rules: + strict: + - 2 + - 'global' + max-len: + - 2 + - + code: 100 + tabWidth: 2 + ignoreComments: true + ignoreUrls: true + consistent-return: 1 + no-underscore-dangle: 0 + +parserOptions: + ecmaVersion: 6 + sourceType: 'script' + ecmaFeatures: + modules: false + defaultParams: true + classes: true + arrowFunctions: true + blockBindings: true + forOf: true + spread: true + templateStrings: true diff --git a/js/.eslintignore b/js/.eslintignore deleted file mode 100644 index 9102a60f2..000000000 --- a/js/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -deps/ -modules/inherits.js diff --git a/js/.eslintrc b/js/.eslintrc deleted file mode 100644 index 01df1465c..000000000 --- a/js/.eslintrc +++ /dev/null @@ -1,9 +0,0 @@ -extends: - - runtime - -plugins: - - runtime-internal - -globals: - debug: true - __SYSCALL: true diff --git a/js/__loader.js b/js/__loader.js index f1bc2cc7e..0eae3a288 100644 --- a/js/__loader.js +++ b/js/__loader.js @@ -14,253 +14,209 @@ 'use strict'; -(function() { +(() => { // from https://github.com/runtimejs/runtime-module-loader/blob/master/index.js - function Loader(existsFileFn, readFileFn, evalScriptFn, builtins, builtinsResolveFrom) { - builtinsResolveFrom = builtinsResolveFrom || '/'; - var cache = {}; - var builtinsResolveFromComponents = builtinsResolveFrom.split('/'); - builtins = builtins || {}; - - function throwError(err) { - throw err; - } - - function endsWith(str, suffix) { - return str.indexOf(suffix, str.length - suffix.length) !== -1; - } - - function Module(pathComponents) { - this.dirComponents = pathComponents.slice(0, -1); - this.pathComponents = pathComponents; - this.filename = pathComponents.join('/'); - this.dirname = this.dirComponents.length > 1 ? this.dirComponents.join('/') : '/'; - this.exports = {}; - } - - Module.prototype.require = function require(path) { - var module = this; - var resolvedPath = resolve(module, path); - if (!resolvedPath) { - throwError(new Error("Cannot resolve module '" + path + "' from '" + module.filename + "'")); - } - - // eval file - var pathComponents = resolvedPath.split('/'); - var displayPath = resolvedPath; - var cacheKey = pathComponents.join('/'); - if (cache[cacheKey]) { - return cache[cacheKey].exports; - } - - var currentModule = global.module; - var module = new Module(pathComponents); - cache[cacheKey] = module; - global.module = module; - - if (endsWith(resolvedPath, '.node')) { - throwError(new Error("Native Node.js modules are not supported '" + resolvedPath + "'")); - } - - var content = readFileFn(resolvedPath); - if (!content) { - throwError(new Error("Cannot load module '" + resolvedPath + "'")); - } - - if (endsWith(resolvedPath, '.json')) { - module.exports = JSON.parse(content); - } else { - evalScriptFn( - '(function(require,exports,module,__filename,__dirname){' + - content + - '})((function(m){return function(path){return m.require(path)}})(global.module),global.module.exports,global.module,global.module.filename,global.module.dirname)', - displayPath); - } + class Loader { + constructor(existsFileFn, readFileFn, evalScriptFn, builtins = {}, builtinsResolveFrom = '/') { + const cache = {}; + const builtinsResolveFromComponents = builtinsResolveFrom.split('/'); + + const throwError = (err) => { throw err; }; + const endsWith = (str, suffix) => str.indexOf(suffix, str.length - suffix.length) !== -1; + + const normalizePath = (components) => { + const r = []; + for (const p of components) { + if (p === '') { + if (r.length === 0) r.push(p); + continue; + } - global.module = currentModule; - return module.exports; - }; + if (p === '.') continue; - function normalizePath(components) { - var r = []; - for (var i = 0; i < components.length; ++i) { - var p = components[i]; - if ('' === p) { - if (r.length === 0) { + if (p === '..') { + if (r.length > 0) { + r.pop(); + } else { + return null; + } + } else { r.push(p); } - continue; } - if ('.' === p) { - continue; + return r; + }; + + const loadAsFile = (path) => { + if (existsFileFn(path)) return path; + if (existsFileFn(`${path}.js`)) return `${path}.js`; + if (existsFileFn(`${path}.json`)) return `${path}.json`; + if (existsFileFn(`${path}.node`)) return `${path}.node`; + + return null; + }; + + const getPackageMain = (packageJsonFile) => { + const json = readFileFn(packageJsonFile); + let parsed = null; + try { + parsed = JSON.parse(json); + } catch (e) { + throwError(new Error(`package.json '${packageJsonFile}' parse error`)); } - if ('..' === p) { - if (r.length > 0) { - r.pop(); - } else { - return null; + if (parsed.runtime) { + if (typeof parsed.runtime === 'string') { + return parsed.runtime; } - } else { - r.push(p); + throwError(new Error(`package.json '${packageJsonFile}' runtime field value is invalid`)); } - } - return r; - } + return parsed.main || 'index.js'; + }; - function loadAsFile(path) { - if (existsFileFn(path)) { - return path; - } + const loadAsDirectory = (path, ignoreJson) => { + let mainFile = 'index'; + let dir = false; + if (!ignoreJson && existsFileFn(`${path}/package.json`)) { + mainFile = getPackageMain(`${path}/package.json`) || 'index'; + dir = true; + } - if (existsFileFn(path + '.js')) { - return path + '.js'; - } + const normalizedPath = normalizePath(path.split('/').concat(mainFile.split('/'))); + if (!normalizedPath) return null; - if (existsFileFn(path + '.json')) { - return path + '.json'; - } + const s = normalizedPath.join('/'); + const res = loadAsFile(s); + if (res) return res; - if (existsFileFn(path + '.node')) { - return path + '.node'; - } + if (dir) return loadAsDirectory(s, true); - return null; - } + return null; + }; - function getPackageMain(packageJsonFile) { - var json = readFileFn(packageJsonFile); - var parsed = null; - try { - var parsed = JSON.parse(json); - } catch (e) { - throwError(new Error("package.json '" + packageJsonFile + "' parse error")); - } + const loadNodeModules = (dirComponents, parts) => { + let count = dirComponents.length; - if (parsed.runtime) { - if (typeof parsed.runtime === 'string') { - return parsed.runtime; - } else { - throwError(new Error("package.json '" + packageJsonFile + "' runtime field value is invalid")); - } - } + while (count-- > 0) { + let p = dirComponents.slice(0, count + 1); + if (p.length === 0) continue; - return parsed.main || 'index.js'; - } + if (p[p.length - 1] === 'node_modules') continue; - function loadAsDirectory(path, ignoreJson) { - var mainFile = 'index'; - var dir = false; - if (!ignoreJson && existsFileFn(path + '/package.json')) { - mainFile = getPackageMain(path + '/package.json') || 'index'; - dir = true; - } + p.push('node_modules'); + p = p.concat(parts); - var normalizedPath = normalizePath(path.split('/').concat(mainFile.split('/'))); - if (!normalizedPath) { - return null; - } + const normalizedPath = normalizePath(p); + if (!normalizedPath) continue; - var s = normalizedPath.join('/'); - var res = loadAsFile(s); - if (res) { - return res; - } + const s = normalizedPath.join('/'); + const loadedPath = loadAsFile(s) || loadAsDirectory(s, false) || null; + if (loadedPath) return loadedPath; + } - if (dir) { - return loadAsDirectory(s, true); - } + return null; + }; - return null; - } + const resolve = (module, pathOpt = '') => { + let path = String(pathOpt); - function loadNodeModules(dirComponents, parts) { - var count = dirComponents.length; + let resolveFrom = module.dirComponents; - while (count-- > 0) { - var p = dirComponents.slice(0, count + 1); - if (p.length === 0) { - continue; + if (Object.prototype.hasOwnProperty.call(builtins, path)) { + path = builtins[path]; + resolveFrom = builtinsResolveFromComponents; } - if (p[p.length - 1] === 'node_modules') { - continue; - } + const pathComponents = path.split('/'); + const firstPathComponent = pathComponents[0]; - p.push('node_modules'); - p = p.concat(parts); + // starts with ./ ../ or / + if (firstPathComponent === '.' || + firstPathComponent === '..' || + firstPathComponent === '') { + const combinedPathComponents = (firstPathComponent === '') + ? pathComponents + : resolveFrom.concat(pathComponents); - var normalizedPath = normalizePath(p); - if (!normalizedPath) { - continue; - } + const normalizedPath = normalizePath(combinedPathComponents); + if (!normalizedPath) return null; - var s = normalizedPath.join('/'); - var loadedPath = loadAsFile(s) || loadAsDirectory(s, false) || null; - if (loadedPath) { + const pathStr = normalizedPath.join('/'); + const loadedPath = loadAsFile(pathStr) || loadAsDirectory(pathStr, false) || null; return loadedPath; } - } - return null; - } + return loadNodeModules(resolveFrom, pathComponents); + }; - function resolve(module, path) { - path = String(path || ''); + class Module { + constructor(pathComponents) { + this.dirComponents = pathComponents.slice(0, -1); + this.pathComponents = pathComponents; + this.filename = pathComponents.join('/'); + this.dirname = this.dirComponents.length > 1 ? this.dirComponents.join('/') : '/'; + this.exports = {}; + } + require(path) { + let module = this; + const resolvedPath = resolve(module, path); + if (!resolvedPath) { + throwError(new Error(`Cannot resolve module '${path}' from '${module.filename}'`)); + } - var resolveFrom = module.dirComponents; + // eval file + const pathComponents = resolvedPath.split('/'); + const displayPath = resolvedPath; + const cacheKey = pathComponents.join('/'); + if (cache[cacheKey]) return cache[cacheKey].exports; - if (builtins.hasOwnProperty(path)) { - path = builtins[path]; - resolveFrom = builtinsResolveFromComponents; - } + const currentModule = global.module; + module = new Module(pathComponents); + cache[cacheKey] = module; + global.module = module; - var pathComponents = path.split('/'); - var firstPathComponent = pathComponents[0]; + if (endsWith(resolvedPath, '.node')) { + throwError(new Error(`Native Node.js modules are not supported '${resolvedPath}'`)); + } - // starts with ./ ../ or / - if (firstPathComponent === '.' || - firstPathComponent === '..' || - firstPathComponent === '') { - var combinedPathComponents = (firstPathComponent === '') - ? pathComponents - : resolveFrom.concat(pathComponents); + const content = readFileFn(resolvedPath); + if (!content) throwError(new Error(`Cannot load module '${resolvedPath}'`)); - var normalizedPath = normalizePath(combinedPathComponents); - if (!normalizedPath) { - return null; - } + if (endsWith(resolvedPath, '.json')) { + module.exports = JSON.parse(content); + } else { + /* eslint-disable max-len */ + evalScriptFn( + `(function(require,exports,module,__filename,__dirname){ +${content} +})((function(m){return function(path){return m.require(path)}})(global.module),global.module.exports,global.module,global.module.filename,global.module.dirname)`, + displayPath); + /* eslint-enable max-len */ + } - var pathStr = normalizedPath.join('/'); - var loadedPath = loadAsFile(pathStr) || loadAsDirectory(pathStr, false) || null; - return loadedPath; + global.module = currentModule; + return module.exports; + } } - return loadNodeModules(resolveFrom, pathComponents); + this.require = (path) => { + const rootModule = new Module(['', '']); + global.module = rootModule; + return rootModule.require(path); + }; } - - this.require = function require(path) { - var rootModule = new Module(['', '']); - global.module = rootModule; - return rootModule.require(path); - }; } // end - var files = {}; - __SYSCALL.initrdListFiles().forEach(file => { - files[file] = true; - }); + const files = {}; + for (const file of __SYSCALL.initrdListFiles()) files[file] = true; - function fileExists(path) { - return !!files[path]; - } + const fileExists = path => !!files[path]; - var runtimePackagePath = __SYSCALL.initrdGetKernelIndex().split('/').slice(0, -1).join('/'); - var loader = new Loader(fileExists, __SYSCALL.initrdReadFile, __SYSCALL.eval, { - /* eslint-disable camelcase */ + const runtimePackagePath = __SYSCALL.initrdGetKernelIndex().split('/').slice(0, -1).join('/'); + const loader = new Loader(fileExists, __SYSCALL.initrdReadFile, __SYSCALL.eval, { assert: 'assert', events: 'events', buffer: 'buffer', @@ -280,11 +236,10 @@ stream: './modules/stream.js', inherits: './modules/inherits.js', sys: 'util/util.js', - util: 'util/util.js' - /* eslint-enable camelcase */ + util: 'util/util.js', }, runtimePackagePath); - loader.require(runtimePackagePath + '/index.js'); + loader.require(`${runtimePackagePath}/index.js`); global.process = loader.require('process'); global.Buffer = loader.require('buffer').Buffer; diff --git a/js/component/dns-client/dns-packet.js b/js/component/dns-client/dns-packet.js index 7c0d4d5b8..ddf336497 100644 --- a/js/component/dns-client/dns-packet.js +++ b/js/component/dns-client/dns-packet.js @@ -13,39 +13,35 @@ // limitations under the License. 'use strict'; -var assert = require('assert'); -var isDomain = require('./is-domain'); -var PacketReader = require('./packet-reader'); -var randomId = 0x3322; - -var queries = { - 'A': 0x01, - 'NS': 0x02, - 'CNAME': 0x05, - 'PTR': 0x0C, - 'MX': 0x0F, - 'SRV': 0x21, - 'SOA': 0x06, - 'TXT': 0x0A -} - -exports.getQuery = function(domain, query) { +const assert = require('assert'); +const isDomain = require('./is-domain'); +const PacketReader = require('./packet-reader'); +const randomId = 0x3322; + +const queries = { + A: 0x01, + NS: 0x02, + CNAME: 0x05, + PTR: 0x0C, + MX: 0x0F, + SRV: 0x21, + SOA: 0x06, + TXT: 0x0A, +}; + +exports.getQuery = (domain, query) => { // query isn't used (for now) assert(isDomain(domain)); - var bufferLength = 17; - var i, j, label; + let bufferLength = 17; - var labels = domain.split('.'); - for (i = 0; i < labels.length; ++i) { - label = labels[i]; - bufferLength += label.length + 1; - } + const labels = domain.split('.'); + for (const label of labels) bufferLength += label.length + 1; - var u8 = new Uint8Array(bufferLength); - var view = new DataView(u8.buffer); + const u8 = new Uint8Array(bufferLength); + const view = new DataView(u8.buffer); - var requestFlags = 0x0100; // query, standard, not truncated, recursive + const requestFlags = 0x0100; // query, standard, not truncated, recursive view.setUint16(0, randomId, false); view.setUint16(2, requestFlags, false); @@ -54,14 +50,11 @@ exports.getQuery = function(domain, query) { view.setUint16(8, 0, false); // 0 ns records view.setUint16(10, 0, false); // 0 additional records - var offset = 12; + let offset = 12; - for (i = 0; i < labels.length; ++i) { - label = labels[i]; + for (const label of labels) { view.setUint8(offset++, label.length); - for (j = 0; j < label.length; ++j) { - view.setUint8(offset++, label.charCodeAt(j)); - } + for (let j = 0; j < label.length; ++j) view.setUint8(offset++, label.charCodeAt(j)); } view.setUint8(offset++, 0); // null terminator @@ -70,98 +63,99 @@ exports.getQuery = function(domain, query) { return u8; }; -var POINTER_VALUE = 0xc0; -function isPointer(value) { - return (value & POINTER_VALUE) === POINTER_VALUE; -} +const POINTER_VALUE = 0xc0; +const isPointer = value => (value & POINTER_VALUE) === POINTER_VALUE; -function readHostname(reader) { - var labels = []; +const readHostname = (reader) => { + let labels = []; - for (var z = reader.getOffset(); z < reader.len; ++z) { - var len = reader.readUint8(); - if (0 === len) { - break; - } + for (let z = reader.getOffset(); z < reader.len; ++z) { + const len = reader.readUint8(); + if (len === 0) break; if (isPointer(len)) { - var ptrOffset = ((len - POINTER_VALUE) << 8) + reader.readUint8(); - var pos = reader.getOffset(); + const ptrOffset = ((len - POINTER_VALUE) << 8) + reader.readUint8(); + const pos = reader.getOffset(); reader.setOffset(ptrOffset); labels = labels.concat(readHostname(reader)); reader.setOffset(pos); break; } else { - var label = ''; - for (var i = 0; i < len; ++i) { - label += String.fromCharCode(reader.readUint8()); - } + let label = ''; + for (let i = 0; i < len; ++i) label += String.fromCharCode(reader.readUint8()); labels.push(label); } } return labels; -} +}; -exports.parseResponse = function(u8) { - var reader = new PacketReader(u8.buffer, u8.byteLength, u8.byteOffset); - var responseRandomId = reader.readUint16(); +exports.parseResponse = (u8) => { + const reader = new PacketReader(u8.buffer, u8.byteLength, u8.byteOffset); + const responseRandomId = reader.readUint16(); - if (responseRandomId !== randomId) { - return null; - } + if (responseRandomId !== randomId) return null; - var flags = reader.readUint16(); - var questionsCount = reader.readUint16(); - var answersCount = reader.readUint16(); - var nsRecordsCount = reader.readUint16(); - var additionalCount = reader.readUint16(); + /* eslint-disable no-unused-vars */ + const flags = reader.readUint16(); + const questionsCount = reader.readUint16(); + const answersCount = reader.readUint16(); + const nsRecordsCount = reader.readUint16(); + const additionalCount = reader.readUint16(); + /* eslint-enable no-unused-vars */ - if (1 !== questionsCount) { - return null; - } + if (questionsCount !== 1) return null; // Read question - var hostname = readHostname(reader).join('.'); + const hostname = readHostname(reader).join('.'); reader.readUint16(); // skip type reader.readUint16(); // skip class - var results = []; + const results = []; // Read answers - for (var z = 0; z < answersCount; ++z) { - var host = readHostname(reader).join('.'); + for (let z = 0; z < answersCount; ++z) { + const host = readHostname(reader).join('.'); - var recordType = reader.readUint16(); - var recordClass = reader.readUint16(); - var ttl = reader.readUint32(); - var rdLen = reader.readUint16(); + const recordType = reader.readUint16(); + const recordClass = reader.readUint16(); // eslint-disable-line no-unused-vars + const ttl = reader.readUint32(); + const rdLen = reader.readUint16(); - var bytes = []; + // const bytes = []; switch (recordType) { - case queries.A: // A record - if (4 !== rdLen) { - return null; - } - - results.push({hostname: host, record: 'A', address: [reader.readUint8(), reader.readUint8(), - reader.readUint8(), reader.readUint8()], ttl: ttl }); - break; - case queries.CNAME: // CNAME record - results.push({hostname: host, record: 'CNAME', name: readHostname(reader).join('.')}); - break; - default: - for (var b = 0; b < rdLen; ++b) { - reader.readUint8(); - } - break; + case queries.A: // A record + if (rdLen !== 4) return null; + + results.push({ + hostname: host, + record: 'A', + address: [ + reader.readUint8(), + reader.readUint8(), + reader.readUint8(), + reader.readUint8(), + ], + ttl, + }); + break; + case queries.CNAME: // CNAME record + results.push({ + hostname: host, + record: 'CNAME', + name: readHostname(reader).join('.'), + }); + break; + default: + for (let b = 0; b < rdLen; ++b) reader.readUint8(); + break; } } return { - hostname: hostname, - results: results + hostname, + results, }; }; diff --git a/js/component/dns-client/index.js b/js/component/dns-client/index.js index ef609566a..7fcf6e396 100644 --- a/js/component/dns-client/index.js +++ b/js/component/dns-client/index.js @@ -13,95 +13,81 @@ // limitations under the License. 'use strict'; -var assert = require('assert'); -var typeutils = require('typeutils'); -var dnsPacket = require('./dns-packet'); -var isint = require('isint'); -var runtime = require('../../core'); -var IP4Address = runtime.net.IP4Address; -var UDPSocket = runtime.net.UDPSocket; - -function DNSClient(serverIP, serverPort) { - assert(this instanceof DNSClient); - if (serverIP) { - assert(serverIP instanceof IP4Address); - } - - if (serverPort) { - assert(isint.uint16(serverPort)); - } - - var self = this; - self._socket = new UDPSocket(); - self._serverIP = serverIP || new IP4Address(8, 8, 8, 8); - self._serverPort = serverPort || 53; - self._requests = []; - self._cache = {}; - - self._socket.onmessage = function(ip, port, u8) { - var data = dnsPacket.parseResponse(u8); - if (!data) { - return; - } - - debug('DNS recv', ip, port, JSON.stringify(data)); - - var requests = self._requests; - var domain = data.hostname; - for (var i = 0; i < requests.length; ++i) { - var req = requests[i]; - if (!req) { - continue; - } - - if (req.domain === domain) { - req.cb(null, data); - self._cache[domain] = data; - requests[i] = null; +const assert = require('assert'); +const typeutils = require('typeutils'); +const dnsPacket = require('./dns-packet'); +const isint = require('isint'); +const runtime = require('../../core'); +const { IP4Address, UDPSocket } = runtime.net; + +class DNSClient { + constructor(serverIP, serverPort) { + assert(this instanceof DNSClient); + if (serverIP) assert(serverIP instanceof IP4Address); + if (serverPort) assert(isint.uint16(serverPort)); + + this._socket = new UDPSocket(); + this._serverIP = serverIP || new IP4Address(8, 8, 8, 8); + this._serverPort = serverPort || 53; + this._requests = []; + this._cache = {}; + + this._socket.onmessage = (ip, port, u8) => { + const data = dnsPacket.parseResponse(u8); + if (!data) return; + + debug('DNS recv', ip, port, JSON.stringify(data)); + + const requests = this._requests; + const domain = data.hostname; + for (let i = 0; i < requests.length; i++) { + const req = requests[i]; + if (!req) continue; + + if (req.domain === domain) { + req.cb(null, data); + this._cache[domain] = data; + requests[i] = null; + } } - } - }; - - setInterval(function() { - var requests = self._requests; - - for (var i = 0; i < requests.length; ++i) { - var req = requests[i]; - if (!req) { - continue; + }; + + setInterval(() => { + const requests = this._requests; + + for (let i = 0; i < requests.length; i++) { + const req = requests[i]; + if (!req) continue; + + if (req.retry > 0) { + this._sendQuery(req.domain, req.opts.query || 'A'); + --req.retry; + } else { + req.cb(new Error('E_FAILED')); + requests[i] = null; + } } - if (req.retry > 0) { - self._sendQuery(req.domain, req.opts.query || 'A'); - --req.retry; - } else { - req.cb(new Error('E_FAILED')); - requests[i] = null; - } - } - - self._requests = requests - .filter(function(x) { return x !== null; }); - }, 1000); + this._requests = requests.filter(x => x !== null); + }, 1000); + } + _sendQuery(domain, type) { + const query = dnsPacket.getQuery(domain, type); + this._socket.send(this._serverIP, this._serverPort, query); + } + resolve(domain, opts, cb) { + assert(this instanceof DNSClient); + assert(typeutils.isString(domain)); + assert(typeutils.isFunction(cb)); + + this._sendQuery(domain, opts.query || 'A'); + this._requests.push({ + domain, + retry: 3, + opts, + cb, + }); + } } -DNSClient.prototype._sendQuery = function(domain, type) { - var query = dnsPacket.getQuery(domain, type); - this._socket.send(this._serverIP, this._serverPort, query); -}; - -DNSClient.prototype.resolve = function(domain, opts, cb) { - assert(this instanceof DNSClient); - assert(typeutils.isString(domain)); - assert(typeutils.isFunction(cb)); - - this._sendQuery(domain, opts.query || 'A'); - this._requests.push({ - domain: domain, - retry: 3, - opts: opts, - cb: cb - }); -}; - module.exports = DNSClient; diff --git a/js/component/dns-client/is-domain.js b/js/component/dns-client/is-domain.js index 13efd361e..0cfc53578 100644 --- a/js/component/dns-client/is-domain.js +++ b/js/component/dns-client/is-domain.js @@ -13,32 +13,18 @@ // limitations under the License. 'use strict'; -var assert = require('assert'); -var typeutils = require('typeutils'); -var domainRegex = /^[a-z0-9.-]+$/; +const typeutils = require('typeutils'); +const domainRegex = /^[a-z0-9.-]+$/; -function isDomain(domain) { - if (!typeutils.isString(domain)) { - return false; - } +module.exports = (domain) => { + if (!typeutils.isString(domain)) return false; - if (domain.length > 255) { - return false; - } + if (domain.length > 255) return false; - if (!domainRegex.test(domain)) { - return false; - } + if (!domainRegex.test(domain)) return false; - var labels = domain.split('.'); - for (var i = 0; i < labels.length; ++i) { - var label = labels[i]; - if (label.length < 1 || label.length > 63) { - return false; - } - } + const labels = domain.split('.'); + for (const label of labels) if (label.length < 1 || label.length > 63) return false; return true; -} - -module.exports = isDomain; +}; diff --git a/js/component/dns-client/packet-reader.js b/js/component/dns-client/packet-reader.js index 544ca0316..6e7ce1f11 100644 --- a/js/component/dns-client/packet-reader.js +++ b/js/component/dns-client/packet-reader.js @@ -14,38 +14,32 @@ 'use strict'; -function PacketReader(buf, len, offset) { - this.buf = buf; - this.len = len || buf.byteLength; - this.offset = 0; - this.view = new DataView(buf, offset, len); +class PacketReader { + constructor(buf, len = buf.byteLength, offset) { + this.buf = buf; + this.len = len; + this.offset = 0; + this.view = new DataView(buf, offset, len); + } + readUint8() { + return this.view.getUint8(this.offset++); + } + readUint16() { + const value = this.view.getUint16(this.offset, false); + this.offset += 2; + return value; + } + readUint32() { + const value = this.view.getUint32(this.offset, false); + this.offset += 4; + return value; + } + getOffset() { + return this.offset; + } + setOffset(offset) { + this.offset = offset; + } } -PacketReader.prototype.readUint8 = function() { - /* linter bug ? */ - /* eslint-disable space-unary-ops */ - return this.view.getUint8(this.offset++); - /* eslint-enable space-unary-ops */ -}; - -PacketReader.prototype.readUint16 = function() { - var value = this.view.getUint16(this.offset, false); - this.offset += 2; - return value; -}; - -PacketReader.prototype.readUint32 = function() { - var value = this.view.getUint32(this.offset, false); - this.offset += 4; - return value; -}; - -PacketReader.prototype.getOffset = function() { - return this.offset; -}; - -PacketReader.prototype.setOffset = function(offset) { - this.offset = offset; -}; - module.exports = PacketReader; diff --git a/js/index.js b/js/index.js index ed6ad614b..19995ff24 100644 --- a/js/index.js +++ b/js/index.js @@ -14,18 +14,18 @@ 'use strict'; -var packagejson = require('../package.json'); +const packagejson = require('../package.json'); require('module-singleton')(packagejson); require('./version'); console.log(`runtime.js v${packagejson.version}`); console.log('loading...'); -var isDebug = packagejson.runtimejs.debug; -global.debug = isDebug ? console.log : function() {}; +const isDebug = packagejson.runtimejs.debug; +global.debug = isDebug ? console.log : () => {}; // Load runtime.js core -var runtime = require('./core'); +const runtime = require('./core'); // Start services require('./service/dhcp-client'); @@ -36,24 +36,22 @@ runtime.dns = require('./service/dns-resolver'); runtime.debug = isDebug; // Example shell command -runtime.shell.setCommand('1', function(args, env, cb) { +runtime.shell.setCommand('1', (args, env, cb) => { env.stdio.writeLine('OK.'); - runtime.dns.resolve('www.google.com', {}, function(err, data) { - if (err) { - return cb(1); - } + runtime.dns.resolve('www.google.com', {}, (err, data) => { + if (err) return cb(1); console.log(JSON.stringify(data)); cb(0); }); }); -runtime.shell.setCommand('poweroff', function(args, env, cb) { +runtime.shell.setCommand('poweroff', (args, env, cb) => { env.stdio.writeLine('Going down, now!'); runtime.machine.shutdown(); cb(0); }); -runtime.shell.setCommand('reboot', function(args, env, cb) { +runtime.shell.setCommand('reboot', (args, env, cb) => { env.stdio.writeLine('Restarting, now!'); runtime.machine.reboot(); cb(0); diff --git a/js/version.js b/js/version.js index 9cecec4f3..ba79ef790 100644 --- a/js/version.js +++ b/js/version.js @@ -14,16 +14,15 @@ 'use strict'; -/* global __SYSCALL */ -if (!global.__SYSCALL) { - throw 'error: this program requires runtime.js environment'; -} +if (!global.__SYSCALL) throw new Error('error: this program requires runtime.js environment'); -var requiredKernelVersion = require('../runtimecorelib.json').kernelVersion; -var currentKernelVersion = __SYSCALL.version().kernel; +const requiredKernelVersion = require('../runtimecorelib.json').kernelVersion; +const currentKernelVersion = __SYSCALL.version().kernel; if (currentKernelVersion !== requiredKernelVersion) { - throw `error: required kernel version number ${requiredKernelVersion}, current ${currentKernelVersion}`; + /* eslint-disable max-len */ + throw new Error(`error: required kernel version number ${requiredKernelVersion}, current ${currentKernelVersion}`); + /* eslint-enable max-len */ } console.log(`Kernel build #${currentKernelVersion} (v8 ${__SYSCALL.version().v8})`); diff --git a/package.json b/package.json index 8ba32ea17..055843a90 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "private": true, "scripts": { "postinstall": "node scripts/update-versions.js", - "lint": "eslint .", + "lint": "eslint js", "test": "runtimeify test/unit/index.js -o initrd && runtime-qemu ./initrd", "test-build": "runtimeify test/unit/index.js -o initrd && runtime-qemu ./initrd --kernel ../disk/boot/runtime" }, @@ -21,9 +21,9 @@ }, "homepage": "http://runtimejs.org", "devDependencies": { - "eslint": "^1.8.0", - "eslint-config-runtime": "^1.0.0", - "eslint-plugin-runtime-internal": "^1.0.0", + "eslint": "^3.0.1", + "eslint-config-airbnb-base": "^4.0.0", + "eslint-plugin-import": "^1.10.2", "tape": "^4.0.0" }, "runtimejs": {