parent
4f6d8d12e0
commit
d4a4f1bd7f
@ -0,0 +1,137 @@ |
|||||||
|
var websockets = angular.module('ngWebsockets', []); |
||||||
|
|
||||||
|
websockets.factory('conn', |
||||||
|
['$rootScope','$q', |
||||||
|
function($rootScope, $q) { |
||||||
|
|
||||||
|
|
||||||
|
var ws = null; |
||||||
|
this.protocol = null; |
||||||
|
var callbacks = {}; |
||||||
|
var currentCallBackId = 0; |
||||||
|
|
||||||
|
/* |
||||||
|
* Fails every currently subscribed callback for the |
||||||
|
* given reason |
||||||
|
* |
||||||
|
* @param reason reason for failure |
||||||
|
*/ |
||||||
|
failCallbacks = function(reason) { |
||||||
|
for (var i in callbacks) { |
||||||
|
callbacks[i].cb.reject(reason); |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/* |
||||||
|
* Returns the current callback id |
||||||
|
*/ |
||||||
|
var getCurrentCallBackId = function() { |
||||||
|
|
||||||
|
currentCallBackId += 1; |
||||||
|
|
||||||
|
if (currentCallBackId > 1000) { |
||||||
|
currentCallBackId = 0; |
||||||
|
} |
||||||
|
|
||||||
|
return currentCallBackId; |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/* Send a message to the websocket and returns a promise. |
||||||
|
* See: http://docs.angularjs.org/api/ng.$q
|
||||||
|
* |
||||||
|
* @param message message to send |
||||||
|
* @returns a promise |
||||||
|
*/ |
||||||
|
var send = function(message) { |
||||||
|
|
||||||
|
var cb = createCallback(message); |
||||||
|
|
||||||
|
message = protocol.setId(cb.id, |
||||||
|
message); |
||||||
|
|
||||||
|
ws.send(message); |
||||||
|
return cb.promise; |
||||||
|
}; |
||||||
|
|
||||||
|
/* |
||||||
|
* Create a callback, adds it to the callback list |
||||||
|
* and return it. |
||||||
|
*/ |
||||||
|
var createCallback = function() { |
||||||
|
var defer = $q.defer(); |
||||||
|
var cbId = getCurrentCallBackId(); |
||||||
|
|
||||||
|
callbacks[cbId] = { |
||||||
|
time: new Date(), |
||||||
|
cb: defer |
||||||
|
}; |
||||||
|
|
||||||
|
defer.id = cbId; |
||||||
|
|
||||||
|
return defer; |
||||||
|
}; |
||||||
|
|
||||||
|
/* |
||||||
|
* Send all messages to the websocket and returns a promise that is resolved |
||||||
|
* when all message are resolved. |
||||||
|
* |
||||||
|
* @param messages list of messages |
||||||
|
* @returns a promise |
||||||
|
*/ |
||||||
|
var sendAll = function(messages) { |
||||||
|
var promises = []; |
||||||
|
for (var i in messages) { |
||||||
|
var promise = send(messages[i]); |
||||||
|
promises.push(promise); |
||||||
|
} |
||||||
|
return $q.all(promises); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
var onmessage = function (evt) { |
||||||
|
/* |
||||||
|
* Receives a message on the websocket |
||||||
|
*/ |
||||||
|
var message = protocol.parse(evt.data) |
||||||
|
if (_.has(callbacks, message.id)) { |
||||||
|
// see if it's bound to one of the callbacks
|
||||||
|
var promise = callbacks[message.id]; |
||||||
|
promise.cb.resolve(message) |
||||||
|
delete(callbacks[message.id]); |
||||||
|
} else { |
||||||
|
// otherwise emit it
|
||||||
|
$rootScope.$emit('onMessage', message) |
||||||
|
//handlers.handleEvent(message);
|
||||||
|
} |
||||||
|
$rootScope.commands.push("RECV: " + evt.data + " TYPE:" + evt.type); |
||||||
|
$rootScope.$apply(); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
var connect = function(url, |
||||||
|
protocol, |
||||||
|
properties) { |
||||||
|
|
||||||
|
ws = new WebSocket(url); |
||||||
|
protocol = protocol; |
||||||
|
for (var property in properties) { |
||||||
|
ws[property] = properties[property]; |
||||||
|
} |
||||||
|
|
||||||
|
ws.onmessage = onmessage; |
||||||
|
} |
||||||
|
|
||||||
|
var disconnect = function() { |
||||||
|
ws.close(); |
||||||
|
} |
||||||
|
|
||||||
|
return { |
||||||
|
send: send, |
||||||
|
sendAll: sendAll, |
||||||
|
connect: connect, |
||||||
|
disconnect: disconnect |
||||||
|
} |
||||||
|
}]); |
Loading…
Reference in new issue