import { execFile, spawn } from 'child_process' 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) { 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) } process(file) { ipc.server.sockets.forEach( (socket) => { console.log('>> sending process') ipc.server.emit(socket, 'process', true) }) } } const bridge = new Bridge export default bridge var ipc = require('node-ipc') 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', // data+' world!' // ) }) ipc.server.on('processed', (data, socket) => { console.log('processed job') bridge.broadcast('processed', data) }) ipc.server.on( 'socket.disconnected', (socket, destroyedSocketID) => { ipc.log('client ' + destroyedSocketID + ' has disconnected!'); }) }) ipc.server.start()