'use strict'; var IO; var LESS_THAN = //g, AMPERSAND = /&/g; function sanitize (s) { if (s) return s.replace(LESS_THAN, '<').replace(GREATER_THAN, '>').replace(AMPERSAND, '&'); return ""; } function sanitizeJSON (json) { try { var data = JSON.parse(sanitize(json)); return data; } catch (SyntaxError) { console.log('Invalid JSON: ' + json); return false; } } function Grid(){ var base = this; var tempo = 125; var pattern = [ [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ]; function init(){ bind(); } function bind(){ } base.getState = function(){ return { 'pattern': pattern, 'tempo': tempo } } base.setNote = function(data){ if (data.step < pattern.length && data.channel < pattern[data.step].length) { var state = data.state == 1 ? 1 : 0; pattern[data.step][data.channel] = state; } } init(); } function Connection (socket) { var base = this; function init(){ bind(); } function bind(){ socket.on('event-join', join); socket.on('event-mouse', mouse); socket.on('event-chat', chat); socket.on('event-note', note); socket.on('event-tempo', tempo); socket.on('disconnect', disconnect); } function join(json){ socket.broadcast.emit("event-join", json); socket.emit("event-grid", grid.getState()); } function mouse(json){ socket.broadcast.emit("event-mouse", json); } function chat(json){ socket.broadcast.emit("event-chat", json); } function note(json){ var data = sanitizeJSON(json); if (data) { grid.setNote(data); socket.broadcast.emit("event-note", data); } } function tempo(json){ socket.broadcast.emit("event-tempo", json); } function disconnect(json){ base = null; } init(); } var grid = new Grid (); exports.connect = function(io, socket) { IO = IO || io; var user = new Connection (socket); };