Skip to content

jokester/socket.io-serverless

Folders and files

NameName
Last commit message
Last commit date
Dec 20, 2024
Oct 19, 2024
Dec 14, 2024
Dec 20, 2024
Oct 12, 2024
Oct 12, 2024
Dec 14, 2024
Dec 20, 2024
May 19, 2024
May 19, 2024
Dec 20, 2024
Sep 21, 2024
Dec 1, 2024
Dec 20, 2024
Oct 12, 2024
Dec 14, 2024
Oct 6, 2024

Repository files navigation

socket.io-serverless

A custom socket.io build for serverless environments. Currently Cloudflare Worker + Durable Objects.

Demo client app: sio-serverless-demo-client running demo-client/ demo-server/ code in source code repo

Getting started

The following example assumes you already know the related Cloudflare products and wrangler CLI.

1. Install the package

npm install --save socket.io-serverless
npm install --save-dev socket.io # this provides type declarations of socket.io

2. Create Durable Object classes and worker entrypoint

A typical worker app built with this library will have the following exports:

  1. a EngineActor Durable Object class, to run engine.io code
  2. a SocketActor Durable Object class, to run socket.io code
  3. a entrypoint default export, to handle HTTP request

demo-server/ provides a minimal implementation.

3. Run

Write a wrangler.toml, and run wrangler dev or wrangler deploy.

Again demo-server/ contains a wrangler.toml you can start with.

demo-client/ contains a frontend socket.io client app using demo-server to send event across browsers.

Features

This lib heavily rewires things to run in and take advantage of Durable Objects.

  • Simpler socket.io server applications should be compatible.

  • Support Hibernation to save costs.

    • Across Durable Object lifecycles, internal states are persisted with storage API. Read on to find the details.
  • Drive server-inititiated periodic ping by Alarm rather than setInterval timer.

Limitations

  • Parent namespaces need to be defined in onServerCreated callback

    • defining parent namespace with a function is not supported
  • Only a certain subset of socket.io server internal state get restored after hibernation

    • Your application logic need to be consistent with this
    • concrete namespaces, connected client ids, and namespaces they joined (but not the rooms)
  • Only WebSocket transport is supported

  • Only engine.io protocol v4 (where a server starts ping-pong checks) is supported

  • message acknowledgement is not supported.

  • socket.io connection state recovery is not supported

    • Each underlying WebSocket connection will occur as independent to engine.io and socket.io
  • socket.io server middleware and namespace middleware is not tested

  • Load splitting like cluster-adapter is not supported. Currently this library uses a single DO to run engine.io code, and another to run socket.io code.

License

BSD