Параметры клиента
Параметры фабрики IO
forceNew
Значение по умолчанию: false
Создавать ли новый экземпляр Manager.
Экземпляр Manager отвечает за низкоуровневое подключение к серверу (установленное с помощью HTTP long-polling или WebSocket). Он обрабатывает логику повторного подключения.
Экземпляр Socket — это интерфейс, используемый для отправки событий на сервер и получения событий с сервера. Он принадлежит заданному пространству имен.
Один экземпляр Manager может быть прикреплен к нескольким экземплярам Socket.
Следующий пример повторно использует один и тот же экземпляр Manager для 3 экземпляров Socket (одно единственное WebSocket-соединение):
const socket = io("https://example.com"); // the main namespace
const productSocket = io("https://example.com/product"); // the "product" namespace
const orderSocket = io("https://example.com/order"); // the "order" namespace
Следующий пример создаст 3 разных экземпляра Manager (и, следовательно, 3 отдельных WebSocket-соединения):
const socket = io("https://example.com"); // the main namespace
const productSocket = io("https://example.com/product", { forceNew: true }); // the "product" namespace
const orderSocket = io("https://example.com/order", { forceNew: true }); // the "order" namespace
Повторное использование существующего пространства имен также будет создавать новый Manager каждый раз:
const socket1 = io(); // 1st manager
const socket2 = io(); // 2nd manager
const socket3 = io("/admin"); // reuse the 1st manager
const socket4 = io("/admin"); // 3rd manager
multiplex
Значение по умолчанию: true
Обратное forceNew: повторно использовать существующий экземпляр Manager.
const socket = io(); // 1st manager
const adminSocket = io("/admin", { multiplex: false }); // 2nd manager
Параметры низкоуровневого движка
Эти настройки будут общими для всех экземпляров Socket, подключенных к одному Manager.
transports
Значение по умолчанию: ["polling", "websocket"]
Низкоуровневое подключение к серверу Socket.IO может быть установлено с помощью:
- HTTP long-polling: последовательные HTTP-запросы (
POSTдля записи,GETдля чтения) - WebSocket
Следующий пример отключает транспорт HTTP long-polling:
const socket = io("https://example.com", { transports: ["websocket"] });
Примечание: в этом случае на стороне сервера не нужны «sticky sessions» (подробнее здесь).
По умолчанию сначала устанавливается HTTP long-polling соединение, а затем происходит попытка обновления до WebSocket (объяснение здесь). Вы можете использовать WebSocket первым с помощью:
const socket = io("https://example.com", {
transports: ["websocket", "polling"] // use WebSocket first, if available
});
socket.on("connect_error", () => {
// revert to classic upgrade
socket.io.opts.transports = ["polling", "websocket"];
});
Один из возможных недостатков заключается в том, что правильность вашей настройки CORS будет проверена только в случае неудачи при установлении WebSocket-соединения.
upgrade
Значение по умолчанию: true
Должен ли клиент пытаться обновить транспорт с HTTP long-polling на что-то лучшее.
rememberUpgrade
Значение по умолчанию: false
Если значение true и предыдущее WebSocket-соединение с сервером прошло успешно, попытка подключения обойдет обычный процесс обновления и сначала попытается установить WebSocket. Попытка подключения после ошибки транспорта будет использовать обычный процесс обновления. Рекомендуется включить это только при использовании соединений SSL/TLS или если вам известно, что ваша сеть не блокирует вебсокеты.
path
Значение по умолчанию: /socket.io/
Это имя пути, которое обрабатывается на стороне сервера.
Значения сервера и клиента должны совпадать (если вы не используете прокси-сервер для перенаправления пути).
Клиент
import { io } from "socket.io-client";
const socket = io("https://example.com", {
path: "/my-custom-path/"
});
Сервер
import { createServer } from "http";
import { Server } from "socket.io";
const httpServer = createServer();
const io = new Server(httpServer, {
path: "/my-custom-path/"
});
Обратите внимание, что это отличается от пути в URI, который представляет пространство имен.
Пример:
import { io } from "socket.io-client";
const socket = io("https://example.com/order", {
path: "/my-custom-path/"
});
- экземпляр Socket подключен к пространству имен "order"
- HTTP-запросы будут выглядеть так:
GET https://example.com/my-custom-path/?EIO=4&transport=polling&t=ML4jUwU
query
Значение по умолчанию: -
Дополнительные параметры запроса (потом найденные в socket.handshake.query объекте на стороне сервера).
Пример:
Клиент
import { io } from "socket.io-client";
const socket = io({
query: {
x: 42
}
});
Сервер
io.on("connection", (socket) => {
console.log(socket.handshake.query); // prints { x: "42", EIO: "4", transport: "polling" }
});
Параметры запроса не могут быть обновлены в течение сессии, поэтому изменение query на стороне клиента будет эффективно только при закрытии текущей сессии и создании новой:
socket.io.on("reconnect_attempt", () => {
socket.io.opts.query.x++;
});
Примечание: следующие параметры запроса зарезервированы и не могут быть использованы в вашем приложении:
-
EIO: версия протокола (в настоящее время "4") -
transport: имя транспорта ("polling" или "websocket") -
sid: идентификатор сессии -
j: если транспорт polling, но требуется ответ JSONP -
t: отметка времени, хэшированная для предотвращения кэширования
extraHeaders
Значение по умолчанию: -
Дополнительные заголовки (потом найденные в socket.handshake.headers объекте на стороне сервера).
Пример:
Клиент
import { io } from "socket.io-client";
const socket = io({
extraHeaders: {
"my-custom-header": "1234"
}
});
Сервер
io.on("connection", (socket) => {
console.log(socket.handshake.headers); // an object containing "my-custom-header": "1234"
});
В браузерной среде параметр extraHeaders будет проигнорирован, если вы включите только транспорт WebSocket, поскольку API WebSocket в браузере не позволяет предоставлять пользовательские заголовки.
import { io } from "socket.io-client";
const socket = io({
transports: ["websocket"],
extraHeaders: {
"my-custom-header": "1234" // ignored
}
});
Однако это будет работать в Node.js или React-Native.
Документация: API веб-сокетов
withCredentials
История
| Версия | Изменения |
|---|---|
| v3.0.0 |
withCredentials теперь по умолчанию false
|
| v1.0.0 | Первая реализация. |
Значение по умолчанию: false
Должны ли кросс-сайтовые запросы выполняться с использованием учетных данных, таких как файлы cookie, заголовки авторизации или сертификаты клиента TLS. Установка withCredentials не влияет на запросы к одному сайту.
import { io } from "socket.io-client";
const socket = io("https://my-backend.com", {
withCredentials: true
});
Серверу необходимо отправить правильные Access-Control-Allow-* заголовки, чтобы разрешить подключение:
import { createServer } from "http";
import { Server } from "socket.io";
const httpServer = createServer();
const io = new Server(httpServer, {
cors: {
origin: "https://my-frontend.com",
credentials: true
}
});
Вы не можете использовать origin: * при установке withCredentials на true. Это вызовет следующую ошибку:
Блокировка запроса из другого домена: Политика одного происхождения запрещает чтение удаленного ресурса по адресу ‘.../socket.io/?EIO=4&transport=polling&t=NvQfU77’. (Причина: Учетные данные не поддерживаются, если заголовок CORS ‘Access-Control-Allow-Origin’ имеет значение ‘*’)
Документация:
forceBase64
Значение по умолчанию: false
Вынудительно использовать кодирование base64 для двоичного содержимого, отправляемого по WebSocket (всегда включено для HTTP long-polling).
timestampRequests
Значение по умолчанию: true
Добавлять ли параметр timestamp к каждому запросу (для предотвращения кэширования).
timestampParam
Значение по умолчанию: "t"
Имя параметра запроса, используемого в качестве ключа отметки времени.
closeOnBeforeunload
Добавлена в v4.1.0
Значение по умолчанию: true
Закрывать ли соединение (неявно) при возникновении события beforeunload в браузере.
При closeOnBeforeunload установлено в false, Socket-инстанс будет генерировать событие disconnect, когда пользователь перезагружает страницу в Firefox (но не в Chrome или Safari).
При closeOnBeforeunload установлено в true, все браузеры будут иметь одинаковое поведение (событие disconnect не будет генерироваться при перезагрузке страницы). Однако это может вызвать проблемы, если вы используете событие beforeunload в своем приложении.
protocols
Добавлена в v2.0.0
Значение по умолчанию: -
Строка или массив строк протоколов. Эти строки используются для обозначения подпротоколов, так что один сервер может реализовать несколько подпротоколов WebSocket (например, вам может потребоваться, чтобы один сервер мог обрабатывать разные типы взаимодействий в зависимости от указанного протокола).
import { io } from "socket.io-client";
const socket = io({
transports: ["websocket"],
protocols: ["my-protocol-v1"]
});
Сервер:
io.on("connection", (socket) => {
const transport = socket.conn.transport;
console.log(transport.socket.protocol); // prints "my-protocol-v1"
});
Ссылки:
- https://datatracker.ietf.org/doc/html/rfc6455#section-1.9
- https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/WebSocket
autoUnref
Добавлена в v4.0.0
Значение по умолчанию: false
Если autoUnref установлено в true, клиент Socket.IO позволит программе выйти, если в системе событий нет других активных таймеров/TCP-сокет (даже если клиент подключен):
import { io } from "socket.io-client";
const socket = io({
autoUnref: true
});
См. также: https://nodejs.org/api/timers.html#timeoutunref
Параметры, специфичные для Node.js
Поддерживаются следующие параметры:
agentpfxkeypassphrasecertcaciphersrejectUnauthorized
Обратитесь к документации Node.js:
Пример с самоподписанным сертификатом:
Клиент
import { readFileSync } from "fs";
import { io } from "socket.io-client";
const socket = io("https://example.com", {
ca: readFileSync("./cert.pem")
});
Сервер
import { readFileSync } from "fs";
import { createServer } from "https";
import { Server } from "socket.io";
const httpServer = createServer({
cert: readFileSync("./cert.pem"),
key: readFileSync("./key.pem")
});
const io = new Server(httpServer);
Пример с аутентификацией по сертификату клиента:
Клиент
import { readFileSync } from "fs";
import { io } from "socket.io-client";
const socket = io("https://example.com", {
ca: readFileSync("./server-cert.pem"),
cert: readFileSync("./client-cert.pem"),
key: readFileSync("./client-key.pem"),
});
Сервер
import { readFileSync } from "fs";
import { createServer } from "https";
import { Server } from "socket.io";
const httpServer = createServer({
cert: readFileSync("./server-cert.pem"),
key: readFileSync("./server-key.pem"),
requestCert: true,
ca: [
readFileSync("client-cert.pem")
]
});
const io = new Server(httpServer);
rejectUnauthorized — это параметр только для Node.js, он не обойдет проверку безопасности в браузере:
Параметры Manager
Эти настройки будут общими для всех экземпляров Socket, подключенных к одному Manager.
reconnection
Значение по умолчанию: true
Включена ли функция повторного подключения. Если значение false, вам нужно выполнить подключение вручную:
import { io } from "socket.io-client";
const socket = io({
reconnection: false
});
const tryReconnect = () => {
setTimeout(() => {
socket.io.open((err) => {
if (err) {
tryReconnect();
}
});
}, 2000);
}
socket.io.on("close", tryReconnect);
reconnectionAttempts
Значение по умолчанию: Infinity
Количество попыток повторного подключения перед отказом.
reconnectionDelay
Значение по умолчанию: 1000
Начальная задержка перед повторным подключением в миллисекундах (влияет значение randomizationFactor).
reconnectionDelayMax
Значение по умолчанию: 5000
Максимальная задержка между двумя попытками повторного подключения. Каждая попытка увеличивает задержку повторного подключения в 2 раза.
randomizationFactor
Значение по умолчанию: 0.5
Фактор рандомизации, используемый при повторном подключении (чтобы клиенты не подключались в точности в одно и то же время после сбоя сервера, например).
Пример со значениями по умолчанию:
- Первая попытка повторного подключения происходит между 500 и 1500 мс (
1000 * 2^0 * (<something between -0.5 and 1.5>)) - Вторая попытка повторного подключения происходит между 1000 и 3000 мс (
1000 * 2^1 * (<something between -0.5 and 1.5>)) - Третья попытка повторного подключения происходит между 2000 и 5000 мс (
1000 * 2^2 * (<something between -0.5 and 1.5>)) - Следующие попытки повторного подключения происходят после 5000 мс
timeout
Значение по умолчанию: 20000
Время ожидания в миллисекундах для каждой попытки подключения.
autoConnect
Значение по умолчанию: true
Автоматически подключаться при создании. Если установлено значение false, необходимо подключиться вручную:
import { io } from "socket.io-client";
const socket = io({
autoConnect: false
});
socket.connect();
// or
socket.io.open();
parser
Добавлено в v2.2.0
Значение по умолчанию: require("socket.io-parser")
Парсер, используемый для маршаллирования/демаршаллирования пакетов. Дополнительная информация доступна здесь.
Параметры сокета
Эти настройки специфичны для данного экземпляра сокета.
auth
Добавлено в v3.0.0
Значение по умолчанию: -
Учетные данные, которые отправляются при доступе к именованному пространству (см. также здесь).
Пример:
Клиент
import { io } from "socket.io-client";
const socket = io({
auth: {
token: "abcd"
}
});
// or with a function
const socket = io({
auth: (cb) => {
cb({ token: localStorage.token })
}
});
Сервер
io.on("connection", (socket) => {
console.log(socket.handshake.auth); // prints { token: "abcd" }
});
Можно обновить auth карту при отказе доступа к именованному пространству:
socket.on("connect_error", (err) => {
if (err.message === "invalid credentials") {
socket.auth.token = "efgh";
socket.connect();
}
});
Или вручную заставить экземпляр сокета переподключиться:
socket.auth.token = "efgh"; socket.disconnect().connect();
© 2014–2021 Automattic
Licensed under the MIT License.
https://socket.io/docs/v4/client-options