diff --git a/socket.io-redis/socket.io-redis-tests.ts b/socket.io-redis/socket.io-redis-tests.ts new file mode 100644 index 000000000..2ce2be1bd --- /dev/null +++ b/socket.io-redis/socket.io-redis-tests.ts @@ -0,0 +1,46 @@ +/// +/// +/// + +import socketIO = require('socket.io'); +import ioRedis = require('socket.io-redis'); +import redis = require('redis'); + +function testUsingWithNodeHTTPServer() { + var io = socketIO(3000); + var adapter = ioRedis("http://localhost"); + io.adapter(adapter); + + var chat = io + .of('/chat') + .on('connection', function (socket) { + socket.emit('a message', { + that: 'only' + , '/chat': 'will get' + }); + chat.emit('a message', { + everyone: 'in' + , '/chat': 'will get' + }); + }); +} + +function testErrorHandling() { + var io = socketIO.listen(80); + var adapter = ioRedis("http://localhost"); + adapter.pubClient.on('error', function () { + console.log('pubClient error'); + }); + adapter.subClient.on('error', function() { + console.log('subClient error'); + }); + io.adapter(adapter); +} + +function testCustomClientAuth() { + var io = socketIO.listen(80); + var pub: redis.RedisClient = redis.createClient(8080, 'localhost', { auth_pass: 'pwd' }); + var sub: redis.RedisClient = redis.createClient(8081, 'localhost', { return_buffers: true, auth_pass: 'pwd' }); + var adapter = ioRedis({ pubClient: pub, subClient: sub }); + io.adapter(adapter); +} diff --git a/socket.io-redis/socket.io-redis.d.ts b/socket.io-redis/socket.io-redis.d.ts new file mode 100644 index 000000000..b3eb44e5e --- /dev/null +++ b/socket.io-redis/socket.io-redis.d.ts @@ -0,0 +1,120 @@ +// Type definitions for socket.io-redis 1.0.0 +// Project: https://github.com/socketio/socket.io-redis +// Definitions by: Philipp Holzer +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/// +/// + +declare module 'socket.io-redis' { + var redis: SocketIORedisStatic; + + export = redis; +} + +interface SocketIORedisStatic { + /** + * Default Redis Adapter constructor + */ + (): SocketIORedis.RedisAdapter; + + /** + * Creates a new Redis Adapter + * @param uri Is a string like localhost:6379 where your redis server is located. + * @param opts An optional parameters object + */ + (uri: string, opts?: SocketIORedis.SocketIORedisOptions): SocketIORedis.RedisAdapter; + + /** + * Creates a new Redis Adapter + * @param opts A parameters object + */ + (opts: SocketIORedis.SocketIORedisOptions): SocketIORedis.RedisAdapter; +} + +/** + * TODO: return Value for pubClient and subClient is RedisClient, but the im port throws errors because of "invalid module name in augmenatition" + * + */ +declare namespace SocketIORedis { + /** + * Options to pass to the redis server when creating it + */ + interface SocketIORedisOptions { + + /** + * The optional name of the key to pub/sub events on as prefix + * @default socket.io + */ + key?: string; + + /** + * The optional host to connect to redis on + * @default localhost + */ + host?: string; + + /** + * The optional port to connect to redis on + * @default 6379 + */ + port?: string; + + /** + * The optional redis client to publish events on + */ + pubClient?: any; + + /** + * The optional redis client to subscribe to events on + */ + subClient?: any; + } + + interface RedisAdapter extends SocketIO.Adapter { + + /** + * This servers key + */ + uid: string; + + /** + * The prefix of pub/sub events + */ + prefix: string; + + /** + * Optional, the redis client to publish events on + */ + pubClient?: any; + + /** + * Optional, the redis client to subscribe to events on + */ + subClient?: any; + + /** + * Broadcasts a packet + * @param packet The packet to broadcast + * @param opts Any options to send along: + * - rooms: An optional list of rooms to broadcast to. If empty, the packet is broadcast to all sockets + * - except: A list of Socket IDs to exclude + * - flags: Any flags that we want to send along ('json', 'volatile', 'broadcast') + * @param remote The optional flag, whether the packet came from another node + */ + broadcast: { + (packet: any, opts: { rooms?: string[]; except?: string[]; flags?: {[flag: string]: boolean} }): void; + (packet: any, opts: { rooms?: string[]; except?: string[]; flags?: {[flag: string]: boolean} }, remote?: boolean): void; + }; + + /** + * Removes a socket from all the rooms that it's joined + * @param id The ID of the socket that we're removing + * @param callback An optional callback to call when the socket has been + */ + delAll: { + (id: string): void; + (id: string, callback?: (err?: any) => void): void; + }; + } +}