diff --git a/.jshintrc b/.jshintrc
new file mode 100644
index 0000000..62bb2d4
--- /dev/null
+++ b/.jshintrc
@@ -0,0 +1,86 @@
+{
+ // See http://jshint.com/docs/ for details
+
+ "maxerr" : 50, // {int} Maximum error before stopping
+
+ // Enforcing
+ "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.)
+ "camelcase" : false, // true: Identifiers must be in camelCase
+ "curly" : true, // true: Require {} for every new block or scope
+ "eqeqeq" : true, // true: Require triple equals (===) for comparison
+ "freeze" : true, // true: prohibits overwriting prototypes of native objects such as Array, Date etc.
+ "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty()
+ "immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());`
+ "indent" : 4, // {int} Number of spaces to use for indentation
+ "latedef" : false, // true: Require variables/functions to be defined before being used
+ "newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()`
+ "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee`
+ "noempty" : true, // true: Prohibit use of empty blocks
+ "nonbsp" : true, // true: Prohibit "non-breaking whitespace" characters.
+ "nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment)
+ "plusplus" : false, // true: Prohibit use of `++` & `--`
+ "quotmark" : false, // Quotation mark consistency:
+ // false : do nothing (default)
+ // true : ensure whatever is used is consistent
+ // "single" : require single quotes
+ // "double" : require double quotes
+ "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks)
+ "unused" : true, // true: Require all defined variables be used
+ "strict" : true, // true: Requires all functions run in ES5 Strict Mode
+ "maxparams" : false, // {int} Max number of formal params allowed per function
+ "maxdepth" : false, // {int} Max depth of nested blocks (within functions)
+ "maxstatements" : false, // {int} Max number statements per function
+ "maxcomplexity" : false, // {int} Max cyclomatic complexity per function
+ "maxlen" : 79, // {int} Max number of characters per line
+
+ // Relaxing
+ "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons)
+ "boss" : false, // true: Tolerate assignments where comparisons would be expected
+ "debug" : false, // true: Allow debugger statements e.g. browser breakpoints.
+ "eqnull" : false, // true: Tolerate use of `== null`
+ "es5" : false, // true: Allow ES5 syntax (ex: getters and setters)
+ "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`)
+ "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features)
+ // (ex: `for each`, multiple try/catch, function expression…)
+ "evil" : false, // true: Tolerate use of `eval` and `new Function()`
+ "expr" : false, // true: Tolerate `ExpressionStatement` as Programs
+ "funcscope" : false, // true: Tolerate defining variables inside control statements
+ "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict')
+ "iterator" : false, // true: Tolerate using the `__iterator__` property
+ "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block
+ "laxbreak" : false, // true: Tolerate possibly unsafe line breakings
+ "laxcomma" : false, // true: Tolerate comma-first style coding
+ "loopfunc" : false, // true: Tolerate functions being defined in loops
+ "multistr" : false, // true: Tolerate multi-line strings
+ "noyield" : false, // true: Tolerate generator functions with no yield statement in them.
+ "notypeof" : false, // true: Tolerate invalid typeof operator values
+ "proto" : false, // true: Tolerate using the `__proto__` property
+ "scripturl" : false, // true: Tolerate script-targeted URLs
+ "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;`
+ "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation
+ "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;`
+ "validthis" : false, // true: Tolerate using this in a non-constructor function
+
+ // Environments
+ "browser" : true, // Web Browser (window, document, etc)
+ "browserify" : true, // Browserify (node.js code in the browser)
+ "couch" : false, // CouchDB
+ "devel" : true, // Development/debugging (alert, confirm, etc)
+ "dojo" : false, // Dojo Toolkit
+ "jasmine" : false, // Jasmine
+ "jquery" : false, // jQuery
+ "mocha" : true, // Mocha
+ "mootools" : false, // MooTools
+ "node" : false, // Node.js
+ "nonstandard" : false, // Widely adopted globals (escape, unescape, etc)
+ "prototypejs" : false, // Prototype and Scriptaculous
+ "qunit" : false, // QUnit
+ "rhino" : false, // Rhino
+ "shelljs" : false, // ShellJS
+ "worker" : false, // Web Workers
+ "wsh" : false, // Windows Scripting Host
+ "yui" : false, // Yahoo User Interface
+
+ // Custom Globals
+ "globals" : {} // additional predefined global variables
+}
diff --git a/dist/js/gamepad-client.js b/dist/js/gamepad-client.js
index 5649ec3..e83b7b0 100755
--- a/dist/js/gamepad-client.js
+++ b/dist/js/gamepad-client.js
@@ -10,7 +10,7 @@ var error = utils.error;
var trace = utils.trace;
-utils.polyfill(window);
+utils.polyfill();
utils.lockOrientation('landscape-primary');
@@ -29,8 +29,8 @@ document.addEventListener('keyup', function (e) {
trace('User pressed "F"; entering/exiting fullscreen');
return utils.toggleFullScreen();
case 78: // Pressing NF (really just N) should toggle full-screen mode.
- trace('User pressed "NF"; exiting fullscreen and will not automatically ' +
- 'open next time');
+ trace('User pressed "NF"; exiting fullscreen and will not ' +
+ 'automatically open next time');
localStorage.disableAutoFullScreen = '1';
return utils.toggleFullScreen();
}
@@ -52,7 +52,7 @@ document.addEventListener('click', function (e) {
var peerId = utils.getPeerId();
-var peer = new Peer('controller_' + peerId, {
+var peer = new window.Peer('controller_' + peerId, {
key: settings.PEERJS_KEY,
debug: settings.DEBUG ? 3 : 0
});
@@ -79,7 +79,8 @@ conn.on('open', function () {
function send(msg) {
if (settings.DEBUG) {
- console.log('Sent: ' + (typeof msg === 'object' ? JSON.stringify(msg) : msg));
+ console.log('Sent: ' +
+ (typeof msg === 'object' ? JSON.stringify(msg) : msg));
}
conn.send(msg);
}
@@ -116,7 +117,8 @@ function angularShape(canvas, coords) {
}
function linearFill(shape, color1, color2, coords) {
- var bg = shape.createLinearGradient(coords[0], coords[1], coords[2], coords[3]);
+ var bg = shape.createLinearGradient(coords[0], coords[1], coords[2],
+ coords[3]);
bg.addColorStop(0, color1);
bg.addColorStop(1, color2);
shape.fillStyle = bg;
@@ -187,15 +189,16 @@ var gamepadState = {
function bindPress(button, eventName, isPressed) {
- document.querySelector('#' + button).addEventListener(eventName, function (e) {
- // Handle D-pad presses.
- if (e.target && e.target.parentNode === dpad) {
- dpad.classList.toggle(this.id);
- }
+ document.querySelector('#' + button)
+ .addEventListener(eventName, function (e) {
+ // Handle D-pad presses.
+ if (e.target && e.target.parentNode === dpad) {
+ dpad.classList.toggle(this.id);
+ }
- gamepadState[button] = isPressed;
- send({type: 'state', data: gamepadState});
- });
+ gamepadState[button] = isPressed;
+ send({type: 'state', data: gamepadState});
+ });
}
@@ -290,8 +293,12 @@ bindKeyPresses('keyup', false);
})(window, document);
},{"./lib/utils":2,"./settings":3}],2:[function(require,module,exports){
+module.exports = function (window, document) {
+'use strict';
+
function trace(text, level) {
- console[level || 'log']((window.performance.now() / 1000).toFixed(3) + ': ' + text);
+ console[level || 'log'](
+ (window.performance.now() / 1000).toFixed(3) + ': ' + text);
}
@@ -305,17 +312,18 @@ function warn(text) {
}
-function polyfill(win) {
- if (!('performance' in win)) {
- win.performance = {
+function polyfill() {
+ if (!('performance' in window)) {
+ window.performance = {
now: function () {
return +new Date();
}
};
}
- if (('origin' in win.location)) {
- win.location.origin = win.location.protocol + '//' + win.location.host;
+ if (('origin' in window.location)) {
+ window.location.origin = (window.location.protocol + '//' +
+ window.location.host);
}
}
@@ -343,7 +351,7 @@ function fieldFocused(e) {
function hasTouchEvents() {
return ('ontouchstart' in window ||
- window.DocumentTouch && document instanceof DocumentTouch);
+ window.DocumentTouch && document instanceof window.DocumentTouch);
}
function injectCSS(opts) {
@@ -384,7 +392,8 @@ function toggleFullScreen() {
} else if (document.documentElement.mozRequestFullScreen) {
document.documentElement.mozRequestFullScreen();
} else if (document.documentElement.webkitRequestFullscreen) {
- document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
+ document.documentElement.webkitRequestFullscreen(
+ Element.ALLOW_KEYBOARD_INPUT);
} else if (document.documentElement.msRequestFullscreen) {
document.documentElement.msRequestFullscreen();
}
@@ -403,16 +412,16 @@ function toggleFullScreen() {
}
-function lockOrientation() {
- var lo = (screen.LockOrientation ||
- screen.mozLockOrientation ||
- screen.webkitLockOrientation ||
- screen.msLockOrientation);
+function lockOrientation(orientation) {
+ var lo = (window.screen.LockOrientation ||
+ window.screen.mozLockOrientation ||
+ window.screen.webkitLockOrientation ||
+ window.screen.msLockOrientation);
if (!lo) {
return warn('Orientation could not be locked');
}
- lo(orientation);
+ return lo(orientation);
}
@@ -424,37 +433,46 @@ function triggerEvent(type) {
}
-module.exports.trace = trace;
-module.exports.error = error;
-module.exports.warn = warn;
-module.exports.polyfill = polyfill;
-module.exports.getPeerId = getPeerId;
-module.exports.fieldFocused = fieldFocused;
-module.exports.hasTouchEvents = hasTouchEvents;
-module.exports.injectCSS = injectCSS;
-module.exports.escape = escape;
-module.exports.isFullScreen = isFullScreen;
-module.exports.toggleFullScreen = toggleFullScreen;
-module.exports.lockOrientation = lockOrientation;
-module.exports.triggerEvent = triggerEvent;
+return {
+ trace: trace,
+ error: error,
+ warn: warn,
+ polyfill: polyfill,
+ getPeerId: getPeerId,
+ fieldFocused: fieldFocused,
+ hasTouchEvents: hasTouchEvents,
+ injectCSS: injectCSS,
+ escape: escape,
+ isFullScreen: isFullScreen,
+ toggleFullScreen: toggleFullScreen,
+ lockOrientation: lockOrientation,
+ triggerEvent: triggerEvent
+};
+
+};
},{}],3:[function(require,module,exports){
+'use strict';
+
var settings_local = {};
try {
settings_local = require('./settings_local.js');
} catch (e) {
}
+
var settings = {
- API_URL: 'http://localhost:5000', // This URL to the Galaxy API. No trailing slash.
+ API_URL: 'http://localhost:5000', // Galaxy API URL. No trailing slash.
DEBUG: false,
PEERJS_KEY: '', // Sign up for a key at http://peerjs.com/peerserver
VERSION: '0.0.1' // Version of the `gamepad.js` script
};
-for (var key in settings_local) {
- settings[key] = settings_local[key];
-}
+// Override each default setting with user-defined setting.
+Object.keys(settings_local).forEach(function (key) {
+ settings[key] = settings_local[key];
+});
+
module.exports = settings;
@@ -464,4 +482,5 @@ module.exports = {
PEERJS_KEY: 'rovu5xmqo69wwmi'
};
-},{}]
\ No newline at end of file
+},{}]},{},[1])
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9vcHQvZ2FsYXh5LmpzLW1vYmlsZS1nYW1lcGFkL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIuL3NyYy9qcy9jbGllbnQuanMiLCIvb3B0L2dhbGF4eS5qcy1tb2JpbGUtZ2FtZXBhZC9zcmMvanMvbGliL3V0aWxzLmpzIiwiL29wdC9nYWxheHkuanMtbW9iaWxlLWdhbWVwYWQvc3JjL2pzL3NldHRpbmdzLmpzIiwiL29wdC9nYWxheHkuanMtbW9iaWxlLWdhbWVwYWQvc3JjL2pzL3NldHRpbmdzX2xvY2FsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIihmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyB2YXIgcGVlciA9IHJlcXVpcmUoJy4vbGliL3BlZXInKTtcbi8vIHZhciBQcm9taXNlID0gcmVxdWlyZSgnLi9saWIvcHJvbWlzZS0xLjAuMCcpOyAgLy8ganNoaW50IGlnbm9yZTpsaW5lXG52YXIgc2V0dGluZ3MgPSByZXF1aXJlKCcuL3NldHRpbmdzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL2xpYi91dGlscycpO1xudmFyIGVycm9yID0gdXRpbHMuZXJyb3I7XG52YXIgdHJhY2UgPSB1dGlscy50cmFjZTtcblxuXG51dGlscy5wb2x5ZmlsbCgpO1xuXG5cbnV0aWxzLmxvY2tPcmllbnRhdGlvbignbGFuZHNjYXBlLXByaW1hcnknKTtcbmZ1bmN0aW9uIHdhbnRzQXV0b0Z1bGxTY3JlZW4oKSB7XG4gIHJldHVybiAhKCdkaXNhYmxlQXV0b0Z1bGxTY3JlZW4nIGluIGxvY2FsU3RvcmFnZSk7XG59XG5cblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBmdW5jdGlvbiAoZSkge1xuICBpZiAodXRpbHMuZmllbGRGb2N1c2VkKGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3dpdGNoIChlLmtleUNvZGUpIHtcbiAgICBjYXNlIDcwOiAgLy8gUHJlc3NpbmcgRiBzaG91bGQgdG9nZ2xlIGZ1bGwtc2NyZWVuIG1vZGUuXG4gICAgICB0cmFjZSgnVXNlciBwcmVzc2VkIFwiRlwiOyBlbnRlcmluZy9leGl0aW5nIGZ1bGxzY3JlZW4nKTtcbiAgICAgIHJldHVybiB1dGlscy50b2dnbGVGdWxsU2NyZWVuKCk7XG4gICAgY2FzZSA3ODogIC8vIFByZXNzaW5nIE5GIChyZWFsbHkganVzdCBOKSBzaG91bGQgdG9nZ2xlIGZ1bGwtc2NyZWVuIG1vZGUuXG4gICAgICB0cmFjZSgnVXNlciBwcmVzc2VkIFwiTkZcIjsgZXhpdGluZyBmdWxsc2NyZWVuIGFuZCB3aWxsIG5vdCAnICtcbiAgICAgICAgJ2F1dG9tYXRpY2FsbHkgb3BlbiBuZXh0IHRpbWUnKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5kaXNhYmxlQXV0b0Z1bGxTY3JlZW4gPSAnMSc7XG4gICAgICByZXR1cm4gdXRpbHMudG9nZ2xlRnVsbFNjcmVlbigpO1xuICB9XG59KTtcblxuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gIGlmICh1dGlscy5maWVsZEZvY3VzZWQoZSkgfHwgIXdhbnRzQXV0b0Z1bGxTY3JlZW4oKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cmFjZSgnQXV0b21hdGljYWxseSBlbnRlcmluZyBmdWxsc2NyZWVuJyk7XG4gIHV0aWxzLnRvZ2dsZUZ1bGxTY3JlZW4oKTtcbn0pO1xuXG5cbi8vIGlmIHRoZXJlJ3Mgbm90IGEgcGluLCB0ZWxsIHRoZSB1c2VyIHRvIG9wZW4gdGhlIGdhbWUgb24gYW5vdGhlciBkZXZpY2Vcbi8vIGZpcnN0LiBpbnN0ZWFkIG9mIHJlbGVnYXRpbmcgbW9iaWxlIHRvIGJlIGFsd2F5cyBhIGNvbnRyb2xsZXIsIGFsbG93IHRoZVxuLy8gZ2FtZSB0byBtaXJyb3IgdGhlIGRlc2t0b3AgKMOgIGxhIFdpaVUpLlxuXG52YXIgcGVlcklkID0gdXRpbHMuZ2V0UGVlcklkKCk7XG5cbnZhciBwZWVyID0gbmV3IHdpbmRvdy5QZWVyKCdjb250cm9sbGVyXycgKyBwZWVySWQsIHtcbiAga2V5OiBzZXR0aW5ncy5QRUVSSlNfS0VZLFxuICBkZWJ1Zzogc2V0dGluZ3MuREVCVUcgPyAzIDogMFxufSk7XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBmdW5jdGlvbiAoKSB7XG4gIHBlZXIuZGVzdHJveSgpO1xufSk7XG5cbnZhciBjb25uID0gcGVlci5jb25uZWN0KHBlZXJJZCk7XG5cbmNvbm4ub24oJ29wZW4nLCBmdW5jdGlvbiAoKSB7XG4gIHRyYWNlKCdNeSBwZWVyIElEOiAnICsgcGVlci5pZCk7XG4gIHRyYWNlKCdNeSBjb25uZWN0aW9uIElEOiAnICsgY29ubi5pZCk7XG5cbiAgY29ubi5vbignZGF0YScsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdHJhY2UoJ1JlY2VpdmVkOiAnICsgZGF0YSk7XG4gIH0pO1xuXG4gIGNvbm4ub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIGVycm9yKGVyci5tZXNzYWdlKTtcbiAgfSk7XG59KTtcblxuXG5mdW5jdGlvbiBzZW5kKG1zZykge1xuICBpZiAoc2V0dGluZ3MuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZygnU2VudDogJyArXG4gICAgICAodHlwZW9mIG1zZyA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShtc2cpIDogbXNnKSk7XG4gIH1cbiAgY29ubi5zZW5kKG1zZyk7XG59XG5cblxuLyoqXG4gKiBUcmFkaXRpb25hbCwgTkVTLWluc3BpcmVkIGdhbWVwYWQuXG4gKi9cbnZhciBkcGFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RwYWQnKTtcbnZhciBzZWxlY3RCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VsZWN0Jyk7XG52YXIgc3RhcnRCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3RhcnQnKTtcbnZhciBiQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2InKTtcbnZhciBhQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2EnKTtcblxuXG4vKipcbiAqIERyYXcgRC1wYWQuXG4gKi9cbnZhciBjYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHBhZC1ib2R5Jyk7XG5cbmZ1bmN0aW9uIGFuZ3VsYXJTaGFwZShjYW52YXMsIGNvb3Jkcykge1xuICB2YXIgc2hhcGUgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgdmFyIGkgPSAwO1xuICBzaGFwZS5iZWdpblBhdGgoKTtcbiAgc2hhcGUubW92ZVRvKGNvb3Jkc1swXVswXSwgY29vcmRzWzBdWzFdKTtcbiAgY29vcmRzLnNsaWNlKDEpO1xuXG4gIGZvciAoOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgc2hhcGUubGluZVRvKGNvb3Jkc1tpXVswXSwgY29vcmRzW2ldWzFdKTtcbiAgfVxuXG4gIHNoYXBlLmNsb3NlUGF0aCgpO1xuICByZXR1cm4gc2hhcGU7XG59XG5cbmZ1bmN0aW9uIGxpbmVhckZpbGwoc2hhcGUsIGNvbG9yMSwgY29sb3IyLCBjb29yZHMpIHtcbiAgdmFyIGJnID0gc2hhcGUuY3JlYXRlTGluZWFyR3JhZGllbnQoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSxcbiAgICBjb29yZHNbM10pO1xuICBiZy5hZGRDb2xvclN0b3AoMCwgY29sb3IxKTtcbiAgYmcuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMik7XG4gIHNoYXBlLmZpbGxTdHlsZSA9IGJnO1xuICBzaGFwZS5maWxsKCk7XG59XG5cbmZ1bmN0aW9uIHlTaWRlKGNhbnZhcywgeSwgeEZyb20sIHhUbykge1xuICB2YXIgc2hhcGUgPSBhbmd1bGFyU2hhcGUoY2FudmFzLCBbXG4gICAgW3ksIHhGcm9tXSxcbiAgICBbeSArIDUsIHhGcm9tICsgMy41XSxcbiAgICBbeSArIDUsIHhUbyArIDMuNV0sXG4gICAgW3ksIHhUb11cbiAgXSk7XG4gIGxpbmVhckZpbGwoc2hhcGUsICcjNjY2JywgJyMwMDAnLCBbeSwgeEZyb20sIHkgKyAxNSwgeEZyb21dKTtcbn1cblxuZnVuY3Rpb24geFNpZGUoY2FudmFzLCB4LCB5RnJvbSwgeVRvKSB7XG4gIHZhciBzaGFwZSA9IGFuZ3VsYXJTaGFwZShjYW52YXMsIFtcbiAgICBbeUZyb20sIHhdLFxuICAgIFt5RnJvbSArIDUsIHggKyAzLjVdLFxuICAgIFt5VG8gKyA1LCB4ICsgMy41XSxcbiAgICBbeVRvLCB4XVxuICBdKTtcbiAgbGluZWFyRmlsbChzaGFwZSwgJyM2NjYnLCAnIzAwMCcsIFt5RnJvbSwgeCwgeUZyb20sIHggKyAxNV0pO1xufVxuXG4vLyBEcmF3IHRoZSBzaWRlcyBmaXJzdC5cbnhTaWRlKGNhbnZhcywgNjMuNSwgMCwgMTAwKTtcbnhTaWRlKGNhbnZhcywgMTAwLCAzNi41LCA2My41KTtcbnlTaWRlKGNhbnZhcywgNjMuNSwgMCwgMzYuNSk7XG55U2lkZShjYW52YXMsIDYzLjUsIDYzLjUsIDEwMCk7XG55U2lkZShjYW52YXMsIDEwMCwgMzYuNSwgNjMuNSk7XG5cbi8vIERyYXcgdGhlIEQtcGFkLlxudmFyIHBsdXMgPSBhbmd1bGFyU2hhcGUoY2FudmFzLCBbXG4gIFswLCAzNi41XSxcbiAgWzM2LjUsIDM2LjVdLFxuICBbMzYuNSwgMF0sXG4gIFs2My41LCAwXSxcbiAgWzYzLjUsIDM2LjVdLFxuICBbMTAwLCAzNi41XSxcbiAgWzEwMCwgNjMuNV0sXG4gIFs2My41LCA2My41XSxcbiAgWzYzLjUsIDEwMF0sXG4gIFszNi41LCAxMDBdLFxuICBbMzYuNSwgNjNdLFxuICBbMCwgNjMuNV1cbl0pO1xuXG5wbHVzLmZpbGxTdHlsZSA9ICcjMWExYTFhJztcbnBsdXMuc2hhZG93Q29sb3IgPSAncmdiYSgwLDAsMCwuNiknO1xucGx1cy5zaGFkb3dCbHVyID0gMTU7XG5wbHVzLnNoYWRvd09mZnNldFggPSAyMDtcbnBsdXMuc2hhZG93T2Zmc2V0WSA9IDEwO1xucGx1cy5maWxsKCk7XG5cblxudmFyIGdhbWVwYWRTdGF0ZSA9IHtcbiAgdXA6IGZhbHNlLFxuICByaWdodDogZmFsc2UsXG4gIGRvd246IGZhbHNlLFxuICBsZWZ0OiBmYWxzZSxcbiAgc2VsZWN0OiBmYWxzZSxcbiAgc3RhcnQ6IGZhbHNlLFxuICBiOiBmYWxzZSxcbiAgYTogZmFsc2Vcbn07XG5cblxuZnVuY3Rpb24gYmluZFByZXNzKGJ1dHRvbiwgZXZlbnROYW1lLCBpc1ByZXNzZWQpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyBidXR0b24pXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gSGFuZGxlIEQtcGFkIHByZXNzZXMuXG4gICAgICBpZiAoZS50YXJnZXQgJiYgZS50YXJnZXQucGFyZW50Tm9kZSA9PT0gZHBhZCkge1xuICAgICAgICBkcGFkLmNsYXNzTGlzdC50b2dnbGUodGhpcy5pZCk7XG4gICAgICB9XG5cbiAgICAgIGdhbWVwYWRTdGF0ZVtidXR0b25dID0gaXNQcmVzc2VkO1xuICAgICAgc2VuZCh7dHlwZTogJ3N0YXRlJywgZGF0YTogZ2FtZXBhZFN0YXRlfSk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gYmluZEtleVByZXNzZXMoZXZlbnROYW1lLCBpc1ByZXNzZWQpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKHV0aWxzLmZpZWxkRm9jdXNlZChlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICBjYXNlIDM4OlxuICAgICAgICAvLyBTZW5kIGV2ZW50IG9ubHkgb25jZS5cbiAgICAgICAgaWYgKGlzUHJlc3NlZCAmJiBnYW1lcGFkU3RhdGUudXApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2FtZXBhZFN0YXRlLnVwID0gaXNQcmVzc2VkO1xuICAgICAgICBkcGFkLmNsYXNzTmFtZSA9IGlzUHJlc3NlZCA/ICd1cCcgOiAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM5OlxuICAgICAgICBpZiAoaXNQcmVzc2VkICYmIGdhbWVwYWRTdGF0ZS5yaWdodCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnYW1lcGFkU3RhdGUucmlnaHQgPSBpc1ByZXNzZWQ7XG4gICAgICAgIGRwYWQuY2xhc3NOYW1lID0gaXNQcmVzc2VkID8gJ3JpZ2h0JyA6ICcnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDA6XG4gICAgICAgIGlmIChpc1ByZXNzZWQgJiYgZ2FtZXBhZFN0YXRlLmRvd24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2FtZXBhZFN0YXRlLmRvd24gPSBpc1ByZXNzZWQ7XG4gICAgICAgIGRwYWQuY2xhc3NOYW1lID0gaXNQcmVzc2VkID8gJ2Rvd24nIDogJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzNzpcbiAgICAgICAgaWYgKGlzUHJlc3NlZCAmJiBnYW1lcGFkU3RhdGUubGVmdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnYW1lcGFkU3RhdGUubGVmdCA9IGlzUHJlc3NlZDtcbiAgICAgICAgZHBhZC5jbGFzc05hbWUgPSBpc1ByZXNzZWQgPyAnbGVmdCcgOiAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEzOlxuICAgICAgICBpZiAoaXNQcmVzc2VkICYmIGdhbWVwYWRTdGF0ZS5zdGFydCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnYW1lcGFkU3RhdGUuc3RhcnQgPSBpc1ByZXNzZWQ7XG4gICAgICAgIHN0YXJ0QnV0dG9uLmRhdGFzZXQucHJlc3NlZCA9ICtpc1ByZXNzZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2NTpcbiAgICAgICAgaWYgKGlzUHJlc3NlZCAmJiBnYW1lcGFkU3RhdGUuYSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnYW1lcGFkU3RhdGUuYSA9IGlzUHJlc3NlZDtcbiAgICAgICAgYUJ1dHRvbi5kYXRhc2V0LnByZXNzZWQgPSAraXNQcmVzc2VkO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjY6XG4gICAgICAgIGlmIChpc1ByZXNzZWQgJiYgZ2FtZXBhZFN0YXRlLmIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2FtZXBhZFN0YXRlLmIgPSBpc1ByZXNzZWQ7XG4gICAgICAgIGJCdXR0b24uZGF0YXNldC5wcmVzc2VkID0gK2lzUHJlc3NlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoZS5zaGlmdEtleSB8fCAoIWlzUHJlc3NlZCAmJiBnYW1lcGFkU3RhdGUuc2VsZWN0KSkge1xuICAgICAgICAgIC8vIElmIHRoZSBTaGlmdCBrZXkgd2FzIHByZXNzZWQgb3IgdW5wcmVzc2VkLCB0b2dnbGUgaXRzIHN0YXRlLlxuICAgICAgICAgIGdhbWVwYWRTdGF0ZS5zZWxlY3QgPSBpc1ByZXNzZWQ7XG4gICAgICAgICAgc2VsZWN0QnV0dG9uLmRhdGFzZXQucHJlc3NlZCA9ICtpc1ByZXNzZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIChpLmUuLCBhbnkgb3RoZXIga2V5IHdhcyBwcmVzc2VkKSwgYmFpbC5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZW5kKGdhbWVwYWRTdGF0ZSk7XG4gIH0pO1xufVxuXG5cbk9iamVjdC5rZXlzKGdhbWVwYWRTdGF0ZSkuZm9yRWFjaChmdW5jdGlvbiAoYnV0dG9uKSB7XG4gIGlmICh1dGlscy5oYXNUb3VjaEV2ZW50cygpKSB7XG4gICAgYmluZFByZXNzKGJ1dHRvbiwgJ3RvdWNoc3RhcnQnLCB0cnVlKTtcbiAgICBiaW5kUHJlc3MoYnV0dG9uLCAndG91Y2hlbmQnLCBmYWxzZSk7XG4gIH0gZWxzZSB7XG4gICAgYmluZFByZXNzKGJ1dHRvbiwgJ21vdXNlZG93bicsIHRydWUpO1xuICAgIGJpbmRQcmVzcyhidXR0b24sICdtb3VzZXVwJywgZmFsc2UpO1xuICB9XG59KTtcblxuXG5iaW5kS2V5UHJlc3Nlcygna2V5ZG93bicsIHRydWUpO1xuYmluZEtleVByZXNzZXMoJ2tleXVwJywgZmFsc2UpO1xuXG5cbn0pKHdpbmRvdywgZG9jdW1lbnQpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCkge1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiB0cmFjZSh0ZXh0LCBsZXZlbCkge1xuICBjb25zb2xlW2xldmVsIHx8ICdsb2cnXShcbiAgICAod2luZG93LnBlcmZvcm1hbmNlLm5vdygpIC8gMTAwMCkudG9GaXhlZCgzKSArICc6ICcgKyB0ZXh0KTtcbn1cblxuXG5mdW5jdGlvbiBlcnJvcih0ZXh0KSB7XG4gIHJldHVybiB0cmFjZSh0ZXh0LCAnZXJyb3InKTtcbn1cblxuXG5mdW5jdGlvbiB3YXJuKHRleHQpIHtcbiAgcmV0dXJuIHRyYWNlKHRleHQsICd3YXJuJyk7XG59XG5cblxuZnVuY3Rpb24gcG9seWZpbGwoKSB7XG4gIGlmICghKCdwZXJmb3JtYW5jZScgaW4gd2luZG93KSkge1xuICAgIHdpbmRvdy5wZXJmb3JtYW5jZSA9IHtcbiAgICAgIG5vdzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gK25ldyBEYXRlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGlmICgoJ29yaWdpbicgaW4gd2luZG93LmxvY2F0aW9uKSkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gPSAod2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArXG4gICAgICB3aW5kb3cubG9jYXRpb24uaG9zdCk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBnZXRQZWVySWQoKSB7XG4gIHJldHVybiAod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoJy5odG1sJykgP1xuICAgIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpIDogd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnN1YnN0cigxKSk7XG59XG5cblxudmFyIEZJRUxEX0ZPQ1VTRURfVEFHUyA9IFtcbiAgJ2lucHV0JyxcbiAgJ2tleWdlbicsXG4gICdtZXRlcicsXG4gICdvcHRpb24nLFxuICAnb3V0cHV0JyxcbiAgJ3Byb2dyZXNzJyxcbiAgJ3NlbGVjdCcsXG4gICd0ZXh0YXJlYSdcbl07XG5mdW5jdGlvbiBmaWVsZEZvY3VzZWQoZSkge1xuICByZXR1cm4gRklFTERfRk9DVVNFRF9UQUdTLmluZGV4T2YoZS50YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xO1xufVxuXG5cbmZ1bmN0aW9uIGhhc1RvdWNoRXZlbnRzKCkge1xuICByZXR1cm4gKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fFxuICAgIHdpbmRvdy5Eb2N1bWVudFRvdWNoICYmIGRvY3VtZW50IGluc3RhbmNlb2Ygd2luZG93LkRvY3VtZW50VG91Y2gpO1xufVxuXG5mdW5jdGlvbiBpbmplY3RDU1Mob3B0cykge1xuICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgbGluay5ocmVmID0gb3B0cy5ocmVmO1xuICBsaW5rLm1lZGlhID0gJ2FsbCc7XG4gIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICBsaW5rLnR5cGUgPSAndGV4dC9jc3MnO1xuICBPYmplY3Qua2V5cyhvcHRzIHx8IHt9KS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgbGlua1twcm9wXSA9IG9wdHNbcHJvcF07XG4gIH0pO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJykuYXBwZW5kQ2hpbGQobGluayk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZSh0ZXh0KSB7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csICcmIzM5OycpXG4gICAgICAgICAgICAgLnJlcGxhY2UoL1wiL2csICcmIzM0OycpO1xufVxuXG5mdW5jdGlvbiBpc0Z1bGxTY3JlZW4oKSB7XG4gIHJldHVybiAoIWRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50ICYmICAvLyBzdGFuZGFyZCBtZXRob2RcbiAgICAhZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgJiZcbiAgICAhZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQgJiZcbiAgICAhZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudCk7ICAvLyB2ZW5kb3ItcHJlZml4ZWQgbWV0aG9kc1xufVxuXG5mdW5jdGlvbiB0b2dnbGVGdWxsU2NyZWVuKCkge1xuICBpZiAoaXNGdWxsU2NyZWVuKCkpIHtcbiAgICB0cmFjZSgnRW50ZXJpbmcgZnVsbCBzY3JlZW4nKTtcbiAgICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5tb3pSZXF1ZXN0RnVsbFNjcmVlbikge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm1velJlcXVlc3RGdWxsU2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbihcbiAgICAgICAgRWxlbWVudC5BTExPV19LRVlCT0FSRF9JTlBVVCk7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm1zUmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdHJhY2UoJ0V4aXRpbmcgZnVsbCBzY3JlZW4nKTtcbiAgICBpZiAoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKSB7XG4gICAgICBkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbikge1xuICAgICAgZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtcbiAgICB9XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBsb2NrT3JpZW50YXRpb24ob3JpZW50YXRpb24pIHtcbiAgdmFyIGxvID0gKHdpbmRvdy5zY3JlZW4uTG9ja09yaWVudGF0aW9uIHx8XG4gICAgd2luZG93LnNjcmVlbi5tb3pMb2NrT3JpZW50YXRpb24gfHxcbiAgICB3aW5kb3cuc2NyZWVuLndlYmtpdExvY2tPcmllbnRhdGlvbiB8fFxuICAgIHdpbmRvdy5zY3JlZW4ubXNMb2NrT3JpZW50YXRpb24pO1xuICBpZiAoIWxvKSB7XG4gICAgcmV0dXJuIHdhcm4oJ09yaWVudGF0aW9uIGNvdWxkIG5vdCBiZSBsb2NrZWQnKTtcbiAgfVxuXG4gIHJldHVybiBsbyhvcmllbnRhdGlvbik7XG59XG5cblxuZnVuY3Rpb24gdHJpZ2dlckV2ZW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKTtcbiAgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIHRydWUsIHRydWUpO1xuICBldmVudC5ldmVudE5hbWUgPSB0eXBlO1xuICAoZG9jdW1lbnQuYm9keSB8fCB3aW5kb3cpLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufVxuXG5cbnJldHVybiB7XG4gIHRyYWNlOiB0cmFjZSxcbiAgZXJyb3I6IGVycm9yLFxuICB3YXJuOiB3YXJuLFxuICBwb2x5ZmlsbDogcG9seWZpbGwsXG4gIGdldFBlZXJJZDogZ2V0UGVlcklkLFxuICBmaWVsZEZvY3VzZWQ6IGZpZWxkRm9jdXNlZCxcbiAgaGFzVG91Y2hFdmVudHM6IGhhc1RvdWNoRXZlbnRzLFxuICBpbmplY3RDU1M6IGluamVjdENTUyxcbiAgZXNjYXBlOiBlc2NhcGUsXG4gIGlzRnVsbFNjcmVlbjogaXNGdWxsU2NyZWVuLFxuICB0b2dnbGVGdWxsU2NyZWVuOiB0b2dnbGVGdWxsU2NyZWVuLFxuICBsb2NrT3JpZW50YXRpb246IGxvY2tPcmllbnRhdGlvbixcbiAgdHJpZ2dlckV2ZW50OiB0cmlnZ2VyRXZlbnRcbn07XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzZXR0aW5nc19sb2NhbCA9IHt9O1xudHJ5IHtcbiAgc2V0dGluZ3NfbG9jYWwgPSByZXF1aXJlKCcuL3NldHRpbmdzX2xvY2FsLmpzJyk7XG59IGNhdGNoIChlKSB7XG59XG5cblxudmFyIHNldHRpbmdzID0ge1xuICBBUElfVVJMOiAnaHR0cDovL2xvY2FsaG9zdDo1MDAwJywgIC8vIEdhbGF4eSBBUEkgVVJMLiBObyB0cmFpbGluZyBzbGFzaC5cbiAgREVCVUc6IGZhbHNlLFxuICBQRUVSSlNfS0VZOiAnJywgIC8vIFNpZ24gdXAgZm9yIGEga2V5IGF0IGh0dHA6Ly9wZWVyanMuY29tL3BlZXJzZXJ2ZXJcbiAgVkVSU0lPTjogJzAuMC4xJyAgLy8gVmVyc2lvbiBvZiB0aGUgYGdhbWVwYWQuanNgIHNjcmlwdFxufTtcblxuLy8gT3ZlcnJpZGUgZWFjaCBkZWZhdWx0IHNldHRpbmcgd2l0aCB1c2VyLWRlZmluZWQgc2V0dGluZy5cbk9iamVjdC5rZXlzKHNldHRpbmdzX2xvY2FsKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcblx0c2V0dGluZ3Nba2V5XSA9IHNldHRpbmdzX2xvY2FsW2tleV07XG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHRpbmdzO1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIERFQlVHOiB0cnVlLFxuICBQRUVSSlNfS0VZOiAncm92dTV4bXFvNjl3d21pJ1xufTtcbiJdfQ==
diff --git a/dist/js/gamepad-client.min.js b/dist/js/gamepad-client.min.js
index fa6f6b3..9a3e944 100755
--- a/dist/js/gamepad-client.min.js
+++ b/dist/js/gamepad-client.min.js
@@ -1 +1 @@
-!function e(t,n,r){function o(l,u){if(!n[l]){if(!t[l]){var i="function"==typeof require&&require;if(!u&&i)return i(l,!0);if(c)return c(l,!0);var s=new Error("Cannot find module '"+l+"'");throw s.code="MODULE_NOT_FOUND",s}var a=n[l]={exports:{}};t[l][0].call(a.exports,function(e){var n=t[l][1][e];return o(n?n:e)},a,a.exports,e,t,n,r)}return n[l].exports}for(var c="function"==typeof require&&require,l=0;l
'+c+"
",d=new r({id:"pairing-screen",classes:"slim",title:"Pair your mobile phone",content:u},!0);n.setTimeout(function(){d.open()},150),["https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700","/css/modal.css"].forEach(function(e){s.injectCSS({href:e})}),i.peerConnect(e).then(function(e){console.log("Peer connected"),d.close(),t(e)})}).catch(console.error.bind(console))})},i._updateState=function(e){Object.keys(e||{}).forEach(function(t){!this.state[t]&&e[t]?(i._emit("buttondown",t),i._emit("buttondown."+t,t)):this.state[t]&&!e[t]&&(i._emit("buttonup",t),i._emit("buttonup."+t,t))}.bind(this))},i.hidePairingScreen=function(){r.closeAll()},i._emit=function(e,t){(this.listeners[e]||[]).forEach(function(e){e.apply(e,[t])})},i._bind=function(e,t){return"undefined"==typeof this.listeners[event]&&(this.listeners[event]=[]),this.listeners[event].push(t),this},Gamepad.prototype.unbind=function(e,t){return"undefined"==typeof e?(this.listeners={},void 0):"undefined"==typeof t?(this.listeners[e]=[],void 0):"undefined"==typeof this.listeners[e]?!1:(this.listeners[e].forEach(function(n,o){return n===t?(this.listeners[e].splice(o,1),!0):void 0}),!1)},i.buttons={a:{clicked:i._bind}},i.version=c.VERSION;var a=n.location.origin,d=o.querySelector("[data-galaxy-origin]");d&&(i.galaxyOrigin=d.dataset.galaxyOrigin),t.exports=i}(window,document)},{"./lib/modal":2,"./lib/utils":3,"./settings":4}],2:[function(e,t){function n(e,t){Object.keys(e).forEach(function(t){this[t]=e[t]}.bind(this)),t&&this.inject()}var o=e("./utils");n.closeAll=n.prototype.close=function(){var e=document.querySelector(".md-show");e&&e.classList.remove("md-show"),setTimeout(function(){document.body.classList.remove("galaxy-overlayed")},150)},n.injectOverlay=function(){if(!document.querySelector(".md-overlay")){var e=document.createElement("div");e.className="md-overlay",document.body.appendChild(e)}},n.prototype.html=function(){var e=document.createElement("div");return e.id="modal-"+this.id,e.className="md-modal md-effect-1 "+(this.classes||""),e.style.display="none",e.innerHTML='",e},n.prototype.inject=function(){return n.injectOverlay(),this.el=this.html(),this.el.style.display="block",document.body.appendChild(this.el),document.body.classList.add("galaxy-overlayed"),this.el},n.prototype.open=function(){this.el.classList.add("md-show")},t.exports=n},{"./utils":3}],3:[function(e,t){function n(e,t){console[t||"log"]((window.performance.now()/1e3).toFixed(3)+": "+e)}function o(e){return n(e,"error")}function i(e){return n(e,"warn")}function r(e){"performance"in e||(e.performance={now:function(){return+new Date}}),"origin"in e.location&&(e.location.origin=e.location.protocol+"//"+e.location.host)}function c(){return window.location.pathname.indexOf(".html")?window.location.search.substr(1):window.location.pathname.substr(1)}function s(e){return-1!==h.indexOf(e.target.nodeName.toLowerCase())}function l(){return"ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch}function u(e){var t=document.createElement("link");t.href=e.href,t.media="all",t.rel="stylesheet",t.type="text/css",Object.keys(e||{}).forEach(function(n){t[n]=e[n]}),document.querySelector("head").appendChild(t)}function a(e){return e?e.replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):e}function d(){return!(document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement)}function m(){d()?(n("Entering full screen"),document.documentElement.requestFullscreen?document.documentElement.requestFullscreen():document.documentElement.mozRequestFullScreen?document.documentElement.mozRequestFullScreen():document.documentElement.webkitRequestFullscreen?document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT):document.documentElement.msRequestFullscreen&&document.documentElement.msRequestFullscreen()):(n("Exiting full screen"),document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.msExitFullscreen&&document.msExitFullscreen())}function f(){var e=screen.LockOrientation||screen.mozLockOrientation||screen.webkitLockOrientation||screen.msLockOrientation;return e?(e(orientation),void 0):i("Orientation could not be locked")}function p(e){var t=document.createEvent("HTMLEvents");t.initEvent(e,!0,!0),t.eventName=e,(document.body||window).dispatchEvent(t)}var h=["input","keygen","meter","option","output","progress","select","textarea"];t.exports.trace=n,t.exports.error=o,t.exports.warn=i,t.exports.polyfill=r,t.exports.getPeerId=c,t.exports.fieldFocused=s,t.exports.hasTouchEvents=l,t.exports.injectCSS=u,t.exports.escape=a,t.exports.isFullScreen=d,t.exports.toggleFullScreen=m,t.exports.lockOrientation=f,t.exports.triggerEvent=p},{}],4:[function(e,t){var n={};try{n=e("./settings_local.js")}catch(o){}var i={API_URL:"http://localhost:5000",DEBUG:!1,PEERJS_KEY:"",VERSION:"0.0.1"};for(var r in n)i[r]=n[r];t.exports=i},{"./settings_local.js":5}],5:[function(e,t){t.exports={DEBUG:!0,PEERJS_KEY:"rovu5xmqo69wwmi"}},{}]},{},[1])(1)}); \ No newline at end of file +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;"undefined"!=typeof window?t=window:"undefined"!=typeof global?t=global:"undefined"!=typeof self&&(t=self),t.gamepad=e()}}(function(){return function e(t,n,o){function i(s,c){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!c&&l)return l(s,!0);if(r)return r(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var a=n[s]={exports:{}};t[s][0].call(a.exports,function(e){var n=t[s][1][e];return i(n?n:e)},a,a.exports,e,t,n,o)}return n[s].exports}for(var r="function"==typeof require&&require,s=0;s'+s+"
",d=new r({id:"pairing-screen",classes:"slim",title:"Pair your mobile phone",content:u},!0);n.setTimeout(function(){d.open()},150),["https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700","/css/modal.css"].forEach(function(e){c.injectCSS({href:e})}),i.peerConnect(e).then(function(e){console.log("Peer connected"),d.close(),t(e)})}).catch(console.error.bind(console))})},i._updateState=function(e){Object.keys(e||{}).forEach(function(t){!this.state[t]&&e[t]?(i._emit("buttondown",t),i._emit("buttondown."+t,t)):this.state[t]&&!e[t]&&(i._emit("buttonup",t),i._emit("buttonup."+t,t))}.bind(this))},i.hidePairingScreen=function(){r.closeAll()},i._emit=function(e,t){(this.listeners[e]||[]).forEach(function(e){e.apply(e,[t])})},i._bind=function(e,t){return"undefined"==typeof this.listeners[event]&&(this.listeners[event]=[]),this.listeners[event].push(t),this},i.prototype.unbind=function(e,t){return"undefined"==typeof e?(this.listeners={},void 0):"undefined"==typeof t?(this.listeners[e]=[],void 0):"undefined"==typeof this.listeners[e]?!1:(this.listeners[e].forEach(function(n,o){return n===t?(this.listeners[e].splice(o,1),!0):void 0}),!1)},i.buttons={a:{clicked:i._bind}},i.version=s.VERSION;var a=n.location.origin,d=o.querySelector("[data-galaxy-origin]");d&&(i.galaxyOrigin=d.dataset.galaxyOrigin),t.exports=i}(window,document)},{"./lib/modal":2,"./lib/utils":3,"./settings":4}],2:[function(e,t){t.exports=function(t,n){"use strict";function o(e,t){Object.keys(e).forEach(function(t){this[t]=e[t]}.bind(this)),t&&this.inject()}var i=e("./utils");return o.closeAll=o.prototype.close=function(){var e=n.querySelector(".md-show");e&&e.classList.remove("md-show"),setTimeout(function(){n.body.classList.remove("galaxy-overlayed")},150)},o.injectOverlay=function(){if(!n.querySelector(".md-overlay")){var e=n.createElement("div");e.className="md-overlay",n.body.appendChild(e)}},o.prototype.html=function(){var e=n.createElement("div");return e.id="modal-"+this.id,e.className="md-modal md-effect-1 "+(this.classes||""),e.style.display="none",e.innerHTML='",e},o.prototype.inject=function(){return o.injectOverlay(),this.el=this.html(),this.el.style.display="block",n.body.appendChild(this.el),n.body.classList.add("galaxy-overlayed"),this.el},o.prototype.open=function(){this.el.classList.add("md-show")},o}},{"./utils":3}],3:[function(e,t){t.exports=function(e,t){"use strict";function n(t,n){console[n||"log"]((e.performance.now()/1e3).toFixed(3)+": "+t)}function o(e){return n(e,"error")}function i(e){return n(e,"warn")}function r(){"performance"in e||(e.performance={now:function(){return+new Date}}),"origin"in e.location&&(e.location.origin=e.location.protocol+"//"+e.location.host)}function s(){return e.location.pathname.indexOf(".html")?e.location.search.substr(1):e.location.pathname.substr(1)}function c(e){return-1!==h.indexOf(e.target.nodeName.toLowerCase())}function l(){return"ontouchstart"in e||e.DocumentTouch&&t instanceof e.DocumentTouch}function u(e){var n=t.createElement("link");n.href=e.href,n.media="all",n.rel="stylesheet",n.type="text/css",Object.keys(e||{}).forEach(function(t){n[t]=e[t]}),t.querySelector("head").appendChild(n)}function a(e){return e?e.replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):e}function d(){return!(t.fullscreenElement||t.mozFullScreenElement||t.webkitFullscreenElement||t.msFullscreenElement)}function f(){d()?(n("Entering full screen"),t.documentElement.requestFullscreen?t.documentElement.requestFullscreen():t.documentElement.mozRequestFullScreen?t.documentElement.mozRequestFullScreen():t.documentElement.webkitRequestFullscreen?t.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT):t.documentElement.msRequestFullscreen&&t.documentElement.msRequestFullscreen()):(n("Exiting full screen"),t.exitFullscreen?t.exitFullscreen():t.mozCancelFullScreen?t.mozCancelFullScreen():t.webkitExitFullscreen?t.webkitExitFullscreen():t.msExitFullscreen&&t.msExitFullscreen())}function p(t){var n=e.screen.LockOrientation||e.screen.mozLockOrientation||e.screen.webkitLockOrientation||e.screen.msLockOrientation;return n?n(t):i("Orientation could not be locked")}function m(n){var o=t.createEvent("HTMLEvents");o.initEvent(n,!0,!0),o.eventName=n,(t.body||e).dispatchEvent(o)}var h=["input","keygen","meter","option","output","progress","select","textarea"];return{trace:n,error:o,warn:i,polyfill:r,getPeerId:s,fieldFocused:c,hasTouchEvents:l,injectCSS:u,escape:a,isFullScreen:d,toggleFullScreen:f,lockOrientation:p,triggerEvent:m}}},{}],4:[function(e,t){"use strict";var n={};try{n=e("./settings_local.js")}catch(o){}var i={API_URL:"http://localhost:5000",DEBUG:!1,PEERJS_KEY:"",VERSION:"0.0.1"};Object.keys(n).forEach(function(e){i[e]=n[e]}),t.exports=i},{"./settings_local.js":5}],5:[function(e,t){t.exports={DEBUG:!0,PEERJS_KEY:"rovu5xmqo69wwmi"}},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/src/js/client.js b/src/js/client.js index e0711b1..05ab5df 100644 --- a/src/js/client.js +++ b/src/js/client.js @@ -9,7 +9,7 @@ var error = utils.error; var trace = utils.trace; -utils.polyfill(window); +utils.polyfill(); utils.lockOrientation('landscape-primary'); @@ -28,8 +28,8 @@ document.addEventListener('keyup', function (e) { trace('User pressed "F"; entering/exiting fullscreen'); return utils.toggleFullScreen(); case 78: // Pressing NF (really just N) should toggle full-screen mode. - trace('User pressed "NF"; exiting fullscreen and will not automatically ' + - 'open next time'); + trace('User pressed "NF"; exiting fullscreen and will not ' + + 'automatically open next time'); localStorage.disableAutoFullScreen = '1'; return utils.toggleFullScreen(); } @@ -51,7 +51,7 @@ document.addEventListener('click', function (e) { var peerId = utils.getPeerId(); -var peer = new Peer('controller_' + peerId, { +var peer = new window.Peer('controller_' + peerId, { key: settings.PEERJS_KEY, debug: settings.DEBUG ? 3 : 0 }); @@ -78,7 +78,8 @@ conn.on('open', function () { function send(msg) { if (settings.DEBUG) { - console.log('Sent: ' + (typeof msg === 'object' ? JSON.stringify(msg) : msg)); + console.log('Sent: ' + + (typeof msg === 'object' ? JSON.stringify(msg) : msg)); } conn.send(msg); } @@ -115,7 +116,8 @@ function angularShape(canvas, coords) { } function linearFill(shape, color1, color2, coords) { - var bg = shape.createLinearGradient(coords[0], coords[1], coords[2], coords[3]); + var bg = shape.createLinearGradient(coords[0], coords[1], coords[2], + coords[3]); bg.addColorStop(0, color1); bg.addColorStop(1, color2); shape.fillStyle = bg; @@ -186,15 +188,16 @@ var gamepadState = { function bindPress(button, eventName, isPressed) { - document.querySelector('#' + button).addEventListener(eventName, function (e) { - // Handle D-pad presses. - if (e.target && e.target.parentNode === dpad) { - dpad.classList.toggle(this.id); - } + document.querySelector('#' + button) + .addEventListener(eventName, function (e) { + // Handle D-pad presses. + if (e.target && e.target.parentNode === dpad) { + dpad.classList.toggle(this.id); + } - gamepadState[button] = isPressed; - send({type: 'state', data: gamepadState}); - }); + gamepadState[button] = isPressed; + send({type: 'state', data: gamepadState}); + }); } diff --git a/src/js/host.js b/src/js/host.js index 92a1922..57d6497 100644 --- a/src/js/host.js +++ b/src/js/host.js @@ -3,14 +3,14 @@ // var peer = require('./lib/peer'); // var Promise = require('./lib/promise-1.0.0.js'); // jshint ignore:line -var Modal = require('./lib/modal'); +var Modal = require('./lib/modal')(window, document); var settings = require('./settings'); -var utils = require('./lib/utils'); +var utils = require('./lib/utils')(window, document); var error = utils.error; var trace = utils.trace; -utils.polyfill(window); +utils.polyfill(); /** @@ -39,12 +39,12 @@ gamepad.state = {}; * @memberOf gamepad */ gamepad.peerHandshake = function (peerId) { - return new Promise(function (resolve, reject) { + return new Promise(function (resolve) { if (!peerId) { peerId = utils.getPeerId(); // The host ID. } - var peer = new Peer(peerId, { + var peer = new window.Peer(peerId, { key: settings.PEERJS_KEY, debug: settings.DEBUG ? 3 : 0 }); @@ -78,11 +78,13 @@ gamepad.peerConnect = function (peer) { gamepad._updateState(data.data); break; default: - console.warn('WebRTC message received of unknown type: "' + data.type + '"'); + console.warn( + 'WebRTC message received of unknown type: "' + data.type + '"'); break; } - trace('Received: ' + (typeof data === 'object' ? JSON.stringify(data) : '')); + trace('Received: ' + + (typeof data === 'object' ? JSON.stringify(data) : '')); }); conn.on('error', function (err) { @@ -109,16 +111,20 @@ gamepad.pair = function (peerId) { return new Promise(function (resolve) { return gamepad.peerHandshake(peerId).then(function (peer) { - var pairId = peer.id; // This should be the same as `peerId`, but this comes from PeerJS, which is the source of truth. + // `pairId` should be the same as `peerId`, + // but `peer.id` is the source of truth. + var pairId = peer.id; var pairIdEsc = encodeURIComponent(pairId); var pairUrl = galaxyOrigin + '/client.html?' + pairIdEsc; // Update the querystring in the address bar. - window.history.replaceState(null, null, window.location.pathname + '?' + pairIdEsc); + window.history.replaceState(null, null, + window.location.pathname + '?' + pairIdEsc); var content = ( '' ); @@ -219,7 +225,7 @@ gamepad._bind = function (eventName, listener) { * @param {Function} [listener] (Optional) The listener function to remove. * @return {Boolean} Was unbinding the listener successful. */ -Gamepad.prototype.unbind = function (eventName, listener) { +gamepad.prototype.unbind = function (eventName, listener) { // Remove everything for all event types. if (typeof eventName === 'undefined') { this.listeners = {}; diff --git a/src/js/lib/modal.js b/src/js/lib/modal.js index 533701c..a120ce3 100644 --- a/src/js/lib/modal.js +++ b/src/js/lib/modal.js @@ -1,3 +1,6 @@ +module.exports = function (window, document) { +'use strict'; + var utils = require('./utils'); @@ -65,4 +68,6 @@ Modal.prototype.open = function () { }; -module.exports = Modal; +return Modal; + +}; diff --git a/src/js/lib/utils.js b/src/js/lib/utils.js index c61df42..b64c783 100644 --- a/src/js/lib/utils.js +++ b/src/js/lib/utils.js @@ -1,5 +1,9 @@ +module.exports = function (window, document) { +'use strict'; + function trace(text, level) { - console[level || 'log']((window.performance.now() / 1000).toFixed(3) + ': ' + text); + console[level || 'log']( + (window.performance.now() / 1000).toFixed(3) + ': ' + text); } @@ -13,17 +17,18 @@ function warn(text) { } -function polyfill(win) { - if (!('performance' in win)) { - win.performance = { +function polyfill() { + if (!('performance' in window)) { + window.performance = { now: function () { return +new Date(); } }; } - if (('origin' in win.location)) { - win.location.origin = win.location.protocol + '//' + win.location.host; + if (('origin' in window.location)) { + window.location.origin = (window.location.protocol + '//' + + window.location.host); } } @@ -51,7 +56,7 @@ function fieldFocused(e) { function hasTouchEvents() { return ('ontouchstart' in window || - window.DocumentTouch && document instanceof DocumentTouch); + window.DocumentTouch && document instanceof window.DocumentTouch); } function injectCSS(opts) { @@ -92,7 +97,8 @@ function toggleFullScreen() { } else if (document.documentElement.mozRequestFullScreen) { document.documentElement.mozRequestFullScreen(); } else if (document.documentElement.webkitRequestFullscreen) { - document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); + document.documentElement.webkitRequestFullscreen( + Element.ALLOW_KEYBOARD_INPUT); } else if (document.documentElement.msRequestFullscreen) { document.documentElement.msRequestFullscreen(); } @@ -111,16 +117,16 @@ function toggleFullScreen() { } -function lockOrientation() { - var lo = (screen.LockOrientation || - screen.mozLockOrientation || - screen.webkitLockOrientation || - screen.msLockOrientation); +function lockOrientation(orientation) { + var lo = (window.screen.LockOrientation || + window.screen.mozLockOrientation || + window.screen.webkitLockOrientation || + window.screen.msLockOrientation); if (!lo) { return warn('Orientation could not be locked'); } - lo(orientation); + return lo(orientation); } @@ -132,16 +138,20 @@ function triggerEvent(type) { } -module.exports.trace = trace; -module.exports.error = error; -module.exports.warn = warn; -module.exports.polyfill = polyfill; -module.exports.getPeerId = getPeerId; -module.exports.fieldFocused = fieldFocused; -module.exports.hasTouchEvents = hasTouchEvents; -module.exports.injectCSS = injectCSS; -module.exports.escape = escape; -module.exports.isFullScreen = isFullScreen; -module.exports.toggleFullScreen = toggleFullScreen; -module.exports.lockOrientation = lockOrientation; -module.exports.triggerEvent = triggerEvent; +return { + trace: trace, + error: error, + warn: warn, + polyfill: polyfill, + getPeerId: getPeerId, + fieldFocused: fieldFocused, + hasTouchEvents: hasTouchEvents, + injectCSS: injectCSS, + escape: escape, + isFullScreen: isFullScreen, + toggleFullScreen: toggleFullScreen, + lockOrientation: lockOrientation, + triggerEvent: triggerEvent +}; + +}; diff --git a/src/js/settings.js b/src/js/settings.js index 07fc72e..f0a710b 100644 --- a/src/js/settings.js +++ b/src/js/settings.js @@ -1,18 +1,23 @@ +'use strict'; + var settings_local = {}; try { settings_local = require('./settings_local.js'); } catch (e) { } + var settings = { - API_URL: 'http://localhost:5000', // This URL to the Galaxy API. No trailing slash. + API_URL: 'http://localhost:5000', // Galaxy API URL. No trailing slash. DEBUG: false, PEERJS_KEY: '', // Sign up for a key at http://peerjs.com/peerserver VERSION: '0.0.1' // Version of the `gamepad.js` script }; -for (var key in settings_local) { - settings[key] = settings_local[key]; -} +// Override each default setting with user-defined setting. +Object.keys(settings_local).forEach(function (key) { + settings[key] = settings_local[key]; +}); + module.exports = settings;