nutella_framework 0.4.5 → 0.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +14 -15
  3. data/VERSION +1 -1
  4. data/framework_components/beacon-cloud-bot/README.md +27 -0
  5. data/framework_components/beacon-cloud-bot/beacon_cloud_bot.rb +154 -0
  6. data/framework_components/beacon-cloud-bot/nutella.json +6 -0
  7. data/framework_components/beacon-cloud-bot/startup +4 -0
  8. data/framework_components/beacon-cloud-interface/LICENSE +21 -0
  9. data/framework_components/beacon-cloud-interface/Readme.md +0 -0
  10. data/framework_components/beacon-cloud-interface/bower.json +29 -0
  11. data/framework_components/beacon-cloud-interface/bower_components/bower-mqttws/.bower.json +23 -0
  12. data/framework_components/beacon-cloud-interface/bower_components/bower-mqttws/bower.json +14 -0
  13. data/framework_components/beacon-cloud-interface/bower_components/bower-mqttws/mqttws31.js +2081 -0
  14. data/framework_components/beacon-cloud-interface/bower_components/bower-mqttws/readme.md +4 -0
  15. data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/.bower.json +37 -0
  16. data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/LICENSE +21 -0
  17. data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/README.md +15 -0
  18. data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/bower.json +28 -0
  19. data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/examples/browser/mqtt_client_hello_world.html +23 -0
  20. data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/examples/browser/nutella_hello_world.html +52 -0
  21. data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/examples/node/mqtt_client_hello_world.js +14 -0
  22. data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/examples/node/nutella_hello_world.js +38 -0
  23. data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/nutella_lib.js +789 -0
  24. data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/package.json +30 -0
  25. data/framework_components/beacon-cloud-interface/bower_components/nutella_lib/simple-js-mqtt-client.js +428 -0
  26. data/framework_components/beacon-cloud-interface/css/animation.css +17 -0
  27. data/framework_components/beacon-cloud-interface/css/cursor.css +16 -0
  28. data/framework_components/beacon-cloud-interface/css/page_layout.css +73 -0
  29. data/framework_components/beacon-cloud-interface/index.html +157 -0
  30. data/framework_components/beacon-cloud-interface/js/lib/nutella_lib.js +4039 -0
  31. data/framework_components/beacon-cloud-interface/js/react/beacon-add.js +102 -0
  32. data/framework_components/beacon-cloud-interface/js/react/beacon-table.js +73 -0
  33. data/framework_components/beacon-cloud-interface/js/react/beacon.js +97 -0
  34. data/framework_components/beacon-cloud-interface/nutella.json +6 -0
  35. data/framework_components/example_framework_web_interface/index.html +11 -2
  36. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/.npmignore +10 -0
  37. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/.travis.yml +5 -0
  38. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/LICENSE +21 -0
  39. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/README.md +27 -0
  40. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/dist/nutella_lib.js +4039 -0
  41. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/dist/nutella_lib.js.map +1 -0
  42. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/examples/browser_hello_world.html +67 -0
  43. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/examples/node_hello_world.js +51 -0
  44. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/gulpfile.js +31 -0
  45. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/package.json +41 -0
  46. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/app_core.js +19 -0
  47. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/app_core_browser.js +17 -0
  48. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/app_log.js +50 -0
  49. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/app_net.js +279 -0
  50. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/app_persist.js +20 -0
  51. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/fr_core_browser.js +17 -0
  52. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/fr_log.js +50 -0
  53. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/fr_net.js +499 -0
  54. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/nutella_i.js +74 -0
  55. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/nutella_i_browser.js +130 -0
  56. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/nutella_lib.js +91 -0
  57. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/nutella_lib_browser.js +90 -0
  58. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/run_log.js +51 -0
  59. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/run_net.js +84 -0
  60. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/run_persist.js +20 -0
  61. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/src/util/net.js +327 -0
  62. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/test/nutella.test.js +16 -0
  63. data/framework_components/example_framework_web_interface/node_modules/nutella_lib/test/runner.html +22 -0
  64. data/framework_components/example_framework_web_interface/package.json +15 -0
  65. data/framework_components/{order.json.example → order.json} +0 -0
  66. data/framework_components/runs_list_bot/{app_runs_list_bot.rb → runs_list_bot.rb} +9 -3
  67. data/framework_components/runs_list_bot/startup +1 -1
  68. data/lib/commands/meta/run_command.rb +21 -36
  69. data/lib/commands/start.rb +9 -199
  70. data/lib/commands/util/components_list.rb +68 -0
  71. data/lib/commands/util/components_starter.rb +169 -0
  72. data/nutella_framework.gemspec +109 -47
  73. data/nutella_lib/framework_net.rb +17 -13
  74. metadata +84 -106
@@ -0,0 +1,499 @@
1
+ /**
2
+ * Framework-level Networking APIs for nutella
3
+ */
4
+
5
+
6
+ var AbstractNet = require('./util/net');
7
+
8
+
9
+ /**
10
+ * Framework-level network APIs for nutella
11
+ * @param main_nutella
12
+ * @constructor
13
+ */
14
+ var FRNetSubModule = 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
+ FRNetSubModule.prototype.subscribe = function(channel, callback, done_callback) {
28
+ this.net.subscribe_to(channel, callback, undefined, undefined, done_callback);
29
+ };
30
+
31
+
32
+ /**
33
+ * Unsubscribes from a channel
34
+ *
35
+ * @param channel
36
+ * @param done_callback
37
+ */
38
+ FRNetSubModule.prototype.unsubscribe = function(channel, done_callback) {
39
+ this.net.unsubscribe_from(channel, undefined, undefined, done_callback);
40
+ };
41
+
42
+
43
+ /**
44
+ * Publishes a message to a channel
45
+ *
46
+ * @param channel
47
+ * @param message
48
+ */
49
+ FRNetSubModule.prototype.publish = function(channel, message) {
50
+ this.net.publish_to(channel, message, undefined, undefined);
51
+ };
52
+
53
+
54
+ /**
55
+ * Sends a request.
56
+ *
57
+ * @param channel
58
+ * @param message
59
+ * @param callback
60
+ */
61
+ FRNetSubModule.prototype.request = function(channel, message, callback) {
62
+ this.net.request_to(channel, message, callback, undefined, undefined);
63
+ };
64
+
65
+
66
+ /**
67
+ * Handles requests.
68
+ *
69
+ * @param channel
70
+ * @param callback
71
+ * @param done_callback
72
+ */
73
+ FRNetSubModule.prototype.handle_requests = function(channel, callback, done_callback) {
74
+ this.net.handle_requests_on(channel, callback, undefined, undefined, done_callback);
75
+ };
76
+
77
+
78
+
79
+ //----------------------------------------------------------------------------------------------------------------
80
+ // Framework-level APIs to communicate at the run-level to a specific run
81
+ //----------------------------------------------------------------------------------------------------------------
82
+
83
+ /**
84
+ * Allows framework-level APIs to subscribe to a run-level channel within a specific run
85
+ *
86
+ * @param app_id
87
+ * @param run_id
88
+ * @param channel
89
+ * @param callback
90
+ * @param done_callback
91
+ */
92
+ FRNetSubModule.prototype.subscribe_to_run = function(app_id, run_id, channel, callback,done_callback) {
93
+ this.net.subscribe_to(channel,callback,app_id,run_id,done_callback)
94
+ };
95
+
96
+
97
+ /**
98
+ * Allows framework-level APIs to unsubscribe from a run-level channel within a specific run
99
+ *
100
+ * @param app_id
101
+ * @param run_id
102
+ * @param channel
103
+ * @param done_callback
104
+ */
105
+ FRNetSubModule.prototype.unsubscribe_to_run = function( app_id, run_id, channel, done_callback ) {
106
+ this.net.unsubscribe_from(channel, app_id, run_id, done_callback);
107
+ };
108
+
109
+
110
+ /**
111
+ * Allows framework-level APIs to publish to a run-level channel within a specific run
112
+ *
113
+ * @param app_id
114
+ * @param run_id
115
+ * @param channel
116
+ * @param message
117
+ */
118
+ FRNetSubModule.prototype.publish_to_run = function( app_id, run_id, channel, message ) {
119
+ this.net.publish_to(channel, message, app_id, run_id);
120
+ };
121
+
122
+
123
+ /**
124
+ * Allows framework-level APIs to make an asynchronous request to a run-level channel within a specific run
125
+ *
126
+ * @param app_id
127
+ * @param run_id
128
+ * @param channel
129
+ * @param request
130
+ * @param callback
131
+ */
132
+ FRNetSubModule.prototype.request_to_run = function( app_id, run_id, channel, request, callback) {
133
+ this.net.request_to(channel, request, callback, app_id, run_id);
134
+ };
135
+
136
+
137
+ /**
138
+ * Allows framework-level APIs to handle requests on a run-level channel within a specific run
139
+ *
140
+ * @param app_id
141
+ * @param run_id
142
+ * @param channel
143
+ * @param callback
144
+ */
145
+ FRNetSubModule.prototype.handle_requests_on_run = function( app_id, run_id, channel, callback, done_callback) {
146
+ this.net.handle_requests_on(channel, callback, app_id, run_id, done_callback)
147
+ };
148
+
149
+
150
+
151
+ //----------------------------------------------------------------------------------------------------------------
152
+ // Framework-level APIs to communicate at the run-level (broadcast)
153
+ //----------------------------------------------------------------------------------------------------------------
154
+
155
+
156
+ /**
157
+ * Callback for subscribing to all runs
158
+ * @callback allRunsCb
159
+ # @param {string} message - the received message. Messages that are not JSON are discarded
160
+ # @param {String} app_id - the app_id of the channel the message was sent on
161
+ # @param {String} run_id - the run_id of the channel the message was sent on
162
+ # @param {Object} from - the sender's identifiers (run_id, app_id, component_id and optionally resource_id)
163
+ */
164
+
165
+ /**
166
+ * Allows framework-level APIs to subscribe to a run-level channel *for ALL runs*
167
+ *
168
+ * @param channel
169
+ * @param {allRunsCb} callback
170
+ * @param done_callback
171
+ */
172
+ FRNetSubModule.prototype.subscribe_to_all_runs = function( channel, callback, done_callback ) {
173
+ //Pad channel
174
+ var padded_channel = this.net.pad_channel(channel, '+', '+');
175
+ var mqtt_cb = function(mqtt_message, mqtt_channel) {
176
+ try {
177
+ var f = JSON.parse(mqtt_message);
178
+ var f1 = extractRunIdAndAppId(mqtt_channel);
179
+ if(f.type==='publish')
180
+ callback(f.payload, f1.appId, f1.runId, f.from);
181
+ } catch(e) {
182
+ if (e instanceof SyntaxError) {
183
+ // Message is not JSON, drop it
184
+ } else {
185
+ // Bubble up whatever exception is thrown
186
+ throw e;
187
+ }
188
+ }
189
+ };
190
+ // Add to subscriptions, save mqtt callback and subscribe
191
+ this.net.subscriptions.push(padded_channel);
192
+ this.net.callbacks.push(mqtt_cb);
193
+ this.net.nutella.mqtt_client.subscribe(padded_channel, mqtt_cb, done_callback);
194
+ // Notify subscription
195
+ this.net.publish_to('subscriptions', {type: 'subscribe', channel: padded_channel}, undefined, undefined);
196
+ };
197
+
198
+
199
+ /**
200
+ * Allows framework-level APIs to unsubscribe from a run-level channel *for ALL runs*
201
+ *
202
+ * @param channel
203
+ * @param done_callback
204
+ */
205
+ FRNetSubModule.prototype.unsubscribe_from_all_runs = function(channel, done_callback) {
206
+ this.net.unsubscribe_from(channel, '+', '+', done_callback);
207
+ };
208
+
209
+
210
+ /**
211
+ * Allows framework-level APIs to publish a message to a run-level channel *for ALL runs*
212
+ *
213
+ * @param channel
214
+ * @param message
215
+ */
216
+ FRNetSubModule.prototype.publish_to_all_runs = function( channel, message ) {
217
+ Object.keys(this.net.nutella.runs_list).forEach(function(app_id) {
218
+ this.net.nutella.runs_list[app_id].runs.forEach(function(run_id){
219
+ this.net.publish_to(channel, message, app_id, run_id);
220
+ }.bind(this));
221
+ }.bind(this));
222
+ };
223
+
224
+
225
+ /**
226
+ * Allows framework-level APIs to send a request to a run-level channel *for ALL runs*
227
+ *
228
+ * @param channel
229
+ * @param request
230
+ * @param callback
231
+ */
232
+ FRNetSubModule.prototype.request_to_all_runs = function(channel, request, callback) {
233
+ Object.keys(this.net.nutella.runs_list).forEach(function(app_id) {
234
+ this.net.nutella.runs_list[app_id].runs.forEach(function(run_id){
235
+ this.net.publish_to(channel, message, app_id, run_id);
236
+ this.net.request_to(channel, request, callback, app_id, run_id);
237
+ }.bind(this));
238
+ }.bind(this));
239
+ };
240
+
241
+ /**
242
+ * Callback that is used to handle messages from all runs
243
+ * @callback handle_all_runs_cb
244
+ * @param {string} payload - the received message (request). Messages that are not JSON are discarded
245
+ * @param {string} app_id - the app_id of the channel the request was sent on
246
+ * @param {string} run_id - the run_id of the channel the request was sent on
247
+ * @param {Object} from - the sender's identifiers (from containing, run_id, app_id, component_id and optionally resource_id)
248
+ * @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.
249
+ */
250
+
251
+ /**
252
+ * Allows framework-level APIs to handle requests to a run-level channel *for ALL runs*
253
+ *
254
+ * @param channel
255
+ * @param {handle_all_runs_cb} callback
256
+ * @param done_callback
257
+ */
258
+ FRNetSubModule.prototype.handle_requests_on_all_runs = function(channel, callback, done_callback) {
259
+ // Pad channel
260
+ var padded_channel = this.net.pad_channel(channel, '+', '+');
261
+ var ln = this.net;
262
+ var mqtt_cb = function(mqtt_message, mqtt_channel) {
263
+ try {
264
+ var f = JSON.parse(mqtt_message);
265
+ var f1 = extractRunIdAndAppId(mqtt_channel);
266
+ // Only handle requests that have proper id set
267
+ if(f.type!=='request' || f.id===undefined) return;
268
+ // Execute callback and send response
269
+ var m = ln.prepare_message_for_response(callback(f.payload, f1.appId, f1.runId, f.from), f.id);
270
+ ln.nutella.mqtt_client.publish( padded_channel, m );
271
+ } catch(e) {
272
+ if (e instanceof SyntaxError) {
273
+ // Message is not JSON, drop it
274
+ } else {
275
+ // Bubble up whatever exception is thrown
276
+ throw e;
277
+ }
278
+ }
279
+ };
280
+ this.net.nutella.mqtt_client.subscribe( padded_channel, mqtt_cb, done_callback);
281
+ // Notify subscription
282
+ this.net.publish_to('subscriptions', {type: 'handle_requests', channel: padded_channel}, undefined, undefined);
283
+ };
284
+
285
+
286
+
287
+ //----------------------------------------------------------------------------------------------------------------
288
+ // Framework-level APIs to communicate at the application-level
289
+ //----------------------------------------------------------------------------------------------------------------
290
+
291
+
292
+ /**
293
+ * Allows framework-level APIs to subscribe to an app-level channel
294
+ *
295
+ * @param app_id
296
+ * @param channel
297
+ * @param callback
298
+ * @param done_callback
299
+ */
300
+ FRNetSubModule.prototype.subscribe_to_app = function(app_id, channel, callback, done_callback) {
301
+ this.net.subscribe_to(channel,callback,app_id, undefined, done_callback)
302
+ };
303
+
304
+
305
+ /**
306
+ * Allows framework-level APIs to unsubscribe from an app-level channel within a specific run
307
+ *
308
+ * @param app_id
309
+ * @param channel
310
+ * @param done_callback
311
+ */
312
+ FRNetSubModule.prototype.unsubscribe_to_app = function( app_id, channel, done_callback) {
313
+ this.net.unsubscribe_from(channel,app_id,undefined, done_callback);
314
+ };
315
+
316
+
317
+ /**
318
+ * Allows framework-level APIs to publish to an app-level channel
319
+ *
320
+ * @param app_id
321
+ * @param channel
322
+ * @param message
323
+ */
324
+ FRNetSubModule.prototype.publish_to_app = function(app_id, channel, message) {
325
+ this.net.publish_to(channel,message,app_id,undefined);
326
+ };
327
+
328
+
329
+ /**
330
+ * Allows framework-level APIs to make an asynchronous request to a run-level channel within a specific run
331
+ *
332
+ * @param app_id
333
+ * @param channel
334
+ * @param request
335
+ * @param callback
336
+ */
337
+ FRNetSubModule.prototype.request_to_app = function( app_id, channel, request, callback) {
338
+ this.net.request_to(channel, request, callback, app_id, undefined);
339
+ };
340
+
341
+
342
+ /**
343
+ * Allows framework-level APIs to handle requests on a run-level channel within a specific run
344
+ *
345
+ * @param app_id
346
+ * @param channel
347
+ * @param callback
348
+ * @param done_callback
349
+ */
350
+ FRNetSubModule.prototype.handle_requests_on_app = function(app_id, channel, callback, done_callback) {
351
+ this.net.handle_requests_on(channel, callback, app_id, undefined, done_callback);
352
+ };
353
+
354
+
355
+ //----------------------------------------------------------------------------------------------------------------
356
+ // Framework-level APIs to communicate at the application-level (broadcast)
357
+ //----------------------------------------------------------------------------------------------------------------
358
+
359
+ /**
360
+ * Callback used to handle all messages received when subscribing to all applications
361
+ * @callback subscribeToAllAppsCb
362
+ * @param {string} message - the received message. Messages that are not JSON are discarded
363
+ * @param {string} app_id - the app_id of the channel the message was sent on
364
+ * @param {Object} from - the sender's identifiers (run_id, app_id, component_id and optionally resource_id)
365
+ */
366
+
367
+ /**
368
+ * Allows framework-level APIs to subscribe to an app-level channel *for ALL apps*
369
+ *
370
+ * @param channel
371
+ * @param {subscribeToAllAppsCb} callback
372
+ * @param done_callback
373
+ */
374
+ FRNetSubModule.prototype.subscribe_to_all_apps = function(channel, callback, done_callback) {
375
+ //Pad channel
376
+ var padded_channel = this.net.pad_channel(channel, '+', undefined);
377
+ var mqtt_cb = function(mqtt_message, mqtt_channel) {
378
+ try {
379
+ var f = JSON.parse(mqtt_message);
380
+ var app_id = extractAppId(mqtt_channel);
381
+ if(f.type==='publish')
382
+ callback(f.payload, app_id, f.from);
383
+ } catch(e) {
384
+ if (e instanceof SyntaxError) {
385
+ // Message is not JSON, drop it
386
+ } else {
387
+ // Bubble up whatever exception is thrown
388
+ throw e;
389
+ }
390
+ }
391
+ };
392
+ // Add to subscriptions, save mqtt callback and subscribe
393
+ this.net.subscriptions.push(padded_channel);
394
+ this.net.callbacks.push(mqtt_cb);
395
+ this.net.nutella.mqtt_client.subscribe(padded_channel, mqtt_cb, done_callback);
396
+ // Notify subscription
397
+ this.net.publish_to('subscriptions', {type: 'subscribe', channel: padded_channel}, undefined, undefined);
398
+ };
399
+
400
+
401
+ /**
402
+ * Allows framework-level APIs to unsubscribe from an app-level channel *for ALL apps*
403
+ *
404
+ * @param channel
405
+ * @param done_callback
406
+ */
407
+ FRNetSubModule.prototype.unsubscribe_from_all_apps = function(channel, done_callback) {
408
+ this.net.unsubscribe_from(channel, '+', undefined, done_callback);
409
+ };
410
+
411
+
412
+ /**
413
+ * Allows framework-level APIs to publish a message to an app-level channel *for ALL apps*
414
+ *
415
+ * @param channel
416
+ * @param message
417
+ */
418
+ FRNetSubModule.prototype.publish_to_all_apps = function(channel, message) {
419
+ Object.keys(this.net.nutella.runs_list).forEach(function(app_id) {
420
+ this.net.publish_to(channel, message, app_id, undefined);
421
+ }.bind(this));
422
+ };
423
+
424
+
425
+ /**
426
+ * Allows framework-level APIs to send a request to an app-level channel *for ALL apps*
427
+ *
428
+ * @param channel
429
+ * @param request
430
+ * @param callback
431
+ */
432
+ FRNetSubModule.prototype.request_to_all_apps = function(channel, request, callback) {
433
+ Object.keys(this.net.nutella.runs_list).forEach(function(app_id) {
434
+ this.net.request_to(channel, request, callback, app_id, undefined);
435
+ }.bind(this));
436
+ };
437
+
438
+
439
+ /**
440
+ * This callback is used to handle messages coming from all applications
441
+ * @callback handleAllAppsCb
442
+ * @param {string} request - the received message (request). Messages that are not JSON are discarded.
443
+ * @param {string} app_id - the app_id of the channel the request was sent on
444
+ * @param {Object} from - the sender's identifiers (from containing, run_id, app_id, component_id and optionally resource_id)
445
+ * @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.
446
+ */
447
+
448
+ /**
449
+ * Allows framework-level APIs to handle requests to app-level channel *for ALL runs*
450
+ *
451
+ * @param channel
452
+ * @param {handleAllAppsCb} callback
453
+ * @param done_callback
454
+ */
455
+ FRNetSubModule.prototype.handle_requests_on_all_apps = function(channel, callback, done_callback) {
456
+ // Pad channel
457
+ var padded_channel = this.net.pad_channel(channel, '+', undefined);
458
+ var ln = this.net;
459
+ var mqtt_cb = function(mqtt_message, mqtt_channel) {
460
+ try {
461
+ var f = JSON.parse(mqtt_message);
462
+ var f1 = extractRunIdAndAppId(mqtt_channel);
463
+ // Only handle requests that have proper id set
464
+ if(f.type!=='request' || f.id===undefined) return;
465
+ // Execute callback and send response
466
+ var m = ln.prepare_message_for_response(callback(f.payload, f1.appId, f1.runId, f.from), f.id);
467
+ ln.nutella.mqtt_client.publish( padded_channel, m );
468
+ } catch(e) {
469
+ if (e instanceof SyntaxError) {
470
+ // Message is not JSON, drop it
471
+ } else {
472
+ // Bubble up whatever exception is thrown
473
+ throw e;
474
+ }
475
+ }
476
+ };
477
+ this.net.nutella.mqtt_client.subscribe( padded_channel, mqtt_cb, done_callback);
478
+ // Notify subscription
479
+ this.net.publish_to('subscriptions', {type: 'handle_requests', channel: padded_channel}, undefined, undefined);
480
+ };
481
+
482
+
483
+ // Utility functions
484
+
485
+
486
+ function extractRunIdAndAppId(mqtt_channel) {
487
+ var sp = mqtt_channel.replace('/nutella/apps/', '').split('/');
488
+ return {appId: sp[0], runId: sp[2]};
489
+ }
490
+
491
+ function extractAppId(mqtt_channel) {
492
+ var sp = mqtt_channel.replace('/nutella/apps/', '').split('/');
493
+ return sp[0];
494
+ }
495
+
496
+
497
+
498
+
499
+ module.exports = FRNetSubModule;
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Run-level and App-level Nutella instances for node
3
+ */
4
+
5
+ var SimpleMQTTClient = require('simple-mqtt-client');
6
+
7
+ // Require various sub-modules
8
+ var AppSubModule = require('./app_core');
9
+ var NetSubModule = require('./run_net');
10
+ var LogSubModule = require('./run_log');
11
+ var PersistSubModule = require('./run_persist');
12
+
13
+
14
+ /**
15
+ * Defines the RunNutellaInstance class.
16
+ *
17
+ * @param {String } app_id - the app_id this component belongs to
18
+ * @param {string} run_id - the run_id this component is launched in
19
+ * @param {string} broker_hostname - the hostname of the broker.
20
+ * @param {string} component_id - the name of this component
21
+ */
22
+ var RunNutellaInstance = function (broker_hostname, app_id, run_id, component_id) {
23
+ //Initialize parameters
24
+ this.mqtt_client = new SimpleMQTTClient(broker_hostname);
25
+ this.appId = app_id;
26
+ this.runId = run_id;
27
+ this.componentId = component_id;
28
+ // Initialized the various sub-modules
29
+ this.net = new NetSubModule(this);
30
+ this.log = new LogSubModule(this);
31
+ this.persist = new PersistSubModule(this);
32
+ };
33
+
34
+ /**
35
+ * Sets the resource id for this instance of nutella
36
+ *
37
+ * @param {string} resource_id - the resource_id associated to this instance of nutella
38
+ */
39
+ RunNutellaInstance.prototype.setResourceId = function(resource_id){
40
+ this.resourceId = resource_id;
41
+ };
42
+
43
+
44
+
45
+ /**
46
+ * Defines the AppNutellaInstance class.
47
+ *
48
+ * @param {String } app_id - the app_id this component belongs to
49
+ * @param {string} broker_hostname - the hostname of the broker.
50
+ * @param {string} component_id - the name of this component
51
+ */
52
+ var AppNutellaInstance = function (broker_hostname, app_id, component_id) {
53
+ //Initialize parameters
54
+ this.mqtt_client = new SimpleMQTTClient(broker_hostname);
55
+ this.appId = app_id;
56
+ this.componentId = component_id;
57
+ // Initialized the various sub-modules
58
+ this.app = new AppSubModule(this);
59
+ };
60
+
61
+ /**
62
+ * Sets the resource id for this instance of nutella
63
+ *
64
+ * @param {string} resource_id - the resource_id associated to this instance of nutella
65
+ */
66
+ AppNutellaInstance.prototype.setResourceId = function(resource_id){
67
+ this.resourceId = resource_id;
68
+ };
69
+
70
+
71
+ module.exports = {
72
+ RunNutellaInstance : RunNutellaInstance,
73
+ AppNutellaInstance : AppNutellaInstance
74
+ };
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Run-level and App-level Nutella instances for the browser
3
+ */
4
+
5
+ var SimpleMQTTClient = require('simple-mqtt-client');
6
+
7
+ // Require various sub-modules
8
+ var AppSubModule = require('./app_core_browser');
9
+ var FrSubModule = require('./fr_core_browser');
10
+ var NetSubModule = require('./run_net');
11
+ var LogSubModule = require('./run_log');
12
+
13
+
14
+ /**
15
+ * Defines the RunNutellaInstance class.
16
+ *
17
+ * @param {String } app_id - the app_id this component belongs to
18
+ * @param {string} run_id - the run_id this component is launched in
19
+ * @param {string} broker_hostname - the hostname of the broker.
20
+ * @param {string} component_id - the name of this component
21
+ */
22
+ var RunNutellaInstance = function (broker_hostname, app_id, run_id, component_id) {
23
+ //Initialize parameters
24
+ this.mqtt_client = new SimpleMQTTClient(broker_hostname);
25
+ this.appId = app_id;
26
+ this.runId = run_id;
27
+ this.componentId = component_id;
28
+ // Initialized the various sub-modules
29
+ this.net = new NetSubModule(this);
30
+ this.log = new LogSubModule(this);
31
+ // Start pinging
32
+ setInterval(function(){
33
+ this.net.publish('pings', 'ping');
34
+ }.bind(this),5000);
35
+ };
36
+
37
+ /**
38
+ * Sets the resource id for this instance of nutella
39
+ *
40
+ * @param {string} resource_id - the resource_id associated to this instance of nutella
41
+ */
42
+ RunNutellaInstance.prototype.setResourceId = function(resource_id){
43
+ this.resourceId = resource_id;
44
+ };
45
+
46
+
47
+ /**
48
+ * Defines the AppNutellaInstance class.
49
+ *
50
+ * @param {String } app_id - the app_id this component belongs to
51
+ * @param {string} broker_hostname - the hostname of the broker.
52
+ * @param {string} component_id - the name of this component
53
+ */
54
+ var AppNutellaInstance = function (broker_hostname, app_id, component_id) {
55
+ //Initialize parameters
56
+ this.mqtt_client = new SimpleMQTTClient(broker_hostname);
57
+ this.appId = app_id;
58
+ this.componentId = component_id;
59
+ // Initialized the various sub-modules
60
+ this.app = new AppSubModule(this);
61
+ //Initialize the runs list
62
+ this.runs_list = [];
63
+ // Fetch the runs list
64
+ this.app.net.request('app_runs_list', undefined, function(response) {
65
+ this.runs_list = response;
66
+ }.bind(this));
67
+ // Subscribe to runs list updates
68
+ this.app.net.subscribe('app_runs_list', function(message, from) {
69
+ this.runs_list = message;
70
+ }.bind(this));
71
+ // Start pinging
72
+ setInterval(function(){
73
+ this.app.net.publish('pings', 'ping');
74
+ }.bind(this),5000);
75
+ };
76
+
77
+ /**
78
+ * Sets the resource id for this instance of nutella
79
+ *
80
+ * @param {string} resource_id - the resource_id associated to this instance of nutella
81
+ */
82
+ AppNutellaInstance.prototype.setResourceId = function(resource_id){
83
+ this.resourceId = resource_id;
84
+ };
85
+
86
+
87
+ /**
88
+ * Defines the FRNutellaInstance class.
89
+ *
90
+ * @param {string} broker_hostname - the hostname of the broker.
91
+ * @param {string} component_id - the name of this component
92
+ */
93
+ var FrNutellaInstance = function (broker_hostname, component_id) {
94
+ //Initialize parameters
95
+ this.mqtt_client = new SimpleMQTTClient(broker_hostname);
96
+ this.componentId = component_id;
97
+ // Initialize the various sub-modules
98
+ this.f = new FrSubModule(this);
99
+ //Initialize the runs list
100
+ this.runs_list = {};
101
+ // Fetch the runs list
102
+ this.f.net.request('runs_list', undefined, function(response) {
103
+ this.runs_list = response;
104
+ }.bind(this));
105
+ // Subscribe to runs list updates
106
+ this.f.net.subscribe('runs_list', function(message, from) {
107
+ this.runs_list = message;
108
+ }.bind(this));
109
+ // Start pinging
110
+ setInterval(function(){
111
+ this.f.net.publish('pings', 'ping');
112
+ }.bind(this),5000);
113
+ };
114
+
115
+ /**
116
+ * Sets the resource id for this instance of nutella
117
+ *
118
+ * @param {string} resource_id - the resource_id associated to this instance of nutella
119
+ */
120
+ FrNutellaInstance.prototype.setResourceId = function(resource_id){
121
+ this.resourceId = resource_id;
122
+ };
123
+
124
+
125
+
126
+ module.exports = {
127
+ RunNutellaInstance : RunNutellaInstance,
128
+ AppNutellaInstance : AppNutellaInstance,
129
+ FrNutellaInstance : FrNutellaInstance
130
+ };