// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. // See License.txt for license information. var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); var UserStore = require('./user_store.jsx') var EventEmitter = require('events').EventEmitter; var assign = require('object-assign'); var client = require('../utils/client.jsx'); var Constants = require('../utils/constants.jsx'); var ActionTypes = Constants.ActionTypes; var CHANGE_EVENT = 'change'; var conn; var SocketStore = assign({}, EventEmitter.prototype, { initialize: function(self) { if (!UserStore.getCurrentId()) return; if (!self) self = this; self.setMaxListeners(0); if (window["WebSocket"] && !conn) { var protocol = window.location.protocol == "https:" ? "wss://" : "ws://"; var port = window.location.protocol == "https:" ? ":8443" : ""; var conn_url = protocol + location.host + port + "/api/v1/websocket"; console.log("connecting to " + conn_url); conn = new WebSocket(conn_url); conn.onclose = function(evt) { console.log("websocket closed"); console.log(evt); conn = null; setTimeout(function(){self.initialize(self)}, 3000); }; conn.onerror = function(evt) { console.log("websocket error"); console.log(evt); }; conn.onmessage = function(evt) { AppDispatcher.handleServerAction({ type: ActionTypes.RECIEVED_MSG, msg: JSON.parse(evt.data) }); }; } }, emitChange: function(msg) { this.emit(CHANGE_EVENT, msg); }, addChangeListener: function(callback) { this.on(CHANGE_EVENT, callback); }, removeChangeListener: function(callback) { this.removeListener(CHANGE_EVENT, callback); }, sendMessage: function (msg) { if (conn && conn.readyState === WebSocket.OPEN) { conn.send(JSON.stringify(msg)); } else if (!conn || conn.readyState === WebSocket.Closed) { conn = null; this.initialize(); } } }); SocketStore.dispatchToken = AppDispatcher.register(function(payload) { var action = payload.action; switch(action.type) { case ActionTypes.RECIEVED_MSG: SocketStore.emitChange(action.msg); break; default: } }); SocketStore.initialize(); module.exports = SocketStore;