mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-30 10:42:41 +01:00
524aee03dc
Summary: Fixes T8118. Turns out this also was broken in the main view if e.g. you went to just /conpherence/. The fix is to make sure the threadmanager js class explicitly manages subscriptions as the loaded thread changes. Test Plan: - from /conpherence/ was able to receive messages in real time. - from /conpherence/ changed threads and still received messages in real time - from durable column switched threads and received messages in real time Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin, epriestley Maniphest Tasks: T8118 Differential Revision: https://secure.phabricator.com/D12758
172 lines
3.8 KiB
JavaScript
172 lines
3.8 KiB
JavaScript
/**
|
|
* @provides javelin-aphlict
|
|
* @requires javelin-install
|
|
* javelin-util
|
|
* javelin-websocket
|
|
* javelin-leader
|
|
* javelin-json
|
|
*/
|
|
|
|
/**
|
|
* Client for the notification server. Example usage:
|
|
*
|
|
* var aphlict = new JX.Aphlict('ws://localhost:22280', subscriptions)
|
|
* .setHandler(function(message) {
|
|
* // ...
|
|
* })
|
|
* .start();
|
|
*
|
|
*/
|
|
JX.install('Aphlict', {
|
|
|
|
construct: function(uri, subscriptions) {
|
|
if (__DEV__) {
|
|
if (JX.Aphlict._instance) {
|
|
JX.$E('Aphlict object is a singleton.');
|
|
}
|
|
}
|
|
|
|
this._uri = uri;
|
|
this._subscriptions = subscriptions;
|
|
this._setStatus('setup');
|
|
|
|
JX.Aphlict._instance = this;
|
|
},
|
|
|
|
events: ['didChangeStatus'],
|
|
|
|
members: {
|
|
_uri: null,
|
|
_socket: null,
|
|
_subscriptions: null,
|
|
_status: null,
|
|
|
|
start: function() {
|
|
JX.Leader.listen('onBecomeLeader', JX.bind(this, this._lead));
|
|
JX.Leader.listen('onReceiveBroadcast', JX.bind(this, this._receive));
|
|
JX.Leader.start();
|
|
|
|
JX.Leader.call(JX.bind(this, this._begin));
|
|
},
|
|
|
|
getSubscriptions: function() {
|
|
return this._subscriptions;
|
|
},
|
|
|
|
setSubscriptions: function(subscriptions) {
|
|
this._subscriptions = subscriptions;
|
|
JX.Leader.broadcast(
|
|
null,
|
|
{type: 'aphlict.subscribe', data: this._subscriptions});
|
|
},
|
|
|
|
clearSubscriptions: function(subscriptions) {
|
|
this._subscriptions = null;
|
|
JX.Leader.broadcast(
|
|
null,
|
|
{type: 'aphlict.unsubscribe', data: subscriptions});
|
|
},
|
|
|
|
getStatus: function() {
|
|
return this._status;
|
|
},
|
|
|
|
_begin: function() {
|
|
JX.Leader.broadcast(
|
|
null,
|
|
{type: 'aphlict.getstatus'});
|
|
JX.Leader.broadcast(
|
|
null,
|
|
{type: 'aphlict.subscribe', data: this._subscriptions});
|
|
},
|
|
|
|
_lead: function() {
|
|
this._socket = new JX.WebSocket(this._uri);
|
|
this._socket.setOpenHandler(JX.bind(this, this._open));
|
|
this._socket.setMessageHandler(JX.bind(this, this._message));
|
|
this._socket.setCloseHandler(JX.bind(this, this._close));
|
|
|
|
this._socket.open();
|
|
},
|
|
|
|
_open: function() {
|
|
this._broadcastStatus('open');
|
|
JX.Leader.broadcast(null, {type: 'aphlict.getsubscribers'});
|
|
},
|
|
|
|
_close: function() {
|
|
this._broadcastStatus('closed');
|
|
},
|
|
|
|
_broadcastStatus: function(status) {
|
|
JX.Leader.broadcast(null, {type: 'aphlict.status', data: status});
|
|
},
|
|
|
|
_message: function(raw) {
|
|
var message = JX.JSON.parse(raw);
|
|
JX.Leader.broadcast(null, {type: 'aphlict.server', data: message});
|
|
},
|
|
|
|
_receive: function(message, is_leader) {
|
|
switch (message.type) {
|
|
case 'aphlict.status':
|
|
this._setStatus(message.data);
|
|
break;
|
|
|
|
case 'aphlict.getstatus':
|
|
if (is_leader) {
|
|
this._broadcastStatus(this.getStatus());
|
|
}
|
|
break;
|
|
|
|
case 'aphlict.getsubscribers':
|
|
JX.Leader.broadcast(
|
|
null,
|
|
{type: 'aphlict.subscribe', data: this._subscriptions});
|
|
break;
|
|
|
|
case 'aphlict.subscribe':
|
|
if (is_leader) {
|
|
this._write({
|
|
command: 'subscribe',
|
|
data: message.data
|
|
});
|
|
}
|
|
break;
|
|
|
|
default:
|
|
var handler = this.getHandler();
|
|
handler && handler(message);
|
|
break;
|
|
}
|
|
},
|
|
|
|
_setStatus: function(status) {
|
|
this._status = status;
|
|
this.invoke('didChangeStatus');
|
|
},
|
|
|
|
_write: function(message) {
|
|
this._socket.send(JX.JSON.stringify(message));
|
|
}
|
|
|
|
},
|
|
|
|
properties: {
|
|
handler: null
|
|
},
|
|
|
|
statics: {
|
|
_instance: null,
|
|
|
|
getInstance: function() {
|
|
var self = JX.Aphlict;
|
|
if (!self._instance) {
|
|
return null;
|
|
}
|
|
return self._instance;
|
|
}
|
|
|
|
}
|
|
|
|
});
|