UNPKG

smartfacecloud-emulator-dispatcher

Version:

Handles Emulator Dispatcher Part of SmartfaceCloud

242 lines (215 loc) 8.67 kB
const MessageFactory = require('../common/MessageFactory'); const Workspace = require('smartfacecloud-emulator-index'); const uuid = require('uuid'); const debugSession = require("../debug/debugsession.js"); const LogToConsole = require("../common/LogToConsole"); const sendResetTimeout = require("../common/sendResetTimeout"); const CONSTANTS = require("../constants"); function ControlService() { const UI = 'UI'; const DEVICE = 'device'; const MESSAGE = 'message'; const FILE_TRANSFER = 'file-transfer'; const DEBUGGER = 'debugger'; const ALL = '*'; const waitForSync = true; const messageFactory = new MessageFactory(); var workspace = null; var request; var callbackList = {}; var self = this; var log; this.request = null; this.deviceInfo = null; this.init = function(requestService, opts) { opts = opts || {}; log = new LogToConsole(opts.logToConsole, '[CONTROL]').log; request = requestService; getWorkspaceOptions(); log("ControlService init"); }; this.handleMessage = function(from, message, connectedObject) { log("Handle message from", from, "message", message); if (callbackList[message.id]) { callbackList[message.id](null, message); } else { if (message.event) { if (message.event === "fileTransferCompleted") { self.start("Project"); } else if (message.event === "switchedProject") { self.init(request); } } if (message.command) { if (message.command === "pingDevice") { self.ping(); } else if (message.command === "start project") { if (message.data.debugSupported) { var randomID = uuid.v4(), handledRespone = false; if (global.shared.uiCommandEventEmiter) { global.shared.uiCommandEventEmiter.once("resume project", sendDebugMessages); global.shared.uiCommandEventEmiter.once("resumeFromSync", sendResumeFromSync); } var messageStartWithDebug = messageFactory.createMessage("start project", { "responseID": randomID, "debugger": message.data.debugger }); sendRequest(UI, null, messageStartWithDebug); var timeoutID = setTimeout(function() { sendDebugMessages({ data: {} }); }, 30000); } else { sendStartDebug(); } } else if (message.command === "getIndex") { self.deviceInfo = message.data; global.shared.allDeviceInfos[self.deviceInfo.deviceID] = self.deviceInfo; sendRequest(ALL, null, { event: "deviceInfo", deviceInfo: self.deviceInfo }); if (workspace == null) { getWorkspaceOptions(function(err, received) { if (err) throw err; self.sendIndex(); }); } else { self.sendIndex(); } } else if (message.command === 'cancelTransfer') { var messageToDevice = {}; messageToDevice.errors = []; messageToDevice.warnings = []; messageToDevice.errors.push(message.data.errorMessage); sendRequest(DEVICE, null, messageFactory.createMessage( 'cancelTransfer', messageToDevice)); } else if (message.command === 'stop project') { var responseMessage = messageFactory.createMessage("stop project", { responseID: uuid.v4() }); sendRequest(UI, null, responseMessage); } else if (message.command === "resetTimeout") { sendRequest(DEVICE, null, messageFactory.createMessage(message.command)); } } } function sendStartDebug(isDebugging) { var allUIWebsockets = global.shared.allUIWebsockets, messageResponse; if (connectedObject && !allUIWebsockets[connectedObject.browserGuid]) { isDebugging = false; } messageResponse = messageFactory.createMessage("resume project", { debug: !!isDebugging, waitForSync: waitForSync }); messageResponse.id = message.id; sendRequest(DEVICE, null, messageResponse); log("Sending resume project to DEVICE with isDebugging:", !!isDebugging); } function sendDebugMessages(message) { clearTimeout(timeoutID); if (handledRespone) return; handledRespone = true; var isDebugging = (randomID === message.data.responseID && message.data.isDebugging); if (isDebugging) { isDebugging = !!debugSession.createNewSession(connectedObject, { logToConsole: true }); if (isDebugging) { var messageAttach = messageFactory.createMessage("attach", {}); log("Attach issued"); sendRequest(UI, null, messageAttach); } } sendStartDebug(isDebugging); } function sendResumeFromSync() { var messageResumeFromSync = messageFactory.createMessage("resumeFromSync", {}); sendRequest(DEVICE, null, messageResumeFromSync); } }; function getWorkspaceOptions(callback) { log("Received workspace options"); const received = { path: CONSTANTS.WORKSPACE_PATH, projectID: process.env.C9_HOSTNAME }; workspace = new Workspace({ path: received.path, projectID: received.projectID }); if (callback) { callback(null, received); } } // Commands this.sendIndex = function() { log("sendIndex"); var deviceID = this.deviceInfo.deviceID; try { sendResetTimeout.set(deviceID, function() { sendRequest(DEVICE, "resetTimeout", messageFactory.createMessage("resetTimeout")); }); workspace.getIndex(self.deviceInfo, function(err, indexData) { sendResetTimeout.clear(deviceID); global.shared.allDeviceInfos[self.deviceInfo.deviceID].indexData = indexData; sendRequest(DEVICE, null, messageFactory.createMessage("getFiles", indexData)); }); } catch (ex) { sendResetTimeout.clear(deviceID); sendRequest(DEVICE, null, messageFactory.createMessage("getFiles", null)); } }; this.start = function(type) { log("start"); var message = messageFactory.createMessage("start", type); sendRequest(DEVICE, null, message); }; this.stop = function(type) { log("stop"); var message = messageFactory.createMessage("stop", type); sendRequest(DEVICE, null, message); }; this.erase = function() { log("erase"); var message = messageFactory.createMessage("erase"); sendRequest(DEVICE, null, message); }; this.ping = function() { log("ping"); var message = messageFactory.createMessage("ping"); sendRequest(DEVICE, null, message); }; this.openUrl = function(url) { log("openUrl"); var message = messageFactory.createMessage("openUrl", { url: url }); sendRequest(DEVICE, null, message); }; // Communication function sendRequest(to, command, message, callback) { if (callback) { callbackList[message.id] = callback; } request(MESSAGE, to, command, message); } } module.exports = ControlService;