UNPKG

node-qwebchannel

Version:
132 lines (105 loc) 3.52 kB
var ws = require("nodejs-websocket") var isListening = false; var id = 0; var interfaces = {}; function introspectObject(object) { var methods = []; var signals = []; for (var key in object) { if (typeof object[key] == "function") { methods.push(key); } else if (typeof object[key] == "object") { signals.push(key); } } return { methods: function() { return methods.map(function(key) { return [ key, methods.indexOf(key) + 1 ]; }); }(), signals: function() { return signals.map(function(key) { return [ key, signals.indexOf(key) + 1 ]; }); }(), properties: [] } } module.exports = { listen: function(host, port) { ws.createServer(function(socket) { socket.on('text', function(text) { isListening = true; try { var message = JSON.parse(text); console.log(message); switch (message.type) { case 3: // INIT var data = {}; for (var interface in interfaces) { data = Object.assign(data, { [interface]: introspectObject(interfaces[interface]) }); } socket.sendText(JSON.stringify({ data: data, id: message.id, type: 10 })); break; case 4: // IDLE break; case 6: // INVOKEMETHOD if (typeof interfaces[message.object] == "undefined") { console.error("Object " + message.object + " not found!"); break; } var methods = []; for (var key in interfaces[message.object]) { if (typeof interfaces[message.object][key] == "function") { methods.push(interfaces[message.object][key]); } } if (message.method > methods.length) { console.error("Method index " + message.method + " not found in object " + message.object + "!"); break; } if (methods[message.method - 1].length != message.args.length) { console.error("Invalid number of arguments"); break; } methods[message.method - 1].apply(interfaces[message.object], message.args); break; case 7: // CONNECTTOSIGNAL var signals = []; console.log("ante"); for (var key in interfaces[message.object]) { if (typeof interfaces[message.object][key] == "object") { signals.push(interfaces[message.object][key]); } } // console.log(signals[message.signal - 1]); signals[message.signal - 1].emit = signals[message.signal - 1].emit.bind({ socket: 'merda' }); } } catch (e) { console.error("Failed to parse message received from the client: " + e); } }); }).listen(port, host); }, registerInterface: function(interfaceName, interfaceObject) { if (isListening) { console.error("Cannot register interface " + interfaceName + " while listening"); return false; } if (typeof interfaces[interfaceName] != "undefined") { console.error("The interface " + interfaceName + " is already registered!"); return false; } interfaces[interfaceName] = interfaceObject; var signalIndex = -1; for (var key in interfaceObject) { if (typeof interfaceObject[key] == "object") { interfaceObject[key].emit = interfaceObject[key].emit.bind({ interfaceName: interfaceName, signalIndex: ++signalIndex + 1 }); } } return interfaceObject; }, method: function(callback) { return callback; }, signal: { emit: function() { var message = { data: { object: this.interfaceName, signal: this.signalIndex, args: Array.prototype.slice.call(arguments) } }; console.log("vai porra" + JSON.stringify(this)); console.log(message); } } }