- 1 :
/*
- 2 :
* This file is part of the Companion project
- 3 :
* Copyright (c) 2018 Bitfocus AS
- 4 :
* Authors: William Viker <william@bitfocus.io>, Håkon Nessjøen <haakon@bitfocus.io>
- 5 :
*
- 6 :
* This program is free software.
- 7 :
* You should have received a copy of the MIT licence as well as the Bitfocus
- 8 :
* Individual Contributor License Agreement for companion along with
- 9 :
* this program.
- 10 :
*
- 11 :
* You can be released from the requirements of the license by purchasing
- 12 :
* a commercial license. Buying such a license is mandatory as soon as you
- 13 :
* develop commercial activities involving the Companion software without
- 14 :
* disclosing the source code of your own applications.
- 15 :
*
- 16 :
*/
- 17 :
- 18 :
- 19 :
if (process.env.DEVELOPER !== undefined) {
- 20 :
process.env['DEBUG'] = '*,-websocket*,-express*,-engine*,-socket.io*,-send*,-db,-NRC*,-follow-redirects,-electron-timer-fix';
- 21 :
}
- 22 :
- 23 :
// Fix timers in electron
- 24 :
// require('./electron-timer-fix').fix();
- 25 :
- 26 :
global.MAX_BUTTONS = 32;
- 27 :
global.MAX_BUTTONS_PER_ROW = 8;
- 28 :
- 29 :
var EventEmitter = require('events');
- 30 :
/**
- 31 :
* The application's event emitter for core functionality which allows for some point to multi-point calls
- 32 :
* and `skeleton` to `app` functionality.
- 33 :
* N.B. This is not the same `system` referenced by instances. See {@link InstanceSystem}.
- 34 :
* @class System
- 35 :
* @extends EventEmitter
- 36 :
*/
- 37 :
var system = new EventEmitter();
- 38 :
var fs = require("fs");
- 39 :
var debug = require('debug')('app');
- 40 :
var mkdirp = require('mkdirp');
- 41 :
var stripAnsi = require('strip-ansi');
- 42 :
var logbuffer = [];
- 43 :
var logwriting = false;
- 44 :
var skeleton_info = {};
- 45 :
- 46 :
var config;
- 47 :
var cfgDir;
- 48 :
- 49 :
// Supress warnings for too many listeners to io_connect. This can be safely increased if the warning comes back at startup
- 50 :
system.setMaxListeners(20)
- 51 :
- 52 :
system.on('skeleton-info', function(key, val) {
- 53 :
skeleton_info[key] = val;
- 54 :
if (key == 'configDir') {
- 55 :
debug('configuration directory', val);
- 56 :
cfgDir = val + "/companion/";
- 57 :
mkdirp(cfgDir, function(err) {
- 58 :
debug("mkdirp",cfgDir,err);
- 59 :
config = new (require('./lib/Data/Config'))(system, cfgDir, {
- 60 :
http_port: 8888,
- 61 :
bind_ip: "127.0.0.1",
- 62 :
start_minimised: false,
- 63 :
});
- 64 :
});
- 65 :
}
- 66 :
});
- 67 :
- 68 :
system.on('configdir_get', function (cb) {
- 69 :
cb(cfgDir);
- 70 :
});
- 71 :
- 72 :
system.on('skeleton-info-info', function(cb) {
- 73 :
cb(skeleton_info);
- 74 :
});
- 75 :
- 76 :
system.on('config_loaded', function(config) {
- 77 :
system.emit('skeleton-info', 'appURL', 'Waiting for webserver..');
- 78 :
system.emit('skeleton-info', 'appStatus', 'Starting');
- 79 :
system.emit('skeleton-info', 'bindInterface', config.bind_ip);
- 80 :
system.emit('skeleton-info', 'startMinimised', config.start_minimised);
- 81 :
});
- 82 :
- 83 :
system.on('exit', function() {
- 84 :
console.log("somewhere, the system wants to exit. kthxbai");
- 85 :
- 86 :
system.emit('instance_getall', function(instances, active) {
- 87 :
try {
- 88 :
for (var key in active) {
- 89 :
if (instances[key].label !== 'internal') {
- 90 :
try {
- 91 :
active[key].destroy();
- 92 :
} catch(e) {
- 93 :
console.log("Could not destroy",instances[key].label);
- 94 :
}
- 95 :
}
- 96 :
}
- 97 :
} catch(e) {
- 98 :
console.log("Could not destroy all instances");
- 99 :
}
- 100 :
});
- 101 :
- 102 :
setImmediate(function(){
- 103 :
process.exit();
- 104 :
});
- 105 :
});
- 106 :
- 107 :
- 108 :
system.on('skeleton-bind-ip', function(ip) {
- 109 :
config.bind_ip = ip;
- 110 :
system.emit('config_set', 'bind_ip', ip);
- 111 :
system.emit('ip_rebind');
- 112 :
});
- 113 :
- 114 :
system.on('skeleton-bind-port', function(port) {
- 115 :
var p = parseInt(port);
- 116 :
if (p >= 1024 && p <= 65535) {
- 117 :
config.http_port = p;
- 118 :
system.emit('config_set', 'http_port', p);
- 119 :
system.emit('ip_rebind');
- 120 :
}
- 121 :
});
- 122 :
- 123 :
system.on('skeleton-start-minimised', function(minimised) {
- 124 :
config.start_minimised = minimised;
- 125 :
system.emit('config_set', 'start_minimised', minimised);
- 126 :
});
- 127 :
- 128 :
system.on('skeleton-ready', function() {
- 129 :
- 130 :
if (system.headless === true) {
- 131 :
debug("Going into headless mode. Logs will be written to companion.log")
- 132 :
- 133 :
setInterval(function() {
- 134 :
- 135 :
if (logbuffer.length > 0 && logwriting == false) {
- 136 :
var writestring = logbuffer.join("\n");
- 137 :
logbuffer = [];
- 138 :
logwriting = true;
- 139 :
fs.appendFile('./companion.log', writestring + "\n", function(err) {
- 140 :
if (err) {
- 141 :
console.log("log write error", err);
- 142 :
}
- 143 :
logwriting = false;
- 144 :
});
- 145 :
}
- 146 :
}, 1000)
- 147 :
- 148 :
process.stderr.write = function() {
- 149 :
var arr = [];
- 150 :
for (var n in arguments) {
- 151 :
arr.push(arguments[n]);
- 152 :
}
- 153 :
var line = new Date().toISOString() + " " + stripAnsi(arr.join(" ").trim() );
- 154 :
logbuffer.push(line);
- 155 :
};
- 156 :
- 157 :
- 158 :
}
- 159 :
- 160 :
debug('launching registry');
- 161 :
var registry = new (require('./lib/registry'))(system, config);
- 162 :
- 163 :
system.emit('modules_loaded');
- 164 :
- 165 :
system.on('exit', function() {
- 166 :
registry.elgatoDM.quit();
- 167 :
});
- 168 :
- 169 :
});
- 170 :
- 171 :
system.on('skeleton-single-instance-only', function (response) {
- 172 :
response(true);
- 173 :
});
- 174 :
- 175 :
exports = module.exports = function(headless) {
- 176 :
if (headless !== undefined && headless === true) {
- 177 :
system.headless = true;
- 178 :
}
- 179 :
return system;
- 180 :
}