import { server, io } from './site' import * as proxy from './proxy' 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' }) socket.on('res', data => { // console.log('Received response', data.cmd) client.emit('res', data) }) socket.on('status', data => { client.emit('status', data) }) 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) }) socket.on('task_res', data => { client.emit('task_res', data) }) 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.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') }) }