///
///
// This is main process of Electron, started as first thing when the Electron
// app starts, and running through entire life of your application.
import app = require('app');
var ipc = require('ipc');
import childProcess = require('child_process');
var kill = require('tree-kill');
import path = require('path');
import http = require('http');
import BrowserWindow = require('browser-window');
var env = require('./scripts/env_config');
var devHelper = require('./scripts/dev_helper');
var windowStateKeeper = require('./scripts/window_state');
import vorlonhttpConfig = require("./vorlon/config/vorlon.httpconfig");
import vorlonServer = require("./vorlon/Scripts/vorlon.server");
import vorlonDashboard = require("./vorlon/Scripts/vorlon.dashboard");
import vorlonWebserver = require("./vorlon/Scripts/vorlon.webServer");
import vorlonHttpProxy = require("./vorlon/Scripts/vorlon.httpproxy.server");
import config = require("./vorlon.config");
var mainWindow : GitHubElectron.BrowserWindow;
var vorlonServerProcess : childProcess.ChildProcess = null;
var dashboardWindows = {};
var errors = [];
var messages = [];
var userDataPath = app.getPath('userData');
console.log("user data path : " + userDataPath);
// Preserver of the window size and position between app launches.
var mainWindowState = windowStateKeeper('main', {
width: 800,
height: 600
});
app.on('ready', function () {
mainWindow = new BrowserWindow({
x: mainWindowState.x,
y: mainWindowState.y,
width: mainWindowState.width,
height: mainWindowState.height
});
if (mainWindowState.isMaximized) {
mainWindow.maximize();
}
if (env && env.name === 'test') {
mainWindow.loadUrl('file://' + __dirname + '/spec.html');
} else {
mainWindow.loadUrl('file://' + __dirname + '/mainpage.html');
}
if (!env || env.name !== 'production') {
devHelper.setDevMenu();
//mainWindow.openDevTools();
}
mainWindow.on('close', function () {
mainWindowState.saveState(mainWindow);
app.quit();
});
setTimeout(function(){
startVorlonProcess();
}, 1000);
//test browser features
// var testWindow = new BrowserWindow({
// x: mainWindowState.x,
// y: mainWindowState.y,
// width: mainWindowState.width,
// height: mainWindowState.height
// });
// testWindow.loadUrl('http://html5test.com/');
});
app.on('window-all-closed', function () {
app.quit();
});
app.on('window-all-closed', function () {
app.quit();
});
ipc.on("opendashboard", function (event, arg) {
console.log("receive opendashboard for " + JSON.stringify(arg));
if (arg && arg.sessionid) {
openDashboardWindow(arg.sessionid);
}
});
ipc.on("startVorlon", function (event, arg) {
console.log("received startVorlon command");
startVorlonProcess();
});
ipc.on("stopVorlon", function (event, arg) {
console.log("received stopVorlon command");
stopVorlonProcess();
});
ipc.on("getVorlonStatus", function (event, arg) {
sendVorlonStatus(event, arg);
});
ipc.on("getVorlonSessions", function (event, arg) {
if (vorlonServerProcess){
vorlonServerProcess.send({ message: "getsessions" }, null);
}
});
ipc.on("updateSession", function (event, arg) {
console.log("received updateSession", arg);
var dashboardwindow = dashboardWindows[arg.sessionid];
if (dashboardwindow){
openDashboardWindow(arg.sessionid)
}
});
function sendVorlonStatus(event?, arg?){
var msg = {
running : vorlonServerProcess != null,
errors : errors,
messages : messages
};
if (event){
//console.log("sending status", msg);
event.sender.send('vorlonStatus', msg);
}else{
//console.log("sending status to mainwindow", msg);
mainWindow.send('vorlonStatus', msg);
}
}
function sendLog(logs, sender?){
var msg = {logs : logs};
if (sender){
sender.send('vorlonlog', msg);
}else if (mainWindow) {
mainWindow.send('vorlonlog', msg);
}
}
function openDashboardWindow(sessionid) {
sessionid = sessionid || 'default';
var cfg = config.getConfig(userDataPath);
var dashboardTarget = 'http://localhost:' + cfg.port + '/dashboard/' + sessionid;
var existing = dashboardWindows[sessionid];
if (existing){
console.log("dashboard already exists, awakening it at " + dashboardTarget);
existing.show();
existing.loadUrl(dashboardTarget);
return ;
}
var dashboardwdw = new BrowserWindow({
x: mainWindowState.x,
y: mainWindowState.y,
width: mainWindowState.width,
height: mainWindowState.height,
"node-integration": false
});
//dashboardwdw.openDevTools();
console.log("create new dashboard window for " + dashboardTarget);
//load empty page first to prevent bad window title
dashboardwdw.loadUrl('file://' + __dirname + '/emptypage.html');
setTimeout(function () {
dashboardwdw.webContents.on('did-fail-load', function(event, errorCode, errorDescription, validateUrl){
console.log("dashboard page error " + validateUrl + " " + errorCode + " " + errorDescription);
dashboardwdw.loadUrl('file://' + __dirname + '/dasboardloaderrorpage.html');
});
dashboardwdw.loadUrl(dashboardTarget);
}, 1000);
dashboardWindows[sessionid] = dashboardwdw;
dashboardwdw.on('close', function () {
dashboardWindows[sessionid] = null;
});
}
function startVorlonProcess() {
if (!vorlonServerProcess) {
var scriptpath = path.join(__dirname, 'vorlon.js');
console.log("starting silent " + scriptpath);
var vorlon = childProcess.fork(scriptpath, [userDataPath], { silent: true });
//var vorlon = childProcess.spawn('node', [scriptpath], {});
errors = [];
messages = [];
vorlonServerProcess = vorlon;
vorlon.on('message', function (m) {
if (m.log){
messages.push(m.log);
if (m.level == "error"){
errors.push(m.log);
}
console.log.apply(null, m.log.args);
sendLog([m.log]);
} else if (m.session){
console.log("session " + m.session.action, m.session.session);
mainWindow.send("session." + m.session.action, m.session.session);
}
//console.log("message:", m);
});
vorlon.on('close', function (code, arg) {
console.log("VORLON CLOSED WITH CODE " + code, arg);
stopVorlonProcess();
});
sendVorlonStatus();
setTimeout(function() {
callVorlonServer(config.getConfig(userDataPath));
}, 1000);
}
}
function stopVorlonProcess() {
if (vorlonServerProcess) {
kill(vorlonServerProcess.pid, 'SIGKILL', function () {
vorlonServerProcess = null;
sendVorlonStatus();
});
}
}
function callVorlonServer(cfg){
//when application is packaged to an exe, first call to style.css sometimes hang on Windows
console.log("calling vorlon server on " + cfg.port);
var options = {
host: 'localhost',
port: cfg.port,
path: '/stylesheets/style.css',
method: 'GET'
};
var req = http.request(options, function(res) {
// console.log('STATUS: ' + res.statusCode);
// console.log('HEADERS: ' + JSON.stringify(res.headers));
// res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('server call ok');
});
res.on('error', function (err) {
console.error('server call error');
});
});
req.setTimeout(2000, function(){
req.abort();
callVorlonServer(cfg);
});
req.end();
}