@@ -147,6 +147,32 @@ class Server extends KarmaEventEmitter {
147147 return this . _fileList ? this . _fileList . changeFile ( path ) : Promise . resolve ( )
148148 }
149149
150+ emitExitAsync ( code ) {
151+ const name = 'exit'
152+ let pending = this . listeners ( name ) . length
153+ const deferred = helper . defer ( )
154+
155+ function resolve ( ) {
156+ deferred . resolve ( code )
157+ }
158+
159+ this . emit ( name , ( newCode ) => {
160+ if ( newCode && typeof newCode === 'number' ) {
161+ // Only update code if it is given and not zero
162+ code = newCode
163+ }
164+ if ( ! -- pending ) {
165+ resolve ( )
166+ }
167+ } )
168+
169+ if ( ! pending ) {
170+ resolve ( )
171+ }
172+
173+ return deferred . promise
174+ }
175+
150176 async _start ( config , launcher , preprocess , fileList , capturedBrowsers , executor , done ) {
151177 if ( config . detached ) {
152178 this . _detach ( config , done )
@@ -356,21 +382,22 @@ class Server extends KarmaEventEmitter {
356382 }
357383 } )
358384
359- let removeAllListenersDone = false
360- const removeAllListeners = ( ) => {
361- if ( removeAllListenersDone ) {
362- return
363- }
364- removeAllListenersDone = true
365- webServer . removeAllListeners ( )
366- processWrapper . removeAllListeners ( )
367- done ( code || 0 )
368- }
369-
370- return this . emitAsync ( 'exit' ) . then ( ( ) => {
385+ return this . emitExitAsync ( code ) . then ( ( code ) => {
371386 return new Promise ( ( resolve , reject ) => {
372387 socketServer . sockets . removeAllListeners ( )
373388 socketServer . close ( )
389+
390+ let removeAllListenersDone = false
391+ const removeAllListeners = ( ) => {
392+ if ( removeAllListenersDone ) {
393+ return
394+ }
395+ removeAllListenersDone = true
396+ webServer . removeAllListeners ( )
397+ processWrapper . removeAllListeners ( )
398+ done ( code || 0 )
399+ }
400+
374401 const closeTimeout = setTimeout ( removeAllListeners , webServerCloseTimeout )
375402
376403 webServer . close ( ( ) => {
0 commit comments