Пользовательская служба Azure Fluid Relay
Скорее всего, вы предпочитаете использовать бесплатную размещенную службу, но в некоторых ситуациях полезно использовать собственную службу Azure Fluid Relay для приложения Live Share.
Предварительные требования
- Создайте расширение для собраний на боковой панели и в приложении этапа, как показано в руководстве по ролику dice.
- Обновите манифест приложения, чтобы включить все необходимые разрешения.
- Подготовьте службу Azure Fluid Relay, как описано в этом руководстве.
Подключение к службе Azure Fluid Relay
При вызове инициализации LiveShareClient
можно определить собственный AzureConnectionConfig
. Live Share связывает создаваемые контейнеры с собраниями, но для подписывания маркеров для контейнеров необходимо реализовать ITokenProvider
интерфейс. В этом примере описывается azure , AzureFunctionTokenProvider
которая использует облачную функцию Azure для запроса маркера доступа с сервера.
import { LiveShareClient, LivePresence } from "@microsoft/live-share";
import { LiveShareHost } from "@microsoft/teams-js";
import { SharedMap } from "fluid-framework";
import { AzureFunctionTokenProvider } from "@fluidframework/azure-client";
// Define a custom connection for your app
const options = {
connection: {
tenantId: "MY_TENANT_ID",
tokenProvider: new AzureFunctionTokenProvider(
"MY_SERVICE_ENDPOINT_URL" + "/api/GetAzureToken",
{ userId: "userId", userName: "Test User" }
),
endpoint: "MY_SERVICE_ENDPOINT_URL",
type: "remote",
},
};
// Join the Fluid container
const host = LiveShareHost.create();
const liveShare = new LiveShareClient(host, options);
const schema = {
initialObjects: {
presence: LivePresence,
ticTacToePositions: SharedMap,
},
};
const { container } = await liveShare.joinContainer(schema);
// ... ready to start app sync logic
Зачем использовать пользовательскую службу Azure Fluid Relay?
Рассмотрите возможность использования настраиваемого подключения к службе AFR, если вы:
- Требовать хранения данных в контейнерах Fluid после времени существования собрания.
- Передача конфиденциальных данных через службу, для чего требуется настраиваемая политика безопасности.
- Разрабатывайте функции с помощью Fluid Framework для приложения за пределами Teams.
Зачем использовать Live Share с пользовательской службой?
Azure Fluid Relay предназначен для работы с любым веб-приложением, то есть он работает с Microsoft Teams или без него. Это поднимает важный вопрос: если я создаю собственную службу Azure Fluid Relay, мне по-прежнему нужна Live Share?
Live Share содержит функции, полезные для распространенных сценариев собраний, которые дополняют другие функции в приложении, включая:
Сопоставление контейнеров
Объект LiveShareClient
in @microsoft/live-share
отвечает за сопоставление уникального идентификатора собрания с контейнерами Fluid, что гарантирует, что все участники собрания присоединяются к одному контейнеру. В рамках этого процесса клиент пытается подключиться к containerId
уже существующему собранию. Если он не существует, AzureClient
используется для создания контейнера с помощью , AzureConnectionConfig
а затем ретрансляции containerId
другим участникам собрания.
Если в вашем приложении уже есть механизм для создания контейнеров Fluid и предоставления к ним общего доступа другим участникам, например путем вставки containerId
в URL-адрес, общий для этапа собрания, это может не потребоваться для вашего приложения.
Проверка динамических объектов и ролей
Структуры динамических данных Live Share, такие как LivePresence
, LiveState
и LiveEvent
, предназначены для совместной работы на собраниях и, следовательно, не поддерживаются в контейнерах Fluid, используемых за пределами Microsoft Teams. Такие функции, как проверка ролей, помогают приложению соответствовать ожиданиям пользователей.
Примечание.
В качестве дополнительного преимущества живые объекты также имеют более высокую задержку сообщений по сравнению с традиционными структурами данных Fluid.
Дополнительные сведения см. на странице основных возможностей .
Использование Live Share без LiveShareClient
Вы по-прежнему можете использовать Live Share, даже если вы не хотите использовать LiveShareClient
класс для настраиваемой службы Azure Fluid Relay. Это полезно, если вы хотите контролировать, когда создается контейнер или как он предоставляется участникам собрания.
Ниже приведен пример того, как это можно сделать в приложении.
import {
LiveShareClient,
LivePresence,
getLiveShareContainerSchemaProxy,
} from "@microsoft/live-share";
import { SharedMap } from "fluid-framework";
import {
AzureFunctionTokenProvider,
AzureClient,
} from "@fluidframework/azure-client";
import { LiveShareHost } from "@microsoft/teams-js";
// Define a custom connection for your app
const options = {
connection: {
tenantId: "MY_TENANT_ID",
tokenProvider: new AzureFunctionTokenProvider(
"MY_SERVICE_ENDPOINT_URL" + "/api/GetAzureToken",
{ userId: "userId", userName: "Test User" }
),
endpoint: "MY_SERVICE_ENDPOINT_URL",
type: "remote",
},
};
// Initialize your AzureClient instance
const client = new AzureClient(options);
// Define your Fluid schema
const schema = {
initialObjects: {
presence: LivePresence,
ticTacToePositions: SharedMap,
},
};
// Create your host
const host = LiveShareHost.create();
// Create the LiveShareRuntime, which is needed for `LiveDataObject` instances to work
const runtime = new LiveShareRuntime(this._host);
// Inject the LiveShareRuntime dependency into the ContainerSchema
const injectedSchema = getLiveShareContainerSchemaProxy(
schema,
runtime,
);
// Create (or get) your container
const { container } = await client.createContainer(injectedSchema);
// ... ready to start app sync logic
Кроме того, можно использовать или переопределить AzureLiveShareHost
. Это позволяет получать пользовательские отображаемые имена и роли пользователей из , AzureAudience
а не через Microsoft Teams.
import {
LiveShareClient,
LivePresence,
AzureLiveShareHost,
getLiveShareContainerSchemaProxy,
} from "@microsoft/live-share";
import { SharedMap } from "fluid-framework";
import {
AzureFunctionTokenProvider,
AzureClient,
} from "@fluidframework/azure-client";
// Define a custom connection for your app
const options = {
connection: {
tenantId: "MY_TENANT_ID",
tokenProvider: new AzureFunctionTokenProvider(
"MY_SERVICE_ENDPOINT_URL" + "/api/GetAzureToken",
{ userId: "userId", userName: "Test User" }
),
endpoint: "MY_SERVICE_ENDPOINT_URL",
type: "remote",
},
};
// Initialize your AzureClient instance
const client = new AzureClient(options);
// Define your Fluid schema
const schema = {
initialObjects: {
presence: LivePresence,
ticTacToePositions: SharedMap,
},
};
// Create your AzureLiveShareHost
const host = AzureLiveShareHost.create();
// Create the LiveShareRuntime, which is needed for `LiveDataObject` instances to work
const runtime = new LiveShareRuntime(this._host);
// Inject the LiveShareRuntime dependency into the ContainerSchema
const injectedSchema = getLiveShareContainerSchemaProxy(
schema,
runtime,
);
// Create (or get) your container
const { container } = await client.createContainer(injectedSchema);
// Set AzureAudience into the AzureLiveShareHost
host.setAudience(services.audience);
// ... ready to start app sync logic
Многие API Live Share зависят от глобального API метки времени, который позволяет LiveDataObject
объектам определять порядок удаленных сообщений. Если вы используете структуры данных, которые зависят от TimestampProvider
класса , необходимо либо использовать из teams-js
библиотекиLiveShareHost
, либо переопределить getTimestamp()
функцию в AzureLiveShareHost
с помощью значения, возвращаемого сервером.
См. также
Platform Docs