Socket.io v3.0.0 Release Notes

Release Date: 2020-11-05 // over 3 years ago
  • ๐Ÿš€ More details about this release in the blog post: https://socket.io/blog/socket-io-3-release/

    ๐Ÿ“„ Dedicated migration guide: https://socket.io/docs/migrating-from-2-x-to-3-0/

    ๐Ÿ› Bug Fixes

    • close clients with no namespace (91cd255)

    ๐Ÿ”‹ Features

    • emit an Error object upon middleware error (54bf4a4)
    • serve msgpack bundle (aa7574f)
    • โž• add support for catch-all listeners (5c73733)
    • ๐Ÿ”€ make Socket#join() and Socket#leave() synchronous (129c641)
    • โœ‚ remove prod dependency to socket.io-client (7603da7)
    • ๐Ÿšš move binary detection back to the parser (669592d)
    • โž• add ES6 module export (8b6b100)
    • do not reuse the Engine.IO id (2875d2c)
    • โœ‚ remove Server#set() method (029f478)
    • โœ‚ remove Socket#rooms object (1507b41)
    • โœ‚ remove the 'origins' option (a8c0600)
    • โœ‚ remove the implicit connection to the default namespace (3289f7e)
    • throw upon reserved event names (4bd5b23)

    ๐Ÿ’ฅ BREAKING CHANGES

    ๐Ÿ‘€ the Socket#use() method is removed (see 5c73733)

    Socket#join() and Socket#leave() do not accept a callback argument anymore.

    Before:

    socket.join("room1", () =\> {io.to("room1").emit("hello");});
    

    After:

    socket.join("room1");io.to("room1").emit("hello");// or await socket.join("room1"); for custom adapters
    
    • the "connected" map is renamed to "sockets"
    • ๐Ÿšš the Socket#binary() method is removed, as this use case is now covered by the ability to provide your own parser.
    • ๐Ÿšš the 'origins' option is removed

    Before:

    new Server(3000, {origins: ["https://example.com"]});
    

    The 'origins' option was used in the allowRequest method, in order to
    determine whether the request should pass or not. And the Engine.IO
    server would implicitly add the necessary Access-Control-Allow-xxx
    headers.

    After:

    new Server(3000, {cors: {origin: "https://example.com",methods: ["GET", "POST"],allowedHeaders: ["content-type"]}});
    

    The already existing 'allowRequest' option can be used for validation:

    new Server(3000, {allowRequest: (req, callback) =\> {callback(null, req.headers.referer.startsWith("https://example.com"));}});
    

    Socket#rooms is now a Set instead of an object

    Namespace#connected is now a Map instead of an object

    0๏ธโƒฃ there is no more implicit connection to the default namespace:

    // client-sideconst socket = io("/admin");// server-sideio.on("connect", socket =\> {// not triggered anymore})io.use((socket, next) =\> {// not triggered anymore});io.of("/admin").use((socket, next) =\> {// triggered});
    
    • ๐Ÿšš the Server#set() method was removed

    This method was kept for backward-compatibility with pre-1.0 versions.

    ๐Ÿ”— Links:

    • Milestone: 3.0.0
    • Diff: 2.3.0...3.0.0
    • ๐Ÿš€ Client release: 3.0.0
    • engine.io version: ~4.0.0
    • ws version: ^7.1.2