1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 |
|
7 | var _Dispatcher = require('./Dispatcher');
|
8 |
|
9 | var _Dispatcher2 = _interopRequireDefault(_Dispatcher);
|
10 |
|
11 | var _GenericError = require('../error/GenericError');
|
12 |
|
13 | var _GenericError2 = _interopRequireDefault(_GenericError);
|
14 |
|
15 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 | const EMPTY_MAP = Object.freeze(new Map());
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 | const EMPTY_SET = Object.freeze(new Set());
|
34 |
|
35 |
|
36 |
|
37 |
|
38 | class DispatcherImpl extends _Dispatcher2.default {
|
39 | static get $dependencies() {
|
40 | return [];
|
41 | }
|
42 |
|
43 | |
44 |
|
45 |
|
46 | constructor() {
|
47 | super();
|
48 |
|
49 | |
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 | this._eventListeners = new Map();
|
57 | }
|
58 |
|
59 | |
60 |
|
61 |
|
62 | clear() {
|
63 | this._eventListeners.clear();
|
64 |
|
65 | return this;
|
66 | }
|
67 |
|
68 | |
69 |
|
70 |
|
71 | listen(event, listener, scope = null) {
|
72 | if ($Debug) {
|
73 | if (!(listener instanceof Function)) {
|
74 | throw new _GenericError2.default(`The listener must be a function, ${listener} provided.`);
|
75 | }
|
76 | }
|
77 |
|
78 | if (!this._eventListeners.has(event)) {
|
79 | this._createNewEvent(event);
|
80 | }
|
81 | let listeners = this._getListenersOf(event);
|
82 |
|
83 | if (!listeners.has(listener)) {
|
84 | this._createNewListener(event, listener);
|
85 | }
|
86 | this._getScopesOf(event, listener).add(scope);
|
87 |
|
88 | return this;
|
89 | }
|
90 |
|
91 | |
92 |
|
93 |
|
94 | unlisten(event, listener, scope = null) {
|
95 | let scopes = this._getScopesOf(event, listener);
|
96 |
|
97 | if ($Debug) {
|
98 | if (!scopes.has(scope)) {
|
99 | console.warn('ima.event.DispatcherImpl.unlisten(): the provided ' + `listener '${listener}' is not registered for the ` + `specified event '${event}' and scope '${scope}'. Check ` + `your workflow.`, {
|
100 | event: event,
|
101 | listener: listener,
|
102 | scope: scope
|
103 | });
|
104 | }
|
105 | }
|
106 |
|
107 | scopes.delete(scope);
|
108 | if (!scopes.size) {
|
109 | let listeners = this._getListenersOf(event);
|
110 | listeners.delete(listener);
|
111 |
|
112 | if (!listeners.size) {
|
113 | this._eventListeners.delete(event);
|
114 | }
|
115 | }
|
116 |
|
117 | return this;
|
118 | }
|
119 |
|
120 | |
121 |
|
122 |
|
123 | fire(event, data, imaInternalEvent = false) {
|
124 | let listeners = this._getListenersOf(event);
|
125 |
|
126 | if (!listeners.size && !imaInternalEvent) {
|
127 | console.warn(`There are no event listeners registered for the ${event} ` + `event`, {
|
128 | event: event,
|
129 | data: data
|
130 | });
|
131 | }
|
132 |
|
133 | for (let [listener, scopes] of listeners) {
|
134 | for (let scope of scopes) {
|
135 | listener.bind(scope)(data);
|
136 | }
|
137 | }
|
138 |
|
139 | return this;
|
140 | }
|
141 |
|
142 | |
143 |
|
144 |
|
145 |
|
146 |
|
147 | _createNewEvent(event) {
|
148 | let listeners = new Map();
|
149 | this._eventListeners.set(event, listeners);
|
150 | }
|
151 |
|
152 | |
153 |
|
154 |
|
155 |
|
156 |
|
157 |
|
158 | _createNewListener(event, listener) {
|
159 | let scopes = new Set();
|
160 | this._eventListeners.get(event).set(listener, scopes);
|
161 | }
|
162 |
|
163 | |
164 |
|
165 |
|
166 |
|
167 |
|
168 |
|
169 |
|
170 |
|
171 |
|
172 |
|
173 |
|
174 | _getScopesOf(event, listener) {
|
175 | let listenersToScopes = this._getListenersOf(event);
|
176 |
|
177 | if (listenersToScopes.has(listener)) {
|
178 | return listenersToScopes.get(listener);
|
179 | }
|
180 |
|
181 | return EMPTY_SET;
|
182 | }
|
183 |
|
184 | |
185 |
|
186 |
|
187 |
|
188 |
|
189 |
|
190 |
|
191 |
|
192 |
|
193 | _getListenersOf(event) {
|
194 | if (this._eventListeners.has(event)) {
|
195 | return this._eventListeners.get(event);
|
196 | }
|
197 |
|
198 | return EMPTY_MAP;
|
199 | }
|
200 | }
|
201 | exports.default = DispatcherImpl;
|
202 |
|
203 | typeof $IMA !== 'undefined' && $IMA !== null && $IMA.Loader && $IMA.Loader.register('ima/event/DispatcherImpl', [], function (_export, _context) {
|
204 | 'use strict';
|
205 | return {
|
206 | setters: [],
|
207 | execute: function () {
|
208 | _export('default', exports.default);
|
209 | }
|
210 | };
|
211 | });
|