Commit 1e4736a4b83452ca9c07d919dfb3afb0f3c35bc0
1 parent
f74c41d2
Exists in
master
and in
7 other branches
added events-hub service
Showing
4 changed files
with
109 additions
and
2 deletions
Show diff stats
src/app/index.ts
1 | -import {bootstrap} from "ng-forward"; | 1 | +import {bootstrap, provide} from "ng-forward"; |
2 | import {noosferoModuleConfig} from "./index.config"; | 2 | import {noosferoModuleConfig} from "./index.config"; |
3 | import {noosferoAngularRunBlock} from "./index.run"; | 3 | import {noosferoAngularRunBlock} from "./index.run"; |
4 | import {MainComponent} from "./main/main.component"; | 4 | import {MainComponent} from "./main/main.component"; |
@@ -22,4 +22,13 @@ angular.module('noosfero.init', ['noosfero.templates.app', 'noosfero.templates.p | @@ -22,4 +22,13 @@ angular.module('noosfero.init', ['noosfero.templates.app', 'noosfero.templates.p | ||
22 | run(noosferoAngularRunBlock). | 22 | run(noosferoAngularRunBlock). |
23 | constant("moment", moment). | 23 | constant("moment", moment). |
24 | constant("AuthEvents", AuthEvents); | 24 | constant("AuthEvents", AuthEvents); |
25 | -bootstrap(MainComponent); | 25 | + |
26 | + | ||
27 | +import { EVENTS_HUB_KNOWN_LIST } from './shared/services/events-hub.service'; | ||
28 | +import { EVENTS_HUB_KNOWN_EVENTS_NAMES } from './events-hub-known-events.constants'; | ||
29 | + | ||
30 | +bootstrap(MainComponent, | ||
31 | + [ | ||
32 | + provide(EVENTS_HUB_KNOWN_LIST, { useConstant: Object.getOwnPropertyNames(EVENTS_HUB_KNOWN_EVENTS_NAMES) }) | ||
33 | + ] | ||
34 | +); |
@@ -0,0 +1,52 @@ | @@ -0,0 +1,52 @@ | ||
1 | +import { OpaqueToken } from 'ng-forward'; | ||
2 | +import { EventsHubService } from './events-hub.service'; | ||
3 | + | ||
4 | + | ||
5 | +describe("EventsHubService", () => { | ||
6 | + let eventsHubService: EventsHubService; | ||
7 | + | ||
8 | + it("emits events for the known events", (done) => { | ||
9 | + let event = "Event1"; | ||
10 | + | ||
11 | + let eventListener = () => { | ||
12 | + }; | ||
13 | + // creates the events hub service which known the event "Event1" | ||
14 | + eventsHubService = new EventsHubService([ | ||
15 | + event | ||
16 | + ]); | ||
17 | + // subscribe to the event passing the done Function as the eventListener | ||
18 | + // if the event emits works the done function is called and the | ||
19 | + // test will pass | ||
20 | + eventsHubService.subscribeToEvent<any>(event, done); | ||
21 | + // emits the event | ||
22 | + eventsHubService.emitEvent(event, null); | ||
23 | + }); | ||
24 | + | ||
25 | + it("throws error when trying to emit an unknow event", () => { | ||
26 | + let eventListener = () => { | ||
27 | + }; | ||
28 | + // creates the events hub service which known the event "Event1" | ||
29 | + eventsHubService = new EventsHubService([ | ||
30 | + 'Event1' | ||
31 | + ]); | ||
32 | + | ||
33 | + // emits the event | ||
34 | + expect( | ||
35 | + () => { eventsHubService.emitEvent('NotKnownEvent', null); } | ||
36 | + ).toThrowError('Unknown event named NotKnownEvent'); | ||
37 | + }); | ||
38 | + | ||
39 | + it("throws error when trying to subscribe to an unknow event", () => { | ||
40 | + let eventListener = () => { | ||
41 | + }; | ||
42 | + // creates the events hub service which known the event "Event1" | ||
43 | + eventsHubService = new EventsHubService([ | ||
44 | + 'Event1' | ||
45 | + ]); | ||
46 | + | ||
47 | + // emits the event | ||
48 | + expect( | ||
49 | + () => { eventsHubService.subscribeToEvent<void>('NotKnownEvent', () => {}); } | ||
50 | + ).toThrowError('Unknown event named NotKnownEvent'); | ||
51 | + }); | ||
52 | +}); | ||
0 | \ No newline at end of file | 53 | \ No newline at end of file |
@@ -0,0 +1,41 @@ | @@ -0,0 +1,41 @@ | ||
1 | +import { Injectable, Inject, OpaqueToken, EventEmitter } from 'ng-forward'; | ||
2 | + | ||
3 | +export const EVENTS_HUB_KNOWN_LIST = new OpaqueToken('EVENTS_HUB_KNOWN_LIST'); | ||
4 | + | ||
5 | +@Injectable() | ||
6 | +@Inject(EVENTS_HUB_KNOWN_LIST) | ||
7 | +export class EventsHubService { | ||
8 | + | ||
9 | + private emitters: Map<string, EventEmitter<any>>; | ||
10 | + | ||
11 | + constructor(private knownEvents: string[]) { | ||
12 | + this.emitters = new Map<string, EventEmitter<any>>(); | ||
13 | + this.setupEmitters(); | ||
14 | + } | ||
15 | + | ||
16 | + emitEvent(eventType: string, payload?: any) { | ||
17 | + this.checkKnownEvent(eventType); | ||
18 | + let event = this.emitters.get(eventType); | ||
19 | + if ( event ) this.emitters.get(eventType).next(payload); | ||
20 | + } | ||
21 | + | ||
22 | + subscribeToEvent<T>(eventType: string, generatorOrNext?: ((p?: T) => void), error?: any, complete?: any) { | ||
23 | + this.checkKnownEvent(eventType); | ||
24 | + let event = this.emitters.get(eventType); | ||
25 | + if (event) event.subscribe(generatorOrNext, error, complete); | ||
26 | + } | ||
27 | + | ||
28 | + private setupEmitters() { | ||
29 | + for (let i: number = 0; i < this.knownEvents.length; i++) { | ||
30 | + this.emitters.set(this.knownEvents[i], new EventEmitter<any>()); | ||
31 | + } | ||
32 | + } | ||
33 | + | ||
34 | + private checkKnownEvent(eventType: string) { | ||
35 | + if (!this.emitters.has(eventType)) { | ||
36 | + throw new Error('Unknown event named ' + eventType.toString()); | ||
37 | + } | ||
38 | + } | ||
39 | + | ||
40 | + | ||
41 | +} | ||
0 | \ No newline at end of file | 42 | \ No newline at end of file |