Просмотр исходного кода

Merge pull request #156 from overleaf/jpa-fully-handle-subscribe-error

[misc] RoomManager: emitOnCompletion: properly handle Promise rejections
Jakob Ackermann 6 лет назад
Родитель
Сommit
9c1335720c

+ 3 - 3
services/real-time/app/coffee/RoomManager.coffee

@@ -39,9 +39,9 @@ module.exports = RoomManager =
             @leaveEntity client, entity, id
             @leaveEntity client, entity, id
 
 
     emitOnCompletion: (promiseList, eventName) ->
     emitOnCompletion: (promiseList, eventName) ->
-        result = Promise.all(promiseList)
-        result.then () -> RoomEvents.emit(eventName)
-        result.catch (err) -> RoomEvents.emit(eventName, err)
+        Promise.all(promiseList)
+          .then(() -> RoomEvents.emit(eventName))
+          .catch((err) -> RoomEvents.emit(eventName, err))
 
 
     eventSource: () ->
     eventSource: () ->
         return RoomEvents
         return RoomEvents

+ 24 - 0
services/real-time/test/unit/coffee/RoomManagerTests.coffee

@@ -1,4 +1,5 @@
 chai = require('chai')
 chai = require('chai')
+expect = chai.expect
 should = chai.should()
 should = chai.should()
 sinon = require("sinon")
 sinon = require("sinon")
 modulePath = "../../../app/js/RoomManager.js"
 modulePath = "../../../app/js/RoomManager.js"
@@ -20,6 +21,29 @@ describe 'RoomManager', ->
 		sinon.spy(@RoomEvents, 'emit')
 		sinon.spy(@RoomEvents, 'emit')
 		sinon.spy(@RoomEvents, 'once')
 		sinon.spy(@RoomEvents, 'once')
 	
 	
+	describe "emitOnCompletion", ->
+		describe "when a subscribe errors", ->
+			afterEach () ->
+				process.removeListener("unhandledRejection", @onUnhandled)
+
+			beforeEach (done) ->
+				@onUnhandled = (error) =>
+					@unhandledError = error
+					done(new Error("unhandledRejection: #{error.message}"))
+				process.on("unhandledRejection", @onUnhandled)
+
+				reject = undefined
+				subscribePromise = new Promise((_, r) -> reject = r)
+				promises = [subscribePromise]
+				eventName = "project-subscribed-123"
+				@RoomEvents.once eventName, () ->
+					setTimeout(done, 100)
+				@RoomManager.emitOnCompletion(promises, eventName)
+				setTimeout(() -> reject(new Error("subscribe failed")))
+
+			it "should keep going", () ->
+				expect(@unhandledError).to.not.exist
+
 	describe "joinProject", ->
 	describe "joinProject", ->
 	
 	
 		describe "when the project room is empty", ->
 		describe "when the project room is empty", ->