mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-20 04:20:55 +01:00
84d259cea2
Summary: Ref T4324. Ref T5284. This adds server-side support for keeping track of a set of PHIDs that the Aphlict clients have subscribed to. Instead of broadcasting a notification to all clients (after which the clients can poll `/notification/individual` in order to determine whether or not they are interested in the notification), transmit notifications only to clients that have subscribed to a PHID that is relevant to the notification. Test Plan: I opened up two clients on the same host (incognito tabs in Chrome). Here is the output from the server: ``` > sudo ./bin/aphlict debug Starting Aphlict server in foreground... Launching server: $ 'nodejs' '/usr/src/phabricator/src/applications/aphlict/management/../../../../support/aphlict/server/aphlict_server.js' --port='22280' --admin='22281' --host='localhost' --user='aphlict' [Wed Jun 11 2014 19:10:27 GMT+0000 (UTC)] Started Server (PID 4546) [Wed Jun 11 2014 19:10:36 GMT+0000 (UTC)] <FlashPolicy> Policy Request From ::ffff:192.168.1.1 [Wed Jun 11 2014 19:10:37 GMT+0000 (UTC)] <Listener/1> Connected from ::ffff:192.168.1.1 [Wed Jun 11 2014 19:10:37 GMT+0000 (UTC)] <Listener/1> Received data: {"command":"subscribe","data":["PHID-USER-cb5af6p4oepy5tlgqypi"]} [Wed Jun 11 2014 19:10:37 GMT+0000 (UTC)] <Listener/1> Subscribed to: ["PHID-USER-cb5af6p4oepy5tlgqypi"] [Wed Jun 11 2014 19:10:39 GMT+0000 (UTC)] <Listener/1> Received data: {"command":"subscribe","data":["PHID-USER-kfohe3ca5oe6ygykmioq"]} [Wed Jun 11 2014 19:10:39 GMT+0000 (UTC)] <Listener/1> Subscribed to: ["PHID-USER-kfohe3ca5oe6ygykmioq"] [Wed Jun 11 2014 19:10:42 GMT+0000 (UTC)] notification: {"key":"6023751084283587681","type":"notification","subscribers":["PHID-USER-cb5af6p4oepy5tlgqypi"]} [Wed Jun 11 2014 19:10:42 GMT+0000 (UTC)] <Listener/1> Wrote Message ``` I verified (using the "Network" tab in Chrome) that an AJAX request to `/notification/individual/` was only made in the tab belonging to the user that triggered the test notification. Reviewers: epriestley, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: epriestley, Korvin Maniphest Tasks: T5284, T4324 Differential Revision: https://secure.phabricator.com/D9458
79 lines
1.9 KiB
JavaScript
79 lines
1.9 KiB
JavaScript
/**
|
|
* @provides javelin-aphlict
|
|
* @requires javelin-install
|
|
* javelin-util
|
|
*/
|
|
|
|
/**
|
|
* Simple JS API for the Flash Aphlict client. Example usage:
|
|
*
|
|
* var aphlict = new JX.Aphlict('aphlict_swf', '127.0.0.1', 22280)
|
|
* .setHandler(function(type, message) {
|
|
* JX.log("Got " + type + " event!")
|
|
* })
|
|
* .start();
|
|
*
|
|
* Your handler will receive these events:
|
|
*
|
|
* - `connect` The client initiated a connection to the server.
|
|
* - `connected` The client completed a connection to the server.
|
|
* - `close` The client disconnected from the server.
|
|
* - `error` There was an error.
|
|
* - `receive` Received a message from the server.
|
|
*
|
|
* You do not have to handle any of them in any specific way.
|
|
*/
|
|
JX.install('Aphlict', {
|
|
|
|
construct : function(id, server, port, subscriptions) {
|
|
if (__DEV__) {
|
|
if (JX.Aphlict._instance) {
|
|
JX.$E('Aphlict object is sort of a singleton..!');
|
|
}
|
|
}
|
|
|
|
JX.Aphlict._instance = this;
|
|
|
|
this._server = server;
|
|
this._port = port;
|
|
this._subscriptions = subscriptions;
|
|
|
|
// Flash puts its "objects" into global scope in an inconsistent way,
|
|
// because it was written in like 1816 when globals were awesome and IE4
|
|
// didn't support other scopes since global scope is the best anyway.
|
|
var container = document[id] || window[id];
|
|
|
|
this._flashContainer = container;
|
|
},
|
|
|
|
members : {
|
|
_server : null,
|
|
_port : null,
|
|
_subscriptions : null,
|
|
start : function() {
|
|
this._flashContainer.connect(
|
|
this._server,
|
|
this._port,
|
|
this._subscriptions);
|
|
}
|
|
},
|
|
|
|
properties : {
|
|
handler : null
|
|
},
|
|
|
|
statics : {
|
|
_instance : null,
|
|
didReceiveEvent : function(type, message) {
|
|
if (!JX.Aphlict._instance) {
|
|
return;
|
|
}
|
|
|
|
var handler = JX.Aphlict._instance.getHandler();
|
|
if (handler) {
|
|
handler(type, message);
|
|
}
|
|
}
|
|
}
|
|
|
|
});
|