Multichannel Injectable EventEmitter (RxJS)
JS
S
JavaScriptThis 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