Multichannel Injectable EventEmitter (RxJS)

JS
S
JavaScript

This is a complete implementation for an injectable multi cast EventEmitter, with ability for multiple apps to subscribe/unsubscribe on several channels and communicate between them. There is also the ability to turn of permanently a channel.

1// super_event_emitter.js
2// --------------------------------------------------------------
3import { Subject } from 'rxjs/Rx';
4
5class SuperEventEmitter {
6    constructor(){
7        console.info('SuperEventEmitter running...');
8        this.subjects = {};
9    }
10    emit (name, data) {
11        console.warn('SuperEventEmitter > Emitting ...', name);
12        const fnName = this.createName(name);
13        this.subjects[fnName] || (this.subjects[fnName] = new Subject());
14        this.subjects[fnName].next(data);
15    }
16    listen (name, handler) {
17        console.warn('SuperEventEmitter > listener attached ...', name);
18        var fnName = this.createName(name);
19        this.subjects[fnName] || (this.subjects[fnName] = new Subject());
20        return this.subjects[fnName].subscribe(handler);
21    }
22    close (name) {
23        var subjects = this.subjects;
24        const channel = this.subjects[this.getName(name)];
25        if(channel){
26            console.warn('SuperEventEmitter > Channel closed ...', name);
27            channel.complete();
28        }
29    }
30    createName (name){
31        return '$' + name;
32    }
33    getName (name){
34        return '$' + name;
35    }
36};
37
38const singleton = new SuperEventEmitter();
39export default singleton;
40
41// emitter.js
42// --------------------------------------------------------------
43import SuperEventEmitter from './super_event_emitter';
44class Emitter {
45    constructor(){
46        console.info('emitter running');
47        this.subscribeToEventEmitterDataChannel();
48    }
49    subscribeToEventEmitterDataChannel(){
50        const subscription = SuperEventEmitter.listen('data', function (data) {
51            console.log('ping received data: ' + data);
52        });
53
54        SuperEventEmitter.emit('data', 'foo');
55        SuperEventEmitter.emit('xpto', 'dummy information on xpto channel');
56
57        // Destroy the subscription
58        subscription.unsubscribe();
59        SuperEventEmitter.emit('data', 'a bit more data on data channel');
60
61        // Channel permanently closed (all subscriptions cleared)
62        SuperEventEmitter.close('data');
63
64        SuperEventEmitter.emit('data', 'even a bit more data on data channel');
65        SuperEventEmitter.emit('xpto', 'more dummy information on xpto channel');
66    }
67}
68
69export { Emitter };
70
71// receiver.js
72// --------------------------------------------------------------
73import SuperEventEmitter from './super_event_emitter';
74class Receiver {
75    constructor(){
76        console.info('receiver running');
77        this.subscribeToEventEmitterDataChannel();
78        this.subscribeToEventEmitterXptoChannel();
79    }
80    subscribeToEventEmitterDataChannel(){
81        const subscription = SuperEventEmitter.listen('data', function (data) {
82            console.log('receiver received on data channel: ' + data);
83        });
84    }
85    subscribeToEventEmitterXptoChannel(){
86        const subscription = SuperEventEmitter.listen('xpto', function (data) {
87            console.log('receiver received on xpto channel: ' + data);
88        });
89    }
90
91}
92export { Receiver };

Created on 6/29/2017