diff --git a/README.md b/README.md index 779ab5b..d39182d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ Arduinojs ========= Any application that can ge written in JavaScript will eventually be written in JavaScript + Jeff Atwood + Use node v0.10.26 Restful api server includes javascript wrapper for openFPGAdunino library diff --git a/apps/coap.js b/apps/coap.js index d63ee99..56f8899 100644 --- a/apps/coap.js +++ b/apps/coap.js @@ -1,5 +1,41 @@ -module.exports = function(app, logger, io, db, express) { +module.exports = function (app, logger, express, event) { logger.info('module coap'); var router = express.Router(); + + var coap = require('coap') + , server = coap.createServer() + + router.post('/request', function(req, res) { + var url = req.body.url; + var request = coap.request(url) //coap://localhost/coap + + request.on('response', function(res) { + //logger.info(res.payload) + res.pipe(process.stdout) + event.emit('coap', {response:res}); + res.on('end', function() { + }) + }) + + request.end() + res.json({ + message: 'coap request' + }); + + }) + + router.post('/server', function(req, res) { + // the default CoAP port is 5683 + server.listen(function() { + + }) + server.on('request', function(req, res) { + res.end('Hello ' + req.url.split('/')[1] + '\n') + }) + res.json({ + message: 'coap server start' + }); + }); + app.use('/coap', router); } \ No newline at end of file diff --git a/apps/cron.js b/apps/cron.js index 60967f6..f218d4b 100644 --- a/apps/cron.js +++ b/apps/cron.js @@ -3,7 +3,7 @@ module.exports = function(app, router, cron, logger) { new cron('* * * * * *', function() { logger.debug('You will see this message every second'); - }, null, true, 'America/Los_Angeles'); + }, null, true, 'Asia/Shanghai'); router.post('/:job', function(req, res) { res.json({ @@ -20,4 +20,4 @@ module.exports = function(app, router, cron, logger) { app.use('/cron', router); -} \ No newline at end of file +} diff --git a/apps/db.js b/apps/db.js index 16eb10e..997f811 100644 --- a/apps/db.js +++ b/apps/db.js @@ -1,6 +1,6 @@ -module.exports = function(app, logger, router, db) { +module.exports = function(app, logger, express, db) { logger.info('module db'); - + var router = express.Router(); router.get('/list', function(req, res) { // Use the admin database for the operation db.collectionNames(function(err, docs) { @@ -25,8 +25,8 @@ module.exports = function(app, logger, router, db) { var doc = req.params.doc; var collection = db.collection(doc); collection.find({}).toArray(function(err, docs) { - console.log("Found the following records"); - console.dir(docs); + logger.debug("Found the following records"); + //console.dir(docs); res.json(docs); }); }); @@ -54,8 +54,8 @@ module.exports = function(app, logger, router, db) { var doc = req.params.doc; var collection = db.collection(doc); collection.find(req.body).toArray(function(err, docs) { - console.log("Found the following records"); - console.dir(docs); + logger.debug("Found the following records"); + //console.dir(docs); res.json(docs); }); }); @@ -64,7 +64,7 @@ module.exports = function(app, logger, router, db) { var doc = req.params.doc; var collection = db.collection(doc); collection.remove(req.body, function(err, result) { - console.log("Removed the document"); + logger.debug("Removed the document"); res.json({ message: 'remove ok', result: result diff --git a/apps/fpga.js b/apps/fpga.js index cfbdb5e..5fea07d 100644 --- a/apps/fpga.js +++ b/apps/fpga.js @@ -1,4 +1,4 @@ -module.exports = function(app, logger, io, db, fs) { +module.exports = function(app, logger, db, fs, io) { var p = require('child_process'); var fpga = require('.././build/Release/openfpgaduino'); var express = require('express'); @@ -112,7 +112,7 @@ module.exports = function(app, logger, io, db, fs) { for (m in fpga) { method.push(m.toString); } - req.json({ + res.json({ "method": method }); }); @@ -120,7 +120,7 @@ module.exports = function(app, logger, io, db, fs) { router.get('/api/list/:method', function(req, res) { var method = req.params.method; if (fpga[method]) { - req.json({ + res.json({ "method": fpga[method] }); } diff --git a/apps/main.js b/apps/main.js index 2d17f39..c58938c 100644 --- a/apps/main.js +++ b/apps/main.js @@ -1,11 +1,11 @@ -module.exports = function(app, logger, event, fs) { +module.exports = function (app, logger, event, fs, uuid) { logger.info('module main'); var assert = require('assert'); - app.get('/test', function(req, res) { + app.get('/test', function (req, res) { res.send('Hello this is the Openfpgaduino!'); }); - app.post('/', function(req, res) { + app.post('/', function (req, res) { res.statusCode = 302; res.setHeader("Location", "index.html"); res.end(); @@ -13,11 +13,42 @@ module.exports = function(app, logger, event, fs) { var path = require('path'); - app.get('/list', function(req, res) { + app.get('/uuid', function (req, res) { + res.json(uuid) + }); + + function service_discover(urlstack, basebath) { + var table = [] + for (var key in urlstack) { + if (urlstack.hasOwnProperty(key)) { + var val = urlstack[key]; + if (val.route) { + val = val.route; + var url = {}; + url[val.stack[0].method] = basebath + val.path; + table.push(url); + } + else if (val.handle.stack) { + var stack = val.handle.stack + var path = "/" + val.regexp.toString().match(/\\\/(.*)\\.*/m)[1] + table.push(service_discover(stack, path)) + } + } + } + return table + } + + app.get('/service', function (req, res) { + var urlstack = app._router.stack + //console.dir(urlstack) + res.json(service_discover(urlstack, "/")) + }); + + app.get('/list', function (req, res) { var filelist = []; fs.readdirAsync(__dirname + "/") - .then(function(list) { - list.forEach(function(filename) { + .then(function (list) { + list.forEach(function (filename) { if (!/\.js$/.test(filename)) { return; } @@ -27,41 +58,41 @@ module.exports = function(app, logger, event, fs) { script: filelist }); }) - .catch(function(error) { + .catch(function (error) { res.json({ error: error }); }) }); - app.get('/get/:filename', function(req, res) { + app.get('/get/:filename', function (req, res) { var filename = req.params.filename; fs.readFileAsync(__dirname + "/" + filename, "utf8") - .then(function(code) { + .then(function (code) { res.send(code); }) - .catch(function(error) { + .catch(function (error) { res.json({ error: error }); }) }); - app.post('/log', function(req, res) { + app.post('/log', function (req, res) { var length = parseInt(req.body.length); var position = parseInt(req.body.position); fs.openAsync("server.log", 'r') - .then(function(fd) { + .then(function (fd) { var buffer = new Buffer(length); return fs.readAsync(fd, buffer, 0, length, position) }) - .spread(function(bytes, data) { + .spread(function (bytes, data) { res.json({ log: data.toString(), length: bytes }); }) - .catch(function(error) { + .catch(function (error) { res.json({ error: error }); @@ -69,18 +100,18 @@ module.exports = function(app, logger, event, fs) { }); - app.post('/install', function(req, res) { + app.post('/install', function (req, res) { var filename = req.body.filename; var code = req.body.code; fs.writeFileAsync(__dirname + "/" + filename, code) - .then(function() { + .then(function () { res.json({ message: 'app installed' }); }) }); - app.post('/load', function(req, res) { + app.post('/load', function (req, res) { var filename = req.body.filename; event.emit('load', filename); res.json({ @@ -88,10 +119,10 @@ module.exports = function(app, logger, event, fs) { }); }); - app.del('/:filename', function(req, res) { + app.del('/:filename', function (req, res) { var filename = req.params.filename; fs.unlinkAsync(__dirname + "/" + filename) - .then(function() { + .then(function () { res.json({ message: filename + ' deleted' }); diff --git a/apps/mqtt.js b/apps/mqtt.js index 393d5dc..388accf 100644 --- a/apps/mqtt.js +++ b/apps/mqtt.js @@ -1,4 +1,4 @@ -module.exports = function(app, logger, io, db, express) { +module.exports = function(app, logger, express, event) { logger.info('module mqtt'); var router = express.Router(); var mqtt = require('mqtt'); @@ -17,6 +17,7 @@ module.exports = function(app, logger, io, db, express) { client.on('message', function(topic, message) { // message is Buffer + event.emit('mqtt', {topic:topic,message:message}); logger.info(message.toString()); }); diff --git a/apps/plotly.js b/apps/plotly.js new file mode 100644 index 0000000..3862783 --- /dev/null +++ b/apps/plotly.js @@ -0,0 +1,41 @@ +module.exports = function (app, express, logger, port) { + var localtunnel = require('plotly'); + var router = express.Router(); + logger.info('module plotly'); + var apiKey = "6ko8gZthKiqAbUQH6IOn"; + var username = "lizhizhou"; + var plotly = require('plotly')(username, apiKey); + router.post('/plot/:name', function (req, res) { + var x = req.body.x; // [1,2,3] + var y = req.body.y; //[1,2,3] + var name = req.params.name; + var mode = req.params.mode; // "lines"" + var plotData = [{ + x: x, + y: y, + name: name, + mode: mode, + type: "scatter" + }]; + var layout = { + title: name, + }; + var graphOptions = { layout: layout, filename: name, fileopt: "overwrite" } + plotly.plot(plotData, graphOptions, function (err, msg) { + if (err) { + logger.info(err); + res.json({ + "error": err + }); + } else { + logger.info('Success! The plot (' + msg.filename + ') can be found at ' + msg.url); + res.json({ + "url": msg.url + }); + } + }); + + }); + + app.use('/plotly', router); +} diff --git a/apps/repl.js b/apps/repl.js new file mode 100644 index 0000000..e882d03 --- /dev/null +++ b/apps/repl.js @@ -0,0 +1,22 @@ +module.exports = function(parser_parameter,config,logger,db) { +var net = require("net"); +var repl = require("repl"); +var context = arguments; +logger.debug("Initial repl module"); +var context_v_name = parser_parameter(context.callee.toString()).split(',') + +net.createServer(function (socket) { + var r= repl.start({ + prompt: "node via TCP socket> ", + input: socket, + output: socket + }).on('exit', function() { + socket.end(); + }); + + for(var i=1;i= 0.0.0", - "socket.io": "*", + "socket.io": "1.7.4", "deasync": "*", "data.io": "*", "tingodb": "0.3.5", + "pouchdb": "3.1.0", "swagger-tools": "*", "body-parser": "*", - "log4js": "*", - "assert": "*", - "multer": "0.1.6", + "chai": "*", + "coap": "0.17.0", "collections": "*", + "cron": "*", + "deep-equal": "^1.0.1", "ffi": "*", - "shelljs": "*", "figlet": "*", - "mqtt": "^1.14.1", - "mocha": "*", - "node-uuid": "*", - "mosca": "1.1.0", - "chai": "*", - "request": "*", - "tcp-port-used": "*", - "tty.js": "*", - "cron": "*", - "diffsync": "*", + "gun": "0.7.0", + "helmet": "^3.6.0", "node-zookeeper-client": "*", "kafka-rest": "*", "localtunnel": "*", - "tingyun": "*", + "log4js": "1.1.1", "mathjs": "*", "microtime": "^2.1.2", - "coap": "^0.21.0" + "mocha": "*", + "mosca": "1.1.0", + "mqtt": "^1.14.1", + "multer": "0.1.6", + "node-uuid": "*", + "numeric": "*", + "plotly": "0.2.13", + "request": "*", + "shelljs": "0.7.1", + "tcp-port-used": "*", + "tingyun": "*", + "tty.js": "*" }, "author": "Zhizhou Li", "license": "GPL", "readmeFilename": "README.md", - "devDependencies": {}, + "devDependencies": { + "pre-commit": "0.0.9", + "jslint": "0.6.4" + }, "keywords": [ "Restapi", "node" diff --git a/page/.gitignore b/page/.gitignore new file mode 100644 index 0000000..13dfadc --- /dev/null +++ b/page/.gitignore @@ -0,0 +1,4 @@ +blocklyide +bower_components +dl + diff --git a/page/index.html b/page/index.html index 1c30cf9..160356b 100644 --- a/page/index.html +++ b/page/index.html @@ -45,7 +45,12 @@ document.getElementById("url").innerHTML = json.url } - +

Hello openfpgaduino

cide @@ -59,6 +64,7 @@

Upload

Socketio

tunnel

+

deeplearning

- \ No newline at end of file + diff --git a/server.js b/server.js index f40cb08..0b31ea2 100644 --- a/server.js +++ b/server.js @@ -29,6 +29,7 @@ var fs = promise.promisifyAll(require('fs'),{filter: function(name) { fs.readAsync = promise.promisify(fs.read, {multiArgs:true}); fs.writeAsnyc = promise.promisify(fs.write, {multiArgs:true}); var express = require('express'); +var helmet = require('helmet') var session = require('express-session'); var proxy = require('express-http-proxy'); var bodyParser = require('body-parser'); @@ -36,8 +37,10 @@ var loadDir = require('./loaddir'); var module = loadDir(config.app_path); var multer = require('multer'); var sockectio = require('socket.io'); -var diffsync = require('diffsync'); +//var PouchDB = require('pouchdb'); +//var pouchdb = new PouchDB('dbname'); var tingodb = require('tingodb')(); +//var Gun = require('gun'); var optimist = require('optimist'); var figlet = require('figlet'); var node_uuid = require('node-uuid'); @@ -45,8 +48,14 @@ var cron = require('cron').CronJob; var List = require("collections/list"); var Set = require("collections/set"); var Map = require("collections/map"); +var numeric = require('numeric'); +var equal = require('deep-equal'); var KafkaRest = require('kafka-rest'); var kafka = new KafkaRest({ 'url': config.kafka }); +var https = require('https'); +var privateKey = fs.readFileSync('keys/server-key.pem', 'utf8'); +var certificate = fs.readFileSync('keys/server-cert.pem', 'utf8'); +var credentials = {key: privateKey, cert: certificate}; require('tingyun'); @@ -77,6 +86,8 @@ logger.info("Runing at Node Version:" + process.version); logger.info("Write by:" + pjson.author); logger.info("UUID", uuid); +//app.use(helmet()) +//app.disable('x-powered-by') app.set("etag", false); app.use(bodyParser.urlencoded({ extended: true @@ -90,23 +101,24 @@ app.use(express.static(__dirname + '/page')); app.use(multer({ dest: './uploads/' })); +//app.use(Gun.serve).use(express.static(__dirname)); function parser_parameter(fun_str) { return fun_str.toString() .replace(/((\/\/.*$)|(\/\*[\s\S]*?\*\/)|(\s))/mg, '') // remove spaces and comments .match(/^function\s*[^\(]*\(\s*([^\)]*)\)/m)[1] // get parameter } - +var httpsServer = https.createServer(credentials, app); var port = argv.port || process.env.PORT || config.port; // set our port +var sshport = argv.sshport || process.env.SSHPORT || config.sshport; // set our port var server = http.createServer(app); var io = sockectio.listen(server); -var dataAdapter = new diffsync.InMemoryDataAdapter(); -var diffSyncServer = new diffsync.Server(dataAdapter, io); var data = require('data.io')(io); var messages = data.resource('messages'); var request = require('request').defaults({ baseUrl: "http://localhost:" + port + "/" }); +//Gun({file: 'gundata.json', web: server}); function loadmodule(module) { for (m in module) { // load all modules in apps @@ -150,5 +162,21 @@ function dynamicloadmodule(filename) { event.addListener('load', dynamicloadmodule); +// pouchdb.put({ +// _id: 'dave@gmail.com', +// name: 'David', +// age: 69 +// }); + +// pouchdb.changes().on('change', function() { +// logger.info('Ch-Ch-Changes'); +// }); + + +// pouchdb.replicate.to('http://example.com/mydb'); +// console.log(numeric.add([1,2],[3,4],[5,6],[7,8])) + server.listen(port); +httpsServer.listen(sshport); logger.info("Restful API server run on port", port) +logger.info("Restful SSH API server run on port", sshport) diff --git a/ut/mocha.js b/ut/mocha.js index cc31a1f..f96cbd5 100644 --- a/ut/mocha.js +++ b/ut/mocha.js @@ -41,7 +41,7 @@ beforeEach(function() { }); -describe('Angularjs', function() { +describe('Arduinojs', function() { describe('main', function() { it('get the front page', function(done) { @@ -159,7 +159,7 @@ describe('Angularjs', function() { }); }); -describe('Angularjs', function() { +describe('Arduinojs', function() { describe('fpga', function() { it('list fpga api fucton', function() { request("/fpga/api/list", function(error, response, body) { @@ -193,7 +193,7 @@ describe('Angularjs', function() { }); }); -describe('Angularjs', function() { +describe('Arduinojs', function() { describe('linux', function() { it('get shell cmd list', function() { request("/linux/shell/list", function(error, response, body) { @@ -207,7 +207,7 @@ describe('Angularjs', function() { }); }); -describe('Angularjs', function() { +describe('Arduinojs', function() { describe('cron', function() { it('always true', function() { assert(1); @@ -216,7 +216,7 @@ describe('Angularjs', function() { }); -describe('Angularjs', function() { +describe('Arduinojs', function() { describe('tty', function() { it('always true', function() { assert(1); @@ -224,7 +224,7 @@ describe('Angularjs', function() { }); }); -describe('Angularjs', function() { +describe('Arduinojs', function() { describe('upload', function() { it('always true', function() { assert(1); @@ -232,7 +232,7 @@ describe('Angularjs', function() { }); }); -describe('Angularjs', function() { +describe('Arduinojs', function() { describe('mqtt', function() { it('client connect', function(done) { request({ @@ -331,7 +331,7 @@ describe('Angularjs', function() { }); }); -describe('Angularjs', function() { +describe('Arduinojs', function() { describe('ide', function() { it('start c ide', function() { request("/ide/c/start", function(error, response, body) { @@ -431,7 +431,7 @@ describe('Angularjs', function() { }); -describe('Angularjs', function() { +describe('Arduinojs', function() { describe('db', function() { it('list doc', function(done) { request("/db/list", function(error, response, body) { diff --git a/ut/mock/fpga.js b/ut/mock/fpga.js index 3adb9c7..4e80c42 100644 --- a/ut/mock/fpga.js +++ b/ut/mock/fpga.js @@ -1,4 +1,4 @@ -module.exports = function(app, logger, express, io, db, argv, fs) { +module.exports = function(app, logger, express, io, argv, fs) { var router = express.Router(); var fpga = new Object; fpga.led = function(id, r, b, g) { @@ -13,6 +13,16 @@ module.exports = function(app, logger, express, io, db, argv, fs) { fpga.fpga_open = function() { logger.info("open fpga") }; + fpga.fpga_close = function() { + logger.info("open fpga") + }; + fpga.am2301_temperature = function() { + return 21.7 + }; + fpga.am2301_moisture = function() { + return 81.7 + }; + logger.info("Initial sim fpga module"); router.get('/', function(req, res) { @@ -126,13 +136,44 @@ module.exports = function(app, logger, express, io, db, argv, fs) { router.post('/api/call/:method', function(req, res) { var method = req.params.method; var paramter = req.body; + var ret; + fpga.fpga_open(); + switch (paramter.length) { + case 0: + ret = fpga[method](); + break; + case 1: + ret = fpga[method](paramter[0]); + break; + case 2: + ret = fpga[method](paramter[0], paramter[1]); + break; + case 3: + ret = fpga[method](paramter[0], paramter[1], paramter[2]); + break; + case 4: + ret = fpga[method](paramter[0], paramter[1], paramter[2], paramter[3]); + break; + case 5: + ret = fpga[method](paramter[0], paramter[1], paramter[2], paramter[3], paramter[4]); + break; + case 6: + ret = fpga[method](paramter[0], paramter[1], paramter[2], paramter[3], paramter[4], paramter[5]); + break; + case 7: + ret = fpga[method](paramter[0], paramter[1], paramter[2], paramter[3], paramter[4], paramter[5], paramter[6]); + break; + case 8: + ret = fpga[method](paramter[0], paramter[1], paramter[2], paramter[3], paramter[4], paramter[5], paramter[6], paramter[7]); + break; + default: + logger.error("too manay arguments"); + } logger.info("method is " + method); - res.json({ - message: 'Call method ' + method - }); + res.json(ret); + fpga.fpga_close(); }); - io.sockets.on('connection', function(socket) { socket.emit('news', { hello: 'world' @@ -144,4 +185,4 @@ module.exports = function(app, logger, express, io, db, argv, fs) { app.use('/fpga', router); -} \ No newline at end of file +}