import { server, io } from './site' import * as proxy from './proxy' import * as db from './db' let relay_connected = false export const client = io.of('/client') client.on('connect', bind_client) export const relay = (() => { let relay; if (process.env.EXPRESS_CONNECTS_TO_RELAY === 'true') { const relay_endpoint = (process.env.SECURE_PROXY ? 'https' : 'http') + "://" + process.env.PROXY_REMOTE + '/client' console.log('Connecting to relay on ' + relay_endpoint) relay = require('socket.io-client').connect(relay_endpoint) proxy.attach(server) bind_relay(relay) } else { relay = io.of('/relay') relay.on('connect', bind_relay) } return relay })() const syscall_lookup = {} function bind_relay(socket) { console.log('Relay connected') relay_connected = true client.emit('system_res', { type: 'relay_connected' }) // responses from a live process socket.on('res', data => { // console.log('Received response', data.cmd) client.emit('res', data) }) // status messages from a live process socket.on('status', data => { client.emit('status', data) }) // responses to system calls socket.on('system_res', data => { if (process.env.CACHE_SYSCALLS) { const id = make_server_id(data) syscall_lookup[id] = data } client.emit('system_res', data) }) // messages related to queuing and tasks socket.on('task_res', data => { console.log(data) if (data.task && data.task.id) { delete data.task.created_at delete data.task.updated_at db.models.task.update(data.task.id, data.task) .then(task => { task.processor = data.task.processor data.task = task client.emit('task_res', data) }) if (data.action === 'resolve_dataset' && data.task.opt.file_id) { db.models.file.update(data.task.opt.file_id, { dataset: data.task.dataset, }).then(file => { client.emit('api_res', { type: 'update', datatype: 'file', data: file }) }).catch(err => { console.error('error setting the dataset', err) }) } } else { client.emit('task_res', data) } }) // // data responses from the server, telling us that files, folders, etc were created // socket.on('data_res', data => { // if (EXPRESS_CONNECTS_TO_RELAY) return // switch (data.type) { // case 'file_create': // // certain files should be persisted in the database... // db.models.file.create(data.data).then(file => { // client.emit('data_res', { // type: 'file_create', // data: file, // }) // }) // break // default: // client.emit('data_res', data) // break // } // }) // image frames generated by pix2pix socket.on('frame', (data) => { client.volatile.emit('frame', data) }) socket.on('disconnect', () => { console.log('Relay disconnected') relay_connected = false client.emit('system_res', { type: 'relay_disconnected' }) }) } function make_client_id(data){ return [data.cmd, JSON.stringify(data.payload)].join('_') } function make_server_id(data){ return [data.type, JSON.stringify(data.cmd || data.dir)].join('_') } function bind_client(socket){ console.log('Client connected') if (relay_connected) { socket.emit('system_res', { type: 'relay_connected' }) relay.emit('system', { cmd: 'get_status' }) } else { socket.emit('system_res', { type: 'relay_disconnected' }) } socket.emit('system_res', { type: 'site', site: { name: process.env.SITE_NAME || 'untitled' } }) socket.on('cmd', data => { // console.log('Client sent command', data) relay.emit('cmd', data) }) socket.on('system', data => { // console.log('Client sent system command', data) if (process.env.CACHE_SYSCALLS) { const id = make_client_id(data) console.log('client', id) // console.log(id in syscall_lookup) if (id in syscall_lookup) { const cached = syscall_lookup[id] syscall_lookup[id].uuid = data.uuid return socket.emit('system_res', cached) } } relay.emit('system', data) }) socket.on('task', data => { // console.log('Client sent task command', data) relay.emit('task', data) }) socket.on('disconnect', () => { console.log('Client disconnected') }) }