{"id":1918,"date":"2017-05-11T01:21:06","date_gmt":"2017-05-11T01:21:06","guid":{"rendered":"http:\/\/www.jaaronanderson.com\/blog\/?p=1918"},"modified":"2017-05-11T15:47:34","modified_gmt":"2017-05-11T15:47:34","slug":"html5-node-rtc","status":"publish","type":"post","link":"http:\/\/www.jaaronanderson.com\/blog\/html5-node-rtc\/","title":{"rendered":"HTML5 Node &#038; RTC"},"content":{"rendered":"<p>Local Storage API &amp; Session Tab-based storage : <span class=\"transcript ga current\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"74.07\">persistent storage in a user&#8217;s browser not cookies old school- where cookies made full trips w\/ every request .<\/span><\/p>\n<p>Canvas API<\/p>\n<p>HTML facade<\/p>\n<p>NPM<\/p>\n<p>&nbsp;<\/p>\n<p>getUserMedia &#8230; webcam , mic , screencapture\u00a0 user data streams&#8230;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<div id=\"transcripts-container\" class=\"section-module autoscroll autoscroll-disabled\">\n<div class=\"row transcript-items\">\n<div class=\"toc-video-item current\" data-video-id=\"577263\" data-item-id=\"577263\" data-item-type=\"video\">\n<div class=\"video-transcript-cont\">\n<div class=\"row transcripts video-transcripts\" data-video-duration=\"622.06\">\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"4.02\">ref.Kyle Simpson<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"5.02\">WebSockets, this will be the last thing that we talk<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"7.05\">about HTML5 at the moment.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"9.05\">Now, I&#8217;m not going to actually show you a facade<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"11.09\">for WebSockets, I&#8217;m actually going to show you<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"13.07\">a snippet of code that comes from a framework<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"15.07\">for WebSockets, and there&#8217;s a purpose to that.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"19.01\">I initially had envisioned that someday I would write<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"22.05\">a WebSockets client facade.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"25.06\">A facade that wraps around the client API<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"28.04\">for WebSockets, because there is a client API<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"30.08\">it&#8217;s capital w, capital s, WebSockets<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"33.02\">and it&#8217;s built into the browser.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"34.05\">So if there&#8217;s a native API for it,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"36.03\">we should have a facade, that was my initial goal.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"39.03\">But I got to realizing that most of,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"42.05\">almost everybody, I don&#8217;t think I&#8217;ve ever met somebody,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"44.09\">that actually does WebSockets directly against the API.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"48.08\">The primary reason for that is that we&#8217;re all using<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"51.04\">frameworks because we not only have to do the client side,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"54.08\">but we also have to do the server side.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"57\">And the server side is a lot harder.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"59\">And so we use frameworks like Socket.IO,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"62.01\">or Pusher, or any of these other ones,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"64.02\">and those frameworks already wrap around the client for you.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"68.05\">So there&#8217;s just a much less need for a facade,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"70.06\">it doesn&#8217;t mean that there&#8217;s zero need.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"72.02\">But it&#8217;s a lot lower on the priority list.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"74.02\">So I&#8217;m actually going to show you Socket.IO.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"76.07\">That&#8217;s just because I&#8217;m most familiar with it.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"79.02\">I&#8217;m not at all saying it&#8217;s the best,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"80.09\">it hasn&#8217;t been updated in a while,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"83.01\">and it may or may not even be alive as a project,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"85.07\">I don&#8217;t know, but it&#8217;s the one<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"87\">I&#8217;m most familiar with,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"87.08\">so that&#8217;s the one I&#8217;m going to demonstrate today.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"90.01\">There&#8217;s lots of other ones.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"91.03\">So, what is WebSockets all about?<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"92.09\">Well, when we talk about communication technologies,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"97\">we know that we&#8217;ve got Ajax,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"98.09\">we&#8217;ve had that for years.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"99.09\">We know that involves a round trip from the client browser<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"104.09\">back to the server and then back.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"107\">And the problem with those Ajax requests<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"109.05\">from a performance perspective<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"111.02\">is the overhead involved in the client initiating a request,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"114.04\">the server initiating a response thread,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"116.01\">and responding, and all of that transfer of data,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"119.02\">and plus all of the overhead because HTTP packets<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"121.06\">have 1,200 or more bytes for every single, you know, request<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"126\">that&#8217;s getting sent across and things like that.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"128.02\">So, these sorts of requests are not terribly efficient.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"131\">They work when we just, you know, once every couple<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"133.08\">of minutes we need to ask for an update,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"135.08\">but if you&#8217;re asking for something five times a second,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"138.03\">you don&#8217;t want to be making Ajax requests,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"139.08\">it&#8217;s highly inefficient.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"141.03\">So, there&#8217;s a whole class of things that we wanted to do<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"144.03\">with the web that we really couldn&#8217;t do<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"147.02\">because Ajax just wasn&#8217;t performance enough for us<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"149.08\">to do, real time gaming for instance,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"152.02\">if you&#8217;re playing a first person shooter game<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"154\">you&#8217;re expecting, you know, in terms of your ping time<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"157.06\">and your latency, you&#8217;re expecting thirty, forty<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"160.04\">milliseconds at the longest.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"162.07\">Or you&#8217;re just going to lose<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"164\">because everybody else&#8217;s screen is updating faster<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"166.02\">than yours.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"167.03\">Well we couldn&#8217;t do that with Ajax<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"168.05\">it just wasn&#8217;t practical.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"169.07\">So the web was limited in terms of its capability.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"173.01\">So, think about Ajax as a communication medium.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"177.02\">Ajax was capable in general just as sort of a<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"180.02\">general broad brush thing.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"182.03\">On the global scale.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"185.04\">As an average, an Ajax request probably averages<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"188.05\">anywhere from 500 to 800 milliseconds total roundtrip.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"193.07\">From the time you make the request<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"195\">to the time you get a response back.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"196.07\">500 to 800 milliseconds is just a general average.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"200.02\">When we start talking about WebSockets<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"201.06\">a different technology entirely,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"203.01\">well not entirely.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"204\">But, it makes the initial HTTP request,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"206.04\">there&#8217;s an initial roundtrip.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"208.02\">So we have that initial latency.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"209.07\">But then we keep the socket open.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"211.07\">It&#8217;s a persistent socket.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"213.03\">So we keep the WebSockets open and<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"215.06\">the next time we need any interchange<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"217.07\">in either direction<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"218.08\">the server to the client,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"220\">client to server, or both,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"222.04\">we don&#8217;t have to establish a new connection.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"224.01\">We have that connection already established.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"226.02\">And rather than needing to send a packet that might<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"228.02\">have 1,200 or more bytes as the header, the overhead<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"232.06\">the WebSockets header is eight bytes,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"235.02\">which is drastically smaller.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"236.05\">So we&#8217;re sending a lot less information<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"238.03\">we have a persistent socket<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"239.04\">so we&#8217;re not paying the penalty to open up<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"241.06\">and close connections all of the time.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"243.06\">And we see again a general average<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"245.07\">that if you&#8217;re able to establish a WebSockets connection<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"248.07\">on average you&#8217;re going to get anywhere from 50 to 100<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"250.08\">milliseconds latency in terms of your roundtrip times<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"254.05\">and communication, so we drastically reduce from<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"257.05\">500, 900 milliseconds, that huge range<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"260.05\">all the way down to 50 to 100 milliseconds,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"262.08\">almost an order of magnitude in terms of improvement.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"267.09\">But even 100 milliseconds is still too slow<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"270.02\">for a lot of things.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"271\">Even 100 milliseconds, if that was the roundtrip time,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"273.05\">might be too slow for the most high performance of games.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"277\">Not all games are too slow for that.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"278.05\">So, I worked at gaming company a couple of years back.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"282.06\">I won&#8217;t name them.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"283.05\">But they&#8217;re a big gaming company,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"284.07\">you probably know about them.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"285.08\">And we built an online game<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"287.05\">that was a Bingo! game<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"289.06\">and Bingo! is a real<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"291.06\">live thing, I&#8217;m playing against other people.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"295.05\">But, the difference between 100 milliseconds and<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"297.08\">90 milliseconds isn&#8217;t usually going to<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"300.03\">determine different winners.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"301.09\">There is a possibility of that<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"303.01\">but for the most part<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"304.02\">that game play could tolerate WebSockets<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"306.08\">and so, we built the game off of WebSockets.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"309.02\">Certainly it would not have tolerated Ajax.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"311.07\">You know, if we had 60 million people playing,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"314.09\">based upon Ajax technology<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"316.05\">not only would that have killed our servers<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"318\">but it also, everybody would have been going too slow<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"320.03\">if they were having to wait a whole second or more<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"323.09\">to hear back responses on the Bingo! calls or whatever.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"326.08\">So WebSockets enabled a whole bunch of other things<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"329.04\">that couldn&#8217;t be done before.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"330.08\">Real-time stock updates and things like that.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"333.03\">Let me take just a moment by the way<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"335\">to talk about real-time for a moment.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"336.04\">That phrase real-time is kind of misnomer<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"340\">because I took computer science<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"341.05\">I don&#8217;t know if any of you took computer science,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"343.03\">but I remember I had this crotchety old professor<\/span> <span class=\"transcript ga current\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"346\">that was so mad when anybody would use the phrase real-time<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"350.05\">dealing with software<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"352\">because they almost never actually meant real-time.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"355.02\">He had actually spent time writing true real-time software<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"360.03\">for things like controlling a nuclear reactor.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"363.03\">Where the response time had to be sub-millisecond<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"366.06\">microsecond, nanosecond type response times.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"369.08\">And that&#8217;s the kind of software that he thought of<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"372.03\">when he heard the phrase real-time.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"373.09\">We&#8217;re obviously not talking about microsecond response times<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"376.07\">in our software.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"377.07\">Alright? You&#8217;re going to have to find an entirely<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"379.06\">different line of work if that&#8217;s the kind of stuff<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"381.06\">you want to do.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"382.04\">So when we say real-time, we don&#8217;t really mean real-time<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"385.04\">in that sense.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"386.04\">We mean nearer real-time, we mean nearer immediate<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"389.03\">and it&#8217;s the spectrum.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"390.07\">So full page requests back in the HTTP 1.0 days<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"395.06\">could take anywhere from two to twenty or thirty seconds<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"398.05\">to load up a whole brand new page.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"400.05\">Way too long to get any kind of information update.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"403.02\">Then Ajax moved us down to around a second,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"405.09\">or maybe two seconds at the most<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"407.05\">for most Ajax responses to come back.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"409.07\">And now WebSockets have gotten us<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"411.01\">down to that around 100 milliseconds<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"413.03\">or somewhere below 100 milliseconds<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"415.01\">so its opened up a whole new world of things<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"416.06\">that we can do.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"417.07\">And WebSockets are really powerful.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"419.04\">Where we&#8217;re headed by the end of today<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"421.03\">is that we&#8217;re going to talk about that<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"422.02\">next leap in terms of technology<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"424.08\">and whatever, when we talk about peer-to-peer<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"427.03\">technology and where that&#8217;s going to get us<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"429.04\">in terms of latency.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"430.03\">&#8211; [Audience Member] I have a question.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"431.03\">&#8211; [Kyle Simpson] Yeah.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"432.01\">&#8211; [Audience Member] Does it take more bandwidth<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"433.03\">for WebSockets?<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"435.01\">&#8211; [Kyle Simpson] It takes a different kind<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"436.04\">of resource usage.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"437.05\">The question was does it take more bandwidth.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"439.01\">It&#8217;s a different kind of resource usage<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"441.04\">when you think about how WebSockets scale<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"443.08\">versus how HTTP like Ajax requests scale.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"449.06\">So, on the whole<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"450.08\">it&#8217;s not taking more bandwidth.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"451.09\">On the whole, it&#8217;s probably taking less bandwidth.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"453.08\">But it is in some respects a little bit more<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"456.02\">resource intensive on your server<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"457.08\">because you only have so many ports<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"459.04\">that you can stay persistently open.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"461.05\">So you scale WebSockets a little bit differently<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"463.08\">than you scale HTTP Ajax requests.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"467\">But it is possible to scale them<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"468.03\">this company scaled it out to 60 million concurrent users<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"472.01\">it is possible to do.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"473\">But it&#8217;s different than you do old school scaling.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"479.09\">Alright, so WebSockets are really powerful and cool.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"482\">The nice thing about this API that I&#8217;m going to show you<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"484.02\">a Socket.IO is that it provides a framework<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"487.03\">where if you&#8217;re working with no JS,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"489.02\">if you&#8217;re working with JavaScript<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"490.05\">on the server,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"491.05\">JavaScript on the client,<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"492.08\">the API is basically identical.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"495.03\">So you really don&#8217;t have to do very much<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"496.06\">mental context switching.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"497.08\">You write the same kind of code, and it really works<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"500.06\">in this event mechanism<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"501.09\">which you&#8217;re going to see is true of almost all the web<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"504.01\">these days, we&#8217;re moving to this event mechanism.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"506.06\">So, we listen for events by saying dot on<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"510.03\">like this reset player event from one of my games<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"512.08\">that I wrote.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"513.09\">And then we send events back<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"516.07\">by saying dot emit.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"518.07\">And listening and sending are<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"521.03\">synonymous between the browser and the client.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"525\">I mean the browser and the server.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"527\">The server can listen for events and send events.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"529.02\">The client can listen for events and send events.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"532\">Okay?<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"532.08\">And the names that you use<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"533.07\">are just arbitrary string values.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"536\">You pick whatever names you want.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"537.04\">It&#8217;s up to you to decide what your event names are called<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"539.09\">and what your<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"542.09\">what your conventions are.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"543.09\">You can name space your events or whatever.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"545.05\">But it&#8217;s just sending events back and forth.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"547.07\">And you can of course send data along<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"549.03\">like you see on line 66<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"551.02\">or sending some game session ID along<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"554.02\">things like that.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"556\">But you just listen for events<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"557.04\">and send events.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"558.06\">That&#8217;s all you need to do.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"559.07\">Now there&#8217;s one additional set of functionalities<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"562.02\">that you do on the server<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"563.07\">that don&#8217;t make even<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"564.09\">don&#8217;t make any sense on the client.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"566.07\">And that&#8217;s what we call broadcast.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"569.03\">So this is what it looks like in the client.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"573.01\">This was actually some client code<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"574.06\">if I&#8217;m correct, I&#8217;m not positive.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"577.04\">I think that was some client code.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"579\">But on the server you might be<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"581.03\">needing to do something where<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"583.08\">you have one message that you need to send out<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"586.01\">to like 100 connected players for instance.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"589\">And you could send it out 100 individual times<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"591.02\">because you&#8217;ve got a socket<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"592.03\">and you could do emit 100 times.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"594.03\">But really the more performance thing to do<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"596.04\">is do a broadcast.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"598.01\">Well a client doesn&#8217;t need to do a broadcast.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"600.01\">So that part of the API just doesn&#8217;t even exist<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"602.04\">in the client.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"603.09\">And it does exist on the server.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"605.03\">So they&#8217;re not technically identical<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"607.08\">but the on and emit parts are exactly the same.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"610.09\">So you don&#8217;t have to context switch in terms of your own.<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"613.05\">And when we get into the exercises later today<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"615.05\">right after lunch<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"616.03\">you&#8217;re going to get practice writing Socket.IO coding<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"619.05\">and you&#8217;ll see how easy it is.<\/span><\/p>\n<p><span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"620.04\">You just write dot on and dot emit<\/span> <span class=\"transcript ga\" data-ga-action=\"click\" data-ga-label=\"toc-video-transcript\" data-duration=\"622.06\">and it just magically sends these events back and forth.<\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Local Storage API &amp; Session Tab-based storage : persistent storage in a user&#8217;s browser not cookies old school- where cookies made full trips w\/ every request . Canvas API HTML facade NPM &nbsp; getUserMedia &#8230; webcam , mic , screencapture\u00a0 user data streams&#8230; &nbsp; &nbsp; ref.Kyle Simpson WebSockets, this will be the last thing that [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1918","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.jaaronanderson.com\/blog\/wp-json\/wp\/v2\/posts\/1918","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.jaaronanderson.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.jaaronanderson.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.jaaronanderson.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.jaaronanderson.com\/blog\/wp-json\/wp\/v2\/comments?post=1918"}],"version-history":[{"count":6,"href":"http:\/\/www.jaaronanderson.com\/blog\/wp-json\/wp\/v2\/posts\/1918\/revisions"}],"predecessor-version":[{"id":1924,"href":"http:\/\/www.jaaronanderson.com\/blog\/wp-json\/wp\/v2\/posts\/1918\/revisions\/1924"}],"wp:attachment":[{"href":"http:\/\/www.jaaronanderson.com\/blog\/wp-json\/wp\/v2\/media?parent=1918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.jaaronanderson.com\/blog\/wp-json\/wp\/v2\/categories?post=1918"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.jaaronanderson.com\/blog\/wp-json\/wp\/v2\/tags?post=1918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}