Клиентский пакет SDK на стороне Web PubSub для JavaScript
Примечание.
Сведения об терминах, используемых здесь, описаны в статье основных понятий.
Клиентский пакет SDK направлен на ускорение рабочего процесса разработчика; в частности,
- упрощение управления клиентскими подключениями
- упрощение отправки сообщений среди клиентов
- автоматически повторяется после непреднамеренного удаления подключения клиента
- надежно доставка сообщений в количестве и порядке после восстановления после удаления подключений
Как показано на схеме, клиенты устанавливают подключения WebSocket к ресурсу Web PubSub.
Приступая к работе
Необходимые компоненты
- LTS версии Node.js
- Подписка Azure
- Ресурс Web PubSub
1. Установите пакет @azure/web-pubsub-client
npm install @azure/web-pubsub-client
2. Подключение с ресурсом Web PubSub
Клиент использует Client Access URL
для подключения и проверки подлинности со службой, которая соответствует шаблону wss://<service_name>.webpubsub.azure.com/client/hubs/<hub_name>?access_token=<token>
. У клиента может быть несколько способов получения Client Access URL
. В этом кратком руководстве можно скопировать и вставить один из портал Azure показан. (Для рабочей среды клиенты обычно создаются Client Access URL
на сервере приложений. См. сведения )
Как показано на схеме, клиент имеет разрешения на отправку сообщений и присоединение к определенной группе с именем group1
.
// Imports the client libray
const { WebPubSubClient } = require("@azure/web-pubsub-client");
// Instantiates the client object
const client = new WebPubSubClient("<client-access-url>");
// Starts the client connection with your Web PubSub resource
await client.start();
// ...
// The client can join/leave groups, send/receive messages to and from those groups all in real-time
3. Присоединение групп
Клиент может получать сообщения только от групп, присоединенных к ним. Можно добавить обратный вызов, чтобы указать логику действий при получении сообщений.
// ...continues the code snippet from above
// Specifies the group to join
let groupName = "group1";
// Registers a listener for the event 'group-message' early before joining a group to not miss messages
client.on("group-message", (e) => {
console.log(`Received message: ${e.message.data}`);
});
// A client needs to join the group it wishes to receive messages from
await client.joinGroup(groupName);
4. Отправка сообщений в группу
// ...continues the code snippet from above
// Send a message to a joined group
await client.sendToGroup(groupName, "hello world", "text");
// In the Console tab of your developer tools found in your browser, you should see the message printed there.
Примеры
Обработка connected
и disconnected
stopped
события
Azure Web PubSub запускает такие системные события, disconnected
как connected
и stopped
. Вы можете зарегистрировать обработчики событий, чтобы решить, что должно делать программа при запуске событий.
- Когда клиент успешно подключен к ресурсу Web PubSub,
connected
событие активируется. Этот фрагмент просто выводит идентификатор подключения.
client.on("connected", (e) => {
console.log(`Connection ${e.connectionId} is connected.`);
});
- Если клиент отключен и не сможет восстановить подключение,
disconnected
событие активируется. Этот фрагмент просто выводит сообщение.
client.on("disconnected", (e) => {
console.log(`Connection disconnected: ${e.message}`);
});
- Событие
stopped
активируется при отключении клиента, и клиент перестает пытаться повторно подключиться. Обычно это происходит послеclient.stop()
вызова илиautoReconnect
отключения или указанного ограничения на попытку повторного подключения. Если вы хотите перезапустить клиент, можно вызватьclient.start()
в остановленном событии.
// Registers an event handler for the "stopped" event
client.on("stopped", () => {
console.log(`Client has stopped`);
});
Использование сервера приложений для создания Client Access URL
программных способов
В рабочей среде клиенты обычно извлекают Client Access URL
данные с сервера приложений. Сервер хранит connection string
ресурс Web PubSub и создает Client Access URL
справку из серверной библиотеки @azure/web-pubsub
.
1. Сервер приложений
Фрагмент кода является примером сервера приложений, предоставляющего конечную точку и возвращаемую /negotiate
Client Access URL
.
// This code snippet uses the popular Express framework
const express = require('express');
const app = express();
const port = 8080;
// Imports the server library, which is different from the client library
const { WebPubSubServiceClient } = require('@azure/web-pubsub');
const hubName = 'sample_chat';
const serviceClient = new WebPubSubServiceClient("<web-pubsub-connectionstring>", hubName);
// Note that the token allows the client to join and send messages to any groups. It is specified with the "roles" option.
app.get('/negotiate', async (req, res) => {
let token = await serviceClient.getClientAccessToken({roles: ["webpubsub.joinLeaveGroup", "webpubsub.sendToGroup"] });
res.json({
url: token.url
});
});
app.listen(port, () => console.log(`Application server listening at http://localhost:${port}/negotiate`));
2. Клиентская сторона
const { WebPubSubClient } = require("@azure/web-pubsub-client")
const client = new WebPubSubClient({
getClientAccessUrl: async () => {
let value = await (await fetch(`/negotiate`)).json();
return value.url;
}
});
await client.start();
Примечание.
Чтобы просмотреть полный код этого примера, ознакомьтесь с примерами браузера.
Клиент использует сообщения с сервера приложений или присоединенных групп
Клиент может добавлять обратные вызовы для использования сообщений с сервера приложений или групп.
// Registers a listener for the "server-message". The callback is invoked when your application server sends message to the connectionID, to or broadcast to all connections.
client.on("server-message", (e) => {
console.log(`Received message ${e.message.data}`);
});
// Registers a listener for the "group-message". The callback is invoked when the client receives a message from the groups it has joined.
client.on("group-message", (e) => {
console.log(`Received message from ${e.message.group}: ${e.message.data}`);
});
Примечание.
Для group-message
события клиент может получать сообщения только из групп, присоединенных к нему.
Обработка сбоя повторного подключения
При отключении клиента и сбое восстановления все контексты группы удаляются в ресурсе Web PubSub. Это означает, что при повторном подключении клиента необходимо повторно присоединиться к группам. По умолчанию у клиента включен autoRejoinGroup
параметр.
Однако следует учитывать autoRejoinGroup
ограничения.
- Клиент может повторно присоединиться только к группам, присоединенным к клиентскому коду , а не серверным кодом.
- Операции повторного объединения могут завершиться ошибкой из-за различных причин, например, у клиента нет разрешения на присоединение к группам. В таких случаях необходимо добавить обратный вызов для обработки этого сбоя.
// By default autoRejoinGroups=true. You can disable it by setting to false.
const client = new WebPubSubClient("<client-access-url>", { autoRejoinGroups: true });
// Registers a listener to handle "rejoin-group-failed" event
client.on("rejoin-group-failed", e => {
console.log(`Rejoin group ${e.group} failed: ${e.error}`);
})
Повторить попытку
По умолчанию операция, например client.joinGroup()
client.leaveGroup()
, client.sendToGroup()
client.sendEvent()
имеет три повторных попытки. Вы можете настроить с помощью messageRetryOptions
. Если произошел сбой всех повторных попыток, возникает ошибка. Повторите попытку, передав ту же, ackId
что и предыдущие повторные попытки, чтобы служба Web PubSub может дедупликировать операцию.
try {
await client.joinGroup(groupName);
} catch (err) {
let id = null;
if (err instanceof SendMessageError) {
id = err.ackId;
}
await client.joinGroup(groupName, {ackId: id});
}
Пакет JavaScript
Чтобы использовать эту клиентную библиотеку в браузере, необходимо использовать пакет. Дополнительные сведения о создании пакета см. в нашей документации по набору.
Устранение неполадок
Включение журналов
При использовании этой библиотеки с помощью приведенной ниже переменной среды можно получить журналы отладки.
export AZURE_LOG_LEVEL=verbose
Дополнительные инструкции по включению журналов см. в документации по пакету @azure/loger.
Динамическая трассировка
Используйте средство динамической трассировки из портал Azure для проверки трафика сообщений через ресурс Web PubSub.