Adapter to enable broadcasting of events to multiple separate socket.io server nodes.
MIT License
Bot releases are hidden (Show)
Published by darrachequesne over 1 year ago
Diff: https://github.com/socketio/socket.io-redis-adapter/compare/8.2.0...8.2.1
Published by darrachequesne over 1 year ago
Sharded Pub/Sub was introduced in Redis 7.0 in order to help scaling the usage of Pub/Sub in cluster mode.
Reference: https://redis.io/docs/manual/pubsub/#sharded-pubsub
A dedicated adapter can be created with the createShardedAdapter()
method:
import { Server } from 'socket.io';
import { createClient } from 'redis';
import { createShardedAdapter } from '@socket.io/redis-adapter';
const pubClient = createClient({ host: 'localhost', port: 6379 });
const subClient = pubClient.duplicate();
await Promise.all([
pubClient.connect(),
subClient.connect()
]);
const io = new Server({
adapter: createShardedAdapter(pubClient, subClient)
});
io.listen(3000);
Minimum requirements:
[email protected]
Added in e70b1bd.
The redis
package now supports Redis cluster.
Added in 77ef42c.
The subscriptionMode
option allows to configure how many Redis Pub/Sub channels are used:
Useful when used with dynamic namespaces.
The default value, useful when some rooms have a low number of clients (so only a few Socket.IO servers are notified).
const io = new Server({
adapter: createShardedAdapter(pubClient, subClient, {
subscriptionMode: "static"
})
});
Added in d3388bf.
Huge thanks to @winchell for helping!
Diff: https://github.com/socketio/socket.io-redis-adapter/compare/8.1.0...8.2.0
Published by darrachequesne over 1 year ago
The socket.io-adapter
package was added to the list of peerDependencies
, in order to fix sync issues with the version imported by the socket.io
package (see f07ff7b).
The close()
method was implemented, in order to be used with the new cleanupEmptyChildNamespaces
option.
Reference: https://github.com/socketio/socket.io/releases/tag/4.6.0
Added in fe89f7e.
Diff: https://github.com/socketio/socket.io-redis-adapter/compare/8.0.1...8.1.0
Published by darrachequesne almost 2 years ago
This release pins the socket.io-adapter
package to version ~2.4.0
instead of ^2.4.0
.
Diff: https://github.com/socketio/socket.io-redis-adapter/compare/8.0.0...8.0.1
Published by darrachequesne almost 2 years ago
Example with msgpackr:
import { unpack, pack } from "msgpackr";
io.adapter(createAdapter(pubClient, subClient, {
parser: {
encode(val) {
return pack(val);
},
decode(val) {
return unpack(val);
}
}
}));
Related: https://github.com/socketio/socket.io/commit/b25495c069031674da08e19aed68922c7c7a0e28
Reference: https://github.com/msgpack/msgpack/blob/master/spec.md#timestamp-extension-type
Previous versions of the adapter will not be able to parse the Date objects sent by newer versions.
Diff: https://github.com/socketio/socket.io-redis-adapter/compare/7.2.0...8.0.0
Published by darrachequesne over 2 years ago
This feature was added in [email protected]
:
io.timeout(1000).emit("some-event", (err, responses) => {
// ...
});
Thanks to this change, it will now work with multiple Socket.IO servers.
Diff: https://github.com/socketio/socket.io-redis-adapter/compare/7.1.0...7.2.0
Published by darrachequesne almost 3 years ago
Error handling can now be done on the redis clients directly.
Before:
io.of("/").adapter.on("error", () => {
// ...
});
After:
pubClient.on("error", () => {
// something went wrong
});
subClient.on("error", () => {
// something went wrong
});
A more performant way to do request-response is available behind an option, publishOnSpecificResponseChannel
:
const io = require('socket.io')(3000);
const { createClient } = require('redis');
const redisAdapter = require('@socket.io/redis-adapter');
const pubClient = createClient({ host: 'localhost', port: 6379 });
const subClient = pubClient.duplicate();
io.adapter(redisAdapter(pubClient, subClient, {
publishOnSpecificResponseChannel: true
}));
To upgrade an existing deployment, you will need to upgrade all nodes to the latest version with publishOnSpecificResponseChannel = false, and then toggle the option on each node.
Please check the commit for more information.
Published by darrachequesne almost 3 years ago
Published by darrachequesne over 3 years ago
⚠️ IMPORTANT ⚠️
The package was renamed to @socket.io/redis-adapter
, in order to match the name of the Redis emitter (@socket.io/redis-emitter
).
@socket.io/redis-adapter
(3cac178)Before:
io.adapter(redisAdapter({ host: "localhost", port: 6379 }));
After:
const pubClient = createClient({ host: "localhost", port: 6379 });
const subClient = pubClient.duplicate();
io.adapter(redisAdapter(pubClient, subClient));
Published by darrachequesne almost 4 years ago
Published by darrachequesne almost 4 years ago
⚠️ This release is only compatible with Socket.IO v3. For Socket.IO v2, please use previous versions.
See also: https://github.com/socketio/socket.io-redis#compatibility-table
Before:
io.of('/').adapter.allRooms((err, rooms) => {
console.log(rooms); // an array containing all rooms (across every node)
});
After:
const rooms = await io.of('/').adapter.allRooms();
console.log(rooms); // a Set containing all rooms (across every node)
See https://github.com/socketio/socket.io-adapter/commit/130f28a43c5aca924aa2c1a318422d21ba03cdac
It has been replaced by the fetchSockets()
method in Socket.IO v4:
const sockets = await io.in(theSocketId).fetchSockets();
if (sockets.length) {
console.log(sockets[0].rooms);
}
Those methods will be replaced by a more intuitive API in a future iteration.
See https://github.com/nodejs/Release
Published by darrachequesne about 4 years ago
Published by darrachequesne over 4 years ago
⚠️ Breaking changes ⚠️
This is the first version compatible with socket.io v2. Please use previous versions (4.x) for socket.io v1.x. If not, you may encounter Cannot read property 'encode' of undefined
errors.
Milestone: 5.0.0
Diff: 4.0.1...5.0.0