not really known
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

302 lines
8.0 KiB

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;
});