1 | var EventEmitter = require('events').EventEmitter;
|
2 | var util = require('util');
|
3 |
|
4 | function Sandbox() {
|
5 | this.callbacks = {};
|
6 | this.callbackCounter = 1;
|
7 | this.messageHandler = null;
|
8 | this.dappMessageCb = null;
|
9 | EventEmitter.call(this);
|
10 | }
|
11 | util.inherits(Sandbox, EventEmitter);
|
12 |
|
13 | Sandbox.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 |
|
61 | Sandbox.prototype._getCallbackCounter = function () {
|
62 | return this.callbackCounter++;
|
63 | }
|
64 |
|
65 | Sandbox.prototype.onMessage = function (handler) {
|
66 | this.messageHandler = handler;
|
67 | }
|
68 |
|
69 | Sandbox.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 |
|
80 | Sandbox.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 |
|
96 | var instance = new Sandbox();
|
97 |
|
98 | process.exit = function (code) {
|
99 | instance.emit('exit', code);
|
100 | }
|
101 | module.exports = instance; |
\ | No newline at end of file |