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
The following example assumes you already know the related Cloudflare products and wrangler CLI.
npm install --save socket.io-serverless
npm install --save-dev socket.io # this provides type declarations of socket.io
A typical worker app built with this library will have the following exports:
- a EngineActorDurable Object class, to run engine.io code
- a SocketActorDurable Object class, to run socket.io code
- a entrypoint default export, to handle HTTP request
demo-server/ provides a minimal implementation.
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.
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 setIntervaltimer.
- 
Parent namespaces need to be defined in onServerCreatedcallback- 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.
BSD