app/assets/javascripts/faye-authentication.js in faye-authentication-0.1.0 vs app/assets/javascripts/faye-authentication.js in faye-authentication-0.2.0
- old
+ new
@@ -1,52 +1,67 @@
-function FayeAuthentication(endpoint) {
+function FayeAuthentication(client, endpoint) {
+ this._client = client;
this._endpoint = endpoint || '/faye/auth';
this._signatures = {};
+ this._outbox = {};
}
FayeAuthentication.prototype.endpoint = function() {
return (this._endpoint);
};
FayeAuthentication.prototype.signMessage = function(message, callback) {
var channel = message.subscription || message.channel;
var clientId = message.clientId;
+ var self = this;
if (!this._signatures[clientId])
this._signatures[clientId] = {};
if (this._signatures[clientId][channel]) {
this._signatures[clientId][channel].then(function(signature) {
message.signature = signature;
+ if (!message.retried)
+ self._outbox[message.id] = {message: message, clientId: clientId};
callback(message);
});
} else {
- var self = this;
self._signatures[clientId][channel] = new Faye.Promise(function(success, failure) {
$.post(self.endpoint(), {message: {channel: channel, clientId: clientId}}, function(response) {
success(response.signature);
}, 'json').fail(function(xhr, textStatus, e) {
success(null);
});
});
self._signatures[clientId][channel].then(function(signature) {
message.signature = signature;
+ if (!message.retried){
+ self._outbox[message.id] = {message: message, clientId: clientId};
+ }
callback(message);
});
}
}
FayeAuthentication.prototype.outgoing = function(message, callback) {
- if (message.channel === '/meta/subscribe') {
+ if (message.channel == '/meta/subscribe') {
this.signMessage(message, callback);
}
- else if (/^\/meta\/(.*)/.exec(message.channel) === null) { // Publish
+ else if (!/^\/meta\/(.*)/.test(message.channel)) { // Publish
this.signMessage(message, callback);
}
else
callback(message);
};
FayeAuthentication.prototype.incoming = function(message, callback) {
- if (message.error === 'Invalid signature')
- this._signatures = {};
- callback(message);
+ var outbox_message = this._outbox[message.id];
+ if (outbox_message && message.error) {
+ var channel = outbox_message.message.subscription || outbox_message.message.channel;
+ this._signatures[outbox_message.clientId][channel] = null;
+ outbox_message.message.retried = true;
+ delete outbox_message.message.id;
+ delete this._outbox[message.id];
+ this._client._send(outbox_message.message, callback);
+ }
+ else
+ callback(message);
};