|
|
- define(function (require) {
- // Message type constants
- var msgInit = 0;
- var msgListUsers = 1;
- var msgCreateSharedActivity = 2;
- var msgListSharedActivities = 3;
- var msgJoinSharedActivity = 4;
- var msgLeaveSharedActivity = 5;
- var msgOnConnectionClosed = 6;
- var msgOnSharedActivityUserChanged = 7;
- var msgSendMessage = 8;
- var msgListSharedActivityUsers = 9;
-
- // Array for callbacks on each type
- var callbackArray = [];
-
- // User and shared info storage
- var userInfo = null;
- var sharedInfo = null;
-
- // Connection object
- function SugarPresence() {
- // Init callbacks
- var emptyCallback = function() {};
- var listUsersCallback = emptyCallback;
- var createSharedActivityCallback = emptyCallback;
- var listSharedActivityCallback = emptyCallback;
- var joinSharedActivity = emptyCallback;
- var leaveSharedActivity = emptyCallback;
- var onConnectionClosed = emptyCallback;
- var onSharedActivityUserChanged = emptyCallback;
- var receivedDataCallback = emptyCallback;
- var listSharedActivityUsersCallback = emptyCallback;
- callbackArray = [emptyCallback, listUsersCallback, createSharedActivityCallback,
- listSharedActivityCallback, joinSharedActivity, leaveSharedActivity,
- onConnectionClosed, onSharedActivityUserChanged, receivedDataCallback,
- listSharedActivityUsersCallback
- ];
- this.socket = null;
-
- // Handle message received from server
- this.registerMessageHandler = function() {
- // Get message content
- this.socket.onmessage = function(event) {
- // Convert message to JSON
- var edata = event.data;
- try {
- var json = JSON.parse(edata);
- } catch (e) {
- console.log('Presence API error, this doesn\'t look like a valid JSON: ', edata);
- return;
- }
-
- // Call the matching callback
- if (json.type < callbackArray.length)
- callbackArray[json.type](json.data);
- else
- console.log('Presence API error, unknown callback type:'+json.type);
- };
- }
-
- // Register user to the server
- this.registerUser = function() {
- this.socket.send(JSON.stringify(this.userInfo));
- }
-
- }
-
- // Create presence object
- var presence = new SugarPresence();
-
- // Test if connected to network
- SugarPresence.prototype.isConnected = function() {
- return (this.socket != null && this.socket.readyState == 1);
- }
-
- // Get user info
- SugarPresence.prototype.getUserInfo = function() {
- return this.userInfo;
- }
-
- // Get shared activity info
- SugarPresence.prototype.getSharedInfo = function() {
- return this.sharedInfo;
- }
-
- // Get settings
- function getSugarSettings(callback) {
- if (typeof chrome != 'undefined' && chrome.app && chrome.app.runtime) {
- chrome.storage.local.get('sugar_settings', function(values) {
- callback(values.sugar_settings);
- });
- } else {
- callback(localStorage.sugar_settings);
- }
- }
-
- // Join network function
- SugarPresence.prototype.joinNetwork = function(callback) {
- // Check WebSocket support
- if (!window.WebSocket){
- that.socket = null;
- console.log('WebSocket not supported');
- callback({code: -1}, presence);
- }
-
- // Get server settings
- var that = this;
- getSugarSettings(function (sugar_settings) {
- // Get server name
- var server = location.hostname;
- var port = 8039;
- var secure = false;
- if (sugar_settings) {
- var sugarSettings = JSON.parse(sugar_settings);
- if (sugarSettings.server) {
- server = sugarSettings.server.url.substring(sugarSettings.server.url.indexOf("://")+3);
- secure = (sugarSettings.server.url.indexOf("https://") == 0);
- var endName = server.indexOf(':')
- if (endName == -1) endName = server.indexOf('/');
- if (endName == -1) endName = server.length;
- server = server.substring(0, endName);
- port = sugarSettings.server.presence;
- }
- }
-
- // Connect to server
- if (!server) {
- that.socket = null;
- console.log('No server available');
- callback({code: -2}, presence);
- return;
- }
- that.socket = new WebSocket((secure ? 'wss://' : 'ws://')+server+':'+port);
- that.socket.onerror = function(error) {
- console.log('WebSocket Error: ' + error);
- callback(error, presence);
- that.socket = null;
- };
-
- // When connection open, send user info
- that.socket.onopen = function(event) {
- var sugarSettings = JSON.parse(sugar_settings);
- that.userInfo = {
- name: sugarSettings.name,
- networkId: sugarSettings.networkId,
- colorvalue: sugarSettings.colorvalue
- };
- that.registerMessageHandler();
- that.registerUser();
- callback(null, presence);
- };
-
- // When connection closed, call closed callback
- that.socket.onclose = function(event) {
- callbackArray[msgOnConnectionClosed](event);
- };
- });
- }
-
- // Leave network
- SugarPresence.prototype.leaveNetwork = function() {
- if (!this.isConnected())
- return;
- this.socket.close();
- this.socket = null;
- }
-
- // List all users. Will receive an array of users.
- SugarPresence.prototype.listUsers = function(callback) {
- if (!this.isConnected())
- return;
-
- // Register call back
- callbackArray[msgListUsers] = callback;
-
- // Send list user message
- var sjson = JSON.stringify({
- type: msgListUsers
- });
- this.socket.send(sjson);
- }
-
- // List users connected to a group. Will receive an array of users.
- SugarPresence.prototype.listSharedActivityUsers = function(group, callback) {
- if (!this.isConnected())
- return;
-
- // Register call back
- var that = this;
- callbackArray[msgListSharedActivityUsers] = function(data) {
- callback(data);
- }
-
- // Send list user message
- var sjson = JSON.stringify({
- type: msgListSharedActivityUsers,
- group: group
- });
- this.socket.send(sjson);
- }
-
- // Create a shared activity. Will receive a unique group id.
- SugarPresence.prototype.createSharedActivity = function(activityId, callback) {
- if (!this.isConnected())
- return;
-
- // Register call back
- var that = this;
- callbackArray[msgCreateSharedActivity] = function(data) {
- that.sharedInfo = { id: data };
- callback(data);
- }
-
- // Send create shared activity message
- var sjson = JSON.stringify({
- type: msgCreateSharedActivity,
- activityId: activityId
- });
- this.socket.send(sjson);
- }
-
- // List all shared activities. Will receive an array of each shared activities and users connected
- SugarPresence.prototype.listSharedActivities = function(callback) {
- if (!this.isConnected())
- return;
-
- // Register call back
- callbackArray[msgListSharedActivities] = callback;
-
- // Send list shared activities message
- var sjson = JSON.stringify({
- type: msgListSharedActivities
- });
- this.socket.send(sjson);
- }
-
- // Join a shared activity. Will receive group properties or null
- SugarPresence.prototype.joinSharedActivity = function(group, callback) {
- if (!this.isConnected())
- return;
-
- // Register call back
- var that = this;
- callbackArray[msgJoinSharedActivity] = function(data) {
- that.sharedInfo = data;
- callback(data);
- }
-
- // Send join shared activity message
- var sjson = JSON.stringify({
- type: msgJoinSharedActivity,
- group: group
- });
- this.socket.send(sjson);
- }
-
- // Leave shared activities
- SugarPresence.prototype.leaveSharedActivity = function(group, callback) {
- if (!this.isConnected())
- return;
-
- // Register call back
- callbackArray[msgLeaveSharedActivity] = callback; // BUG: This callback is never called
-
- // Send leave shared activity message
- var sjson = JSON.stringify({
- type: msgLeaveSharedActivity,
- group: group
- });
- this.socket.send(sjson);
- }
-
- // Register connection closed event
- SugarPresence.prototype.onConnectionClosed = function(callback) {
- callbackArray[msgOnConnectionClosed] = callback;
- }
-
- // Register shared activity user changed event
- SugarPresence.prototype.onSharedActivityUserChanged = function(callback) {
- callbackArray[msgOnSharedActivityUserChanged] = callback;
- }
-
- // Send message to a group
- SugarPresence.prototype.sendMessage = function(group, data) {;
- if (!this.isConnected())
- return;
- var sjson = JSON.stringify({
- type: msgSendMessage,
- group: group,
- data: data
- });
- this.socket.send(sjson);
- }
-
- // Register data received message
- SugarPresence.prototype.onDataReceived = function(callback) {
- callbackArray[msgSendMessage] = callback;
- }
-
- return presence;
- });
|