Spec-Zone.ru › Socket.IO 4

Пространства имен

Пространство имен — это канал связи, который позволяет разделить логику вашего приложения на отдельные части, работающие через одно общее соединение (также называется «мультиплексирование»).

Namespace diagram

Введение

Каждое пространство имен имеет свои:

  • обработчики событий
io.of("/orders").on("connection", (socket) => {
  socket.on("order:list", () => {});
  socket.on("order:create", () => {});
});

io.of("/users").on("connection", (socket) => {
  socket.on("user:list", () => {});
});
  • комнаты
const orderNamespace = io.of("/orders");

orderNamespace.on("connection", (socket) => {
  socket.join("room1");
  orderNamespace.to("room1").emit("hello");
});

const userNamespace = io.of("/users");

userNamespace.on("connection", (socket) => {
  socket.join("room1"); // distinct from the room in the "orders" namespace
  userNamespace.to("room1").emit("holà");
});
  • средние узлы
const orderNamespace = io.of("/orders");

orderNamespace.use((socket, next) => {
  // ensure the socket has access to the "orders" namespace, and then
  next();
});

const userNamespace = io.of("/users");

userNamespace.use((socket, next) => {
  // ensure the socket has access to the "users" namespace, and then
  next();
});

Возможные варианты использования:

  • вы хотите создать специальное пространство имен, к которому имеют доступ только авторизованные пользователи, таким образом, логика, связанная с этими пользователями, будет отделена от остальной части приложения
const adminNamespace = io.of("/admin");

adminNamespace.use((socket, next) => {
  // ensure the user has sufficient rights
  next();
});

adminNamespace.on("connection", socket => {
  socket.on("delete user", () => {
    // ...
  });
});
  • ваше приложение имеет несколько арендаторов, поэтому вы хотите динамически создавать одно пространство имен на арендатора
const workspaces = io.of(/^\/\w+$/);

workspaces.on("connection", socket => {
  const workspace = socket.nsp;

  workspace.emit("hello");
});

Основное пространство имен

До сих пор вы взаимодействовали с основным пространством имен, называемым /. Экземпляр io наследует все его методы:

io.on("connection", (socket) => {});
io.use((socket, next) => { next() });
io.emit("hello");
// are actually equivalent to
io.of("/").on("connection", (socket) => {});
io.of("/").use((socket, next) => { next() });
io.of("/").emit("hello");

В некоторых руководствах также может упоминаться io.sockets, это просто псевдоним для io.of("/").

io.sockets === io.of("/")

Пользовательские пространства имен

Для настройки пользовательского пространства имен вы можете вызвать функцию of на стороне сервера:

const nsp = io.of("/my-namespace");

nsp.on("connection", socket => {
  console.log("someone connected");
});

nsp.emit("hi", "everyone!");

Инициализация клиента

Версия одного происхождения:

const socket = io(); // or io("/"), the main namespace
const orderSocket = io("/orders"); // the "orders" namespace
const userSocket = io("/users"); // the "users" namespace

Версия кросс-доменной/Node.js:

const socket = io("https://example.com"); // or io("https://example.com/"), the main namespace
const orderSocket = io("https://example.com/orders"); // the "orders" namespace
const userSocket = io("https://example.com/users"); // the "users" namespace

В приведенном выше примере будет установлено только одно соединение WebSocket, и пакеты будут автоматически перенаправлены в нужное пространство имен.

Обратите внимание, что мультиплексирование будет отключено в следующих случаях:

  • несколько созданий для одного и того же пространства имен
const socket1 = io();
const socket2 = io(); // no multiplexing, two distinct WebSocket connections
  • разные домены
const socket1 = io("https://first.example.com");
const socket2 = io("https://second.example.com"); // no multiplexing, two distinct WebSocket connections
  • использование опции forceNew
const socket1 = io();
const socket2 = io("/admin", { forceNew: true }); // no multiplexing, two distinct WebSocket connections

Динамические пространства имен

Также можно динамически создавать пространства имен, либо с помощью регулярного выражения:

io.of(/^\/dynamic-\d+$/);

или с помощью функции:

io.of((name, auth, next) => {
  next(null, true); // or false, when the creation is denied
});

Вы можете получить доступ к новому пространству имен в событии connection:

io.of(/^\/dynamic-\d+$/).on("connection", (socket) => {
  const namespace = socket.nsp;
});

Возвращаемое значение метода of() — это то, что мы называем родительским пространством имен, из которого вы можете:

  • зарегистрировать средние узлы
const parentNamespace = io.of(/^\/dynamic-\d+$/);

parentNamespace.use((socket, next) => { next() });

Средний узел будет автоматически зарегистрирован в каждом дочернем пространстве имен.

  • передавать события
const parentNamespace = io.of(/^\/dynamic-\d+$/);

parentNamespace.emit("hello"); // will be sent to users in /dynamic-1, /dynamic-2, ...

Существующие пространства имен имеют приоритет над динамическими пространствами имен. Например:

// register "dynamic-101" namespace
io.of("/dynamic-101");

io.of(/^\/dynamic-\d+$/).on("connection", (socket) => {
  // will not be called for a connection on the "dynamic-101" namespace
});

Полный API

Полный API, предоставляемый экземпляром Namespace, можно найти здесь.

© 2014–2021 Automattic
Licensed under the MIT License.
https://socket.io/docs/v4/namespaces

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API