IO
==============
Exposed as the ``io`` namespace in the standalone build, or the result
of calling ``require('socket.io-client')``.
.. code:: html
.. code:: js
const io = require('socket.io-client');
// or with import syntax
import io from 'socket.io-client';
.. class:: io
const io = require('socket.io-client');
.. attribute:: io.protocol
The protocol revision number.
*(Number)*
.. function:: io([url][, options])
:param String url: defaults to ``window.location``
:param Object options:
- ``forceNew`` *(Boolean)* whether to reuse an existing connection
:Returns: ``Socket``
Creates a new ``Manager`` for the given URL, and attempts to reuse an
existing ``Manager`` for subsequent calls, unless the ``multiplex``
option is passed with ``false``. Passing this option is the equivalent
of passing ``'force new connection': true`` or ``forceNew: true``.
A new ``Socket`` instance is returned for the namespace specified by the
pathname in the URL, defaulting to ``/``. For example, if the ``url`` is
``http://localhost/users``, a transport connection will be established
to ``http://localhost`` and a Socket.IO connection will be established
to ``/users``.
Query parameters can also be provided, either with the ``query`` option
or directly in the url (example: ``http://localhost/users?token=abc``).
See `new Manager(url[, options]) <#new-Manager-url-options>`_ for the
the list of available ``options``.
Initialization examples
-----------------------
With multiplexing
~~~~~~~~~~~~~~~~~
By default, a single connection is used when connecting to different
namespaces (to minimize resources):
.. code:: js
const socket = io();
const adminSocket = io('/admin');
// a single connection will be established
That behaviour can be disabled with the ``forceNew`` option:
.. code:: js
const socket = io();
const adminSocket = io('/admin', { forceNew: true });
// will create two distinct connections
Note: reusing the same namespace will also create two connections
.. code:: js
const socket = io();
const socket2 = io();
// will also create two distinct connections
With custom ``path``
~~~~~~~~~~~~~~~~~~~~
.. code:: js
const socket = io('http://localhost', {
path: '/myownpath'
});
// server-side
const io = require('socket.io')({
path: '/myownpath'
});
The request URLs will look like:
``localhost/myownpath/?EIO=3&transport=polling&sid=``
.. code:: js
const socket = io('http://localhost/admin', {
path: '/mypath'
});
Here, the socket connects to the ``admin`` namespace, with the custom
path ``mypath``.
The request URLs will look like:
``localhost/mypath/?EIO=3&transport=polling&sid=`` (the namespace is
sent as part of the payload).
With query parameters
~~~~~~~~~~~~~~~~~~~~~
.. code:: js
const socket = io('http://localhost?token=abc');
// server-side
const io = require('socket.io')();
// middleware
io.use((socket, next) => {
let token = socket.handshake.query.token;
if (isValid(token)) {
return next();
}
return next(new Error('authentication error'));
});
// then
io.on('connection', (socket) => {
let token = socket.handshake.query.token;
// ...
});
With query option
~~~~~~~~~~~~~~~~~
.. code:: js
const socket = io({
query: {
token: 'cde'
}
});
The query content can also be updated on reconnection:
.. code:: js
socket.on('reconnect_attempt', () => {
socket.io.opts.query = {
token: 'fgh'
}
});
With ``extraHeaders``
~~~~~~~~~~~~~~~~~~~~~
This only works if ``polling`` transport is enabled (which is the
default). Custom headers will not be appended when using ``websocket``
as the transport. This happens because the WebSocket handshake does not
honor custom headers. (For background see the `WebSocket protocol
RFC `_)
.. code:: js
const socket = io({
transportOptions: {
polling: {
extraHeaders: {
'x-clientid': 'abc'
}
}
}
});
// server-side
const io = require('socket.io')();
// middleware
io.use((socket, next) => {
let clientId = socket.handshake.headers['x-clientid'];
if (isValid(clientId)) {
return next();
}
return next(new Error('authentication error'));
});
With ``websocket`` transport only
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
By default, a long-polling connection is established first, then
upgraded to “better” transports (like WebSocket). If you like to live
dangerously, this part can be skipped:
.. code:: js
const socket = io({
transports: ['websocket']
});
// on reconnection, reset the transports option, as the Websocket
// connection may have failed (caused by proxy, firewall, browser, ...)
socket.on('reconnect_attempt', () => {
socket.io.opts.transports = ['polling', 'websocket'];
});
With a custom parser
~~~~~~~~~~~~~~~~~~~~
The default `parser `_
promotes compatibility (support for ``Blob``, ``File``, binary check) at
the expense of performance. A custom parser can be provided to match the
needs of your application. Please see the example
`here `_.
.. code:: js
const parser = require('socket.io-msgpack-parser'); // or require('socket.io-json-parser')
const socket = io({
parser: parser
});
// the server-side must have the same parser, to be able to communicate
const io = require('socket.io')({
parser: parser
});
With a self-signed certificate
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: js
// server-side
const fs = require('fs');
const server = require('https').createServer({
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem')
});
const io = require('socket.io')(server);
server.listen(3000);
// client-side
const socket = io({
// option 1
ca: fs.readFileSync('server-cert.pem'),
// option 2. WARNING: it leaves you vulnerable to MITM attacks!
rejectUnauthorized: false
});