In the last episode, we hid the ability to send Socket.IO events behind our Socket.IO abstraction. Now we need to do the opposite: abstract away the details of receiving Socket.IO events. Designing and implementing the abstraction is easy, but we run into challenges when we try to update our existing code.