Instrukcje: nawiązywanie połączenia z usługą Azure Fluid Relay
W tym artykule przedstawiono procedurę aprowizowania i gotowości usługi Azure Fluid Relay do użycia.
Ważne
Aby można było połączyć aplikację z serwerem usługi Azure Fluid Relay, musisz aprowizować zasób serwera usługi Azure Fluid Relay na koncie platformy Azure.
Usługa Azure Fluid Relay to hostowana w chmurze usługa Fluid Service. Aplikację Fluid można połączyć z wystąpieniem usługi Azure Fluid Relay przy użyciu elementu AzureClient w pakiecie @fluidframework/azure-client . AzureClient
obsługuje logikę łączenia kontenera Fluid z usługą przy jednoczesnym zachowaniu niezależnego od usługi obiektu kontenera. Do zarządzania wieloma kontenerami można użyć jednego wystąpienia tego klienta.
W poniższych sekcjach wyjaśniono, jak używać AzureClient
jej we własnej aplikacji.
Nawiązywanie połączenia z usługą
Aby nawiązać połączenie z wystąpieniem usługi Azure Fluid Relay, należy najpierw utworzyć element AzureClient
. Należy podać niektóre parametry konfiguracji, w tym identyfikator dzierżawy, adres URL usługi i dostawcę tokenu, aby wygenerować token internetowy JSON (JWT), który będzie używany do autoryzowania bieżącego użytkownika względem usługi. Pakiet @fluidframework/test-client-utils udostępnia insecureTokenProvider, który może być używany do celów programistycznych.
Uwaga
Element InsecureTokenProvider
powinien być używany tylko do celów programistycznych, ponieważ użycie go uwidacznia klucz tajny klucza dzierżawy w pakiecie kodu po stronie klienta. Należy go zastąpić implementacją elementu ITokenProvider, która pobiera token z własnej usługi zaplecza, która jest odpowiedzialna za podpisywanie go za pomocą klucza dzierżawy. Przykładowa implementacja to AzureFunctionTokenProvider. Aby uzyskać więcej informacji, zobacz Jak napisać tokenProvider za pomocą funkcji platformy Azure. Należy pamiętać, że id
pola i name
są dowolne.
const user = { id: "userId", name: "userName" };
const config = {
tenantId: "myTenantId",
tokenProvider: new InsecureTokenProvider("myTenantKey", user),
endpoint: "https://myServiceEndpointUrl",
type: "remote",
};
const clientProps = {
connection: config,
};
const client = new AzureClient(clientProps);
Teraz, gdy masz wystąpienie AzureClient
programu , możesz zacząć używać go do tworzenia lub ładowania kontenerów fluidu.
Dostawcy tokenów
AzureFunctionTokenProvider to implementacja ITokenProvider
, która zapewnia, że klucz tajny klucza dzierżawy nie jest uwidaczniany w kodzie pakietu po stronie klienta. Element AzureFunctionTokenProvider
pobiera adres URL funkcji platformy Azure dołączony /api/GetAzureToken
wraz z bieżącym obiektem użytkownika. Później wysyła GET
żądanie do funkcji platformy Azure, przekazując wartości tenantId, documentId i userId/userName jako parametry opcjonalne.
const config = {
tenantId: "myTenantId",
tokenProvider: new AzureFunctionTokenProvider(
"myAzureFunctionUrl" + "/api/GetAzureToken",
{ userId: "userId", userName: "Test User" }
),
endpoint: "https://myServiceEndpointUrl",
type: "remote",
};
const clientProps = {
connection: config,
};
const client = new AzureClient(clientProps);
Dodawanie danych niestandardowych do tokenów
Obiekt użytkownika może również przechowywać opcjonalne dodatkowe szczegóły użytkownika. Na przykład:
const userDetails = {
email: "xyz@outlook.com",
address: "Redmond",
};
const config = {
tenantId: "myTenantId",
tokenProvider: new AzureFunctionTokenProvider(
"myAzureFunctionUrl" + "/api/GetAzureToken",
{ userId: "UserId", userName: "Test User", additionalDetails: userDetails }
),
endpoint: "https://myServiceEndpointUrl",
type: "remote",
};
Funkcja platformy Azure wygeneruje token dla danego użytkownika podpisanego przy użyciu klucza tajnego dzierżawy i zwróci go do klienta bez ujawnienia samego wpisu tajnego.
Zarządzanie kontenerami
Interfejs AzureClient
API uwidacznia funkcje createContainer i getContainer, aby odpowiednio tworzyć i pobierać kontenery. Obie funkcje przyjmują schemat kontenera, który definiuje model danych kontenera. W przypadku getContainer
funkcji istnieje dodatkowy parametr dla kontenera id
kontenera, który chcesz pobrać.
W scenariuszu tworzenia kontenera można użyć następującego wzorca:
const schema = {
initialObjects: {
/* ... */
},
dynamicObjectTypes: [
/*...*/
],
};
const azureClient = new AzureClient(clientProps);
const { container, services } = await azureClient.createContainer(
schema
);
const id = await container.attach();
Wywołanie container.attach()
jest wtedy, gdy kontener rzeczywiście staje się połączony z usługą i jest rejestrowany w magazynie obiektów blob. Zwraca wartość, która jest unikatowym identyfikatorem id
tego wystąpienia kontenera.
Każdy klient, który chce dołączyć do tej samej sesji współpracy, musi wywołać getContainer
z tym samym kontenerem id
.
const { container, services } = await azureClient.getContainer(
id,
schema
);
Aby uzyskać więcej informacji na temat uruchamiania rejestrowania dzienników emitowanych przez płyn, zobacz Rejestrowanie i telemetria.
Pobrany z powrotem kontener będzie przechowywać initialObjects
wartość zdefiniowaną w schemacie kontenera. Zobacz Modelowanie danych w fluidframework.com, aby dowiedzieć się więcej na temat sposobu ustanawiania schematu i używania container
obiektu.
Pobieranie szczegółów odbiorców
Wywołuje i createContainer
getContainer
zwraca dwie wartości: container
- opisane powyżej - i obiekt usług.
Element container
zawiera model danych płynu i jest niezależny od usługi. Każdy kod zapisywany względem tego obiektu kontenera zwrócony przez AzureClient
obiekt jest wielokrotnego użytku z klientem dla innej usługi. Przykładem może być utworzenie prototypu scenariusza przy użyciu programu TinyliciousClient, wówczas cały kod współdziałający z obiektami udostępnionymi w kontenerze Fluid może zostać ponownie użyty podczas przechodzenia do metody .AzureClient
Obiekt services
zawiera dane specyficzne dla usługi Azure Fluid Relay. Ten obiekt zawiera wartość odbiorców, która może służyć do zarządzania składem użytkowników, którzy są obecnie połączeni z kontenerem.
Poniższy kod pokazuje, jak za pomocą audience
obiektu zachować zaktualizowany widok wszystkich elementów członkowskich znajdujących się obecnie w kontenerze.
const { audience } = containerServices;
const audienceDiv = document.createElement("div");
const onAudienceChanged = () => {
const members = audience.getMembers();
const self = audience.getMyself();
const memberStrings = [];
const useAzure = process.env.FLUID_CLIENT === "azure";
members.forEach((member) => {
if (member.userId !== (self ? self.userId : "")) {
if (useAzure) {
const memberString = `${member.userName}: {Email: ${member.additionalDetails ? member.additionalDetails.email : ""},
Address: ${member.additionalDetails ? member.additionalDetails.address : ""}}`;
memberStrings.push(memberString);
} else {
memberStrings.push(member.userName);
}
}
});
audienceDiv.innerHTML = `
Current User: ${self ? self.userName : ""} <br />
Other Users: ${memberStrings.join(", ")}
`;
};
onAudienceChanged();
audience.on("membersChanged", onAudienceChanged);
audience
Udostępnia dwie funkcje, które będą zwracać obiekty AzureMember, które mają identyfikator użytkownika i nazwę użytkownika:
getMembers
Zwraca mapę wszystkich użytkowników połączonych z kontenerem. Te wartości zmienią się za każdym razem, gdy element członkowski zostanie sprzężenia lub opuści kontener.getMyself
Zwraca bieżącego użytkownika na tym kliencie.
audience
Emituje również zdarzenia, gdy zmienia się skład członków. membersChanged
zostanie wyzwolony dla wszystkich zmian listy, podczas gdy memberAdded
i memberRemoved
zostanie wyzwolony dla odpowiednich zmian z wartościami clientId
i member
, które zostały zmodyfikowane. Po uruchomieniu któregokolwiek z tych zdarzeń nowe wywołanie getMembers
zwróci zaktualizowany skład członka.
Przykładowy AzureMember
obiekt wygląda następująco:
{
"userId": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
"userName": "Test User",
"connections": [
{
"id": "c699c3d1-a4a0-4e9e-aeb4-b33b00544a71",
"mode": "write"
},
{
"id": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
"mode": "write"
}
],
"additionalDetails": {
"email": "xyz@outlook.com",
"address": "Redmond"
}
}
Oprócz identyfikatora użytkownika, nazwy i dodatkowych szczegółów AzureMember
obiekty przechowują również tablicę połączeń. Jeśli użytkownik jest zalogowany do sesji tylko z jednym klientem, connections
będzie miał tylko jedną wartość z identyfikatorem klienta i czy jest w trybie odczytu/zapisu. Jeśli jednak ten sam użytkownik jest zalogowany z wielu klientów (czyli loguje się z różnych urządzeń lub ma otwarte wiele kart przeglądarki przy użyciu tego samego kontenera), connections
w tym miejscu będzie przechowywać wiele wartości dla każdego klienta. W powyższych przykładowych danych widać, że użytkownik o nazwie "Użytkownik testowy" i identyfikator "00aa0aa-bb11-cc22-dd33-44ee4ee4e4e4ee" obecnie ma otwarty kontener z dwóch różnych klientów. Wartości w polu additionalDetails są zgodne z wartościami podanymi w generowaniu tokenu AzureFunctionTokenProvider
.
Te funkcje i zdarzenia można połączyć, aby przedstawić widok użytkowników w czasie rzeczywistym w bieżącej sesji.
Gratulacje! Teraz pomyślnie połączono kontener Fluid z usługą Azure Fluid Relay i pobrano szczegóły użytkownika z powrotem dla członków w sesji współpracy.