remove trailing whitesapce
[scilab.git] / scilab / node / scilab_process.js
1 var spawn = require('child_process').spawn;
2
3 var L = console.log;
4
5 var debug = true;
6 var command_ready = false;
7 var graphic_ready = false;
8
9 L('process id: ' + process.pid);
10 var cmdPort = 10000 + process.pid;
11 var grpPort = 10001 + process.pid;
12 var dspPort = 10002;
13
14 var imagepath;
15 var quitTO = 0;
16 var msgHistory = [];
17
18 //start server to chat with dispatcher
19 var dispatchio = require('socket.io')(dspPort);
20
21 dispatchio.on('connection', function (dspSocket) {
22     //new connection incoming
23     L('dispatchio connection');
24     dspSocket.on('command', function (msg) {
25         L('command (' + process.pid + ') : ' + msg.data);
26         commandio.emit('command', msg);
27     });
28
29     dspSocket.on('callback', function (msg) {
30         graphicio.emit('callback', msg);
31     });
32
33     dspSocket.on('force_reload', function (msg) {
34         msgHistory = []; //reset history, sciab was closed or has crashed.
35     });
36
37     dspSocket.on('imagepath', function (msg) {
38         imagepath = msg;
39     });
40
41     dspSocket.on('quit', function () {
42         L('quit' + '(' + process.pid + ')');
43
44         //prevent accidental close, wait 10 minutes before really close Scilab.
45         quitTO = setTimeout( function() {
46             L('send quit to Scilab');
47             commandio.emit('command', {data:'quit'});
48             commandio.close();
49             graphicio.close();
50             process.exit(0);
51         }, /*60 * 10 * 1000*/5 * 1000); //5 seconds to test
52     });
53
54     dspSocket.on('reconnection', function () {
55         L('reconnection');
56         clearTimeout(quitTO);
57         quitTO = 0;
58         //resend all gui creation information
59         var size = msgHistory.length;
60         L('history: ' + size);
61         dspSocket.emit("graphic_reconnection", "start");
62         for(var i = 0 ; i < size ; ++i) {
63             //L('%d : %s', i+1, msgHistory[i]);
64             dspSocket.emit('graphic_create', msgHistory[i]);
65         }
66         dspSocket.emit("graphic_reconnection", "end");
67     });
68
69     L('open commandio socket');
70     //start command server to chat with Scilab
71     var commandio = require('socket.io')(cmdPort);
72     commandio.on('connection', function (socket) {
73         L('Scilab command connected');
74
75         socket.on('command_end', function () {
76             L('command_end');
77             dspSocket.emit('command_end');
78         });
79
80         socket.on('disconnect', function () {
81             L('scilab command disconnected'+ '(' + process.pid + ')');
82             command_ready = false;
83         });
84
85         //send to server scilab is ready
86         command_ready = true;
87         if(graphic_ready) {
88             msgHistory = []; //reset history, sciab was closed or has crashed.
89             dspSocket.emit('status', {data:'ready'});
90         }
91     });
92
93     //start graphic server to chat with graphic MVC
94     var graphicio = require('socket.io')(grpPort);
95     graphicio.on('connection', function (socket) {
96         L('Scilab graphic connected');
97
98         socket.emit('imagepath', imagepath);
99         socket.on('graphic_create', function (msg) {
100             msgHistory.push(msg);
101             dspSocket.emit('graphic_create', msg);
102         });
103
104         socket.on('graphic_delete', function (msg) {
105             msgHistory.push(msg);
106             dspSocket.emit('graphic_delete', msg);
107         });
108
109         socket.on('graphic_update', function (msg) {
110             msgHistory.push(msg);
111             dspSocket.emit('graphic_update', msg);
112         });
113
114         socket.on('disconnect', function () {
115             msgHistory = []; //reset history, sciab was closed or has crashed.
116
117             L('scilab graphic disconnected'+ '(' + process.pid + ')');
118             graphic_ready = false;
119         });
120
121         //send to server scilab is ready
122         graphic_ready = true;
123         if(command_ready) {
124             dspSocket.emit('status', {data:'ready'});
125         }
126     });
127
128     //launch scilab with init command
129     var app;
130     if(process.platform === "win32") {
131         app = process.env.SCIPATH + "/bin/wscilex.exe";
132     } else {
133         app = process.env.SCIPATH + "/bin/scilab";
134     }
135
136     var addr = 'http://127.0.0.1';
137     var commandaddr = addr + ':' + cmdPort;
138     var graphicaddr = addr + ':' + grpPort;
139
140     var scilabApp = spawn(app, ['-nw', '-commandaddr', commandaddr, '-graphicaddr', graphicaddr]);
141
142     //to debug
143     if(debug) {
144     /*
145         scilabApp.stdout.on('data', function(data) {
146             L('scilab out :' + data.toString());
147         });
148     */
149         scilabApp.stderr.on('data', function(data) {
150             L('scilab err :' + data.toString());
151         });
152     }
153 });