nutella_framework 0.4.5 → 0.4.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +14 -15
- data/VERSION +1 -1
- data/framework_components/beacon-cloud-bot/README.md +27 -0
- data/framework_components/beacon-cloud-bot/beacon_cloud_bot.rb +154 -0
- data/framework_components/beacon-cloud-bot/nutella.json +6 -0
- data/framework_components/beacon-cloud-bot/startup +4 -0
- data/framework_components/beacon-cloud-interface/LICENSE +21 -0
- data/framework_components/beacon-cloud-interface/Readme.md +0 -0
- data/framework_components/beacon-cloud-interface/bower.json +29 -0
- data/framework_components/beacon-cloud-interface/bower_components/bower-mqttws/.bower.json +23 -0
- data/framework_components/beacon-cloud-interface/bower_components/bower-mqttws/bower.json +14 -0
- data/framework_components/beacon-cloud-interface/bower_components/bower-mqttws/mqttws31.js +2081 -0
- data/framework_components/beacon-cloud-interface/bower_components/bower-mqttws/readme.md +4 -0
- data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/.bower.json +37 -0
- data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/LICENSE +21 -0
- data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/README.md +15 -0
- data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/bower.json +28 -0
- data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/examples/browser/mqtt_client_hello_world.html +23 -0
- data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/examples/browser/nutella_hello_world.html +52 -0
- data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/examples/node/mqtt_client_hello_world.js +14 -0
- data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/examples/node/nutella_hello_world.js +38 -0
- data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/nutella_lib.js +789 -0
- data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/package.json +30 -0
- data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/simple-js-mqtt-client.js +428 -0
- data/framework_components/beacon-cloud-interface/css/animation.css +17 -0
- data/framework_components/beacon-cloud-interface/css/cursor.css +16 -0
- data/framework_components/beacon-cloud-interface/css/page_layout.css +73 -0
- data/framework_components/beacon-cloud-interface/index.html +157 -0
- data/framework_components/beacon-cloud-interface/js/lib/nutella_lib.js +4039 -0
- data/framework_components/beacon-cloud-interface/js/react/beacon-add.js +102 -0
- data/framework_components/beacon-cloud-interface/js/react/beacon-table.js +73 -0
- data/framework_components/beacon-cloud-interface/js/react/beacon.js +97 -0
- data/framework_components/beacon-cloud-interface/nutella.json +6 -0
- data/framework_components/example_framework_web_interface/index.html +11 -2
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/.npmignore +10 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/.travis.yml +5 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/LICENSE +21 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/README.md +27 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/dist/nutella_lib.js +4039 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/dist/nutella_lib.js.map +1 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/examples/browser_hello_world.html +67 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/examples/node_hello_world.js +51 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/gulpfile.js +31 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/package.json +41 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/app_core.js +19 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/app_core_browser.js +17 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/app_log.js +50 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/app_net.js +279 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/app_persist.js +20 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/fr_core_browser.js +17 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/fr_log.js +50 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/fr_net.js +499 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/nutella_i.js +74 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/nutella_i_browser.js +130 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/nutella_lib.js +91 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/nutella_lib_browser.js +90 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/run_log.js +51 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/run_net.js +84 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/run_persist.js +20 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/util/net.js +327 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/test/nutella.test.js +16 -0
- data/framework_components/example_framework_web_interface/node_modules/nutella_lib/test/runner.html +22 -0
- data/framework_components/example_framework_web_interface/package.json +15 -0
- data/framework_components/{order.json.example → order.json} +0 -0
- data/framework_components/runs_list_bot/{app_runs_list_bot.rb → runs_list_bot.rb} +9 -3
- data/framework_components/runs_list_bot/startup +1 -1
- data/lib/commands/meta/run_command.rb +21 -36
- data/lib/commands/start.rb +9 -199
- data/lib/commands/util/components_list.rb +68 -0
- data/lib/commands/util/components_starter.rb +169 -0
- data/nutella_framework.gemspec +109 -47
- data/nutella_lib/framework_net.rb +17 -13
- metadata +84 -106
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":[],"mappings":"","sources":["nutella_lib.js"],"sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n/******************\n * nutella_lib.js *\n ******************/\nvar unique = require('uniq');\n\nvar pippo = [1, 2, 2, 3, 4, 5, 5, 5, 6];\n\nconsole.log(unique(pippo));\n},{\"uniq\":2}],2:[function(require,module,exports){\n\"use strict\"\n\nfunction unique_pred(list, compare) {\n var ptr = 1\n , len = list.length\n , a=list[0], b=list[0]\n for(var i=1; i<len; ++i) {\n b = a\n a = list[i]\n if(compare(a, b)) {\n if(i === ptr) {\n ptr++\n continue\n }\n list[ptr++] = a\n }\n }\n list.length = ptr\n return list\n}\n\nfunction unique_eq(list) {\n var ptr = 1\n , len = list.length\n , a=list[0], b = list[0]\n for(var i=1; i<len; ++i, b=a) {\n b = a\n a = list[i]\n if(a !== b) {\n if(i === ptr) {\n ptr++\n continue\n }\n list[ptr++] = a\n }\n }\n list.length = ptr\n return list\n}\n\nfunction unique(list, compare, sorted) {\n if(list.length === 0) {\n return list\n }\n if(compare) {\n if(!sorted) {\n list.sort(compare)\n }\n return unique_pred(list, compare)\n }\n if(!sorted) {\n list.sort()\n }\n return unique_eq(list)\n}\n\nmodule.exports = unique\n\n},{}]},{},[1]);\n"],"file":"nutella_lib.js","sourceRoot":"/source/"}
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head lang="en">
|
4
|
+
<meta charset="UTF-8">
|
5
|
+
<title>Nutella hello world</title>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
|
9
|
+
<script src="../dist/nutella_lib.js"></script>
|
10
|
+
|
11
|
+
<script>
|
12
|
+
// Initialize nutella
|
13
|
+
var nutella = NUTELLA.init('ltg.evl.uic.edu', 'my_app_id', 'my_run_id', 'demo_run_interface');
|
14
|
+
nutella.setResourceId('r_id');
|
15
|
+
|
16
|
+
// Initialize nutella app interface
|
17
|
+
// var nutella = NUTELLA.initApp('ltg.evl.uic.edu', 'test', 'demo_app_interface');
|
18
|
+
// nutella.setResourceId('r_id');
|
19
|
+
// nutella.app.net.publish_to_all_runs('channel', 'ale_message');
|
20
|
+
|
21
|
+
// Initialize nutella fr interface
|
22
|
+
// var nutella = NUTELLA.initFramework('ltg.evl.uic.edu', 'demo_fr_interface');
|
23
|
+
// nutella.setResourceId('r_id');
|
24
|
+
// nutella.f.net.publish_to_all_runs('channel', 'message');
|
25
|
+
|
26
|
+
// Simple channel pub/sub
|
27
|
+
// nutella.net.subscribe('channel', function(message, from) {
|
28
|
+
// console.log('Received: "' + message + '" from: ' + JSON.stringify(from));
|
29
|
+
// }, function() {
|
30
|
+
// nutella.net.publish('channel', 'message');
|
31
|
+
// });
|
32
|
+
|
33
|
+
// Simple channel req/res
|
34
|
+
// nutella.net.handle_requests('channel', function(req, from){
|
35
|
+
// console.log('Received: "' + req + '" from: ' + JSON.stringify(from));
|
36
|
+
// return {some: 'json'};
|
37
|
+
// }, function() {
|
38
|
+
// nutella.net.request('channel', 'hey you', function(res){
|
39
|
+
// console.log('Response is : "' + JSON.stringify(res));
|
40
|
+
// });
|
41
|
+
// });
|
42
|
+
|
43
|
+
// Wildcard pub/sub
|
44
|
+
// nutella.net.subscribe('#', function(message, channel, from) {
|
45
|
+
// console.log('Received: "' + JSON.stringify(message) + '" on channel: "'+ channel +'" from: ' + JSON.stringify(from));
|
46
|
+
// }, function() {
|
47
|
+
// nutella.net.publish('channel_1', 'message');
|
48
|
+
// nutella.net.publish('channel_2', 'message');
|
49
|
+
// });
|
50
|
+
|
51
|
+
|
52
|
+
// Wildcard req/res
|
53
|
+
// nutella.net.handle_requests('#', function(req, from){
|
54
|
+
// console.log('Received: "' + req + '" from: ' + JSON.stringify(from));
|
55
|
+
// return {some: 'json'};
|
56
|
+
// }, function() {
|
57
|
+
// nutella.net.request('channel_1', 'hey you', function(res){
|
58
|
+
// console.log('Response is : "' + JSON.stringify(res));
|
59
|
+
// });
|
60
|
+
// nutella.net.request('channel_2', 'hey you', function(res){
|
61
|
+
// console.log('Response is : "' + JSON.stringify(res));
|
62
|
+
// });
|
63
|
+
// });
|
64
|
+
|
65
|
+
</script>
|
66
|
+
</body>
|
67
|
+
</html>
|
@@ -0,0 +1,51 @@
|
|
1
|
+
var NUTELLA = require('../src/nutella_lib')
|
2
|
+
|
3
|
+
// Initialize nutella
|
4
|
+
//var p = NUTELLA.parseURLParameters(); // This only works in the browser
|
5
|
+
var p = NUTELLA.parseAppComponentArgs();
|
6
|
+
console.log(p)
|
7
|
+
var nutella = NUTELLA.init('ltg.evl.uic.edu', 'my_app_id', 'my_run_id', 'demo_node_bot');
|
8
|
+
nutella.setResourceId('r_id');
|
9
|
+
nutella.log.test();
|
10
|
+
nutella.net.publish('channel', 'message');
|
11
|
+
nutella.persist.test(); // this should only work in node
|
12
|
+
nutella = NUTELLA.initApp('ltg.evl.uic.edu', 'my_app_id', 'demo_node_bot');
|
13
|
+
nutella.app.net.test();
|
14
|
+
nutella.app.log.test();
|
15
|
+
nutella.app.persist.test();
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
// // Subscribe to a channel
|
20
|
+
// nutella.net.subscribe("demo1", function(message, c_id, r_id) {
|
21
|
+
// console.log('Received "' + JSON.stringify(message) + '" from ' + c_id + '/' + r_id);
|
22
|
+
// nutella.net.unsubscribe('demo1');
|
23
|
+
// });
|
24
|
+
|
25
|
+
// // Wildcard subscribe
|
26
|
+
// nutella.net.subscribe("demo2/#", function(message, channel, c_id, r_id) {
|
27
|
+
// console.log('Received "' + JSON.stringify(message) + '" on channel ' + channel + ' from ' + c_id + '/' + r_id);
|
28
|
+
// });
|
29
|
+
|
30
|
+
// // Publish some stuff
|
31
|
+
// nutella.net.publish('demo1');
|
32
|
+
// nutella.net.publish('demo1', 'just a string');
|
33
|
+
// nutella.net.publish('demo1', {a: 'proper', key: 'value'});
|
34
|
+
// nutella.setResourceId('a_particular_resource');
|
35
|
+
// nutella.net.publish('demo1');
|
36
|
+
// nutella.net.publish('demo1', 'just a string');
|
37
|
+
// nutella.net.publish('demo1', {a: 'proper', key: 'value'});
|
38
|
+
|
39
|
+
// Handle requests
|
40
|
+
//nutella.net.handle_requests('demo1', function(message, component_id, resource_id) {
|
41
|
+
// return 'this is the returned value';
|
42
|
+
//});
|
43
|
+
//
|
44
|
+
//// Perform a couple requests
|
45
|
+
//nutella.net.request('demo1', function(response) {
|
46
|
+
// console.log("This is the response to empty request (GET)");
|
47
|
+
//});
|
48
|
+
//
|
49
|
+
//nutella.net.request('demo1', 'my_request', function(response) {
|
50
|
+
// console.log("This is the response to non-empty request");
|
51
|
+
//});
|
data/framework_components/example_framework_web_interface/node_modules/nutella_lib/gulpfile.js
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
var gulp = require('gulp');
|
2
|
+
var gutil = require('gulp-util');
|
3
|
+
var browserify = require('browserify');
|
4
|
+
var watchify = require('watchify');
|
5
|
+
var source = require('vinyl-source-stream');
|
6
|
+
|
7
|
+
// bundler used to run watchify and browserify
|
8
|
+
var bundler = watchify(browserify(watchify.args, {standalone: 'NUTELLA'}));
|
9
|
+
// add the lib file to bundle
|
10
|
+
bundler.add('./src/nutella_lib.js');
|
11
|
+
|
12
|
+
|
13
|
+
gulp.task('bundle', bundle); // so you can run `gulp js` to build the file
|
14
|
+
bundler.on('update', bundle); // on any dep update, runs the bundler
|
15
|
+
bundler.on('log', gutil.log); // output build logs to terminal
|
16
|
+
|
17
|
+
function bundle() {
|
18
|
+
return bundler.bundle()
|
19
|
+
// log errors if they happen
|
20
|
+
.on('error', gutil.log.bind(gutil, 'Browserify Error'))
|
21
|
+
.pipe(source('nutella_lib.js'))
|
22
|
+
.pipe(gulp.dest('./dist'));
|
23
|
+
}
|
24
|
+
|
25
|
+
|
26
|
+
gulp.task('default', function() {
|
27
|
+
// place code for your default task here
|
28
|
+
});
|
29
|
+
|
30
|
+
|
31
|
+
|
data/framework_components/example_framework_web_interface/node_modules/nutella_lib/package.json
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
{
|
2
|
+
"name": "nutella_lib",
|
3
|
+
"version": "0.4.3",
|
4
|
+
"description": "Nutella library for JavaScript",
|
5
|
+
"main": "src/nutella_lib.js",
|
6
|
+
"browser": "src/nutella_lib_browser.js",
|
7
|
+
"scripts": {
|
8
|
+
"test": "mocha"
|
9
|
+
},
|
10
|
+
"repository": {
|
11
|
+
"type": "git",
|
12
|
+
"url": "https://github.com/nutella-framework/nutella_lib.js"
|
13
|
+
},
|
14
|
+
"devDependencies": {
|
15
|
+
"browserify": "^9.0.3",
|
16
|
+
"chai": "^2.1.2",
|
17
|
+
"gulp": "^3.8.11",
|
18
|
+
"gulp-util": "^3.0.4",
|
19
|
+
"mocha": "^2.2.1",
|
20
|
+
"vinyl-source-stream": "^1.1.0",
|
21
|
+
"watchify": "^2.6.2"
|
22
|
+
},
|
23
|
+
"keywords": [
|
24
|
+
"nutella",
|
25
|
+
"framework"
|
26
|
+
],
|
27
|
+
"author": {
|
28
|
+
"name": "Alessandro Gnoli"
|
29
|
+
},
|
30
|
+
"license": "MIT",
|
31
|
+
"bugs": {
|
32
|
+
"url": "https://github.com/nutella-framework/nutella_lib.js/issues"
|
33
|
+
},
|
34
|
+
"homepage": "https://github.com/nutella-framework/nutella_lib.js",
|
35
|
+
"readme": "[![Build Status](https://travis-ci.org/nutella-framework/nutella_lib.js.svg?branch=master)](https://travis-ci.org/nutella-framework/nutella_lib.js)\n\n# nutella library for node.js and the browser\n\n## Installation\nFor node.js projects do\n```\nnpm install nutella_lib\n```\n\nFor browser projects either:\n\n1. `npm install nutella_lib` and then use [browserify](http://browserify.org/) OR\n2. use the bundled `nutella_lib.js` in `dist`\n\n\n## Building the project\nFor developers working on the library. We are using gulp + browserify + watchify to continuously and incrementally build the library as we develop. \n\n**To contribute**: Clone the repo and `gulp bundle` inside the project directory. Every time you make a change to any of the files required by the library gulp will rebuild it. \n\n\n## Releasing a new version\nFor developers working on the library, to release a new version:\n\n- Update the version in the `package.json`\n- Publish to npm by doing `npm publish`",
|
36
|
+
"readmeFilename": "README.md",
|
37
|
+
"gitHead": "92101787b67f169eb26aa2139110c6a0ab307abf",
|
38
|
+
"_id": "nutella_lib@0.4.3",
|
39
|
+
"_shasum": "21dbfd227fab6a500dc6ccb1bdc2a764908910e2",
|
40
|
+
"_from": "nutella_lib@*"
|
41
|
+
}
|
data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/app_core.js
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
/**
|
2
|
+
* Application-level APIs for nutella, node version
|
3
|
+
*/
|
4
|
+
|
5
|
+
// Require various sub-modules
|
6
|
+
var AppNetSubModule = require('./app_net');
|
7
|
+
var AppLogSubModule = require('./app_log');
|
8
|
+
var AppPersistSubModule = require('./app_persist');
|
9
|
+
|
10
|
+
|
11
|
+
var AppSubModule = function(main_nutella) {
|
12
|
+
// Initialized the various sub-modules
|
13
|
+
this.net = new AppNetSubModule(main_nutella);
|
14
|
+
this.log = new AppLogSubModule(main_nutella);
|
15
|
+
this.persist = new AppPersistSubModule(main_nutella);
|
16
|
+
};
|
17
|
+
|
18
|
+
|
19
|
+
module.exports = AppSubModule;
|
@@ -0,0 +1,17 @@
|
|
1
|
+
/**
|
2
|
+
* Application-level APIs for nutella, browser version
|
3
|
+
*/
|
4
|
+
|
5
|
+
// Require various sub-modules
|
6
|
+
var AppNetSubModule = require('./app_net');
|
7
|
+
var AppLogSubModule = require('./app_log');
|
8
|
+
|
9
|
+
|
10
|
+
var AppSubModule = function(main_nutella) {
|
11
|
+
// Initialized the various sub-modules
|
12
|
+
this.net = new AppNetSubModule(main_nutella);
|
13
|
+
this.log = new AppLogSubModule(main_nutella);
|
14
|
+
};
|
15
|
+
|
16
|
+
|
17
|
+
module.exports = AppSubModule;
|
data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/app_log.js
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
/**
|
2
|
+
* App-level log APIs for nutella
|
3
|
+
*/
|
4
|
+
|
5
|
+
var AppNetSubModule = require('./app_net');
|
6
|
+
|
7
|
+
var AppLogSubModule = function(main_nutella) {
|
8
|
+
this.net = new AppNetSubModule(main_nutella);
|
9
|
+
};
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
AppLogSubModule.prototype.debug = function(message, code) {
|
14
|
+
console.debug(message);
|
15
|
+
this.net.publish('logging', logToJson(message, code, 'debug'));
|
16
|
+
return code;
|
17
|
+
};
|
18
|
+
|
19
|
+
AppLogSubModule.prototype.info = function(message, code) {
|
20
|
+
console.info(message);
|
21
|
+
this.net.publish('logging', logToJson(message, code, 'info'));
|
22
|
+
return code;
|
23
|
+
};
|
24
|
+
|
25
|
+
AppLogSubModule.prototype.success = function(message, code) {
|
26
|
+
console.log('%c '+ message , 'color: #009933');
|
27
|
+
this.net.publish('logging', logToJson(message, code, 'success'));
|
28
|
+
return code;
|
29
|
+
};
|
30
|
+
|
31
|
+
AppLogSubModule.prototype.warn = function(message, code) {
|
32
|
+
console.warn(message);
|
33
|
+
this.net.publish('logging', logToJson(message, code, 'warn'));
|
34
|
+
return code;
|
35
|
+
};
|
36
|
+
|
37
|
+
AppLogSubModule.prototype.error = function(message, code) {
|
38
|
+
console.error(message);
|
39
|
+
this.net.publish('logging', logToJson(message, code, 'error'));
|
40
|
+
return code;
|
41
|
+
};
|
42
|
+
|
43
|
+
|
44
|
+
function logToJson( message, code, level) {
|
45
|
+
return (code === undefined) ? {level: level, message: message} : {level: level, message: message, code: code};
|
46
|
+
}
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
module.exports = AppLogSubModule;
|
data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/app_net.js
ADDED
@@ -0,0 +1,279 @@
|
|
1
|
+
/**
|
2
|
+
* App-level Networking APIs for nutella
|
3
|
+
*/
|
4
|
+
|
5
|
+
|
6
|
+
var AbstractNet = require('./util/net');
|
7
|
+
|
8
|
+
|
9
|
+
/**
|
10
|
+
* App-level network APIs for nutella
|
11
|
+
* @param main_nutella
|
12
|
+
* @constructor
|
13
|
+
*/
|
14
|
+
var AppNetSubModule = function(main_nutella) {
|
15
|
+
this.net = new AbstractNet(main_nutella);
|
16
|
+
};
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
/**
|
21
|
+
* Subscribes to a channel or filter.
|
22
|
+
*
|
23
|
+
* @param channel
|
24
|
+
* @param callback
|
25
|
+
* @param done_callback
|
26
|
+
*/
|
27
|
+
AppNetSubModule.prototype.subscribe = function(channel, callback, done_callback) {
|
28
|
+
this.net.subscribe_to(channel, callback, this.net.nutella.appId, undefined, done_callback);
|
29
|
+
};
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
/**
|
34
|
+
* Unsubscribes from a channel
|
35
|
+
*
|
36
|
+
* @param channel
|
37
|
+
* @param done_callback
|
38
|
+
*/
|
39
|
+
AppNetSubModule.prototype.unsubscribe = function(channel, done_callback) {
|
40
|
+
this.net.unsubscribe_from(channel, this.net.nutella.appId, undefined, done_callback);
|
41
|
+
};
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
/**
|
46
|
+
* Publishes a message to a channel
|
47
|
+
*
|
48
|
+
* @param channel
|
49
|
+
* @param message
|
50
|
+
*/
|
51
|
+
AppNetSubModule.prototype.publish = function(channel, message) {
|
52
|
+
this.net.publish_to(channel, message, this.net.nutella.appId, undefined);
|
53
|
+
};
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
/**
|
58
|
+
* Sends a request.
|
59
|
+
*
|
60
|
+
* @param channel
|
61
|
+
* @param message
|
62
|
+
* @param callback
|
63
|
+
*/
|
64
|
+
AppNetSubModule.prototype.request = function(channel, message, callback) {
|
65
|
+
this.net.request_to(channel, message, callback, this.net.nutella.appId, undefined);
|
66
|
+
};
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Handles requests.
|
72
|
+
*
|
73
|
+
* @param channel
|
74
|
+
* @param callback
|
75
|
+
* @param done_callback
|
76
|
+
*/
|
77
|
+
AppNetSubModule.prototype.handle_requests = function (channel, callback, done_callback) {
|
78
|
+
this.net.handle_requests_on(channel, callback, this.net.nutella.appId, undefined, done_callback);
|
79
|
+
};
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
//----------------------------------------------------------------------------------------------------------------
|
84
|
+
// Application-level APIs to communicate at the run-level
|
85
|
+
//----------------------------------------------------------------------------------------------------------------
|
86
|
+
|
87
|
+
/**
|
88
|
+
* Allows application-level APIs to subscribe to a run-level channel within a specific run
|
89
|
+
*
|
90
|
+
* @param run_id
|
91
|
+
* @param channel
|
92
|
+
* @param callback
|
93
|
+
* @param done_callback
|
94
|
+
*/
|
95
|
+
AppNetSubModule.prototype.subscribe_to_run = function(run_id, channel, callback, done_callback) {
|
96
|
+
this.net.subscribe_to(channel,callback,this.net.nutella.appId,run_id,done_callback);
|
97
|
+
};
|
98
|
+
|
99
|
+
|
100
|
+
/**
|
101
|
+
* Allows application-level APIs to unsubscribe from a run-level channel within a specific run
|
102
|
+
*
|
103
|
+
* @param run_id
|
104
|
+
* @param channel
|
105
|
+
* @param done_callback
|
106
|
+
*/
|
107
|
+
AppNetSubModule.prototype.unsubscribe_from_run = function(run_id, channel, done_callback) {
|
108
|
+
this.net.unsubscribe_from(channel,this.net.nutella.appId,run_id,done_callback);
|
109
|
+
};
|
110
|
+
|
111
|
+
|
112
|
+
/**
|
113
|
+
* Allows application-level APIs to publish to a run-level channel within a specific run
|
114
|
+
*
|
115
|
+
* @param run_id
|
116
|
+
* @param channel
|
117
|
+
* @param message
|
118
|
+
*/
|
119
|
+
AppNetSubModule.prototype.publish_to_run = function( run_id, channel, message ) {
|
120
|
+
this.net.publish_to(channel,message,this.net.nutella.appId, run_id);
|
121
|
+
};
|
122
|
+
|
123
|
+
|
124
|
+
/**
|
125
|
+
* Allows application-level APIs to make a request to a run-level channel within a specific run
|
126
|
+
*
|
127
|
+
* @param run_id
|
128
|
+
* @param channel
|
129
|
+
* @param request
|
130
|
+
* @param callback
|
131
|
+
*/
|
132
|
+
AppNetSubModule.prototype.request_to_run = function( run_id, channel, request, callback) {
|
133
|
+
this.net.request_to(channel,request,callback,this.net.nutella.appId,run_id);
|
134
|
+
};
|
135
|
+
|
136
|
+
|
137
|
+
/**
|
138
|
+
* Allows application-level APIs to handle requests on a run-level channel within a specific run
|
139
|
+
*
|
140
|
+
* @param run_id
|
141
|
+
* @param channel
|
142
|
+
* @param callback
|
143
|
+
* @param done_callback
|
144
|
+
*/
|
145
|
+
AppNetSubModule.prototype.handle_requests_on_run = function( run_id, channel, callback, done_callback ) {
|
146
|
+
this.net.handle_requests_on(channel,callback,this.net.nutella.appId,run_id,done_callback);
|
147
|
+
};
|
148
|
+
|
149
|
+
|
150
|
+
//----------------------------------------------------------------------------------------------------------------
|
151
|
+
// Application-level APIs to communicate at the run-level (broadcast)
|
152
|
+
//----------------------------------------------------------------------------------------------------------------
|
153
|
+
|
154
|
+
/**
|
155
|
+
* Fired whenever a message is received on the specified channel for any of the runs in the application
|
156
|
+
*
|
157
|
+
* @callback all_runs_cb
|
158
|
+
* @param {string} message - the received message. Messages that are not JSON are discarded.
|
159
|
+
* @param {string} run_id - the run_id of the channel the message was sent on
|
160
|
+
* @param {Object} from - the sender's identifiers (run_id, app_id, component_id and optionally resource_id)
|
161
|
+
*/
|
162
|
+
|
163
|
+
/**
|
164
|
+
* Allows application-level APIs to subscribe to a run-level channel *for ALL runs*
|
165
|
+
*
|
166
|
+
* @param {string} channel - the run-level channel we are subscribing to. Can be wildcard
|
167
|
+
* @param {all_runs_cb} callback - the callback that is fired whenever a message is received on the channel
|
168
|
+
*/
|
169
|
+
AppNetSubModule.prototype.subscribe_to_all_runs = function(channel, callback, done_callback) {
|
170
|
+
var app_id = this.net.nutella.appId;
|
171
|
+
//Pad channel
|
172
|
+
var padded_channel = this.net.pad_channel(channel, app_id, '+');
|
173
|
+
var mqtt_cb = function(mqtt_message, mqtt_channel) {
|
174
|
+
try {
|
175
|
+
var f = JSON.parse(mqtt_message);
|
176
|
+
var run_id = extractRunId(app_id, mqtt_channel);
|
177
|
+
if(f.type==='publish')
|
178
|
+
callback(f.payload, run_id, f.from);
|
179
|
+
} catch(e) {
|
180
|
+
if (e instanceof SyntaxError) {
|
181
|
+
// Message is not JSON, drop it
|
182
|
+
} else {
|
183
|
+
// Bubble up whatever exception is thrown
|
184
|
+
throw e;
|
185
|
+
}
|
186
|
+
}
|
187
|
+
};
|
188
|
+
// Add to subscriptions, save mqtt callback and subscribe
|
189
|
+
this.net.subscriptions.push(padded_channel);
|
190
|
+
this.net.callbacks.push(mqtt_cb);
|
191
|
+
this.net.nutella.mqtt_client.subscribe(padded_channel, mqtt_cb, done_callback);
|
192
|
+
// Notify subscription
|
193
|
+
this.net.publish_to('subscriptions', {type: 'subscribe', channel: padded_channel}, this.net.nutella.appId, undefined);
|
194
|
+
};
|
195
|
+
|
196
|
+
|
197
|
+
/**
|
198
|
+
* Allows application-level APIs to publish a message to a run-level channel *for ALL runs*
|
199
|
+
*
|
200
|
+
* @param channel
|
201
|
+
* @param message
|
202
|
+
*/
|
203
|
+
AppNetSubModule.prototype.publish_to_all_runs = function(channel, message) {
|
204
|
+
this.net.nutella.runs_list.forEach(function(run_id){
|
205
|
+
this.net.publish_to(channel,message,this.net.nutella.appId,run_id);
|
206
|
+
}.bind(this));
|
207
|
+
};
|
208
|
+
|
209
|
+
|
210
|
+
/**
|
211
|
+
* Allows application-level APIs to send a request to a run-level channel *for ALL runs*
|
212
|
+
*
|
213
|
+
* @param channel
|
214
|
+
* @param request
|
215
|
+
* @param callback
|
216
|
+
*/
|
217
|
+
AppNetSubModule.prototype.request_to_all_runs = function(channel, request, callback) {
|
218
|
+
this.net.nutella.runs_list.forEach(function(run_id){
|
219
|
+
this.net.request_to(channel,request,callback,this.net.nutella.appId,run_id);
|
220
|
+
}.bind(this));
|
221
|
+
};
|
222
|
+
|
223
|
+
|
224
|
+
/**
|
225
|
+
* This callback is used to handle all runs
|
226
|
+
* @callback handle_all_run
|
227
|
+
* @param {string} message - the received message. Messages that are not JSON are discarded.
|
228
|
+
* @param {string} run_id - the run_id of the channel the message was sent on
|
229
|
+
* @param {Object} from - the sender's identifiers (run_id, app_id, component_id and optionally resource_id)
|
230
|
+
* @return {Object} the response sent back to the client that performed the request. Whatever is returned by the callback is marshaled into a JSON string and sent via MQTT.
|
231
|
+
*/
|
232
|
+
|
233
|
+
/**
|
234
|
+
* Allows application-level APIs to handle requests to a run-level channel *for ALL runs*
|
235
|
+
*
|
236
|
+
* @param channel
|
237
|
+
* @param callback
|
238
|
+
* @param done_callback
|
239
|
+
*/
|
240
|
+
AppNetSubModule.prototype.handle_requests_on_all_runs = function(channel, callback, done_callback) {
|
241
|
+
var app_id = this.net.nutella.appId;
|
242
|
+
// Pad channel
|
243
|
+
var padded_channel = this.net.pad_channel(channel, app_id, '+');
|
244
|
+
var ln = this.net;
|
245
|
+
var mqtt_cb = function(mqtt_message, mqtt_channel) {
|
246
|
+
try {
|
247
|
+
var f = JSON.parse(mqtt_message);
|
248
|
+
var run_id = extractRunId(app_id, mqtt_channel);
|
249
|
+
// Only handle requests that have proper id set
|
250
|
+
if(f.type!=='request' || f.id===undefined) return;
|
251
|
+
// Execute callback and send response
|
252
|
+
var m = ln.prepare_message_for_response(callback(f.payload, run_id, f.from), f.id);
|
253
|
+
ln.nutella.mqtt_client.publish( padded_channel, m );
|
254
|
+
} catch(e) {
|
255
|
+
if (e instanceof SyntaxError) {
|
256
|
+
// Message is not JSON, drop it
|
257
|
+
} else {
|
258
|
+
// Bubble up whatever exception is thrown
|
259
|
+
throw e;
|
260
|
+
}
|
261
|
+
}
|
262
|
+
};
|
263
|
+
this.net.nutella.mqtt_client.subscribe( padded_channel, mqtt_cb, done_callback);
|
264
|
+
// Notify subscription
|
265
|
+
this.net.publish_to('subscriptions', {type: 'handle_requests', channel: padded_channel}, this.net.nutella.appId, undefined);
|
266
|
+
};
|
267
|
+
|
268
|
+
|
269
|
+
|
270
|
+
// Utility function
|
271
|
+
|
272
|
+
function extractRunId(app_id, mqtt_channel) {
|
273
|
+
var pc = '/nutella/apps/' + app_id + '/runs/';
|
274
|
+
var sp = mqtt_channel.replace(pc, '').split('/');
|
275
|
+
return sp[0];
|
276
|
+
}
|
277
|
+
|
278
|
+
|
279
|
+
module.exports = AppNetSubModule;
|
@@ -0,0 +1,20 @@
|
|
1
|
+
/**
|
2
|
+
* App-level persistence APIs for nutella
|
3
|
+
*/
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
var AppPersistSubModule = function(main_nutella) {
|
8
|
+
// Store a reference to the main module
|
9
|
+
this.main_nutella = main_nutella;
|
10
|
+
};
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
AppPersistSubModule.prototype.test = function () {
|
15
|
+
console.log("This is just a test method for the APP persist sub-module");
|
16
|
+
};
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
module.exports = AppPersistSubModule;
|
@@ -0,0 +1,17 @@
|
|
1
|
+
/**
|
2
|
+
* Framework-level APIs for nutella, browser version
|
3
|
+
*/
|
4
|
+
|
5
|
+
// Require various sub-modules
|
6
|
+
var FrNetSubModule = require('./fr_net');
|
7
|
+
var FrLogSubModule = require('./fr_log');
|
8
|
+
|
9
|
+
|
10
|
+
var FrSubModule = function(main_nutella) {
|
11
|
+
// Initialized the various sub-modules
|
12
|
+
this.net = new FrNetSubModule(main_nutella);
|
13
|
+
this.log = new FrLogSubModule(main_nutella);
|
14
|
+
};
|
15
|
+
|
16
|
+
|
17
|
+
module.exports = FrSubModule;
|
data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/fr_log.js
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
/**
|
2
|
+
* Framework-level log APIs for nutella
|
3
|
+
*/
|
4
|
+
|
5
|
+
var FrNetSubModule = require('./app_net');
|
6
|
+
|
7
|
+
var FrLogSubModule = function(main_nutella) {
|
8
|
+
this.net = new FrNetSubModule(main_nutella);
|
9
|
+
};
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
FrLogSubModule.prototype.debug = function(message, code) {
|
14
|
+
console.debug(message);
|
15
|
+
this.net.publish('logging', logToJson(message, code, 'debug'));
|
16
|
+
return code;
|
17
|
+
};
|
18
|
+
|
19
|
+
FrLogSubModule.prototype.info = function(message, code) {
|
20
|
+
console.info(message);
|
21
|
+
this.net.publish('logging', logToJson(message, code, 'info'));
|
22
|
+
return code;
|
23
|
+
};
|
24
|
+
|
25
|
+
FrLogSubModule.prototype.success = function(message, code) {
|
26
|
+
console.log('%c '+ message , 'color: #009933');
|
27
|
+
this.net.publish('logging', logToJson(message, code, 'success'));
|
28
|
+
return code;
|
29
|
+
};
|
30
|
+
|
31
|
+
FrLogSubModule.prototype.warn = function(message, code) {
|
32
|
+
console.warn(message);
|
33
|
+
this.net.publish('logging', logToJson(message, code, 'warn'));
|
34
|
+
return code;
|
35
|
+
};
|
36
|
+
|
37
|
+
FrLogSubModule.prototype.error = function(message, code) {
|
38
|
+
console.error(message);
|
39
|
+
this.net.publish('logging', logToJson(message, code, 'error'));
|
40
|
+
return code;
|
41
|
+
};
|
42
|
+
|
43
|
+
|
44
|
+
function logToJson( message, code, level) {
|
45
|
+
return (code === undefined) ? {level: level, message: message} : {level: level, message: message, code: code};
|
46
|
+
}
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
module.exports = FrLogSubModule;
|