(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.jiboTunableClient = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o */ "use strict"; exports.ReqType = { INIT: 'INIT', NEW_FIELD: 'NEW_FIELD', PLAY: 'PLAY', PLAYING: 'PLAYING', DONE_PLAYING: 'DONE_PLAYING', VALUE_UPDATE: 'VALUE_UPDATE', }; var gui; var Client = (function () { function Client(port) { var _this = this; this.wsHandlers = new Map(); this.folders = new Map(); // Setup gui for first time if (!gui) { gui = new dat.GUI({ autoPlace: false }); var container = document.getElementById('gui-container'); container.appendChild(gui.domElement); gui.width = 400; } this.ws = new WebSocket('ws://' + window.location.hostname + ':' + port); // When the connection is open, send some data to the server this.ws.onopen = function () { var msg = { type: exports.ReqType.INIT, data: '' }; _this.sendWS(msg); }; this.ws.onclose = function (ev) { console.log('WebSocket closed: ', ev); _this.cleanup(); }; // Log errors this.ws.onerror = function (error) { console.error('WebSocket Error: ', error); _this.cleanup(); }; // Log messages from the server this.ws.onmessage = function (incoming) { console.log('Got WS message: ' + incoming.data); var msg = JSON.parse(incoming.data); var handler = _this.wsHandlers.get(msg.type); if (handler) { var resp = handler(msg.data); if (resp) { _this.sendWS(resp); } } }; this.addWsHandler(exports.ReqType.VALUE_UPDATE, function (data) { var folder = _this.folders.get(data.folderName); if (!folder) { throw new Error("No folder of name '" + data.folderName + "'"); } folder.obj[data.fieldName] = data.value; // Update display value of all children of folder folder.gui.__controllers.forEach(function (c) { c.updateDisplay(); }); }); /** * Install handler for new fields */ this.addWsHandler(exports.ReqType.NEW_FIELD, function (data) { var folderName = data.folderName; var fieldName = data.fieldName; var folder = _this.folders.get(folderName); if (!folder) { folder = { obj: {}, gui: gui.addFolder(folderName) }; _this.folders.set(folderName, folder); } folder.gui.open(); folder.obj[fieldName] = data.field._current; var el; var type = data.field.type; if (type === 'string') { el = folder.gui.add(folder.obj, fieldName, data.field.options); } else if (type === 'boolean') { el = folder.gui.add(folder.obj, fieldName); } else if (type === 'number') { el = folder.gui.add(folder.obj, fieldName, data.field.min, data.field.max); el.step(data.field.step); } else if (type === 'button') { folder.obj[fieldName] = function () { //let a = arguments; //debugger; //this.sendWS({ // type: ReqType.VALUE_UPDATE, // data: { // folderName, // fieldName, // value: true // } //}); }; el = folder.gui.add(folder.obj, fieldName); } else { throw new Error("Can't handle field of type '" + data.field.type + "'"); } _this.addChangeListener(el, folderName, fieldName); }); } Client.prototype.sendWS = function (msg) { this.ws.send(JSON.stringify(msg)); }; Client.prototype.addWsHandler = function (type, handler) { this.wsHandlers.set(type, handler); }; Client.prototype.addChangeListener = function (el, folderName, fieldName) { var _this = this; el.onChange(function (value) { _this.sendWS({ type: exports.ReqType.VALUE_UPDATE, data: { folderName: folderName, fieldName: fieldName, value: value, } }); }); }; Client.prototype.cleanup = function () { if (gui) { this.folders.forEach(function (folder, key) { var clone = folder.gui.__controllers.slice(0); clone.forEach(function (fCon) { return folder.gui.remove(fCon); }); }); } this.folders.clear(); gui.destroy(); gui = undefined; }; return Client; }()); exports.Client = Client; var root = window || global; root.Client = Client; },{}]},{},[1])(1) }); //# sourceMappingURL=jibo-tunable-client.js.map