UNPKG

2.44 kBJavaScriptView Raw
1var EventEmitter = require('events').EventEmitter;
2var util = require('util');
3
4function Sandbox() {
5 this.callbacks = {};
6 this.callbackCounter = 1;
7 this.messageHandler = null;
8 this.dappMessageCb = null;
9 EventEmitter.call(this);
10}
11util.inherits(Sandbox, EventEmitter);
12
13Sandbox.prototype.processParentMessage = function (data) {
14 if (typeof this.onMessage === 'function') {
15 var json = data;
16
17 if (!json.callback_id) {
18 console.log('Incorrent response from parent, missed callback_id field');
19 return;
20 }
21 var callback_id;
22 try {
23 callback_id = parseInt(json.callback_id);
24 } catch (e) {
25 console.log("Failed to convert callback_id to integer");
26 return;
27 }
28 if (isNaN(callback_id)) {
29 console.log("Incorrect callback_id field, callback_id should be a number");
30 return;
31 }
32
33 if (json.type == "asch_response") {
34 var callback = this.callbacks[callback_id];
35 if (!callback) {
36 console.log("Can't find callback_id from parent");
37 return;
38 }
39 var error = json.error;
40 var response = json.response;
41 delete this.callbacks[callback_id];
42 setImmediate(callback, error, response);
43 } else if (json.type == "asch_call") {
44 var callback = function (err, result) {
45 var responseObj = {
46 type: "dapp_response",
47 callback_id: callback_id,
48 error: err,
49 response: result.response
50 }
51 this.emit('message', responseObj);
52 }.bind(this);
53 var message = json.message;
54 if (typeof this.messageHandler === "function") {
55 setImmediate(this.messageHandler, message, callback, callback_id);
56 }
57 }
58 }
59}
60
61Sandbox.prototype._getCallbackCounter = function () {
62 return this.callbackCounter++;
63}
64
65Sandbox.prototype.onMessage = function (handler) {
66 this.messageHandler = handler;
67}
68
69Sandbox.prototype.sendMessage = function (msg, cb) {
70 var callback_id = this._getCallbackCounter();
71 var messageObj = {
72 type: "dapp_call",
73 callback_id: callback_id,
74 message: msg
75 };
76 this.callbacks[callback_id] = cb;
77 this.emit('message', messageObj);
78}
79
80Sandbox.prototype.run = function (argv) {
81 var options = {
82 sandbox: this
83 }
84 process.argv = argv;
85 require('./init')(options, function (err) {
86 if (err) {
87 console.error('Failed to init: ' + err);
88 process.exit();
89 } else {
90 console.log('Initialize complete');
91 this.emit('ready');
92 }
93 }.bind(this));
94}
95
96var instance = new Sandbox();
97
98process.exit = function (code) {
99 instance.emit('exit', code);
100}
101module.exports = instance;
\No newline at end of file