diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,8 @@
+## 1.2.9
+
+* Same changes as 1.2.8, but the 1.2.8 release was formed incorrectly and didn't
+  compile.
+
 ## 1.2.8
 
 * Fixed a bug in the heartbeat monitor. The heartbeat thread exists to ensure
diff --git a/engine-io.cabal b/engine-io.cabal
--- a/engine-io.cabal
+++ b/engine-io.cabal
@@ -1,5 +1,5 @@
 name: engine-io
-version: 1.2.8
+version: 1.2.9
 synopsis: A Haskell implementation of Engine.IO
 homepage: http://github.com/ocharles/engine.io
 license: BSD3
diff --git a/src/Network/EngineIO.hs b/src/Network/EngineIO.hs
--- a/src/Network/EngineIO.hs
+++ b/src/Network/EngineIO.hs
@@ -586,10 +586,16 @@
         p <- STM.atomically (STM.readTChan wsOut)
         sendPacket conn p
 
-      finally (do Async.link reader
-                  forever (receivePacket conn >>= STM.atomically . STM.writeTChan wsIn))
-              (do Async.cancel reader
-                  STM.atomically (STM.writeTChan wsIn (Packet Close (TextPacket Text.empty))))
+      fix $ \loop -> do
+        e <- try (receivePacket conn >>= STM.atomically . STM.writeTChan wsIn)
+        case e of
+          Left (SomeException _) ->
+            return ()
+
+          Right _ -> loop
+
+      Async.cancel reader
+      STM.atomically (STM.writeTChan wsIn (Packet Close (TextPacket Text.empty)))
 
   receivePacket conn = do
     msg <- WebSockets.receiveDataMessage conn
