From 0bf8e180524f76a29e602633c6949370d06910cf Mon Sep 17 00:00:00 2001 From: Tobias Schlatter Date: Sat, 21 Jul 2018 12:20:52 +0200 Subject: [PATCH] Fix #3411: Do not call onMessage immediately after init This change contains a fix to this in the Node.js Com support and a test in the test suite for this. --- .../scalajs/jsenv/test/TimeoutComTests.scala | 17 +++++++++++++++++ .../org/scalajs/jsenv/nodejs/ComSupport.scala | 19 +++++++++++-------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/js-envs-test-kit/src/main/scala/org/scalajs/jsenv/test/TimeoutComTests.scala b/js-envs-test-kit/src/main/scala/org/scalajs/jsenv/test/TimeoutComTests.scala index a7070177b2..52307ace8d 100644 --- a/js-envs-test-kit/src/main/scala/org/scalajs/jsenv/test/TimeoutComTests.scala +++ b/js-envs-test-kit/src/main/scala/org/scalajs/jsenv/test/TimeoutComTests.scala @@ -86,4 +86,21 @@ private[test] class TimeoutComTests(config: JSEnvSuiteConfig) { """, RunConfig()) run.closeAndWait() } + + @Test // #3411 + def noImmediateCallbackTest: Unit = { + val run = kit.start(s""" + setTimeout(function() { + var gotCalled = false; + scalajsCom.init(function(msg) { gotCalled = true; }); + if (gotCalled) throw "Buffered messages did not get deferred to the event loop"; + }, 100); + """, RunConfig()) + + try { + run.run.send("Hello World") + } finally { + run.closeAndWait() + } + } } diff --git a/nodejs-env/src/main/scala/org/scalajs/jsenv/nodejs/ComSupport.scala b/nodejs-env/src/main/scala/org/scalajs/jsenv/nodejs/ComSupport.scala index 5dadf32dfa..7a5fe3f2d0 100644 --- a/nodejs-env/src/main/scala/org/scalajs/jsenv/nodejs/ComSupport.scala +++ b/nodejs-env/src/main/scala/org/scalajs/jsenv/nodejs/ComSupport.scala @@ -251,7 +251,7 @@ object ComRun { | var inMessages = []; | | // The callback where received messages go - | var recvCallback = function(msg) { inMessages.push(msg); }; + | var onMessage = null; | | socket.on('data', function(data) { | inBuffer = Buffer.concat([inBuffer, data]); @@ -268,7 +268,8 @@ object ComRun { | | inBuffer = inBuffer.slice(byteLen); | - | recvCallback(res); + | if (inMessages !== null) inMessages.push(res); + | else onMessage(res); | } | }); | @@ -280,12 +281,14 @@ object ComRun { | socket.on('close', function() { process.exit(0); }); | | global.scalajsCom = { - | init: function(recvCB) { - | if (inMessages === null) throw new Error("Com already initialized"); - | for (var i = 0; i < inMessages.length; ++i) - | recvCB(inMessages[i]); - | inMessages = null; - | recvCallback = recvCB; + | init: function(onMsg) { + | if (onMessage !== null) throw new Error("Com already initialized"); + | onMessage = onMsg; + | process.nextTick(function() { + | for (var i = 0; i < inMessages.length; ++i) + | onMessage(inMessages[i]); + | inMessages = null; + | }); | }, | send: function(msg) { | var len = msg.length;