1 |
|
2 | {EventEmitter} = require('events')
|
3 | typeChecker = require('typechecker')
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | class Event
|
14 |
|
15 | name: null
|
16 |
|
17 | locked: false
|
18 |
|
19 | finished: false
|
20 |
|
21 | constructor: ({@name}) ->
|
22 |
|
23 |
|
24 | class EventSystem extends EventEmitter
|
25 |
|
26 |
|
27 | _eventSystemEvents: null
|
28 |
|
29 |
|
30 | event: (eventName) ->
|
31 |
|
32 | @_eventSystemEvents or= {}
|
33 |
|
34 | @_eventSystemEvents[eventName] or= new Event(eventName)
|
35 |
|
36 |
|
37 |
|
38 | lock: (eventName, next) ->
|
39 |
|
40 | event = @event eventName
|
41 |
|
42 | if event.locked is false
|
43 |
|
44 | event.locked = true
|
45 |
|
46 |
|
47 | try
|
48 | @emit eventName+':locked'
|
49 | catch err
|
50 | next(err)
|
51 | return @
|
52 | finally
|
53 | next()
|
54 | else
|
55 |
|
56 | @onceUnlocked eventName, (err) =>
|
57 | return next(err) if err
|
58 |
|
59 | @lock eventName, next
|
60 |
|
61 |
|
62 | @
|
63 |
|
64 |
|
65 |
|
66 | unlock: (eventName, next) ->
|
67 |
|
68 | event = @event eventName
|
69 |
|
70 | event.locked = false
|
71 |
|
72 |
|
73 | try
|
74 | @emit eventName+':unlocked'
|
75 | catch err
|
76 | next(err)
|
77 | return @
|
78 | finally
|
79 | next()
|
80 |
|
81 | @
|
82 |
|
83 |
|
84 |
|
85 |
|
86 |
|
87 |
|
88 | start: (eventName, next) ->
|
89 |
|
90 | @lock eventName, (err) =>
|
91 |
|
92 | return next(err) if err
|
93 |
|
94 | event = @event eventName
|
95 |
|
96 | event.finished = false
|
97 |
|
98 |
|
99 | try
|
100 | @emit eventName+':started'
|
101 | catch err
|
102 | next(err)
|
103 | return @
|
104 | finally
|
105 | next()
|
106 |
|
107 | @
|
108 |
|
109 |
|
110 | finish: (args...) ->
|
111 | @finished.apply(@,args)
|
112 |
|
113 |
|
114 |
|
115 |
|
116 |
|
117 |
|
118 | finished: (eventName, next) ->
|
119 |
|
120 | event = @event eventName
|
121 |
|
122 | event.finished = true
|
123 |
|
124 | @unlock eventName, (err) =>
|
125 |
|
126 | return next(err) if err
|
127 |
|
128 |
|
129 | try
|
130 | @emit eventName+':finished'
|
131 | catch err
|
132 | next(err)
|
133 | return @
|
134 | finally
|
135 | next()
|
136 |
|
137 | @
|
138 |
|
139 |
|
140 |
|
141 | onceUnlocked: (eventName, next) ->
|
142 |
|
143 | event = @event eventName
|
144 |
|
145 | if event.locked
|
146 |
|
147 | @once eventName+':unlocked', next
|
148 | else
|
149 |
|
150 | next()
|
151 |
|
152 | @
|
153 |
|
154 |
|
155 |
|
156 | onceFinished: (eventName, next) ->
|
157 |
|
158 | event = @event eventName
|
159 |
|
160 | if event.finished
|
161 |
|
162 | next()
|
163 | else
|
164 |
|
165 | @once eventName+':finished', next
|
166 |
|
167 | @
|
168 |
|
169 |
|
170 |
|
171 | whenFinished: (eventName, next) ->
|
172 |
|
173 | event = @event eventName
|
174 |
|
175 | if event.finished
|
176 |
|
177 | next()
|
178 |
|
179 | @on eventName+':finished', next
|
180 |
|
181 | @
|
182 |
|
183 |
|
184 | when: (args...) ->
|
185 | @on.apply(@,args)
|
186 |
|
187 |
|
188 |
|
189 | block: (eventNames, next) ->
|
190 |
|
191 | unless typeChecker.isArray(eventNames)
|
192 | if typeChecker.isString(eventNames)
|
193 | eventNames = eventNames.split(/[,\s]+/g)
|
194 | else
|
195 | err = new Error('Unknown eventNames type')
|
196 | return next(err)
|
197 | total = eventNames.length
|
198 | done = 0
|
199 |
|
200 | for eventName in eventNames
|
201 | @lock eventName, (err) ->
|
202 |
|
203 | if err
|
204 | done = total
|
205 | return next(err)
|
206 |
|
207 | done++
|
208 | if done is total
|
209 | next()
|
210 |
|
211 | @
|
212 |
|
213 |
|
214 |
|
215 | unblock: (eventNames, next) ->
|
216 |
|
217 | unless typeChecker.isArray(eventNames)
|
218 | if typeChecker.isString(eventNames)
|
219 | eventNames = eventNames.split /[,\s]+/g
|
220 | else
|
221 | err = new Error('Unknown eventNames type')
|
222 | return next(err)
|
223 | total = eventNames.length
|
224 | done = 0
|
225 |
|
226 | for eventName in eventNames
|
227 | @unlock eventName, (err) ->
|
228 |
|
229 | if err
|
230 | done = total
|
231 | return next(err)
|
232 |
|
233 | done++
|
234 | if done is total
|
235 | next()
|
236 |
|
237 | @
|
238 |
|
239 |
|
240 |
|
241 |
|
242 |
|
243 |
|
244 | module.exports = {Event,EventSystem}
|