mirror of
https://github.com/socketio/socket.io.git
synced 2026-01-12 00:17:56 -05:00
Compare commits
72 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a0091b25a | ||
|
|
a1bf85b57f | ||
|
|
62ad812ee5 | ||
|
|
9ae8ed6929 | ||
|
|
4a11c16cc2 | ||
|
|
b88a758857 | ||
|
|
3352d1d726 | ||
|
|
e68557fab6 | ||
|
|
da358084f0 | ||
|
|
1b4f6a5324 | ||
|
|
99346eddc5 | ||
|
|
051ffa0440 | ||
|
|
fa4fa3365a | ||
|
|
bafa184c6b | ||
|
|
e3149d5833 | ||
|
|
ae9d5277a9 | ||
|
|
2e440722a6 | ||
|
|
3fe6d4e8ec | ||
|
|
3b93c1c562 | ||
|
|
e89f82a9b0 | ||
|
|
1b90ae2587 | ||
|
|
9658e32e7a | ||
|
|
99d76664aa | ||
|
|
23eefa527a | ||
|
|
b49b35b26f | ||
|
|
16483375a7 | ||
|
|
ec305bd8df | ||
|
|
af07a1c649 | ||
|
|
5863903d44 | ||
|
|
f56d4acce6 | ||
|
|
8ea37b7351 | ||
|
|
b3cb18d910 | ||
|
|
0e41561d56 | ||
|
|
83709e9487 | ||
|
|
6f4051aaa7 | ||
|
|
87bf6910b5 | ||
|
|
8946b4ed4c | ||
|
|
a40068b5f3 | ||
|
|
9e29ec9b2b | ||
|
|
624e7cb14f | ||
|
|
b4954d767a | ||
|
|
f6eb53f5e1 | ||
|
|
9c80317574 | ||
|
|
d163d891ef | ||
|
|
54726105cb | ||
|
|
3d9e52cf93 | ||
|
|
ad74f2ff88 | ||
|
|
cf1c1273b3 | ||
|
|
1f43c4abb5 | ||
|
|
d6e6e8a2f8 | ||
|
|
fbd36b613d | ||
|
|
480b1a05bd | ||
|
|
ef729b72b4 | ||
|
|
63e197083b | ||
|
|
968e94e42b | ||
|
|
c18ed5fd4d | ||
|
|
1f7da938bd | ||
|
|
4b89bce182 | ||
|
|
8c19eef07a | ||
|
|
662b30669b | ||
|
|
001373ee17 | ||
|
|
246f3bb5c3 | ||
|
|
68d06ec94c | ||
|
|
a1feca1bd3 | ||
|
|
968105a239 | ||
|
|
2e8e26613a | ||
|
|
fbdb94d146 | ||
|
|
55572122f3 | ||
|
|
a1170a3aa6 | ||
|
|
0954301d7e | ||
|
|
328a9df8eb | ||
|
|
55fb100fc0 |
@@ -1,3 +1,4 @@
|
||||
support
|
||||
test
|
||||
examples
|
||||
.gitignore
|
||||
|
||||
@@ -4,6 +4,9 @@ node_js:
|
||||
- "0.10"
|
||||
- "0.11"
|
||||
|
||||
git:
|
||||
depth: 1
|
||||
|
||||
matrix:
|
||||
fast_finish: true
|
||||
allow_failures:
|
||||
|
||||
45
History.md
45
History.md
@@ -1,4 +1,49 @@
|
||||
|
||||
1.2.0 / 2014-10-27
|
||||
==================
|
||||
|
||||
* package: bump `engine.io`
|
||||
* downloads badge
|
||||
* add test to check that empty rooms are autopruned
|
||||
* added Server#origins(v:Function) description for dynamic CORS
|
||||
* added test coverage for Server#origins(function) for dynamic CORS
|
||||
* added optional Server#origins(function) for dynamic CORS
|
||||
* fix usage example for Server#close
|
||||
* package: fix main file for example application 'chat'
|
||||
* package: bump `socket.io-parser`
|
||||
* update README http ctor to createServer()
|
||||
* bump adapter with a lot of fixes for room bookkeeping
|
||||
|
||||
1.1.0 / 2014-09-04
|
||||
==================
|
||||
|
||||
* examples: minor fix of escaping
|
||||
* testing for equivalence of namespaces starting with / or without
|
||||
* update index.js
|
||||
* added relevant tests
|
||||
* take "" and "/" as equivalent namespaces on server
|
||||
* use svg instead of png to get better image quality in readme
|
||||
* make CI build faster
|
||||
* fix splice arguments and `socket.rooms` value update in `socket.leaveAll`.
|
||||
* client cannot connect to non-existing namespaces
|
||||
* bump engine.io version to get the cached IP address
|
||||
* fixed handshake object address property and made the test case more strict.
|
||||
* package: bump `engine.io`
|
||||
* fixed the failing test where server crashes on disconnect involving connectBuffer
|
||||
* npmignore: ignore `.gitignore` (fixes #1607)
|
||||
* test: added failing case for `socket.disconnect` and nsps
|
||||
* fix repo in package.json
|
||||
* improve Close documentation
|
||||
* use ephemeral ports
|
||||
* fix: We should use the standard http protocol to handler the etag header.
|
||||
* override default browser font-family for inputs
|
||||
* update has-binary-data to 1.0.3
|
||||
* add close specs
|
||||
* add ability to stop the http server even if not created inside socket.io
|
||||
* make sure server gets close
|
||||
* Add test case for checking that reconnect_failed is fired only once upon failure
|
||||
* package: bump `socket.io-parser` for `component-emitter` dep fix
|
||||
|
||||
1.0.6 / 2014-06-19
|
||||
==================
|
||||
|
||||
|
||||
44
Readme.md
44
Readme.md
@@ -1,8 +1,9 @@
|
||||
|
||||
# socket.io
|
||||
|
||||
[](http://travis-ci.org/Automattic/socket.io)
|
||||
[](http://badge.fury.io/js/socket.io)
|
||||
[](http://travis-ci.org/Automattic/socket.io)
|
||||
[](http://badge.fury.io/js/socket.io)
|
||||

|
||||
|
||||
## How to use
|
||||
|
||||
@@ -10,7 +11,7 @@ The following example attaches socket.io to a plain Node.JS
|
||||
HTTP server listening on port `3000`.
|
||||
|
||||
```js
|
||||
var server = require('http').Server();
|
||||
var server = require('http').createServer();
|
||||
var io = require('socket.io')(server);
|
||||
io.on('connection', function(socket){
|
||||
socket.on('event', function(data){});
|
||||
@@ -36,7 +37,7 @@ function.
|
||||
|
||||
```js
|
||||
var app = require('express')();
|
||||
var server = require('http').Server(app);
|
||||
var server = require('http').createServer(app);
|
||||
var io = require('socket.io')(server);
|
||||
io.on('connection', function(){ /* … */ });
|
||||
server.listen(3000);
|
||||
@@ -49,7 +50,7 @@ handler function, but only by calling the `callback` method.
|
||||
|
||||
```js
|
||||
var app = require('koa')();
|
||||
var server = require('http').Server(app.callback());
|
||||
var server = require('http').createServer(app.callback());
|
||||
var io = require('socket.io')(server);
|
||||
io.on('connection', function(){ /* … */ });
|
||||
server.listen(3000);
|
||||
@@ -136,6 +137,15 @@ server.listen(3000);
|
||||
|
||||
If no arguments are supplied this method returns the current value.
|
||||
|
||||
### Server#origins(v:Function):Server
|
||||
|
||||
Sets the allowed origins as dynamic function. Function takes two arguments `origin:String` and `callback(error, success)`, where `success` is a boolean value indicating whether origin is allowed or not.
|
||||
|
||||
__Potential drawbacks__:
|
||||
* in some situations, when it is not possible to determine `origin` it may have value of `*`
|
||||
* As this function will be executed for every request, it is advised to make this function work as fast as possible
|
||||
* If `socket.io` is used together with `Express`, the CORS headers will be affected only for `socket.io` requests. For Express can use [cors](https://github.com/troygoode/node-cors/)
|
||||
|
||||
|
||||
### Server#sockets:Namespace
|
||||
|
||||
@@ -157,7 +167,7 @@ server.listen(3000);
|
||||
|
||||
### Server#bind(srv:engine#Server):Server
|
||||
|
||||
Advanced use only. Binds the server to a specific engine.io `Server`
|
||||
Advanced use only. Binds the server to a specific engine.io `Server`
|
||||
(or compatible API) instance.
|
||||
|
||||
### Server#onconnection(socket:engine#Socket):Server
|
||||
@@ -167,14 +177,14 @@ server.listen(3000);
|
||||
|
||||
### Server#of(nsp:String):Namespace
|
||||
|
||||
Initializes and retrieves the given `Namespace` by its pathname
|
||||
Initializes and retrieves the given `Namespace` by its pathname
|
||||
identifier `nsp`.
|
||||
|
||||
If the namespace was already initialized it returns it right away.
|
||||
|
||||
### Server#emit
|
||||
|
||||
Emits an event to all connected clients. The following two are
|
||||
Emits an event to all connected clients. The following two are
|
||||
equivalent:
|
||||
|
||||
```js
|
||||
@@ -185,6 +195,24 @@ server.listen(3000);
|
||||
|
||||
For other available methods, see `Namespace` below.
|
||||
|
||||
### Server#close
|
||||
|
||||
Closes socket server
|
||||
|
||||
```js
|
||||
var Server = require('socket.io');
|
||||
var PORT = 3030;
|
||||
var server = require('http').Server();
|
||||
|
||||
var io = Server(PORT);
|
||||
|
||||
io.close(); // Close current server
|
||||
|
||||
server.listen(PORT); // PORT is free to use
|
||||
|
||||
io = Server(server);
|
||||
```
|
||||
|
||||
### Server#use
|
||||
|
||||
See `Namespace#use` below.
|
||||
|
||||
@@ -13,13 +13,13 @@ $ npm install
|
||||
$ node .
|
||||
```
|
||||
|
||||
And point your browser to `http://localhost:3000`. Optionally specify
|
||||
And point your browser to `http://localhost:3000`. Optionally, specify
|
||||
a port by supplying the `PORT` env variable.
|
||||
|
||||
## Features
|
||||
|
||||
- Multiple users can join a chat room by entering a unique username
|
||||
- Multiple users can join a chat room by each entering a unique username
|
||||
on website load.
|
||||
- Users can type chat messages to the chat room
|
||||
- Users can type chat messages to the chat room.
|
||||
- A notification is sent to all users when a user joins or leaves
|
||||
the chatroom
|
||||
the chatroom.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "socket.io-chat",
|
||||
"version": "0.0.0",
|
||||
"description": "A simple chat client using socket.io",
|
||||
"main": "app.js",
|
||||
"main": "index.js",
|
||||
"author": "Grant Timmerman",
|
||||
"private": true,
|
||||
"license": "BSD",
|
||||
|
||||
@@ -30,7 +30,7 @@ $(function() {
|
||||
if (data.numUsers === 1) {
|
||||
message += "there's 1 participant";
|
||||
} else {
|
||||
message += "there're " + data.numUsers + " participants";
|
||||
message += "there are " + data.numUsers + " participants";
|
||||
}
|
||||
log(message);
|
||||
}
|
||||
@@ -229,7 +229,7 @@ $(function() {
|
||||
socket.on('login', function (data) {
|
||||
connected = true;
|
||||
// Display the welcome message
|
||||
var message = "Welcome to Socket.IO Chat — ";
|
||||
var message = "Welcome to Socket.IO Chat – ";
|
||||
log(message, {
|
||||
prepend: true
|
||||
});
|
||||
@@ -263,4 +263,4 @@ $(function() {
|
||||
socket.on('stop typing', function (data) {
|
||||
removeChatTyping(data);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
}
|
||||
|
||||
html {
|
||||
font-weight: 300;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
html, input {
|
||||
font-family:
|
||||
"HelveticaNeue-Light",
|
||||
"Helvetica Neue Light",
|
||||
@@ -13,8 +18,6 @@ html {
|
||||
Arial,
|
||||
"Lucida Grande",
|
||||
sans-serif;
|
||||
font-weight: 300;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
html, body {
|
||||
@@ -144,4 +147,4 @@ ul {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,6 +57,10 @@ Client.prototype.setup = function(){
|
||||
|
||||
Client.prototype.connect = function(name){
|
||||
debug('connecting to namespace %s', name);
|
||||
if (!this.server.nsps[name]) {
|
||||
this.packet({ type: parser.ERROR, nsp: name, data : 'Invalid namespace'});
|
||||
return;
|
||||
}
|
||||
var nsp = this.server.of(name);
|
||||
if ('/' != name && !this.nsps['/']) {
|
||||
this.connectBuffer.push(name);
|
||||
@@ -68,9 +72,9 @@ Client.prototype.connect = function(name){
|
||||
self.sockets.push(socket);
|
||||
self.nsps[nsp.name] = socket;
|
||||
|
||||
if ('/' == nsp.name && self.connectBuffer) {
|
||||
if ('/' == nsp.name && self.connectBuffer.length > 0) {
|
||||
self.connectBuffer.forEach(self.connect, self);
|
||||
delete self.connectBuffer;
|
||||
self.connectBuffer = [];
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
32
lib/index.js
32
lib/index.js
@@ -64,6 +64,7 @@ Server.prototype.checkRequest = function(req, fn) {
|
||||
// file:// URLs produce a null Origin which can't be authorized via echo-back
|
||||
if ('null' == origin) origin = '*';
|
||||
|
||||
if (!!origin && typeof(this._origins) == 'function') return this._origins(origin, fn);
|
||||
if (this._origins.indexOf('*:*') !== -1) return fn(null, true);
|
||||
if (origin) {
|
||||
try {
|
||||
@@ -211,11 +212,12 @@ Server.prototype.attach = function(srv, opts){
|
||||
res.end();
|
||||
});
|
||||
srv.listen(port);
|
||||
|
||||
}
|
||||
|
||||
// set engine.io path to `/socket.io`
|
||||
opts = opts || {};
|
||||
opts.path = opts.path || '/socket.io';
|
||||
opts.path = opts.path || this.path();
|
||||
// set origins verification
|
||||
opts.allowRequest = this.checkRequest.bind(this);
|
||||
|
||||
@@ -226,6 +228,9 @@ Server.prototype.attach = function(srv, opts){
|
||||
// attach static file serving
|
||||
if (this._serveClient) this.attachServe(srv);
|
||||
|
||||
// Export http server
|
||||
this.httpServer = srv;
|
||||
|
||||
// bind to engine events
|
||||
this.bind(this.eio);
|
||||
|
||||
@@ -265,8 +270,9 @@ Server.prototype.attachServe = function(srv){
|
||||
*/
|
||||
|
||||
Server.prototype.serve = function(req, res){
|
||||
if (req.headers.etag) {
|
||||
if (clientVersion == req.headers.etag) {
|
||||
var etag = req.headers['if-none-match'];
|
||||
if (etag) {
|
||||
if (clientVersion == etag) {
|
||||
debug('serve client 304');
|
||||
res.writeHead(304);
|
||||
res.end();
|
||||
@@ -319,6 +325,8 @@ Server.prototype.onconnection = function(conn){
|
||||
*/
|
||||
|
||||
Server.prototype.of = function(name, fn){
|
||||
if (String(name)[0] !== '/') name = '/' + name;
|
||||
|
||||
if (!this.nsps[name]) {
|
||||
debug('initializing namespace %s', name);
|
||||
var nsp = new Namespace(this, name);
|
||||
@@ -328,6 +336,24 @@ Server.prototype.of = function(name, fn){
|
||||
return this.nsps[name];
|
||||
};
|
||||
|
||||
/**
|
||||
* Closes server connection
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Server.prototype.close = function(){
|
||||
this.nsps['/'].sockets.forEach(function(socket){
|
||||
socket.onclose();
|
||||
});
|
||||
|
||||
this.engine.close();
|
||||
|
||||
if(this.httpServer){
|
||||
this.httpServer.close();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Expose main namespace (/).
|
||||
*/
|
||||
|
||||
@@ -108,7 +108,7 @@ Socket.prototype.buildHandshake = function(){
|
||||
return {
|
||||
headers: this.request.headers,
|
||||
time: (new Date) + '',
|
||||
address: this.request.connection.address(),
|
||||
address: this.conn.remoteAddress,
|
||||
xdomain: !!this.request.headers.origin,
|
||||
secure: !!this.request.connection.encrypted,
|
||||
issued: +(new Date),
|
||||
@@ -242,7 +242,7 @@ Socket.prototype.leave = function(room, fn){
|
||||
this.adapter.del(this.id, room, function(err){
|
||||
if (err) return fn && fn(err);
|
||||
debug('left room %s', room);
|
||||
self.rooms.splice(self.rooms.indexOf(room, 1));
|
||||
self.rooms.splice(self.rooms.indexOf(room), 1);
|
||||
fn && fn(null);
|
||||
});
|
||||
return this;
|
||||
@@ -256,6 +256,7 @@ Socket.prototype.leave = function(room, fn){
|
||||
|
||||
Socket.prototype.leaveAll = function(){
|
||||
this.adapter.delAll(this.id);
|
||||
this.rooms = [];
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
14
package.json
14
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "socket.io",
|
||||
"version": "1.0.6",
|
||||
"version": "1.2.0",
|
||||
"description": "node.js realtime framework server",
|
||||
"keywords": [
|
||||
"realtime",
|
||||
@@ -13,17 +13,17 @@
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/LearnBoost/socket.io"
|
||||
"url": "git://github.com/Automattic/socket.io"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "make test"
|
||||
},
|
||||
"dependencies": {
|
||||
"engine.io": "1.3.1",
|
||||
"socket.io-parser": "2.2.0",
|
||||
"socket.io-client": "1.0.6",
|
||||
"socket.io-adapter": "0.2.0",
|
||||
"has-binary-data": "0.1.1",
|
||||
"engine.io": "1.4.2",
|
||||
"socket.io-parser": "2.2.2",
|
||||
"socket.io-client": "1.2.0",
|
||||
"socket.io-adapter": "0.3.1",
|
||||
"has-binary-data": "0.1.3",
|
||||
"debug": "0.7.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -51,10 +51,21 @@ describe('socket.io', function(){
|
||||
expect(srv.eio.maxHttpBufferSize).to.eql(10);
|
||||
});
|
||||
|
||||
it('should be able to set path with setting resource', function() {
|
||||
var srv = io(http());
|
||||
srv.set('resource', '/random');
|
||||
expect(srv.path()).to.be('/random');
|
||||
it('should be able to set path with setting resource', function(done) {
|
||||
var eio = io();
|
||||
var srv = http();
|
||||
|
||||
eio.set('resource', '/random');
|
||||
eio.attach(srv);
|
||||
|
||||
// Check that the server is accessible through the specified path
|
||||
request(srv)
|
||||
.get('/random/socket.io.js')
|
||||
.buffer(true)
|
||||
.end(function(err, res){
|
||||
if (err) return done(err);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should be able to set origins to engine.io', function() {
|
||||
@@ -116,7 +127,7 @@ describe('socket.io', function(){
|
||||
expect(s.handshake.time.split(' ').length > 0); // Is "multipart" string representation
|
||||
|
||||
// Address, xdomain, secure, issued and url set
|
||||
expect(s.handshake.address).to.not.be(undefined);
|
||||
expect(s.handshake.address).to.be('127.0.0.1');
|
||||
expect(s.handshake.xdomain).to.be.a('boolean');
|
||||
expect(s.handshake.secure).to.be.a('boolean');
|
||||
expect(s.handshake.issued).to.be.a('number');
|
||||
@@ -161,7 +172,7 @@ describe('socket.io', function(){
|
||||
io(srv);
|
||||
request(srv)
|
||||
.get('/socket.io/socket.io.js')
|
||||
.set('ETag', clientVersion)
|
||||
.set('If-None-Match', clientVersion)
|
||||
.end(function(err, res){
|
||||
if (err) return done(err);
|
||||
expect(res.statusCode).to.be(304);
|
||||
@@ -259,167 +270,302 @@ describe('socket.io', function(){
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should allow request when origin defined as function and same is supplied', function(done) {
|
||||
var sockets = io({ origins: function(origin,callback){
|
||||
if(origin == 'http://foo.example')
|
||||
return callback(null, true);
|
||||
return callback(null, false);
|
||||
} }).listen('54016');
|
||||
request.get('http://localhost:54016/socket.io/default/')
|
||||
.set('origin', 'http://foo.example')
|
||||
.query({ transport: 'polling' })
|
||||
.end(function (err, res) {
|
||||
expect(res.status).to.be(200);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should allow request when origin defined as function and different is supplied', function(done) {
|
||||
var sockets = io({ origins: function(origin,callback){
|
||||
if(origin == 'http://foo.example')
|
||||
return callback(null, true);
|
||||
return callback(null, false);
|
||||
} }).listen('54017');
|
||||
request.get('http://localhost:54017/socket.io/default/')
|
||||
.set('origin', 'http://herp.derp')
|
||||
.query({ transport: 'polling' })
|
||||
.end(function (err, res) {
|
||||
expect(res.status).to.be(400);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('close', function(){
|
||||
|
||||
it('should be able to close sio sending a srv', function(){
|
||||
var PORT = 54018;
|
||||
var srv = http().listen(PORT);
|
||||
var sio = io(srv);
|
||||
var net = require('net');
|
||||
var server = net.createServer();
|
||||
|
||||
var clientSocket = client(srv, { reconnection: false });
|
||||
|
||||
clientSocket.on('disconnect', function init() {
|
||||
expect(sio.nsps['/'].sockets.length).to.equal(0);
|
||||
server.listen(PORT);
|
||||
});
|
||||
|
||||
clientSocket.on('connect', function init() {
|
||||
expect(sio.nsps['/'].sockets.length).to.equal(1);
|
||||
sio.close();
|
||||
});
|
||||
|
||||
server.once('listening', function() {
|
||||
// PORT should be free
|
||||
server.close(function(error){
|
||||
expect(error).to.be(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
it('should be able to close sio sending a port', function(){
|
||||
var PORT = 54019;
|
||||
var sio = io(PORT);
|
||||
var net = require('net');
|
||||
var server = net.createServer();
|
||||
|
||||
var clientSocket = ioc('ws://0.0.0.0:' + PORT);
|
||||
|
||||
clientSocket.on('disconnect', function init() {
|
||||
expect(sio.nsps['/'].sockets.length).to.equal(0);
|
||||
server.listen(PORT);
|
||||
});
|
||||
|
||||
clientSocket.on('connect', function init() {
|
||||
expect(sio.nsps['/'].sockets.length).to.equal(1);
|
||||
sio.close();
|
||||
});
|
||||
|
||||
server.once('listening', function() {
|
||||
// PORT should be free
|
||||
server.close(function(error){
|
||||
expect(error).to.be(undefined);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe('namespaces', function(){
|
||||
var Socket = require('../lib/socket');
|
||||
var Namespace = require('../lib/namespace');
|
||||
|
||||
describe('default', function(){
|
||||
it('should be accessible through .sockets', function(){
|
||||
var sio = io();
|
||||
expect(sio.sockets).to.be.a(Namespace);
|
||||
});
|
||||
it('should be accessible through .sockets', function(){
|
||||
var sio = io();
|
||||
expect(sio.sockets).to.be.a(Namespace);
|
||||
});
|
||||
|
||||
it('should be aliased', function(){
|
||||
var sio = io();
|
||||
expect(sio.use).to.be.a('function');
|
||||
expect(sio.to).to.be.a('function');
|
||||
expect(sio['in']).to.be.a('function');
|
||||
expect(sio.emit).to.be.a('function');
|
||||
expect(sio.send).to.be.a('function');
|
||||
expect(sio.write).to.be.a('function');
|
||||
});
|
||||
it('should be aliased', function(){
|
||||
var sio = io();
|
||||
expect(sio.use).to.be.a('function');
|
||||
expect(sio.to).to.be.a('function');
|
||||
expect(sio['in']).to.be.a('function');
|
||||
expect(sio.emit).to.be.a('function');
|
||||
expect(sio.send).to.be.a('function');
|
||||
expect(sio.write).to.be.a('function');
|
||||
});
|
||||
|
||||
it('should automatically connect', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var socket = client(srv);
|
||||
socket.on('connect', function(){
|
||||
done();
|
||||
});
|
||||
it('should automatically connect', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var socket = client(srv);
|
||||
socket.on('connect', function(){
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should fire a `connection` event', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var socket = client(srv);
|
||||
sio.on('connection', function(socket){
|
||||
expect(socket).to.be.a(Socket);
|
||||
done();
|
||||
});
|
||||
it('should fire a `connection` event', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var socket = client(srv);
|
||||
sio.on('connection', function(socket){
|
||||
expect(socket).to.be.a(Socket);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should fire a `connect` event', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var socket = client(srv);
|
||||
sio.on('connect', function(socket){
|
||||
expect(socket).to.be.a(Socket);
|
||||
done();
|
||||
});
|
||||
it('should fire a `connect` event', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var socket = client(srv);
|
||||
sio.on('connect', function(socket){
|
||||
expect(socket).to.be.a(Socket);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should work with many sockets', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var chat = client(srv, '/chat');
|
||||
var news = client(srv, '/news');
|
||||
var total = 2;
|
||||
chat.on('connect', function(){
|
||||
--total || done();
|
||||
});
|
||||
news.on('connect', function(){
|
||||
--total || done();
|
||||
});
|
||||
it('should work with many sockets', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
sio.of('/chat');
|
||||
sio.of('/news');
|
||||
var chat = client(srv, '/chat');
|
||||
var news = client(srv, '/news');
|
||||
var total = 2;
|
||||
chat.on('connect', function(){
|
||||
--total || done();
|
||||
});
|
||||
news.on('connect', function(){
|
||||
--total || done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should work with `of` and many sockets', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var chat = client(srv, '/chat');
|
||||
var news = client(srv, '/news');
|
||||
var total = 2;
|
||||
sio.of('/news').on('connection', function(socket){
|
||||
expect(socket).to.be.a(Socket);
|
||||
--total || done();
|
||||
});
|
||||
sio.of('/news').on('connection', function(socket){
|
||||
expect(socket).to.be.a(Socket);
|
||||
--total || done();
|
||||
});
|
||||
it('should be able to equivalently start with "" or "/" on server', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
var total = 2;
|
||||
sio.of('').on('connection', function(){
|
||||
--total || done();
|
||||
});
|
||||
sio.of('abc').on('connection', function(){
|
||||
--total || done();
|
||||
});
|
||||
var c1 = client(srv, '/');
|
||||
var c2 = client(srv, '/abc');
|
||||
});
|
||||
|
||||
it('should be equivalent for "" and "/" on client', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
sio.of('/').on('connection', function(){
|
||||
done();
|
||||
});
|
||||
var c1 = client(srv, '');
|
||||
});
|
||||
|
||||
it('should work with `of` and many sockets', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var chat = client(srv, '/chat');
|
||||
var news = client(srv, '/news');
|
||||
var total = 2;
|
||||
sio.of('/news').on('connection', function(socket){
|
||||
expect(socket).to.be.a(Socket);
|
||||
--total || done();
|
||||
});
|
||||
sio.of('/news').on('connection', function(socket){
|
||||
expect(socket).to.be.a(Socket);
|
||||
--total || done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should work with `of` second param', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var chat = client(srv, '/chat');
|
||||
var news = client(srv, '/news');
|
||||
var total = 2;
|
||||
sio.of('/news', function(socket){
|
||||
expect(socket).to.be.a(Socket);
|
||||
--total || done();
|
||||
});
|
||||
sio.of('/news', function(socket){
|
||||
expect(socket).to.be.a(Socket);
|
||||
--total || done();
|
||||
});
|
||||
it('should work with `of` second param', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var chat = client(srv, '/chat');
|
||||
var news = client(srv, '/news');
|
||||
var total = 2;
|
||||
sio.of('/news', function(socket){
|
||||
expect(socket).to.be.a(Socket);
|
||||
--total || done();
|
||||
});
|
||||
sio.of('/news', function(socket){
|
||||
expect(socket).to.be.a(Socket);
|
||||
--total || done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should disconnect upon transport disconnection', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var chat = client(srv, '/chat');
|
||||
var news = client(srv, '/news');
|
||||
var total = 2;
|
||||
var totald = 2;
|
||||
var s;
|
||||
sio.of('/news', function(socket){
|
||||
socket.on('disconnect', function(reason){
|
||||
--totald || done();
|
||||
});
|
||||
--total || close();
|
||||
it('should disconnect upon transport disconnection', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var chat = client(srv, '/chat');
|
||||
var news = client(srv, '/news');
|
||||
var total = 2;
|
||||
var totald = 2;
|
||||
var s;
|
||||
sio.of('/news', function(socket){
|
||||
socket.on('disconnect', function(reason){
|
||||
--totald || done();
|
||||
});
|
||||
sio.of('/chat', function(socket){
|
||||
s = socket;
|
||||
socket.on('disconnect', function(reason){
|
||||
--totald || done();
|
||||
});
|
||||
--total || close();
|
||||
--total || close();
|
||||
});
|
||||
sio.of('/chat', function(socket){
|
||||
s = socket;
|
||||
socket.on('disconnect', function(reason){
|
||||
--totald || done();
|
||||
});
|
||||
function close(){
|
||||
s.disconnect(true);
|
||||
}
|
||||
--total || close();
|
||||
});
|
||||
function close(){
|
||||
s.disconnect(true);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it('should disconnect both default and custom namespace upon disconnect', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var lolcats = client(srv, '/lolcats');
|
||||
var total = 2;
|
||||
var totald = 2;
|
||||
var s;
|
||||
sio.of('/', function(socket){
|
||||
socket.on('disconnect', function(reason){
|
||||
--totald || done();
|
||||
});
|
||||
--total || close();
|
||||
});
|
||||
sio.of('/lolcats', function(socket){
|
||||
s = socket;
|
||||
socket.on('disconnect', function(reason){
|
||||
--totald || done();
|
||||
});
|
||||
--total || close();
|
||||
});
|
||||
function close(){
|
||||
s.disconnect(true);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it('should not crash while disconnecting socket', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var socket = client(srv,'/ns');
|
||||
sio.on('connection', function(socket){
|
||||
socket.disconnect();
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should disconnect both default and custom namespace upon disconnect', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var lolcats = client(srv, '/lolcats');
|
||||
var total = 2;
|
||||
var totald = 2;
|
||||
var s;
|
||||
sio.of('/', function(socket){
|
||||
socket.on('disconnect', function(reason){
|
||||
--totald || done();
|
||||
});
|
||||
--total || close();
|
||||
});
|
||||
sio.of('/lolcats', function(socket){
|
||||
s = socket;
|
||||
socket.on('disconnect', function(reason){
|
||||
--totald || done();
|
||||
});
|
||||
--total || close();
|
||||
});
|
||||
function close(){
|
||||
s.disconnect(true);
|
||||
}
|
||||
it('should return error connecting to non-existent namespace', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var socket = client(srv,'/doesnotexist');
|
||||
socket.on('error', function(err) {
|
||||
expect(err).to.be('Invalid namespace');
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -444,6 +590,21 @@ describe('socket.io', function(){
|
||||
});
|
||||
});
|
||||
|
||||
it('should not fire reconnect_failed event more than once when server closed', function(done) {
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
srv.listen(function(){
|
||||
var clientSocket = client(srv, { reconnectionAttempts: 3, reconnectionDelay: 10 });
|
||||
clientSocket.on('connect', function() {
|
||||
srv.close();
|
||||
});
|
||||
|
||||
clientSocket.on('reconnect_failed', function() {
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should receive events', function(done){
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
@@ -1157,15 +1318,38 @@ describe('socket.io', function(){
|
||||
expect(s.rooms).to.eql([s.id, 'a']);
|
||||
s.join('b', function(){
|
||||
expect(s.rooms).to.eql([s.id, 'a', 'b']);
|
||||
s.leave('b', function(){
|
||||
expect(s.rooms).to.eql([s.id, 'a']);
|
||||
done();
|
||||
s.join( 'c', function(){
|
||||
expect(s.rooms).to.eql([s.id, 'a', 'b', 'c']);
|
||||
s.leave('b', function(){
|
||||
expect(s.rooms).to.eql([s.id, 'a', 'c']);
|
||||
s.leaveAll();
|
||||
expect(s.rooms).to.eql([]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('deletes empty rooms', function(done) {
|
||||
var srv = http();
|
||||
var sio = io(srv);
|
||||
|
||||
srv.listen(function(){
|
||||
var socket = client(srv);
|
||||
sio.on('connection', function(s){
|
||||
s.join('a', function(){
|
||||
expect(s.nsp.adapter.rooms).to.have.key('a');
|
||||
s.leave('a', function(){
|
||||
expect(s.nsp.adapter.rooms).to.not.have.key('a');
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('middleware', function(done){
|
||||
|
||||
Reference in New Issue
Block a user