import { execFile, spawn } from 'child_process' const ipc = require('node-ipc') class Bridge { constructor() { this.cpus = [] // this.getDevices() } getDevices() { this.run(['python/devices.py']).then( (stdout, stderr) => { this.devices = JSON.parse(stdout) console.log(this.devices) }).catch( (err) => { console.error('error fetching devices:', err) }) } connectSocketIo(io) { this.io = io } broadcast(message, data) { console.log('broadcast', message, !! this.io) this.io && this.io.emit(message, data) } run(args) { return new Promise( (resolve, reject) => { console.log('>', args.join(' ')) execFile(process.env.PYTHON_BINARY, args, (err, stdout, stderr) => { if (err) return reject(err) return resolve(stdout, stderr) }) }) } monitor(args) { return new Monitor(args) } processFiles() { console.log('>> sending process files') ipc.server.sockets.forEach( (socket) => { ipc.server.emit(socket, 'processFiles', true) }) } processTasks() { console.log('>> sending process tasks') ipc.server.sockets.forEach( (socket) => { ipc.server.emit(socket, 'processTasks', true) }) } serve() { ipc.config.id = 'cortex' ipc.config.retry = 1500 ipc.serve( () => { ipc.server.on('connect', (socket) => { console.log('>>> worker connected') ipc.server.emit(socket, 'message', true) bridge.broadcast('worker', {connected: true}) }) ipc.server.on('message', (data, socket) => { ipc.log('got a message : '.debug, data) // ipc.server.emit(socket, 'message', 'hello world!') }) ipc.server.on('updateFile', (data, socket) => { console.log('updateFile') bridge.broadcast('updateFile', data) }) ipc.server.on('updateTask', (data, socket) => { console.log('updateTask') bridge.broadcast('updateTask', data) }) ipc.server.on( 'socket.disconnected', (socket, destroyedSocketID) => { ipc.log('client ' + destroyedSocketID + ' has disconnected!') }) }) ipc.server.start() } } const bridge = new Bridge export default bridge