<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://socket.io/blog</id>
    <title>Socket.IO Blog</title>
    <updated>2025-08-22T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://socket.io/blog"/>
    <subtitle>Socket.IO Blog</subtitle>
    <icon>https://socket.io/images/favicon.png</icon>
    <entry>
        <title type="html"><![CDATA[Bun engine]]></title>
        <id>https://socket.io/blog/bun-engine/</id>
        <link href="https://socket.io/blog/bun-engine/"/>
        <updated>2025-08-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone!</p><p>We are happy to announce that we now provide a low-level engine for Bun.</p><div class="theme-admonition theme-admonition-note alert alert--secondary admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>for newcomers</div><div class="admonitionContent_S0QG"><p><strong>Socket.IO</strong> is a JavaScript library that enables real-time, bidirectional, and event-based communication between a client and a server. It is commonly used for building applications that require low-latency updates, such as chat applications, collaborative tools, or multiplayer games.</p><p>To achieve this, it automatically selects the best available low-level transport between <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebTransport_API" target="_blank" rel="noopener noreferrer">WebTransport</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API" target="_blank" rel="noopener noreferrer">WebSocket</a> and HTTP long-polling, based on the capabilities of the client platform and the network.</p><p><strong>Bun</strong> is a fast all-in-one JavaScript runtime developed as a modern alternative to Node.js and Deno. It is designed to offer high performance, better developer experience, and compatibility with existing JavaScript/TypeScript projects.</p><p>Reference: <a href="https://bun.sh/" target="_blank" rel="noopener noreferrer">https://bun.sh/</a></p></div></div><p>Bun could already be used without any modification:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Server</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"socket.io"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* options */</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"connection"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">listen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>However, this relied on Bun's polyfill for the Node.js HTTP server.</p><p>So, in order to fully benefit from the performance of Bun's native HTTP server, we have created a dedicated engine:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Server</span><span class="token imports"> </span><span class="token imports keyword module" style="color:#00009f">as</span><span class="token imports"> </span><span class="token imports maybe-class-name">Engine</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@socket.io/bun-engine"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Server</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"socket.io"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> engine </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Engine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">path</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/socket.io/"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">bind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">engine</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"connection"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">port</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">idleTimeout</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// must be greater than the "pingInterval" option of the engine, which defaults to 25 seconds</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">engine</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">handler</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Which means that you can now take advantage of the speed and scalability of Bun, with the same high-level API offered by Socket.IO (and its existing adapters, when scaling to multiple servers).</p><p>The source code of this engine can be found here: <a href="https://github.com/socketio/bun-engine" target="_blank" rel="noopener noreferrer">https://github.com/socketio/bun-engine</a></p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>This new engine can also be used in conjunction with Hono:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Server</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"socket.io"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Server</span><span class="token imports"> </span><span class="token imports keyword module" style="color:#00009f">as</span><span class="token imports"> </span><span class="token imports maybe-class-name">Engine</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@socket.io/bun-engine"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Hono</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"hono"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> engine </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Engine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">bind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">engine</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"connection"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Hono</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> websocket </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> engine</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">handler</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">port</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">idleTimeout</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// must be greater than the "pingInterval" option of the engine, which defaults to 25 seconds</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">req</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> server</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">URL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">req</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pathname</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/socket.io/"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> engine</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">handleRequest</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">req</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> server</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">req</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> server</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  websocket</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Reference: <a href="https://hono.dev/docs/" target="_blank" rel="noopener noreferrer">https://hono.dev/docs/</a></p></div></div><p>Have a great day!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[npm package provenance]]></title>
        <id>https://socket.io/blog/npm-package-provenance/</id>
        <link href="https://socket.io/blog/npm-package-provenance/"/>
        <updated>2024-07-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone!</p><p>We are happy to announce that Socket.IO packages will now be published with a provenance statement.</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>Package provenance is a npm feature which was introduced last year to increase trust in the npm supply chain.</p><p>The idea is that the package is published and signed from a trusted CI/CD platform (such as GitHub Actions), so the code that ends up in the registry cannot be tampered with.</p><p>More info: <a href="https://github.blog/security/supply-chain-security/introducing-npm-package-provenance/" target="_blank" rel="noopener noreferrer">https://github.blog/security/supply-chain-security/introducing-npm-package-provenance/</a></p></div></div><p>Starting today, new Socket.IO versions will be published directly from GitHub Actions and no longer from a maintainer machine.</p><p>The publication workflow can be found here: <a href="https://github.com/socketio/socket.io/blob/main/.github/workflows/publish.yml" target="_blank" rel="noopener noreferrer"><code>publish.yml</code></a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="notes">Notes<a href="#notes" class="hash-link" aria-label="Direct link to Notes" title="Direct link to Notes">​</a></h2><p>There are a few notable differences from the <a href="https://docs.npmjs.com/generating-provenance-statements" target="_blank" rel="noopener noreferrer">reference workflow</a>:</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="workflow-trigger">Workflow trigger<a href="#workflow-trigger" class="hash-link" aria-label="Direct link to Workflow trigger" title="Direct link to Workflow trigger">​</a></h3><p>The workflow is triggered when pushing a tag to GitHub:</p><div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">push</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'**@*'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The expected format is <code>&lt;package&gt;@&lt;version&gt;</code>, for example:</p><ul><li><code>socket.io@1.2.3</code></li><li><code>@socket.io/redis-adapter@3.4.5</code> (hence the <code>**</code> to match the <code>/</code> char)</li></ul><p>The <code>&lt;package&gt;</code> part is then used to select the right workspace (since we are using <a href="/blog/monorepo/">a monorepo</a>):</p><div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">jobs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">publish</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># [...]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Publish package</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> npm publish </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">workspace=$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">GITHUB_REF_NAME%@*</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">provenance </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">access public</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">env</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">NODE_AUTH_TOKEN</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> secrets.NPM_TOKEN </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Reference: <a href="https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions" target="_blank" rel="noopener noreferrer">https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions</a></p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="compilation-step">Compilation step<a href="#compilation-step" class="hash-link" aria-label="Direct link to Compilation step" title="Direct link to Compilation step">​</a></h3><p>A TypeScript compilation step is necessary, since some packages depend on the types of other packages:</p><div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">jobs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">publish</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># [...]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Compile each package</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> npm run compile </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">workspaces </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">if</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">present</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Publish package</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># [...]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="first-verified-version">First verified version<a href="#first-verified-version" class="hash-link" aria-label="Direct link to First verified version" title="Direct link to First verified version">​</a></h2><p>The latest version of the <code>engine.io-parser</code> package has been released this way.</p><p>On the <a href="https://www.npmjs.com/package/engine.io-parser" target="_blank" rel="noopener noreferrer">npmjs.com</a> website, you can find:</p><ul><li>the details of the build, at the bottom of the page:</li></ul><p><img loading="lazy" alt="Provenance details on www.npmjs.com" src="/assets/images/provenance-details-a3af0d987e0389724c5e0244055abe9a.png" width="855" height="162" class="img_ev3q"></p><ul><li>a checked badge, in the "Versions" tab</li></ul><p><img loading="lazy" alt="Provenance badge on www.npmjs.com" src="/assets/images/provenance-badge-a4562f3cf67c33da2090d3a2cbaaf4d7.png" width="779" height="543" class="img_ev3q"></p><p>You can also verify the attestations of your dependencies:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> i socket.io</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">added </span><span class="token number" style="color:#36acaa">22</span><span class="token plain"> packages, and audited </span><span class="token number" style="color:#36acaa">23</span><span class="token plain"> packages </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> 853ms</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">found </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> vulnerabilities</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> audit signatures</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">audited </span><span class="token number" style="color:#36acaa">22</span><span class="token plain"> packages </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> 1s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">22</span><span class="token plain"> packages have verified registry signatures</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> package has a verified attestation </span><span class="token comment" style="color:#999988;font-style:italic"># &lt;-- it's a good start!</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="conclusion">Conclusion<a href="#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2><p>This is a big step forward in increasing trust in the JS ecosystem, congratulations to the npm team!</p><p>Some big names have already joined the club:</p><ul><li><a href="https://www.npmjs.com/package/axios" target="_blank" rel="noopener noreferrer">axios</a></li><li><a href="https://www.npmjs.com/package/next" target="_blank" rel="noopener noreferrer">next</a></li><li><a href="https://www.npmjs.com/package/vite" target="_blank" rel="noopener noreferrer">vite</a></li></ul><p>That's all folks, thanks for reading!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO monorepo]]></title>
        <id>https://socket.io/blog/monorepo/</id>
        <link href="https://socket.io/blog/monorepo/"/>
        <updated>2024-07-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone!</p><p>We are happy to announce that the Socket.IO codebase has been merged into a monorepo.</p><div class="theme-admonition theme-admonition-note alert alert--secondary admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_S0QG"><p>A monorepo is a single repository containing multiple distinct projects, with well-defined relationships.</p><p>More info <a href="https://monorepo.tools" target="_blank" rel="noopener noreferrer">here</a></p></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="modular-architecture">Modular architecture<a href="#modular-architecture" class="hash-link" aria-label="Direct link to Modular architecture" title="Direct link to Modular architecture">​</a></h2><p>As part of the work towards <a href="/blog/introducing-socket-io-1-0/">v1.0</a> ten years ago (!), the Socket.IO codebase was split into several packages, each with its own responsibility:</p><p><img loading="lazy" alt="Diagram of the package inter-dependencies" src="/assets/images/packages-fc6d12d93e4f983adae7e09938deaf20.png" width="1074" height="796" class="img_ev3q"></p><p>At the time, tools like <a href="https://lerna.js.org/" target="_blank" rel="noopener noreferrer"><code>lerna</code></a> or <a href="https://pnpm.io/workspaces" target="_blank" rel="noopener noreferrer">pnpm workspaces</a> that make it easier to develop and publish multiple JavaScript packages from the same repository did not exist yet, so the codebase was split into multiple GitHub repositories:</p><ul><li><a href="https://github.com/socketio/socket.io" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io</a></li><li><a href="https://github.com/socketio/socket.io-client" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-client</a></li><li><a href="https://github.com/socketio/socket.io-parser" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-parser</a></li><li>...</li></ul><p>However, this structure has several downsides:</p><ul><li>it's harder for newcomers to dig into the codebase and understand what's going on under the hood</li><li>a change that affects multiple repositories is more difficult to test</li><li>mundane tasks like configuring CI or updating development dependencies must be replicated across all repositories</li></ul><p>That's why we have made the decision to merge all repositories into <a href="https://github.com/socketio/socket.io" target="_blank" rel="noopener noreferrer">a single one</a>. The source codes for the different packages are now located in the <code>packages/</code> directory:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">packages/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── engine.io</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── engine.io-client</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── engine.io-parser</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── socket.io</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── socket.io-adapter</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── socket.io-client</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── socket.io-parser</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="workspaces">Workspaces<a href="#workspaces" class="hash-link" aria-label="Direct link to Workspaces" title="Direct link to Workspaces">​</a></h2><p>To manage the packages, we use <a href="https://docs.npmjs.com/cli/v10/using-npm/workspaces" target="_blank" rel="noopener noreferrer">npm workspaces</a> which were introduced in npm v7 (bundled with Node.js v15). The <code>package.json</code> file at the root of the repository lists all packages and their development dependencies:</p><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">package.json</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"private"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"workspaces"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"packages/engine.io-parser"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"packages/engine.io"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"packages/engine.io-client"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"packages/socket.io-adapter"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"packages/socket.io-parser"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"packages/socket.io-client"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"packages/socket.io"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"devDependencies"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// [...]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>After cloning the repository, running <code>npm install</code> will fetch all necessary dependencies and create the links between the packages:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ls</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">socket.io@ /git/socket.io</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└─┬ socket.io@4.7.5 -</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> ./packages/socket.io</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├── accepts@1.3.8</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├── base64id@2.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├── cors@2.8.5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├── debug@4.3.5</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  ├── engine.io@6.6.0 -</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> ./packages/engine.io</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  ├─┬ socket.io-adapter@2.5.5 -</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> ./packages/socket.io-adapter</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  │ ├── debug@4.3.5 deduped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  │ └── ws@8.17.1 overridden</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  └─┬ socket.io-parser@4.2.4 -</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> ./packages/socket.io-parser</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ├── @socket.io/component-emitter@3.1.2 -</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> ./packages/socket.io-component-emitter</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    └── debug@4.3.5 deduped</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>And finally, running <code>npm test --workspaces</code> (or <code>npm test -ws</code>) will run the tests on all workspaces, ensuring that any change is properly tested over the whole codebase.</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>Our <a href="https://github.com/socketio/socket.io/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer">contributing guide</a> has been updated accordingly.</p></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="git-history">Git history<a href="#git-history" class="hash-link" aria-label="Direct link to Git history" title="Direct link to Git history">​</a></h2><p>Obviously, losing 10 years of git history from the other repositories was not an option. The repositories have thus been merged with the <code>--allow-unrelated-histories</code> option, in order to include their history in the monorepo:</p><p><img loading="lazy" alt="Schema of the preserved git history" src="/assets/images/git-history-df971b02f81f1370bf2410f76b1d16d9.png" width="1468" height="739" class="img_ev3q"></p><p>Reference: <a href="https://git-scm.com/docs/git-merge#Documentation/git-merge.txt---allow-unrelated-histories" target="_blank" rel="noopener noreferrer">https://git-scm.com/docs/git-merge#Documentation/git-merge.txt---allow-unrelated-histories</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="github-issues">GitHub issues<a href="#github-issues" class="hash-link" aria-label="Direct link to GitHub issues" title="Direct link to GitHub issues">​</a></h2><p>Similarly, it was not conceivable to lose the list of open GitHub issues across all repositories, since it is our most valuable source of user feedback, so they have been moved to the main repository: <a href="https://github.com/socketio/socket.io/issues" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io/issues</a></p><p>Hopefully, this change should make it easier for anyone to contribute to the project in the future.</p><p>That's all folks, thanks for reading!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Three new adapters]]></title>
        <id>https://socket.io/blog/three-new-adapters/</id>
        <link href="https://socket.io/blog/three-new-adapters/"/>
        <updated>2024-03-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone!</p><p>I'm happy to announce that we provide 3 new official adapters:</p><ul><li>the <a href="/docs/v4/gcp-pubsub-adapter/">Google Cloud Pub/Sub adapter</a></li><li>the <a href="/docs/v4/aws-sqs-adapter/">AWS SQS adapter</a></li><li>the <a href="/docs/v4/azure-service-bus-adapter/">Azure Service Bus adapter</a></li></ul><p>Any feedback is welcome!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Chat platform]]></title>
        <id>https://socket.io/blog/chat-platform/</id>
        <link href="https://socket.io/blog/chat-platform/"/>
        <updated>2024-01-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone!</p><p>A new sample project is available: the <strong>Chat platform</strong>.</p><p>The source code can be found <a href="https://github.com/socketio/socket.io-chat-platform" target="_blank" rel="noopener noreferrer">here</a>.</p><div class="theme-admonition theme-admonition-note alert alert--secondary admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>for newcomers</div><div class="admonitionContent_S0QG"><p>Socket.IO is a library that enables low-latency, bidirectional and event-based communication between a client and a server.</p><p>To achieve this, it automatically selects the best available low-level transport between <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebTransport_API" target="_blank" rel="noopener noreferrer">WebTransport</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API" target="_blank" rel="noopener noreferrer">WebSocket</a> and HTTP long-polling, based on the capabilities of the client platform and the network.</p></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="goal">Goal<a href="#goal" class="hash-link" aria-label="Direct link to Goal" title="Direct link to Goal">​</a></h2><p>The goal of this project is to provide a full-blown project based on Socket.IO with:</p><ul><li>authentication/user registration</li><li>public and private messaging</li><li>proper reconnection management</li><li>presence management</li></ul><p>The source code is provided with a permissive MIT license, so that you can use it/extend it to your will.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-to-use">How to use<a href="#how-to-use" class="hash-link" aria-label="Direct link to How to use" title="Direct link to How to use">​</a></h2><p>Check out the code <a href="https://github.com/socketio/socket.io-chat-platform" target="_blank" rel="noopener noreferrer">here</a> and follow the instructions in the README.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="channel-based-messages">Channel-based messages<a href="#channel-based-messages" class="hash-link" aria-label="Direct link to Channel-based messages" title="Direct link to Channel-based messages">​</a></h3><p><img loading="lazy" alt="Screenshot of a public channel" src="/assets/images/channel_based_messages-e47afe4bd8d7b48f77493987d1cbdc23.png" width="960" height="713" class="img_ev3q"></p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="private-messages">Private messages<a href="#private-messages" class="hash-link" aria-label="Direct link to Private messages" title="Direct link to Private messages">​</a></h3><p><img loading="lazy" alt="Screenshot of a private channel" src="/assets/images/private_messages-da29f732b66ddc3c178de377d9ba6725.png" width="960" height="713" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="tools">Tools<a href="#tools" class="hash-link" aria-label="Direct link to Tools" title="Direct link to Tools">​</a></h2><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="server">Server<a href="#server" class="hash-link" aria-label="Direct link to Server" title="Direct link to Server">​</a></h3><p>The server is written in plain JavaScript, with the <a href="https://expressjs.com/" target="_blank" rel="noopener noreferrer"><code>express</code></a>, <code>express-session</code> and <a href="https://www.passportjs.org/" target="_blank" rel="noopener noreferrer"><code>passport</code></a> packages. The database is <a href="https://www.postgresql.org/" target="_blank" rel="noopener noreferrer">PostgreSQL</a>.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="client">Client<a href="#client" class="hash-link" aria-label="Direct link to Client" title="Direct link to Client">​</a></h3><p>The client is a <a href="https://vuejs.org/" target="_blank" rel="noopener noreferrer">Vue.js</a> single-page application, with the <a href="https://router.vuejs.org/" target="_blank" rel="noopener noreferrer"><code>vue-router</code></a> and <a href="https://pinia.vuejs.org/" target="_blank" rel="noopener noreferrer"><code>pinia</code></a> packages. It uses <a href="https://getbootstrap.com/" target="_blank" rel="noopener noreferrer">Bootstrap v5</a> for the styles.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="roadmap">Roadmap<a href="#roadmap" class="hash-link" aria-label="Direct link to Roadmap" title="Direct link to Roadmap">​</a></h2><ul><li>React client (<a href="https://github.com/socketio/socket.io-chat-platform/issues/1" target="_blank" rel="noopener noreferrer">link</a>)</li><li>MongoDB server (<a href="https://github.com/socketio/socket.io-chat-platform/issues/2" target="_blank" rel="noopener noreferrer">link</a>)</li></ul><p>Any additional suggestion is welcome!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO on Azure]]></title>
        <id>https://socket.io/blog/socket-io-on-azure-preview/</id>
        <link href="https://socket.io/blog/socket-io-on-azure-preview/"/>
        <updated>2023-08-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[- Overview of Socket.IO support on Azure]]></summary>
        <content type="html"><![CDATA[<ul><li><a href="https://learn.microsoft.com/azure/azure-web-pubsub/socketio-overview" target="_blank" rel="noopener noreferrer">Overview of Socket.IO support on Azure</a></li><li><a href="https://learn.microsoft.com/azure/azure-web-pubsub/socketio-quickstart" target="_blank" rel="noopener noreferrer">Quickstarts of hosting a Socket.IO app on Azure</a></li></ul><p>Hello developers, </p><p>Since we put up an invitation to participate in a user study, we collected <strong>hundreds of responses</strong> and had the chance to speak in depth with several Socket.IO users. Thank you for your interest in the user study and helping us understand your experience. </p><p>In this post, I am going to share with you some notable learnings from the study. It’s our hope that such sharing can shed light on how we can build a stronger community as Socket.IO users, contributors, and cloud providers. </p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="socketio-is-used-in-a-wide-range-of-app-scenarios">Socket.IO is used in a wide range of app scenarios<a href="#socketio-is-used-in-a-wide-range-of-app-scenarios" class="hash-link" aria-label="Direct link to Socket.IO is used in a wide range of app scenarios" title="Direct link to Socket.IO is used in a wide range of app scenarios">​</a></h2><p>We were pleasantly surprised by the variety of applications built using Socket.IO. Although a fair number of users reported building chat apps using Socket.IO, many shared that they use Socket.IO for identity management to limit the number of active browser tabs, for robotics to control the movement of mobile robots, for multi-player mobile games and for collaborative apps where users can track work items in real-time.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="overwhelmingly-users-enjoy-the-intuitive-apis">Overwhelmingly, users enjoy the “intuitive APIs”<a href="#overwhelmingly-users-enjoy-the-intuitive-apis" class="hash-link" aria-label="Direct link to Overwhelmingly, users enjoy the “intuitive APIs”" title="Direct link to Overwhelmingly, users enjoy the “intuitive APIs”">​</a></h2><p>Users seem to have exhausted the synonyms for “intuitive” in their responses. Once users have gone over the initial learning curve, it doesn’t take long before they can get productive with Socket.IO’s APIs, which are described as “simple”, “easy” and “plain”. Plains APIs are definitely a praise in this case.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="some-users-seem-to-have-doubts-about-socketios-viability-for-large-projects">Some users seem to have doubts about Socket.IO’s viability for large projects<a href="#some-users-seem-to-have-doubts-about-socketios-viability-for-large-projects" class="hash-link" aria-label="Direct link to Some users seem to have doubts about Socket.IO’s viability for large projects" title="Direct link to Some users seem to have doubts about Socket.IO’s viability for large projects">​</a></h2><p>Users new to Socket.IO seem to have the impression that Socket.IO is for small-scale and toy projects and it would be necessary to find alternatives when an app needs to scale. I am happy to report that impression doesn’t reflect the reality; a few Socket.IO users shared that their apps handled 10s of thousand concurrent connections well, powered by running multiple Socket.IO instances behind a load balancer.  </p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="scaling-out-a-socketio-is-where-developers-report-the-most-pain">Scaling out a Socket.IO is where developers report the most pain<a href="#scaling-out-a-socketio-is-where-developers-report-the-most-pain" class="hash-link" aria-label="Direct link to Scaling out a Socket.IO is where developers report the most pain" title="Direct link to Scaling out a Socket.IO is where developers report the most pain">​</a></h2><p>Scaling out a Socket.IO app requires a multi-server setup. Essentially, client connections are spread across several Socket.IO server instances. To emit an event to clients connected with different server instances, there needs to be a component to coordinate the message passing. While simple in broad-stroke description, implementation is not particularly straight-forward or familiar to most users. Deploying and maintaining a separate adapter component add additional complexity to the task. </p><p>This is an area where we studied the most and thought we could bring the most value to developers. I am happy to share with you that with the input from the open-source community, we brought support for Socket.IO on Azure. With this support, Azure hosts and manages client connections; in other words, developers don’t need an “adapter” component. </p><p>What’s more important is that server and client apps continue using the <strong>same and familiar Socket.IO APIs</strong>. With only a few lines of code, you can get any socket.io apps running locally to Azure. You can learn more about the support and try it out for free by following the links below.</p><ul><li><a href="https://learn.microsoft.com/azure/azure-web-pubsub/socketio-overview" target="_blank" rel="noopener noreferrer">Overview of Socket.IO support on Azure</a></li><li><a href="https://learn.microsoft.com/azure/azure-web-pubsub/socketio-quickstart" target="_blank" rel="noopener noreferrer">Quickstarts of hosting a Socket.IO app on Azure</a></li></ul>]]></content>
        <author>
            <name>Kevin Guo</name>
            <uri>https://github.com/kevinguo-ed</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Redis Streams adapter]]></title>
        <id>https://socket.io/blog/socket-io-redis-streams-adapter/</id>
        <link href="https://socket.io/blog/socket-io-redis-streams-adapter/"/>
        <updated>2023-04-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone!</p><p>There is a new official adapter for Socket.IO: the <a href="/docs/v4/redis-streams-adapter/">Redis Streams adapter</a>.</p><div class="theme-admonition theme-admonition-note alert alert--secondary admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_S0QG"><p>An Adapter is a server-side component which is responsible for forwarding packets within a cluster of Socket.IO servers.</p><p>More information <a href="/docs/v4/adapter/">here</a>.</p></div></div><p>The adapter will use a <a href="https://redis.io/docs/data-types/streams/" target="_blank" rel="noopener noreferrer">Redis stream</a> to forward packets between the Socket.IO servers.</p><p>The main difference with the existing Redis adapter (which use the <a href="https://redis.io/docs/manual/pubsub/" target="_blank" rel="noopener noreferrer">Redis Pub/Sub mechanism</a>) is that this adapter will properly handle any temporary disconnection to the Redis server and resume the stream without losing any packets.</p><p>See also:</p><ul><li><a href="/docs/v4/redis-streams-adapter/#installation">Installation steps</a></li><li><a href="https://github.com/socketio/socket.io-redis-streams-adapter" target="_blank" rel="noopener noreferrer">Source code</a></li></ul><p>If you have any feedback, feel free to open an issue in the repository.</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO server for Deno]]></title>
        <id>https://socket.io/blog/socket-io-deno/</id>
        <link href="https://socket.io/blog/socket-io-deno/"/>
        <updated>2022-09-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone!</p><p>I'm happy to announce that Socket.IO is now compatible with <a href="https://deno.land/" target="_blank" rel="noopener noreferrer">Deno</a>, which is a runtime for JavaScript and TypeScript written in Rust.</p><p>Usage:</p><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> serve </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://deno.land/std@0.150.0/http/server.ts"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Server </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://deno.land/x/socket_io@0.1.1/mod.ts"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"connection"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token builtin">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">socket </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">socket</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation">id</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c"> connected</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"hello"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"world"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"disconnect"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">reason</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">socket </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">socket</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation">id</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c"> disconnected due to </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">reason</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">serve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">handler</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  port</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>And then run with:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ deno run --allow-net index.ts</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The API is very similar to the one exposed by the Node.js implementation.</p><p>Next steps:</p><ul><li>client implementation</li><li>compatibility with the Node.js ecosystem (msgpack parser, adapters, admin UI, ...)</li></ul><p>Feedback is welcome!</p><ul><li>Source code: <a href="https://github.com/socketio/socket.io-deno" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-deno</a></li><li>Module: <a href="https://deno.land/x/socket_io" target="_blank" rel="noopener noreferrer">https://deno.land/x/socket_io</a></li></ul>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 4.5.0]]></title>
        <id>https://socket.io/blog/socket-io-4-5-0/</id>
        <link href="https://socket.io/blog/socket-io-4-5-0/"/>
        <updated>2022-04-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone!</p><p>We have just published a new minor version of Socket.IO: <code>4.5.0</code></p><p>Here are the new features in this release:</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="catch-all-listeners-for-outgoing-packets">Catch-all listeners for outgoing packets<a href="#catch-all-listeners-for-outgoing-packets" class="hash-link" aria-label="Direct link to Catch-all listeners for outgoing packets" title="Direct link to Catch-all listeners for outgoing packets">​</a></h2><p>This is similar to <a href="/docs/v4/server-api/#socketonanycallback"><code>onAny()</code></a>, but for outgoing packets.</p><p>Syntax:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">onAnyOutgoing</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> </span><span class="token parameter spread operator" style="color:#393A34">...</span><span class="token parameter">args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This feature can be used on both sides, and will also work when <a href="/docs/v4/broadcasting-events/">broadcasting events</a>:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"connection"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">onAnyOutgoing</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> </span><span class="token parameter spread operator" style="color:#393A34">...</span><span class="token parameter">args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// prints "some event"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"some event"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="multiple-acknowledgements-when-broadcasting">Multiple acknowledgements when broadcasting<a href="#multiple-acknowledgements-when-broadcasting" class="hash-link" aria-label="Direct link to Multiple acknowledgements when broadcasting" title="Direct link to Multiple acknowledgements when broadcasting">​</a></h2><p>You can now broadcast an event to multiple clients and expect an acknowledgement:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">timeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"some-event"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">err</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> responses</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// some clients did not acknowledge the event in the given delay</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">responses</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// one response per client</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="limit-the-number-of-packets-sent-in-http-long-polling-mode">Limit the number of packets sent in HTTP long-polling mode<a href="#limit-the-number-of-packets-sent-in-http-long-polling-mode" class="hash-link" aria-label="Direct link to Limit the number of packets sent in HTTP long-polling mode" title="Direct link to Limit the number of packets sent in HTTP long-polling mode">​</a></h2><p>The server will now include the value of the <a href="/docs/v4/server-options/#maxhttpbuffersize"><code>maxHttpBufferSize</code></a> in the handshake, so the clients will now be able to decide how many packets they have to send to stay under this value.</p><p>Here is what the handshake will now look like:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">0{"sid":"lv_VI97HAXpY6yYWAAAC","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000,"maxPayload":1000000}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>More information <a href="https://github.com/socketio/socket.io-client/issues/1531" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="disconnection-details">Disconnection details<a href="#disconnection-details" class="hash-link" aria-label="Direct link to Disconnection details" title="Direct link to Disconnection details">​</a></h2><p>The "disconnect" event on the client side will now include additional details to help debugging if anything has gone wrong.</p><p>Example when <a href="/docs/v4/using-multiple-nodes/#why-is-sticky-session-required">sticky session is not enabled</a>:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"disconnect"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">reason</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> details</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">details</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">status</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 400</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">details</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">responseText</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// '{"code":1,"message":"Session ID unknown"}'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This release also includes some bug fixes, please see the complete diff below.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="links">Links<a href="#links" class="hash-link" aria-label="Direct link to Links" title="Direct link to Links">​</a></h2><ul><li>Server: <a href="https://github.com/socketio/socket.io/releases/tag/4.5.0" target="_blank" rel="noopener noreferrer">GitHub release</a> / <a href="https://github.com/socketio/socket.io/compare/4.4.1...4.5.0" target="_blank" rel="noopener noreferrer">Diff</a> / <a href="https://www.npmjs.com/package/socket.io/v/4.5.0" target="_blank" rel="noopener noreferrer">npm</a></li><li>Client: <a href="https://github.com/socketio/socket.io-client/releases/tag/4.5.0" target="_blank" rel="noopener noreferrer">GitHub release</a> / <a href="https://github.com/socketio/socket.io-client/compare/4.4.1...4.5.0" target="_blank" rel="noopener noreferrer">Diff</a> / <a href="https://www.npmjs.com/package/socket.io-client/v/4.5.0" target="_blank" rel="noopener noreferrer">npm</a></li></ul><p>Size of the bundles:</p><table><thead><tr><th></th><th>min</th><th>min+gzip</th></tr></thead><tbody><tr><td>socket.io.min.js</td><td>42.6 KB (+ 2.2 KB ⬆️)</td><td>13.6 KB (+ 0.5 KB ⬆️)</td></tr><tr><td>socket.io.msgpack.min.js</td><td>47.7 KB (+ 2.1 KB ⬆️)</td><td>14.6 KB (+ 0.4 KB ⬆️)</td></tr><tr><td>socket.io.esm.min.js</td><td>34.5 KB (+ 1.4 KB ⬆️)</td><td>11.5 KB (+ 0.2 KB ⬆️)</td></tr></tbody></table><p>That's all for this release, thanks for reading!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 4.4.0]]></title>
        <id>https://socket.io/blog/socket-io-4-4-0/</id>
        <link href="https://socket.io/blog/socket-io-4-4-0/"/>
        <updated>2021-11-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone!</p><p>We have just published a new minor version of Socket.IO: <code>4.4.0</code></p><p>After a big focus on the client in the <a href="/blog/socket-io-4-3-0/">latest release</a>, this release is more oriented towards the server.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="support-for-µwebsocketsjs">Support for µWebSockets.js<a href="#support-for-µwebsocketsjs" class="hash-link" aria-label="Direct link to Support for µWebSockets.js" title="Direct link to Support for µWebSockets.js">​</a></h2><p>Why should one choose between performance and reliability? Starting with <code>socket.io@4.4.0</code>, you can now use the HTTP/WebSocket server provided by the <a href="https://github.com/uNetworking/uWebSockets.js" target="_blank" rel="noopener noreferrer"><code>µWebSockets.js</code></a> package:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token maybe-class-name">App</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"uWebSockets.js"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token maybe-class-name">Server</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"socket.io"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">App</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">attachApp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"connection"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">listen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">token</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">token</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">warn</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"port already in use"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>It acts as a replacement for both the default Node.js HTTP server and the WebSocket server provided by the <a href="https://github.com/websockets/ws" target="_blank" rel="noopener noreferrer"><code>ws</code></a> package, and should improve the memory footprint and the latency of your application. Benchmarks coming soon!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="emit-with-timeout">Emit with timeout<a href="#emit-with-timeout" class="hash-link" aria-label="Direct link to Emit with timeout" title="Direct link to Emit with timeout">​</a></h2><p>There is a new <code>socket.timeout()</code> method available on both sides:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">timeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"my-event"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// the other side did not acknowledge the event in the given delay</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="socketdata-can-now-be-typed"><code>socket.data</code> can now be typed<a href="#socketdata-can-now-be-typed" class="hash-link" aria-label="Direct link to socketdata-can-now-be-typed" title="Direct link to socketdata-can-now-be-typed">​</a></h2><p>For TypeScript users, the <code>socket.data</code> can now be typed:</p><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">interface</span><span class="token plain"> </span><span class="token class-name">SocketData</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  age</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token class-name operator" style="color:#393A34">&lt;</span><span class="token class-name">ClientToServerEvents</span><span class="token class-name punctuation" style="color:#393A34">,</span><span class="token class-name"> ServerToClientEvents</span><span class="token class-name punctuation" style="color:#393A34">,</span><span class="token class-name"> InterServerEvents</span><span class="token class-name punctuation" style="color:#393A34">,</span><span class="token class-name"> SocketData</span><span class="token class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"connection"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"john"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">age </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This release also includes some bug fixes, please see the complete diff below.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="links">Links<a href="#links" class="hash-link" aria-label="Direct link to Links" title="Direct link to Links">​</a></h2><ul><li>Server: <a href="https://github.com/socketio/socket.io/releases/tag/4.4.0" target="_blank" rel="noopener noreferrer">GitHub release</a> / <a href="https://github.com/socketio/socket.io/compare/4.3.2...4.4.0" target="_blank" rel="noopener noreferrer">Diff</a> / <a href="https://www.npmjs.com/package/socket.io/v/4.4.0" target="_blank" rel="noopener noreferrer">npm</a></li><li>Client: <a href="https://github.com/socketio/socket.io-client/releases/tag/4.4.0" target="_blank" rel="noopener noreferrer">GitHub release</a> / <a href="https://github.com/socketio/socket.io-client/compare/4.3.2...4.4.0" target="_blank" rel="noopener noreferrer">Diff</a> / <a href="https://www.npmjs.com/package/socket.io-client/v/4.4.0" target="_blank" rel="noopener noreferrer">npm</a></li></ul><p>Size of the bundles:</p><table><thead><tr><th></th><th>min</th><th>min+gzip</th></tr></thead><tbody><tr><td>socket.io.min.js</td><td>40.4 KB (+ 0.4 KB ⬆️)</td><td>13.1 KB (+ 0.1 KB ⬆️)</td></tr><tr><td>socket.io.msgpack.min.js</td><td>45.6 KB (+ 0.4 KB ⬆️)</td><td>14.2 KB (-)</td></tr><tr><td>socket.io.esm.min.js</td><td>33.1 KB (+ 0.3 KB ⬆️)</td><td>11.3 KB (+ 0.2 KB ⬆️)</td></tr></tbody></table><p>That's all for this release, thanks for reading!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 4.3.0]]></title>
        <id>https://socket.io/blog/socket-io-4-3-0/</id>
        <link href="https://socket.io/blog/socket-io-4-3-0/"/>
        <updated>2021-10-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone!</p><p>We have just published a new minor version of Socket.IO: <code>4.3.0</code></p><p>An ESM bundle is now provided:</p><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">type</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">module</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:#393A34"><span class="token script language-javascript">  </span><span class="token script language-javascript keyword module" style="color:#00009f">import</span><span class="token script language-javascript"> </span><span class="token script language-javascript imports punctuation" style="color:#393A34">{</span><span class="token script language-javascript imports"> io </span><span class="token script language-javascript imports punctuation" style="color:#393A34">}</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword module" style="color:#00009f">from</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:#e3116c">"https://cdn.socket.io/4.3.0/socket.io.esm.min.js"</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:#393A34"><span class="token script language-javascript" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token script language-javascript">  </span><span class="token script language-javascript keyword" style="color:#00009f">const</span><span class="token script language-javascript"> socket </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:#d73a49">io</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:#393A34"><span class="token script language-javascript" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token script language-javascript">  socket</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">emit</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript string" style="color:#e3116c">"hello"</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:#e3116c">"world"</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:#393A34"><span class="token script language-javascript"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The bundle size has been <a href="https://bundlephobia.com/package/socket.io-client@4.3.0" target="_blank" rel="noopener noreferrer">greatly reduced</a>, thanks to:</p><ul><li>the migration to <a href="https://rollupjs.org" target="_blank" rel="noopener noreferrer">rollup</a></li><li>the cleanup of some unused code</li><li>the removal of debug calls from the bundle (explanation <a href="https://github.com/socketio/engine.io-client/commit/00d7e7d7ee85b4cfa6f9f547203cc692083ac61c" target="_blank" rel="noopener noreferrer">here</a>)</li></ul><p>And finally, the Socket.IO client is now compatible with <a href="https://vitejs.dev/" target="_blank" rel="noopener noreferrer">Vite</a> (<a href="https://github.com/socketio/socket.io-client/issues/1492" target="_blank" rel="noopener noreferrer">#1492</a>).</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="links">Links<a href="#links" class="hash-link" aria-label="Direct link to Links" title="Direct link to Links">​</a></h3><ul><li>Server: <a href="https://github.com/socketio/socket.io/releases/tag/4.3.0" target="_blank" rel="noopener noreferrer">Release notes</a> / <a href="https://github.com/socketio/socket.io/compare/4.2.0...4.3.0" target="_blank" rel="noopener noreferrer">Diff</a></li><li>Client: <a href="https://github.com/socketio/socket.io-client/releases/tag/4.3.0" target="_blank" rel="noopener noreferrer">Release notes</a> / <a href="https://github.com/socketio/socket.io-client/compare/4.2.0...4.3.0" target="_blank" rel="noopener noreferrer">Diff</a></li><li><code>ws</code> version: <code>~8.2.3</code> (<a href="https://github.com/websockets/ws/compare/7.4.2...8.2.3" target="_blank" rel="noopener noreferrer">diff</a>)</li></ul><p>Size of the bundles:</p><table><thead><tr><th></th><th>min</th><th>min+gzip</th></tr></thead><tbody><tr><td>socket.io.min.js</td><td>39.9 KB (-24.6 KB ⬇️)</td><td>12.9 KB (-3.1 KB ⬇️)</td></tr><tr><td>socket.io.msgpack.min.js</td><td>45.1 KB (-25.6 KB ⬇️)</td><td>14 KB (-2.6 KB ⬇️)</td></tr><tr><td>socket.io.esm.min.js</td><td>32.7 KB</td><td>11.1 KB</td></tr></tbody></table><p>That's all for this release, thanks for reading!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Monthly update #5]]></title>
        <id>https://socket.io/blog/monthly-update-5/</id>
        <link href="https://socket.io/blog/monthly-update-5/"/>
        <updated>2021-07-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hi everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hi everyone!</p><p>Here's the #5 edition of our Monthly update.</p><p>So, what's new in the Socket.IO ecosystem?</p><ul><li><a href="#a-new-api-for-inter-server-communication">A new API for inter-server communication</a></li><li><a href="#new-official-adapters">New official adapters</a></li><li><a href="#additional-documentation">Additional documentation</a></li><li><a href="#version-updates">Version updates</a></li><li><a href="#whats-next">What's next</a></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="a-new-api-for-inter-server-communication">A new API for inter-server communication<a href="#a-new-api-for-inter-server-communication" class="hash-link" aria-label="Direct link to A new API for inter-server communication" title="Direct link to A new API for inter-server communication">​</a></h2><p>This feature had been requested for quite some time, it is now implemented in release 4.1.0. It allows to broadcast events between your Socket.IO servers.</p><p>The syntax is very similar to the existing one, except it's for server-to-server communication:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">serverSideEmit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"hello"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"world"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>And on the receiving side:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"hello"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">arg1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">arg1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// prints "world"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Acknowledgements are supported too:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// server A</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">serverSideEmit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"ping"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">err</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> responses</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">responses</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// prints "pong"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// server B</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"ping"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">cb</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">cb</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"pong"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You can find the complete release notes <a href="/blog/socket-io-4-1-0/">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-official-adapters">New official adapters<a href="#new-official-adapters" class="hash-link" aria-label="Direct link to New official adapters" title="Direct link to New official adapters">​</a></h2><p>Historically, the Redis adapter was the only official adapter when scaling to multiple nodes.</p><p>There are now three additional official adapters:</p><ul><li>the <a href="/docs/v4/mongo-adapter/">MongoDB adapter</a></li><li>the <a href="/docs/v4/postgres-adapter/">Postgres adapter</a></li><li>the <a href="/docs/v4/cluster-adapter/">cluster adapter</a></li></ul><p>Note: the first two were inspired from existing adapters maintained by the community and were updated to support Socket.IO v3.</p><p>All of them supports the <a href="/docs/v4/server-instance/#utility-methods">utility methods</a> that were added in v4, including the <code>serverSideEmit()</code> method described above.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="additional-documentation">Additional documentation<a href="#additional-documentation" class="hash-link" aria-label="Direct link to Additional documentation" title="Direct link to Additional documentation">​</a></h2><ul><li>usage with bundlers like webpack for the <a href="/docs/v4/client-with-bundlers/">client</a> and the <a href="/docs/v4/server-with-bundlers/">server</a></li><li><a href="/docs/v4/pm2/">usage with PM2</a></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="version-updates">Version updates<a href="#version-updates" class="hash-link" aria-label="Direct link to Version updates" title="Direct link to Version updates">​</a></h2><ul><li><a href="https://github.com/socketio/socket.io/releases/tag/4.1.2" target="_blank" rel="noopener noreferrer">socket.io@4.1.2</a></li><li><a href="https://github.com/socketio/socket.io-client/releases/tag/4.1.2" target="_blank" rel="noopener noreferrer">socket.io-client@4.1.2</a></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="whats-next">What's next<a href="#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next">​</a></h2><ul><li>a continuous focus on the documentation (additional code examples, extended guide, ...)</li><li>additional tooling around Socket.IO</li></ul><p>Happy coding!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 4.1.0]]></title>
        <id>https://socket.io/blog/socket-io-4-1-0/</id>
        <link href="https://socket.io/blog/socket-io-4-1-0/"/>
        <updated>2021-05-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone!</p><p>We have just published a new minor version of Socket.IO: <a href="https://github.com/socketio/socket.io/releases/tag/4.1.0" target="_blank" rel="noopener noreferrer">4.1.0</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-features">New features<a href="#new-features" class="hash-link" aria-label="Direct link to New features" title="Direct link to New features">​</a></h2><ul><li><a href="#add-support-for-inter-server-communication">Add support for inter-server communication</a></li><li><a href="#emit-an-event-when-a-namespace-is-created">Emit an event when a namespace is created</a></li><li><a href="#add-a-way-to-customize-the-response-headers">Add a way to customize the response headers</a></li><li><a href="#add-a-way-to-get-access-to-the-reason-of-a-connection-error">Add a way to get access to the reason of a connection error</a></li><li><a href="#add-a-way-to-ignore-the-beforeunload-event">Add a way to ignore the <code>beforeunload</code> event</a></li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="add-support-for-inter-server-communication">Add support for inter-server communication<a href="#add-support-for-inter-server-communication" class="hash-link" aria-label="Direct link to Add support for inter-server communication" title="Direct link to Add support for inter-server communication">​</a></h3><p>This feature might be useful in a multi-server setup: you can now broadcast events between your Socket.IO servers.</p><p>Syntax:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">serverSideEmit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"hello"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"world"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>And on the receiving side:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"hello"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">arg1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">arg1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// prints "world"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Acknowledgements are supported too:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// server A</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">serverSideEmit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"ping"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">err</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> responses</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">responses</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// prints "pong"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// server B</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"ping"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">cb</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">cb</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"pong"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>A few notes:</p><ul><li>the events are specific to each <a href="/docs/v4/namespaces/">namespace</a></li></ul><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// server A</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">of</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/custom"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">serverSideEmit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"sync"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// server B</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">of</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/custom"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"sync"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ul><li><p>the <code>connection</code>, <code>connect</code> and <code>new_namespace</code> (see <a href="#emit-an-event-when-a-namespace-is-created">below</a>) strings are reserved and cannot be used in your application.</p></li><li><p>you can send any number of arguments, but binary structures are currently not supported (the array of arguments will be <code>JSON.stringify</code>-ed)</p></li></ul><p>Example:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">serverSideEmit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"hello"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"world"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"4"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The <a href="https://github.com/socketio/socket.io-redis-adapter" target="_blank" rel="noopener noreferrer">Redis adapter</a> and its <a href="https://github.com/socketio/socket.io-redis-emitter" target="_blank" rel="noopener noreferrer">associated emitter</a> have been updated to support this new functionality.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="emit-an-event-when-a-namespace-is-created">Emit an event when a namespace is created<a href="#emit-an-event-when-a-namespace-is-created" class="hash-link" aria-label="Direct link to Emit an event when a namespace is created" title="Direct link to Emit an event when a namespace is created">​</a></h3><p>The <code>new_namespace</code> event will be emitted by the Server instance when a new namespace is created:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"new_namespace"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">namespace</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This can be useful for example:</p><ul><li>to attach a shared middleware to each namespace</li></ul><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"new_namespace"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">namespace</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  namespace</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">myMiddleware</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ul><li>to track the <a href="/docs/v4/namespaces/#Dynamic-namespaces">dynamically created</a> namespaces</li></ul><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">of</span><span class="token punctuation" style="color:#393A34">(</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex" style="color:#36acaa">\/nsp-\w+</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"new_namespace"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">namespace</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">namespace</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="add-a-way-to-customize-the-response-headers">Add a way to customize the response headers<a href="#add-a-way-to-customize-the-response-headers" class="hash-link" aria-label="Direct link to Add a way to customize the response headers" title="Direct link to Add a way to customize the response headers">​</a></h3><p>The underlying Engine.IO server, which manages the low-level connection (HTTP long-polling and/or WebSocket), will now emit two additional events:</p><ul><li><code>initial_headers</code></li><li><code>headers</code></li></ul><p>Like the name suggests, the <code>initial_headers</code> event will be emitted only for the first HTTP request of the session, while the <code>headers</code> event will be emitted for each HTTP request (including the WebSocket upgrade).</p><p>Example:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">engine</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"initial_headers"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">headers</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> req</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  headers</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"test"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"123"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  headers</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"set-cookie"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"mycookie=456"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">engine</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"headers"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">headers</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> req</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  headers</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"test"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"789"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Note: it was previously possible to achieve this by listening to the "request" event, but this should be easier with those new events:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> httpServer </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"http"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createServer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token maybe-class-name">Server</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"socket.io"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">httpServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">httpServer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">prependListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"request"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">req</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> res</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setHeader</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"test"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"789"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="add-a-way-to-get-access-to-the-reason-of-a-connection-error">Add a way to get access to the reason of a connection error<a href="#add-a-way-to-get-access-to-the-reason-of-a-connection-error" class="hash-link" aria-label="Direct link to Add a way to get access to the reason of a connection error" title="Direct link to Add a way to get access to the reason of a connection error">​</a></h3><p>The underlying Engine.IO server will also emit a new event: <code>connection_error</code>.</p><p>Syntax:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">engine</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"connection_error"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">req</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// the request object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">code</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic">// the error code, for example 1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// the error message, for example "Session ID unknown"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// some additional error context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Here is the list of possible error codes:</p><table><thead><tr><th align="center">Code</th><th align="center">Message</th></tr></thead><tbody><tr><td align="center">0</td><td align="center">"Transport unknown"</td></tr><tr><td align="center">1</td><td align="center">"Session ID unknown"</td></tr><tr><td align="center">2</td><td align="center">"Bad handshake method"</td></tr><tr><td align="center">3</td><td align="center">"Bad request"</td></tr><tr><td align="center">4</td><td align="center">"Forbidden"</td></tr><tr><td align="center">5</td><td align="center">"Unsupported protocol version"</td></tr></tbody></table><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="add-a-way-to-ignore-the-beforeunload-event">Add a way to ignore the <code>beforeunload</code> event<a href="#add-a-way-to-ignore-the-beforeunload-event" class="hash-link" aria-label="Direct link to add-a-way-to-ignore-the-beforeunload-event" title="Direct link to add-a-way-to-ignore-the-beforeunload-event">​</a></h3><p>A few months ago, a user <a href="https://github.com/socketio/socket.io/issues/3639" target="_blank" rel="noopener noreferrer">reported</a> a weird behavior when reloading a page: on Firefox, the Socket instance would emit a <code>disconnect</code> event, but not on Chrome or Safari.</p><p>We have published a fix for this issue in <code>socket.io-client@3.1.1</code>, by silently closing the connection when receiving a <a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event" target="_blank" rel="noopener noreferrer"><code>beforeunload</code></a> event from the browser.</p><p>Unfortunately, this fix had unintended consequences: if you relied on the <code>beforeunload</code> event to prompt the user for confirmation ("your last modifications are not saved yet, do you really want to leave?"), the Socket.IO connection would now be closed, even if the user decided to stay on the page.</p><p>That's why we have added the <code>closeOnBeforeunload</code> option, to give you total control over this behavior:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> socket </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">io</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">closeOnBeforeunload</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// defaults to true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ul><li><code>closeOnBeforeunload: true</code> (the default value) will make all browsers behave the same (no <code>disconnect</code> event when reloading the page)</li><li><code>closeOnBeforeunload: false</code> will ignore the <code>beforeunload</code> event, but you will get a <code>disconnect</code> event on Firefox</li></ul><p>That's all for this release, thanks for reading!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Monthly update #4]]></title>
        <id>https://socket.io/blog/monthly-update-4/</id>
        <link href="https://socket.io/blog/monthly-update-4/"/>
        <updated>2021-05-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hi everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hi everyone!</p><p>Here's the #4 edition of our Monthly update.</p><p>So, what's new in the Socket.IO ecosystem?</p><ul><li><a href="#a-new-admin-ui">A new Admin UI</a></li><li><a href="#a-new-guide">A new guide</a></li><li><a href="#version-updates">Version updates</a></li><li><a href="#whats-next">What's next</a></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="a-new-admin-ui">A new Admin UI<a href="#a-new-admin-ui" class="hash-link" aria-label="Direct link to A new Admin UI" title="Direct link to A new Admin UI">​</a></h2><p>Following our focus on tooling, we have published a first release of the Socket.IO Admin UI:</p><p><img loading="lazy" alt="admin UI screenshot" src="/assets/images/admin-ui-dashboard-8df87956c18a60717867ef800c1bc9c2.png" width="1305" height="704" class="img_ev3q"></p><p>This Admin UI is meant to give you an overview of your Socket.IO deployment.</p><p>Here is the list of the current features:</p><ul><li>overview of the servers and the clients that are currently connected</li><li>details of each socket instance (active transport, handshake, rooms, ...)</li><li>details of each room</li><li>administrative operations (join, leave, disconnect)</li></ul><p>And the features which will be added in the near future:</p><ul><li>overview of the number of packets/bytes sent and received per second</li><li>emitting an event to all clients, a room or a particular Socket instance</li></ul><p>The installation steps can be found <a href="/docs/v4/admin-ui/">here</a>.</p><p>The source code can be found here: <a href="https://github.com/socketio/socket.io-admin-ui/" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-admin-ui/</a></p><p>If you have any feedback / suggestions, do not hesitate!</p><p>Please note that the Admin UI does support a cluster of several Socket.IO servers too.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="a-new-guide">A new guide<a href="#a-new-guide" class="hash-link" aria-label="Direct link to A new guide" title="Direct link to A new guide">​</a></h2><p>We have added a new guide (<a href="/get-started/basic-crud-application/">here</a>), using Socket.IO to create a basic CRUD application.</p><p><img loading="lazy" alt="Video of the application in action" src="/assets/images/basic-crud-app-55c1d48f52d1b78478b4f7b6a43dd7fd.gif" width="1760" height="870" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="version-updates">Version updates<a href="#version-updates" class="hash-link" aria-label="Direct link to Version updates" title="Direct link to Version updates">​</a></h2><ul><li><a href="https://github.com/socketio/socket.io/releases/tag/4.0.2" target="_blank" rel="noopener noreferrer">socket.io@4.0.2</a></li><li><a href="https://github.com/socketio/socket.io-client/releases/tag/4.0.2" target="_blank" rel="noopener noreferrer">socket.io-client@4.0.2</a></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="whats-next">What's next<a href="#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next">​</a></h2><ul><li>a continuous focus on the documentation (additional code examples, extended guide, ...)</li><li>additional tooling around Socket.IO</li></ul><p>Happy coding!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO Admin UI]]></title>
        <id>https://socket.io/blog/admin-ui-first-release/</id>
        <link href="https://socket.io/blog/admin-ui-first-release/"/>
        <updated>2021-04-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hi everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hi everyone!</p><p>We have published a first release of the Socket.IO Admin UI:</p><p><img loading="lazy" alt="admin UI screenshot" src="/assets/images/admin-ui-dashboard-8df87956c18a60717867ef800c1bc9c2.png" width="1305" height="704" class="img_ev3q"></p><p>Current features:</p><ul><li>overview of the servers and the clients that are currently connected</li><li>details of each socket instance (active transport, handshake, rooms, ...)</li><li>details of each room</li><li>administrative operations (join, leave, disconnect)</li></ul><p>The installation steps can be found <a href="/docs/v4/admin-ui/">here</a>.</p><p>The source code can be found here: <a href="https://github.com/socketio/socket.io-admin-ui/" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-admin-ui/</a></p><p>If you have any feedback / suggestions, do not hesitate!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Monthly update #3]]></title>
        <id>https://socket.io/blog/monthly-update-3/</id>
        <link href="https://socket.io/blog/monthly-update-3/"/>
        <updated>2021-04-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hi everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hi everyone!</p><p>Here's the #3 edition of our Monthly update.</p><p>So, what's new in the Socket.IO ecosystem?</p><ul><li><a href="#socketio-v4">Socket.IO v4</a></li><li><a href="#redis-adapter-v610-and-redis-emitter-v400">Redis Adapter v6.1.0 and Redis Emitter v4.0.0</a></li><li><a href="#documentation">Documentation</a></li><li><a href="#new-versions">New versions</a></li><li><a href="#whats-next">What's next</a></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="socketio-v4">Socket.IO v4<a href="#socketio-v4" class="hash-link" aria-label="Direct link to Socket.IO v4" title="Direct link to Socket.IO v4">​</a></h2><p>Wait, already v4?</p><p>Yes, but the upgrade should be a lot easier than from v2 to v3, since the two breaking changes only impact the API on the server side.</p><p>The most important breaking change is related to broadcasting: calling <code>to()</code> or any other broadcast modifier will now return an immutable object.</p><p>Previously, the modifiers were saved on the <code>io</code> instance directly, which could lead to surprising behaviors:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">to</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"room1"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// and then later</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">to</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"room2"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// also sent to room1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You were also not able to reuse the operator:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> operator </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">to</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"room1"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">operator</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// to room1 (assuming synchronous call)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">operator</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// to all clients</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Even more surprising, with asynchronous code:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">to</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"room3"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"details"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetchDetails</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// unspecified behavior: maybe in room3, maybe to all clients</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Starting with v4.0.0, you can now use <code>io.to()</code> safely:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> operator </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">to</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"room1"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">except</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"room2"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">operator</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">operator</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This release also brings some interesting new features, like the <code>fetchSockets()</code> method.</p><p>Please check the migration guide <a href="/docs/v4/migrating-from-3-x-to-4-0/">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="redis-adapter-v610-and-redis-emitter-v400">Redis Adapter v6.1.0 and Redis Emitter v4.0.0<a href="#redis-adapter-v610-and-redis-emitter-v400" class="hash-link" aria-label="Direct link to Redis Adapter v6.1.0 and Redis Emitter v4.0.0" title="Direct link to Redis Adapter v6.1.0 and Redis Emitter v4.0.0">​</a></h2><p>The Redis adapter (for broadcasting packets with multiple Socket.IO servers) and the Redis emitter (for broadcasting packets from another Node.js process) have been updated in order to support the <a href="/docs/v4/migrating-from-3-x-to-4-0/#new-features">new features</a> of the v4 release.</p><p>For example, the <code>socketsJoin</code> method will work across Socket.IO servers:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// make all Socket instances join the "room1" room</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">socketsJoin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"room1"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// make all Socket instances in the "room1" room join the "room2" and "room3" rooms</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">in</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"room1"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">socketsJoin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"room2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"room3"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// make all Socket instances in the "room1" room of the "admin" namespace join the "room2" room</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">of</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/admin"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">in</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"room1"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">socketsJoin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"room2"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>More information can be found <a href="/docs/v4/server-instance/#utility-methods">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="documentation">Documentation<a href="#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation">​</a></h2><p>The documentation continues to be improved.</p><p>A new example project has been added in the "Get started" section, with middlewares and rooms: <a href="/get-started/private-messaging-part-1/">Private messaging</a></p><p>As usual, if you find a typo or think that some details are missing, please open an issue here: <a href="https://github.com/socketio/socket.io-website" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-website</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-versions">New versions<a href="#new-versions" class="hash-link" aria-label="Direct link to New versions" title="Direct link to New versions">​</a></h2><ul><li><p><a href="https://github.com/socketio/socket.io/releases/tag/4.0.1" target="_blank" rel="noopener noreferrer">socket.io@4.0.1</a> (<a href="/blog/socket-io-3-release/">release notes</a>)</p><ul><li><a href="https://github.com/socketio/engine.io-parser/releases/tag/4.0.2" target="_blank" rel="noopener noreferrer">engine.io-parser@4.0.2</a> (included in <code>socket.io{% raw %}@{% endraw %}4.0.1</code>)</li><li><a href="https://github.com/socketio/engine.io/releases/tag/5.0.0" target="_blank" rel="noopener noreferrer">engine.io@5.0.0</a> (included in <code>socket.io{% raw %}@{% endraw %}4.0.1</code>)</li><li><a href="https://github.com/socketio/socket.io-parser/releases/tag/4.0.4" target="_blank" rel="noopener noreferrer">socket.io-parser@4.0.4</a> (included in <code>socket.io{% raw %}@{% endraw %}4.0.1</code>)</li></ul></li><li><p><a href="https://github.com/socketio/socket.io-client/releases/tag/4.0.1" target="_blank" rel="noopener noreferrer">socket.io-client@4.0.1</a></p><ul><li><a href="https://github.com/socketio/engine.io-parser/releases/tag/4.0.2" target="_blank" rel="noopener noreferrer">engine.io-parser@4.0.2</a> (included in <code>socket.io-client{% raw %}@{% endraw %}4.0.1</code>)</li><li><a href="https://github.com/socketio/engine.io-client/releases/tag/5.0.1" target="_blank" rel="noopener noreferrer">engine.io-client@5.0.1</a> (included in <code>socket.io-client{% raw %}@{% endraw %}4.0.1</code>)</li><li><a href="https://github.com/socketio/socket.io-parser/releases/tag/4.0.4" target="_blank" rel="noopener noreferrer">socket.io-parser@4.0.4</a> (included in <code>socket.io-client{% raw %}@{% endraw %}4.0.1</code>)</li></ul></li><li><p><a href="https://github.com/socketio/socket.io-redis/releases/tag/6.1.0" target="_blank" rel="noopener noreferrer">socket.io-redis@6.1.0</a></p></li><li><p><a href="https://github.com/socketio/socket.io-redis-emitter/releases/tag/4.0.0" target="_blank" rel="noopener noreferrer">@socket.io/redis-emitter@4.0.0</a></p></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="whats-next">What's next<a href="#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next">​</a></h2><ul><li>a continuous focus on the documentation (additional code examples, extended guide, ...)</li><li>additional tooling around Socket.IO</li></ul><p>Stay safe!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 4.0.0]]></title>
        <id>https://socket.io/blog/socket-io-4-release/</id>
        <link href="https://socket.io/blog/socket-io-4-release/"/>
        <updated>2021-03-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone!</p><p>We just published a new major version of Socket.IO: <a href="https://github.com/socketio/socket.io/releases/tag/4.0.0" target="_blank" rel="noopener noreferrer">4.0.0</a></p><p>Please see the associated <a href="/docs/v4/migrating-from-3-x-to-4-0/">migration guide</a>.</p><p><strong>TL;DR:</strong> this major bump is due to a few breaking changes at the API level.</p><p>Apart from this, the Socket.IO protocol was not updated, so a v3 client <strong>will</strong> be able to reach a v4 server and vice-versa. Besides, the compatibility mode (<a href="/docs/v4/server-options/#alloweio3"><code>allowEIO3: true</code></a>) is still available between a Socket.IO v2 client and a Socket.IO v4 server.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-server">Bug Fixes (server)<a href="#bug-fixes-server" class="hash-link" aria-label="Direct link to Bug Fixes (server)" title="Direct link to Bug Fixes (server)">​</a></h3><ul><li>make io.to(...) immutable (<a href="https://github.com/socketio/socket.io/commit/ac9e8ca6c71e00d4af45ee03f590fe56f3951186" target="_blank" rel="noopener noreferrer">ac9e8ca</a>)</li><li>set default protocol version to 3 (<a href="https://github.com/socketio/engine.io/issues/616" target="_blank" rel="noopener noreferrer">#616</a>) (<a href="https://github.com/socketio/engine.io/commit/868d89111de0ab5bd0e147ecaff7983afbf5d087" target="_blank" rel="noopener noreferrer">868d891</a>) (Engine.IO)</li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-client">Bug Fixes (client)<a href="#bug-fixes-client" class="hash-link" aria-label="Direct link to Bug Fixes (client)" title="Direct link to Bug Fixes (client)">​</a></h3><ul><li><strong>bundle:</strong> restore support for JS modules (<a href="https://github.com/socketio/socket.io-client/commit/43613d1b2c3c04e89d572750656012f54d44467c" target="_blank" rel="noopener noreferrer">43613d1</a>)</li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-server">Features (server)<a href="#features-server" class="hash-link" aria-label="Direct link to Features (server)" title="Direct link to Features (server)">​</a></h3><ul><li>add some utility methods (<a href="https://github.com/socketio/socket.io/commit/b25495c069031674da08e19aed68922c7c7a0e28" target="_blank" rel="noopener noreferrer">b25495c</a>)</li><li>add support for typed events (<a href="https://github.com/socketio/socket.io/issues/3822" target="_blank" rel="noopener noreferrer">#3822</a>) (<a href="https://github.com/socketio/socket.io/commit/0107510ba8a0f148c78029d8be8919b350feb633" target="_blank" rel="noopener noreferrer">0107510</a>)</li><li>allow to exclude specific rooms when broadcasting (<a href="https://github.com/socketio/socket.io/issues/3789" target="_blank" rel="noopener noreferrer">#3789</a>) (<a href="https://github.com/socketio/socket.io/commit/7de2e87e888d849eb2dfc5e362af4c9e86044701" target="_blank" rel="noopener noreferrer">7de2e87</a>)</li><li>allow to pass an array to io.to(...) (<a href="https://github.com/socketio/socket.io/commit/085d1de9df909651de8b313cc6f9f253374b702e" target="_blank" rel="noopener noreferrer">085d1de</a>)</li><li>increase the default value of pingTimeout (<a href="https://github.com/socketio/engine.io/commit/5a7fa132c442bc1e7eefa1cf38168ee951575ded" target="_blank" rel="noopener noreferrer">5a7fa13</a>) (Engine.IO)</li><li>remove dynamic require() with wsEngine (<a href="https://github.com/socketio/engine.io/commit/edb734316f143bf0f1bbc344e966d18e2676b934" target="_blank" rel="noopener noreferrer">edb7343</a>) (Engine.IO)</li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-client">Features (client)<a href="#features-client" class="hash-link" aria-label="Direct link to Features (client)" title="Direct link to Features (client)">​</a></h3><ul><li>add autoUnref option (<a href="https://github.com/socketio/socket.io-client/commit/6abfa1fa4c7fea0d69c69b254d2e1ca18f19c4bc" target="_blank" rel="noopener noreferrer">6abfa1f</a>)</li><li>add support for typed events (<a href="https://github.com/socketio/socket.io-client/commit/59023657a02cf78f90522e0d7797749707ed5ed2" target="_blank" rel="noopener noreferrer">5902365</a>)</li><li>listen to the "offline" event (<a href="https://github.com/socketio/engine.io-client/commit/c361bc691f510b96f8909c5e6c62a4635d50275c" target="_blank" rel="noopener noreferrer">c361bc6</a>) (Engine.IO client)</li></ul>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 3.1.0]]></title>
        <id>https://socket.io/blog/socket-io-3-1-0/</id>
        <link href="https://socket.io/blog/socket-io-3-1-0/"/>
        <updated>2021-01-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone!</p><p>We just published a new version of Socket.IO: <a href="https://github.com/socketio/socket.io/releases/tag/3.1.0" target="_blank" rel="noopener noreferrer">3.1.0</a></p><p>In order to ease the migration to Socket.IO v3, the v3 server is now able to communicate with v2 clients:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"socket.io"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">allowEIO3</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// false by default</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This should make the migration easier for existing deployments:</p><ul><li>first, update the servers with <code>allowEIO3</code> set to <code>true</code></li></ul><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"socket.io"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">allowEIO3</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// false by default</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Note: If you are using the Redis adapter to <a href="/docs/v3/broadcasting-events/#With-multiple-Socket-IO-servers">broadcast packets between nodes</a>, you must use <code>socket.io-redis@5</code> with <code>socket.io@2</code> and <code>socket.io-redis@6</code> with <code>socket.io@3</code>. Please note that both versions are compatible, so you can update each server one by one (no big bang is needed).</p><ul><li>then, update the clients</li></ul><p>This step may actually take some time, as some clients may still have a v2 client in cache.</p><p>You can check the version of the connection with:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"connection"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> version </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">conn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">protocol</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// either 3 or 4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This matches the value of the <code>EIO</code> query parameter in the HTTP requests.</p><ul><li>and finally, once every client was updated, set <code>allowEIO3</code> to <code>false</code> (which is the default value)</li></ul><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"socket.io"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">allowEIO3</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>With <code>allowEIO3</code> set to <code>false</code>, v2 clients will now receive an HTTP 400 error (<code>Unsupported protocol version</code>) when connecting.</p><p>The <a href="/docs/v3/migrating-from-2-x-to-3-0/">migration guide</a> was updated accordingly.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h3><ul><li>confirm a weak but matching ETag (<a href="https://github.com/socketio/socket.io/issues/3485" target="_blank" rel="noopener noreferrer">#3485</a>) (<a href="https://github.com/socketio/socket.io/commit/161091dd4c9e1b1610ac3d45d964195e63d92b94" target="_blank" rel="noopener noreferrer">161091d</a>)</li><li><strong>esm:</strong> export the Namespace and Socket class (<a href="https://github.com/socketio/socket.io/issues/3699" target="_blank" rel="noopener noreferrer">#3699</a>) (<a href="https://github.com/socketio/socket.io/commit/233650c22209708b5fccc4349c38d2fa1b465d8f" target="_blank" rel="noopener noreferrer">233650c</a>)</li><li>add support for Socket.IO v2 clients (<a href="https://github.com/socketio/socket.io/commit/9925746c8ee3a6522bd640b5d586c83f04f2f1ba" target="_blank" rel="noopener noreferrer">9925746</a>)</li><li>add room events (<a href="https://github.com/socketio/socket.io-adapter/commit/155fa6333a504036e99a33667dc0397f6aede25e" target="_blank" rel="noopener noreferrer">155fa63</a>)</li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes">Bug Fixes<a href="#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">​</a></h3><ul><li><strong>typings:</strong> make Manager#opts public (<a href="https://github.com/socketio/socket.io-client/issues/1437" target="_blank" rel="noopener noreferrer">#1437</a>) (<a href="https://github.com/socketio/socket.io-client/commit/fe97243fab02cd80fc1116e8f4aeca02951dac75" target="_blank" rel="noopener noreferrer">fe97243</a>)</li><li>allow integers as event names (<a href="https://github.com/socketio/socket.io-parser/commit/1c220ddbf45ea4b44bc8dbf6f9ae245f672ba1b9" target="_blank" rel="noopener noreferrer">1c220dd</a>)</li></ul>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 2.4.0]]></title>
        <id>https://socket.io/blog/socket-io-2-4-0/</id>
        <link href="https://socket.io/blog/socket-io-2-4-0/"/>
        <updated>2021-01-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Happy New Year everyone!]]></summary>
        <content type="html"><![CDATA[<p>Happy New Year everyone!</p><p>We just published a new minor version in the 2.x branch!</p><p>Please note that this release contains a breaking change regarding <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" target="_blank" rel="noopener noreferrer">Cross-Origin Resource Sharing</a> (CORS).</p><p><strong>UPDATE</strong>: this change was reverted in <a href="https://github.com/socketio/socket.io/releases/tag/2.4.1" target="_blank" rel="noopener noreferrer">2.4.1</a>, because it did not follow semantic versioning and broke some deployments (discussed <a href="https://github.com/socketio/socket.io/discussions/3741" target="_blank" rel="noopener noreferrer">here</a>). Please make sure you are properly <a href="/docs/v2/handling-cors">securing your application</a>, and <a href="/docs/v3/migrating-from-2-x-to-3-0/">upgrade</a> to Socket.IO v3 as soon as possible.</p><p>Previously, CORS was enabled by default, which meant that a Socket.IO server sent the necessary CORS headers (<code>Access-Control-Allow-xxx</code>) to <strong>any</strong> domain. This will not be the case anymore, and you now have to explicitly enable it.</p><p>Please note that you are not impacted if:</p><ul><li>you are using Socket.IO v2 and the <code>origins</code> option to restrict the list of allowed domains</li><li>you are using Socket.IO v3 (disabled by default)</li></ul><p>This change also removes the support for '*' matchers and protocol-less URL:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io.origins('https://example.com:443'); =&gt; io.origins(['https://example.com']);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io.origins('localhost:3000');          =&gt; io.origins(['http://localhost:3000']);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io.origins('http://localhost:*');      =&gt; io.origins(['http://localhost:3000']);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io.origins('*:3000');                  =&gt; io.origins(['http://localhost:3000']);</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>To restore the previous behavior (please use with caution):</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">origins</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">_</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> callback</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">callback</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>A big thanks to <a href="https://github.com/ni8walk3r" target="_blank" rel="noopener noreferrer">@ni8walk3r</a> for the detailed security report.</p><p>See also:</p><ul><li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS</a></li><li><a href="https://socket.io/docs/v2/handling-cors/" target="_blank" rel="noopener noreferrer">https://socket.io/docs/v2/handling-cors/</a></li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h3><ul><li>add support for all cookie options (<a href="https://github.com/socketio/engine.io/commit/19cc58264a06dca47ed401fbaca32dcdb80a903b" target="_blank" rel="noopener noreferrer">19cc582</a>)</li><li>disable perMessageDeflate by default (<a href="https://github.com/socketio/engine.io/commit/5ad273601eb66c7b318542f87026837bf9dddd21" target="_blank" rel="noopener noreferrer">5ad2736</a>)</li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes">Bug Fixes<a href="#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">​</a></h3><ul><li><strong>security:</strong> do not allow all origins by default (<a href="https://github.com/socketio/socket.io/commit/f78a575f66ab693c3ea96ea88429ddb1a44c86c7" target="_blank" rel="noopener noreferrer">f78a575</a>)</li><li>properly overwrite the query sent in the handshake (<a href="https://github.com/socketio/socket.io/commit/d33a619905a4905c153d4fec337c74da5b533a9e" target="_blank" rel="noopener noreferrer">d33a619</a>)</li></ul><p>Stay safe!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Monthly update #2]]></title>
        <id>https://socket.io/blog/monthly-update-2/</id>
        <link href="https://socket.io/blog/monthly-update-2/"/>
        <updated>2020-11-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hi everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hi everyone!</p><p>Here's the #2 edition of our Monthly update. This is a new experiment, we will try to stick to this frequency in order to keep you updated of the work in progress and the directions the project is taking.</p><p>So, what's new in the Socket.IO ecosystem?</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="socketio-v3">Socket.IO v3<a href="#socketio-v3" class="hash-link" aria-label="Direct link to Socket.IO v3" title="Direct link to Socket.IO v3">​</a></h2><p>As announced in the <a href="/blog/monthly-update-2/">previous</a> monthly update, Socket.IO v3 has been released a few days ago.</p><p>This major version bump is mandated by several necessary changes in the Engine.IO protocol. You can find more information about these changes in the <a href="/blog/engine-io-4-release/">Engine.IO v4 release notes</a>.</p><p>You can find the release notes <a href="/blog/socket-io-3-release/">here</a> and the migration guide <a href="/docs/v3/migrating-from-2-x-to-3-0/">here</a>.</p><p>Let's discuss about this release here: <a href="https://github.com/socketio/socket.io/discussions/3674" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io/discussions/3674</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="redis-adapter-v6">Redis Adapter v6<a href="#redis-adapter-v6" class="hash-link" aria-label="Direct link to Redis Adapter v6" title="Direct link to Redis Adapter v6">​</a></h2><p>Following the <a href="/blog/socket-io-3-release/">release of Socket.IO v3.0.0</a>, the Redis Adapter was updated and a new release is out: <a href="https://github.com/socketio/socket.io-redis/releases/tag/6.0.0" target="_blank" rel="noopener noreferrer">6.0.0</a></p><p>You can find the release notes <a href="/blog/socket-io-redis-adapter-6-release/">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="documentation">Documentation<a href="#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation">​</a></h2><p>The documentation has always been a weak point of the project, leading to a lot of issues opened on GitHub and questions on StackOverflow.</p><p>Now that v3 is out, we will focus on this. The following pages have already been created:</p><ul><li><a href="/docs/v3/emitting-events/">Emitting events</a></li><li><a href="/docs/v3/broadcasting-events/">Broadcasting events</a></li><li><a href="/docs/v3/server-socket-instance/">The Socket instance / server-side</a></li><li><a href="/docs/v3/middlewares/">Middlewares</a></li><li><a href="/docs/v3/handling-cors/">Handling CORS</a></li></ul><p>If you find a typo, please open an issue here: <a href="https://github.com/socketio/socket.io-website" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-website</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="minor-bumps">Minor bumps<a href="#minor-bumps" class="hash-link" aria-label="Direct link to Minor bumps" title="Direct link to Minor bumps">​</a></h2><ul><li><p><a href="https://github.com/socketio/socket.io/releases/tag/3.0.3" target="_blank" rel="noopener noreferrer">socket.io@3.0.3</a> (<a href="/blog/socket-io-3-release/">release notes</a>)</p><ul><li><a href="https://github.com/socketio/engine.io-parser/releases/tag/4.0.1" target="_blank" rel="noopener noreferrer">engine.io-parser@4.0.1</a> (included in <code>socket.io{% raw %}@{% endraw %}3.0.3</code>)</li><li><a href="https://github.com/socketio/engine.io/releases/tag/4.0.4" target="_blank" rel="noopener noreferrer">engine.io@4.0.4</a> (included in <code>socket.io{% raw %}@{% endraw %}3.0.3</code>)</li><li><a href="https://github.com/socketio/socket.io-parser/releases/tag/4.0.1" target="_blank" rel="noopener noreferrer">socket.io-parser@4.0.1</a> (included in <code>socket.io{% raw %}@{% endraw %}3.0.3</code>)</li></ul></li><li><p><a href="https://github.com/socketio/socket.io-client/releases/tag/3.0.3" target="_blank" rel="noopener noreferrer">socket.io-client@3.0.3</a></p><ul><li><a href="https://github.com/socketio/engine.io-parser/releases/tag/4.0.1" target="_blank" rel="noopener noreferrer">engine.io-parser@4.0.1</a> (included in <code>socket.io-client{% raw %}@{% endraw %}3.0.3</code>)</li><li><a href="https://github.com/socketio/engine.io-client/releases/tag/4.0.4" target="_blank" rel="noopener noreferrer">engine.io-client@4.0.4</a> (included in <code>socket.io-client{% raw %}@{% endraw %}3.0.3</code>)</li><li><a href="https://github.com/socketio/socket.io-parser/releases/tag/4.0.1" target="_blank" rel="noopener noreferrer">socket.io-parser@4.0.1</a> (included in <code>socket.io-client{% raw %}@{% endraw %}3.0.3</code>)</li></ul></li><li><p><a href="https://github.com/socketio/socket.io-redis/releases/tag/6.0.1" target="_blank" rel="noopener noreferrer">socket.io-redis@6.0.1</a></p></li><li><p><a href="https://github.com/socketio/socket.io-msgpack-parser/releases/tag/3.0.1" target="_blank" rel="noopener noreferrer">socket.io-msgpack-parser@3.0.1</a></p></li></ul><p>More information about how to use those custom parsers can be found <a href="https://github.com/socketio/socket.io/tree/master/examples/custom-parsers" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="whats-next">What's next<a href="#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next">​</a></h2><ul><li><p>the client implementations in other languages will be updated as well</p></li><li><p>a big focus on the documentation (additional code examples, extended guide, ...)</p></li><li><p>additional tooling around Socket.IO</p></li></ul><p>Stay safe!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Redis Adapter v6.0.0]]></title>
        <id>https://socket.io/blog/socket-io-redis-adapter-6-release/</id>
        <link href="https://socket.io/blog/socket-io-redis-adapter-6-release/"/>
        <updated>2020-11-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Following the release of Socket.IO v3.0.0, the Redis Adapter was updated and a new release is out: 6.0.0]]></summary>
        <content type="html"><![CDATA[<p>Following the <a href="/blog/socket-io-3-release/">release of Socket.IO v3.0.0</a>, the Redis Adapter was updated and a new release is out: <a href="https://github.com/socketio/socket.io-redis/releases/tag/6.0.0" target="_blank" rel="noopener noreferrer">6.0.0</a></p><p>For reference, the Redis Adapter is used when broadcasting packets across a set of Socket.IO servers. It relies on Redis <a href="https://redis.io/topics/pubsub" target="_blank" rel="noopener noreferrer">Pub/Sub mechanism</a>.</p><p>More information about how it works: <a href="https://github.com/socketio/socket.io-redis/#how-does-it-work-under-the-hood" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-redis/#how-does-it-work-under-the-hood</a></p><p>The release notes can be found here: <a href="https://github.com/socketio/socket.io-redis/releases/tag/6.0.0" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-redis/releases/tag/6.0.0</a></p><p>Please note that the new release is not compatible with Socket.IO v2, and previous versions are not compatible with Socket.IO v3 (<a href="https://github.com/socketio/socket.io-redis/#compatibility-table" target="_blank" rel="noopener noreferrer">compatibility table</a>).</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="notable-changes">Notable changes<a href="#notable-changes" class="hash-link" aria-label="Direct link to Notable changes" title="Direct link to Notable changes">​</a></h2><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="all-the-requests-for-inter-node-communication-now-return-a-promise-instead-of-accepting-a-callback">All the requests (for inter-node communication) now return a Promise instead of accepting a callback<a href="#all-the-requests-for-inter-node-communication-now-return-a-promise-instead-of-accepting-a-callback" class="hash-link" aria-label="Direct link to All the requests (for inter-node communication) now return a Promise instead of accepting a callback" title="Direct link to All the requests (for inter-node communication) now return a Promise instead of accepting a callback">​</a></h3><p>The Redis Adapter exposes additional methods for managing sockets and rooms in a multi-node setup:</p><ul><li><code>RedisAdapter.sockets()</code>: returns the list of Socket IDs</li><li><code>RedisAdapter.allRooms()</code>: returns the list of all rooms.</li><li><code>RedisAdapter.remoteJoin(id, room)</code>: make the socket join the room</li><li><code>RedisAdapter.remoteLeave(id, room)</code>: make the socket leave the room</li><li><code>RedisAdapter.remoteDisconnect(id, close)</code>: disconnect the socket with the given id</li></ul><p>Those methods used to accept a callback argument, they will now return a Promise.</p><p>Before:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">of</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">adapter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">allRooms</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">err</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> rooms</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rooms</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// an array containing all rooms (across all nodes)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>After:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> rooms </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">of</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">adapter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">allRooms</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rooms</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// a Set containing all rooms (across all nodes)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="customhook-and-customrequest-methods-were-removed">customHook and customRequest methods were removed<a href="#customhook-and-customrequest-methods-were-removed" class="hash-link" aria-label="Direct link to customHook and customRequest methods were removed" title="Direct link to customHook and customRequest methods were removed">​</a></h3><p>Those methods will be replaced by a more intuitive API in a future iteration.</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 3 Release]]></title>
        <id>https://socket.io/blog/socket-io-3-release/</id>
        <link href="https://socket.io/blog/socket-io-3-release/"/>
        <updated>2020-11-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We are happy to announce the release of Socket.IO v3!]]></summary>
        <content type="html"><![CDATA[<p>We are happy to announce the release of Socket.IO v3!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="migration-guide">Migration guide<a href="#migration-guide" class="hash-link" aria-label="Direct link to Migration guide" title="Direct link to Migration guide">​</a></h2><p>This release contains a few non backward compatible changes.</p><p>We have published a dedicated <a href="/docs/v4/migrating-from-2-x-to-3-0/">migration guide</a> with all necessary details.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="why-socketio-in-2020">Why Socket.IO in 2020?<a href="#why-socketio-in-2020" class="hash-link" aria-label="Direct link to Why Socket.IO in 2020?" title="Direct link to Why Socket.IO in 2020?">​</a></h2><p>That's an excellent question actually. Depending on your use case, it might make sense to use plain WebSocket directly:</p><ul><li>client: <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSocket" target="_blank" rel="noopener noreferrer">MDN</a>, <a href="https://caniuse.com/websockets" target="_blank" rel="noopener noreferrer">Can I use?</a></li><li>server: <a href="https://github.com/websockets/ws" target="_blank" rel="noopener noreferrer">ws</a> or <a href="https://github.com/mmdevries/eiows" target="_blank" rel="noopener noreferrer">eiows</a> in the Node.JS ecosystem</li></ul><p>What Socket.IO brings:</p><ul><li>a fallback to HTTP long-polling, in case the WebSocket connection cannot be established</li></ul><p>To be honest, this feature was awesome 10 years ago, when most browsers didn't support WebSocket, but this is not the case anymore. That's still a great safety net though.</p><ul><li>auto-reconnection</li></ul><p>Using plain WebSocket, you can take a look at <a href="https://github.com/appuri/robust-websocket" target="_blank" rel="noopener noreferrer">robust-websocket</a>.</p><ul><li>a classic request-response API: acknowledgements</li></ul><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// on one side</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"updateitem"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"updated"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">response</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">status</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ok</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// on the other</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"updateitem"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">arg1</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> arg2</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> callback</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">arg1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">arg2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// { name: "updated" }</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">callback</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">status</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ok"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ul><li>a way to broadcast data to a given set of clients: <a href="/docs/v4/rooms/">Rooms</a></li></ul><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// server-side</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"connection"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"room1"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">to</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"room1"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"hello!"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Which also works when scaling to several Socket.IO servers (more information <a href="/docs/v4/using-multiple-nodes/">here</a>).</p><ul><li>a way to split your application logic into distinct modules (for more complex applications): <a href="/docs/v4/namespaces/">Namespaces</a></li></ul><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// server-side</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> adminNamespace </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">of</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/admin"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">adminNamespace</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> next</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ensure the socket is authorized</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">adminNamespace</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"delete project"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// in all handlers, we are sure that the socket is authorized</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">adminNamespace</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"hello!"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// broadcast to admin only</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ul><li><p>an ecosystem of compatible clients in other languages</p><ul><li>Java: <a href="https://github.com/socketio/socket.io-client-java" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-client-java</a></li><li>C++: <a href="https://github.com/socketio/socket.io-client-cpp" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-client-cpp</a></li><li>Swift: <a href="https://github.com/socketio/socket.io-client-swift" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-client-swift</a></li><li>Dart: <a href="https://github.com/rikulo/socket.io-client-dart" target="_blank" rel="noopener noreferrer">https://github.com/rikulo/socket.io-client-dart</a></li><li>Python: <a href="https://github.com/miguelgrinberg/python-socketio" target="_blank" rel="noopener noreferrer">https://github.com/miguelgrinberg/python-socketio</a></li><li>.Net: <a href="https://github.com/Quobject/SocketIoClientDotNet" target="_blank" rel="noopener noreferrer">https://github.com/Quobject/SocketIoClientDotNet</a></li></ul></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="whats-next">What's next<a href="#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next">​</a></h2><ul><li><p>the Redis adapter (used when broadcasting across Socket.IO servers) will be updated in order to be compatible with Socket.IO v3 (update: <a href="/blog/socket-io-redis-adapter-6-release/">done!</a>)</p></li><li><p>the client implementations in other languages will be updated as well</p><ul><li>Java client: <a href="https://github.com/socketio/socket.io-client-java/releases/tag/socket.io-client-2.0.0" target="_blank" rel="noopener noreferrer">done!</a></li><li>C++ client: <a href="https://github.com/socketio/socket.io-client-cpp/releases/tag/3.0.0" target="_blank" rel="noopener noreferrer">done!</a></li><li>Swift: <a href="https://github.com/socketio/socket.io-client-swift/releases/tag/v16.0.0" target="_blank" rel="noopener noreferrer">done!</a></li></ul></li><li><p>a big focus on the documentation (additional code examples, extended guide, ...)</p></li><li><p>additional tooling around Socket.IO</p></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="lets-discuss">Let's discuss!<a href="#lets-discuss" class="hash-link" aria-label="Direct link to Let's discuss!" title="Direct link to Let's discuss!">​</a></h2><p>The project is now part of the beta of Github Discussions. Depending on the feedback of the community, it might replace the Slack channel in the future.</p><p>If you have any question about the release, let's discuss <a href="https://github.com/socketio/socket.io/discussions/3674" target="_blank" rel="noopener noreferrer">here</a>.</p><p>Stay safe!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Monthly update #1]]></title>
        <id>https://socket.io/blog/monthly-update-1/</id>
        <link href="https://socket.io/blog/monthly-update-1/"/>
        <updated>2020-10-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hi everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hi everyone!</p><p>Here's the #1 edition of our Monthly update. This is a new experiment, we will try to stick to this frequency in order to keep you updated of the work that is in progress and the directions the project is taking.</p><p>So, what's new in the Socket.IO ecosystem?</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="socketio-v3-wip">Socket.IO v3 (WIP)<a href="#socketio-v3-wip" class="hash-link" aria-label="Direct link to Socket.IO v3 (WIP)" title="Direct link to Socket.IO v3 (WIP)">​</a></h2><p>The work on Socket.IO v3 has started (let's be honest and not say resumed).</p><p>This major version bump is mandated by several necessary changes in the Engine.IO protocol. You can find more information about these changes in the <a href="/blog/engine-io-4-release/">Engine.IO v4 release notes</a>.</p><p>It mostly impacts the way packets are encoded when sent over the wire (in the request/response body in case of HTTP long-polling, or in the WebSocket frames), so the public API of Socket.IO should not be impacted that much.</p><p>We will also take advantage of this new version to migrate the codebase to Typescript, so the typings which are currently hosted in the <a href="https://github.com/DefinitelyTyped/DefinitelyTyped" target="_blank" rel="noopener noreferrer">DefinitelyTyped</a> will now always be in sync with the actual code.</p><p>You can follow the progress <a href="https://github.com/socketio/socket.io/projects/2" target="_blank" rel="noopener noreferrer">here</a>.</p><p>If you have any feedback/feature that you would like to see included, please comment <a href="https://github.com/socketio/socket.io/issues/3250" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="engineio-v4">Engine.IO v4<a href="#engineio-v4" class="hash-link" aria-label="Direct link to Engine.IO v4" title="Direct link to Engine.IO v4">​</a></h2><p>As part of the work towards Socket v3, Engine.IO v4 has been released.</p><p>The list of breaking changes can be found in the <a href="/blog/engine-io-4-release/">release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="protocol-documentation">Protocol documentation<a href="#protocol-documentation" class="hash-link" aria-label="Direct link to Protocol documentation" title="Direct link to Protocol documentation">​</a></h2><p>The documentation of the <a href="https://github.com/socketio/engine.io-protocol" target="_blank" rel="noopener noreferrer">Engine.IO</a> and the <a href="https://github.com/socketio/socket.io-protocol" target="_blank" rel="noopener noreferrer">Socket.IO</a> protocols has been edited with additional details/examples.</p><p>This should help greatly when implementing a client in another programming language.</p><p>If you find that something is not clear/is missing, please open an issue in the repository.</p><p>For reference, here's the current list of clients in other languages:</p><ul><li>Java: <a href="https://github.com/socketio/socket.io-client-java" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-client-java</a></li><li>C++: <a href="https://github.com/socketio/socket.io-client-cpp" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-client-cpp</a></li><li>Swift: <a href="https://github.com/socketio/socket.io-client-swift" target="_blank" rel="noopener noreferrer">https://github.com/socketio/socket.io-client-swift</a></li><li>Dart: <a href="https://github.com/rikulo/socket.io-client-dart" target="_blank" rel="noopener noreferrer">https://github.com/rikulo/socket.io-client-dart</a></li><li>Python: <a href="https://github.com/miguelgrinberg/python-socketio" target="_blank" rel="noopener noreferrer">https://github.com/miguelgrinberg/python-socketio</a></li><li>.Net: <a href="https://github.com/Quobject/SocketIoClientDotNet" target="_blank" rel="noopener noreferrer">https://github.com/Quobject/SocketIoClientDotNet</a></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="github-discussions">GitHub discussions<a href="#github-discussions" class="hash-link" aria-label="Direct link to GitHub discussions" title="Direct link to GitHub discussions">​</a></h2><p>The project is now part of the beta of Github Discussions. Depending on the feedback of the community, it might replace the Slack channel in the future.</p><p>So, let's <a href="https://github.com/socketio/socket.io/discussions" target="_blank" rel="noopener noreferrer">discuss</a>!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="minor-bumps">Minor bumps<a href="#minor-bumps" class="hash-link" aria-label="Direct link to Minor bumps" title="Direct link to Minor bumps">​</a></h2><ul><li><p><a href="https://github.com/socketio/socket.io-client/releases/tag/2.3.1" target="_blank" rel="noopener noreferrer">socket.io-client@2.3.1</a> (<a href="/blog/socket-io-2-3-1/">release notes</a>)</p><ul><li><a href="https://github.com/socketio/engine.io-parser/releases/tag/2.2.1" target="_blank" rel="noopener noreferrer">engine.io-parser@2.2.1</a> (included in <code>socket.io-client{% raw %}@{% endraw %}2.3.1</code>)</li><li><a href="https://github.com/socketio/engine.io-client/releases/tag/3.4.4" target="_blank" rel="noopener noreferrer">engine.io-client@3.4.4</a> (included in <code>socket.io-client{% raw %}@{% endraw %}2.3.1</code>)</li><li><a href="https://github.com/socketio/socket.io-parser/releases/tag/3.3.1" target="_blank" rel="noopener noreferrer">socket.io-parser@3.3.1</a> (included in <code>socket.io-client{% raw %}@{% endraw %}2.3.1</code>)</li></ul></li><li><p><a href="https://github.com/darrachequesne/socket.io-json-parser/releases/tag/2.1.1" target="_blank" rel="noopener noreferrer">socket.io-json-parser@2.1.1</a></p></li><li><p><a href="https://github.com/socketio/socket.io-msgpack-parser/releases/tag/2.2.1" target="_blank" rel="noopener noreferrer">socket.io-msgpack-parser@2.2.1</a></p></li></ul><p>More information about how to use those custom parsers can be found <a href="https://github.com/socketio/socket.io/tree/master/examples/custom-parsers" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="going-forward">Going forward<a href="#going-forward" class="hash-link" aria-label="Direct link to Going forward" title="Direct link to Going forward">​</a></h2><p>As announced at the bottom of the Engine.IO v4 <a href="/blog/engine-io-4-release/#What%E2%80%99s-next">release notes</a>, I (<a href="https://github.com/darrachequesne/" target="_blank" rel="noopener noreferrer">@darrachequesne</a>) am now dedicated full time to the project since the beginning of September. This wouldn't be possible without our <a href="https://opencollective.com/socketio/#section-contributors" target="_blank" rel="noopener noreferrer">sponsors</a>, so again, a big thanks to them!</p><p>Stay safe!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO client 2.3.1]]></title>
        <id>https://socket.io/blog/socket-io-2-3-1/</id>
        <link href="https://socket.io/blog/socket-io-2-3-1/"/>
        <updated>2020-10-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hi everyone!]]></summary>
        <content type="html"><![CDATA[<p>Hi everyone!</p><p>We have published a minor version of the client: <a href="https://github.com/socketio/socket.io-client/releases/tag/2.3.1" target="_blank" rel="noopener noreferrer">2.3.1</a></p><p>The <code>debug</code> dependency has been reverted to <code>~3.1.0</code>, as the newer versions contains ES6 syntax which breaks in IE browsers.</p><p>Please note that this only applied to users that bundle the Socket.IO client in their application, with webpack for example, as the "official" bundles (in the dist/ folder) were already transpiled with babel.</p><p>For webpack users, you can also take a look at the <a href="https://github.com/johngodley/webpack-remove-debug" target="_blank" rel="noopener noreferrer">webpack-remove-debug</a> plugin.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes">Bug Fixes<a href="#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">​</a></h3><ul><li>fix reconnection after opening socket asynchronously (<a href="https://github.com/socketio/socket.io-client/issues/1253" target="_blank" rel="noopener noreferrer">#1253</a>) (<a href="https://github.com/Automattic/socket.io-client/commit/050108b2281effda086b197cf174ee2e8e1aad79" target="_blank" rel="noopener noreferrer">050108b</a>)</li></ul><p>Get the latest client from the CDN:</p><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.1/socket.io.slim.js</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>For an explanation between the different bundles, please see <a href="/docs/v2/client-installation/">here</a>.</p><p>Stay safe!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Engine.IO 4 Release]]></title>
        <id>https://socket.io/blog/engine-io-4-release/</id>
        <link href="https://socket.io/blog/engine-io-4-release/"/>
        <updated>2020-09-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We are happy to announce the release of Engine.IO v4, the low-level engine that powers Socket.IO.]]></summary>
        <content type="html"><![CDATA[<p>We are happy to announce the release of Engine.IO v4, the low-level engine that powers Socket.IO.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="major-breaking-changes">Major breaking changes<a href="#major-breaking-changes" class="hash-link" aria-label="Direct link to Major breaking changes" title="Direct link to Major breaking changes">​</a></h2><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="heartbeat-mechanism-reversal">Heartbeat mechanism reversal<a href="#heartbeat-mechanism-reversal" class="hash-link" aria-label="Direct link to Heartbeat mechanism reversal" title="Direct link to Heartbeat mechanism reversal">​</a></h3><p>We have received a lot of reports from users that experience random disconnects due to ping timeout, even though their Internet connection is up and the remote server is reachable. It should be noted that in that case the client reconnects right away, but still it was an annoying issue.</p><p>After analysis, it seems to be caused by delayed timers on the client-side. Those timers are used in the ping-pong mechanism which helps to ensure the connection between the server and the client is still healthy. A delay on the client-side meant the client sent the ping packet too late, and the server considered that the connection was closed.</p><p>That's why the ping packets will now be sent by the server, and the client will respond with a pong packet.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="packet-encoding">Packet encoding<a href="#packet-encoding" class="hash-link" aria-label="Direct link to Packet encoding" title="Direct link to Packet encoding">​</a></h3><p>We have also changed the way the data is encoded. It previously relied on the string length in Javascript, which meant it was harder to implement clients in other programming languages that do not share the same encoding (more details <a href="https://mathiasbynens.be/notes/javascript-encoding" target="_blank" rel="noopener noreferrer">here</a>).</p><p>Technically speaking, it impacts the way an array of packets is encoded when using XHR polling (WebSocket is not affected, as each packet is sent in its own WebSocket frame).</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">send</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"€€"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">send</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"й"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// v3 encoding output</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token string" style="color:#e3116c">"3:4€€2:4й"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 3        "4€€".length (the JS specific part, 6 bytes)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// :        separator</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 4        the "message" packet type</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// €€       the content of the first packet</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 2        "4й".length (again, the JS specific part)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// :        separator</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 4        the "message" packet type</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// й        the content of the second packet</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// v4 encoding output</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token string" style="color:#e3116c">"4€€\x1e4й"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 4        the "message" packet type</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// €€       the content of the first packet</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// \x1e     separator</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 4        the "message" packet type</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// й        the content of the second packet</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You can find more details about the updates to the protocol <a href="https://github.com/socketio/engine.io-protocol#difference-between-v3-and-v4" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="other-changes">Other changes<a href="#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes">​</a></h2><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="cors-handling">CORS handling<a href="#cors-handling" class="hash-link" aria-label="Direct link to CORS handling" title="Direct link to CORS handling">​</a></h3><p>We now use the <a href="https://www.npmjs.com/package/cors" target="_blank" rel="noopener noreferrer">cors</a> package to handle the <a href="https://en.wikipedia.org/wiki/Cross-origin_resource_sharing" target="_blank" rel="noopener noreferrer">CORS</a> configuration. The <code>handlePreflightRequest</code> option was removed:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token maybe-class-name">Server</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'engine.io'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// before</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function-variable function" style="color:#d73a49">handlePreflightRequest</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">req</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> res</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">writeHead</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"Access-Control-Allow-Origin"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://example.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"Access-Control-Allow-Methods"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'GET'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"Access-Control-Allow-Headers"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Authorization'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"Access-Control-Allow-Credentials"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">end</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// after</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">cors</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">origin</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://example.com"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">methods</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"GET"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">allowedHeaders</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"Authorization"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">credentials</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Please see <a href="https://github.com/expressjs/cors#configuration-options" target="_blank" rel="noopener noreferrer">here</a> for all available options.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="no-cookie-by-default">No cookie by default<a href="#no-cookie-by-default" class="hash-link" aria-label="Direct link to No cookie by default" title="Direct link to No cookie by default">​</a></h3><p>In Engine.IO v3, the <code>io</code> cookie was sent by default. This cookie can be used to enable sticky-session, which is required when you have several servers (more information <a href="/docs/v4/using-multiple-nodes/">here</a>).</p><p>However, this cookie is not needed in some cases (i.e. single server deployment, sticky-session based on IP) so it must now be explicitly enabled:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token maybe-class-name">Server</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'engine.io'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// before</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">cookieName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"io"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">cookieHttpOnly</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">cookiePath</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/custom"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// after</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">cookie</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"test"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">httpOnly</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">path</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/custom"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>All other options (domain, maxAge, sameSite, ...) are now supported. Please see <a href="https://github.com/jshttp/cookie/" target="_blank" rel="noopener noreferrer">here</a> for the complete list of options.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="the-default-value-of-maxhttpbuffersize-was-decreased">The default value of maxHttpBufferSize was decreased<a href="#the-default-value-of-maxhttpbuffersize-was-decreased" class="hash-link" aria-label="Direct link to The default value of maxHttpBufferSize was decreased" title="Direct link to The default value of maxHttpBufferSize was decreased">​</a></h3><p>This option defines how many bytes or characters a message can be, before closing the connection. It was reduced from <code>100MB</code> to <code>1MB</code>.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token maybe-class-name">Server</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'engine.io'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">maxHttpBufferSize</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1e8</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// defaults to 1e6</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="permessagedeflate-is-now-disabled-by-default">perMessageDeflate is now disabled by default<a href="#permessagedeflate-is-now-disabled-by-default" class="hash-link" aria-label="Direct link to perMessageDeflate is now disabled by default" title="Direct link to perMessageDeflate is now disabled by default">​</a></h3><p>This option defines whether the WebSocket <a href="https://tools.ietf.org/html/draft-ietf-hybi-permessage-compression-19" target="_blank" rel="noopener noreferrer">permessage-deflate extension</a> is enabled or not. This feature, while useful in some cases, adds some extra memory overhead for each WebSocket connection, and could result in huge memory usage in production deployments. It is now disabled by default.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token maybe-class-name">Server</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'engine.io'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">perMessageDeflate</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// defaults to false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="support-for-nodejs-8-was-dropped">Support for Node.js 8 was dropped<a href="#support-for-nodejs-8-was-dropped" class="hash-link" aria-label="Direct link to Support for Node.js 8 was dropped" title="Direct link to Support for Node.js 8 was dropped">​</a></h3><p>We are dropping support for Node.js 8, which is now <a href="https://github.com/nodejs/Release" target="_blank" rel="noopener noreferrer">End-of-Life</a>. It will not be tested in the CI anymore, so please upgrade as soon as possible!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-to-upgrade">How to upgrade<a href="#how-to-upgrade" class="hash-link" aria-label="Direct link to How to upgrade" title="Direct link to How to upgrade">​</a></h2><p>As detailed in the <a href="#Major-breaking-changes">Major breaking changes</a> section, this release contains several backward incompatible changes, and as such v3 clients will not be able to connect to a v4 server (and vice versa).</p><p>In order to upgrade a live production environment, you will need to have both a group of v3 servers and v4 servers in parallel, and route the traffic based on either:</p><ul><li>the <code>EIO</code> query parameter</li><li>the path (by using a different <code>path</code> for the v4 servers)</li><li>or the domain if you use a different domain for the v4 servers</li></ul><p>So that it shall be a seamless migration for your end users.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="whats-next">What's next<a href="#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next">​</a></h2><p>This release will be included in Socket.IO v3 in the near future. We will publish a more detailed roadmap in the next blog post.</p><p>Besides, I (<a href="https://github.com/darrachequesne/" target="_blank" rel="noopener noreferrer">@darrachequesne</a>) am glad to announce that I will be dedicated full time to the project for the next months. This is possible thanks to our awesome <a href="https://opencollective.com/socketio/#section-contributors" target="_blank" rel="noopener noreferrer">sponsors</a>.</p><p>Again, a big shout out to <a href="https://twitter.com/piamancini" target="_blank" rel="noopener noreferrer">Pia Mancini</a> and all the team behind the <a href="https://opencollective.com/" target="_blank" rel="noopener noreferrer">Open Collective</a> platform, which helps making Open Source Software sustainable in the long term.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="lets-discuss">Let's discuss!<a href="#lets-discuss" class="hash-link" aria-label="Direct link to Let's discuss!" title="Direct link to Let's discuss!">​</a></h2><p>The project is now part of the beta of Github Discussions. Depending on the feedback of the community, it might replace the Slack channel in the future.</p><p>If you have any question about the release, let's discuss about it <a href="https://github.com/socketio/socket.io/discussions/3644" target="_blank" rel="noopener noreferrer">here</a>.</p><p>Stay safe!</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 2.0.1, 2.0.2 and 2.0.3]]></title>
        <id>https://socket.io/blog/socket-io-2-0-1-2-0-2-and-2-0-3/</id>
        <link href="https://socket.io/blog/socket-io-2-0-1-2-0-2-and-2-0-3/"/>
        <updated>2017-06-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We published three minor releases right after 2.0.0, so please be sure to use the latest version!]]></summary>
        <content type="html"><![CDATA[<p>We published three minor releases right after <code>2.0.0</code>, so please be sure to use the latest version!</p><p>Including:</p><ul><li><p>A fix for a race condition within middleware: <a href="https://github.com/socketio/socket.io/issues/2935" target="_blank" rel="noopener noreferrer">Issue #2935</a></p></li><li><p>A fix for a potential race condition when emitting to a room: <a href="https://github.com/socketio/socket.io/issues/2962" target="_blank" rel="noopener noreferrer">Issue #2962</a></p></li><li><p>A fix for the <em>query</em> option in the client: <a href="https://github.com/socketio/socket.io-client/issues/1086" target="_blank" rel="noopener noreferrer">Issue #1086</a></p></li></ul><p>Get the latest client from the CDN:</p><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO is on Open Collective]]></title>
        <id>https://socket.io/blog/socket-io-is-on-open-collective/</id>
        <link href="https://socket.io/blog/socket-io-is-on-open-collective/"/>
        <updated>2017-05-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Open Collective provides a transparent, sustainable, and secure way for people to support and sponsor open source projects. We are joining other great projects (you may have heard about MochaJS, GulpJS or webpack, among lots of other awesome projects) in the quest to ensure the project's sustainability.]]></summary>
        <content type="html"><![CDATA[<img loading="lazy" src="/images/opencollective.png" class="img_ev3q"><p>Open Collective provides a transparent, sustainable, and secure way for people to support and sponsor <a href="https://opencollective.com/opensource" target="_blank" rel="noopener noreferrer">open source projects</a>. We are joining other great projects (you may have heard about <a href="https://opencollective.com/mochajs" target="_blank" rel="noopener noreferrer">MochaJS</a>, <a href="https://opencollective.com/gulpjs" target="_blank" rel="noopener noreferrer">GulpJS</a> or <a href="https://opencollective.com/webpack" target="_blank" rel="noopener noreferrer">webpack</a>, among <a href="https://opencollective.com/discover" target="_blank" rel="noopener noreferrer">lots</a> of other awesome projects) in the quest to ensure the project's sustainability.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="what-is-an-open-collective">What is an Open Collective?<a href="#what-is-an-open-collective" class="hash-link" aria-label="Direct link to What is an Open Collective?" title="Direct link to What is an Open Collective?">​</a></h2><p>From their website:</p><p><em>An Open Collective is a group of people with a shared mission that operates in full transparency.</em></p><p>That allows both individuals and companies to sponsor our mission at Socket.IO (with potential tax benefits).</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="what-would-socketio-do-with-my-sponsorship">What would Socket.IO do with my sponsorship?<a href="#what-would-socketio-do-with-my-sponsorship" class="hash-link" aria-label="Direct link to What would Socket.IO do with my sponsorship?" title="Direct link to What would Socket.IO do with my sponsorship?">​</a></h2><p>That will enable the core contributors to spend more time assuring the maintenance of the project. That includes:</p><ul><li><p>triaging issues and pull requests</p></li><li><p>answering questions on <a href="https://slackin-socketio.now.sh/" target="_blank" rel="noopener noreferrer">Slack</a> and <a href="http://stackoverflow.com/questions/tagged/socket.io" target="_blank" rel="noopener noreferrer">Stackoverflow</a> (which have been somewhat neglected recently)</p></li><li><p>updating the documentation (I think a lot has been done recently, but there is still room for improvement!)</p></li></ul><p>Personally I would like to be able to devote a few days a month to the project (I mean a whole day of work, not a few hours taken here and there, usually late in the evening).</p><p>The goals in the near future:</p><ul><li>keep the 2.0 version as stable as possible</li><li>provide a complete documentation</li><li>add more examples, besides the classic chat</li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-can-i-help">How can I help?<a href="#how-can-i-help" class="hash-link" aria-label="Direct link to How can I help?" title="Direct link to How can I help?">​</a></h2><p>To become a sponsor or backer, visit our <a href="https://opencollective.com/socketio" target="_blank" rel="noopener noreferrer">open collective page</a> and follow the instructions for becoming a part of our collective. Please also take the time to explore the other awesome collectives that people are supporting.</p><p>And finally, a big thanks to <a href="https://twitter.com/piamancini" target="_blank" rel="noopener noreferrer">Pia Mancini</a> and her partners for making this possible.</p>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 2.0.0]]></title>
        <id>https://socket.io/blog/socket-io-2-0-0/</id>
        <link href="https://socket.io/blog/socket-io-2-0-0/"/>
        <updated>2017-05-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Socket.IO 2.0.0 is finally here!]]></summary>
        <content type="html"><![CDATA[<p>Socket.IO 2.0.0 is finally here!</p><p>This major release brings several performance improvements:</p><ul><li><p><a href="https://github.com/uWebSockets/uWebSockets" target="_blank" rel="noopener noreferrer">uws</a> is now the default Websocket engine. It should bring significant improvement in performance (particularly in terms of memory consumption) (<a href="https://github.com/socketio/engine.io/releases/tag/2.0.0" target="_blank" rel="noopener noreferrer">release note of Engine.IO</a>)</p></li><li><p>the Engine.IO and Socket.IO handshake packets were merged, reducing the number of roundtrips necessary to establish a connection. (<a href="https://github.com/socketio/socket.io/pull/2833" target="_blank" rel="noopener noreferrer">#2833</a>)</p></li><li><p>it is now possible to provide a custom parser according to the needs of your application (<a href="https://github.com/socketio/socket.io/pull/2829" target="_blank" rel="noopener noreferrer">#2829</a>). Please take a look at the <a href="https://github.com/socketio/socket.io/tree/master/examples/custom-parsers" target="_blank" rel="noopener noreferrer">example</a> for more information.</p></li></ul><p>Please note that this release is not backward-compatible, due to:</p><ul><li><p>a breaking change related to utf-8 encoding in <a href="https://github.com/socketio/engine.io-parser/pull/81" target="_blank" rel="noopener noreferrer">engine.io-parser</a></p></li><li><p>an update to make the socket id on the client match the id on the server-side (<a href="https://github.com/socketio/socket.io-client/pull/1058" target="_blank" rel="noopener noreferrer">#1058</a>)</p></li></ul><p>Related packages were updated accordingly:</p><ul><li><p>socket.io-redis version <a href="https://github.com/socketio/socket.io-redis/releases/tag/5.0.0" target="_blank" rel="noopener noreferrer">5.x</a></p></li><li><p>socket.io-emitter version <a href="https://github.com/socketio/socket.io-emitter/releases/tag/3.0.0" target="_blank" rel="noopener noreferrer">3.x</a></p></li></ul><p>Get the latest client from the CDN:</p><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.1/socket.io.js</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content>
        <author>
            <name>Damien Arrachequesne</name>
            <uri>https://github.com/darrachequesne</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 1.4.5]]></title>
        <id>https://socket.io/blog/socket-io-1-4-5/</id>
        <link href="https://socket.io/blog/socket-io-1-4-5/"/>
        <updated>2016-01-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just published some quick fixes!]]></summary>
        <content type="html"><![CDATA[<p>We just published some quick fixes!</p><ul><li>Fixed <code>socket.io-client</code> usage with <a href="https://www.nativescript.org/" target="_blank" rel="noopener noreferrer">NativeScript</a>.</li><li>Fixed graceful close of the attached http <code>Server</code> of <code>socket.io</code> and <code>engine.io</code>.</li></ul><p>Get the latest client from the CDN:</p><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.5/socket.io.min.js</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content>
        <author>
            <name>Guillermo Rauch</name>
            <uri>https://twitter.com/rauchg</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 1.4.4]]></title>
        <id>https://socket.io/blog/socket-io-1-4-4/</id>
        <link href="https://socket.io/blog/socket-io-1-4-4/"/>
        <updated>2016-01-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just published two fixes for socket.io-client:]]></summary>
        <content type="html"><![CDATA[<p>We just published two fixes for <code>socket.io-client</code>:</p><ul><li><p>Building with <code>browserify</code> or <code>webpack</code> is now completely straightforward. No need to <code>exclude/ignore</code> or <code>noParse/externals</code> the <code>ws</code> module.</p></li><li><p>Improved the JSONP transport when <code>socket.io-client</code> or <code>engine.io-client</code> are lazily evaluated or the <code>&lt;script&gt;</code> tag that included them gets removed.</p></li></ul><p>Get the latest client from the CDN:</p><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.4/socket.io.min.js</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content>
        <author>
            <name>Guillermo Rauch</name>
            <uri>https://twitter.com/rauchg</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 1.4.1, 1.4.2 and 1.4.3]]></title>
        <id>https://socket.io/blog/socket-io-1-4-1-1-4-2-and-1-4-3/</id>
        <link href="https://socket.io/blog/socket-io-1-4-1-1-4-2-and-1-4-3/"/>
        <updated>2016-01-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We published three minor releases right after 1.4.0 addressing build issues in different environments.]]></summary>
        <content type="html"><![CDATA[<p>We published three minor releases right after <code>1.4.0</code> addressing build issues in different environments.</p><ul><li><p>Socket.IO-client now includes the latest version of <a href="https://github.com/socketio/engine.io-client" target="_blank" rel="noopener noreferrer">engine.io-client</a></p></li><li><p>Fixed an issue that was preventing bundling with <a href="https://webpack.github.io/" target="_blank" rel="noopener noreferrer">webpack</a>.</p></li><li><p>Socket.IO now adds support for <a href="https://www.nativescript.org/" target="_blank" rel="noopener noreferrer">NativeScript</a>!</p></li></ul><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.3/socket.io.min.js</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content>
        <author>
            <name>Guillermo Rauch</name>
            <uri>https://twitter.com/rauchg</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 1.4.0]]></title>
        <id>https://socket.io/blog/socket-io-1-4-0/</id>
        <link href="https://socket.io/blog/socket-io-1-4-0/"/>
        <updated>2016-01-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Socket.IO 1.4.0 ship with new features like automatic compression for XHR and WebSockets, lots of bug fixes and significant performance and memory improvements.]]></summary>
        <content type="html"><![CDATA[<p>Socket.IO 1.4.0 ship with new features like <strong>automatic compression</strong> for XHR and WebSockets, lots of bug fixes and significant performance and memory improvements.</p><p>Compression is enabled by default, as it’s highly beneficial for most application payloads. The following example shows the savings for a realtime stream of tweets.</p><div id="tweets-compression-demo"></div><p>The compression gains will vary by transport. For example, WebSocket defaults to a window size of 32kb when <strong>DEFLATE</strong> compression is enabled. Repeated occurrences of strings within that window will be compressed.
The following demo (inspired by Julia Evans <a href="http://jvns.ca/blog/2013/10/24/day-16-gzip-plus-poetry-equals-awesome/" target="_blank" rel="noopener noreferrer">work</a>) will highlight what the LZ77 algorithm de-duplicates from the traffic sent by the Twitter stream that matches <em>javascript</em>.</p><div id="lz77-compression-demo"></div><p style="font-size:10px;color:#999">How this demo works: we re-implemented a part of <a href="https://github.com/socketio/lz77-compression-demo/blob/master/public/lz77-analyzer.js" target="_blank" rel="noopener noreferrer" style="color:#888">LZ77 in JavaScript</a>. A <a href="https://github.com/socketio/lz77-compression-demo/blob/master/public/component.js#L67" target="_blank" rel="noopener noreferrer" style="color:#888">React component</a> then renders the compressed strings.</p><p>The longer the string, the darker the shade of yellow displayed.</p><p>In addition to this default behavior, we’ve introduced the capability to perform selective per-message compression, by introducing the <code>compress</code> flag when emitting an event.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">compress</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">‘hi’</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">some</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ‘data’ </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>To configure the defaults, we’ve introduced the following two options that you can pass to socket.io (and engine.io) when starting the server:</p><ul><li><p><code>perMessageDeflate</code> – options to customize WebSocket compression (<a href="https://github.com/websockets/ws/blob/master/doc/ws.md#optionspermessagedeflate" target="_blank" rel="noopener noreferrer">see here</a>) or <code>true</code> for defaults (<code>true</code>).</p></li><li><p><code>httpCompression</code> – options to customize compression for HTTP polling transports or <code>true</code> for defaults (<code>true</code>)</p></li></ul><p>The memory overhead when compression is enabled is not inexistent, however. Make sure to account for a 300kb~ overhead per connection in terms of memory allocation. <a href="https://www.igvita.com/2013/11/27/configuring-and-optimizing-websocket-compression/" target="_blank" rel="noopener noreferrer">Read here</a> about the parameters you can customize to change how much memory is allocated and how aggressively data is compressed.</p><p>The following improvements have been made to the <strong><a href="https://github.com/socketio/socket.io" target="_blank" rel="noopener noreferrer">server</a></strong>:</p><ul><li>Assume 443 port when passing <code>https://</code> to the <code>origins</code> parameter – Evan Lucas</li><li>Improve detection of binary data inside events (in the <code>has-binary</code> module) – Gunther Brunner</li><li>Warn about missing <code>error</code> event handlers on sockets to prevent silent hard-to-debug situations</li><li>Allow a custom function for the <code>allowRequest</code> function for origins verification</li><li>Fixes for “use strict” environments – Naoyuki Kanezawa</li><li>Prevent users calling the ack function multiple times – Kevin Jose Martin</li><li>Fixed potential memory leaks with open sockets when upgrade fails – Naoyuki Kanezawa</li><li>Fix lingering requests when a polling error occurs – Naoyuki Kanezawa</li><li>Drastically more memory efficient when keeping track of clients – Damien Arrachequesne</li><li>Drastically more memory efficient when keeping track of rooms – Jérémy Lal</li><li>Trigger callback if the client is already in the given room when <code>join</code> is called – Damien Arrachequesne</li><li>Minor parser fixes and performance improvements.</li></ul><p>The following improvements have been made to the <strong><a href="https://github.com/socketio/socket.io-client" target="_blank" rel="noopener noreferrer">client</a></strong>:</p><ul><li>Fix for specifying custom ports when connecting</li><li>2 or more connections to the same namespace now create new sockets, instead of reusing a single one.</li><li>Added new reserved <code>ping</code> and <code>pong</code> events when a heartbeat is emitted and received.</li><li>Add support for environments that extend Object.prototype – Damien Arrachequesne</li><li>Fixes for “use strict” environments – Naoyuki Kanezawa</li><li>Added an <code>extraHeaders</code> feature for custom headers in HTTP transports (non-WebSocket)</li><li>Fix handling of disconnection while in the <code>opening</code> state.</li><li>Improved error handling for unmatched acknowledgements.</li><li>Parser fixes and improvements.</li></ul><p>We've also released <strong><a href="https://github.com/socketio/socket.io-redis" target="_blank" rel="noopener noreferrer">socket.io-redis</a></strong> <code>0.2.0</code> with significant performance improvements.</p><p>Special thanks to <em>Damien Arrachequesne</em>, <em>Naoyuki Kanezawa</em> and <em>Jérémy Lal</em> for their amazing and continued contributions that made this release possible.</p>]]></content>
        <author>
            <name>Guillermo Rauch</name>
            <uri>https://twitter.com/rauchg</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 1.3.7]]></title>
        <id>https://socket.io/blog/socket-io-1-3-7/</id>
        <link href="https://socket.io/blog/socket-io-1-3-7/"/>
        <updated>2015-09-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Socket.IO 1.3.7 includes support for io.js and Node.JS 4.0.0.]]></summary>
        <content type="html"><![CDATA[<p>Socket.IO <strong>1.3.7</strong> includes support for io.js and Node.JS 4.0.0.</p><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.7/socket.io.min.js</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content>
        <author>
            <name>Guillermo Rauch</name>
            <uri>https://twitter.com/rauchg</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 1.3.6]]></title>
        <id>https://socket.io/blog/socket-io-1-3-6/</id>
        <link href="https://socket.io/blog/socket-io-1-3-6/"/>
        <updated>2015-07-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Socket.IO 1.3.6 addresses a build issue with the ws module on Windows.]]></summary>
        <content type="html"><![CDATA[<p>Socket.IO <strong>1.3.6</strong> addresses a build issue with the <code>ws</code> module on Windows.</p><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content>
        <author>
            <name>Guillermo Rauch</name>
            <uri>https://twitter.com/rauchg</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO P2P]]></title>
        <id>https://socket.io/blog/socket-io-p2p/</id>
        <link href="https://socket.io/blog/socket-io-p2p/"/>
        <updated>2015-07-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today were very happy to introduce Socket.IO P2P, the easiest way to establish a bidirectional events channel between two peers with a server fallback to provide maximum reliability.]]></summary>
        <content type="html"><![CDATA[<p>Today were very happy to introduce Socket.IO P2P, the easiest way to establish <strong>a bidirectional events channel between two peers</strong> with a server fallback to provide maximum reliability.</p><p>Lets look at the API and build a little chat application. Or check out <a href="https://github.com/socketio/socket.io-p2p" target="_blank" rel="noopener noreferrer">the repository</a> directly!</p><p style="text-align:center;padding:20px 0"><img loading="lazy" src="https://cldup.com/95U80xyuHq.svg" class="img_ev3q"></p><p><strong>Socket.IO <span style="color:#F04">P2P</span></strong> provides an <strong>easy and reliable</strong> way to setup a <a href="http://www.webrtc.org/" target="_blank" rel="noopener noreferrer">WebRTC</a> connection between peers and communicate using the <a href="https://github.com/socketio/socket.io-protocol" target="_blank" rel="noopener noreferrer">socket.io-protocol</a>.</p><p>Socket.IO is used to transport <a href="http://www.html5rocks.com/en/tutorials/webrtc/infrastructure/#what-is-signaling" target="_blank" rel="noopener noreferrer">signaling data</a> and as a <em>fallback</em> for clients where the WebRTC <code>PeerConnection</code> is not supported. Adding a simple piece of middleware to your socket.io setup enables this – no need to hand roll your own signaling exchange or set up, deploy and scale new servers.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="usage">Usage<a href="#usage" class="hash-link" aria-label="Direct link to Usage" title="Direct link to Usage">​</a></h2><p>It only takes a few lines of code to set up the server and client.</p><p>Server:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">server</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> p2p </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io-p2p-server'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">Server</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">p2p</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Client:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">P2P</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io-p2p'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io-client'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> socket </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">io</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> p2p </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">P2P</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">p2p</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'peer-msg'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'From a peer %s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>There are various options for the advanced user. Once signaling data has been exchanged an <code>upgrade</code> event is triggered and an optional callback is called.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">numClients</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// connect up to 10 clients at a time</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> p2p </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">P2P</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'We all speak WebRTC now'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="the-chat-example">The Chat example<a href="#the-chat-example" class="hash-link" aria-label="Direct link to The Chat example" title="Direct link to The Chat example">​</a></h2><p>We will build a simple chat application, as our tradition dictates, but with P2P capabilities! In this application:</p><ul><li>Clients can send text messages to each other. Messages display in a timeline</li><li>Clients connect to each other over socket.io and initially send messages via the server</li><li>Clients can choose to <strong>go private</strong> – switching the transport to WebRTC</li><li>All clients connected to the server can connect via WebRTC up to a maximum of 10 clients</li></ul><p>All code from this example is included in the <a href="https://github.com/socketio/socket.io-p2p/tree/master/examples/chat" target="_blank" rel="noopener noreferrer">main repository</a>.</p><p>We first setup the client with <code>autoUpgrade</code> set to false so that clients can upgrade the connection themselves. Set <code>numClients</code> to <code>10</code> to allow up to 10 clients to connect with each other.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> opts </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token literal-property property" style="color:#36acaa">autoUpgrade</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">numClients</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> p2psocket </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">P2P</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> opts</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Setup the event listeners:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">p2psocket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'peer-msg'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// append message to list</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">p2psocket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'go-private'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  p2psocket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">upgrade</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// upgrade to peerConnection</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>In this example, we want any clients connecting to the server to exchange signaling data with each other. We can use the server component as a simple middleware. Clients will connect on the root namespace.</p><p>If we wanted clients to exchange signalling data in rooms, rather than on a whole namespace, we could use the server module upon connection <a href="https://github.com/tomcartwrightuk/p2p-snake/blob/master/server.js" target="_blank" rel="noopener noreferrer">like this</a>.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> server </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'http'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createServer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> p2pserver </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io-p2p-server'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">Server</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">server</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">server</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">listen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3030</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">p2pserver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>We then setup listeners to pass messages between clients and to broadcast the <code>go-private</code> event.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'connection'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'peer-msg'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'Message from peer: %s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">broadcast</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'peer-msg'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'go-private'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">broadcast</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'go-private'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Thats all you need: add a little markup we are off! Heres the demo application in action:</p><a href="/images/P2PChatExampleRedo2.gif"><img loading="lazy" src="/images/P2PChatExampleRedo2.gif" alt="P2PChatExampleRedo2" width="854" height="317" class="alignnone size-full wp-image-921 img_ev3q"></a><p>Thanks to Guillermo Rauch (<a href="https://twitter.com/rauchg" target="_blank" rel="noopener noreferrer">@rauchg</a>) for the advice, testing and patience, Harrison Harnisch (<a href="https://github.com/hharnisc" target="_blank" rel="noopener noreferrer">@hharnisc</a>) for bug fixes and to Feross Aboukhadijeh (<a href="https://github.com/feross" target="_blank" rel="noopener noreferrer">@feross</a>) for providing the underlying WebRTC abstraction <a href="https://github.com/feross/simple-peer" target="_blank" rel="noopener noreferrer">simple-peer</a>.</p><p>Pull requests, issues, comments and general rantings are all welcome over at the GitHub <a href="https://github.com/socketio/socket.io-p2p" target="_blank" rel="noopener noreferrer">repo</a>.</p>]]></content>
        <author>
            <name>Tom Cartwright</name>
            <uri>https://twitter.com/tomcartwrightuk</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO C++]]></title>
        <id>https://socket.io/blog/socket-io-cpp/</id>
        <link href="https://socket.io/blog/socket-io-cpp/"/>
        <updated>2015-04-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[I'm really proud to announce the first release of the Socket.IO C++ Client on GitHub!]]></summary>
        <content type="html"><![CDATA[<p>I'm really proud to announce the first release of the <a href="https://github.com/socketio/socket.io-client-cpp" target="_blank" rel="noopener noreferrer">Socket.IO C++ Client</a> on GitHub!</p><p>Based on <a href="http://www.boost.org/" target="_blank" rel="noopener noreferrer">Boost</a> and <a href="https://github.com/zaphoyd/websocketpp" target="_blank" rel="noopener noreferrer">WebSocket++</a>, this full-featured Socket.IO 1.0 client has the fundamental advantage of working on <strong>multiple platforms</strong>. Check out the directory of <a href="https://github.com/socketio/socket.io-client-cpp/tree/master/examples" target="_blank" rel="noopener noreferrer">examples</a>. It contains examples of iOS, QT, and CLI chat clients!</p><p>To learn how to use this client, I put together a QT chat example that communicates using a <a href="https://github.com/Automattic/socket.io/tree/master/examples/chat" target="_blank" rel="noopener noreferrer">Socket.IO Node.JS chat server</a>. Keep reading for step-by-step instructions.</p><p style="text-align:center"><img loading="lazy" src="https://cldup.com/98tHyoJJE7.gif" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2><p>If you’d like to follow along, begin by cloning the <a href="https://github.com/socketio/socket.io-client-cpp" target="_blank" rel="noopener noreferrer">socket.io-client-cpp</a> repository using the following:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone --recurse-submodules https://github.com/socketio/socket.io-client-cpp.git</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The app includes the following features:</p><ul><li>Send messages to all users joining the room.</li><li>Receive a notification when users join or leave the room.</li><li>Receive notifications when a user starts typing a message.</li></ul><p>Before you get started, visit the <a href="http://www.qt.io/download-open-source/#section-2" target="_blank" rel="noopener noreferrer">QT community</a> to download and install QT.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="creating-a-qt-gui-application">Creating a QT GUI Application<a href="#creating-a-qt-gui-application" class="hash-link" aria-label="Direct link to Creating a QT GUI Application" title="Direct link to Creating a QT GUI Application">​</a></h2><p>Launch the QT Creator.</p><p>On the welcome page, select <code>New Project</code>, then create a <code>QT Widget Application.</code> Name it <code>SioChatDemo.</code></p><p>The project structure should look like this:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">SioChatDemo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    |__ SioChatDemo.pro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    |__Headers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    |   |__mainwindow.h</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    |__Sources</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    |   |__main.cpp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    |   |__mainwindow.cpp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    |__Forms</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |__mainwindow.ui</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="importing-an-sioclient">Importing an SioClient<a href="#importing-an-sioclient" class="hash-link" aria-label="Direct link to Importing an SioClient" title="Direct link to Importing an SioClient">​</a></h2><p>Lets copy the SioClient into the QT project under the subfolder <code>sioclient.</code></p><p>Edit <code>SioChatDemo.pro</code> to configure paths and compile options by simply adding:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">SOURCES </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> ./sioclient/src/sio_client.cpp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">           ./sioclient/src/sio_packet.cpp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HEADERS  </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> ./sioclient/src/sio_client.h</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ./sioclient/src/sio_message.h</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">INCLUDEPATH </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> $</span><span class="token environment constant" style="color:#36acaa">$PWD</span><span class="token plain">/sioclient/lib/rapidjson/include</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">INCLUDEPATH </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> $</span><span class="token environment constant" style="color:#36acaa">$PWD</span><span class="token plain">/sioclient/lib/websocketpp</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Add two additional compile options:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token assign-left variable" style="color:#36acaa">CONFIG</span><span class="token operator" style="color:#393A34">+=</span><span class="token plain">no_keywords</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">CONFIG</span><span class="token operator" style="color:#393A34">+=</span><span class="token plain">c++11</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The <code>no_keywords</code> flag prevents <code>qmake</code> from treating some function names as <code>emit</code> as the keyword for the signal-slot mechanism.</p><p>Use <code>c++11</code> to ask for C++11 support.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="importing-boost">Importing Boost<a href="#importing-boost" class="hash-link" aria-label="Direct link to Importing Boost" title="Direct link to Importing Boost">​</a></h2><p>We now have our boost <code>headers</code> and a fat boost <code>static lib</code> named <code>libboost.a</code>(non-win32) or <code>boost.lib</code>(win32).</p><p>To import them, we need to edit <code>SioChatDemo.pro</code> again by adding a header including the following:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">INCLUDEPATH </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">our boost headers folder</span><span class="token variable" style="color:#36acaa">`</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Linker options:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">win32:CONFIG</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">release, debug</span><span class="token operator" style="color:#393A34">|</span><span class="token plain">release</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">: LIBS </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> -L</span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">our Win32 boost static lib folder</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> -lboost</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">else:win32:CONFIG</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">debug, debug</span><span class="token operator" style="color:#393A34">|</span><span class="token plain">release</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">: LIBS </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> -L</span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">our Win32 boost static lib folder</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> -lboost</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">else:unix: LIBS </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> -L</span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">our osx boost static lib folder</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> -lboost</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="create-the-main-window-ui">Create the Main Window UI<a href="#create-the-main-window-ui" class="hash-link" aria-label="Direct link to Create the Main Window UI" title="Direct link to Create the Main Window UI">​</a></h2><p>Create a simple UI by dragging and dropping a widget from the widget box on the left-hand side.</p><p style="text-align:center"><img loading="lazy" src="https://cldup.com/RI98CYpYL5.png" class="img_ev3q"></p><p>It contains the following:</p><ul><li>A <code>QLineEdit</code> at the top to input a nickname: <code>nickNameEdit</code></li><li>A <code>QPushButton</code> at the top right for login: <code>loginBtn</code></li><li>A <code>QListWidget</code> in the center for showing messages: <code>listView</code></li><li>A <code>QLineEdit</code> at the bottom for typing messages: <code>messageEdit</code></li><li>A <code>QPushButton</code> at the bottom right for sending messages: <code>sendBtn</code></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="add-slots-in-the-main-window">Add Slots in the Main Window<a href="#add-slots-in-the-main-window" class="hash-link" aria-label="Direct link to Add Slots in the Main Window" title="Direct link to Add Slots in the Main Window">​</a></h2><p>The following slots need to be added in the <code>mainwindow</code> class to handle UI events:</p><ul><li>Click ‘Login’ button</li><li>Click ‘Send Message’ button</li><li>Text change in message editing (to show typing status)</li><li>Return message editing (for sending responses)</li></ul><p>Insert the following code into the <code>MainWindow</code> class in <code>mainwindow.h</code>:</p><div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> Q_SLOTS</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SendBtnClicked</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">TypingChanged</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">LoginClicked</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">OnMessageReturn</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="connect-the-ui-event-signal-and-slots">Connect the UI Event Signal and Slots<a href="#connect-the-ui-event-signal-and-slots" class="hash-link" aria-label="Direct link to Connect the UI Event Signal and Slots" title="Direct link to Connect the UI Event Signal and Slots">​</a></h2><p>Open <code>mainwindow.ui</code> in the design mode. Switch to the <code>signals/slots</code> mode using <code>Menu-&gt;Edit-&gt;Edit Signals/Slots</code>.</p><p>Click and hold the widget and drag it to the window (the cursor will become an electrical ground symbol) to open the connection editor.</p><p>In the connection editor, edit the main window slots on the right side. Add the slot function names added in <code>mainwindow.h</code> before.</p><p>Then we can connect the event signal to the widget with our own slots. The result should look like this:</p><p style="text-align:center"><img loading="lazy" src="https://cldup.com/Vsb-UXG3FC.jpg" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="adding-ui-refresh-signalsslots">Adding UI Refresh Signals/Slots<a href="#adding-ui-refresh-signalsslots" class="hash-link" aria-label="Direct link to Adding UI Refresh Signals/Slots" title="Direct link to Adding UI Refresh Signals/Slots">​</a></h2><p>The <code>sio::client</code> callbacks are not in the UI thread. However, the UI must be updated with those callbacks, so we need a signal for the non-UI thread to request the <code>slots</code> functions in the UI thread. To signal that <code>QListWidgetItem</code> has been added, insert the following:</p><div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// in mainwindow.h</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Q_SIGNALS</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">RequestAddListItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">QListWidgetItem </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">item</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> Q_SLOTS</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">AddListItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">QListWidgetItem </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">item</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">//In mainwindow.cpp</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token class-name">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">AddListItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">QListWidgetItem</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> item</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token generic-function function" style="color:#d73a49">findChild</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">QListWidget</span><span class="token generic-function generic class-name operator" style="color:#393A34">*</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"listView"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">addItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Then connect them in the <code>MainWindow</code> constructor.</p><div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">connect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token function" style="color:#d73a49">SIGNAL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">RequestAddListItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">QListWidgetItem</span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token function" style="color:#d73a49">SLOT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">AddListItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">QListWidgetItem</span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="setting-up-the-socket">Setting up the Socket<a href="#setting-up-the-socket" class="hash-link" aria-label="Direct link to Setting up the Socket" title="Direct link to Setting up the Socket">​</a></h2><p>For single-window applications, simply let <code>MainWindow</code> class hold the <code>sio::client</code> object by declaring a <code>unique_ptr</code> member of the <code>sio::client</code> and several event handling functions in <code>mainwindow.h</code>.</p><div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">private</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">OnNewMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">bool</span><span class="token plain"> hasAck</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ack_resp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">OnUserJoined</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">bool</span><span class="token plain"> hasAck</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ack_resp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">OnUserLeft</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">bool</span><span class="token plain"> hasAck</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ack_resp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">OnTyping</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">bool</span><span class="token plain"> hasAck</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ack_resp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">OnStopTyping</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">bool</span><span class="token plain"> hasAck</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ack_resp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">OnLogin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">bool</span><span class="token plain"> hasAck</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ack_resp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">OnConnected</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">OnClosed</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">client</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">close_reason </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> reason</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">OnFailed</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">unique_ptr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">client</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> _io</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Initialize <code>sio::client</code> and setup event bindings for the default <code>socket</code> in the <code>MainWindow</code> constructor.</p><p>We also need to handle connectivity and disconnect events.</p><p>Add the following to the <code>MainWindow</code> constructor:</p><div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">MainWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">QWidget </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">parent</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">QMainWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">parent</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ui</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> Ui</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">MainWindow</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">_io</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ui</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">setupUi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">placeholders</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">_1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">placeholders</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">_2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">placeholders</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">_3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">placeholders</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">_4</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    socket</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr sock </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> _io</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">socket</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sock</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"new message"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">bind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">OnNewMessage</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sock</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"user joined"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">bind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">OnUserJoined</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sock</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"user left"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">bind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">OnUserLeft</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sock</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"typing"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">bind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">OnTyping</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sock</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"stop typing"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">bind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">OnStopTyping</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sock</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"login"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">bind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">OnLogin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//default socket opened, also we have "set_open_listener" for monitoring physical connection opened.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    _io</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">set_socket_open_listener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">bind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">OnConnected</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">placeholders</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">_1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//physical connection closed or drop.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    _io</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">set_close_listener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">bind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">OnClosed</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">_1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//physical connection fail to establish.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    _io</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">set_fail_listener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">bind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">OnFailed</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">connect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token function" style="color:#d73a49">SIGNAL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">RequestAddListItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">QListWidgetItem</span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token function" style="color:#d73a49">SLOT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">AddListItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">QListWidgetItem</span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="managing-connection-state">Managing Connection State<a href="#managing-connection-state" class="hash-link" aria-label="Direct link to Managing Connection State" title="Direct link to Managing Connection State">​</a></h2><p>We have several connection listeners for connection events.</p><p>First, we want to send a login message when were connected; we get the default <code>socket</code> from the <code>client</code> to do that.</p><div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token class-name">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">OnConnected</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    QByteArray bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> m_name</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toUtf8</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string </span><span class="token function" style="color:#d73a49">nickName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">data</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">length</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    _io</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">socket</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"add user"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> nickName</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>If the connection closes or fails, we need to restore the UI before we connect.</p><div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token class-name">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">OnClosed</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">client</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">close_reason </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> reason</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//restore UI to pre-login state</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token class-name">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">OnFailed</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//restore UI to pre-login state</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">If we exit the `MainWindow`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> we need to clear the event bindings </span><span class="token operator" style="color:#393A34">and</span><span class="token plain"> listeners</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">The `sio</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">client` object will be destroyed </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> `unique_ptr`</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```cpp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">~</span><span class="token function" style="color:#d73a49">MainWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    _io</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">socket</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">off_all</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    _io</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">socket</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">off_error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">delete</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">## Handling Socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">IO Events</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">We</span><span class="token number" style="color:#36acaa">'ll</span><span class="token plain"> need to handle socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">io events in our functions they are bound to</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">For example</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> we need to show received messages in the list view</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```cpp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token class-name">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">OnNewMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token keyword" style="color:#00009f">const</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">,</span><span class="token keyword" style="color:#00009f">bool</span><span class="token plain"> hasAck</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">ptr </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ack_resp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">get_flag</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> message</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">flag_object</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string msg </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> data</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">get_map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"message"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">get_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> data</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">get_map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"username"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">get_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        QString label </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">QString</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">fromUtf8</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">data</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">length</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        label</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token char">':'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        label</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">QString</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">fromUtf8</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">data</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">length</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        QListWidgetItem </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">item</span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">QListWidgetItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">label</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">//emit RequestAddListItem signal</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">//so that 'AddListItem' will be executed in UI thread.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Q_EMIT </span><span class="token function" style="color:#d73a49">RequestAddListItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">## Wrapping Up</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Sending the Message</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">When `sendBtn` is clicked</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> we need to send the text in `messageEdit` to the chatroom</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Add the following code to `</span><span class="token function" style="color:#d73a49">SendBtnClicked</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">`</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```cpp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token class-name">MainWindow</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">SendBtnClicked</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    QLineEdit</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> messageEdit </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token generic-function function" style="color:#d73a49">findChild</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">QLineEdit</span><span class="token generic-function generic class-name operator" style="color:#393A34">*</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"messageEdit"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    QString text </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> messageEdit</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">text</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">length</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        QByteArray bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> text</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toUtf8</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string </span><span class="token function" style="color:#d73a49">msg</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">data</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">length</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        _io</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">socket</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"new message"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token comment" style="color:#999988;font-style:italic">//emit new message</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        text</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">":You"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        QListWidgetItem </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">item </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">QListWidgetItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">text</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        item</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">setTextAlignment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Qt</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">AlignRight</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Q_EMIT </span><span class="token function" style="color:#d73a49">RequestAddListItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        messageEdit</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">## Further Reading</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">You can run the </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">a href</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"https://github.com/socketio/socket.io-client-cpp/tree/master/examples/QT/SioChatDemo"</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">demo project</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">a</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> to get a closer look</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> Before you run it</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> please follow the </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">a href</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"https://github.com/socketio/socket.io-client-cpp#-with-cmake"</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">instructions</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">a</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> to make the Socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">io client library</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Don</span><span class="token number" style="color:#36acaa">'</span><span class="token plain">t forget to </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">a href</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"https://github.com/socketio/socket.io-client-cpp"</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">star the project</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">a</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> on GitHub to get updates</span><span class="token operator" style="color:#393A34">!</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content>
        <author>
            <name>Melo Yao</name>
            <uri>https://twitter.com/melode111</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO on iOS]]></title>
        <id>https://socket.io/blog/socket-io-on-ios/</id>
        <link href="https://socket.io/blog/socket-io-on-ios/"/>
        <updated>2015-03-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We are pleased to announce the immediate availability of the Socket.IO Swift Client! Youll now be able to write code that runs natively on iOS and OSX, while maintaining the simplicity and expressiveness of the JavaScript client!]]></summary>
        <content type="html"><![CDATA[<video class="gfyVidIframe" id="gfyVid" height="574" width="323"><source id="webmsource" src="//fat.gfycat.com/EssentialBlueElectriceel.webm" type="video/webm"><source id="mp4source" src="//giant.gfycat.com/EssentialBlueElectriceel.mp4" type="video/mp4"></video><p>We are pleased to announce the immediate availability of the <a href="https://github.com/socketio/socket.io-client-swift" target="_blank" rel="noopener noreferrer">Socket.IO Swift Client</a>! Youll now be able to write code that runs natively on <strong>iOS</strong> and <strong>OSX</strong>, while maintaining the simplicity and expressiveness of the JavaScript client!</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">import Foundation</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">let socket = SocketIOClient(socketURL: "localhost:8880")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">socket.on("important message") {data, ack in</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    println("Message for you! \(data?[0])")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ack?("I got your message, and I'll send my response")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    socket.emit("response", "Hello!")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">socket.connect()</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>To show how you can use it in a real project, Ill show you how to create a small Tic Tac Toe app like the one shown above.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="overview">Overview<a href="#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview">​</a></h2><p>In this tutorial well look at creating a small iOS app that demonstrates socket.io and iOS. If you learn better from looking at code you can look at it <a href="https://github.com/nuclearace/socket.io-client-swift-example" target="_blank" rel="noopener noreferrer">here</a>. The point of the tutorial is not to explain developing an iOS app, but to demonstrate how you can incorporate <code>socket.io-client-swift</code> into your projects! So it is assumed you have a basic knowledge of XCode.
Note: This example uses Swift 1.2. However, 1.2 isnt much different from Swift 1.1, and the library has branches for Swift 1.1 and 1.2. The only difference in this guide is I use 1.2s expanded <code>if let</code> construct to avoid nesting.
Note 2: While this library is written in, and meant for, Swift applications, it can be used with Objective-C projects, but will require some extra work (youll probably need to create a Swift class that can interface with your Objective-C code, as not all methods in the client will be available to Objective-C i.e emit, onAny). See <a href="https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_87" target="_blank" rel="noopener noreferrer">this</a> for more information.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2><p>I designed <code>socket.io-client-swift</code> to be as close to <code>socket.io-client</code> as I could. So many of the ways you do things in socket.io-client look similar here! This is not a step-by-step tutorial for making a Tic Tac Toe app, only adding the socket.io-client part of it.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="setting-up-the-project">Setting up the Project<a href="#setting-up-the-project" class="hash-link" aria-label="Direct link to Setting up the Project" title="Direct link to Setting up the Project">​</a></h2><p>From Xcode, create a new project with the layout of single-view iOS application. You can name it whatever you like, Ill be naming mine <code>TicTacIOiOS</code>.
The next step is getting the code for <code>socket.io-client-swift</code>, you can either use <code>git</code> to clone the repo to a directory, or simply download a <a href="https://github.com/socketio/socket.io-client-swift/releases" target="_blank" rel="noopener noreferrer">release</a>. Either way you get it, the process of adding it to your project is the same. Simply drag the folder named SwiftIO to the same place you copied SocketRocket! (Again making sure you select copy.)
And thats it, the hardest part of putting our app together is done! At this point, if you want to test that its setup properly, try building and running the app, it should compile.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="adding-our-code">Adding Our Code<a href="#adding-our-code" class="hash-link" aria-label="Direct link to Adding Our Code" title="Direct link to Adding Our Code">​</a></h3><p>Now, assuming youve created your user interface. Its time to add the code that will interface with our socket.io server!
In our demo application we have one UIViewController subclass, named ViewController. All of our code will be added there. First, we need to add a member named <code>socket</code> of type <code>SocketIOClient</code> to our ViewController.</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">let socket = SocketIOClient(socketURL: "localhost:8900")</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Now, in our overridden <code>viewDidLoad</code> method we want to add two things, a method call that will add our handlers to our socket, and a call to connect our socket.</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">self.addHandlers()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">self.socket.connect()</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="handlers">Handlers<a href="#handlers" class="hash-link" aria-label="Direct link to Handlers" title="Direct link to Handlers">​</a></h3><p>Now that we have our method calls, its time to implement the method that adds the handlers!</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">func addHandlers() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // Our socket handlers go here</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Since were about to add the handlers, I think its worth mentioning the syntax I use for closures in Swift. Swift has many different ways of expressing closures, and they can be found <a href="https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html" target="_blank" rel="noopener noreferrer">here</a>. But the form I use for adding handlers is a trailing closure, without explicit type annotations. You can use other closure forms if you wish.
Im not going to show you all the handlers in our demo app here, just a few that demonstrate important things youll need to know when working with <code>socket.io-client-swift</code>.
The first handler were going to add is one that will be called on any event, since its useful for debugging the API.</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// Using a shorthand parameter name for closures</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">self.socket.onAny {println("Got event: \($0.event), with items: \($0.items)")}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The next handler that well add is the one that tells the app that the game has started.</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">self.socket.on("startGame") {[weak self] data, ack in</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    self?.handleStart()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    return</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Now to explain some things. <code>[weak self]</code> is a capture list. It tells the compiler that the reference to self in this closure should not add to the reference count of self. This is so when the socket object goes out of scope, the capture made in the closure doesnt keep it from being deallocated. The first parameter in all <code>.on</code> callbacks is an optional NSArray, it will contain all the data received with the event, or nil. The second parameter in the callback is an optional with the type of AckEmitter. AckEmitter is simply a typealias of <code>(AnyObject...) -&amp;gt; Void</code>. Well see this used later.
The next handler well add is the one for a win.</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">self.socket.on("win") {[weak self] data, ack in</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    if let name = data?[0] as? String, typeDict = data?[1] as? NSDictionary {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self?.handleWin(name, type: typeDict)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>As mentioned before, this is new syntax for <code>if let</code> introduced in Swift 1.2. It simplifies optional unwrapping (pyramid of doom). The important thing to gather from this handler is that you do not need to force unwrap the array to get the object. Also note that a JSON object will be exposed to Swift as an NSDictionary.
Another thing to note is that for almost all your handlers that have data, youll be doing some kind of optional unwrapping and type casting. This is an unfortunate consequence of working with JavaScript.
The final handler that Ill demonstrate here is the one that handles whether the player wants to play again.</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">self.socket.on("gameReset") {data, ack in</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ack?(false)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>In this simplified example, we simply send an acknowledgement to the server that we dont ever want to play again. Remember that AckEmitter has a variadic definition, so you can send multiple things at once if you wanted.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="emitting-events">Emitting Events<a href="#emitting-events" class="hash-link" aria-label="Direct link to Emitting Events" title="Direct link to Emitting Events">​</a></h3><p>The next thing you'll probably want to know is how to send events from the client. Youll be pleased to know that it has a form almost exactly the same as socket.io-client!
In our ViewController we have a method that handles when a user wants to make a move. Without going into the logic of that, well show how we send the data to the server.</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">@IBAction func btnClicked(btn:UIButton) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    let coord:(x:Int, y:Int)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // Long switch statement that determines what coord should be</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    self.socket.emit("playerMove", coord.x, coord.y)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Thats all you need to do for sending data!
Some other examples of sending which arent covered in our demo are:</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sending-json">Sending JSON<a href="#sending-json" class="hash-link" aria-label="Direct link to Sending JSON" title="Direct link to Sending JSON">​</a></h3><p>As mentioned before, JSON in Swift is best represent as a Dictionary. Thankfully for you, you dont need to worry about turning it into something socket.io will understand, thats all done under-the-hood.</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">let myJSON = [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "name": "bob"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">socket.emit("jsonTest", myJSON)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sending-binary">Sending Binary<a href="#sending-binary" class="hash-link" aria-label="Direct link to Sending Binary" title="Direct link to Sending Binary">​</a></h3><p>Binary data is also handled by the client, so you dont need to worry about it.</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">let data = "Hello, ".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">let data2 = "World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">socket.emit("dataTest", data, ["world": data2])</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="requesting-acks">Requesting Acks<a href="#requesting-acks" class="hash-link" aria-label="Direct link to Requesting Acks" title="Direct link to Requesting Acks">​</a></h3><p>The client can also request that the server send an ack for an event. This is done by using the <code>emitWithAck</code> method which returns an object to which you can add a handler.</p><div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">socket.emitWithAck("needsAck", "test").onAck {data in</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    println("got ack with data: (data)")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="a-note-about-multitasking-in-ios">A Note About Multitasking in iOS<a href="#a-note-about-multitasking-in-ios" class="hash-link" aria-label="Direct link to A Note About Multitasking in iOS" title="Direct link to A Note About Multitasking in iOS">​</a></h3><p>As you probably know, iOS is very picky about what you can do in the background. As such, dont expect that your socket connection will survive in the background! Youll probably stop receiving events within seconds of the app going into the background. So its better to create a task that will gracefully close the connection when it enters the background (via AppDelegate), and then reconnect the socket when the app comes back into the foreground.
If you want to learn more about the client, check out the <a href="https://github.com/socketio/socket.io-client-swift/blob/master/README.md" target="_blank" rel="noopener noreferrer">README</a>! We also invite you to contribute by submitting issues, patches, documentation and examples.</p>]]></content>
        <author>
            <name>Erik Little</name>
            <uri>https://twitter.com/nuclearace</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 1.3.5]]></title>
        <id>https://socket.io/blog/socket-io-1-3-5/</id>
        <link href="https://socket.io/blog/socket-io-1-3-5/"/>
        <updated>2015-03-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Socket.IO 1.3.5 addresses a parser issue. Upgrade recommended. Completely backwards-compatible.]]></summary>
        <content type="html"><![CDATA[<p>Socket.IO <strong>1.3.5</strong> addresses a parser issue. Upgrade recommended. Completely backwards-compatible.</p><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content>
        <author>
            <name>Guillermo Rauch</name>
            <uri>https://twitter.com/rauchg</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 1.3.4]]></title>
        <id>https://socket.io/blog/socket-io-1-3-4/</id>
        <link href="https://socket.io/blog/socket-io-1-3-4/"/>
        <updated>2015-02-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Socket.IO 1.3.4 corrects the 1.3.3 build that included extra unused code.]]></summary>
        <content type="html"><![CDATA[<p>Socket.IO <strong>1.3.4</strong> corrects the <code>1.3.3</code> build that included extra unused code.</p><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.4/socket.io.min.js</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content>
        <author>
            <name>Guillermo Rauch</name>
            <uri>https://twitter.com/rauchg</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Socket.IO 1.3.3]]></title>
        <id>https://socket.io/blog/socket-io-1-3-3/</id>
        <link href="https://socket.io/blog/socket-io-1-3-3/"/>
        <updated>2015-02-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Socket.IO 1.3.3 is a backwards-compatible recommended upgrade for everyone.]]></summary>
        <content type="html"><![CDATA[<p>Socket.IO <strong>1.3.3</strong> is a backwards-compatible <strong>recommended upgrade</strong> for everyone.</p><ul><li><p>It addresses a bug in the parser that could break the decoder with maliciously-crafted binary packets.</p></li><li><p>We now <em>warn</em> about errors in the console if you dont manually specify an <code>error</code> event handler for <code>Socket</code> objects on the server.</p></li></ul><p>As usual, you can grab the latest client from the CDN!</p><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.3/socket.io.min.js</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content>
        <author>
            <name>Guillermo Rauch</name>
            <uri>https://twitter.com/rauchg</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Native Socket.IO and Android]]></title>
        <id>https://socket.io/blog/native-socket-io-and-android/</id>
        <link href="https://socket.io/blog/native-socket-io-and-android/"/>
        <updated>2015-01-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this tutorial well learn how to create a chat client that communicates with a Socket.IO Node.JS chat server, with our native Android Client! If you want to jump straight to the code, it's on GitHub. Otherwise, read on!]]></summary>
        <content type="html"><![CDATA[<img loading="lazy" class="aligncenter size-full wp-image-626" src="/images/androidchat.gif" alt="android chat demo" width="338" height="600"><p>In this tutorial well learn how to create a chat client that communicates with a Socket.IO <a href="https://github.com/socketio/socket.io/blob/master/examples/chat/index.js" target="_blank" rel="noopener noreferrer">Node.JS chat server</a>, with our <a href="https://github.com/socketio/socket.io-client-java" target="_blank" rel="noopener noreferrer">native Android Client</a>! If you want to jump straight to the code, it's on <a href="https://github.com/nkzawa/socket.io-android-chat" target="_blank" rel="noopener noreferrer">GitHub</a>. Otherwise, read on!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2><p>To follow along, start by cloning the repository: <a href="https://github.com/nkzawa/socket.io-android-chat" target="_blank" rel="noopener noreferrer" title="socket.io-android-chat">socket.io-android-chat</a>.</p><p>The app has the following features:</p><ul><li>Sending a message to all users joining to the room.</li><li>Notifies when each user joins or leaves.</li><li>Notifies when an user start typing a message.</li></ul><p>Socket.IO provides an event-oriented API that works across all networks, devices and browsers. It's incredibly robust (works even behind corporate proxies!) and highly performant, which is very suitable for multiplayer games or realtime communication.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="installing-the-dependencies">Installing the Dependencies<a href="#installing-the-dependencies" class="hash-link" aria-label="Direct link to Installing the Dependencies" title="Direct link to Installing the Dependencies">​</a></h2><p>The first step is to install the Java Socket.IO client with <a href="https://developer.android.com/tools/building/configuring-gradle.html" target="_blank" rel="noopener noreferrer">Gradle</a>.</p><p>For this app, we just add the dependency to <code>build.gradle</code>:</p><div class="language-gradle codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-gradle codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dependencies {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    implementation ('io.socket:socket.io-client:2.0.0') {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        exclude group: 'org.json', module: 'json'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>We must remember adding the internet permission to <code>AndroidManifest.xml</code>.</p><div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- app/AndroidManifest.xml --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">manifest</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name namespace" style="color:#00a4db;opacity:0.7">xmlns:</span><span class="token tag attr-name" style="color:#00a4db">android</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">http://schemas.android.com/apk/res/android</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">uses-permission</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name namespace" style="color:#00a4db;opacity:0.7">android:</span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">android.permission.INTERNET</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">manifest</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Now we can use Socket.IO on Android!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="using-socket-in-activity-and-fragment">Using socket in Activity and Fragment<a href="#using-socket-in-activity-and-fragment" class="hash-link" aria-label="Direct link to Using socket in Activity and Fragment" title="Direct link to Using socket in Activity and Fragment">​</a></h2><p>First, we have to initialize a new instance of Socket.IO as follows:</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">import io.socket.client.IO;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import io.socket.client.Socket;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">private Socket mSocket;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    try {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        mSocket = IO.socket("http://chat.socket.io");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    } catch (URISyntaxException e) {}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@Override</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">public void onCreate(Bundle savedInstanceState) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    super.onCreate(savedInstanceState);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    mSocket.connect();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><code>IO.socket()</code> returns a socket for <code>http://chat.socket.io</code> with the default options. Notice that the method caches the result, so you can always get a same <code>Socket</code> instance for an url from any Activity or Fragment.
And we explicitly call <code>connect()</code> to establish the connection here (unlike the JavaScript client). In this app, we use <code>onCreate</code> lifecycle callback for that, but it actually depends on your application.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="emitting-events">Emitting events<a href="#emitting-events" class="hash-link" aria-label="Direct link to Emitting events" title="Direct link to Emitting events">​</a></h2><p>Sending data looks as follows. In this case, we send a string but you can do JSON data too with the <a href="http://developer.android.com/reference/org/json/package-summary.html" target="_blank" rel="noopener noreferrer">org.json</a> package, and even binary data is supported as well!</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">private EditText mInputMessageView;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">private void attemptSend() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    String message = mInputMessageView.getText().toString().trim();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    if (TextUtils.isEmpty(message)) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        return;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    mInputMessageView.setText("");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    mSocket.emit("new message", message);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="listening-on-events">Listening on events<a href="#listening-on-events" class="hash-link" aria-label="Direct link to Listening on events" title="Direct link to Listening on events">​</a></h2><p>Like I mentioned earlier, Socket.IO is <strong>bidirectional</strong>, which means we can send events to the server, but also at any time during the communication the server can send events to us.</p><p>We then can make the socket listen an event on <code>onCreate</code> lifecycle callback.</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">@Override</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">public void onCreate(Bundle savedInstanceState) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    super.onCreate(savedInstanceState);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    mSocket.on("new message", onNewMessage);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    mSocket.connect();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>With this we listen on the <code>new message</code> event to receive messages from other users.</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">import io.socket.emitter.Emitter;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">private Emitter.Listener onNewMessage = new Emitter.Listener() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    @Override</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    public void call(final Object... args) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        getActivity().runOnUiThread(new Runnable() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            @Override</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            public void run() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                JSONObject data = (JSONObject) args[0];</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                String username;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                String message;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                try {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    username = data.getString("username");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    message = data.getString("message");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                } catch (JSONException e) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    return;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                // add the message to view</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                addMessage(username, message);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        });</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">};</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This is what <code>onNewMessage</code> looks like. A listener is an instance of <code>Emitter.Listener</code> and must be implemented the <code>call</code> method. Youll notice that inside of <code>call()</code> is wrapped by <code>Activity#runOnUiThread()</code>, that is because the callback is always called on another thread from Android UI thread, thus we have to make sure that adding a message to view happens on the UI thread.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="managing-socket-state">Managing Socket State<a href="#managing-socket-state" class="hash-link" aria-label="Direct link to Managing Socket State" title="Direct link to Managing Socket State">​</a></h2><p>Since an Android Activity has its own lifecycle, we should carefully manage the state of the socket also to avoid problems like memory leaks. In this app, we’ll close the socket connection and remove all listeners on <code>onDestroy</code> callback of Activity.</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">@Override</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">public void onDestroy() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    super.onDestroy();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    mSocket.disconnect();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    mSocket.off("new message", onNewMessage);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Calling <code>off()</code> removes the listener of the <code>new message</code> event.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="further-reading">Further reading<a href="#further-reading" class="hash-link" aria-label="Direct link to Further reading" title="Direct link to Further reading">​</a></h2><p>If you want to explore more, I recommend you look into:</p><ul><li><p>Other features of this app. They are just implemented with <code>emit()</code>, <code>on()</code> and <code>off()</code>.</p></li><li><p>The <a href="https://socketio.github.io/socket.io-client-java/installation.html" target="_blank" rel="noopener noreferrer">documentation</a> of the Java Socket.IO client</p></li><li><p>Many other great Socket.IO implementations created by the community!</p></li></ul>]]></content>
        <author>
            <name>Naoyuki Kanezawa</name>
            <uri>https://twitter.com/nkzawa</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing Socket.IO 1.0]]></title>
        <id>https://socket.io/blog/introducing-socket-io-1-0/</id>
        <link href="https://socket.io/blog/introducing-socket-io-1-0/"/>
        <updated>2014-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The first version of Socket.IO was created shortly after Node.JS made its first appearance. I had been looking for a framework that easily enabled me to push data from a server to a client for a long time, and even had tried other approaches to server-side JavaScript.]]></summary>
        <content type="html"><![CDATA[<p>The first version of Socket.IO was created shortly after Node.JS made its first appearance. I had been looking for a framework that easily enabled me to push data from a server to a client for a long time, and even had tried other approaches to server-side JavaScript.</p><p>At the time, the main focus was on an interface equivalent to the upcoming <code>WebSocket</code> API that was in the process of standardization. I was lucky to receive a lot of feedback from the community at the time (including Node.JS's creator) that helped shape the project into something significantly more useful.</p><p>Socket.IO has thus become the <code>EventEmitter</code> of the web. Today I want to talk about the work that has gone into 1.0 to round up this vision.</p><p>There's a lot to say about Socket.IO 1.0, so if you're short in time, feel free to jump to the parts that are most interesting to you:</p><ol><li><a href="#new-engine">New engine</a></li><li><a href="#binary-support">Binary support</a></li><li><a href="#automated-Testing">Automated testing</a></li><li><a href="#scalability">Scalability</a></li><li><a href="#integration">Integration</a></li><li><a href="#better-debugging">Better debugging</a></li><li><a href="#streamlined-apis">Streamlined APIs</a></li><li><a href="#cdn-delivery">CDN delivery</a></li><li><a href="#future-innovation">Future innovation</a></li><li><a href="#credits">Credits</a></li></ol><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-engine">New engine<a href="#new-engine" class="hash-link" aria-label="Direct link to New engine" title="Direct link to New engine">​</a></h2><p>The Socket.IO codebase no longer deals with transports and browser incompatibilities. That work has been relegated to a new module we've been perfecting for months called <a href="http://github.com/automattic/engine.io" target="_blank" rel="noopener noreferrer">Engine.IO</a> that implements a WebSocket-like API.</p><p>The benefits of this particular modularization can't be understated:</p><ul><li>For the Socket.IO end user, nothing changes. Just drop-in the new version!</li><li>A tremendous simplification in terms of codebase size and testing surface<ul><li>The Socket.IO Server is now only 1234 lines of code.</li><li>The Socket.IO Client is now only 976 lines of code.</li></ul></li><li>Future-proof flexibility<ul><li>If <code>WebSocket</code> is the only transport you want to support moving forward, Engine.IO (with all its browser hacks and workarounds) can be seamlessly removed.</li><li>Alternative transports such as vanilla Node.JS TCP Sockets or <a href="https://developer.chrome.com/apps/socket" target="_blank" rel="noopener noreferrer">Google Chrome Sockets</a> can be trivially implemented.</li></ul></li></ul><p>This separation has also allowed us to innovate and perfect the transport layer. One of my favorite improvements was introducing the idea of what I call <em>transport feature detection</em>.</p><p>Once upon a time in the web, it was extremely common to simply sniff User Agents to make decisions of what APIs to use or what behaviors to enable. As JavaScript codebases became more complex and mature, it became obvious that in order to <em>maximize reliability</em>, it made more sense to directly test the APIs to see if they would behave as expected.</p><p>For example, simply checking that the <em>JSON</em> global is present does not mean that <em>JSON.stringify</em> works, or even exists. It could have simply meant that the user defined a JSON global of their own, or the environment could have a broken JSON implementation.</p><p>Socket.IO never assumes that <code>WebSocket</code> will just work, because in practice there's a good chance that it won't. Instead, it establishes a connection with XHR or JSONP right away, and then attempts to <strong>upgrade</strong> the connection to WebSocket. Compared to the fallback method which relies on timeouts, this means that <em>none of your users will have a degraded experience</em>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="binary-support">Binary support<a href="#binary-support" class="hash-link" aria-label="Direct link to Binary support" title="Direct link to Binary support">​</a></h2><p>Users have been asking for the ability to send binary data for a while, especially after <code>WebSocket</code> added support for it.</p><p>The main issue was that if we had modeled our binary support after the <code>WebSocket</code> API, its usefulness would have been fairly limited. <code>WebSocket</code> requires that you put your Socket either into <!-- -->“<!-- -->string mode<!-- -->”<!-- --> or <!-- -->“<!-- -->binary mode<!-- -->”<!-- -->:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> socket </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">WebSocket</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'ws://localhost'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">binaryType</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'arraybuffer'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">send</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ArrayBuffer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This is good for a low-level API, which is why Engine.IO <a href="https://github.com/automattic/engine.io-client#sending-and-receiving-binary" target="_blank" rel="noopener noreferrer">now supports it</a>, but application developers most likely don't want to send <em>only blobs</em>, or encode everything as a blob manually prior to sending it out.</p><p>Socket.IO now supports emitting <code>Buffer</code> (from Node.JS), <code>Blob</code>, <code>ArrayBuffer</code> and even <code>File</code>, as part of any datastructure:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> fs </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'fs'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'connection'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  fs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">readFile</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'image.png'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">err</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> buf</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// it's possible to embed binary data</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// within arbitrarily-complex objects</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'image'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">image</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">buffer</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> buf </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>To test how useful it would be to support binary in this particular way (and as a virtualization geek), I decided to replicate the <a href="http://en.wikipedia.org/wiki/Twitch_Plays_Pok%C3%A9mon" target="_blank" rel="noopener noreferrer">Twitch Plays Pokemon</a> experiment 100% in JavaScript. Using a <a href="https://github.com/grantgalitz/GameBoy-Online" target="_blank" rel="noopener noreferrer">JavaScript gameboy emulator</a>, <a href="http://github.com/automattic/node-canvas" target="_blank" rel="noopener noreferrer">node-canvas</a>, socket.io we came up with a server-rendered collaborative game that even works on IE8. Check it out on <a href="https://weplay.io" target="_blank" rel="noopener noreferrer">https://weplay.io</a> (<a href="https://github.com/guille/weplay" target="_blank" rel="noopener noreferrer">source code here</a>).</p><video id="weplay-vid" data-setup="{&quot;autoplay&quot;:true,&quot;loop&quot;:true, &quot;techOrder&quot;: [&quot;html5&quot;, &quot;flash&quot;], &quot;height&quot;: 300}" class="video-js vjs-default-skin" autoplay="" loop="" width="100%" poster="https://i.cloudup.com/aNZqxnZzHv.png"><source src="https://i.cloudup.com/transcoded/KL-0r-E2Gj.mp4" type="video/mp4"></video><p>The relevant code that sends the image data is:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">canvas</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">toBuffer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">err</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> buf</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">throw</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'frame'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> buf</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The next experiment was to run an instance of <a href="http://wiki.qemu.org/Main_Page" target="_blank" rel="noopener noreferrer">QEMU</a> running an image of Windows XP, in honor of <a href="http://indianexpress.com/article/technology/technology-others/windows-xp-end-of-support-today/" target="_blank" rel="noopener noreferrer">its retirement</a>. Every player gets a 15 second turn to control the machine. Check out the demo on <a href="http://socket.computer." target="_blank" rel="noopener noreferrer">http://socket.computer.</a> Here's a video of your typical inception scenario:</p><video id="computer-vid" data-setup="{&quot;autoplay&quot;:true,&quot;loop&quot;:true, &quot;techOrder&quot;: [&quot;html5&quot;, &quot;flash&quot;], &quot;height&quot;: 300}" class="video-js vjs-default-skin" autoplay="" loop="" width="100%"><source src="https://i.cloudup.com/transcoded/Cuqn5OLmcl.mp4" type="video/mp4"></video><p>A key part of putting together this demo was connecting to the QEMU VNC server and implementing the RFB protocol. As it's usually the case with Node.JS, the solution was a <code>npm search rfb</code> away.</p><p>Essentially, in order to minimize latency and have the best performance, it's best to notify clients <em>only</em> of the pieces of the screen that changed. For example, if you move your mouse around, only little pieces of the screen that surround the cursor are broadcasted. The <a href="https://github.com/sidorares/node-rfb2" target="_blank" rel="noopener noreferrer">node-rfb2</a> module gives us a <code>rect</code> event with objects like the following:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">x</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">103</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">y</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">150</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">width</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">height</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">250</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">data</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">Buffer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>It then became clear to me that our support for binary data would be genuinely useful. All I had to do was call <code>io.emit</code> to pass that object around, and let Socket.IO do the rest.</p><p>Just for fun, I also installed and ran one of my favorite first person shooters:</p><video id="cs-vid" data-setup="{&quot;autoplay&quot;:true,&quot;loop&quot;:true, &quot;techOrder&quot;: [&quot;html5&quot;, &quot;flash&quot;], &quot;height&quot;: 300}" class="video-js vjs-default-skin" autoplay="" loop="" width="100%"><source src="https://i.cloudup.com/transcoded/Ra6PJnoLBq.mp4" type="video/mp4"></video><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="automated-testing">Automated Testing<a href="#automated-testing" class="hash-link" aria-label="Direct link to Automated Testing" title="Direct link to Automated Testing">​</a></h2><p>Every commit to the Socket.IO codebase now triggers a testing matrix totaling to 25 browsers, including Android and iOS.</p><p>We accomplish this by having <code>make test</code> seamlessly set up a reverse tunnel to ephemeral ports in your computer (thus making it accessible from the outside world), and have them execute on the Sauce Labs cloud, which is in charge of virtualizing and executing browsers on all the environments we care about.</p><img loading="lazy" src="https://i.cloudup.com/wuvWoEV3EH.png" alt="" class="img_ev3q"><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="scalability">Scalability<a href="#scalability" class="hash-link" aria-label="Direct link to Scalability" title="Direct link to Scalability">​</a></h2><p>We simplified the approach towards rooms and multi-node scalability dramatically. Instead of storing and/or replicating data across nodes, Socket.IO is now only concerned with passing events around.</p><p>If you want to scale out Socket.IO to multiple nodes, it now comes down to two simple steps:</p><ul><li>Turn on sticky load balancing (for example by origin IP address). This ensures that long-polling connections for example always route requests to the same node where buffers of messages could be stored.</li><li>Implement the <a href="https://github.com/automattic/socket.io-redis" target="_blank" rel="noopener noreferrer">socket.io-redis</a> adapter.</li></ul><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> redis </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io-redis'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">adapter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">redis</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">host</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'localhost'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">port</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6379</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>We have deprecated the <code>Socket#set</code> and <code>Socket#get</code> APIs. Packets now simply get encoded and distributed to other nodes whenever you broadcast, and we don't deal with storage.</p><p>This leads directly into our next goal: integration with other backends.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="integration">Integration<a href="#integration" class="hash-link" aria-label="Direct link to Integration" title="Direct link to Integration">​</a></h2><p>Chances are good that your existing application deployments are written in a variety of languages and frameworks, and are not just limited to Node.JS. Even if it was all Node.JS, you probably at some point want to separate concerns of your application into different processes.</p><p>One of the processes might be in charge of hosting the Socket.IO server, accepting connections, performing authentication, etc, and then another part of your backend might end up in charge of <em>producing</em> messages.</p><p>To that end we're introducing the <a href="https://github.com/automattic/socket.io-emitter" target="_blank" rel="noopener noreferrer">socket.io-emitter</a> project which hooks into <a href="https://github.com/automattic/socket.io-redis" target="_blank" rel="noopener noreferrer">socket.io-redis</a> to easily allow you to emit events to browsers from anywhere:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io-emitter'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">setInterval</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'time'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Date</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Tony Kovanen already created a <a href="https://github.com/rase-/socket.io-php-emitter" target="_blank" rel="noopener noreferrer">PHP implementation</a>:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">?</span><span class="token plain">php</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$emitter </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">SocketIOEmitter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">array</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'port'</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'6379'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'host'</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'127.0.0.1'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$emitter</span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token function" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'event'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'wow'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">?</span><span class="token operator" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This makes it really easy to turn any existing application into a realtime application!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="better-debugging">Better debugging<a href="#better-debugging" class="hash-link" aria-label="Direct link to Better debugging" title="Direct link to Better debugging">​</a></h2><p>Socket.IO is now completely instrumented by a minimalistic yet tremendously powerful utility called <a href="https://github.com/visionmedia/debug" target="_blank" rel="noopener noreferrer">debug</a> by TJ Holowaychuk.</p><p>In the past, the Socket.IO server would default to logging everything out to the console. This turned out to be annoyingly verbose for many users (although extremely useful for others), and violates the Rule of Silence of the <a href="http://en.wikipedia.org/wiki/Unix_philosophy#Eric_Raymond.E2.80.99s_17_Unix_Rules" target="_blank" rel="noopener noreferrer">Unix Philosophy</a>:</p><blockquote>**Rule of Silence**<br>Developers should design programs so that they do not print unnecessary output. This rule aims to allow other programs and developers to pick out the information they need from a program's output without having to parse  verbosity.</blockquote>The basic idea is that each module used by Socket.IO provides different debugging scopes that give you insight into the internals. By default, all output is suppressed, and you can opt into seeing messages by supplying the `DEBUG` env variable (Node.JS) or the `localStorage.debug` property (Browsers).<p>You can see it in action for example on our homepage:</p><video id="debugging-vid" data-setup="{&quot;autoplay&quot;:true,&quot;loop&quot;:true, &quot;techOrder&quot;: [&quot;html5&quot;, &quot;flash&quot;], &quot;height&quot;: 300}" class="video-js vjs-default-skin" autoplay="" loop="" width="100%"><source src="https://i.cloudup.com/transcoded/IL9alTr0eO.mp4" type="video/mp4"></video><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="streamlined-apis">Streamlined APIs<a href="#streamlined-apis" class="hash-link" aria-label="Direct link to Streamlined APIs" title="Direct link to Streamlined APIs">​</a></h2><p>The <code>socket.io</code> module now exports the attachment function directly (previously <code>.listen</code>).<br>
It's even easier now to attach socket.io to a HTTP server:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> srv </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'http'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">Server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">srv</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>or to make it listen on some port:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">8080</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Before, to refer to everyone connected you had to use <code>io.sockets</code>. Now you can call directly on <code>io</code>:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'connection'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'hi'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'hi everyone'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="cdn-delivery">CDN delivery<a href="#cdn-delivery" class="hash-link" aria-label="Direct link to CDN delivery" title="Direct link to CDN delivery">​</a></h2><p>One of the best decisions we made early on was that implementing a Socket.IO server would not only give you access to the realtime protocol, but Socket.IO itself would also serve the client.</p><p>Normally, all you have to do is to include a snippet like this:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">script src</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"/socket.io/socket.io.js"</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">script</span><span class="token operator" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>If you want to optimize access to the client by serving it near your users, provide the maximum level of gzip compression (thanks to Google's <a href="https://code.google.com/p/zopfli/" target="_blank" rel="noopener noreferrer">zopfli</a> and proper support for caching, you can now use our CDN. It's free, forever, and has built-in SSL support:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">script src</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"https://cdn.socket.io/socket.io-1.0.0.js"</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">script</span><span class="token operator" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="future-innovation">Future innovation<a href="#future-innovation" class="hash-link" aria-label="Direct link to Future innovation" title="Direct link to Future innovation">​</a></h2><p>The core Socket.IO projects will continue to improve with lots of more frequent releases, with the sole goal of improving reliability, speed and making the codebase smaller and easier to maintain. Socket.IO 2.0 will probably see us ditching support for some older browsers, and not bundling some modules like the JSON serializer.</p><p>Most of the innovation in the Socket.IO world will happen outside of the core codebases. The most important projects that I'll be closely watching are the following:</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="socketio-stream">socket.io-stream<a href="#socketio-stream" class="hash-link" aria-label="Direct link to socket.io-stream" title="Direct link to socket.io-stream">​</a></h3><p>By adding this plugin, you'll be able to send <code>Stream</code> objects so that you can write memory-efficient programs. In the first example we loaded a file into memory prior to emitting it, but the following should be possible:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> fs </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'fs'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> io </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'socket.io-stream'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'connection'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">emit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createReadStream</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'file.jpg'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>And on the client side you'll receive a <code>Stream</code> object that emits <code>data</code> events.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="tooling">Tooling<a href="#tooling" class="hash-link" aria-label="Direct link to Tooling" title="Direct link to Tooling">​</a></h3><p>When you use Socket.IO you don't care about transports, packets, frames, TCP or WebSocket. You care about what events are sent back and forth.</p><a href="https://cloudup.com/cBxkAW3sqpH" target="_blank" rel="noopener noreferrer"><img loading="lazy" src="https://i.cloudup.com/_Jsiiabyfr.png" alt="" class="img_ev3q"></a><p>Our goal is to have plugins for Web Inspector, Firefox Developer Tools that allow you to easily introspect what events are being sent, when, and what their parameters are.</p><p>This project is being led by the talented Nick LaGrow (<a href="https://github.com/nlagrow" target="_blank" rel="noopener noreferrer">Github</a>), Samaan Ghani (<a href="https://github.com/samaanghani" target="_blank" rel="noopener noreferrer">Github</a>) and David Cummings (<a href="https://twitter.com/dece" target="_blank" rel="noopener noreferrer">Twitter</a>).</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-languages-and-frameworks">New languages and frameworks<a href="#new-languages-and-frameworks" class="hash-link" aria-label="Direct link to New languages and frameworks" title="Direct link to New languages and frameworks">​</a></h3><p>A lot of effort has gone into specing and documenting the <a href="https://github.com/automattic/engine.io-protocol" target="_blank" rel="noopener noreferrer">Engine.IO protocol</a> and <a href="https://github.com/automattic/socket.io-protocol" target="_blank" rel="noopener noreferrer">Socket.IO protocol</a>.</p><p>The main goal behind this is that the Node.JS servers and clients become the reference implementations for many other languages and frameworks. Interoperability within the larger ecosystem is one of our biggest goals for 2014 and beyond.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="credits">Credits<a href="#credits" class="hash-link" aria-label="Direct link to Credits" title="Direct link to Credits">​</a></h2><p>This release has been a big team effort. Special thanks go out to our new core team:</p><ul><li><p>Tony Kovanen (<a href="http://github.com/rase-" target="_blank" rel="noopener noreferrer">Github</a> / <a href="http://twitter.com/TonyKovanen" target="_blank" rel="noopener noreferrer">Twitter</a>) for his amazing work on Engine.IO binary support and research into a variety of workarounds to support all versions of iOS and Internet Explorer, his help in putting together this website and rounding up the docs.</p></li><li><p>Kevin Roark (<a href="http://github.com/kevin-roark" target="_blank" rel="noopener noreferrer">Github</a>) for the entire development of the new Socket.IO parser on top of Engine, the Socket.IO Computer demo, and help with docs, issues and pull requests.</p></li><li><p>Roman Shtylman (<a href="http://github.com/defunctzombie" target="_blank" rel="noopener noreferrer">Github</a> / <a href="http://twitter.com/defunctzombie" target="_blank" rel="noopener noreferrer">Twitter</a>) for his work on zuul and localtunnel, crucial to our testing architecture and our mission of reliability.</p></li></ul><p>And in no particular order:</p><ul><li><p>Jay Borenstein (<a href="http://www.linkedin.com/in/jayborenstein" target="_blank" rel="noopener noreferrer">LinkedIn</a>) for selecting Socket.IO as one of the projects to mentor students on Open Source engineering as part of the <a href="https://www.facebook.com/notes/facebook-engineering/facebook-open-academy-bringing-open-source-to-cs-curricula/10151806121378920" target="_blank" rel="noopener noreferrer">Open Academy</a> project.</p></li><li><p>Michael Srb (<a href="https://github.com/xixixao" target="_blank" rel="noopener noreferrer">Github</a>), Mark Mokryn (<a href="https://github.com/mokesmokes" target="_blank" rel="noopener noreferrer">Github</a>), Eugen Dueck (<a href="http://github.com/eugendueck" target="_blank" rel="noopener noreferrer">Github</a>), Afshin Mehrabani (<a href="http://github.com/afshinm" target="_blank" rel="noopener noreferrer">Github</a>), Christoph Dorn (<a href="https://github.com/cadorn" target="_blank" rel="noopener noreferrer">Github</a>) and Mikito Takada (<a href="http://github.com/mixu" target="_blank" rel="noopener noreferrer">Github</a>) for several key Engine.IO patches.</p></li><li><p>Grant Timmerman (<a href="http://github.com/grant" target="_blank" rel="noopener noreferrer">Github</a> / <a href="https://twitter.com/granttimmerman" target="_blank" rel="noopener noreferrer">Twitter</a>) for his outstanding work on the new Socket.IO <a href="http://new.socket.io/demos/chat/" target="_blank" rel="noopener noreferrer">example chat application</a>, and multiple patches and issues investigation.</p></li><li><p>Jxck (<a href="http://github.com/jxck" target="_blank" rel="noopener noreferrer">Github</a> / <a href="https://twitter.com/Jxck_" target="_blank" rel="noopener noreferrer">Twitter</a>) for his work on translation, documentations and patches. ありがとう</p></li><li><p>Arnout Kazemier (<a href="http://github.com/3rdEden" target="_blank" rel="noopener noreferrer">Github</a> / <a href="https://twitter.com/3rdEden" target="_blank" rel="noopener noreferrer">Twitter</a>) for his multiple contributions to Engine.IO and Socket.IO</p></li><li><p>Sauce Labs (<a href="https://github.com/saucelabs" target="_blank" rel="noopener noreferrer">Github</a> / <a href="https://twitter.com/saucelabs" target="_blank" rel="noopener noreferrer">Twitter</a>) for supporting open source projects with free testing infrastructure.</p></li><li><p>Shihui Song (<a href="https://github.com/sweetiesong" target="_blank" rel="noopener noreferrer">Github</a>), Qiming Fang (<a href="https://github.com/qimingfang" target="_blank" rel="noopener noreferrer">Github</a>) and Erluo Li for their work on testing infrastructure.</p></li><li><p>Julian Salazar (<a href="https://github.com/j-salazar" target="_blank" rel="noopener noreferrer">Github</a>) and Tianyiu Liu (<a href="https://github.com/poohlty" target="_blank" rel="noopener noreferrer">Github</a>) for their work on reconnection and ongoing research into resource sharing between browser tabs and messages synchronization.</p></li><li><p>Gal Koren (<a href="https://github.com/get" target="_blank" rel="noopener noreferrer">Github</a>) for his fantastic work into modularization of the codebases.</p></li><li><p>Matt Walker (<a href="https://twitter.com/mcfwalker" target="_blank" rel="noopener noreferrer">Twitter</a>) for the beautiful Socket.IO logo.</p></li></ul><p>Finally, I'm very grateful to my company <a href="http://automattic.com/" target="_blank" rel="noopener noreferrer">Automattic</a> for being a great home to Open Source innovation.</p>]]></content>
        <author>
            <name>Guillermo Rauch</name>
            <uri>https://twitter.com/rauchg</uri>
        </author>
    </entry>
</feed>