summaryrefslogtreecommitdiff
path: root/client/js/events.js
diff options
context:
space:
mode:
authorrr- <rr-@sakuya.pl>2016-05-11 21:29:57 +0200
committerrr- <rr-@sakuya.pl>2016-05-11 23:47:50 +0200
commit2a4241641c80fec036143e7335eb2dad63fad476 (patch)
tree389c49ded7faa6da98699618268ceb24c14bd456 /client/js/events.js
parent09bc5f10f90a8b8666ed5df631261a87d3bbcb15 (diff)
client/events: improve event dispatching
This commit introduces timer-less retry system: 1. Any change to URL is going to stop listening to any messages. 2. If a message is sent and there's no handler that could pick it up, the message gets enqueued. 3. The message is sent again to the first handler that attaches itself to given event type. While in theory this is full of holes (no control over the first handler), in practice, it works quite well. Additionally, views.listenToMessages was attaching to completely wrong DOM node; this commit fixes this as well.
Diffstat (limited to 'client/js/events.js')
-rw-r--r--client/js/events.js40
1 files changed, 27 insertions, 13 deletions
diff --git a/client/js/events.js b/client/js/events.js
index 0493c3b..0dd010a 100644
--- a/client/js/events.js
+++ b/client/js/events.js
@@ -1,34 +1,48 @@
'use strict';
-let listeners = [];
+let pendingMessages = new Map();
+let listeners = new Map();
function unlisten(messageClass) {
- listeners[messageClass] = [];
+ listeners.set(messageClass, []);
}
function listen(messageClass, handler) {
- if (!(messageClass in listeners)) {
- listeners[messageClass] = [];
+ if (pendingMessages.has(messageClass)) {
+ let newPendingMessages = [];
+ for (let message of pendingMessages.get(messageClass)) {
+ if (!handler(message)) {
+ newPendingMessages.push(message);
+ }
+ }
+ pendingMessages.set(messageClass, newPendingMessages);
}
- listeners[messageClass].push(handler);
+ if (!listeners.has(messageClass)) {
+ listeners.set(messageClass, []);
+ }
+ listeners.get(messageClass).push(handler);
}
function notify(messageClass, message) {
- if (!(messageClass in listeners)) {
+ if (!listeners.has(messageClass) || !listeners.get(messageClass).length) {
+ if (!pendingMessages.has(messageClass)) {
+ pendingMessages.set(messageClass, []);
+ }
+ pendingMessages.get(messageClass).push(message);
return;
}
- for (let handler of listeners[messageClass]) {
+ for (let handler of listeners.get(messageClass)) {
handler(message);
}
}
module.exports = {
- Success: 1,
- Error: 2,
- Info: 3,
- Authentication: 4,
- SettingsChange: 5,
- TagsChange: 6,
+ Success: 'success',
+ Error: 'error',
+ Info: 'info',
+ Authentication: 'auth',
+ SettingsChange: 'settings-change',
+ TagsChange: 'tags-change',
notify: notify,
listen: listen,