PageSourceSearch

https://socket.io/assets/js/b9042042.2efe2cdf.js

js socket.io collected 2026-09-24 07:26:07 UTC 25,566 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunksample_website=self.webpackChunksample_website||[]).push([[5965],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},l=Object.keys(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=p(a),c=r,k=d["".concat(s,".").concat(c)]||d[c]||m[c]||l;return a?n.createElement(k,i(i({ref:t},u),{},{components:a})):n.createElement(k,i({ref:t},u))}));function k(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=c;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[d]="string"==typeof e?e:r,i[1]=o;for(var p=2;p<l;p++)i[p]=a[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),r=a(4334);const l={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,r.Z)(l.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>y});var n=a(3117),r=a(7294),l=a(4334),i=a(2466),o=a(6550),s=a(1980),p=a(7392),u=a(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:r}}=e;return{value:t,label:a,attributes:n,default:r}}))}function m(e){const{values:t,children:a}=e;return(0,r.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,a])}function c(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function k(e){let{queryString:t=!1,groupId:a}=e;const n=(0,o.k6)(),l=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(n.location.search);t.set(l,e),n.replace({...n.location,search:t.toString()})}),[l,n])]}function b(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,l=m(e),[i,o]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!c({value:t,tabValues:a}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:l}))),[s,p]=k({queryString:a,groupId:n}),[d,b]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,l]=(0,u.Nk)(a);return[n,(0,r.useCallback)((e=>{a&&l.set(e)}),[a,l])]}({groupId:n}),g=(()=>{const e=s??d;return c({value:e,tabValues:l})?e:null})();(0,r.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!c({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),p(e),b(e)}),[p,b,l]),tabValues:l}}var g=a(2389);const h={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:o,selectValue:s,tabValues:p}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,i.o5)(),m=e=>{const t=e.currentTarget,a=u.indexOf(t),n=p[a].value;n!==o&&(d(t),s(n))},c=e=>{let t=null;switch(e.key){case"Enter":m(e);break;case"ArrowRight":{const a=u.indexOf(e.currentTarget)+1;t=u[a]??u[0];break}case"ArrowLeft":{const a=u.indexOf(e.currentTarget)-1;t=u[a]??u[u.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return r.createElement("li",(0,n.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>u.push(e),onKeyDown:c,onClick:m},i,{className:(0,l.Z)("tabs__item",h.tabItem,i?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;
1const l=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===n));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function f(e){const t=b(e);return r.createElement("div",{className:(0,l.Z)("tabs-container",h.tabList)},r.createElement(N,(0,n.Z)({},e,t)),r.createElement(v,(0,n.Z)({},e,t)))}function y(e){const t=(0,g.Z)();return r.createElement(f,(0,n.Z)({key:String(t)},e))}},1096:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>k,frontMatter:()=>o,metadata:()=>p,toc:()=>d});var n=a(3117),r=(a(7294),a(3905)),l=a(4866),i=a(5162);const o={title:"Server Installation",sidebar_label:"Installation",sidebar_position:1,slug:"/server-installation/"},s=void 0,p={unversionedId:"categories/Server/server-installation",id:"categories/Server/server-installation",title:"Server Installation",description:"The latest release is currently 4.8.3, released in December 2025.",source:"@site/docs/categories/02-Server/server-installation.md",sourceDirName:"categories/02-Server",slug:"/server-installation/",permalink:"/docs/v4/server-installation/",draft:!1,editUrl:"https://github.com/socketio/socket.io-website/edit/main/docs/categories/02-Server/server-installation.md",tags:[],version:"current",lastUpdatedAt:1784117104,formattedLastUpdatedAt:"Jul 15, 2026",sidebarPosition:1,frontMatter:{title:"Server Installation",sidebar_label:"Installation",sidebar_position:1,slug:"/server-installation/"},sidebar:"sidebar",previous:{title:"Memory usage",permalink:"/docs/v4/memory-usage/"},next:{title:"Initialization",permalink:"/docs/v4/server-initialization/"}},u={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installation",id:"installation",level:2},{value:"Additional packages",id:"additional-packages",level:2},{value:"Other WebSocket server implementations",id:"other-websocket-server-implementations",level:2},{value:"Usage with <code>\xb5WebSockets.js</code>",id:"usage-with-uwebsockets",level:2},{value:"Usage with Bun",id:"usage-with-bun",level:2},{value:"Installation",id:"installation-1",level:3},{value:"Usage",id:"usage",level:3},{value:"Miscellaneous",id:"miscellaneous",level:2},{value:"Dependency tree",id:"dependency-tree",level:3},{value:"Transitive versions",id:"transitive-versions",level:3}],m={toc:d},c="wrapper";function k(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The latest release is currently ",(0,r.kt)("inlineCode",{parentName:"p"},"4.8.3"),", released in December 2025."),(0,r.kt)("p",{parentName:"admonition"},"You can find the release notes ",(0,r.kt)("a",{parentName:"p",href:"/docs/v4/changelog/4.8.3"},"here"),".")),(0,r.kt)("h2",{id:"prerequisites"},"Prerequisites"),(0,r.kt)("p",null,"Please make sure that ",(0,r.kt)("a",{parentName:"p",href:"https://nodejs.org/en/"},"Node.js")," is installed on your system. The current Long Term Support (LTS) release is an ideal starting point, see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/nodejs/Release#release-schedule"},"here"),"."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"At least Node.js 10 is needed, older versions are not supported anymore.")),(0,r.kt)("h2",{id:"installation"},"Installation"),(0,r.kt)("p",null,"To install the latest release:"),(0,r.kt)(l.Z,{groupId:"pm",mdxType:"Tabs"},(0,r.kt)(i.Z,{value:"npm",label:"NPM",default:!0,mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"npm install socket.io\n"))),(0,r.kt)(i.Z,{value:"yarn",label:"Yarn",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"yarn add socket.io\n"))),(0,r.kt)(i.Z,{value:"pnpm",label:"pnpm",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"pnpm add socket.io\n"))),(0,r.kt)(i.Z,{value:"bun",label:"Bun",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"bun add socket.io\n")))),(0,r.kt)("p",null,"To install a specific version:"),(0,r.kt)(l.Z,{groupId:"pm",mdxType:"Tabs"},(0,r.kt)(i.Z,{value:"npm",label:"NPM",default:!0,mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"npm install socket.io@version\n"))),(0,r.kt)(i.Z,{value:"yarn",label:"Yarn",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"yarn add socket.io@version\n"))),(0,r.kt)(i.Z,{value:"pnpm",label:"pnpm",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"pnpm add socket.io@version\n"))),(0,r.kt)(i.Z,{value:"bun",label:"Bun",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"bun add socket.io@version\n")))),(0,r.kt)("h2",{id:"additional-packages"},"Additional packages"),(0,r.kt)("p",null,"By default, Socket.IO use the WebSocket server provided by the ",(0,r.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/ws"},"ws")," package."),(0,r.kt)("p",null,"There are 2 optional packages that can be installed alongside this package. These packages are binary add-ons which improve certain operations. Prebuilt binaries are available for the most popular platforms so you don't necessarily need to have a C++ compiler installed on your machine."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.npmjs.com/package/bufferutil"}
1,"bufferutil"),": Allows to efficiently perform operations such as masking and unmasking the data payload of the WebSocket frames."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.npmjs.com/package/utf-8-validate"},"utf-8-validate"),": Allows to efficiently check if a message contains valid UTF-8 as required by the spec.")),(0,r.kt)("p",null,"To install those packages:"),(0,r.kt)(l.Z,{groupId:"pm",mdxType:"Tabs"},(0,r.kt)(i.Z,{value:"npm",label:"NPM",default:!0,mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"npm install --save-optional bufferutil utf-8-validate\n"))),(0,r.kt)(i.Z,{value:"yarn",label:"Yarn",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"yarn add --optional bufferutil utf-8-validate\n"))),(0,r.kt)(i.Z,{value:"pnpm",label:"pnpm",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"pnpm add -O bufferutil utf-8-validate\n"))),(0,r.kt)(i.Z,{value:"bun",label:"Bun",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"bun add --optional bufferutil utf-8-validate\n")))),(0,r.kt)("p",null,"Please note that these packages are optional, the WebSocket server will fallback to the Javascript implementation if they are not available. More information can be found ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/websockets/ws/#opt-in-for-performance-and-spec-compliance"},"here"),"."),(0,r.kt)("h2",{id:"other-websocket-server-implementations"},"Other WebSocket server implementations"),(0,r.kt)("p",null,"Any Websocket server implementation which exposes the same API as ws (notably the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/websockets/ws/blob/master/doc/ws.md#serverhandleupgraderequest-socket-head-callback"},"handleUpgrade")," method) can be used."),(0,r.kt)("p",null,"For example, you can use the ",(0,r.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/eiows"},"eiows")," package, which is a fork of the (now deprecated) ",(0,r.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/uws"},"uws")," package:"),(0,r.kt)(l.Z,{groupId:"pm",mdxType:"Tabs"},(0,r.kt)(i.Z,{value:"npm",label:"NPM",default:!0,mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"npm install eiows\n"))),(0,r.kt)(i.Z,{value:"yarn",label:"Yarn",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"yarn add eiows\n"))),(0,r.kt)(i.Z,{value:"pnpm",label:"pnpm",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"pnpm add eiows\n"))),(0,r.kt)(i.Z,{value:"bun",label:"Bun",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"bun add eiows\n")))),(0,r.kt)("p",null,"And then use the ",(0,r.kt)("inlineCode",{parentName:"p"},"wsEngine")," option:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const { Server } = require("socket.io");\nconst eiows = require("eiows");\n\nconst io = new Server(3000, {\n  wsEngine: eiows.Server\n});\n')),(0,r.kt)("p",null,'This implementation "allows, but doesn\'t guarantee" significant performance and memory-usage improvements over the default implementation. As usual, please benchmark it against your own usage.'),(0,r.kt)("h2",{id:"usage-with-uwebsockets"},"Usage with ",(0,r.kt)("inlineCode",{parentName:"h2"},"\xb5WebSockets.js")),(0,r.kt)("p",null,"Starting with version ",(0,r.kt)("a",{parentName:"p",href:"/blog/socket-io-4-4-0/"},"4.4.0"),", a Socket.IO server can now bind to a ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/uNetworking/uWebSockets.js"},(0,r.kt)("inlineCode",{parentName:"a"},"\xb5WebSockets.js"))," server."),(0,r.kt)("p",null,"Installation:"),(0,r.kt)(l.Z,{groupId:"pm",mdxType:"Tabs"},(0,r.kt)(i.Z,{value:"npm",label:"NPM",default:!0,mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"npm install uWebSockets.js@uNetworking/uWebSockets.js#v20.52.0\n"))),(0,r.kt)(i.Z,{value:"yarn",label:"Yarn",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"yarn add uWebSockets.js@uNetworking/uWebSockets.js#v20.52.0\n"))),(0,r.kt)(i.Z,{value:"pnpm",label:"pnpm",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"pnpm add uWebSockets.js@uNetworking/uWebSockets.js#v20.52.0\n"))),(0,r.kt)(i.Z,{value:"bun",label:"Bun",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"bun add uWebSockets.js@uNetworking/uWebSockets.js#v20.52.0\n")))),(0,r.kt)("p",null,"Usage:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'const { App } = require("uWebSockets.js");\nconst { Server } = require("socket.io");\n\nconst app = App();\nconst io = new Server();\n\nio.attachApp(app);\n\nio.on("connection", (socket) => {\n  // ...\n});\n\napp.listen(3000, (token) => {\n  if (!token) {\n    console.warn("port already in use");\n  }\n});\n')),(0,r.kt)("h2",{id:"usage-with-bun"},"Usage with Bun"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"@socket.io/bun-engine")," package provides a Bun-specific low-level engine, intended to leverage the speed and scalability of Bun."),(0,r.kt)("h3",{id:"installation-1"},"Installation"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"bun add socket.io @socket.io/bun-engine\n")),(0,r.kt)("h3",{id:"usage"},"Usage"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js"},'import { Server as Engine } from "@socket.io/bun-engine";\nimport { Server } from "socket.io";\n\nconst io = new Server();\n\nconst engine = new Engine({\n  path: "/socket.io/",\n});\n\nio.bind(engine);\n\nio.on("connection", (socket) => {\n  // ...\n});\n\nexport default {\n  port: 3000,\n  idleTimeout: 30, // must be greater than the "pingInterval" option of the engine, which defaults to 25 seconds\n\n  ...engine.handler(),\n};\n')),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Any existing adapter can be used without any modification.")),(0,r.kt)("h2",{id:"miscellaneous"},"Miscellaneous"),(0,r.kt)("h3",{id:"dependency-tree"},"Dependency tree"),(0,r.kt)("p",null,"A basic installation of the server includes ",(0,r.kt)("strong",{parentName:"p"},"21")," packages, of which ",(0,r.kt)("strong",{parentName:"p"},"6")," are maintained by our team:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"\u2514\u2500\u252c [email protected]\n  \u251c\u2500\u252c [email protected]\n  \u2502 \u251c\u2500\u252c [email protected]\n  \u2502 \u2502 \u2514\u2500\u2500 [email protected]\n  \u2502 \u2514\u2500\u2500 [email protected]\n  \u251c\u2500\u2500 [email protected]\n  \u251c\u2500\u252c [email protected]\n  \u2502 \u251c\u2500\u2500 [email protected]\n  \u2502 \u2514\u2500\u2500 [email protected]\n  \u251c\u2500\u252c [email protected]\n  \u2502 \u2514\u2500\u2500 [email protected]\n  \u251c\u2500\u252c [email protected]\n  \u2502 \u251c\u2500\u252c @types/[email protected]\n  \u2502 \u2502 \u2514\u2500\u2500 @types/[email protected] deduped\n  \u2502 \u251c\u2500\u252c @types/[email protected]\n  \u2502 \u2502 \u2514\u2500\u2500 [email protected]\n  \u2502 \u251c\u2500\u2500 [email protected] deduped\n  \u2502 \u251c\u2500\u2500 [email protected] deduped\n  \u2502 \u251c\u2500\u2500 [email protected]\n  \u2502 \u251c\u2500\u2500 [email protected] deduped\n  \u2502 \u251c\u2500\u2500 [email protected] deduped\n  \u2502 \u251c\u2500\u2500 [email protected]\n  \u2502 \u2514\u2500\u252c [email protected]\n  \u2502   \u251c\u2500\u2500 UNMET OPTIONAL DEPENDENCY bufferutil@^4.0.1\n  \u2502   \u2514\u2500\u2500 UNMET OPTIONAL DEPENDENCY utf-8-validate@>
1=5.0.2\n  \u251c\u2500\u252c [email protected]\n  \u2502 \u251c\u2500\u2500 [email protected] deduped\n  \u2502 \u2514\u2500\u2500 [email protected] deduped\n  \u2514\u2500\u252c [email protected]\n    \u251c\u2500\u2500 @socket.io/[email protected]\n    \u2514\u2500\u2500 [email protected] deduped\n")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The type declarations for 3rd party packages are included, in order to ease the use of the library for TypeScript users (but at the cost of a slightly-larger package). "),(0,r.kt)("p",{parentName:"admonition"},"See also: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/microsoft/types-publisher/issues/81#issuecomment-234051345"},"https://github.com/microsoft/types-publisher/issues/81#issuecomment-234051345"))),(0,r.kt)("h3",{id:"transitive-versions"},"Transitive versions"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"engine.io")," package brings the engine that is responsible for managing the low-level connections (HTTP long-polling or WebSocket).  See also: ",(0,r.kt)("a",{parentName:"p",href:"/docs/v4/how-it-works/"},"How it works")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"th"},"socket.io")," version"),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"th"},"engine.io")," version"),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"th"},"ws")," version"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"4.8.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"6.6.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"8.17.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"4.7.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"6.5.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"8.17.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"4.6.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"6.4.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"8.11.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"4.5.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"6.2.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"8.2.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"4.4.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"6.1.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"8.2.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"4.3.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"6.0.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"8.2.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"4.2.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"5.2.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"7.4.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"4.1.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"5.1.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"7.4.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"4.0.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"5.0.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"7.4.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"3.1.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"4.1.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"7.4.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"3.0.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"4.0.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"7.4.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"2.5.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"3.6.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"7.5.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"2.4.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"3.5.x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"7.4.x"))))))}k.isMDXComponent=!0}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.